From d9c45bb2e0677f76f60693a32a9bd2dabb208041 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 26 Mar 2023 20:11:29 +0200 Subject: [PATCH 001/459] feat: add ogg_from_webm postprocessor --- Cargo.toml | 2 +- postprocessor/Cargo.toml | 12 + postprocessor/src/crc.rs | 75 +++ postprocessor/src/lib.rs | 72 +++ postprocessor/src/ogg.rs | 131 +++++ postprocessor/src/ogg_from_webm.rs | 179 ++++++ postprocessor/src/webm.rs | 736 ++++++++++++++++++++++++ testfiles/postprocessor/LICENSE.md | 14 + testfiles/postprocessor/audio1.m4a | Bin 0 -> 244608 bytes testfiles/postprocessor/audio1.webm | Bin 0 -> 86518 bytes testfiles/postprocessor/conv/audio1.ogg | Bin 0 -> 82708 bytes 11 files changed, 1220 insertions(+), 1 deletion(-) create mode 100644 postprocessor/Cargo.toml create mode 100644 postprocessor/src/crc.rs create mode 100644 postprocessor/src/lib.rs create mode 100644 postprocessor/src/ogg.rs create mode 100644 postprocessor/src/ogg_from_webm.rs create mode 100644 postprocessor/src/webm.rs create mode 100644 testfiles/postprocessor/LICENSE.md create mode 100644 testfiles/postprocessor/audio1.m4a create mode 100644 testfiles/postprocessor/audio1.webm create mode 100644 testfiles/postprocessor/conv/audio1.ogg diff --git a/Cargo.toml b/Cargo.toml index 25116ed..22e8514 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ categories = ["api-bindings", "multimedia"] include = ["/src", "README.md", "LICENSE", "!snapshots"] [workspace] -members = [".", "codegen", "downloader", "cli"] +members = [".", "codegen", "downloader", "postprocessor", "cli"] [features] default = ["default-tls"] diff --git a/postprocessor/Cargo.toml b/postprocessor/Cargo.toml new file mode 100644 index 0000000..b55226d --- /dev/null +++ b/postprocessor/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "rustypipe-postprocessor" +version = "0.1.0" +edition = "2021" + +[dependencies] +thiserror = "1.0.40" + +[dev-dependencies] +path_macro = "1.0.0" +once_cell = "1.12.0" +temp_testdir = "0.2.3" diff --git a/postprocessor/src/crc.rs b/postprocessor/src/crc.rs new file mode 100644 index 0000000..b144721 --- /dev/null +++ b/postprocessor/src/crc.rs @@ -0,0 +1,75 @@ +// Ogg decoder and encoder written in Rust +// +// Original source: https://github.com/RustAudio/ogg +// +// Copyright (c) 2016-2017 est31 +// and contributors. All rights reserved. +// Redistribution or use only under the terms +// specified in the LICENSE file attached to this +// source distribution. + +/*! +Implementation of the CRC algorithm with the +vorbis specific parameters and setup +*/ + +// Lookup table to enable bytewise CRC32 calculation +static CRC_LOOKUP_ARRAY: &[u32] = &lookup_array(); + +const fn get_tbl_elem(idx: u32) -> u32 { + let mut r: u32 = idx << 24; + let mut i = 0; + while i < 8 { + r = (r << 1) ^ (-(((r >> 31) & 1) as i32) as u32 & 0x04c11db7); + i += 1; + } + r +} + +const fn lookup_array() -> [u32; 0x100] { + let mut lup_arr: [u32; 0x100] = [0; 0x100]; + let mut i = 0; + while i < 0x100 { + lup_arr[i] = get_tbl_elem(i as u32); + i += 1; + } + lup_arr +} + +pub fn crc32(array: &[u8]) -> u32 { + crc32_update(0, array) +} + +pub fn crc32_update(cur: u32, array: &[u8]) -> u32 { + let mut ret: u32 = cur; + for av in array { + ret = (ret << 8) ^ CRC_LOOKUP_ARRAY[(*av as u32 ^ (ret >> 24)) as usize]; + } + ret +} + +#[test] +fn test_crc32() { + // Test page taken from real Ogg file + let test_arr = &[ + 0x4f, 0x67, 0x67, 0x53, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, + 0xa3, 0x90, 0x5b, 0x00, 0x00, 0x00, 0x00, + // The spec requires us to zero out the CRC field + /*0x6d, 0x94, 0x4e, 0x3d,*/ + 0x00, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x44, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x01, + ]; + println!(); + println!( + "CRC of \"==!\" calculated as 0x{:08x} (expected 0x9f858776)", + crc32(&[61, 61, 33]) + ); + println!( + "Test page CRC calculated as 0x{:08x} (expected 0x3d4e946d)", + crc32(test_arr) + ); + assert_eq!(crc32(&[61, 61, 33]), 0x9f858776); + assert_eq!(crc32(test_arr), 0x3d4e946d); + assert_eq!(crc32(&test_arr[0..27]), 0x7b374db8); +} diff --git a/postprocessor/src/lib.rs b/postprocessor/src/lib.rs new file mode 100644 index 0000000..e1425bb --- /dev/null +++ b/postprocessor/src/lib.rs @@ -0,0 +1,72 @@ +#![allow(dead_code)] + +mod crc; +mod ogg; +mod ogg_from_webm; +mod webm; + +/// Error from the postprocessor +#[derive(thiserror::Error, Debug)] +#[non_exhaustive] +pub enum PostprocessingError { + /// File IO error + #[error(transparent)] + Io(#[from] std::io::Error), + #[error("file format not recognized: {0}")] + InvalidFormat(&'static str), + #[error("no such element: expected {0:#x}, got {1:#x}")] + NoSuchElement(u32, u32), + #[error("bad element: {0}")] + BadElement(String), + #[error("invalid encoded length")] + InvalidLength, + #[error("invalid string")] + InvalidString, + #[error("unexpected element size")] + UnexpectedSize, + #[error("unsupported op: {0}")] + Unsupported(&'static str), + #[error("int conversion: {0}")] + Conversion(#[from] std::num::TryFromIntError), +} + +pub(crate) type Result = std::result::Result; + +#[cfg(test)] +pub(crate) mod tests { + use std::{ + fs::File, + io::{BufReader, Read}, + os::unix::prelude::MetadataExt, + path::{Path, PathBuf}, + }; + + use once_cell::sync::Lazy; + use path_macro::path; + + pub static TESTFILES: Lazy = Lazy::new(|| { + path!(env!("CARGO_MANIFEST_DIR") / ".." / "testfiles") + .canonicalize() + .unwrap() + }); + + pub fn assert_files_eq, P2: AsRef>(p1: P, p2: P2) { + let f1 = File::open(p1).unwrap(); + let f2 = File::open(p2).unwrap(); + + let size = f1.metadata().unwrap().size(); + assert_eq!(size, f2.metadata().unwrap().size(), "File sizes dont match"); + + let mut r1 = BufReader::new(f1); + let mut r2 = BufReader::new(f2); + + for i in 0..size { + let mut b1 = [0; 1]; + let mut b2 = [0; 1]; + r1.read_exact(&mut b1).unwrap(); + r2.read_exact(&mut b2).unwrap(); + + assert_eq!(b1[0], b2[0], "Byte {i} does not match"); + } + } +} diff --git a/postprocessor/src/ogg.rs b/postprocessor/src/ogg.rs new file mode 100644 index 0000000..52d823a --- /dev/null +++ b/postprocessor/src/ogg.rs @@ -0,0 +1,131 @@ +use crate::{crc, PostprocessingError, Result}; + +pub struct OggWriter { + sequence_count: u32, + stream_id: u32, + packet_flag: u8, + segment_table: [u8; 255], + segment_table_size: u8, + pub segment_table_next_timestamp: u64, +} + +pub const FLAG_UNSET: u8 = 0x00; +pub const FLAG_FIRST: u8 = 0x02; +pub const FLAG_LAST: u8 = 0x04; +const HEADER_CHECKSUM_OFFSET: usize = 22; +const HEADER_SIZE: usize = 27; +pub const TIME_SCALE_NS: u64 = 1000000000; + +pub const METADATA_VORBIS: [u8; 15] = [ + 0x03, 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // "vorbis" binary string + 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) + 0x00, 0x00, 0x00, 0x00, // additional tags count (zero means no tags) +]; + +pub const METADATA_OPUS: [u8; 16] = [ + 0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // "OpusTags" binary string + 0x00, 0x00, 0x00, 0x00, // writing application string size (not present) + 0x00, 0x00, 0x00, 0x00, // additional tags count (zero means no tags) +]; + +impl OggWriter { + pub fn new() -> Self { + Self { + sequence_count: 0, + stream_id: 1, + packet_flag: FLAG_FIRST, + segment_table: [0; 255], + segment_table_size: 0, + segment_table_next_timestamp: TIME_SCALE_NS, + } + } + + pub fn make_packet_header(&mut self, gran_pos: u64, page: &[u8], immediate: bool) -> Vec { + let mut header = Vec::new(); + let mut length = HEADER_SIZE; + + header.extend_from_slice(b"OggS"); + header.push(0); // version + header.push(self.packet_flag); // type + + header.extend_from_slice(&gran_pos.to_le_bytes()); // granulate position + + header.extend_from_slice(&self.stream_id.to_le_bytes()); // bitstream serial number + header.extend_from_slice(&self.sequence_count.to_le_bytes()); // page sequence number + self.sequence_count += 1; + + header.extend_from_slice(&[0, 0, 0, 0]); // page checksum + + header.push(self.segment_table_size); + header.extend_from_slice(&self.segment_table[0..self.segment_table_size as usize]); + + length += self.segment_table_size as usize; + self.clear_segment_table(); + + let checksum = crc::crc32(&header[0..length]); + let checksum = crc::crc32_update(checksum, page); + Self::header_put_checksum(&mut header, checksum); + + if immediate { + self.segment_table_next_timestamp -= TIME_SCALE_NS; + } + header + } + + fn header_put_checksum(header: &mut Vec, checksum: u32) { + let cs_bts = checksum.to_le_bytes(); + let to_fill = (HEADER_CHECKSUM_OFFSET + cs_bts.len()).saturating_sub(header.len()); + for _ in 0..to_fill { + header.push(0); + } + header[HEADER_CHECKSUM_OFFSET..(HEADER_CHECKSUM_OFFSET + cs_bts.len())] + .copy_from_slice(&cs_bts[..]); + } + + pub fn clear_segment_table(&mut self) { + self.segment_table_next_timestamp += TIME_SCALE_NS; + self.packet_flag = FLAG_UNSET; + self.segment_table_size = 0; + } + + pub fn add_packet_segment(&mut self, size: u32) -> Result { + if size > 65025 { + return Err(PostprocessingError::Unsupported( + "page size cannot be larger than 65025", + )); + } + + let mut available = + (self.segment_table.len() as u32 - self.segment_table_size as u32) * 255; + let extra = (size % 255) == 0; + + if extra { + // add a zero byte entry in the table + // required to indicate the sample size is multiple of 255 + available -= 255; + } + + // check if possible add the segment, without overflow the table + if available < size { + return Ok(false); // not enough space on the page + } + + let mut seg = size; + while seg > 0 { + self.segment_table[self.segment_table_size as usize] = seg.min(255) as u8; + self.segment_table_size += 1; + seg = seg.saturating_sub(255); + } + + if extra { + self.segment_table[self.segment_table_size as usize] = 0; + self.segment_table_size += 1; + } + + Ok(true) + } + + pub fn set_packet_flag(&mut self, flag: u8) { + self.packet_flag = flag; + } +} diff --git a/postprocessor/src/ogg_from_webm.rs b/postprocessor/src/ogg_from_webm.rs new file mode 100644 index 0000000..b524fd4 --- /dev/null +++ b/postprocessor/src/ogg_from_webm.rs @@ -0,0 +1,179 @@ +use std::{ + fs::File, + io::{BufWriter, Read, Write}, + path::Path, +}; + +use crate::{ + ogg::{OggWriter, FLAG_LAST, METADATA_OPUS, METADATA_VORBIS, TIME_SCALE_NS}, + webm::{TrackKind, WebmReader}, + PostprocessingError, +}; + +pub fn test(mut source: impl Read) -> Result { + let mut buf = [0; 4]; + source.read_exact(&mut buf)?; + + match u32::from_be_bytes(buf) { + 0x1a45dfa3 => Ok(true), // webm/mkv + 0x4f676753 => Ok(false), // ogg + _ => Err(PostprocessingError::InvalidFormat("unknown magic number")), + } +} + +pub fn process, P2: AsRef>( + source: P, + dest: P2, +) -> Result<(), PostprocessingError> { + let mut webm = WebmReader::new(File::open(source)?)?; + webm.parse()?; + if !webm.get_next_segment()? { + return Err(PostprocessingError::InvalidFormat("no segment")); + } + + let mut ogg = OggWriter::new(); + let mut output = BufWriter::new(File::create(dest)?); + + // Select track + let track = match &webm.tracks { + Some(tracks) => { + let track_id = tracks + .iter() + .enumerate() + .find(|(_, track)| { + track.kind == TrackKind::Audio + && (track.codec_id == "A_OPUS" || track.codec_id == "A_VORBIS") + }) + .ok_or(PostprocessingError::InvalidFormat("no audio tracks"))? + .0; + webm.select_track(track_id).unwrap().clone() + } + None => return Err(PostprocessingError::InvalidFormat("no tracks")), + }; + + // Get sample rate + let res = get_sample_freq_from_track(&track.b_metadata); + + // Create packet with codec init data + if !track.codec_private.is_empty() { + ogg.add_packet_segment(track.codec_private.len().try_into()?)?; + let header = ogg.make_packet_header(0, &track.codec_private, true); + output.write_all(&header)?; + output.write_all(&track.codec_private)?; + } + + // Create packet with metadata + let metadata = match track.codec_id.as_str() { + "A_OPUS" => METADATA_OPUS.as_slice(), + "A_VORBIS" => METADATA_VORBIS.as_slice(), + _ => unreachable!(), + }; + ogg.add_packet_segment(metadata.len().try_into()?)?; + let header = ogg.make_packet_header(0, metadata, true); + output.write_all(&header)?; + output.write_all(metadata)?; + + // Calculate amount of packets + let mut page = Vec::new(); + let mut webm_block = None; + while !webm.is_done() { + let block = match webm_block { + Some(block) => { + webm_block = None; + Some(block) + } + None => webm.get_next_block()?, + }; + + if let Some(block) = block { + let timestamp = block.absolute_time_code_ns + track.codec_delay; + let added = if timestamp >= ogg.segment_table_next_timestamp { + false + } else { + ogg.add_packet_segment(block.data_size.try_into()?)? + }; + + if added { + webm.get_block_data(&block, &mut page)?; + continue; + } + } + + let mut elapsed_ns = track.codec_delay; + match block { + Some(block) => { + elapsed_ns += block.absolute_time_code_ns; + } + None => { + // TODO: move to ogg + ogg.set_packet_flag(FLAG_LAST); + elapsed_ns += webm.webm_block_last_timecode(); + + if track.default_duration > 0 { + elapsed_ns += track.default_duration; + } else { + elapsed_ns += webm.webm_block_near_duration(); + } + } + } + + // get the sample count in the page + let sample_count: f64 = (elapsed_ns as f64 / TIME_SCALE_NS as f64) * res as f64; + let sample_count = sample_count.ceil() as u64; + + let header = ogg.make_packet_header(sample_count, &page, false); + + // dump data + output.write_all(&header)?; + output.write_all(&page)?; + + page = Vec::new(); + webm_block = block; + } + + output.flush()?; + Ok(()) +} + +fn get_sample_freq_from_track(b_metadata: &[u8]) -> f32 { + let mut i = 0; + while i < b_metadata.len().saturating_sub(5) { + let id_bts: [u8; 2] = b_metadata[i..i + 2].try_into().unwrap(); + let id = u16::from_be_bytes(id_bts); + + if id == 0xB584 { + let freq_bts: [u8; 4] = b_metadata[i + 2..i + 6].try_into().unwrap(); + return f32::from_be_bytes(freq_bts); + } + i += 2; + } + 0.0 +} + +#[cfg(test)] +mod tests { + use path_macro::path; + + use crate::tests::{assert_files_eq, TESTFILES}; + + use super::*; + + #[test] + fn t_test() { + let path = path!(*TESTFILES / "postprocessor" / "audio1.webm"); + let mut file = File::open(&path).unwrap(); + assert!(test(&mut file).unwrap()); + } + + #[test] + fn t_process() { + let temp = temp_testdir::TempDir::default(); + + let source = path!(*TESTFILES / "postprocessor" / "audio1.webm"); + let dest = path!(temp / "audio1.ogg"); + let expect = path!(*TESTFILES / "postprocessor" / "conv" / "audio1.ogg"); + + process(&source, &dest).unwrap(); + assert_files_eq(&dest, &expect); + } +} diff --git a/postprocessor/src/webm.rs b/postprocessor/src/webm.rs new file mode 100644 index 0000000..117c324 --- /dev/null +++ b/postprocessor/src/webm.rs @@ -0,0 +1,736 @@ +use std::{ + fs::File, + io::{BufReader, Read, Seek, SeekFrom}, + os::unix::prelude::MetadataExt, +}; + +use crate::{PostprocessingError, Result}; + +#[derive(Debug)] +pub struct WebmReader { + stream: BufReader, + len: u64, + segment: Option, + cluster: Option, + pub tracks: Option>, + selected_track: Option, + done: bool, + first_segment: bool, + webm_block_near_duration: u64, + webm_block_last_timecode: u64, +} + +#[derive(Debug, Copy, Clone)] +struct Element { + typ: u32, + offset: u64, + content_size: u64, + size: u64, +} + +#[derive(Debug, Copy, Clone)] +pub struct Info { + pub timecode_scale: u64, + pub duration: u64, +} + +#[derive(Debug, Clone)] +pub struct WebmTrack { + pub track_number: u64, + track_type: u32, + pub codec_id: String, + pub codec_private: Vec, + pub b_metadata: Vec, + pub kind: TrackKind, + pub default_duration: u64, + pub codec_delay: u64, + pub seek_pre_roll: u64, +} + +#[derive(Debug, Clone)] +pub struct Segment { + pub info: Option, + tracks: Option>, + current_cluster: Option, + rf: Element, + first_cluster_in_segment: bool, +} + +impl Segment { + fn new(rf: Element) -> Segment { + Segment { + info: None, + tracks: None, + current_cluster: None, + rf, + first_cluster_in_segment: true, + } + } +} + +#[derive(Debug, Copy, Clone)] +pub struct SimpleBlock { + pub created_from_block: bool, + pub track_number: u64, + pub relative_time_code: u16, + pub absolute_time_code_ns: u64, + pub flags: u8, + pub offset: u64, + pub data_size: u64, + rf: Element, +} + +impl SimpleBlock { + fn new(rf: Element) -> Self { + Self { + created_from_block: false, + track_number: 0, + relative_time_code: 0, + absolute_time_code_ns: 0, + flags: 0, + offset: 0, + data_size: 0, + rf, + } + } + + pub fn is_keyframe(&self) -> bool { + (self.flags & 0x80) == 0x80 + } +} + +#[derive(Debug, Copy, Clone)] +pub struct Cluster { + rf: Element, + current_simple_block: Option, + current_block_group: Option, + timecode: u64, +} + +impl Cluster { + fn new(rf: Element) -> Self { + Self { + rf, + current_simple_block: None, + current_block_group: None, + timecode: 0, + } + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum TrackKind { + Audio, + Video, + Other, +} + +const ID_EMBL: u32 = 0x0A45DFA3; +const ID_EMBL_READ_VERSION: u32 = 0x02F7; +const ID_EMBL_DOC_TYPE: u32 = 0x0282; +const ID_EMBL_DOC_TYPE_READ_VERSION: u32 = 0x0285; +const ID_SEGMENT: u32 = 0x08538067; +const ID_INFO: u32 = 0x0549A966; +const ID_TIMECODE_SCALE: u32 = 0x0AD7B1; +const ID_DURATION: u32 = 0x489; +const ID_TRACKS: u32 = 0x0654AE6B; +const ID_TRACK_ENTRY: u32 = 0x2E; +const ID_TRACK_NUMBER: u32 = 0x57; +const ID_TRACK_TYPE: u32 = 0x03; +const ID_CODEC_ID: u32 = 0x06; +const ID_CODEC_PRIVATE: u32 = 0x23A2; +const ID_VIDEO: u32 = 0x60; +const ID_AUDIO: u32 = 0x61; +const ID_DEFAULT_DURATION: u32 = 0x3E383; +const ID_FLAG_LACING: u32 = 0x1C; +const ID_CODEC_DELAY: u32 = 0x16AA; +const ID_SEEK_PRE_ROLL: u32 = 0x16BB; +const ID_CLUSTER: u32 = 0x0F43B675; +const ID_TIMECODE: u32 = 0x67; +const ID_SIMPLE_BLOCK: u32 = 0x23; +const ID_BLOCK: u32 = 0x21; +const ID_GROUP_BLOCK: u32 = 0x20; + +impl WebmReader { + pub fn new(file: File) -> Result { + let md = file.metadata()?; + Ok(Self { + stream: BufReader::new(file), + len: md.size(), + segment: None, + cluster: None, + tracks: None, + selected_track: None, + done: false, + first_segment: false, + webm_block_near_duration: 0, + webm_block_last_timecode: 0, + }) + } + + /// Make sure the parser did not go beyond the current element and + /// skip to the start if the next element. + fn ensure(&mut self, rf: &Element) -> Result<()> { + let pos = self.stream.stream_position()?; + let elem_end = rf.offset + rf.size; + + if pos > elem_end { + return Err(PostprocessingError::Io(std::io::Error::new( + std::io::ErrorKind::UnexpectedEof, + format!( + "parser go beyond limits of the Element. type={} offset={} size={} position={}", + rf.typ, rf.offset, rf.size, pos, + ), + ))); + } + + self.stream.seek(SeekFrom::Start(elem_end))?; + Ok(()) + } + + fn read_byte(&mut self) -> Result { + let mut bt = [0; 1]; + self.stream.read_exact(&mut bt)?; + Ok(bt[0]) + } + + fn read_u16(&mut self) -> Result { + let mut bt = [0; 2]; + self.stream.read_exact(&mut bt)?; + Ok(u16::from_be_bytes(bt)) + } + + fn read_number(&mut self, parent: &Element) -> Result { + let mut value: u64 = 0; + for _ in 0..parent.content_size { + let rd = self.read_byte()?; + value = (value << 8) | u64::from(rd); + } + Ok(value) + } + + fn read_string(&mut self, parent: &Element) -> Result { + String::from_utf8(self.read_blob(parent)?).map_err(|_| PostprocessingError::InvalidString) + } + + fn read_blob(&mut self, parent: &Element) -> Result> { + let length = parent.content_size as usize; + let mut buf = vec![0u8; length]; + self.stream.read_exact(&mut buf)?; + Ok(buf) + } + + fn read_encoded_number(&mut self) -> Result { + let mut value = u64::from(self.read_byte()?); + + if value > 0 { + let mut mask: u64 = 0x80; + + for size in 1..9 { + if (value & mask) == mask { + mask = 0xff; + mask >>= size; + + let mut number = value & mask; + + for _ in 1..size { + value = u64::from(self.read_byte()?); + number = (number << 8) | value; + } + return Ok(number); + } + + mask >>= 1; + } + } + Err(PostprocessingError::InvalidLength) + } + + fn read_element(&mut self) -> Result { + let offset = self.stream.stream_position()?; + let typ = self.read_encoded_number()? as u32; + let content_size = self.read_encoded_number()?; + let size = content_size + self.stream.stream_position()? - offset; + + Ok(Element { + typ, + offset, + content_size, + size, + }) + } + + fn read_element_expected(&mut self, expected: u32) -> Result { + let elem = self.read_element()?; + if expected != 0 && elem.typ != expected { + return Err(PostprocessingError::NoSuchElement(expected, elem.typ)); + } + Ok(elem) + } + + fn until_element(&mut self, rf: Option<&Element>, expected: &[u32]) -> Result> { + loop { + let brk = match rf { + Some(rf) => self.stream.stream_position()? >= (rf.offset + rf.size), + None => self.stream.stream_position()? >= self.len, + }; + if brk { + break; + } + + let elem = self.read_element()?; + if expected.is_empty() { + return Ok(Some(elem)); + } + for t in expected { + if &elem.typ == t { + return Ok(Some(elem)); + } + } + self.ensure(&elem)?; + } + Ok(None) + } + + fn read_ebml( + &mut self, + rf: &Element, + min_read_version: u64, + min_doc_type_version: u64, + ) -> Result { + let elem_v = self.until_element(Some(rf), &[ID_EMBL_READ_VERSION])?; + match elem_v { + Some(elem_v) => { + if self.read_number(&elem_v)? > min_read_version { + return Ok(false); + } + + let elem_t = self.until_element(Some(rf), &[ID_EMBL_DOC_TYPE])?; + match elem_t { + Some(elem_t) => { + if self.read_string(&elem_t)? != "webm" { + return Ok(false); + } + + let elem_tv = + self.until_element(Some(rf), &[ID_EMBL_DOC_TYPE_READ_VERSION])?; + match elem_tv { + Some(elem_tv) => { + Ok(self.read_number(&elem_tv)? <= min_doc_type_version) + } + None => Ok(false), + } + } + None => Ok(false), + } + } + None => Ok(false), + } + } + + fn read_info(&mut self, rf: &Element) -> Result { + let mut info = Info { + timecode_scale: 0, + duration: 0, + }; + + while let Some(elem) = self.until_element(Some(rf), &[ID_TIMECODE_SCALE, ID_DURATION])? { + match elem.typ { + ID_TIMECODE_SCALE => { + info.timecode_scale = self.read_number(&elem)?; + } + ID_DURATION => { + info.duration = self.read_number(&elem)?; + } + _ => {} + } + self.ensure(&elem)?; + } + + if info.timecode_scale == 0 { + return Err(PostprocessingError::BadElement( + "Element Timecode not found".to_owned(), + )); + } + Ok(info) + } + + fn read_segment( + &mut self, + rf: Element, + track_lacing_expected: u64, + metadata_expected: bool, + ) -> Result { + let mut seg = Segment::new(rf); + while let Some(elem) = self.until_element(Some(&rf), &[ID_INFO, ID_TRACKS, ID_CLUSTER])? { + match elem.typ { + ID_CLUSTER => { + seg.current_cluster = Some(elem); + break; + } + ID_INFO => { + seg.info = Some(self.read_info(&elem)?); + self.ensure(&elem)?; + } + ID_TRACKS => { + seg.tracks = Some(self.read_tracks(&elem, track_lacing_expected)?); + self.ensure(&elem)?; + } + _ => {} + } + } + + if metadata_expected && (seg.info.is_none() || seg.tracks.is_none()) { + return Err(PostprocessingError::BadElement(format!( + "Cluster element found without Info and/or Tracks element at position {}", + rf.offset + ))); + } + Ok(seg) + } + + fn read_tracks(&mut self, rf: &Element, lacing_expected: u64) -> Result> { + let mut tracks = Vec::new(); + + while let Some(elem_te) = self.until_element(Some(rf), &[ID_TRACK_ENTRY])? { + let mut entry = WebmTrack { + track_number: 0, + track_type: 0, + codec_id: String::new(), + codec_private: Vec::new(), + b_metadata: Vec::new(), + kind: TrackKind::Other, + default_duration: 0, + codec_delay: 0, + seek_pre_roll: 0, + }; + let mut drop = false; + + while let Some(elem) = self.until_element(Some(&elem_te), &[])? { + match elem.typ { + ID_TRACK_NUMBER => { + entry.track_number = self.read_number(&elem)?; + } + ID_TRACK_TYPE => { + entry.track_type = self.read_number(&elem)? as u32; + } + ID_CODEC_ID => { + entry.codec_id = self.read_string(&elem)?; + } + ID_CODEC_PRIVATE => { + entry.codec_private = self.read_blob(&elem)?; + } + ID_AUDIO | ID_VIDEO => { + entry.b_metadata = self.read_blob(&elem)?; + } + ID_DEFAULT_DURATION => { + entry.default_duration = self.read_number(&elem)?; + } + ID_FLAG_LACING => { + drop = self.read_number(&elem)? != lacing_expected; + } + ID_CODEC_DELAY => { + entry.codec_delay = self.read_number(&elem)?; + } + ID_SEEK_PRE_ROLL => { + entry.seek_pre_roll = self.read_number(&elem)?; + } + _ => {} + } + self.ensure(&elem)?; + } + entry.kind = match entry.track_type { + 1 => TrackKind::Video, + 2 => TrackKind::Audio, + _ => TrackKind::Other, + }; + if !drop { + tracks.push(entry); + } + self.ensure(&elem_te)?; + } + Ok(tracks) + } + + fn read_simple_block(&mut self, rf: Element) -> Result { + let mut sb = SimpleBlock::new(rf); + sb.track_number = self.read_encoded_number()?; + sb.relative_time_code = self.read_u16()?; + sb.flags = self.read_byte()?; + let pos = self.stream.stream_position()?; + sb.data_size = (rf.offset + rf.size) + .checked_sub(pos) + .ok_or(PostprocessingError::UnexpectedSize)?; + sb.offset = pos; + sb.created_from_block = rf.typ == ID_BLOCK; + Ok(sb) + } + + fn read_cluster(&mut self, rf: Element) -> Result { + let elem = self.until_element(Some(&rf), &[ID_TIMECODE])?; + let mut cl = Cluster::new(rf); + + match elem { + Some(elem) => { + cl.timecode = self.read_number(&elem)?; + } + None => { + return Err(PostprocessingError::BadElement(format!( + "Cluster at {} without Timecode element", + rf.offset + ))) + } + } + Ok(cl) + } + + fn inside_cluster_bounds(&mut self, cluster: &Cluster) -> Result { + Ok(self.stream.stream_position()? >= (cluster.rf.offset + cluster.rf.size)) + } + + pub fn get_next_cluster(&mut self) -> Result> { + if self.done { + return Ok(None); + } + + let (rf, cc) = if let Some(segment) = &mut self.segment { + if let Some(current_cluster) = segment.current_cluster { + if segment.first_cluster_in_segment { + segment.first_cluster_in_segment = false; + return Ok(Some(self.read_cluster(current_cluster)?)); + } + (segment.rf, current_cluster) + } else { + return Ok(None); + } + } else { + return Ok(None); + }; + self.ensure(&cc)?; + + let elem = self.until_element(Some(&rf), &[ID_CLUSTER])?; + match elem { + Some(elem) => { + self.segment.as_mut().unwrap().current_cluster = Some(elem); + Ok(Some(self.read_cluster(elem)?)) + } + None => Ok(None), + } + } + + pub fn get_next_simple_block(&mut self, cluster: &mut Cluster) -> Result> { + if self.inside_cluster_bounds(cluster)? { + return Ok(None); + } + + if let Some(current_block_group) = &cluster.current_block_group { + self.ensure(current_block_group)?; + cluster.current_block_group = None; + cluster.current_simple_block = None; + } else if let Some(current_simple_block) = &cluster.current_simple_block { + self.ensure(¤t_simple_block.rf)?; + } + + while !self.inside_cluster_bounds(cluster)? { + let elem = self.until_element(Some(&cluster.rf), &[ID_SIMPLE_BLOCK, ID_GROUP_BLOCK])?; + let nelem = match elem { + Some(elem) => { + if elem.typ == ID_GROUP_BLOCK { + cluster.current_block_group = Some(elem); + let block_elem = self.until_element(Some(&elem), &[ID_BLOCK])?; + + match block_elem { + Some(block_elem) => block_elem, + None => { + self.ensure(&elem)?; + cluster.current_block_group = None; + continue; + } + } + } else { + elem + } + } + None => return Ok(None), + }; + + let mut csb = self.read_simple_block(nelem)?; + + if self + .selected_track() + .map(|st| st.track_number == csb.track_number) + .unwrap_or_default() + { + csb.absolute_time_code_ns = (u64::from(csb.relative_time_code) + cluster.timecode) + * self + .segment + .as_ref() + .and_then(|seg| seg.info) + .map(|inf| inf.timecode_scale) + .unwrap_or(1); + + cluster.current_simple_block = Some(csb); + return Ok(Some(csb)); + } + + cluster.current_simple_block = Some(csb); + self.ensure(&nelem)?; + } + Ok(None) + } + + pub fn get_next_block(&mut self) -> Result> { + if self.segment.is_none() && !self.get_next_segment()? { + return Ok(None); + } + + if self.cluster.is_none() { + self.cluster = self.get_next_cluster()?; + if self.cluster.is_none() { + self.segment = None; + return self.get_next_block(); + } + } + + let mut c = self.cluster.unwrap(); + let res = self.get_next_simple_block(&mut c)?; + self.cluster = Some(c); + + match res { + Some(res) => { + self.webm_block_near_duration = + res.absolute_time_code_ns - self.webm_block_last_timecode; + self.webm_block_last_timecode = res.absolute_time_code_ns; + Ok(Some(res)) + } + None => { + self.cluster = None; + self.get_next_block() + } + } + } + + pub fn selected_track(&self) -> Option<&WebmTrack> { + if let (Some(tracks), Some(st)) = (&self.tracks, self.selected_track) { + return tracks.get(st); + } + None + } + + pub fn select_track(&mut self, index: usize) -> Option<&WebmTrack> { + if let Some(tracks) = &self.tracks { + match tracks.get(index) { + Some(track) => { + self.selected_track = Some(index); + Some(track) + } + None => None, + } + } else { + None + } + } + + pub fn parse(&mut self) -> Result<()> { + let elem_ebml = self.read_element_expected(ID_EMBL)?; + if !self.read_ebml(&elem_ebml, 1, 2)? { + return Err(PostprocessingError::InvalidFormat( + "Unsupported EBML data (WebM)", + )); + } + self.ensure(&elem_ebml)?; + + let elem_seg = self.until_element(None, &[ID_SEGMENT])?; + match elem_seg { + Some(elem_seg) => { + let seg = self.read_segment(elem_seg, 0, true)?; + // TODO: avoid this clone + self.tracks = seg.tracks.clone(); + self.segment = Some(seg); + self.selected_track = None; + self.done = false; + self.first_segment = true; + + Ok(()) + } + None => Err(PostprocessingError::InvalidFormat( + "Fragment element not found", + )), + } + } + + pub fn get_next_segment(&mut self) -> Result { + if self.done { + return Ok(false); + } + + if let Some(segment) = &self.segment { + if self.first_segment { + self.first_segment = false; + return Ok(true); + } + let srf = segment.rf; + self.ensure(&srf)?; + } + + let elem = self.until_element(None, &[ID_SEGMENT])?; + match elem { + Some(elem) => { + self.segment = Some(self.read_segment(elem, 0, false)?); + Ok(true) + } + None => { + self.done = true; + Ok(false) + } + } + } + + pub fn is_done(&self) -> bool { + self.done + } + + pub fn webm_block_near_duration(&self) -> u64 { + self.webm_block_near_duration + } + + pub fn webm_block_last_timecode(&self) -> u64 { + self.webm_block_last_timecode + } + + pub fn get_block_data(&mut self, block: &SimpleBlock, bytes: &mut Vec) -> Result<()> { + let old_pos = self.stream.stream_position()?; + self.stream.seek(SeekFrom::Start(block.offset))?; + + for _ in 0..block.data_size { + let mut bt = [0; 1]; + self.stream.read_exact(&mut bt)?; + bytes.push(bt[0]); + } + + self.stream.seek(SeekFrom::Start(old_pos))?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use path_macro::path; + + use crate::tests::TESTFILES; + + use super::*; + + #[test] + fn read() { + let path = path!(*TESTFILES / "postprocessor" / "audio1.webm"); + let file = File::open(&path).unwrap(); + let mut reader = WebmReader::new(file).unwrap(); + reader.parse().unwrap(); + reader.get_next_segment().unwrap(); + // TODO: check types + reader.select_track(0).unwrap(); + + dbg!(&reader); + } +} diff --git a/testfiles/postprocessor/LICENSE.md b/testfiles/postprocessor/LICENSE.md new file mode 100644 index 0000000..f2ca64a --- /dev/null +++ b/testfiles/postprocessor/LICENSE.md @@ -0,0 +1,14 @@ +### `audio1` + +This test file was downloaded from the [EffectsLibrary](https://www.youtube.com/@EffectsLibrary) +channel on YouTube + +**Title:** Pen Clicking & Scribbling Sound Effects + +**Source:** https://www.youtube.com/watch?v=cOtkrqo9Pjk + +**License:** Creative Commons Attribution 3.0 + +This work is licensed under the Creative Commons Attribution 3.0 Unported License. To view a copy of +this license, visit http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative +Commons, PO Box 1866, Mountain View, CA 94042, USA. diff --git a/testfiles/postprocessor/audio1.m4a b/testfiles/postprocessor/audio1.m4a new file mode 100644 index 0000000000000000000000000000000000000000..8f331d4c47ce7b60ded28e06135fa2e8fa531c68 GIT binary patch literal 244608 zcmeFYWmr{R+xNQ`4T3b%4bsvL(hbtx-AH$LN_QjOUDBn5N|%&$cPOBH&g;4E_kG@H z?{E9q-}XHG9b?Q9XZ+7G7p}zu0)gOLx_Q4hH*vLw0GExc6Su>APBsVx#@NBh$paX& zckr+_2j^B)$KuhlC z@=psc0RT;I*^pV(mkcWnQz1>^f~*FOgShn4?nRph^|2V5FEnA?~D zL*x$T|Ihj3j{UPi+S=US&Ht+$p8Vf_tE-!-Jy!rQn$H4k$?SJke5CkY# z7YtW7w|_SMI|1Cgn*HxZ;JlgBf4j#4=6(L#J=n!?b@(qG{~hObwJ`^44PHR7|AzNp z_b?C`uLKA}2PE;ISrIV^to?uWA&B_Exdes5aIpMe_JI9}5a3LJ1@eRfYoMV3u>kM?ZNq`qA0QaO7a;84 zd*FG1#sL8NLjwSu0dxU?!a#xN2bu#=22c!;3Xlx|+6HaO0w@8f1E>L*0)YEJ0E7U5 zJ|X~Y0Kk|)zuo|#FW~$`jsNWf&n`3wAQ}MN?+%~{U;+Tt0h$Mp0071U+KvYR&g?(A z2?MP%fFytp0HDV|`J@9a==(qZz}5i(j1i0n+;0T{`m+Q8bp!o^YruFwAE0KSKHwTq z3ou{MmnQ&F+JEeWd4cv)06-nV7R;p|0JO^sAO!I4Ukrd2%oEfS%n8&e3IMDVxDPl} z|M>C)S};CPSA76u0MH&7TMGbK15o2Y05BIYeozB2K0N?1mm~l%kN?;Q*C_(10Dv|@ ztw2q)0Khe1{GeTM9avv52CxNff;ob91LHRXumAux1jP>4?gfzsPyhgZ{71`VpbxGCeS!ACc`yfU08IeU9+(5D=SKiA zU(hC~F=zwa8v|eu0O|+E0BQ)<4U8L%A3S4V3+fN{!T8kyKyATsFjvqfs1ukU7$;a4 zRRGW~_}qZ!EdzKKv4A!Y0E`!mj}Jfu0E`=45BdjV1LFeEawGt#5vU0mA9%Jv%|Srl zh5(=*AYfg=d2pQz0GI>lAIt|lE8rOgH3IbjYXQa}0|4ft0|3Sj&V#-{-^l=}0AT!} zEwGgX0P78&5iJ1F7Z~q<&Jq}J8UWaWT7#`GfHMFX3m7vP8yGJb6L@aHa|HSXbp+?Z zvjoNh>JQcr%pU~o|Hl_-1AMKL2LNMn008aB0f2FXe!)H9yb^#00B94`Cj$Un1J*1Y zAPfN18`J}=Em&hP*Z;&|_irD}8;ldw2&@wrCzuzQ2bd!`4)#I4K|kPrP&be$08mTN zH|Ph<1w5zk0Kgi8uVtWZFb6PJP#;hm&thYa9r(Qz?i@_*#JoZl>nfg;5h>|$pn}NkN}VZ zPz3<@gLXjuz_r={U~Sp}z&e2E46Ju7Kq3H`JE%nn09em_0MI{Z6C5i7h=#y8dpMYz zxKTjhA%#SL`yv1T^}iJ0DgR&H{|`F86oe_55~y@kkT5e`W0*K3h`T|b<6{W~-fVVx zOJfr{OC`MV?M~PyVAJ87WkGLTzm2@3f9Lqc?0v^pF+?yFrEL`3Fuzvd?#?Ta-?y6i z(e|yoF^hsg5Cl?~{TQ!s$3MJ!wWTKm8H|Qf>O_gLi6z#g5q*cyLB3lJQ+dWy@?L~) z{WV5kEKvLV@KTb-U%VY7o&sxT*+@$`=Xcx1m(tKS|5gjWJJ}5>@74Kt@`<8Sn3{(t z_!3QeIlz;ImqS`7p*b&Q4j1AB7dA~G z!$zN_yw_|asj;#eLIc4Y|IvAz=sUzumbS(ttc4J;EQ~%`z^3#kpn8$ay5#Bn)2c-a zrzpmXAoTldxbZkCSO$7Git>c{z0vI4ftR{P<$@OKLMGlbo{LELaVC)-9%$!H(WuO9 z^vuNd@n1BJF47{xT%Spb!yO~-FFt1ai5fAe@fSJ~r4f~xS^j;>VaR_%_uCc9TCCIG zJ@Vey5f?74@;d)(74WwVvpqvyVh2I~di;G{-7k4eRW-v^Uz&vTmuJ;yjktU5j7Og_ zUB9tIV|UI=*b9%3Ot$_&J#*My4>yQ4)PjOPw zHx-vY85_^sS|oJ>7~G^Y5#GEhyy`oXu?*9kPhJRl^cQ%3^n&Y1Jc%qsm?WLJQOU~% z7MwLPFk*1BDzld1QW(TyKIPH0NH#6@POmTuJJ6#Gc7;rLL++7nH{yfCodR|*3#K0UtDw7vMGFChUr!Hm^ zfqyrfMPjlq_#Kw#tfEE_$~e&m&+YILXX-3%-%HVcqDEv_DW)Rq9X??fbgsLi>QEZ^x}@$(Yr=QF1#;BxvNzNZe5$)8#V# z+9nf3+4S%u6k{mLk+$YipKxg_nV2C>$?*ht8LXw+b1!f(i3*R*8)VU))7;6iK;M z^#dZg;T!&JTI5cMP&uW7Mi6Jf>=L}&>*((+1>K0f*BUrUc}r~KFH2hZrkdK(6KvcA z`f{k9vVX5wIuqu!Z85OX(kRi}vGXuCH;Nb69**z49v<1+c4@ME5%elwiR_ia?re9P zZm~i*A)2hfRKk)7%?lbG{;xb{oYvSyCfelh>)=-$NUX#|-p&)>9LJT{EEb++ojM2; zUkwc>=s5A%TmDRrznhEwic2FE`+^!*ln3jIZxR)1`iM1PnM&oKxg8FU-`#7r?OwCvtiC3p6f zqHT1VPh*37)oX4^^=#JZ-q-Kh|B&kkv);|xafvYf5P?%)BJt!nyZ0ho%z}dIV%?d> zezPY7Tj$Ay|V}Uvt#NQy(Tr+xV>#PXWOPh+cM?o z`MrQE#gA&LLoaJ2G-{Y*Na__qOZ~h9<7WxKHx%XU z8Bx1$SxwM`?s(y{%QeQ0>H$RI9(w|l1Vb=#@jcB^^eF+oD#5=z{yhmK}%%%Fo+ zJ6bE6A}WeC!?nQB9cfbAHRj+sZOpbtBiD;AJnW8I`7F-(z`+)w$VA%ia~>;SpwV-? z{iNhTB^*#{Qnl7{N4#j&(#e&nw8g@$@1mG$gjXY!wwdW{`K4IzeR?gddIGZE*H@CO z>2i@1_Q5$C%2v7#F$;%Px|YJvpH`X~C%S!gWAHY#b$`=-c|>CHS1&_m?5r?Ndu5UC zgcz& zQBe9QU6d~r;!!BP(Kt7Y@Tj$B(lm>`wN7JFidQgxkzz-R*`EdT8sm*Z#BfmifFcyu zU=3hnhJ|rqK!hNgjXoW41t|-+xZg&Yt1&VO-pU~@gr76uj;IZA7UO*)OMz!GFw^on zErE=siXqH#1{IPeuBPaX?Cx|zAeqXU9|fdJp+mN<&6g53b8ao3>7i>^s%u1;ohem& zuM5{9E-eGuRXB8CIRccfyLugPm1QJ#d0QY;LQ7+v)IDj94+$gVf=WxSlUie0>SBMK zxwVnS?K(F5us)+sw>MLUJ=AQOskkK}W?dm1tlFjoC}kaGFfhrKQ1Nb5?r_2aD~<%jf-X%J3Kmrz3n*ap@c@OD_N^;oL}GQ z`q6D+1ZDl`l88)qp?&og0q55TD>~A?=Dh-~lCUuH{E3$}r{xFK)_67(1rxB<1mY8J z-bchO3Ald(ZE3=LbwKfBhzTvJqA?`cWG8arU?YOOvaRZ;2If=d2)o_#W?J1j`}BFs4Eg{aWG_=x|e!S14kq4h!yPg)60+O ze2qG1&3~5TyN#vq;G|5ad78!1#1AU1A?-;GI1_)#CfOHtmDhu9$z8e>2aJ`)dMwQ> zYfly>Tw!bFhvheQ8XHFmt`iC?kKT)qI+9X$jIrkUp>!!bB1@+&L?n^PdKP(A(ijib7K)4#*Kqf?Cm- z?NFDIs73je`HoNyby4kUvEX2(hF}ecO`bL6*O!b1X(6MA&2OXATBfsKNpgPmMe?Yg zX(JA1{$rC;1Eu7FF#0&LwBqFw(GySiu!*G!HEVo;E3c}~Frrey+Pqo&nz{78NXgx$ zdy#mtqm?p5LSw$wB{bJPp!1NE*v_t2^!Up!$sB`>!sm0hx=qG=-&!e)#>`H#!zAmn=st_OtQI0hn(s>~S46 zGcs7KX6jCE(-4d0@D9eb+GtYg2wBLC^3>?MUE{IfJuEb5PEcT`53AkUW(~WVI@njb zK5G2MZGJ^xx!BBj^ef$KWb*T8b6@*ces$3Kh! z(q~h@9DqiNm(REKhLxE+5j%!}iz&~jTSn?5_#S3l zDxN^5NaE>H&|sq`ZQkI*vU1^)i~-8|E^Cf+%e;A~W}5pcHF}sw{=6ol_xgtaPr-X? zPsQ_TVc1LES1;Pb_g;FGYp6aUcGu?*)C+aWezan$En6&Iq7!&OzS-ITL55ILglqC* zUy5LIIGAR@)QCOUYEZI{qJ8bheXZM~@K|qHr=l9PxA?t$3`YGF){>yT_uWF=8_yQAo!M@4tEC#-`EsJgr%vBiF^xeOb2n?U}Rx#r<<| zc7*ztxR`O;m$!UUa)*2`oKIk1SkXJ5>oMKkKRwzRL+5Pw7O?Lze004uOal8YcUM}e z=9)c!sA_d&w`Y4qDe{!Mq^x5tt4zL%0^SFt6c^$Q;9!PTh-g1T8aU&jHzH^py?m{E z-{MtU#-1s-gj|`88IcsKV!~Qsvjy#|No%scYl$b zGJFK`VzF>Dgj)oir|X)O(=Q_mCwtZK)a|~W#8DlqNi&S)3~zKCS8oe(g|T}AE|o^I zXbv`#L3%xl$o50oh4AIjevRRMbNFo3+aU;?eVCUZ@zR`T8_}*1=YDvGsl<%J>_iSt z%jNhN^A5Lz=(4)H*GlX!|N3R`Lavey%JR6T(h><4X+Jj^_qkae<)Cs*dd`M?ap#bI z3)gkz2VKqa+F)wuH6nE1b#9P%VokrOi*Anl`mxvrCZvx+e58J1Zjo!#OmWCze&$EE zakP?pAL%5Cq=$x3qwqLo`p8cEM~4?4T>1#oy#=%sra^MCr8-{w%XpsYkmIylPg6pH z^LjcV8HgAJ?pW_<7_G|O*&uK3bkM`&M)4j~wKlK&fNq)ipD0IbomdS;(PH(1quXayA`SGMn-oPB1FEMy(J&R&KpvSQc8 z_>sfgkAI>&<|=nVLJ3apWV-q+5gzU?d}6t+3q^)bIJqtMHQ#B{Nm0EN^gpX zQ#Z!o71to{%1?F#^ImQ7rqVFgDj!-Bu5HWxZG-*K#yXOf$nD&;+?gfB7Zvz$oGQe0 zc4(aA#%6e!Sy-|Wh-pjlr#d9gmBoI$6dZKwQJLZE$*t8brQ_bB$LcEKy{YZRm`GWJ zoZ)U)4XJA047YE!uy{VzCso<@-;Ie6bCk{(W$CDG{-%vc*|xiUNbzfb{6@99UEbWs z;bmrG#WJGK*l{WTp}pnfw;6KRsKci~V!JWCX?k82hpYe!g;^ouvIr!$)MZ#3w^f1E zG$=9rR`&*SaBqA6xYqc&nivvvXmd9uNG_th3kwM~jLx{k?SzR>f&Ss+}l$#J3jjh)n+cfMdIDvy-pum}0tqnaxQ?FcZgK zPzj^pmlbST;@jF$oQEfx^jWb`%({wI{e)a%&6-wq-PU$jeA)lq$aLN_pHM%d=TP@d z^1_=B&K--~os0T@fjU?OMOknQ=Di*d@@D5xsGDWpAC79Uir@N)PJ%iS#g#<}z#GT*Tb)b^xF6 z$wsvLc)Y)Cq2ePwe^YL~h7BEWR>C%nTkh~~+qEoth^W6*eQs?0hU{3ixBeJywA zw(BkJ7BYWatJHh!&Wv0hJ(qhKCeFw{kB3;VGxLv$EY#>8I|ayJJ&ldVsNiMhOPwB) z*-DT(YKZHkDnsS`rMiizh@dgCD6ZQ~wu3qpxk#vSkv&@_gGWc~a38JLC;bqc|` zcG~mV6?m9ln*o6n&iL7#qJo;WD#)!%R;4LXXfa~O5LD=s%-1vVg0gRd-V6{w@z1yC ziVyWBjg{MiixXoPySI32J9kG(R(f+eQ-1UguT(oLr# z`o5c1&V3U?3`FKxcfV7vd45|R5e7IU44w9h+a3+!AMbbzPb9p|-&3fo<@$P)MsMay zEyuQh{&v$dpquVP_X~a#gpN?hpi>I|lpbO75K|HD2*)GS#=4`ARxSsf_UV#85xs^3 zQ!bdFjXum~-Sw^B_O{Podis~7Yp=WZy)E1&cD>IG(dc#=7(~V4%=JqZw`E7C7V``s z6-Ls7-U|M{8?k(1j=&c;b-5o2i(si#zp%60KIJ88TVCX}D?7i7Sr`vSojTT)ShjG2 z7g&wQ2AjDV`3KE=dXpsQpC#Dwq;;So**Nz>iF<(6_1=%ORSdFmj2Z8@UZ0HcpF_? zU4mdlAhFi&l=6YLJ_71uoV$+5sF6$}NW=}^-41^~&x@3`9scyn6`}lMRv08!)vfW! zDIxXFOE2I=1ZFwncMvJLLK82!GJ7`MFyxo zl`3Pke8_X&G2E9pno1P0r+{ny;?)NmA$C%%pmkY3t6uyQ+f(m3RQNC1U$Unsq5;;j zbNv1FH&ti+wl|Z0#x!`OZ}#$p$$w6F-)!T&GkLV|K(~sSEUb{cU$ppkLzOuu_@fKq z9bO$dxeEL@p?X$Kq^pJ=0hBo?S1F5U43w&s?>|x|SCAl+qxcsP7(Mp~ zod>o%KgW#>V|zhUTqZ%~y~gv4iS3<}J9nq4BLw9xi~(Q4$I$PHMF&2lMWC9b6t<}* zltd=QL-=$Q5%O!ZepRZ<)veStGK0$upW%4S3L^sjYh{^=G)m6pktA$1v3HH6uC*2I zxXa39kczt|Hak~(Xg{RHx)_jMauKOGSnPgZIm>Z?IWstV-Vr*^{3ZX5`38OX`ED&C zgb7zhjNKE;O5jH5m(|I)_U9dP@mk(bRt-k6kG)t!Z&d0sqfD2UH56qAd!BLgP7TN1 z2DV?yEF?sCPLT1%cGkb+{eMTrwB)#_jcM{o-q2n^8t}*jKO^ViF zN85);@~&*{Y}x7JJzK6tUiR%t#Z9NL_R;M1sg{Qd-MPaQBqs>S^QgxmvUW6twKwwA zIc~9wnN12Xi`ea|D7R3}tlPW*w&CNQ8|ZCqa!rsv1z{=!eKcaDat-GkK4SR!8@dGz zlUX|f^5fY!4;~w_K zW&95JcHh(u6AJe5UK1~iQnW9BIRn>%K7)N*x~=y+EK8HzM4P<{ffx3*Yb=8EQI{Dn zhqHE>7^|BLbJW+qtg;EfnxT)&`!g?jAI<kS4#L&-N`U@_v+>JJzi~=0B`Bz(g)% z65woRK=7~<__UOxb=j#HJU7Ad0OhDh)Nb!>_mYYwL7o1j5i_gA|C{p4Ivnfeb+qDJ zLTCBJujNHs&diOC+%kWR^>$BealMfCv*x5-SVun=#f%%^z@|6g^GZqWU`Mq}(L7Yt zK;J17?rr5{s9AMIx-?XqG1FP20wxn$*z;eCc+(3{0yhSIw>39( zdZ-&A76C9pcp`>Tm24?of}P73vEz1*?ad82MBermWvFzQvFt3J7jBG-2(KPCXyoxi!gGdK{!%y><9x4CCG`(XOfH3ikt(D3! z{dtrFWfG_1Z<&$hpI$odF>%xQ>VWb__i z-;b4kkGfDu#wt$YgM%P{-CA;siWa7trp8chMb%Cab_}i7LdYJ;ekGa(LC~D6&jdc` zFSVOifs1*GNuO)|+hO#u0y#1)QdH$+N&Rn%0kcdZP2Vu~+u z2<|oO@oHZwkY@`Q?~@$M3$FQl6$=FEn0g2r*?gzt2Y##g5fg(hxZ|^}IsZTdaiq|` zRvv+t?yP*F^Zx77I{#1~Jql+nn8SOryZcQqmr$^4=`Er`c3&tr_E28Z13oG{HEe|WnPZ3mg zJ=nscw`AQUZSDxs^ot2o%Hd}CvH2gY_F4IhbYG}NZR|%K4fs`&z?XVUW$%!bX0~=6 z1?R8ql^@*9jD|d$tr)3XF@D-sjW-iZM$U{hD2Zx=b#F}~pSEG6`9fGp&7XV^(U9L! z!;oc|+)tfxjwD=Cs7N%~;oIl+eiLJoMG#Vyv}St8kX7bJe3%uy_+!5$k5{@|UcwM?XKBMhrW!@2Wl8?&7J(OhMC;{oTa7 zZ=>*9A^DYbVUhG2i*2yK9O6I0VSn70H)I1wTd{h>vpGL57D4TO@xZ;E1k8n%> z*JiQ)$Lsd{A6R161y>~PDk)(#+G`f0d}Zfm?L$+S!fv};Vcji|xPHIQ$zJu?_~g#Z zFbv8%>;rUg+uYk&=D`hs8h$C7SacVR^?w*T{=X>OkOAiI1py zND@&|3e<#^@}5N6e&ZvL6d3be(1|E$*~XjY$NIYg=FoGA2idk&rcKcZYRI@-cE^ai zVLKaqWB<>DICE~K9u>SHE#dR)$Gb0mEOm9>W-hr);q>R7k%p|1vvuo<4?(c#@S_k^ zwYPTDRJqAN^MoPEOUK=kn9cj03Swtsk%os@bs~H@!ziNBzPX+>yQZI&%m`=fc+|27 zDhZ;OQsL?iyVUDy7z-!Lj8+w`)?pmS?)}FE@p9r{vgifR<_9S4%7#&Yj-tp&i>s(j z%fu5Slx{#*`%dKwNe;y22!%~jKN1v+Vfn!BIdE|1CEFojmy$(vYRD;ajN z0T_!%QMRThHhO4TSA@nu~ z$99W7agO1IJ5^((GK9Vz3bswq8~>LP11RV6{;y=F|5!pW*O+!O$$hLg=GtT0*6ZIU z8oq)+Vqp(3HdBojHC{SI9S-q5j^Dzy_>Vi~zG6XY`?bFhyb&fzdL_}+P@#l_10NDj z$%SE2h45I!H9{p>5(RvNL3R@&aO$DE^piu_48w{p=x+OOL1;k`B#59r^9U_4D9?d6 z)m&$wkm?U3+Uc*dMg+Cr>bayT9e;-m4;&vR{=C^L$UFNxZrGyTEgy8t{|0s1clEuE z;kP}RS&hLoylDoGhbjm@MS^-jPtP-16~fOrZfiIV2OQJW^gjk&JRS-%`OX~(UB9IR z-*jz0K71d{GB?EBAXO-H^SL|-nej=`(+vmb9^B%wN59)9s*kIe-mh%Uv5ck^}D z`Qlvw3n>}VCF!>%%R-fRBrr0mAh2*PQDegphd*wQ^>*GSgNI<5~1HmRZ-i)v3~ZpvXl84LUx|z@%Z3xU{}es!Bf>j zppr04cSC_#Wad=z#+~) z!Whed)zY{W0iCrb2B87%l;DQxCLS)AIi}l?oWNE?eUn>odu-12)WauI5$2bsowB@n z?KUUVy;eSh@k0M~OhyV`>LP_Jrn~FQ+p~FwZ$m@Vez7zHukm?0 zs)-veOw!)r3%nAX(T4OOIYx;h_uJ^fXrz}kcU*{~k3kI-Lovt;nI$B8;U z44dpek@h#Ra!sN{YK)^i8Y?Hx<0u6LdyUBY^7yIBhlHacmp3Lu_g?}()B%(@1-tg4JX?7W&=?UQt z>ks0~4k1$LkI4*3G$ge%Cs#+LD*kR{K-grIbbX(9Eajts2dmZaU@( zZ$#6d@1Kb=gcOz1zv&&vG{r>CT40Dr@tNBVQ9uiN?qYFCUyna|$xQ{i_v?$1x>8_M z@Z>ewe#V8vs7f+Ik_(ve4|hC8`ZlRqLZR-03ftnEdACWc@Kl5ll&)lsrNoAmkZwT# zqV;Xm(665Mu%tAU2Ha0D_9~PaWMb9b*JnD&)cwNNyLJtv(LpaPeYVJ9zJ*DqGf&cU zsZiaZjo z|L8dgpP!ZBd;C*yRswzM5Cc3pKMly7%!d@F2hX7aI!!Zk1MN~_* zrnIRw2ul8vavSTtP>fG`Qbj|Tqjrs^_xoZ`)5UG=Sk9$wg<-zuUvaL!MY7*%E2Xey zX3HHqw7`{1;6E37pqdXqRL zT0e3o!#37;T9d-dIVL+aC?|!88+RCSD0KMApLUafVa~>w!wn&w*=xNiqIKaXt+X7f zv1;D5;X2EjDww@tvhg+|ITq+OBhjeyGALfQoHc3Ac(Rb|{MKZjr*E5mRpPGqOM79Z z$xrdeJA3*FW_K~0W?XX4rZY=%3$^gd656v!bf1z%w>oycEE7}X2yAlEn`%C{ugiqN zL5lw9+{&Y3nZ`VAab#Kbw#aCs#XaH?N?NeFgR^?&8+I+9exBXUEsc(cI3T9RIwS4B zl(w}VXQ_X>ZaUAiiIZ}nrO}^`=Zk$674l6!iGO4csm;%mJ8fyy$}5;hs^8B~K=CYKEoW@vtREA}P`kCJlN?xN&*6=)%2`WkHhWIzZ^(T*=Hg#3ZlsiKt5+ zt?F%il`Y)llck%Vx=*nXTk)eoZN@v`jn;B?od>CodO|vZqD`h`JEf17&GkZ}V5Dff z7_EVn4!)3Cf{(a)?HAllozNFZsu7rFZrPlANaee%J(_@II)&nE>4K?tvs#cWY zR8g~)?_;fe?H80QWIqvbwcB;Mm?X_CTYah2XZT##S=wf|m9f~Julqg*W8gLc(3D;2 zg-IE{u{EX$IyB3jG1;)}4MM30UPsfEq`+IL^l{d)+;iLUrUfw)^C`Y>UrP|4zs`H; z*}B_vDV3QK(zBT^RELDI%W`9GBJMiWPhjuzW_>=MtR*SVAKWZQU-GHgs9Ivj@#%R@ zKc1)Wr0+P;arI5=wm0R|x}QUJoD;JruNyZpw|W_=Wcay!TA8EeaMJv9m>#3bjwQp; zXM9DvcHLYPk zGAgQOs>x70DWgfU=D3*FTz6*1R%3cWquX-1bl~9qPUpN&?&CN5(b3lVs{Tzw(yWCF zMkz5nHD5tF5S^H!!}dYZ8CJGu#*s^})J(gwsYp*+9;)(D zk$9Jzo@*)q8r4BJ%eSkHM#cZ3!6GB98+$3w=IS!IC9C0A8^KwAG>4F(O{{uj_q3^& zt)qES84#6ED*%54rXtPF{G1^R&*?rTh57!yhH|tzPdJwGJ42q?IGLLUe2ki(P$YI# z;4kC0>g!Gk5rQslAgR5A!28WdO?Zo73~L2KjBuDC)*xs){X2K;*s2iQdef|N6fDLV zB$kMvRu;s%IXe1;m171JgdZ+=F~~f#DZ@Atq7qsL4rE#9QCn4ASl#Ax4yX7ty5CJs=E(JYFW1K~3@UeiQ|ZiHFsyqTn{g9B z8-T{tjQEK#_V-<9u+}54ag#}n}1#^l4ETyMny^LDZ-fg3qz|}+7z_0 zX2-v&$|fB>dIP&c9zB7*E=;9PwpS-c1X;r^Uq$;)N=C!anh@?>agEddxa#pt+ACDM zVKQ9fZm>hM1$I*GTrmz}Y)93}J8oVaI#*ozmB(^Q*CZPePHM z$+*wgklkX;J>+SOuz09p7o0=ZVOAg@coi!`Fbo?VD<=^$%pgWkm@z|cj3uLF_-?Fu z2x3&#tE}TUx>Xn&dJ;KI!(KnNWzK2w1%mhllAvfDe**thgsXn>cs1>&nDW&7b&n;7 ze{TUAa_pdw^MPwKreMOZ=~3;|XQ$Ghl;7YWWR0>! z^bpuIt~v^s${zWWg|!xhz4>xDi}Wv&5HeHm$hKn@$t?Ycc@IaGLn7&uKvC)ZUDvj; za1VFm1U?5WVKpi(Te#0J;j(H{(lyxEs$bNybYXTfYUq7>=viX=j!=Z;CWcSrrj4=p z4ngB?oXrt8lo}I*lp_~|7u6OsJIHQ2`5;xMJU8(bn;PD?AS0%Zo3uK8shFCCFRyaL zvJ#cJ?(k(LTdG&La{KR?D*CZ?nCJC&dB&Z6Nl%mGF(ef&G1{vH>FF>DyJl)-YAbGc z95ic}-}Yw!<%pq19e_cR36Wr+GP#0q&d4Apqv9a`eL#MZOE1?~+Nz1$^h5o1Jb{!F zu5^pT-Rofd(d0a9<4Z{~1M~tMd8TZ2cu`zlgD?Eq{YRE0btv-^$5BaIOyrlN%?6G0 z$Q|ghUd2<)K4W%R2Pl0p>-{!F#y&cxRd|}xPOWX~bQ)6m4Ec173}OmVx^?_5MFn0H zJ5+Dx2KGDdT??AOY)o>dQf5bgR^Q7C{Hj8}*7)G(qT8S@+;Moda3^Yt$We1=#lXhC zqPnaRE&lR&=03N^RBSOUcC^UP)E^J~XYg`54#Q|Pnh8CALsXJ#ud6Dr&0JKQZfmsN zajFX{wgpFUrIlcnX1#F}%NLSs{}v%VB|JXj#Ll6ySIyjn%C?!U_G%YZ23EW)Kd$c9lZ_P^;vrQ zd3n}TK)aLd{9Ob?!Fz0{Nq@rvtlsryJs%D=b%j5`S8NJ1@q?kUQ56^@Cm209KRHCd zepk|6=`UDVVu{zpwY{K7BOUc$h>$4Y&uVtl<%$pty-b*Il)mkr_u_Y7{nhikK`w|^ zEpCSsY4YYT)~6Kyb*m4HPFM^*WdLBlvn6kcq%qS_YJm5C9TGf_H0OjN(6c{|Y3So}FqyC<*d+M@1Q0_;bdD;CqS=EGz@k`60N_^s10oaG;$sDe1zuRQp>ZJW}+ha@5D*yzB}cGMbkltXJdnHp_14Aa@Ud2p_)NiRPo2Rl9LV7!i3m)>9RBa^JTM2B=TTrOcXgKU$2PumN81= z_0?X?$gw&zqa$8pM=dX-BcpoHQ8()Fg>KaLcy#?m#;tJaP8(C3CSnokEp9O6#mwOb z;<3E6?=&BFoSJ{0R(259H&218fE-c@+Lt&BUEy#8qO6)4>f?2$$9a;Hb7kR+O-GUD z$M5tv_S$P7Cj&SX6YCtB$y{>kWHtmXoonLfq8%p8*VMP)7O^xU)?OsRx}~nkl8k#O zHBjQjo_3&EP11ER5U}^Eh1cX(mMe^<4q4RKXj1nG%zw;bLZLj6XA5%95kBlU#`_XB zS~sIukCo=BIU%Y%;l3xdlH5gZlAe-3-9%ZaW)?EuTV@-A-gYt-+N|MY-99*gH``gE zFYlt_tZ0DlSF+dbp0+AEh&WG*+alPNn6E_B zSPF4JU-!}wmGhb=y|S8^t!xHC_nJa@C4z>5dzO6Z2l6;fIw5ba_#VfPcIQ1#A;0gG zzT-fkBQ$9rCp%j@;>HXwB}YzVOG;gjl6!vNjyZ`DtSVUwEz&ucwkwPK=;hA~G7Lte z*s9Jh(-HWrpEvuWiDNJF7p(gl%`Ek8eY_UpCYfS}rn~>{RoU(}Ydhmo420K`=sd`d zF(|9JHPMe3s8uP?**g{ZzJRe;=*CBrE;4?tKfy;6b23XJZpj?ZBNfL#t`}4Kva^cC zWNi-Tx>s^SMRrk?bjHN{T*nqSD(!^6R5UmS%d{tjFik#dsN!n$IIGEe9!G-~_2+;D zl~E6M1&oCb6XcbcKkxcQOk*>uj&82pLZ)lBUy53-!XoTBc6E%G`m$*d1PKyno{<<^ zJ*b6}K_FA6BHynap}L@PXoI>;cyt_(>(pVe^_{dv3h5=g|8GF^%|eV|;0LX#1mgk9 zWf0S}Cq(;UZ+6rv_+{g*ftzK71COk1vQbat1nsb<f%fOr7 z81e*!2D+FuO#JK}iD){#)>mN+HJ@fg(6w#(-@{jpRv+`#q(T|qFgZdkY**u`8JffMq=OWv-fbY)+?^t z_=|_L<7MwMCz*disTRVlvVYLxN*W`agNa3>zpdtK)K5)U!}(MpHGaHX7hLDee|Y+d z3D$&CFz+neyRr~<^)*-3mX1kmc4bquAuOUntZA%_hHzdJzmiwk)U0c2Q7+WAO}04N zcOT!F?>OUCk{!JJCoh?f4W;d9UoAp!3L`ZoH!X${j#U~(?=TI;v`_M-%=vd1ynQ9G zunEr#ZcL{TV>k}zKE*HCb|?Ib6e;NK-&N#7W7ymoXaGEEFYe>}y_&rr{XtLO@$7TU zfq?YMADbSzsSW`ABQ1n52IU1^Q)aY2~XT{o2-E5~!yk40~otypyz zp|MI~SQ#26RV!L2{n?U6e6U*u9f1`bT$|mx6YBt+Lhs7 z2wy8{X6+55Nw|5Wzi>ahx64GK>B||Q zjr=717V}Tm*P&yFxo~yxPuH?42;Yb#_7m?xNHt-6xlR7WE#%+)nHJ+VtwZ(Rk7{`{ z>K5x%Kc&Xmd=$Pi0JXWgL#1WG?JbWO7RL4tK?r_mbEVQED-IMDIjsbZZDVF9fq=g0!!ckHElO@8n z^GfO4i}W*TN_o51^7v5KaVy_NR>@>5Tt*HJL3O-oUy>!0;izutE73*Z#M8gDk9nM)*oOSFa z3&AuG)P5I*T3$Fgcex8rIZ^+`Wwb@*PE0x|Ii=XJX*LN_d0qn9qSKor*yh#5T&{3e zKKR?>QM{+z-`K65ByY!=!FqO;x$?Ygp|V z+RAhmT1BM=?t0$vD~mj9Ca$nb0sq&csVrfh^LfM7t~CDX0xAP#lI`B_ZKK9z_ktZK z-Sc4E_;pf#zHG0T7mdT1+s>ECqiY@S{(k|bKw7^F34}obw=P?y6%^GH=qDW{*!_2v zR3ZI07k)?WcON=#uNk>>%~|Q*WV^-moLuO(8yn(5-(XaRF1j(TjCn&~^~;fEDVh-~ zbsl(bn9PZB)Da<0Ordx@RCn7%L@im1IV00A3yO`DTSUru^AV}0rB71J zMS(3ZUC$vs3c$-GjXpIg-4`Nql-wsyM*Bmw!ip`uk&#R!77~O4dXN96N zrPmo;;&M(=Kpan-GOa*Ba#EpMGpl8L%Q36lI1;?M`aU&jplVGP!(b+%krl-EL=lr^ zB-kcsC`k}dL=Nt864AkmAQ;^mGNG~hAqtbAoE|Iz5YQwb9uxrffFj0&#WXztwE0d9 z94(4<`Oa7AoprmouhP)-#N~#%XU~+IAIZ7 z&l%$Fb-TO2!^*@ulc|VG!kN}u-Qyr>>!m89)?7uU-7YuFeNM;&B(WE4cD*gH6=iDX zB2B8w>h~)fqov70;*y>0t905muA3)_TRal4YL%0+8n^~3)W|HmuehaDqNa(C%l9!{ zaKaKb`Mm9tOEy(c6vh{4nO~ADKTPLjovw?P%xVkmmYOF?tU+Gx^E#PX08!3a&%R}_ zsbH`vX&!PgU?8ogA?I#KW#@mxtJA!6$Os;GmiGvf%8(Hx<_XdN`H#kO9ySVzOMP

q*AqtbQlo&1{2tY(6APt)U(r~aMW8dQOXc(pdhweT&v&rqjHQoqo zx`V*y1#Kx>Dv|2o;8!vH3)}c~lR5dZ%gy!nwkXOUhXShO{ zG_E6ZPYqt@|Bay0IA_No~Qn5wAoo#|{!LM4@c#1AUbdxrYk`|^P0RDM5$ z;p~0lru(i@g%@75-M;{4(6cSYF2&CFS%((gO==7z(^C`Nv0XSarP0jg_s#~%C|iqYXL!!ekyG;`rG zuWCtTS3Ufqm;gDkvNE18XQ?aSzb$r5FwOYJc9fyFil`#PlzI+^Zl@ZIB6_hv8|UnP ze__ynajV59pf`cInNRN_3X|Zd5`h7Uh=4LG1@K@V0cClXpi4do_a0$^o&1c}RQJe@ z)Ju@eC$d9?MRVjiszW23@VAtk)}Sji=?#8`Rf>gZQm_V6PQV5~h4(+>_{-JEIHX51 zkFh92_bmZCapeac#@g3Vp#&m@JK*(LvXyC(YPz4zKUZ-X*^r!qv=`EmxG_l(l*eBy4Bl{ve$=g*C4z-$bBE1S&gI%`6UFSojC`0|Tw z!do_(%{3G}#`!%p=3a7c-1Fc$(5bTnN%0ChnoI^QL|IkRYtK~N*(4IG-e7B;V?m09*;kZGoG(>$8rB>)-`9Mr^?J2C0#!>);C}&7ShFN3$bu18G|98T$ARw= z8yxG;(WSWes~ZO)8k4cG5K2Lb5T#myir5f1U6vo1!A<|$}SV}<{JB>N4hHmXtcY~SiglE|x(L=J6(Lf@kJLZ+M8;jO~-TWmQ+fvT3qvLWuWC2LZeX=!71 zS|k{w9=omx`I;cn+IzXH*Vg`kpv^7^@STqziWq+(8k5D6kcwd;R75lp7@bPKRh;GX zT5VfRMY7AQd0Pf8_z#HfO=%+kuW#7oPpN~KnVek-l4-aj`{J-baXA7wm1+zaJC7(9{&=u|Z{*UkeKZC{|`oIA~En64}peFy% z^m+HCIRB5c6)o?3oh>6>T5J!oAM9Jx^X!l$EG+!R`@wK5vlzZFtTX@{4g#G2=?Qyd z01ujC2Ms|R_kALWF^#0E=$Z}xWWmuXQPK)FxB%}=Vx-JuGCHiv%h|KA77JMRusP)V z{#A0pJwDyfTr;Rw`VCp)vpQ-5LUsIw^;aH3&IVnwQGA)!RXi$B8d3A2tc(C|%V^=P z5TRb3m}PpQr(xC-8bykbn_xgahz143cIXiBb;5RNguLU7DP65%)EzKna#-=SF=@xP zmJ#C*z<&4)_KZtpR&FWG3gPW;%{pYma`}#8EIK9)|8y-e3u~nqUXEhblga8-RRu#d z$ej80PkGckAv%;jqKLwN0VN|M<^o*^P$CNnguY4= zftLAI4X~O3msZr&0)&(%mYQS~jrK&!u=8e@*ouIwdQb#K))p*eTyYSC=TzE53|vlb z?ReA|coQy8j%+rl>=JCOthk)&^8lMTwEc}b>0CDE6}PK5?0q?E2hg`!`jFsmplPcx ze4v_DQ#AlEgtIwr$rNHBp!+&LQFc>+*_h;uZ+zyfo@xaaXFq?UnvI|caeyFN0}%(o zfX5(MY0+$qvhaTc#Qs1$!o{(kM>VMwp^jYev1G;Jm>wWmNmIhIk-6}OH=70qD47^> zo+04{aYR$YkO=?)>LFZhNTyl_{BkBZV+hJf;D`}$dL@jWUN$YNdp}D;1xjX;ARA() zFr4}vaOSSAD)quiBAcDcz)@tZVYyGPkMA@v&fxODs{cfFTAVUQJsX&08H2JrhjXcP zFZl>5WD+`%GNUqcNS%AzdU(dmoMbaf;>w4Y2|$~+tYVM|94p({=$Tbhmnr|Bd#qrf z&f{;fWvI)Ih!C_Oa(FcsT=3lj&J=S=GMlWS*{dq^KZEMenBvIBdYp4+gQBRR3I-lq za{NEdxSJ4sX0>a=Bc;w&mJ8AE+A zH8|HKjKv#g$6s_DW@>3r)CYqbdrn8*YNC!2r7N#InH3> zr{!DGGq1pvG6*w{UP{_&n6j!LNWtP&`kb(E^#*!skdn%ybxkzsE?)*D6lsy7g;+%K z3PABIpG1N6V{o7kL(ud+RHkVn0|y~$lp?8(NP*CyWFP~)`LN3?CCpkOmnOp*%wN-- zwVNQw1n*mjfOk~PjwODDOY{=uiJH}!QmE%8kSYlacG5W2+!NFKc$%>-HXK4z8uZ+_r99A?*E-h#zNg_`K8m4AzqoT@rC?N(c z^ds(8)L7do+?bkJd#?+6akyJzzOLx0)OJdau^MO%Zpq?G z&p|4^Jjh$cdCa0UlSc7VXqay@TPEjPr}}brTNCa}^UxthLGXY8G>1+h8k7Pd$b+QV zX>c?MhyZ8W!Gy)@Xe?E#mdaE~1cDe6@3UxXL7;|9ud@9NGK~D4GohN|xhQ7X;@~Sv zf(}J!K)ou8Bhg|=35$8VtSW=b7b<;+XUB5f-fbx}(ZIGy`c!>WjYoDEr{(y1tlu55 zI@-{?K>*&gdUxEZv4%j_N;$~uRXxHoD2Rb-M3zfUn!HxWw@u#YiqvVfD zkf=tmOI!^Qz)b|gAk31M1)PlNwlYrTyA-giX2#3GmW*~ioc(SwYOJ)Usyb?`n;o|JgB=; zsoIh2C=}!5-s|@iEAy>1hE6kBU#AvJ>AIDhPlYFy^9tBtt}MkrMdA#qu!3$})R5P& z9Fe7{hq)SvB4Y$P00pv@5`65dfG_ zH-p}uRh!W32{)oGY>{LZf12=~lkj)~RYp#EZl*N`wL+#3&Oe9H=OI zP#71n7ReSta5FSGwArf6p&b%p#D#a5oG7DYqYy9+H};2Wb3ZL?apQJG(n(^?I>2t& z^uPcFX$#oEJo;NG&@ijSI!^Hb{rPpFlOG*8Gs+u^p)3rV9PuLTnSP(s;(s9;ldS|% zX%RsjAQc-KL`7f&=bZzEE633gMd+d6I;>G(1F6Zt_?z}SN_8K8)7F?+D)2aB$*=dz zp~I}c;q^@;anfrv<9+3f!pDM{l$9yPDW;O8BU|FluGWBN64v7gbXgo&JAUhjp^bqe zQEVWVkhS8GoW8+m?tL#140A~PVT=9yplN8U06QsFm`zyyPWcn86Div z#=IBr=Kba{1GP~4@z7vSOuz?2)lXd*`1fnSoPeT=&U?NYum+ELSV;*36UY4%pE5kj zfUAS&OqMJYWQa&Q!w_I3OA!oa1D4~!K~%j{RD?7J4MWlz-1qUnBkA@Nqsv@FJyH`? z8W%FO^x|jhb7B`UQmMH+BjafAG}YG${0}@TTc1lol-bj}eLVIEhck4VW~o)nQQ8hB zDM3`E_MK3vr9jg1o>xWRU7fQ8^o*)sveTt>#@#Qt&dufRMt)(5%3nqVBou!wK3v!b zX>ToqssBy#{UB%pxq&(Me+tiN{&N3&A^-`f(d|VjoZ7nTN)yOv!6Diq3X`n`6GuWY zoJ3?95eO=v=H8w#{2RXO+f*!Z5d+$}e%_&>MIX0umFpC7qYh2~`~DjqPktO2iUea( z$xA`cL$;robQ9Wutj~A&zKUWaqRn{mGnls}HunA}`bQt!B7NHY~S-mgW ze~SgFMXw%2qsmo2U{-~#S#)zq*Xh#q4@OBh^qXBUuCd+eOhp%4J*W!Lm^LJYxeaJK08aKf za0}^jwLczmyM0V{pr?mo@99L0?f>q$N2O%1hvkegjVbI`6GBJ#b>D`7o=5}$DF0yq? zEMBg!1J@mL%Jt8@4m8&z)F2YJN2sjrQyS4k1LIO%t)D&{*g91RvWx?spqN6*VgU*T zg4yHV5;QQu=D$~OKP(Go@rPdg6Ab4*|Brp~01jBshZmfKyA6PB5td**x3B;M8P*E( zi;|1`1N17EA*)7TB1zKKwEnIQgsMXr1b_jYmJ0JYUc$~gb_#mojg^<4wl|^CJs;H2 znY}i6MdKVjyziH4^~z>2IojDN5-X1QVu!nQ3<(!f7U}@XbniB0$JX}d?wri|f||?` z8v1yOMdX)(a+Nn8M5o_k^O*uco~cwuo#JZ2I3zI}Dw8ckCCPKlt9uG4C>xTUyHEUL zl7TnKa)i`77;$`lFG+1znEuO2LJxa1mnkm8FyZM(^YP4h$N$Z$^gy)Qlb5f%@yi3* z_bs1T*|G2g{j<}rd+<_u-VY2ti~zq2q=DAnq1L;f%t0vIm5yG5+g*xdZCd#P9l`as*uT5>(!Eqo8W}!Q zIMY;;J8x&+&CcvF)@yIqUp&<&+6 z^Q=bdpv)9fNASLW?MZ-uLH(;kp4(~9z#R}MFi3f`_GVVqpX1tBLO4J7w4QU1_h4xTUoZ6>u8DsW-WW0Y+=&couOxCEH&TA<}g%L9RUYCp@9^eP>V zc&R8PBCls&=tEa&?(LV$H@7(lj%cyc@%fu*3@C!8^3d@A%u=m-+FqI&=V?ql_SE05hCswO&h3=nkCuyo(7*ZA0p`XuCg;1H>@ zq8{+Rbc3To-3vXJ%z3;)z?y*Zc27))NtumU*gql>whpSb0~Twf4$^J64yKJwJv8BFhEFVoL&mQ|2l?-bp5wChb@fiRB

zGLJ%uD3B{x}n6qa;L7}YWdY6E=)RoNn$v~E0X}uj^ zqrVf6HB>ht6x%3;!WN;*8VqaKY^+}#Yxm(N(K^u7WOh*TAzafvT8xOu8&z4MGkUek zu#}!DWz!W^(w9J+OPjvfBTJ+dqoG2!Y?WOUB9KmDj{K(X=-9Xk9HU2jUdE=bEmjBS zAr~t^0p-npuk>QNHe89rpJ-99q9aW#PQ4gP1Y*p~75%85#wo^wIeWZIgOarxlz)ek z@=XIfmJ^FodzV$7>a`5ciUt^SfOHX6Rk+T<=_Q#AP>{K-%rLPVrsAID02e`o-E&Bl z&iP)H%F{IbF4T-a4af;B3t7LK8eijr+Fv7uy1VRU(2q{NEGwO7Ua<+aJkFz%01x#_XGIJqZH%TWaAg4mF z)wJ260CYXsbhVSc#*n6-H)xPlqa`IlvE-{p@S6ZKVeDi0xQlxhr| z#-qZRKvNjMdT!U7(y0j-Dz7xbRxLD?_NVhV!kr}WoE^0UCTu%O>*8~=W=3Xdln6G%NKM`Jpe>rhnK z(wm=AdEiX4nNXTyqt;B;Yq7YUoiUt6zf@xDA}&H3*q>$DFMtKU@Y04B_J#H^V~F3OZy?-Dxgn#hLHO#M)PszDo{ zf_fJnev>I=W{H;`qidH*m$a=)_kBK8GwKKeytpdS&wA@>^b&W&dNn!8xIPBF-s!nB z!yW-6ic?lqcBX!mVK4xjmB-wqmR3x&rI!gfH8FUNt##r_H9Ap`NEIr&L=YG^}Tv{%v0WeAAAOtX^J|F-hJ@@J5AsUoWsRSiLQej9Z02Nzd&kR)Btt3e*>R@7x zS7oq>;azJAT(l413;3mlHB8h$@phm>V1OL8l9OR$akB3W6Tq4<+M@e$Q7>h~5#X`r zYo?@=nx1S*nl5A2dDhdvM|Z2A8Re3D=3eJU!iU><_EnzFEr3w>*mmA3_WiQRE=uGIiy3BirAp9_8e|;Z;leVWYuo|UMOCrW39zSEAf9Wvm11* z1@$6ww&Y2l|1LUqG<2~yOidDsH6oKkO^t#`jENydm8`~T)#Xf_mfKyqqsgIBMy`=| zdMX^uyc`TzNol7^xk;1?CTbV<%gJ=Zotm6lSyZd8iKQJ4u{#*MR^DV4GmCnvcpQzZ zGLmLxQ9u#iE<@%#-ini+gEg_!$0b739IUG;zth8D7^wXJpO^+Sc zH6VEh`IYkCjy}U=xO5H%z5Hr#X5G8J&lBj>FN1U``&St*6Wopc&sF(s6U}++V&8Zy z^KsZcpRVFo%|OjVE)dcJ-(7L-9(7fQ*lweMSsl_F-jn#?d>kDCXF&>D;QWb|004x}k^5Hs# z>nT}T>Gr^ff_GoGXWD<)qq=4Yt$gX!r-OG^N3yeax6FSiz24Q7UAN=y4le;;Xo8ZW3Tc;EOU2}QumJwo1dzbu6vVMoRndTB zOHF`A-O*a#CGZDeBVVE2ly6v?T~o=;SV^9=w|#z#0@%hTHLAD20pEPRk7s48IykNT zudlZg4z2gfgfvoU%D?1H z%fz#Tf9x&U>u+3teVgF5<;bRO962DCX8$?LV^ronSA~T##bNEIq|!g*afbqP`^<|R zLxx1928H;sT;jwfB+&9|S*fXtmzDq4(s6Gti!DXkq_PM}VlTFmrPDdC`@BbQe*5Xh zD)aMu_+0k(QY$e~BKZdzMYI9VaR7IvGsLJCA)R~EEm_R1$g5Re+=mx(76IGqeb{T` zRpypH6j}zvTEhgF zX$Ue5l`PEEyz7TlLn1?2#?Vug7^NpUqzR)E7G|)Shw_LNiBQ}|0R-{*Y_vRWQfTsJp<&Hr zXQbd$3OO*-tm^Um?eN!HDh?J(J3$D=A)vxjcz1@yMdV{yaU{I}&;J4T%@1?*XM=F} z+?Mm)d04nRqx8|#)0mf&zYP9z&t-AS{I;PIPFx`Z6EU}e_9|s`{lcWTU1VDjJ zh(QPlM1%yVdjPT<_=pPbc&=9TcF)UY&e=#n1-8`BI`CrGwBjN9CRaE0T^GgQsb(tn zvR_g=Q`=DmQh60vD$!X&>W2)Kft!3l^;Na8#ao`hCwOaq_%S4pbE z^AnlwgLIo$i@h5I?hZMVPU~%Js8Fkxw)a_ChC)zDS4m^ou#cZ#n1zdqJQPiTq-yMO zE)VIsj_MubbL|Pa`#m}koSGXnik4FWcGW$%SvgZ;%*-|MyddqK>25c$n}v8`lqG7A7%PRk4PA3YW7*B@d06- zbcENjT0<0f-iB+Hhio_<#Y%YIZISed$(1e?K#wkkcl&ccX`!sj{I|pbD^fhUt9k!< zw$@Mum2vtduLEB%W8{zG1v)Y67~+Q%&&i^w8s9g2LA#9uQJa z8oKt$Z1SzxsGOy9ZJ~v=%PrIEEz897VZ|?NG60_egW=c9-_N#43tux#RwLxVZ~GJ? zelfca=>jr{uI~yyJMBw2IKqUk(We(Icd2oOpg39R?Nt&LcvUN!VZ5=u0wOb4 z<|YhN%cc&>&H67yW4C7c{%3a~@jXj(%RZnU*6_rvO?E}dknL4IFMCu(+%u$Yrk*sw z-EE_DWGeVE%Hy3yl>afJCo*LO$1D`5$_7GAZxqJ;A`$RG;ngoUV3TuOP2n|n zx{~)^#gA?HOfF6!7}JEd8#^EcCvt?ZU@s4!$@22f`nm%ZF8t%8*d$GbqL;R4t2}Um zr`B9Y<$VJibx__%>40a=e^wYmuZj~(bH;6Os>M$~Aqtb=xD06`2@t110LH+vdbj}w zKpwF0 zC=vjP0KHeFnO-8Q1QmD#Uc;L2(~mPg`QSxaW!zUxYZE9v=uOyE_Ga#OdOKYP!X=rt zLcIp`YZ)YFp{}A(>xUL&=1x@2oL_uEC4lQap`Uy?;}dAHz|m0%$?opB_`-NOdSaa{ zVMDT0jBt};*NQ}{v}Gj02yaq_W<=Fev-P=DyJWlp=Ouh^#=4&fwod*@CH#dSjadz} zJUZravq~6(1#I?SPc0q1m=#`xW*X65?|?N%Gae7h$XA~GHrYHJlJ62xhrMZ~N>Pz0 z5`d`AxQJ<}9%MBpkVPm>kYjyo){_kuL#gI-)@t1P?&K{#rk3ZakN_+a%P%54;GiG? z1AHb6K&`D9!Jk0=?QJ{<$90&wv*qPAU?pA(+0h7u#^4Utk=%34OcxLUb0G?onZOPw zAqh~RtN?Z}(hXb#fGfX{25mFe!@dnv~#nS21M`nwu<>%2?$zkt98F=hZ@lWZy#Ea56nlGI67 zO4ZetQ^?do5M?%qc3PVyQd<-XFrE*CX^OBLkh36ogXK{*OeUkhT*?0%i6gADSfr{@ke z`rtr?Zycym#x$kfJ8m*csTFiu zK{_Q4D1vUw7vc6IW38f_h^5bmyE&MuU_EAF1%p*8} zo|-u26Wo;DTgzsiHdL%}MN)VoCXT7*soaTBX0LV2UD%?!REz23JeEzBbnMj92wjE! z^H%Fl9QVALo_AMhjMIbkx3>%VQ_nR3Jw35n*H7|^yn`E903v!0ZfhV3fitd%=`{=h zLI?m7UkfCwBzsWDPS|IG0}4ZCN%I;9wbuoX8f+}hMbXXtAqtbJC>DVh0E8q|6bGOS zYk(A83QS=GaaIca*nllnqMhYr)}`ken$i7v_leh>{5P&?aDk8WTb{^znxIu*Z_e>q zf4~AMlR$)UQP$>1Q&3*SZNGoih_+3%pWg)69HDK4(oC#HY9R@HoBuPNlea$G;0Md=l z@jYoMGv2PKLNtySgxs8|u4G!Z%)k3|M#ZHOWi)H%o>e>@%i_6l7=@lHezW;ehr zxW2sNs7@o+g5rt@fK%u(>P@z2)QJC^`qeN%&rm$i*C7g%;iwWbLLSf)m2v>mF5&^V z*leA?x3c`Z>=)B+Fo_#lV4xXnwKd|`aSf5o!y4tA(`rVSu84lP;>ha=RX&uRQUDl0 z0L?~cXvR01NH5lSQ{oeHja)%z76dBued?>0E_z$ps{IMw+Lqcvw2t_h9ry)o<$OW8fQ^e^0XJwx?e1fHg%TxXyDHOJAS@2_n&c4IZtVs+fquUYBI*->Sl zJTvEE?sZ#gs{0J5-qJ-oD|;9v4BWfd8UvbJHHxETr+YLeNv6#?UnP^ao5DhAY!*?O z6gh@DQKC45_+hU39c?^(R1iZ()Z4gTy0~`4vy`hW*`8797`}F zY1PTTiOaPqOgo>GR4KAW&;8IV;ybV4YVJ#ycYc>ZjY14}rr!r43X`F*5P=qegh)UD z$6y0m)dJSRo~!W(!R}&Xl?Qz|G3l_~;;8det(VQSqf8pRzxoEn(d#B4GM{|A9hN#(qis5#ySoDN7gCY_&}9H)YalnHLs!M~OyoW_Jrlx>{UW>>h#)>^oL1mms z24>4Ymwi@n{bp>HD@zm7-D;y`uL`WZ0yyA{MlWr1>7&=eCoOsXj(dG|!G-JimjD2a z>pD;kf<3QU4WW_x=6T#erKuAG-Q0C{Y5bm5{~)nN&)wBfY_n1t$`mNb_ZeAPM4=^0 zy0TT@OHioGKop2uklC`dM4&G?;F0Wy>02!Ij}LE>yOE81tQ7)5Y2HVZR$2@g&e47b z1otx9FU)VitO`^bT9=Gf&SGYkcT|(UsU=h-J=L-Y7p}-Wj#0O^@?yXUlfahv+Vs(p zyXqooZ?1$Go|?sHE0;xy)XwTSU{vCF#HU)h9fzT~S1deUSccJf-Pt`?Bpb$8iAAFd zvt3myD< zJIn+$;sC<&+-djuevp*qStkmVYN=dugWokF2DAax%%RUqb)QL84G*2V=`Q2Zt!rj87M5YG|B_*z+LM>U#eHreXlBHUf zQr49?fOP5&c^Q40P8Ji=J)xaf$Z8OnhpJ^X2Vw19PB6|EHPP;wGLo`>ykt0%!7~Z1 zb&-vc9o1MP9|L}KOwzAsBiMd)5jaODKu@YZp@?KRd8EwgI-QSgxqt}5~wCs>O zUrt|DXO~S!%9%JLPvJII1jW)*zWHow%#D)$!#f?RcPVSQs|fa_`Y5g+M77$Kv^W6d z>DBtCZc|U$-)rYiW{bjFCKj(V&bx2N8eFZUX``v+d?gJNwlh6f&$@%L>3P0Y;le%; zuqFyB!DZ|v$lp}#x~4zYCR>E4iAJ#72J=7>Q}N_EKOqW}+N2br86gkA9G-wc(})0f zIZ5g1Jt)-tdO!?EdetyE|48gx1Iu#cr;uL_@4N1t+*HF)1Dz+0@~WPnMT&3LFC3%_ z03g9ABAn_)1itpyZs))wDrG28s`67tR}@@WB(hX=SI){>2oZy_?iPwGT|$Kx*zA3* zl&efF5h3kr56N{lAO7_3XIEnFZ@v;B-x3_znlaZXTjcBb`RO4PxW+t(MHt!wCPylj zq#10US#n2u$4gYR#*-*Jq^?`&R(XL>KF!xO$fHAWOP<4)(L$M)oho`vnWB4fz-cvy zQEw!~^2k#wtED*AlCA2*rGwN!XtLs&Om<@=_p9qbI=o)}LfDzhUK`}({>MgaR-tpa~W|Q9Z zF=Gl4xsFrV$kM}CjUB;fg@xAzdB;`wMNO3pT{fhdbIwWZ5voNuTo+73(5f0I2G+(U zUv4jE5p8(SW^ik zcsX;K>a{xQ>3sN2Q$ZkYYHGOjCG5ndEZ!L;VDDSgB-*8?IC?IXO53ukpFMU$NlIMj zPgf!(AuLzSy+lDGgX0^h`Il)fkp9NdgnxU>{{i2BAHtuO0rRbA?b2j4D88ZJ2O$cR z$Q=d?7J!6kH^beqAnM=@?HO;1p{@C5m8w1BE1Tiok;<%e@(yfeaOlgEM=3|ge_OYf zk;^<0{Q2|}!HfW;-BfS1e2|=_gWZ$WILlkh%C!y**P@Ne0vAcWY0NLqsl@DzE5XNqTU&j) zUBeXHUNTcu`e3(1cXxTS!3wTYC}l%`LO#_L647}1e`DmyLT?p>yju9@V#Kgyx9=ee zli;WffdQF?gh$W}rg8)eT+j@U?!Vc~rdliie5=+*0YG9Hz-8Sj&hesL9b&vWah>X8 z`g5PFs}yaD6VLv7@*z3d13&=I00}E4NUy1HDsLBDayeE7Ql8uQEZ6M0u&Mt9LCV(I zFp!XI;GLW8yeeH6f)H8MfZErOFV~;BvjIO32VE3dOd6-RxZ1#pZ>p~1g~u~UBpr{n z#<5UpdL^H?4fOncgGs>P@G{$3FpZZ{OXD&^_z$O_PW7HH zRdBq6fOite;Z^qERViZEG-w;R)(x{_g3X3h zY9Y%SajAY&#{Adl10{i$8E;$iMhkJ5mNtU50-@!ruiMWh-G&}tNfeg*bAKTUlY13R z2|$X7LPRM*9rg+=G~xjk(}>PBf`{?QYo~^TImL~;N;=H(bH7b~tM%WIN#kRNJafFU zTWeigyUls>u-%t*$|oXEFXbnNCD(~sa)Dy_aEVMk#+n%4 zEB7J0Pa>s6)HP_r0*B)G;O(}y(iDuY@h`oO_@=iRa+StfT;fU%N&bgE%GsOSnCO%3 zOtY8#6~$%SP^dI?>ZIU~*%epz;5YEHp6~Kx%_*{Iovk?mYm05Ns?LyVZ@j6E!2v!^ zMIjiNu3N{ZG~9B}W}B?V%0|I4FyIa`#wEO5u6xkP7RiKPu8QQENwY*CNo+is%`1)r zF%;3FD3ERyodAibd+FoWf-ygaaV}&_eA_*5j8qhlGBPi*LFa^FnA zDilkc@c~5$7rY|Py~g{j!B+Vcr&tnwQL_%%z8J4$=e<4WM!^>%a3X%qEu~`6Tw~+R z&gs?-~rGnWC85%0%8aD`wrWE^q=v`n4f#E zsZQ|j`_3=^_dDEh&?B+=(?#NTEFHiwDav*LE`ALmULG+j7(TnG{*ww+BgU%xbUF!w zHg?a>Pv>F@iK5C|7hYWJ;u+lVuK;Q=Vo?p7_ky?urp3?%(H^`o9=^j#!|X+xdUAgu ztKZ4_$K1dSCirmQSQl3W?<>({{2e5_pf4^Bg;qtpW*$eRq8^iIb!fJ0v2xBKMLymi zQyf1J)4f1`pBv7uj+Fct2+oDL3?L#-d)*%OlL)ol?h?u-p#;IfRhub=U=TDG_zh)j zAbtQH0+v7?ko5tMi=0-Xw--xO&ZY9idhmMiYB4<>wNK=bUblMId<_p4DFBSGW&jjJ z3EPK0iv9r5@17$h?j^y@03PIIAESYo*@4}Ji!dJ)m^}Nd1w(l)d8%hw@KCQGcO@(HNBbwrWoA4M!q3&>jOTn!)|nJwe^z0yAq|A z$G=Cl`nB8{@+XCaz>vFEsafJu--|oNv4^oz=Iw%TLF-M)CSk{ZCasDvNIKsrH2JiBM-N;N=TE%I&dw8Xy;_}5&^toBOde|O)K4(@Xzb%2=$O9O0`Ls;at@cJxK&Os4317v28_97OL zhOeO{$ZT7t+S?tmJx9hKy|=&m<%>x)%S?fu9yRd+kD6`M+omFMeGJME*nLb>9BS-! zbG$*jA7lV;jC^822_k|Y+R?&B(q{`A9Iij7v1JY{rYdm!jbgiFimpXf6Vp{QoK6S1 z`LFk$fciIeeG~TKIc=nd&Kk23ITrm*p0?Evj`a^=@>=kQZgnJHpS5R&0MbA$zxFy1 zj722cNyAar6m_+jz!_r+MAeDS*N`CcJONTzoC!{xn^q8|o5cDq#i_C;2jN6ctds%h zdLDW_kV+L4Z@9PPs!>#SuEI$-K0Cw}7SsqD zl`$%-129~X!c7ZJRyB8nw#uv6_c$TWp~8>4=Q*k~a#N*Wb`7?xTr?+3d4gg`jU^U^ zOxN&TMqow4n!=T2V-;mNTAxN-jt$h?f_r1tdo?gsD9;wbcp7?r2BR`ayQ#+@Y>1Uf zD5R(fud=Z=#m|GZ@G5e7noG=>c!3CgL2n@%lpv;vBBVr+AOZ5*E(9V}2oi_T>n2{h z!5T|C$2Oj97jj;tn1$RYJ)zD~QkGN86NY+@C_5|5SrHguUSvDog0?qG@LMiX3F=RA zrTi4_fk^0@Yi-~CtbxK?kpK~!H5{G%AGyuu(yEeO;T>%4csm^pB9}(jWo55sYz+uP zXs05^4RPts)~9~vV95%iqVx%mg~0nzTU!^Rn?$B=Pjgx`Ojt?S{w;SJEj-%YN^ezA z(8sX5){#|QYIe5!jNelvc3vqglrS2kad{p@!@_O0rA8R~l!s4zkL|M~Re01}R; zE@cv##Q|Dt_>7<-gzjD6L0B)7PN8l_fA#9LO0cce-?S;A@$Myi6 zdgdoMK&gMqUYb1NnLj`y2lY7^(osXAzycc|rRc?vd4>S#w`l%@k(q;-NUD$wJG`Dj zNufyTz2|FTl~fEat;qVyY6AlP)wMFA<4|%Cp;Bl7cr3gnEt(sD!<)kt?YJ8ySW@-yX@E_LB>ciwF`)(=7 z@2~a@biF^_TzWOX6pnkdJnXVWvFOTt*3TZ2&RLaPS2-F%pJby-_fS{58a`zrSt@6o zs#h3hCz#)V32!EQkk%Ez(M&vRT%q{#m>=b;g6))7=54)yv7`Gq7>9i9@*xV7le7+D zfQUdsA}NRlLlFoRKFUJD&=11r#*KZ(I0q(x$4`&GLsRorSzXq+=Mb^YhPA?+%auCf zwNw!lOi!4E8s}$2u+<5DM`2DeXlWg_;?c{Op}i~PQ2@ck(r>ku(0IEuqXZ*n2r|Iu z0#}4-O4!|Iq%z>lRS1=eshHdys!Xy}l_eyoU4v*zePGA>UptZ{u3VVA29WW36mQzg zvy4)FU4I7fQu9?%=!Lsb&5VT;cZp~vn!b_|Dod54pWER>r9;wg)fKwL1(_zHNZjquPCbDY}TuALawTTADJtWqdjIOFnbues$D93q-^XnMjAbzm@#L#8EJ{ z&|VW%(cgiyE^lP{)3Q*%c}>J23X_x=3c&;*MSwCh9()e=1&=U+&tT$$f7I9vC4|@4 zYWf~acxbih32&@tRe>A8U!RI`oMVX_`}W$cJ1sY8kXF4iZ(_@Wr}Ku2cJ0?fsXc(f z@D5_4f(NrE)%6;hYu$rM7Y-gv?lXUlE7AY^fZuFvp;cqP*{bBN$z5hevJop+)F8Qd z$B%9n|GMai!zPob(Aov&2=+XBDvSXZoKh0Xj8%oYv-QSVQ(Zw`6`R=iD?L2sQW@@& z`;CrunGsiFob(N{4EWT{kk{p#Bh@`rEjuSSH?{(Yi8GI?s?9ffx=7W9Ym#EE&0W!L zQ?+ITV6uI3$z`(Aq>IgI8kOCFf(Api0v8ikJ++jLHODhRlhH0Gyls6A1R~ag9rL_h zaT!x@y@jdg5H`eiVhHfgyazj2#f@O0J6HU9lKBn zVWWTwNY}#*Q>Ov>&#V;9o|KwYW`olfxHk*#VUIh`v^-QvKa^nq7U1dFYoibY6cR~Z zC~uRa%qRonXCz8SMCQ12eb~41Y!{x1DH4X;H5ss>LV)MBGqWxwQDW-Sqsar3IOsX6 zKKgy@gA)T@J{<-fagRxU^}J=QcAFpvQr7O5S*YV*^S3N9h{tUEZz-syC{U`nNvSIn z-(2-1(#k`zCGM|97tpOW;VlF-GfpJoHv(Cxtj2b>stftMKZ^Wrx zm=wWX6T_wj(C&wr8(QBg+rN>GHDg7!=aVpx92)GJ(vomwd2n3oAUk2qEPZ>pWCNDe zvDv09E>5W}vJ+vS3()MfSO9?ZH9>W&bp5XSxrkdug3^X^USZ{q00rKcMk2B*1VUTN zlJTL|83$w%;pmh0$zKcbuvVT+VFu{@Au5xSod^X*5d_FW5MT~_0?5D@)C8E@qR;tS^3<=zFq{6Wz8S6C?3n zc+c7MT-v*ku4P2o=*7O{6K*fw^2{@&+z23QogrR}YNnNNG|;rRt3;}J8r=kp!ntch zF;H4P)@3z81Om0;HE>dgMmpstuP~mX>^KalO_|N#HKdz~-A?JE8V9uSyb5Yd1=QpRbVx1fP z%IHoZ3v+W(MgSvC)9)64dBh07l$tnI6N)fuoiH$hGAyATx=$$TXXw=SY)HIDbAyAB zix#F_R8YPQqcwE5`)kEQ=-w978(O#KJ_7=QN)`z|=N?$x?`()0ph;)65A{)jAk;0w+6nxjDDg} zs50G=RjYI3IIficv8gCla}fmcReVG>c;nrv)R2=>Dot|ix=01Kkf(T#oKC4JOg1#z zqCQeA2h+_>Vdyf-K@zg(yHky-dfcJ}oNRs6fC+EYjF^G>?9-WQsjGTs7fhpAtsojk$!b!2*Z*EP!>(a$K#N^4+LKtzPW z8vy$e*3aJT(~?5-tGfxr`_${z)Zw`Ja6a*lun=ewVwo{5v()xhLDMCDOAZ(V(S0~c z6~?5aK}=J+wmdkHig>`B>HPF^b7_k<8Glj2inpWQFe)|2=th z&~e`eS{vz?@?Y;saJM|Zn z4L8_enz{=vB6tW@QIt#vI+tIzVROB++xBfoxA7mB#S9h%dYQ(2QdLRN>toT}Ed8(e#NHEl?u zou(Q(7R4a#Bn13x__Jv;GT4IR)`0aot+fq?R!qit)(dszoGNGHrG>XHCLLa1*XuUhb->l5$W02tWo_ z&Jqw1)Idi{Kz;$Efdph2AXQK(!X}}q6`&3|&Qbs$f1BrAw`*1UMz{xfiGfXP0VEiV zp@uUAE3Q^DV<-Rzx7#0@a{cazBFiHdswgL`uXhHKSI|Z z>@Xaj+p9mw!9(C)pPp=(YK~dAV_`DrI96J1VnGQDjtPuyxQoRGb(HYCw?f%_LjC^H zMsXgj_qwlk>4)57Aa&QX~*gXIw8oh@iM|l|EBDtDAnr5oN2j68&y2GR_K$yu17P4YfrewyXz- zuV{bZx@besxfI7TMd;M7Rcu5?U)jrvBi^+B1%9h@nB$p7GRdCb!y?1THqp? zYL>+f^Z&0$W*;2FRlZ!f`}R@eWpwn&XzAJSn4yYsxda3PATlWg14}KGIMaycDPWiI zd9W#j0f8^zrywH78lGr8B%uBYe-9OD7mB_UD+eK5ZA@2&YTBr#(m1R{%}fN|BqnFJ zynEkDDfoN#ET`c2zDKPvsBXIZsKZo!hVO;nPqw^i|qmOtq z$Mk%0_ZF;sJNSkXjX0GK6OaHwh}wLYOwH)b*J6fD zW&WAHI%R?v8&!EYKW4}Q>nz(h9%J9w0I+g%Mg!yc^fj8WTy3BGg-6W$&pz+jT<+FIZX$b?i_&dM91TY#CBO*Xsq)L{AG%48FvK>8R~sFdGb**KP`h5N3% zo&J0nS(1Q1*{k-3e++$y5-ef+{p}u44?IXk3(9WvD!+3%}ksU za&b1&7^6CYZ%C?^l4l304 z)!Ok?-4+~8b+;83H&s~CdzpBaGB;C*u&-zC!4@vI$4!@O?95J#az0aS&_=A`bmtYL%qI5yx6fd`4K79H>9&?8aK^a1sbAsUo&J%psFF%Tdq0q8MRaZ)0xO1uD+mXsNw zYDHlrmQMKUjb)hEYcBLMy%|S-Dk=eU@M+pYVMG;BFKtXa7{aSHFt+0Scgj&1M;Fi4 zUYow568i3Aq~^QIj0ISE7MJobs%zD19wfyR%gaMhKwXFfXZ$T?^7iul_t0Z)Q<$r@ ztL>4Y?oEv)8pJSA3}!QZLq}Z^&1OMyxJ!&}6KCz@78s@Lbk=J1UkuvF+aI*3u)vnt zg|?vZtclwVQsbwOeiVv)>OJzgY-Y|%j%rcIj+S9kFAQEW#zlfQ^;vtOt6PSdYkh5} z#MNk@g&JDjrcn;8E(Tp$(5fpgH5Rr<;PhDHznQx~e2;B+zV6z|Lj|hUU@2##8|XKl zq;N6_5_4h_d@lyq#il@+@DWF>HJ$IWy#Re<2O%1iDnQFoV4%PiK=c_(NtRXA5`c7Q zK%AX)bOUPhS_@j9gzgipx298P?xCc@dm~2aFU6sR2L(O>i)v#ont@@_fJ0S9BW7IFbM#Pg9Rdwy5_$AuS$zyJWOdNzpVt|N3j zAsUn*)}X;c000?I@(X22B^IEZeb{`G^L;Jem|cSFZ}LZ%!e43s3;;yuWQI8pjh@(z zG5Gm!bax&|!B~3W_-bBN)tO>Q%xWBGbET!S*X*CZ()Yb5$HGy-ttU;2)`+f%#8+>X zYJ@$Njl*7^j$@Q|9ScX23q7xCE1+Z}f?!p6$c%=CBNMQ&boISYx#L#7;_nNjN%+Or zC-7NHd`YP^pxeSy&(T}*pj#<>PlN2ZTdkCy(|N7*_w;wYLHwt2E6w3-3+o~ zTg@CRc?xR7c+D#Po(DQy^;)uZtC5dAt4_UTIIBBZ8_AY?_Y{)9l`jS3t5vi>;`A6i zMKyT9{o1T9Vo@Qdx z*jN)(MG_~TRmUae)y3q69C@*=_f9Ho@_vhn&g$M{W9C&3wXNJJe^Sz#u~@Tyzla0& z*DE$CD1u}>>*Au7BRXYES8=ALW-r}KE?*68+HcrkGc1l)wW-kzQYDz;Xnkw!S{aKy zI=qKI+nUJl}d zjXkXKZLjU4S%*^vY_9;73Zjr=00#B~*^V#u&N)+`a#9cj8M9v1ot^w<>KehXt!s(u z1Q61~rTON5AsUms1r`ZWP{=GQEDTB|0QX`owOJq*$;1#40dd8MSJo3?1JbxzHK#f+ z6W#Y;Z043dENe=)F)E69u6EmVd4@J=_@UUTKqf6#AY=p(F?wdz@NCeO;__b@8e#lL zJbKaoOLfi;|;dR$^JX57;K*`m8YXtqibDM z$Qi8Y=FPk`t)+6fI+-Hhi0U9AWA8Yfkn8Y3td_Wu94OpM^7R`oxkCz#4OBQS-p29F zX0r@Q^rc5xXt@$<2Z5r3;JMS6KQzDx^3CFi0q@2D=}$&5g#c47vsGDCJD@hUo(NfN zoIwEq7F+u5?scdc)4JWrZ$ZE7s@`C1;ZUlAk9HK%m6mCNa?&JaC0Xa;wkrSK=aO|b zV5v7uO>&}~4v$r)3Z7ooS2GK3w%=|e+;AP{_Fv=Lx-;|)O=Xf%7fwwUz}YNDE1mrX z3db~~csBn?Kf<~69}s-M#)!c(#YCfLOzI`eo%Cn@e;u!oJRusBn;b}j6sZVoC<_S$ zCKU_--oedrX4KTJX<)||EtN=tV%1p1y!s%`T)-OhZi0}2ok_!V)FLkhcYHn>RDE-Z zKull+JEG}2BwJ`OT&Zi`SzTZ=V=+knMhAC#aX>&b3;z9lWN-vYBq+$LoOeI9()T<~ zQpIQI90kM)@U7)WM<52TwOIroGrjlQMylAqnhFX`6n3{y6riYmsaHzaw_Q`C=LEED z^Pd>o^S*x7v}f=gER?2t8G>RWIx=pnGTqXdY_N>HaJN*j#G^*<6#iZTcz2h*Y&=qX z>sG+twO^koHj*n8zN>IL#IfVCHnLIaGwN4q>SM0ca}^>71zIs>NM>+J8rm8PMhUM# z6Clw@GD>2W0kl`m_ReyZzj7m2sLNO&(O7}liDkj2?Hl*vbC|Eljg~2L? zU;C7rw<>Dfq-y>z=_))hjsL504Z(hXuqdDIJ4^eVi>Tg}6X+Y>QA9&j8+@$)!4RP+ z=TIZjZnrbfhLjOQ zqp$V=0ZFDK*hG|~8>dGmNRhx;usUntY@|ibUbeX&EkIb!1Z%jlJ{0h~i?`aK%|#0l z0s>R*6|set5x%KuJle2)cQH$Z+x|1on}@mkK`+Kxdq1`2>h`i5>rmbVCm&ru4b0&_ zn<6h3@Q9Yh+^bM^%gpJc9pYGDHS~ex?s80)1u~2kB}R_9>V1}u-Ib&-S}cu)G-frD zG(0q!NxJp~y6!XQaZ{oc9B44`T`sg`X1&t(y+HXL9763q8v9ttkU1Cu(Bw8#&O>wS zDYKs`rAF6+TC>pORBEpHrg^xNO#>{Tv~bQztEOo{w_OQ$qP}>FZ$y2TygQ5Uihoa$GR@#7JPht+*pl=DN z1fp33U*px#q~;gfKYuAD5o{zF5zu|XeWq*eJ)}LSAOMoZtkfV$noz{l6^4S<_jX>D zs8i!;0QTEl&{-Zyf+9}&F1zIImRdVy3T@yOn{P@4NsF7(u4-Kb->Nbg39Ok%^1UA> z3@J{o$Jpgryx&l^UGX4_DFW#SoJ*| z>B9Q33Fiwudh|YPZ(oIPj|{DKBsHlCLrYV) zv1vITG1d}-o(pHCq?%TdBrzqf760*K(MEUBEvY{~4@sXq`{9jff4cJaa>=hRdqbw} z01_swuM^A1zATORR{LFx)tZopt6TRnO65&kE~5ltL__op8L@ND0HH-Zp;lz>7ML4h zLd98@-#YQT&TIv!siGz8ikKJja3VOl$cRWhY@jUDPzB`fL`Q<1H+LT%o2BNK`9lS7xe#Z)`}8MW z`)r+bD@q8!r7}i*%KVx;pPUa*ihiBkuG;o)Pj3Vm6Pm+rx_A_*OX!!(_u}hkTpuh^ zaxB&kk#9wk8a0OcV_`ytW?k)V_S&ghQjuCzkyhyd=eYALeRJafMeo)gv6c4Oov%@n z6I9(b;NCgq5>t-F$}P`U5>s*Z_MDcAOw*O=I@{@MrO|~}Ch;wEVJZdGPv}sU8m2Y8 z0&%5V4mE<+BIz)T57A#YfNshLc}Hm1V6_1mZ?-E? zY`)8DD{R8PEd@z&jCu|ja<4|~fCoK;XonLeN&3GZCqM-&CMrY?ERvoj?w-a>ST!TK zl`ZwN?W;f;whdUCm8&B4Xj;EjB$`XT;&i)Hb6k_92bRNA>MDdb+)b}d)5m(u zb5hhS(P5nN7eo|EJwP?YU|~$H!oBp_P7^Y^ORDRlJ1Rgl00ag;RQ#`JquuLlCq4ccR7xt;}6y$3X_Wz$_WsF#RMS;2tFGoX&p>SL1SnSJQ?#I!RF?G&`B`9g?OT%BoaCfNsVc`awpw6~brKLBi9Xki0#j8) zUiB+nASx0=c|z+t3v?t3Z<=h=+f!tjUt&!^i_Skjq5F2}%fCX$A{is$S0=Qrn{GMJ zXJzPf-^&!y+a+`Es@LgK>MnO-Ef;A^g7+eVDky}hszkEDo-XYb2{RMyn&7j3+~T*V zzm1fXaq`x;w!b4^;akk$q&l>9b*MBS*sSJRHez^`(@Gw0*jNSXKRR4@Uu2r0ta{#b48fu6qU#+k8qP%t!rRE}!eN`5;W%5KZPx^iPlg`AnA*1XtRe-J+TEt-7Z*g$E}n+~_Nq3Ay4dXL5-3X|ZZ505~_QW z)@1+<)*MR^1x9y7PN)C`#6fM_?%L}+73g#dfjJ-JNsGZg;=d7Z4ej4v%0OdCJDE{r z{UHjI>5+yDG?7fGSMCnaa9A81KpKCeGSe{Yzn9|y5WGPhYLRP9Dr+uPEmpGz>Tjo0 zJI(C8VI8%01Ke@Jor0`BRSf_Ux^y=eO&Lb1T`(zmJ!5dJ#P`aZVuUHIlz29D z6`iEmvkKdu%atr}zazQZ8wwO6g~dp3mgj`Zn%PkoNh4J1z}ZS!Z*gj?C&fB*#e2a^ zck@Ln;JlNj=Ge|NM-F;Sve{@$xLU@`Mpv3wbYTed$t&kZ3>eVFQsFyOc2FqtyQ~Xa zoUIEY*i%WqSgdh6)aa=TE2Avdw@p`1siy@HkOGW|qqeGV19XX`cfl!Vn;{9%XtZc2 z6~L!XuL+fgQ;Bvm67XnT)NY1K$u7rQ9fH8K%YDsB7PyO&sgv1k2=kkyyeVw`a8MuSdi9t6m0K!gwN@|_x6~*5NyJU)BcQ(_nVQQ zqLMy{+X6X0?NxSh<-R)5{~-#K=&TN70gDKz6W}37xE70WSPh}_()-`yA7sWZ*u3F9 zB4Ur&v>TP%!Qm#=?aP+$1*9}lpT*-)QdE<=uv5m?7 zxzH8`0tT%K6Qydds4Qj~DgFv*CmQGj-;)HFR%VDcUUt$El)(5|QtC9t`x<3AX&Ebx zw&63RPK|C3_v=A4Q?hb!xB!H!wP{oCLER$PW62UvXk8AViFkoJOO8#UMEi-bNE%O!Gae-Ep2T%br`a^uMn^f+9Do#5UOD?l6*%MfGp7f&Dm zM)l;kPEtvprRlJKAqtQG|M~y^>?jA2bVP9o3`!LYgx0}r0J(~KpSCRG)RvK?;LA$% zgD5b}m0j`AR%Hi1EH@T>!OWE8hX?QAk{p5Kk~1PNTu|JeatJ}v3c+GWcB;&37kB<|z5s1#q2P zX>I31oOSLl@yD@ftEQmevg5bq(LGnimp&5TI#5*0&mDzTHQk?9`aio$o%APc5K$D# zKUgjf6|FpFN_=yYZ5a`-C3>dGP0b9bl*wlEQdv<1+bRX3Fc~T4G+Ra%c7fhXof^S3 zP)K^A2(^=uyRB-iZlk{<3%J%5Own2BNsdAhEia0V7Q+%54n%=IL?${gJkt$i&kfk; zzi99;*9r3;o6w1r(Rf3QNBFcZ)|lT3X_8rhz$^cg&;90 zDYJagBYwaV+b!B8)k!`;pBqUv5wxk``oTzE{kPS=9Iw4qx?Abcgfw4vSXIkCbF*1T zz3o5)MQj>VkwHQ-IQp@>fE+C_MpPA&C0tO?%HAfj=#?ZYLIS}<1M_z5yd1MIYws?X zLHFJpNxQ!DJY7KerEV%3i!T-Wihn71mg)9KCOV!3>io&Ep&WxN+OpG1x3kms8T zYYQ%G&juPL_MN}UP5#T;xJ%Q2f$iuQ>wIzLG3(Oq_h{<*RbJ_twGjg7>P=M961F|A z1^|cv3F0D5Ik7P|dua&4pJ%%O+!eZWv;qMt<<<3SgJSc)Pi?_w z-Lo&%^nFinvU-;mp5?MhiZxi*jtfQ;qYatFQ8hMB zSU5etS3JO`(6^UdxY;}u$N z)P_KDOTZYZO-QX9mwSQjLR5-2-~j8-j+lf9ogaAyEEyWkC ztcn^N5$6Gwb8()fi_&wg2x_Rl>YSbG01%|c0Dn+BH>r$ok!k9!G_PBKkJqN?P#B3U z*3A_ zoU=XL)WcMC!jbjUfJavgJyLGY%NIJ9$@AxivzWBihEW;M5t1aUdX;l39PpS`H%n!Z zl(>}@Uwps;Fs@M#C|_dW3Kb~n1W{3@NMKM+#xXogMpQeRXj+BnWbnGVr5f*R?knrz zyp8P4^HK(C>%$@#c`N~#_8>FO)xnq_JY*)x?dmB1e&tgI;x z&iW}6H?l2=@HxJC#~%-w8zc{@UFek-6ib)>SGn=XY~29R!h9T~oIidb8^8d+1N4NEw?i9hd^?nViDR}|d&@3Z=!4VyH5JD8k$ zq#6u1%g5Vk)cAT>L6zlsUOl{=pBL!=2cd`szx4mV=J>n%PuVALx9<04vNe{TT=t?6 z2RX8wW+Fh+j!c2I9D=J9QnSTf)Q-935hJI7M^98l1L$%4XD;P7Ev7c}AFT9u%k=12 zE@_t?xGE=t2HONaG~gJfnt2kiDv^=Lvts0l7bs)N8hK(aDFxn`NRr}D>^24rv)6fui`-~9}yt_4$W{ArTBZ3@985`JcZCD63j>?BvU zQA#eCCeq%jU5rd(VkUI**>N8Ss^Gs%(U^vv0-We~d$v7e-;psABwCw0j;*n|+iJZ*t&{yUjM$kw5OwQ)f9CMZ9 z#ILJUwmDI3y`(^LQZ2WJ4#6Y91sg?(EU%n(u3h~x{>!hS(B>uSD-#on2LmBkMaB)Y~V(6 z8AfSf%Wlaw=9KICE3uBj{r4cpVEgSnK)#b8jXQfV?e1!{N|K59NAxv#Ov%N^l z%XI|2tfUCK%z%Nl)XO*TClXBH&QW{=#!0JvFaWZ7J5lCF5Mil~d zXUWCqGGh<4&*N~^k@9%_Tjf44RX$^upqlfJlXKiP3hYp;6905#lwsVZ3)-Ky?Y%ow z7KmX#yRv?3Tj4PnlP4>=#@V7sp@y8$;<#K>gl4v!;eKPz>F8>;`1#o@pZ~l?>cYS- zQyNgjouI0#KB9miw7%?%19#SsG0_7`GB{K7Zx4QY13lvrtn8`&t3BCk`WIoGsqwT@7rP;VTfD@sHR2X@+;n9>8EoRGyl&l`&!hR;gW|-nftVH+VXQoH;O4vi*CFMJR+2p2!JYN4JptM(I8^?ADugG3oc`#wiHl-ofHtt zPtci1$6V|+%Aar6ZnzvRNlb^{mQTx7op>jOmyOF}5cfRUv z(L+ryKdPHl#Ypy^v&i;_v9IwJ=~rmqDfN&l&Y;8mt2XDI}j+;7Ky?fu#agsREq4 z5qB||?mw${uXYPSO{E?)xr>X{JbpmLa4H#$6f{m#+Y27m@nS=*^zmNj@d+SZjJA+w9s zdn2<^zCVYJk5<8iaO=e#PrKDBTPC4UzLV>ay;?xEd?8%ZLbZy7OK42Y*G%u!sAiDL zP?kh0g01%QHL zlGKQ5Y-iUeP3#`uDnw}Uix_3;=Oh3ih5GeiF~Vn&g$PL;sm-V;1{*^i55<##lkPB;mT89+-RjG1cUkZMyt$s#M)3YE2tj_2`prGbyn7oNZaMTmbv4 zq-Z(W+M+R05c?L_AQ8M*m}QmvHJLkhHN9fL4W~g7Xsq%ua4O~!#m;A%j`M=Bi!7%r zr~vT`$9@;E0?|lhjM;CHUzNUzR8QAf~8z-q~(_2`3Qr*}FFQ);Q z$u`UEGGJQIuFBs>6*8%D1E}?k(!RlFtOEOm24%oHh0q}biPwuy%i?r;tjHQ5lZ#0h zP^_NlD?5f4}8x>u{JquK~B$+gSU+UuM#Gv!P*!__$^Z zT$B`9Ju@8s$5>hjA%V#d%3(-i5JI-#jmUWHnF-2SGT{wI?1u`_S(1sJq~XY|j6p0R zTM$B|O5vm-(IG8l-!zbg$6=GJLW+IZA5tM6aSBw(N`yhguHQwxfgs=_Cf3@@w8O%| z0J=e{XP$=Rt0Mq}TB1q5O9vvSfJX}QGm1tFWmy>xc{P&EX%P^eX3Md@!b+Z4lOamN z>z@RyLG5>Z)X0Mwxz z7ol3NmnSGD@wrT+3@gp;)uS>6xOP1bC94>ihciXSqK%b;obE=~4^`;)56!Q)vM z=1~R6=7WBYN`218wr)_@g`|!+DyRfug#LxG2(# z4Ta;Xb!>WwYGjX-HZ&t3sSv=u)&j6qMm;jpq?8Cau?c6SGf13GDEJ?Ev2qZ>zX0RRe^oyMw^3=?R|fXl6`@v~*J_N}bKnXxI)@ zRt8k(TGJ>4Ng^;QzfU(D6#yYTvQ?s zt{ZtqnPFAIP)APVayjV`nk=f$XJ_)A1>AI@h*68XyE(Kd8-NJQbCw2%qRL*X#{qGC zrsAba;&3B|Tv|Wl_i?4G9=OB+ZU#4H&y`nW6=<@_Cqrc(D@_S09>8w&nJ`otG&%;()qR ztH$WQYWoV!jE*G4+jjv&w_~KEnD|dNnw}>)jRYWeFl?VnzY>-lwe zBT4OBC8|gBKf}OWWdEH#e~I9IhXtiC7&`Pha@86#m1#(+C6BCx8q+38I3ST2pg}z% zgwG0)LKsyNx_#(U+doPjjZ4sFYqGvS3;ANxh`whURK*%V>s*2Qw}}|j9BrIpeW$YQ z3TWL{;h2+dl?C%&qoGvp;J1V86FCA*BO3_TW1q8k5ruR)Yap=_D8#jYa_|fChNxO*OQ-UGF%p z3uLPRlV@G7hmQxK-?zaqL(InUtEA0bg#F0*IExConxrGK;&x*prFt$B==nk+5+=$x z)_(G1gXOOe&cg^6EvK~()#Nh^fQ$m*@lKjBaB!fa^<1`JdvDcnaGxXJKcDpL-2J%* znLrEf@on{v1C&1OIrjxs5OhA5j?g^(17V4@Kc^|$xP%J{vj%p)EyaPq_Ci7WLEV>23sdRq;=i2;x{z7pU(*wWS0*vQPA2_^t6RVr)M zSlc{iVrc7@fZTo8s~y9hucw5c_xnqSLc_f>=>hnf?0U$dT--}Rz3Qw02%jNL%|0SNg2w9*E6DP|GeYv?CDeaPb*uGxN@Y z*JZrn6#|UK$XQLgemH<(XcNT|>?~{=+;Z;_4H2l4Fr>$b{uZ=1SHM z*nESm5SDsp=2j%+{kecQ{@;NspAlnk(HL&LOODOdI|0)=g0a}rvN@A4n>DX!=ix%gA`?eLX?PH z=L43z*X~XkgSy8{x7HSq)d5`%wZ9=;*+E*485y%y%@}HHT85^)QneAq2PCVw$2WsX zRW~-PyGjs5b#?3J5ZFtI`>WXA5o$H>lLXw^l*M1l%`DoDrsre}`>tsBc`5Dh<#~~Y z-lgiyteun>9V+HD@Hkj5E1*S~Q&f~(06s-cAxR^~ZQA21Y^wVOHE{5ndm01+i2)*u zU~kgl51T$0%#y^cazLl<4C;@WtZ5mCk@odc0?Zb{iN$M?JSc{5imJ-fTExs=j&odO zMt6I_We#>VM)DD(!>e6D?6w=8^A8@aV?V2Kk%O??FTq^BpWntS=?oWkeIpz-*c%o7TC+K_2T z1(dlHY{PqW;YWntJ9rP_$dF;^dLDpAGkNSdo8sE zo=Ra!N>e)U#xJy7mN3aFaPC>48R+;`SWE&W`Sq;(wp`Z3?u$4dfBK)`;FJv#SPFGB z2?|HrvFM#M$4ZkreX7I>D1{`E5{*YEBe8BD-1?QK37j0svnPhhC~_uX5j0sa9Jzr7 zeI=AMmWNGko*E$WPw=M77mfliF!ZzMMM)AGLu-1B9SajF{s%qc-?ea$jgVran00uF z*#HOoZw zu2juX%-gWN{KqWc0n(%2-Vk7FVDm9FnwDXl1rY_74e4QOrjpbX0;&!vo?OcXELOJ= zO_IWhr|QlJ#?Y$M#^oeTRYF_R`|~<=qbIjt$;+f8x3O>R?570nyZ2iwfFHR~-R%COo>u(dWSWS5h6 zv@zZuoiAGK>9uZ0arYilrI1oazAj z#~~V&I*gQJVVLRAMi_3O3^$AdizGs?2U-f)`pA&s0l?5G@S7ZBLhZEM&DX?<$)#Lh z5rdJgK-*2d`=j4=AiU^n#Pwe%z{YzH8x`h5K5?rCj6)y?07LC|M8awac(SGvTT-}C z-%_nKX)}DLn=P|->b!1K8L*r$CzxZ?HQ;SI7lHCVoc&x~&lcu8EBGtjH$6{X#^$&* z^_PbAMc6Ewk(|lLturMI*)%EanYfi6B)OFLgKwaLok{i3F<5Knc8isF6kKtDsBAVF z<@`+Q66bXmu&WtE%0=qUzKFQ^)k>lfBQ)$?TFZxnGTYYgnwvXYNb_Y!qtppeOCdyKhIy(y#Z+ zs_a0k4^j(s9Q+{~ln}ax!m_}qb{aGZghD_7r9*s^PHwL)dTu~=rjr=N03fBTui-ac zD}=M8MutF%v$(|iM9-Z9ivUL4kz9zC&Zxqim{$65Cg9R6^>W1Bl$~sLSvfrf55-Lplv2)YMrrrcQ(}Z z(-%fJ+{^CKzZi2IaW+G*NA{l&QD9(Z05pzhpbuR&U*QJ^WEP~AJ;)^P zlM|o_X2+NA%H^aVAsUmz6pRC6(O6Vl3T7_N68nbMyEK3)E%10`_TccJeJ(Lj4u*U`MNu*^%efh*iwO3wT&G9?HyTyf)UH?HAa!<*N|!G!v11A z%Umk)zI?8ngvCK+Pz6zeL)jv~Kez*vs5AeM@$t`{qyRq5*5WKc29S7rxcd5jJA3|L zZZZFNrXk%S8k3781dw8)f`%Qa^w-VnR;6BXqgpSPm;*?^$}KS&P!21Q>k8kO8u}@( zn!^qAR)U}ks^r{gD=zx$Wr@K-f8y<5I{4Gs`qIw0P*YYNu`$|NH2_bX^fc>%qqsZY z;KsnsN0z&m>mWJIlJGfiR1ATsYliYqwYxB6N`M44!6&MEH6aAn+iCKf)3L4W5-2 z8)pY^wlUH~QEpio-ED>xEWEsy)bk1uUryG%xg`H4T*UwD_SxKDV>_Pks-ecgqbj(M z6tY%u9*MvgW$|X{nRBh{b|Nr)Lb}o1m`Q=HtwK{nYB_cdRXc?gDgt_Li2ipE zAqtb4C<-G1ij2rmrfV2-P%O07iUF&)8<^rwj)u@R_M7%`8;#C%QeQcgu+1C8Mehcs zW>RsTy5~|kwkrtyI`frFLw4iEVmYhpA#k9YDo!9?vZl1dm|eluF$uktMv(KX^<2%a zKEz!)TlpKfCV+-yCXW+t?l#8p7G*o_LS!XWsVdS`*H)mF!;4eYrpSu-kJZBdhQYkBUHiDVtwz3x3!7HE~`)G}Q|0LxDd^BN}6DPc{H z`h^T^nEBi;#go-zvTdUkU2BqTR!%bQeHZK71DbzitW2bY<7V(F1;Y7mamx6g&)iOK&B0&+ zWEn^mVFE4n$Zw;9J(c^x%!>>(CFHW-r5wjD3h`#@s9&NtBfAzi;6kzP?baGodz*DruIksBsHhhuOBV~urd$#!n-SJl*foW;eEMYCdaQICxl~rL}g%)J@ntGmx5UEIVZiM!qlAn^~Jj1=`6>)5!dh zJrA(zXsiaF`of$8B@Y3b+KHZGlKc|*oawbBw*)2}`TZ|KELr6O%qo=mDy*fz1D803 z&1o3cD+<#%-6;mc0`m@0HCbyT`!!abS{pHZo#xGl;yzq!xuJu zn+no`i=o$+Ot%RF}1Tj5ud zY+|FGC6pZNc|0zWXpLKvx%l60|K#Kg+4th2`0XKp31x|JWVft>*=nE zHoXm7(?jdN`@)RTpJgLBf_JX6o(0aP<$B>w3vx$GtiZR~zPhPhv*D9dMH~}(+LzBs zcuTM>P~H!!nXmv0El$;>Vf zpOhes$b1QQjSZw}ITW%P^wR55%9$lUGO%OzR-Ib#X2TV_Qn^=broWG#DT3eyOIq+n z#C2j$S+{su8Iu3L|Fj1@<6;ML!k|9g9)^2pP;s@lP)_)ku4=O{80N?-(6TS9RSLUg z#*m4ND7tTo5=$MESs=CMqHI>y z&s}DAwdoeB(--bLT0?j)!q8Ad*CrKE1reH3QynM2BzkIxn5oFDWCB?$_nP%wlfu_c z9g{8ksLNG!$Z(-8J1`c$YGPOJ>oGWn)^g2FQ{8M^)pYgcR$2(_qJD3ldpgZ4NhY>^ zb=RkE7fY0IMdo33(v%n!5M4V(SlsQ;w!x8ud8o@#&23Y!W~I(#gl95v5D=(pAcLe_ zAwcVg8rwRgDq<*Qr6ASXt0-FlkA{8k*^~?kt@D}k2=+wp#32fk>8KWg6cB_!A|eU+ zq9MVX#dC0=mP@^{l?@d*; zKP|buqx~xo0&s%WL>iMZw;IQ6p7=Et@{F~1L>Q@+z$K2codRhtNWiWIVf77saPNmou) z*%n_z88VpDUgiK~nK5ZDiO;PAmg!djGORSCF6V3sanFU+OQutrO9`ZDtSg@SZ72hw zpIi8FzTW@@=SpO{E_Bz4t?NzZ-EEZv4JfQnHOK~we368S-1fPRko!hQ&S~Ie-#a=e z0Dd6~lcA^al8Gx%2dj&el(qyX;_^TO+RVoV>|3X0#BW z8bWwY#n%3ji{~!Xx(3}fjen$GO`jkD0}5zbIXv2CV4e`r#$Xwn)u3APu~2Qd@1Q>b zw`S{b6SU&!dLeYNcMD7vxDdCk;jw!Xp$QSjkQ>*MrtgTQo3)_+$-7{igI#?OUXW^< zz?4~PvnK3p>aRgsmj0rQig_3rY~;ne=1H*O#rm#Usj_7isz;0Ki=FMMwg3&+rn@4m z?ygs}9Ba6k#RD1cFw7?zpM`Oiwb^kA0G( znOsXlEp-*_5!R4YJwf333$4Z_=ryM0SE5(jj&Ef5Qh{kvNn{c{M~Q|~T&itM-Bb&^ zUyS(41Gz%~7v{lzqlkcl84+2bz+41S?iVl=P*2!y2H5q-w=1r9VL00$uoli?^5Dj|sw$J_^u7%U@;fB=VY_m+@6J>I%ewsg^8 zBATf!3dm7wuMP!Ul%+M9ugtmIm!z000EbBIZces4x5dIEJo6+J0dC&OYD$l9l&a4p zrs0-KC6*dd1qdLiQ=p1I9Yxbs%aS=We5vhIP$!*~C!N021Z$yynYym#*h&@-yzRyo^@_w)B2$2%UwFM$}ktA^z^GIX-Dy7R7+rhz(V zvFV2Os;i{EA?}KjFszc$qqQrRNok%5s)b9`vsmApl3WtZ2FxpSN;pANdyJPQHpOa?LUO>{{7d0|A=$(HWNTxEc3r13X`Cy8ZaS%9r9{~Ey4p? z`hN)z?cHqlb6;xobCkiCJ>>n%%0+3S$tf8@OQt{UxMsE7?f7gQZ~y>nk!MgNZ8Ay> ziSk7$K7*}H*d=rJ*}bxyMM`MLKys$F(8`o5UVFKuTz9CIstbzgV99lEp?LLttA393 zOt8m5^nU>xp$+>=y~gKW)cnE?fPV(e?ODWt`(^dNI2hj$QK;_nz4A!~@xlsXZ z)><`TW5x-SzEj_Ev~vQS$sU|j!6UZf?(c0EW;1r@V=5Z44`uS1U-2r;rcj?5yrI8Z z>06^wFE{of3X|xh3V{O)Ktx3m>;T)4vF%#R0<}21tCf8o+#uOl=K%`C!XmY!iWNI& zmN=uL@~lfe|9s|*(u_JUeBVDk6Z8C4fB|PeU<`HveGH`CzYG3b&*LpNIwSGG%Ec&3 zd#`hFxrZz(avW^bcDfCOfg6BtexVgLf}*WyGvRWFLD_-pe_Q;0J-3%0cTX?FA@gkq zxU=ScRd-N&vb^Es;3!|Eu2nRTAf0A)9V`KG*-f}8LrG+mNT$tG8{lnl*dmf&s*N_P z&HkBEsur!kF zO1VXn;3{uvHw8aO)aMrN_$i!R3ILq*B3(WA6G^ZdjIRhlxug)+4-VF&x~jBL3w>*{d9*?AX8i^}16B2vfv`RJ|^Z(uGR5j1EZU z!yHU7nze-T<)=bk>?(XChESE!00AlzL6I(Ql295u5e-7#0}XBAB-<+iAMLlWH&x7E zyu5ghYjbYlXQMUH%b3P)u;!|`piy+VOV!*^`W`Ro%bOIEI?B@*rguc~;d4)K)gHKH z^|dDJ5zp_f++8h=ZX~_8(RE_h1&BbTE;!LlxUYV3wp-Fn_6>=TCbCVBg*0wSpeGsB zRPwI1y2)(FY|fE~y4N?jRh+77mb7py<)1}X1=d8{(TThynG3kAxSqBIA$7K>Da$e} z!qU71CD$U9!(4%7)z=gXT`^3SbA&y3#`qXK+1|Hmh%tdJ66QM6)1d-bpdilttwx=^ z2|%Yk$bYQZMIM(e-nY+pHQXpgyObqBa4+&aRQfKve+k!mpP78FFseN$V`W2t$qKMq zxgWjdCNTaX3X|Zd9x*(~6W)XxS)diay}}3+Uxs>4z3|CRxh7ImY~ZsO(0w~vODR2d zzxdFcJ+Y3MQn~y>ADDJ$PZK&z4L&F<9kmY^YGG zOiqXAoLE7cZsdYI)CBRPrYu_{*%8&~#i?eL%7)d?usJYvtYHC}Ls5(FohAEq^wCCT z*E-rD0d7*YFQT%G(jTGWeFItAbT@omMW;m@sC%Bl(z4$uzKWvUxl2@>CYcSFic-r6 z63NwYD+-*{Gx%;$SQ4A{!(g+fW?Ri!GFS7VIw@ zsi^Bs|6N7(_V58JmeX8yN>jphl%ZL6^7Y$lD3s2dsbwtFy|-{+h}>QIAqtb>q#P>& z2uP>g8R!C<>sx?l^!^V}bl(QG<#yO_p(}jSeiEg*@PjsblI}PAS@HJp;OB257HhQk z*NL*MNE_#90RRcJ1SY3h+%j_oWM7j;O7K~`9I}=in1#MCK49T&Y$#Bqs7k+xu>)K(~%@A=S%DZ+P>TV=j1wLu4&v}X+6JHZ}FRQ7Uavz@M_rubm!LY zr;^j$b#GdplgrDVfh z5@@Rj3k8ZNhma z4J*9U0?2ehRE-+WEJ?&B1HJlIH$xB*OigH|q$3v1xavf|6EqIrXGQ0`A=Z3%X?f0UuV*w|2^Mk>drHI-InkpxLvb!kFW447Gq zCx?=o69&cYem&?(4_UQo9p_V*nEU28k79BBa_U<;e*7fHT%^!*%iV)05KuMY7Q#+< zJ9Sx-y%1_uw3L*Pm$k{0-Vt#@#dfRREwfBUR^tn0U~g3IGF55KBt#idV>PtTM?~pl z&X-z}$c>dwsXkJ*LzhM(a;%cJ#1aGbyyS=_Xd!ir&zyu~lgn|E#qc+7e(;$Orn=MnAqtbIunr?7fP_Ru2rvv31g5W42jHt^ zn1bAo01qA6PGDqAI%YbR8cl#x0vhnO-0rvyb0Z!xozmZPcT|3vI_UKKcizzk>AXf5 zv!tl;mDG;#n=08!MQ%vxjPm?lG~Y<8LoPK>4xV+1zX$c~Pq;xV$DPv6M{B5%i6P8x zA2KHN60J)iIzqG!_78^Ux`Ll6E{$@6((v@r0c}p-)IleSr7n-X$|hSBG^Lj~Ovw|S{2>aD|Nr^_{^%$L zus}pD5g7sn5&%1>SPe7}Nw3_dFwD?Y|6n9ezSdqMbLKB;Xh`Qm=cIU<^Y0NBTn!;~ zr!h(03D7!$B=4<%F5bvV-m8(-{UAnEG5e>dkA0Z!3gkIk8JZ{?9l|9@fO_myjFAqN zr6dKwcDrvVX+I+Thd^jrfSws7cNa7GtFs+`@`eOo#V4P4XV`FP3afL?M+NE6*_Ymz zmtGUpS9mU}*Er7%ygZoZ`liGykEYH58)HOgGlbZz#VEaD>AGG+ySu7h6)H@N$4Lnb zAlE~%MyyRoj5M*N79gXcq)8DaB9v{tn2ay2t@bc?jgRc-zf7Lq!SBg$(S-ebyfR)g z-SWgd7{9(p9Z2>~w)l;=ZNAPuSZTY?{wTw85#}&} z9&?)fK2E=1uVetzHSZGa)1{PJ^30nC$}g|QI#O>}2O$cRnWP$m0FjhnK_CVDuoh?w zK-nJnXQd4i4k3-cHe@8uHSv^8 z;9I6z(+sdbc^0nNzug|L!lAmf2+$DKy5-~`ONj)Rj4Bk1q7jurvLc2;jVO@>i#pe) z$`!j4jW{U=EYM~Iq7>@5xy7C63S#Do6VUZz7yi8~f76aH+p5Kq8&!krv(v_FY+z*x zEuq$x(6h51Sa52?-j!0Y)?7_4#fe)yXb*8*tJxepFyubVmVlrjzyRTT(og_pYM;JN zUFRpww6H8lxK@k{X5FBM4{9sqxB~|v3X`!U3V{O(jHEOg&G2P%0#MU|0aDf;m?yOe zj++3{yHY^hhkIrqzn`^9!LJPBd#mclve+1Y|N8R1eU12wN%+a2#RobdE)=*2HS)}q zoKP&Oc3(lf@{RiBx$0B#a>9ewys+CypbA`zfloWP+ZzfLC>yroAGp{xlaTWu#_cKMN?KM1~#yi zo=Pm0mb|8F=m27*C%lvsA>k>5Pd9D04^r@+*#IDQ+UWXJCPTi+f)$e*tGXZq$tqt9 zf8&hXg?8V14F69)@0%aqf8cf=C3E{EExGu$c{-Q-~X>EqX)u3gNIV+;utk)vK z)_ugj-;N1`=de!=Q7z5Wvs^Yt$S$p2DKU1POx z%s_;I=JBtu@8h3MH{VQ&uE#D+9BFZCq+pwgvGAQCCbctlx=U4OQktPHAvgr9Dvbo7 zkP{3rJZ(CXh?r_xPK7q^y`F1s87pYEdnc-S;5BDOvKu!_h2T@J+n*Xn`QCDwl>@-0 z)fp~95f60P-1Q{ek)I;nWJ%>YvA2^`*b8LXq7v_>W*SIYXmBg#1C}S;m(SCA0R{?C zX-&88VSoU_qO;9!X^0>hfEtsOai|>)&TK;CAUjSaMP+Iexq!9rGQv-USBmz^^;{Aqtb?pb&uq3yA03Vz;m$$HD*y9(ZOp+J$%ea(>b)F1GEVTSVPEEkE3@ zA1dF4II?z>GIvTJ?$mMKqqB^3ely>X?HKfScy8bC%}9U%OI6`EtQlxS%WZN9>U+M9 zcW2n;$q484{dcI&Gl8XGzW#P}tL>zNg{`!O6v2;lWK1nEvKJ>wfz{NGZBfY4F7eYG z6_fWb!yj=-o(BBfc`dcLLP%(k6ZY zYU3eN(=ath!Sf%Yf<08peNPq03RK^`ut>7 z?{W^~pe((m3xTFXo=fn{Z8c1-Yqn<<;8NQ~W|`7_hNOJuIS_fvb>2#>)W%FzC|>71 z!*;ZyX5N@nI6W5AB$&PzARHi(y*Y`ePNQN21Q2rv<{Am%+BT7%Gs{7Nh>*1!ApmHP zZT5`isnxU1=Vo7ex0t6i{visJ;H`oq1PjoQxS$V^3p8~|4(GS?{y=k|Fp+5@_ySO679DqVwLzMS6f30)S3Q}Eh>1(7oFq8AP{~o7R^H@j4|MCD8r$%1 z7wqI6j~TbORXsfmUbX*u#!U?c>|$wDBgmDC>sWv@EupR%f^tW1?= z)T4EhT&j2sTwhs6f*iJ9z{_;TO)AhA-rG|1hsu4_HcPHo0;-!Cd7^BT2D&e%y5lKI z$>Awv@O7x+t+S#4PBtAcG!(TGv5Vr*b-A^<$v$yG)-PjnY#Rr}CrozWjcs*if|ZTh zEqO)+0UNd)B@8FwJnB`|bhix;U)kI7wAe(KlcR)a+61+~x%RB*(MUM&cf#w9zQ0M? z-Tmhr?X~`j>EZfWZAuvj8)g3?3X`FnAW0IDLNDw9TKH9mVlCtA5shX+bZJHDQq#4C zmYU>C>5MM2LP69$rDas|_Kiq%h3o7XDG}as60hB>cmS~gUIYxlD$`twC)0f2F4kMg zGW0OQ1O3s=S9Y?_qb9>~FmJR`8z?3i2K&ZfU~4oNL|<1ZKES*8KQC-{r{(JFBayy~ z%Uih?rA=x(k4$`;wUU;Lg_@h!mG?}w%XfUVuPfgsd`5R2+Z=5h(vhaCyW5uKt#7eL z@e0<}TAGP6oaen1dyEc2F_N6cY`%=v%Fe|wo{6miSFbCb>b;`LX4cNQLYG;Fqe~IS zisE=wwdArfEZAFxGMxn`Ql?3basaE%ZPB4y!7Mof>x$%~E3xS9G*djOd6roWwbmCg zf!gxTNSu^4kXN2PjT@pt%c*8-Z>jreYnY%2fD|U=bkb8jO~R0j;`-2zxam%-00uL*ogtCi!aHyqH ztwX>8M(`P1zgod1OLLt1=t@*-%;?|x1ZD3FDyAi008xX|VYfFejD`0<;0nxuB&u3M zi0Ml5(<5HiPLo2=-m4WAxCC`t8!Ys8vKR-v-sNB@RH+4}Nzy1)-Xq$UJRcUp2k^KV zu6YOfZ~v*fizo9v@@IL{R%ejcmwN*g7}00B_T zJ6g4YesQ~|=1m(YMo3&1M@qI7Tc8pe59}St)7i8*TH7iV8wCOo8~59AHA>b>NeL%c zC_dxO4&9gOawgu5xQ_SBa6N&%HI}*lc_T;d>}Je$Y$|?wxk}gdi+1GptyYy2&M}Sh zt-*37aKOknq-()0h?BlyF$^t*ry7~)ilVwKf~uwhDe203H$BHgTdvoaoj|u&P9pl* zEM_fI&}D8Mr+KaGoVi@L4M5Sc((A`Ia7ZgKi)C2@zIYb{%57*J{Q7<|<7=QoPy%QR%CHos zh~D%-D}31iXYLGIkN%}-<4d?yWFmH@&+C(uR_3Yme<2Ew|Nr^V{^&&pAV7pI5f4Oy zGZ4X>LZ~9}yU-t>*s30bky}tC>r;4j!^{R$`(mdCKS$Hgx02BE8jg3d(QzjfMA>@O z009Ev3z6H(tm6#dPp+?R&Z|n@Idf~pp3QLI^U-d0?$uH54pw-MiU*>Cs7Q(x=A}GJ zZmV-jwGhg%h%5#(p?NPpZ$5m}?;eBLl#OUV?|vYk%RkuqY~$%Qxb|1kg(3>2Fu262 zPAR!*};;u6_ zc`e0`;OZ#E!P5pKGS6tA9{xf$eT3lvGo%$#yBN(!sjy9U*$GBqg2j|E>FwdOdR)yL zMQngJ!tmFVn?-Ug0Nku_g;q`PR2l2j3rDChF2Hg3_jzD#)aX}YjvYl1genJR&)-}9 zO0g;Hwx#^Zm3@-71vH;LlKus1Rm#4MT*d_RP~7J-Iw1;^;G_&e0vU*?5fBJW-~oUQ zZ#uhBAP`31jmPv*t~sKvXl(G(;do<&)3MUWN{b+bu9KOL(>9c~ zBCf0;NCLy;81x?B(6(^&C%=ZH+Bm;a=$xwdg+4*)qa*7IWK736EjXfe-~lvDK@}u7 zM|v~w#v}|yO6<&F!6FvSgM4)6M?LdWDyRfHM*avw%673~sT9j7s#IDp+u&{M1g;re znU6*xR?21=EK$l29R2JRXP&1;N}Dx%OSB>5_GB!jAVN1_(<(hWxl+wEoV#_x$OW~ez6+x$W&ZYHLb*|7gFprwd&zQ zj(jlol;%#b$d}i1S>e=2VVD2_m5VfC+p(GpMVjZnd+fpy%)~Wo4H2NSy0w!k?S#@*rTZ$nc9h(dit6~HA)|m zw<&lpPs3Q2RZ?Fr7Fgpp+9wKGC7`dq=92pjlQC$=Q^Ya$?YB9IHd#>ES=lPkG?CtK zT)sD1MHVQPn8n2~72!G8+fBUa7#!gm>FUkmD}Hocx$b-Bobr;Zw}r@c%o5)@*kYrP zI>aI{m!1-XeF*f&US%YVE>uz}fl!;QYOaj|j!|~P4UY~cACF)XOM4Lb-Z2}$Aqta% zs2DFIv1w}e@Byu~aTXfkGIOI_j{^S8qZyPfI?fLE%?$p2voCmqbmh*n-6!F)U17I{ zcUtvjei*3hIdm?H8!iDl5C91P*8+iyBqbCu^ak-OIHD1h7KM!~$%`c&3s60tgOjpM^k-n8%$7SsviHWW2@2v4rs?4w=g%7j@iq zbv@XlV^hzg(>)|JV~0nu?V@C2&orFgNzsx5oCfFG`_jNpDvDOvQ1%VKr`24NVN8w} zPZkrMFS}S@cxj7nu8TWs%*@CVG7P_nq;IlO_9~d zY*{HRlHLtP4KcCKPd9{Mujr_X@vh1=Uighoa_)>TmMJbQpWqhlb#rz=(lh~vf zLI9FPASD?M&?Em zBTObqI06}M$@qOSctey1XtKn@br+djsvy8ME12uW4gQB0gZ0v_sFy7q^-;H~Z~c;n z>r54_gJB>;X79vTIaVqb#FnWujx|?;Mc!2*IJ1aLCF&oy(f8kpSJ}f`OcDcb=g{w5 zgF&!bJ2I}HwLv_)2_QprET==tmC}VUxGtKl9quPB@RLu8j+>B`ELXy5ge812>o~IM zmS^3z#&x@p%O_hjlFsrmUV~i{?~35nMXM05%blh*-86|6K?5bip;VmfoKWO0E!D!l zpvGPe63k|_TXe?7N=sFUox8@$)-sVN77Q$~3h1}nwwYknbH2Qi`q^}Z6!TksGu?+^ z*-Tk^%52YQjGSNocV)6?o=j6#83z&aZ2#YL9!>e88C~fH5le zTm>j&l2S8?jH5EI5unOwWy0mkD<7BnE_Qb8`oIW~VoG^#&tR4dFgZv(-mSde-T!EB zjCm=c{Jy_wwU>Y44pe0f2HmQGWEyt6V_`zXK!e>%k9>(ju3}27OH1kjxM!Y>nW4jR z@o;vL0;^%_$+Gn5$osdWidQsg>zE`2(?=?$IGeF4(}FbP32u_D9=dHuhB|NB}uAwmg@ox4pp}5n~qnK*s#@b z3mYJere7uW3B#$xuQ8OBDY%K(GdB~es==ti@QE7Q@3f}XgyO9#rYP80ny&*Tq-|D0 z=wzA^?8ducFDtCJ*;+WubL8~|h#10|YPsmisimI}cVEJ%tc#Iiri+*&9+n_-3+_s0 zIJU_}T%;SUQ?wS_9i=n26cHq%4XKxeH8TAQjQOLoyYV3^lVuGI2{Mv|h*RDyen19> zjY9{2XJdaLc>Zyu`YY+;KuxCK>-l)1kssR5$jNLT1%W4f#Kg8G!e${U6RapEaVicv z5!63?czz#U_p zfg~n|o}5H>X71f%q&8G2Rb?YDoaI1lmqN=*p36{G%5^ZgBJum?-5c9626qdMTR_@w zc}~-aw%Lq7F4Fl-z4lo4<^B}gxXB#fDJ4gF_260DL0cA4JyjXinnOuMEljMIz|j{C zuVw)$*VQ#=HkE56lw!F@D{2g)B54+lN1h>fMl%<^XE@l6LJZGUCXsOoHE?%HqAe?M zmPCu5+D}N!gj9}^LZPkb*R^MOJmj(t(0Wq0?`&>xG3u~r9M3qG7gc3g<9Zb*V8)S^ zO5zBnxRrECF@$z+&!5NR&;UaU!Zv(wB5eOV;vR3otjB)*N1LMe(=CVo2)3`(VdAtP zoA&5iqG%d^Axy_SDF)^eAZsbB1w|dWLP1{?l!7z`Wz$0`lZJcyGsShqgg7_>;!kc) zJyKWb@bUPmsm=z->w9M!Sl?_La^H?B>&s5V)mr>?3q$8VGvj{GwTez}d)w^Ve*PG} zW=G&7rUMT#R0O)yQ=Ebwk5Blu3FlEo2jdj7$YH^VlwL?f?6YJD{0(D1;^q`Mk|P)n z0Q*P~aetf@a;hZg6`Ue5$5!bLefjGJS`Rj0Yncf;4nE|*v8RWa9IjD7QSPo6kjAeB zwm2p3*fR-OL$D3@aw9ne1Lf?lzLUFlBnxz;6F^A;0cZ&rC0SCmJ84-sc3Em+ zb|xPAFt*EFG%*%#b3Pokx!PL79M*9}!9(hR_lUA4niUs0U( z7arGh1ZPE%Opj_^b!Mxe%~i~F+EDZ6811-&Mi}aGLpJ2Uv+7&LMZst>&_)EKKR#)H?b3 z=U=a}Z+vj=E4o!;u)_yAvGyEoP>b^rbM{g7`qN|Bs|3ahA8(&|oS@Fu-JWd(Su`X= zXuo9dNdlJVR0(6ya9HW02mlIfwE!~4Yq-h*@e}}{{ZC-y!p<|7i}XIz>-2Jl z^iXIL089v@VKqw|cz}{XApao%l!BT;&mi`YVSkB{z2%X!EdcZdTX0E$?aa|^Vj43v zVirWvVi6cc9kYCY%pZ{E#aPbU(tK~){g<|YXU?NlG_${*k=?Bb!DmSVv8Zj(-6K$l znr?L|7&GLbc&b??R>0as3a+8*=P&=bDBIMWm7KX4fdO=&fF495mIENT;}nah7ja2Q z2{0mL9mt2STUo`p-%d$oCQ#3U{EV7HD}ss*VKq_8Y7986<*d#S_K`EOZDW!UNUbcI z+$t!iqXbNh_>y3WJ|QS0`gs(jh{)eQtk$xeL52{rsF7};8UG9ay#Os~2}nx-0>=Wt z0m2GWA%k^A>w5DJpoFRm($yyO*7k%nJY`_<`;xNo=;F)ne9S%1Y8dJ5YHXrV&Kr~9&3MvD zXHw1_pO?|xijEayckfNPi?tTkYb!`rBtGT%1}X6*aix20LVBXd6xmIt%K?(PNZCQD zYh0ZQ-MQSV2jx5K)6w#F8q3BQl%uiZIZDA+o0!T11v-L@(q^C|*o;)Qg`9IL5&m>I z?L6xxN-MLfiB3vR?0Hqm(W0zYgu2PnNU>!Q)3s82oz1B#L8}VAg^dGSAXyS>DN96G zP?Lg`d9zI@RV6$z)R9$wX8n|CacM(8YerLh7_^T@A!>%|ai2iq!Wl7aYHE>~n*@bW z;^e2ontl8_OYPN>!9X8a=ph=EJ5r3HqCyyD5UR{MrCkInRgo&x2M|L9uMa1ZUcdV` z4y+7VD>>rK23SbQ>JespJgyzx+%Uib`KhrCY>hSsL9&OnlFzYwn1{ z*JZ6Pr#mhBn$63etj^l9el!5nKrFwj63#nwV_nHSkY$j06@??qHndk}UsD&{1UtuS z|NDJSoltHy6xuOl3`f;odM<@kYaE*cbhHYRTrk$J9{&oK{pQ0>H#usS{1Vg}p0hV< zQSS|Bv(1yih*lS!F0k^?lz*ZIy0Ov$3pb%-J%Ws;9u-99jjk0XZt_l2-dAy>fub3(ta!1xcHg z1TVEpI(ZSMl*_w}8xpihj7v%YIDi2?c2=!imv;8JjWdXqbpTKY);u8^lvuhAW1*;N zFf|zZ03F3M3ydyR*(p>9@s8OTK*ju-B`C|2i5%V4vquEtoMi~=k(?SY1l7gtGLr9@GLu#sUpF}iqG4&PxRNJ|;Npjh!nanZY^!L=}6%1W!NSA+W zG|UwcLL-BV8>=V_4T$H4BgBxG#z9tNmHhZ28k5m12*shm%rs~f1O%ZGf`Nu^i?b@F z(^6AQWlI2oz~cx*A+^ha^SIODJo~d|esyFflg#iBYyTn#_Vvcp^)FnF}bN@tCq^HW*!NQfMVNYQ})oa?`qlvAhThd5zlD=h!72x8!G{kcwpFd zE@r=VJJ%3G3PK5zYd^1g^DVTju0P&(*_)uK#!Y-UKwSm?u>{psx zK`Kc+@K7i-lP|h&^53>2No@rECL4uygN=> zKl3{$h&miS%X6x;1TmEsYz0eBY8mVbf=Eg^ASi%5fJuIPr0i)nB?#SEEMJ(2!-=*B zE%X8>{sHR60hR$ZfA{$hhs!@egZ1V2{F~h-oq!5MNEC%Y0t&PtO6Zh)9=V9?i0U!J z3VjpWIN}^38k4(`5CWvY&@f~e2uMKKIiq~)rllLyBV7Z+lBq-ri^aw=FfP !%J5 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

N(H+>E4{ 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

NvTyKZX_XAmvV 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%0A%<0t^0HqZbb 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 literal 0 HcmV?d00001 diff --git a/testfiles/postprocessor/audio1.webm b/testfiles/postprocessor/audio1.webm new file mode 100644 index 0000000000000000000000000000000000000000..85f0a2cf197fb0d669ad389c392ef88a6ec3b1bf GIT binary patch literal 86518 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%0ACh#FxHHuD{0^`6z)B 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 z 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 literal 0 HcmV?d00001 diff --git a/testfiles/postprocessor/conv/audio1.ogg b/testfiles/postprocessor/conv/audio1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ff881d5d802c56ee262c007a40a54dfe6e749353 GIT binary patch literal 82708 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

Fch0K>&j+++;&;gO9bAA4{24XW~hiAGpX7|3VP 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 literal 0 HcmV?d00001 From 235017ba29cd8836deb44d59f86acd3ec7c1a728 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 26 Mar 2023 21:16:56 +0200 Subject: [PATCH 002/459] feat: add ogg postprocessor to downloader --- downloader/Cargo.toml | 1 + downloader/src/lib.rs | 37 +++++++++++++++++++++++++++++-------- downloader/src/util.rs | 2 ++ postprocessor/src/lib.rs | 3 ++- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/downloader/Cargo.toml b/downloader/Cargo.toml index 5e32056..fdf2087 100644 --- a/downloader/Cargo.toml +++ b/downloader/Cargo.toml @@ -30,6 +30,7 @@ rustls-tls-native-roots = [ [dependencies] rustypipe = { path = "..", default-features = false } +rustypipe-postprocessor = { path = "../postprocessor" } once_cell = "1.12.0" regex = "1.6.0" thiserror = "1.0.36" diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 228d5de..7cc24ee 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -14,7 +14,7 @@ use rand::Rng; use regex::Regex; use reqwest::{header, Client}; use rustypipe::{ - model::{traits::FileFormat, AudioCodec, VideoCodec, VideoPlayer}, + model::{traits::FileFormat, AudioCodec, AudioFormat, VideoCodec, VideoPlayer}, param::StreamFilter, }; use tokio::{ @@ -346,13 +346,34 @@ pub async fn download_video( // Downloading combined video/audio stream (no conversion) (Some(video), None) => { pb.set_message(format!("Downloading {title}")); - download_single_file( - &video.url, - download_dir.join(output_fname).with_extension(&format), - http, - pb.clone(), - ) - .await?; + download_single_file(&video.url, output_path, http, pb.clone()).await?; + } + // Downloading audio only + (None, Some(audio)) => { + pb.set_message(format!("Downloading {title}")); + + let (dl_path, postprocessor) = match (audio.format, audio.codec) { + (AudioFormat::M4a, AudioCodec::Mp4a) => (output_path.clone(), None), + (AudioFormat::Webm, AudioCodec::Opus) => ( + download_dir.join(format!( + "{}.audio{}", + output_fname, + audio.format.extension() + )), + Some(AudioFormat::Webm), + ), + _ => (output_path.clone(), None), + }; + + download_single_file(&audio.url, &dl_path, http, pb.clone()).await?; + + if let Some(postprocessor) = postprocessor { + pb.set_message(format!("Converting {title}")); + if postprocessor == AudioFormat::Webm { + rustypipe_postprocessor::ogg_from_webm::process(&dl_path, &output_path)?; + } + fs::remove_file(&dl_path).await?; + } } // Downloading split video/audio streams (requires conversion with ffmpeg) _ => { diff --git a/downloader/src/util.rs b/downloader/src/util.rs index c805afd..220470e 100644 --- a/downloader/src/util.rs +++ b/downloader/src/util.rs @@ -20,6 +20,8 @@ pub enum DownloadError { Input(Cow<'static, str>), #[error("error: {0}")] Other(Cow<'static, str>), + #[error("Postprocessing error: {0}")] + Postprocessing(#[from] rustypipe_postprocessor::PostprocessingError), } /// Split an URL into its base string and parameter map diff --git a/postprocessor/src/lib.rs b/postprocessor/src/lib.rs index e1425bb..c89f696 100644 --- a/postprocessor/src/lib.rs +++ b/postprocessor/src/lib.rs @@ -1,8 +1,9 @@ #![allow(dead_code)] +pub mod ogg_from_webm; + mod crc; mod ogg; -mod ogg_from_webm; mod webm; /// Error from the postprocessor From 805cc5088fd3b3f26503a5e3063a46562feedc80 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 17 May 2023 14:35:10 +0200 Subject: [PATCH 003/459] fix: increase default timeout to 20s, use ffmpeg copy arg refactor: use enum for navigation endpoint --- cli/src/main.rs | 2 +- downloader/src/lib.rs | 9 +- src/client/mod.rs | 4 +- src/client/music_artist.rs | 56 ++++++------- src/client/music_genres.rs | 28 ++++--- src/client/response/music_item.rs | 24 +++--- src/client/response/url_endpoint.rs | 123 ++++++++++++++++++---------- src/client/response/video_item.rs | 6 +- src/client/url_resolver.rs | 38 ++++----- src/model/convert.rs | 42 ++++++++++ src/serializer/text.rs | 51 ++++++------ 11 files changed, 226 insertions(+), 157 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 2a1ba78..0a670ef 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -385,7 +385,7 @@ async fn download_videos( #[tokio::main] async fn main() { - env_logger::init(); + env_logger::builder().format_timestamp_micros().init(); let cli = Cli::parse(); diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 228d5de..0ad54d5 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -429,7 +429,7 @@ async fn download_streams( } async fn convert_streams>( - downloads: &Vec, + downloads: &[StreamDownload], output: P, ffmpeg: &str, ) -> Result<()> { @@ -448,11 +448,8 @@ async fn convert_streams>( args.append(&mut mapping_args); - // Combining multiple streams, keep codecs - if downloads.len() > 1 { - args.push("-c".into()); - args.push("copy".into()); - } + args.push("-c".into()); + args.push("copy".into()); args.push(output_path.into()); diff --git a/src/client/mod.rs b/src/client/mod.rs index ae7e180..5b9398c 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -454,7 +454,7 @@ impl RustyPipeBuilder { .brotli(true) .redirect(reqwest::redirect::Policy::none()); - if let Some(timeout) = self.timeout.or_default(|| Duration::from_secs(10)) { + if let Some(timeout) = self.timeout.or_default(|| Duration::from_secs(20)) { client_builder = client_builder.timeout(timeout); } @@ -556,7 +556,7 @@ impl RustyPipeBuilder { /// The timeout is applied from when the request starts connecting until the /// response body has finished. /// - /// **Default value**: 10s + /// **Default value**: 20s #[must_use] pub fn timeout(mut self, timeout: Duration) -> Self { self.timeout = DefaultOpt::Some(timeout); diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index 58b926d..d5f2c64 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -4,6 +4,7 @@ use once_cell::sync::Lazy; use regex::Regex; use crate::{ + client::response::url_endpoint::{MusicPageType, NavigationEndpoint}, error::{Error, ExtractionError}, model::{AlbumItem, ArtistId, MusicArtist}, serializer::MapResult, @@ -188,38 +189,29 @@ fn map_artist_page( .music_carousel_shelf_basic_header_renderer .more_content_button { - if let Some(bep) = - button.button_renderer.navigation_endpoint.browse_endpoint - { - if let Some(cfg) = bep.browse_endpoint_context_supported_configs { - match cfg.browse_endpoint_context_music_config.page_type { - // Music videos - PageType::Playlist => { - if videos_playlist_id.is_none() { - videos_playlist_id = Some(bep.browse_id); - } - } - // Albums - PageType::ArtistDiscography => { + match button.button_renderer.navigation_endpoint.music_page() { + // Music videos + Some((MusicPageType::Playlist, id)) => { + if videos_playlist_id.is_none() { + videos_playlist_id = Some(id); + } + } + // Albums + Some((MusicPageType::ArtistDiscography, _)) => { + can_fetch_more = true; + extendable_albums = true; + } + // Albums or playlists + Some((MusicPageType::Artist, _)) => { + // Peek at the first item to determine type + if let Some(response::music_item::MusicResponseItem::MusicTwoRowItemRenderer(item)) = shelf.contents.c.first() { + if let Some(PageType::Album) = item.navigation_endpoint.page_type() { can_fetch_more = true; extendable_albums = true; } - // Albums or playlists - PageType::Artist => { - // Peek at the first item to determine type - if let Some(response::music_item::MusicResponseItem::MusicTwoRowItemRenderer(item)) = shelf.contents.c.first() { - if let Some(PageType::Album) = item.navigation_endpoint.browse_endpoint.as_ref().and_then(|be| { - be.browse_endpoint_context_supported_configs.as_ref().map(|config| { - config.browse_endpoint_context_music_config.page_type - })}) { - can_fetch_more = true; - extendable_albums = true; - } - } - } - _ => {} } } + _ => {} } } } @@ -251,10 +243,12 @@ fn map_artist_page( }); let radio_id = header.start_radio_button.and_then(|b| { - b.button_renderer - .navigation_endpoint - .watch_endpoint - .and_then(|w| w.playlist_id) + if let NavigationEndpoint::Watch { watch_endpoint } = b.button_renderer.navigation_endpoint + { + watch_endpoint.playlist_id + } else { + None + } }); Ok(MapResult { diff --git a/src/client/music_genres.rs b/src/client/music_genres.rs index f471f87..3a696ca 100644 --- a/src/client/music_genres.rs +++ b/src/client/music_genres.rs @@ -7,7 +7,7 @@ use crate::{ }; use super::{ - response::{self, music_item::MusicListMapper}, + response::{self, music_item::MusicListMapper, url_endpoint::NavigationEndpoint}, ClientType, MapResponse, QBrowse, QBrowseParams, RustyPipeQuery, }; @@ -144,18 +144,20 @@ impl MapResponse for response::MusicGenre { h.music_carousel_shelf_basic_header_renderer .more_content_button .and_then(|btn| { - btn.button_renderer - .navigation_endpoint - .browse_endpoint - .and_then(|browse| { - if browse.browse_id - == "FEmusic_moods_and_genres_category" - { - Some(browse.params) - } else { - None - } - }) + if let NavigationEndpoint::Browse { + browse_endpoint, .. + } = btn.button_renderer.navigation_endpoint + { + if browse_endpoint.browse_id + == "FEmusic_moods_and_genres_category" + { + Some(browse_endpoint.params) + } else { + None + } + } else { + None + } }) }), shelf.contents, diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 3edd74e..bee91c9 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -759,7 +759,7 @@ impl MusicListMapper { })); Ok(Some(MusicItemType::Playlist)) } - MusicPageType::None => { + MusicPageType::None | MusicPageType::ArtistDiscography => { // There may be broken YT channels from the artist search. They can be skipped. Ok(None) } @@ -901,7 +901,7 @@ impl MusicListMapper { })); Ok(Some(MusicItemType::Playlist)) } - MusicPageType::None => Ok(None), + MusicPageType::None | MusicPageType::ArtistDiscography => Ok(None), MusicPageType::Unknown => { self.has_unknown = true; Ok(None) @@ -1039,7 +1039,7 @@ impl MusicListMapper { })); Some(MusicItemType::Playlist) } - MusicPageType::None => None, + MusicPageType::None | MusicPageType::ArtistDiscography => None, MusicPageType::Unknown => { self.has_unknown = true; None @@ -1171,20 +1171,22 @@ fn map_artist_id_fallback( pub(crate) fn map_artist_id(entries: Vec) -> Option { entries.into_iter().find_map(|i| { - let ep = i - .menu_navigation_item_renderer - .navigation_endpoint - .browse_endpoint; - ep.and_then(|ep| { - ep.browse_endpoint_context_supported_configs + if let NavigationEndpoint::Browse { + browse_endpoint, .. + } = i.menu_navigation_item_renderer.navigation_endpoint + { + browse_endpoint + .browse_endpoint_context_supported_configs .and_then(|cfg| { if cfg.browse_endpoint_context_music_config.page_type == PageType::Artist { - Some(ep.browse_id) + Some(browse_endpoint.browse_id) } else { None } }) - }) + } else { + None + } }) } diff --git a/src/client/response/url_endpoint.rs b/src/client/response/url_endpoint.rs index 491acdd..1b9b225 100644 --- a/src/client/response/url_endpoint.rs +++ b/src/client/response/url_endpoint.rs @@ -11,21 +11,20 @@ pub(crate) struct ResolvedUrl { } #[serde_as] -#[derive(Debug, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub(crate) struct NavigationEndpoint { - #[serde(default)] - #[serde_as(deserialize_as = "DefaultOnError")] - pub watch_endpoint: Option, - #[serde(default)] - #[serde_as(deserialize_as = "DefaultOnError")] - pub browse_endpoint: Option, - #[serde(default)] - #[serde_as(deserialize_as = "DefaultOnError")] - pub url_endpoint: Option, - #[serde(default)] - #[serde_as(deserialize_as = "DefaultOnError")] - pub command_metadata: Option, +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub(crate) enum NavigationEndpoint { + #[serde(rename_all = "camelCase")] + Watch { watch_endpoint: WatchEndpoint }, + #[serde(rename_all = "camelCase")] + Browse { + browse_endpoint: BrowseEndpoint, + #[serde(default)] + #[serde_as(deserialize_as = "DefaultOnError")] + command_metadata: Option, + }, + #[serde(rename_all = "camelCase")] + Url { url_endpoint: UrlEndpoint }, } #[derive(Debug, Deserialize)] @@ -184,6 +183,7 @@ impl PageType { #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub(crate) enum MusicPageType { Artist, + ArtistDiscography, Album, Playlist, Track { is_video: bool }, @@ -195,47 +195,82 @@ impl From for MusicPageType { fn from(t: PageType) -> Self { match t { PageType::Artist => MusicPageType::Artist, + PageType::ArtistDiscography => MusicPageType::ArtistDiscography, PageType::Album => MusicPageType::Album, PageType::Playlist => MusicPageType::Playlist, - PageType::Channel | PageType::ArtistDiscography => MusicPageType::None, + PageType::Channel => MusicPageType::None, PageType::Unknown => MusicPageType::Unknown, } } } impl NavigationEndpoint { + /// Get the YouTube Music page and id from a browse/watch endpoint pub(crate) fn music_page(self) -> Option<(MusicPageType, String)> { - self.browse_endpoint - .and_then(|be| { - be.browse_endpoint_context_supported_configs.map(|config| { + match self { + NavigationEndpoint::Watch { watch_endpoint } => { + if watch_endpoint + .playlist_id + .map(|plid| plid.starts_with("RDQM")) + .unwrap_or_default() + { + // Genre radios (e.g. "pop radio") will be skipped + Some((MusicPageType::None, watch_endpoint.video_id)) + } else { + Some(( + MusicPageType::Track { + is_video: watch_endpoint + .watch_endpoint_music_supported_configs + .watch_endpoint_music_config + .music_video_type + == MusicVideoType::Video, + }, + watch_endpoint.video_id, + )) + } + } + NavigationEndpoint::Browse { + browse_endpoint, .. + } => browse_endpoint + .browse_endpoint_context_supported_configs + .map(|config| { ( config.browse_endpoint_context_music_config.page_type.into(), - be.browse_id, + browse_endpoint.browse_id, ) + }), + NavigationEndpoint::Url { .. } => None, + } + } + + /// Get the page type of a browse endpoint + pub(crate) fn page_type(&self) -> Option { + if let NavigationEndpoint::Browse { + browse_endpoint, + command_metadata, + } = self + { + browse_endpoint + .browse_endpoint_context_supported_configs + .as_ref() + .map(|c| c.browse_endpoint_context_music_config.page_type) + .or_else(|| { + command_metadata + .as_ref() + .map(|c| c.web_command_metadata.web_page_type) }) - }) - .or_else(|| { - self.watch_endpoint.map(|watch| { - if watch - .playlist_id - .map(|plid| plid.starts_with("RDQM")) - .unwrap_or_default() - { - // Genre radios (e.g. "pop radio") will be skipped - (MusicPageType::None, watch.video_id) - } else { - ( - MusicPageType::Track { - is_video: watch - .watch_endpoint_music_supported_configs - .watch_endpoint_music_config - .music_video_type - == MusicVideoType::Video, - }, - watch.video_id, - ) - } - }) - }) + } else { + None + } + } + + /// Get the sanitized URL from a url endpoint + pub(crate) fn url(&self) -> Option { + match self { + NavigationEndpoint::Url { url_endpoint } => { + Some(util::sanitize_yt_url(&url_endpoint.url)) + } + _ => None, + } } } diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index e13f2a3..fa0577c 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -732,11 +732,7 @@ impl YouTubeListMapper { links: meta .primary_links .into_iter() - .filter_map(|l| { - l.navigation_endpoint - .url_endpoint - .map(|url| (l.title, util::sanitize_yt_url(&url.url))) - }) + .filter_map(|l| l.navigation_endpoint.url().map(|url| (l.title, url))) .collect(), }); } diff --git a/src/client/url_resolver.rs b/src/client/url_resolver.rs index c001a2b..6b9e83b 100644 --- a/src/client/url_resolver.rs +++ b/src/client/url_resolver.rs @@ -10,7 +10,10 @@ use crate::{ util, }; -use super::{response, ClientType, MapResponse, RustyPipeQuery, YTContext}; +use super::{ + response::{self, url_endpoint::NavigationEndpoint}, + ClientType, MapResponse, RustyPipeQuery, YTContext, +}; #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] @@ -326,26 +329,21 @@ impl MapResponse for response::ResolvedUrl { _lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, ) -> Result, ExtractionError> { - let browse_endpoint = self - .endpoint - .browse_endpoint - .ok_or(ExtractionError::InvalidData(Cow::Borrowed("No browse ID")))?; + let pt = self.endpoint.page_type(); + if let NavigationEndpoint::Browse { + browse_endpoint, .. + } = self.endpoint + { + let target = pt + .and_then(|pt| pt.to_url_target(browse_endpoint.browse_id)) + .ok_or(ExtractionError::InvalidData(Cow::Borrowed("No page type")))?; - let target = self - .endpoint - .command_metadata - .map(|c| c.web_command_metadata.web_page_type) - .or_else(|| { - browse_endpoint - .browse_endpoint_context_supported_configs - .map(|c| c.browse_endpoint_context_music_config.page_type) + Ok(MapResult { + c: target, + warnings: Vec::new(), }) - .and_then(|pt| pt.to_url_target(browse_endpoint.browse_id)) - .ok_or(ExtractionError::InvalidData(Cow::Borrowed("No page type")))?; - - Ok(MapResult { - c: target, - warnings: Vec::new(), - }) + } else { + Err(ExtractionError::InvalidData(Cow::Borrowed("No browse ID"))) + } } } diff --git a/src/model/convert.rs b/src/model/convert.rs index 6e2c71c..0800006 100644 --- a/src/model/convert.rs +++ b/src/model/convert.rs @@ -37,6 +37,12 @@ impl FromYtItem for VideoItem { } } +impl From for YouTubeItem { + fn from(value: VideoItem) -> Self { + Self::Video(value) + } +} + impl FromYtItem for PlaylistItem { fn from_yt_item(item: YouTubeItem) -> Option { match item { @@ -46,6 +52,12 @@ impl FromYtItem for PlaylistItem { } } +impl From for YouTubeItem { + fn from(value: PlaylistItem) -> Self { + Self::Playlist(value) + } +} + impl FromYtItem for ChannelItem { fn from_yt_item(item: YouTubeItem) -> Option { match item { @@ -55,6 +67,12 @@ impl FromYtItem for ChannelItem { } } +impl From for YouTubeItem { + fn from(value: ChannelItem) -> Self { + Self::Channel(value) + } +} + impl FromYtItem for MusicItem { fn from_ytm_item(item: MusicItem) -> Option { Some(item) @@ -70,6 +88,12 @@ impl FromYtItem for TrackItem { } } +impl From for MusicItem { + fn from(value: TrackItem) -> Self { + Self::Track(value) + } +} + impl FromYtItem for AlbumItem { fn from_ytm_item(item: MusicItem) -> Option { match item { @@ -79,6 +103,12 @@ impl FromYtItem for AlbumItem { } } +impl From for MusicItem { + fn from(value: AlbumItem) -> Self { + Self::Album(value) + } +} + impl FromYtItem for ArtistItem { fn from_ytm_item(item: MusicItem) -> Option { match item { @@ -88,6 +118,12 @@ impl FromYtItem for ArtistItem { } } +impl From for MusicItem { + fn from(value: ArtistItem) -> Self { + Self::Artist(value) + } +} + impl FromYtItem for MusicPlaylistItem { fn from_ytm_item(item: MusicItem) -> Option { match item { @@ -97,6 +133,12 @@ impl FromYtItem for MusicPlaylistItem { } } +impl From for MusicItem { + fn from(value: MusicPlaylistItem) -> Self { + Self::Playlist(value) + } +} + impl From> for ChannelTag { fn from(channel: Channel) -> Self { Self { diff --git a/src/serializer/text.rs b/src/serializer/text.rs index d883ea9..2e5549d 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -3,7 +3,7 @@ use std::convert::TryFrom; use once_cell::sync::Lazy; use regex::Regex; use serde::{Deserialize, Deserializer}; -use serde_with::{serde_as, DeserializeAs}; +use serde_with::{serde_as, DeserializeAs, VecSkipError}; use crate::{ client::response::url_endpoint::{MusicVideoType, NavigationEndpoint, PageType}, @@ -124,18 +124,19 @@ struct RichTextInternal { #[serde(rename_all = "camelCase")] struct RichTextRun { text: String, - #[serde(default)] - navigation_endpoint: NavigationEndpoint, + navigation_endpoint: Option, } /// This is a new rich text representation format that YouTube is A/B testing /// at the moment. It consists of the full text and an array of ranges describing /// the links. +#[serde_as] #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct AttributedText { content: String, #[serde(default)] + #[serde_as(as = "VecSkipError<_>")] command_runs: Vec, } @@ -160,35 +161,37 @@ impl From for TextComponent { } /// Map a single component of a rich text -fn map_text_component(text: String, nav: NavigationEndpoint) -> TextComponent { - match nav.watch_endpoint { - Some(w) => TextComponent::Video { +fn map_text_component(text: String, nav: Option) -> TextComponent { + match nav { + Some(NavigationEndpoint::Watch { watch_endpoint }) => TextComponent::Video { text, - video_id: w.video_id, - start_time: w.start_time_seconds, - is_video: w + video_id: watch_endpoint.video_id, + start_time: watch_endpoint.start_time_seconds, + is_video: watch_endpoint .watch_endpoint_music_supported_configs .watch_endpoint_music_config .music_video_type == MusicVideoType::Video, }, - None => match nav.browse_endpoint { - Some(b) => TextComponent::Browse { - page_type: match &b.browse_endpoint_context_supported_configs { - Some(bc) => bc.browse_endpoint_context_music_config.page_type, - None => match &nav.command_metadata { - Some(cm) => cm.web_command_metadata.web_page_type, - None => return TextComponent::Text { text }, - }, + Some(NavigationEndpoint::Browse { + browse_endpoint, + command_metadata, + }) => TextComponent::Browse { + page_type: match &browse_endpoint.browse_endpoint_context_supported_configs { + Some(bc) => bc.browse_endpoint_context_music_config.page_type, + None => match &command_metadata { + Some(cm) => cm.web_command_metadata.web_page_type, + None => return TextComponent::Text { text }, }, - text, - browse_id: b.browse_id, - }, - None => match nav.url_endpoint { - Some(u) => TextComponent::Web { text, url: u.url }, - None => TextComponent::Text { text }, }, + text, + browse_id: browse_endpoint.browse_id, }, + Some(NavigationEndpoint::Url { url_endpoint }) => TextComponent::Web { + text, + url: url_endpoint.url, + }, + None => TextComponent::Text { text }, } } @@ -278,7 +281,7 @@ impl<'de> DeserializeAs<'de, TextComponents> for AttributedText { } components.push(map_text_component( txt_link.to_string(), - cmd.on_tap.innertube_command, + Some(cmd.on_tap.innertube_command), )); }); From 2c4d70cc0d79ca5df32946833cefbf89f5a89c1e Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 22 May 2023 15:17:05 +0200 Subject: [PATCH 004/459] fix tests --- tests/youtube.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 95baa2d..bd5e1e3 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1001,7 +1001,7 @@ fn channel_order( )) .unwrap(); // Upload dates should be in descending order - if tab != ChannelVideoTab::Shorts { + if tab == ChannelVideoTab::Videos { let mut latest_items = latest.items.iter().peekable(); while let (Some(v), Some(next_v)) = (latest_items.next(), latest_items.peek()) { if !v.is_upcoming && !v.is_live && !next_v.is_upcoming && !next_v.is_live { From da8b2a27fceeab07257f2f9c1da18c34a8da5d5f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 22 May 2023 17:44:14 +0200 Subject: [PATCH 005/459] fix: Swahili duration text parsing --- src/client/response/video_item.rs | 11 +++++++++-- src/util/timeago.rs | 20 +++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index fa0577c..d030ed4 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -531,8 +531,15 @@ impl YouTubeListMapper { }); let length = video.accessibility.and_then(|acc| { - let parts = ACCESSIBILITY_SEP_REGEX.split(&acc).collect::>(); - if parts.len() > 2 { + // The video title has to be stripped from the beginning because in Swahili + // the duration follows the title with no separator (probably a bug). + // Example: `what I do with leftoversdakika 1 - cheza video` + let parts = ACCESSIBILITY_SEP_REGEX + .split(acc.trim_start_matches(&video.headline)) + .collect::>(); + if parts.len() > 1 { + // In Russian, the duration is the last part + // Example: `Воспроизвести видео – \"hangover food\". Его продолжительность – 58 секунд.` let i = match self.lang { Language::Ru => 1, _ => 2, diff --git a/src/util/timeago.rs b/src/util/timeago.rs index be490b6..8f9cebd 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -344,7 +344,21 @@ struct DurationTxtSegment { word: String, } -fn split_duration_txt(txt: &str, start_c: bool) -> Vec { +/// Split a video duration string into its segments. +/// +/// Each segment consists of a word and a string of digits (one of them may be empty). +/// +/// The `start_word` parameter determines whether the segments should start with a word +/// instead of a number. This is the case in Swahili and Singhalese. +/// +/// Example (start_word=false): +/// - `1 minute, 13 seconds` -> `{1;minute} {13;seconds}` +/// - `foo 1 minute, 13 seconds bar` -> `{foo} {1;minute} {13;seconds bar}` +/// +/// Example (start_word=true): +/// - `dakika 1 na sekunde 1` -> `{1;dakika} {1;na sekunde}` +/// - `foo dakika 1 na sekunde 1 bar` -> `{1;foo dakika} {1;na sekunde} {bar}` +fn split_duration_txt(txt: &str, start_word: bool) -> Vec { let mut segments = Vec::new(); // 1: parse digits, 2: parse word @@ -353,14 +367,14 @@ fn split_duration_txt(txt: &str, start_c: bool) -> Vec { for c in txt.trim().chars() { if c.is_ascii_digit() { - if state == 2 && (!seg.digits.is_empty() || (!start_c && segments.is_empty())) { + if state == 2 && (!seg.digits.is_empty() || (!start_word && segments.is_empty())) { segments.push(seg); seg = DurationTxtSegment::default(); } seg.digits.push(c); state = 1; } else { - if (state == 1) && (!seg.word.is_empty() || (start_c && segments.is_empty())) { + if (state == 1) && (!seg.word.is_empty() || (start_word && segments.is_empty())) { segments.push(seg); seg = DurationTxtSegment::default(); } From cca9838b7e8c64bf5c9970df0a9d30a65243c82a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 28 May 2023 19:28:33 +0200 Subject: [PATCH 006/459] fix: playlist id regex --- src/util/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/mod.rs b/src/util/mod.rs index a16b68c..f6e093f 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -26,7 +26,7 @@ pub static VIDEO_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^[A-Za-z0-9_- pub static CHANNEL_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^UC[A-Za-z0-9_-]{22}$").unwrap()); pub static PLAYLIST_ID_REGEX: Lazy = - Lazy::new(|| Regex::new(r"^(?:PL|RDCLAK|OLAK|UU)[A-Za-z0-9_-]{16,50}$").unwrap()); + Lazy::new(|| Regex::new(r"^(?:PL|RD|OLAK|UU)[A-Za-z0-9_-]{16,50}$").unwrap()); pub static ALBUM_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^MPREb_[A-Za-z0-9_-]{11}$").unwrap()); pub static VANITY_PATH_REGEX: Lazy = Lazy::new(|| { From cc2cadc3093ea5c53acbd06b6fa531ee2b596972 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 28 May 2023 21:07:03 +0200 Subject: [PATCH 007/459] fix: add support for A/B test 7 (short date format) --- codegen/src/abtest.rs | 21 ++++++++++++++++---- notes/AB_Tests.md | 8 ++++++++ src/client/channel.rs | 28 ++++++++++++++++++++------- src/client/mod.rs | 9 ++++++++- src/client/music_artist.rs | 11 +++++++---- src/client/music_charts.rs | 4 +++- src/client/music_details.rs | 13 +++++++++---- src/client/music_genres.rs | 6 ++++-- src/client/music_new.rs | 11 +++++++---- src/client/music_playlist.rs | 6 ++++-- src/client/music_search.rs | 18 ++++++++++------- src/client/pagination.rs | 12 +++++++----- src/client/player.rs | 8 ++++++-- src/client/playlist.rs | 8 ++++++-- src/client/search.rs | 9 +++++++-- src/client/trends.rs | 16 +++++++++++----- src/client/url_resolver.rs | 1 + src/client/video_details.rs | 15 +++++++++++---- src/util/dictionary.rs | 35 +++++++++++++++++++++------------- testfiles/dict/dictionary.json | 9 ++++++++- tests/youtube.rs | 7 ++++++- 21 files changed, 184 insertions(+), 71 deletions(-) diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index ac13a8c..9acf827 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -4,6 +4,8 @@ use anyhow::{bail, Result}; use futures::{stream, StreamExt}; use indicatif::{ProgressBar, ProgressStyle}; use num_enum::TryFromPrimitive; +use once_cell::sync::Lazy; +use regex::Regex; use rustypipe::client::{ClientType, RustyPipe, RustyPipeQuery, YTContext}; use rustypipe::model::YouTubeItem; use rustypipe::param::search_filter::{ItemType, SearchFilter}; @@ -21,6 +23,7 @@ pub enum ABTest { TrendsVideoTab = 4, TrendsPageHeaderRenderer = 5, DiscographyPage = 6, + ShortDateFormat = 7, } const TESTS_TO_RUN: [ABTest; 3] = [ @@ -90,6 +93,7 @@ pub async fn run_test( ABTest::TrendsVideoTab => trends_video_tab(&query).await, ABTest::TrendsPageHeaderRenderer => trends_page_header_renderer(&query).await, ABTest::DiscographyPage => discography_page(&query).await, + ABTest::ShortDateFormat => short_date_format(&query).await, } .unwrap(); pb.inc(1); @@ -223,10 +227,19 @@ pub async fn trends_page_header_renderer(rp: &RustyPipeQuery) -> Result { } pub async fn discography_page(rp: &RustyPipeQuery) -> Result { - let artist = rp - .music_artist("UC7cl4MmM6ZZ2TcFyMk_b4pg", false) - .await - .unwrap(); + let artist = rp.music_artist("UC7cl4MmM6ZZ2TcFyMk_b4pg", false).await?; Ok(artist.albums.len() <= 10) } + +pub async fn short_date_format(rp: &RustyPipeQuery) -> Result { + static SHORT_DATE: Lazy = Lazy::new(|| Regex::new("\\d(?:y|mo|w|d|h|min) ").unwrap()); + let channel = rp.channel_videos("UC2DjFE7Xf11URZqWBigcVOQ").await?; + + Ok(channel.content.items.iter().any(|itm| { + itm.publish_date_txt + .as_deref() + .map(|d| SHORT_DATE.is_match(d)) + .unwrap_or_default() + })) +} diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index 9a2fcf8..b9ffbf0 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -376,3 +376,11 @@ visitor data cookie to be set, as it was the case with the old system. **NEW** ![A/B test 4 old screenshot](./_img/ab_6_new.png) + +## [7] Short timeago format + +- **Encountered on:** 28.05.2023 +- **Impact:** 🟡 Medium + +YouTube changed their date format from the long format (*21 hours ago*, *3 days ago*) to +a short format (*21h ago*, *3d ago*). diff --git a/src/client/channel.rs b/src/client/channel.rs index 867cc55..7ec1be5 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -200,15 +200,20 @@ impl MapResponse>> for response::Channel { id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result>>, ExtractionError> { let content = map_channel_content(id, self.contents, self.alerts)?; + let visitor_data = self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)); let channel_data = map_channel( MapChannelData { header: self.header, metadata: self.metadata, microformat: self.microformat, - visitor_data: self.response_context.visitor_data.clone(), + visitor_data: visitor_data.clone(), has_shorts: content.has_shorts, has_live: content.has_live, }, @@ -226,7 +231,7 @@ impl MapResponse>> for response::Channel { None, mapper.items, mapper.ctoken, - self.response_context.visitor_data, + visitor_data, crate::model::paginator::ContinuationEndpoint::Browse, ); @@ -243,15 +248,20 @@ impl MapResponse>> for response::Channel { id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result>>, ExtractionError> { let content = map_channel_content(id, self.contents, self.alerts)?; + let visitor_data = self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)); let channel_data = map_channel( MapChannelData { header: self.header, metadata: self.metadata, microformat: self.microformat, - visitor_data: self.response_context.visitor_data, + visitor_data, has_shorts: content.has_shorts, has_live: content.has_live, }, @@ -280,6 +290,7 @@ impl MapResponse> for response::Channel { id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result>, ExtractionError> { let content = map_channel_content(id, self.contents, self.alerts)?; let channel_data = map_channel( @@ -287,7 +298,10 @@ impl MapResponse> for response::Channel { header: self.header, metadata: self.metadata, microformat: self.microformat, - visitor_data: self.response_context.visitor_data, + visitor_data: self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)), has_shorts: content.has_shorts, has_live: content.has_live, }, @@ -605,7 +619,7 @@ mod tests { let channel: response::Channel = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult>> = - channel.map_response(id, Language::En, None).unwrap(); + channel.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -632,7 +646,7 @@ mod tests { let channel: response::Channel = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult>> = channel - .map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None) + .map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None, None) .unwrap(); assert!( @@ -651,7 +665,7 @@ mod tests { let channel: response::Channel = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = channel - .map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None) + .map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None, None) .unwrap(); assert!( diff --git a/src/client/mod.rs b/src/client/mod.rs index 5b9398c..22fc832 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1247,7 +1247,12 @@ impl RustyPipeQuery { }) } else { match serde_json::from_str::(&body) { - Ok(deserialized) => match deserialized.map_response(id, self.opts.lang, deobf) { + Ok(deserialized) => match deserialized.map_response( + id, + self.opts.lang, + deobf, + self.opts.visitor_data.as_deref(), + ) { Ok(mapres) => Ok(mapres), Err(e) => Err(e.into()), }, @@ -1453,11 +1458,13 @@ trait MapResponse { /// that the returned entity matches this ID and return an error instead. /// - `lang`: Language of the request. Used for mapping localized information like dates. /// - `deobf`: Deobfuscator (if passed to the `execute_request_deobf` method) + /// - `vdata`: Visitor data option of the client fn map_response( self, id: &str, lang: Language, deobf: Option<&DeobfData>, + vdata: Option<&str>, ) -> Result, ExtractionError>; } diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index d5f2c64..75dafb5 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -96,6 +96,7 @@ impl MapResponse for response::MusicArtist { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { let mapped = map_artist_page(self, id, lang, false)?; Ok(MapResult { @@ -111,6 +112,7 @@ impl MapResponse<(MusicArtist, bool)> for response::MusicArtist { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { map_artist_page(self, id, lang, true) } @@ -286,6 +288,7 @@ impl MapResponse> for response::MusicArtistAlbums { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { // dbg!(&self); @@ -356,7 +359,7 @@ mod tests { let resp: response::MusicArtist = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult<(MusicArtist, bool)> = - resp.map_response(id, Language::En, None).unwrap(); + resp.map_response(id, Language::En, None, None).unwrap(); let (mut artist, can_fetch_more) = map_res.c; assert!( @@ -371,7 +374,7 @@ mod tests { let resp: response::MusicArtistAlbums = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let mut map_res: MapResult> = - resp.map_response(id, Language::En, None).unwrap(); + resp.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -392,7 +395,7 @@ mod tests { let artist: response::MusicArtist = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult = artist - .map_response("UClmXPfaYhXOYsNn_QUyheWQ", Language::En, None) + .map_response("UClmXPfaYhXOYsNn_QUyheWQ", Language::En, None, None) .unwrap(); assert!( @@ -411,7 +414,7 @@ mod tests { let artist: response::MusicArtist = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let res: Result, ExtractionError> = - artist.map_response("UCLkAepWjdylmXSltofFvsYQ", Language::En, None); + artist.map_response("UCLkAepWjdylmXSltofFvsYQ", Language::En, None, None); let e = res.unwrap_err(); match e { diff --git a/src/client/music_charts.rs b/src/client/music_charts.rs index 1176dfc..87bc5a2 100644 --- a/src/client/music_charts.rs +++ b/src/client/music_charts.rs @@ -60,6 +60,7 @@ impl MapResponse for response::MusicCharts { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, crate::error::ExtractionError> { let countries = self .framework_updates @@ -164,7 +165,8 @@ mod tests { let charts: response::MusicCharts = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = charts.map_response("", Language::En, None).unwrap(); + let map_res: MapResult = + charts.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 06578f9..9a6d620 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -157,6 +157,7 @@ impl MapResponse for response::MusicDetails { id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { let tabs = self .contents @@ -237,6 +238,7 @@ impl MapResponse> for response::MusicDetails { id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let tabs = self .contents @@ -297,6 +299,7 @@ impl MapResponse for response::MusicLyrics { id: &str, _lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { let lyrics = self .contents @@ -330,6 +333,7 @@ impl MapResponse for response::MusicRelated { _id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { // Find artist let artist_id = self @@ -422,7 +426,7 @@ mod tests { let details: response::MusicDetails = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult = - details.map_response(id, Language::En, None).unwrap(); + details.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -442,7 +446,7 @@ mod tests { let radio: response::MusicDetails = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - radio.map_response(id, Language::En, None).unwrap(); + radio.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -459,7 +463,7 @@ mod tests { let lyrics: response::MusicLyrics = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = lyrics.map_response("", Language::En, None).unwrap(); + let map_res: MapResult = lyrics.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -476,7 +480,8 @@ mod tests { let lyrics: response::MusicRelated = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = lyrics.map_response("", Language::En, None).unwrap(); + let map_res: MapResult = + lyrics.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/music_genres.rs b/src/client/music_genres.rs index 3a696ca..f62273d 100644 --- a/src/client/music_genres.rs +++ b/src/client/music_genres.rs @@ -57,6 +57,7 @@ impl MapResponse> for response::MusicGenres { _id: &str, _lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let content = self .contents @@ -110,6 +111,7 @@ impl MapResponse for response::MusicGenre { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { // dbg!(&self); @@ -214,7 +216,7 @@ mod tests { let playlist: response::MusicGenres = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - playlist.map_response("", Language::En, None).unwrap(); + playlist.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -234,7 +236,7 @@ mod tests { let playlist: response::MusicGenre = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult = - playlist.map_response(id, Language::En, None).unwrap(); + playlist.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/music_new.rs b/src/client/music_new.rs index e80bff1..7abb1fa 100644 --- a/src/client/music_new.rs +++ b/src/client/music_new.rs @@ -52,6 +52,7 @@ impl MapResponse> for response::MusicNew { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let items = self .contents @@ -96,8 +97,9 @@ mod tests { let new_albums: response::MusicNew = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = - new_albums.map_response("", Language::En, None).unwrap(); + let map_res: MapResult> = new_albums + .map_response("", Language::En, None, None) + .unwrap(); assert!( map_res.warnings.is_empty(), @@ -115,8 +117,9 @@ mod tests { let new_albums: response::MusicNew = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = - new_albums.map_response("", Language::En, None).unwrap(); + let map_res: MapResult> = new_albums + .map_response("", Language::En, None, None) + .unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 0bea1b3..41f8974 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -122,6 +122,7 @@ impl MapResponse for response::MusicPlaylist { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { // dbg!(&self); @@ -267,6 +268,7 @@ impl MapResponse for response::MusicPlaylist { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { // dbg!(&self); @@ -418,7 +420,7 @@ mod tests { let playlist: response::MusicPlaylist = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult = - playlist.map_response(id, Language::En, None).unwrap(); + playlist.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -443,7 +445,7 @@ mod tests { let playlist: response::MusicPlaylist = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult = - playlist.map_response(id, Language::En, None).unwrap(); + playlist.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/music_search.rs b/src/client/music_search.rs index eafb524..3e2389d 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -231,6 +231,7 @@ impl MapResponse for response::MusicSearch { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, crate::error::ExtractionError> { // dbg!(&self); @@ -296,6 +297,7 @@ impl MapResponse> for response::MusicSearc _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { // dbg!(&self); @@ -356,6 +358,7 @@ impl MapResponse for response::MusicSearchSuggestion { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { let mut mapper = MusicListMapper::new(lang); let mut terms = Vec::new(); @@ -419,7 +422,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult = - search.map_response("", Language::En, None).unwrap(); + search.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -442,7 +445,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - search.map_response("", Language::En, None).unwrap(); + search.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -461,7 +464,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - search.map_response("", Language::En, None).unwrap(); + search.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -480,7 +483,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - search.map_response("", Language::En, None).unwrap(); + search.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -501,7 +504,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - search.map_response("", Language::En, None).unwrap(); + search.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -521,8 +524,9 @@ mod tests { let suggestion: response::MusicSearchSuggestion = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = - suggestion.map_response("", Language::En, None).unwrap(); + let map_res: MapResult = suggestion + .map_response("", Language::En, None, None) + .unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/pagination.rs b/src/client/pagination.rs index 62cf220..57387b6 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -96,6 +96,7 @@ impl MapResponse> for response::Continuation { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let items = self .on_response_received_actions @@ -131,6 +132,7 @@ impl MapResponse> for response::MusicContinuation { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let mut mapper = MusicListMapper::new(lang); let mut continuations = Vec::new(); @@ -353,7 +355,7 @@ mod tests { let items: response::Continuation = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - items.map_response("", Language::En, None).unwrap(); + items.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -375,7 +377,7 @@ mod tests { let items: response::Continuation = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - items.map_response("", Language::En, None).unwrap(); + items.map_response("", Language::En, None, None).unwrap(); let paginator: Paginator = map_yt_paginator(map_res.c, None, ContinuationEndpoint::Browse); @@ -398,7 +400,7 @@ mod tests { let items: response::Continuation = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - items.map_response("", Language::En, None).unwrap(); + items.map_response("", Language::En, None, None).unwrap(); let paginator: Paginator = map_yt_paginator(map_res.c, None, ContinuationEndpoint::Browse); @@ -421,7 +423,7 @@ mod tests { let items: response::MusicContinuation = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - items.map_response("", Language::En, None).unwrap(); + items.map_response("", Language::En, None, None).unwrap(); let paginator: Paginator = map_ytm_paginator(map_res.c, None, ContinuationEndpoint::MusicBrowse); @@ -442,7 +444,7 @@ mod tests { let items: response::MusicContinuation = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res: MapResult> = - items.map_response("", Language::En, None).unwrap(); + items.map_response("", Language::En, None, None).unwrap(); let paginator: Paginator = map_ytm_paginator(map_res.c, None, ContinuationEndpoint::MusicBrowse); diff --git a/src/client/player.rs b/src/client/player.rs index cda8f70..4061aac 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -143,6 +143,7 @@ impl MapResponse for response::Player { id: &str, _lang: Language, deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result, ExtractionError> { let deobf = Deobfuscator::new(deobf.unwrap())?; let mut warnings = vec![]; @@ -372,7 +373,10 @@ impl MapResponse for response::Player { hls_manifest_url: streaming_data.hls_manifest_url, dash_manifest_url: streaming_data.dash_manifest_url, preview_frames, - visitor_data: self.response_context.visitor_data, + visitor_data: self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)), }, warnings, }) @@ -717,7 +721,7 @@ mod tests { let resp: response::Player = serde_json::from_reader(BufReader::new(json_file)).unwrap(); let map_res = resp - .map_response("pPvd8UxmSbQ", Language::En, Some(&DEOBF_DATA)) + .map_response("pPvd8UxmSbQ", Language::En, Some(&DEOBF_DATA), None) .unwrap(); assert!( diff --git a/src/client/playlist.rs b/src/client/playlist.rs index 18340df..bfdc03e 100644 --- a/src/client/playlist.rs +++ b/src/client/playlist.rs @@ -37,6 +37,7 @@ impl MapResponse for response::Playlist { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result, ExtractionError> { let (Some(contents), Some(header)) = (self.contents, self.header) else { return Err(response::alerts_to_err(id, self.alerts)); @@ -152,7 +153,10 @@ impl MapResponse for response::Playlist { channel, last_update, last_update_txt, - visitor_data: self.response_context.visitor_data, + visitor_data: self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)), }, warnings: mapper.warnings, }) @@ -181,7 +185,7 @@ mod tests { let playlist: response::Playlist = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res = playlist.map_response(id, Language::En, None).unwrap(); + let map_res = playlist.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/search.rs b/src/client/search.rs index 1701de9..1d9d186 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -92,6 +92,7 @@ impl MapResponse for response::Search { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result, ExtractionError> { let items = self .contents @@ -113,7 +114,10 @@ impl MapResponse for response::Search { crate::model::paginator::ContinuationEndpoint::Search, ), corrected_query: mapper.corrected_query, - visitor_data: self.response_context.visitor_data, + visitor_data: self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)), }, warnings: mapper.warnings, }) @@ -145,7 +149,8 @@ mod tests { let json_file = File::open(json_path).unwrap(); let search: response::Search = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = search.map_response("", Language::En, None).unwrap(); + let map_res: MapResult = + search.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/trends.rs b/src/client/trends.rs index cc7408f..6e3505a 100644 --- a/src/client/trends.rs +++ b/src/client/trends.rs @@ -54,6 +54,7 @@ impl MapResponse> for response::Startpage { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result>, ExtractionError> { let grid = self .contents @@ -70,7 +71,9 @@ impl MapResponse> for response::Startpage { Ok(map_startpage_videos( grid, lang, - self.response_context.visitor_data, + self.response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)), )) } } @@ -81,6 +84,7 @@ impl MapResponse> for response::Trending { _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let items = self .contents @@ -146,8 +150,9 @@ mod tests { let startpage: response::Startpage = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = - startpage.map_response("", Language::En, None).unwrap(); + let map_res: MapResult> = startpage + .map_response("", Language::En, None, None) + .unwrap(); assert!( map_res.warnings.is_empty(), @@ -169,8 +174,9 @@ mod tests { let startpage: response::Trending = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = - startpage.map_response("", Language::En, None).unwrap(); + let map_res: MapResult> = startpage + .map_response("", Language::En, None, None) + .unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/client/url_resolver.rs b/src/client/url_resolver.rs index 6b9e83b..6ca8cb6 100644 --- a/src/client/url_resolver.rs +++ b/src/client/url_resolver.rs @@ -328,6 +328,7 @@ impl MapResponse for response::ResolvedUrl { _id: &str, _lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result, ExtractionError> { let pt = self.endpoint.page_type(); if let NavigationEndpoint::Browse { diff --git a/src/client/video_details.rs b/src/client/video_details.rs index b04e806..92570cc 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -82,6 +82,7 @@ impl MapResponse for response::VideoDetails { id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + vdata: Option<&str>, ) -> Result, ExtractionError> { let mut warnings = Vec::new(); @@ -256,7 +257,10 @@ impl MapResponse for response::VideoDetails { _ => return Err(ExtractionError::InvalidData("invalid channel link".into())), }; - let visitor_data = self.response_context.visitor_data; + let visitor_data = self + .response_context + .visitor_data + .or_else(|| vdata.map(str::to_owned)); let recommended = contents .two_column_watch_next_results .secondary_results @@ -369,6 +373,7 @@ impl MapResponse> for response::VideoComments { _id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, + _vdata: Option<&str>, ) -> Result>, ExtractionError> { let received_endpoints = self.on_response_received_endpoints; let mut warnings = received_endpoints.warnings; @@ -561,7 +566,7 @@ mod tests { let details: response::VideoDetails = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res = details.map_response(id, Language::En, None).unwrap(); + let map_res = details.map_response(id, Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), @@ -581,7 +586,9 @@ mod tests { let details: response::VideoDetails = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let err = details.map_response("", Language::En, None).unwrap_err(); + let err = details + .map_response("", Language::En, None, None) + .unwrap_err(); assert!(matches!( err, crate::error::ExtractionError::NotFound { .. } @@ -597,7 +604,7 @@ mod tests { let comments: response::VideoComments = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res = comments.map_response("", Language::En, None).unwrap(); + let map_res = comments.map_response("", Language::En, None, None).unwrap(); assert!( map_res.warnings.is_empty(), diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index 83d6c51..3caffd9 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -1324,27 +1324,36 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::En | Language::EnGb | Language::EnIn => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12913932095322966823, disps: &[ - (0, 7), - (8, 12), - (5, 0), + (2, 0), + (2, 0), + (5, 18), + (4, 15), + (2, 17), ], entries: &[ - ("months", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("month", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("hours", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("days", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("years", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("day", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("month", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("y", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("days", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("seconds", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mo", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("hours", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("w", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("years", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("months", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("weeks", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hour", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("year", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("hour", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index 6bca334..d58d03a 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -754,7 +754,14 @@ "week": "W", "weeks": "W", "year": "Y", - "years": "Y" + "years": "Y", + "y": "Y", + "mo": "M", + "w": "W", + "d": "D", + "h": "h", + "min": "m", + "s": "s" }, "date_order": "DY", "months": { diff --git a/tests/youtube.rs b/tests/youtube.rs index bd5e1e3..3aacb2f 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2336,7 +2336,12 @@ fn lang() -> Language { /// Get a new RustyPipe instance #[fixture] fn rp(lang: Language) -> RustyPipe { - RustyPipe::builder().strict().lang(lang).build() + let vdata = std::env::var("YT_VDATA").ok(); + RustyPipe::builder() + .strict() + .lang(lang) + .visitor_data_opt(vdata) + .build() } /// Get a flag signaling if the language is set to English From 0cd018e37a5bbca4e179451035ce8e3a53e99b23 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 31 May 2023 01:41:46 +0200 Subject: [PATCH 008/459] fix: add dictionary support for short timeago strings --- codegen/src/collect_video_dates.rs | 83 + codegen/src/main.rs | 5 + src/util/dictionary.rs | 2145 +++++----- src/util/mod.rs | 30 +- src/util/timeago.rs | 212 +- testfiles/dict/cldr_data/.gitignore | 2 + testfiles/dict/cldr_data/collect_ta_tokens.js | 162 + testfiles/dict/cldr_data/package.json | 12 + testfiles/dict/dictionary.json | 1863 +++++---- testfiles/dict/timeago_samples_short.json | 3488 +++++++++++++++++ 10 files changed, 6308 insertions(+), 1694 deletions(-) create mode 100644 codegen/src/collect_video_dates.rs create mode 100644 testfiles/dict/cldr_data/.gitignore create mode 100644 testfiles/dict/cldr_data/collect_ta_tokens.js create mode 100644 testfiles/dict/cldr_data/package.json create mode 100644 testfiles/dict/timeago_samples_short.json diff --git a/codegen/src/collect_video_dates.rs b/codegen/src/collect_video_dates.rs new file mode 100644 index 0000000..cff90e5 --- /dev/null +++ b/codegen/src/collect_video_dates.rs @@ -0,0 +1,83 @@ +use std::{ + collections::{BTreeMap, HashSet}, + fs::File, +}; + +use futures::{stream, StreamExt}; +use path_macro::path; +use rustypipe::{ + client::{RustyPipe, RustyPipeQuery}, + param::{Language, LANGUAGES}, +}; + +use crate::util::DICT_DIR; + +pub async fn collect_video_dates(concurrency: usize) { + let json_path = path!(*DICT_DIR / "timeago_samples_short.json"); + let rp = RustyPipe::builder() + .visitor_data("Cgtwel9tMkh2eHh0USiyzc6jBg%3D%3D") + .build(); + + let channels = [ + "UCeY0bbntWzzVIaj2z3QigXg", + "UCcmpeVbSSQlZRvHfdC-CRwg", + "UC65afEgL62PGFWXY7n6CUbA", + "UCEOXxzW2vU0P-0THehuIIeg", + ]; + + let mut lang_strings: BTreeMap> = BTreeMap::new(); + for lang in LANGUAGES { + println!("{lang}"); + let query = rp.query().lang(lang); + let strings = stream::iter(channels) + .map(|id| get_channel_datestrings(&query, id)) + .buffered(concurrency) + .collect::>() + .await + .into_iter() + .flatten() + .collect::>(); + lang_strings.insert(lang, strings); + } + + let mut en_strings_uniq: HashSet<&str> = HashSet::new(); + let mut uniq_ids: HashSet = HashSet::new(); + + lang_strings[&Language::En] + .iter() + .enumerate() + .for_each(|(n, s)| { + if en_strings_uniq.insert(s) { + uniq_ids.insert(n); + } + }); + + let strings_map = lang_strings + .iter() + .map(|(lang, strings)| { + ( + lang, + strings + .iter() + .enumerate() + .filter(|(n, _)| uniq_ids.contains(n)) + .map(|(_, s)| s) + .collect::>(), + ) + }) + .collect::>(); + + let file = File::create(json_path).unwrap(); + serde_json::to_writer_pretty(file, &strings_map).unwrap(); +} + +async fn get_channel_datestrings(rp: &RustyPipeQuery, id: &str) -> Vec { + let channel = rp.channel_videos(id).await.unwrap(); + + channel + .content + .items + .into_iter() + .filter_map(|itm| itm.publish_date_txt) + .collect() +} diff --git a/codegen/src/main.rs b/codegen/src/main.rs index e61a78f..bbc8fa8 100644 --- a/codegen/src/main.rs +++ b/codegen/src/main.rs @@ -4,6 +4,7 @@ mod abtest; mod collect_album_types; mod collect_large_numbers; mod collect_playlist_dates; +mod collect_video_dates; mod collect_video_durations; mod download_testfiles; mod gen_dictionary; @@ -27,6 +28,7 @@ enum Commands { CollectLargeNumbers, CollectAlbumTypes, CollectVideoDurations, + CollectVideoDates, ParsePlaylistDates, ParseLargeNumbers, ParseAlbumTypes, @@ -60,6 +62,9 @@ async fn main() { Commands::CollectVideoDurations => { collect_video_durations::collect_video_durations(cli.concurrency).await; } + Commands::CollectVideoDates => { + collect_video_dates::collect_video_dates(cli.concurrency).await; + } Commands::ParsePlaylistDates => collect_playlist_dates::write_samples_to_dict(), Commands::ParseLargeNumbers => collect_large_numbers::write_samples_to_dict(), Commands::ParseAlbumTypes => collect_album_types::write_samples_to_dict(), diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index 3caffd9..9d29edc 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -57,26 +57,32 @@ pub(crate) fn entry(lang: Language) -> Entry { match lang { Language::Af => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 8694567506910003252, disps: &[ - (4, 0), - (6, 5), - (7, 2), + (17, 14), + (4, 2), + (0, 0), + (6, 6), ], entries: &[ - ("maande", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("j.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("w.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekonde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("md.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("maande", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dae", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("u.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("weke", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ure", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dae", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekonde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -148,30 +154,31 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Am => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 15467950696543387533, disps: &[ - (2, 0), + (2, 11), + (2, 2), + (8, 4), (0, 0), - (6, 2), - (0, 11), ], entries: &[ + ("ደቂቃ፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ሳምንታት", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ዓመታት", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ዓመት", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ወር", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ሰዓቶች", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ደቂቃዎች፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ወራት", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ሰከንድ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ሳምንት", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ሰዓቶች", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ቀን", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ደቂቃዎች", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ሰዓት", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ዓመት", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ዓመታት", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("ሰከንዶች", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ቀናት", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ወር", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ቀኖች", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ደቂቃ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ደቂቃዎች", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ደቂቃ፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ሰዓት", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ቀን", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ሰከንድ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ወራት", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ደቂቃዎች፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -244,44 +251,46 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ar => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 2980949210194914378, disps: &[ - (1, 6), - (0, 21), - (1, 15), - (1, 23), - (2, 10), - (2, 0), + (1, 0), + (0, 3), + (2, 26), + (1, 11), + (25, 3), + (9, 5), ], entries: &[ - ("دقيقة", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("أسابيع", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("دقيقتين", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), - ("شهر\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("دقائق", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("دقيقتان", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), - ("سنتين", TaToken { n: 2, unit: Some(TimeUnit::Year) }), - ("ساعات", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("وثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ثوان", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("وثانيتان", TaToken { n: 2, unit: Some(TimeUnit::Second) }), - ("أسبوعين", TaToken { n: 2, unit: Some(TimeUnit::Week) }), - ("ساعة", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ثانيتين", TaToken { n: 2, unit: Some(TimeUnit::Second) }), - ("شهرين", TaToken { n: 2, unit: Some(TimeUnit::Month) }), ("يوم\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("سنة", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("ثوان\u{650}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("سنوات", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("أيام", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ساعتين", TaToken { n: 2, unit: Some(TimeUnit::Hour) }), + ("ساعات", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("دقائق", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("شهرين", TaToken { n: 2, unit: Some(TimeUnit::Month) }), ("أشهر", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ساعة", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("يوم", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ثوان", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("دقيقة", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("يومين", TaToken { n: 2, unit: Some(TimeUnit::Day) }), + ("ثانيتين", TaToken { n: 2, unit: Some(TimeUnit::Second) }), + ("أسبوعين", TaToken { n: 2, unit: Some(TimeUnit::Week) }), + ("دقيقتين", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), + ("سنوات", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("دقيقتان", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), + ("سنة", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("أسابيع", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("خلال", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("شهر\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("شهر", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("وثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("سنتين", TaToken { n: 2, unit: Some(TimeUnit::Year) }), + ("ساعتين", TaToken { n: 2, unit: Some(TimeUnit::Hour) }), + ("أسبوع\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("أيام", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("أسبوع", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ثوان\u{64d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("يومين", TaToken { n: 2, unit: Some(TimeUnit::Day) }), - ("شهر", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("وثانيتان", TaToken { n: 2, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -467,10 +476,8 @@ pub(crate) fn entry(lang: Language) -> Entry { (0, 0), ], entries: &[ - ("güncəlləndi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("bugün", TaToken { n: 0, unit: Some(TimeUnit::Day) }), ("dünən", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("güncəllənib", TaToken { n: 0, unit: Some(TimeUnit::Day) }), + ("bugün", TaToken { n: 0, unit: Some(TimeUnit::Day) }), ], }, comma_decimal: true, @@ -509,42 +516,50 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Be => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 12913932095322966823, disps: &[ - (1, 19), - (15, 14), - (1, 2), - (12, 0), - (2, 10), + (0, 28), (0, 0), + (0, 0), + (4, 25), + (28, 5), + (11, 16), + (1, 16), ], entries: &[ - ("тыдзень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("дзень", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("месяцаў", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("тыдня", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("тыдні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("хвілін", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("гадзіну", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("гадз", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("дзён", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("тыдняў", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("гадзіны", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("месяцы", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("дзён", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("тыдні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("хвіліну", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("хвілін", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("мес.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("хв", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("г.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("дзень", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("гадзін", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("месяцаў", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("гады", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("гадзіну", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("гадоў", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("хвіліны", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("хвіліна", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("гады", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("тыдня", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("месяцы", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("тыдзень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("тыд", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("хвіліна", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -617,27 +632,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Bg => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12213676231523076107, disps: &[ - (2, 0), - (7, 12), - (5, 10), + (0, 0), + (17, 15), + (0, 5), + (6, 18), ], entries: &[ - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("дни", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("г.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("дни", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("седм.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("м.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -786,33 +808,42 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Bs => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12913932095322966823, disps: &[ - (7, 18), - (4, 0), - (4, 3), - (7, 9), + (0, 17), + (4, 17), + (0, 17), + (1, 13), + (9, 0), + (1, 26), ], entries: &[ - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sedmice", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mjesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mjeseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("sedmicu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mjesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mj.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mjeseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sedmica", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("god.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sed.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sedmice", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, @@ -886,27 +917,32 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ca => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 12913932095322966823, disps: &[ - (6, 7), - (2, 9), (0, 0), + (7, 4), + (2, 0), + (10, 3), ], entries: &[ - ("setmanes", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("any", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dies", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("setmana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("segon", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mesos", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("hores", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("minuts", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("segons", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("anys", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("any", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dies", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mesos", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("setm.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("anys", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("hores", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("setmanes", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("setmana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -978,36 +1014,50 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Cs => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (1, 0), - (1, 7), - (14, 20), - (1, 11), - (1, 20), + (0, 6), + (0, 0), + (0, 3), + (2, 1), + (6, 13), + (31, 18), + (3, 19), ], entries: &[ - ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("měsícem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("měsíci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("týdnem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minutou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("lety", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("rokem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("týdny", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dne", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("hodinami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("roky", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("dny", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("měsíci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("týd.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("r.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("roky", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("rokem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("měs.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("měsícem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("týdne", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("l.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("lety", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("měsíce", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("týdnem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("hodiny", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dny", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -1063,26 +1113,31 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Da => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (6, 0), - (0, 7), - (12, 11), + (5, 0), + (5, 13), + (0, 12), + (1, 10), ], entries: &[ ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dage", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("time", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mdr.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("time", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("md.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("måneder", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("uger", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("uge", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("måneder", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1154,27 +1209,31 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::De => Entry { timeago_tokens: ::phf::Map { - key: 345707026197253659, + key: 15467950696543387533, disps: &[ - (9, 13), - (3, 0), - (3, 6), + (3, 4), + (0, 0), + (4, 3), + (1, 12), ], entries: &[ - ("woche", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("jahr", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("monat", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("wochen", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuten", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("monaten", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekunden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("stunden", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("jahren", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("tag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("stunde", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("jahren", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("tagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("std.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("monaten", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("wochen", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("monat", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minuten", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekunden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("tag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("jahr", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("woche", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -1231,27 +1290,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::El => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 7485420634051515786, disps: &[ - (0, 0), - (7, 11), - (2, 7), + (1, 10), + (1, 5), + (1, 0), + (0, 5), ], entries: &[ - ("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("εβδομάδα", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ημέρα", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("λεπ.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ημέρες", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("έτος", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ώρες", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("έτη", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("δευτερόλεπτο", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("δευτερόλεπτα", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("εβδομάδα", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("λεπτό", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ώ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ημ.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("δευτ.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("εβδομάδες", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("μήνες", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ημέρα", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("έτη", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("λεπτό", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("έτος", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("εβδ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("μήνα", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ώρα", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("δευτερόλεπτο", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ώρες", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("δευτερόλεπτα", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1324,36 +1389,42 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::En | Language::EnGb | Language::EnIn => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 7485420634051515786, disps: &[ - (2, 0), - (2, 0), - (5, 18), - (4, 15), - (2, 17), + (5, 3), + (1, 24), + (1, 16), + (0, 2), + (0, 0), + (3, 22), ], entries: &[ - ("day", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("month", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("years", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("y", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("days", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("seconds", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mo", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("hours", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("w", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("years", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("months", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("day", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("yr", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("hours", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mo", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("weeks", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("wk", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("hr", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("year", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("w", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("hour", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("month", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("months", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("days", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1430,25 +1501,32 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 10121458955350035957, disps: &[ - (8, 9), - (2, 0), - (7, 5), + (5, 2), + (19, 19), + (1, 0), + (0, 0), ], entries: &[ - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("años", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("años", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1520,25 +1598,31 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 10121458955350035957, disps: &[ - (8, 9), - (2, 0), - (7, 5), + (4, 2), + (11, 2), + (6, 0), + (5, 0), ], entries: &[ - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("años", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1610,29 +1694,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Et => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12213676231523076107, disps: &[ - (0, 1), - (0, 0), - (0, 3), - (5, 10), + (3, 0), + (1, 0), + (3, 9), + (6, 17), ], entries: &[ - ("nädalat", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("nädala", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("aastat", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("tunni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("kuu", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("kuud", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("nädal", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("päev", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekundit", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("aasta", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("nädala", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("nädal", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("p", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("t", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("kuu", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("tunni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("näd", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("aasta", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("kuud", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("päev", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("a", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundit", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("päeva", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, @@ -1706,22 +1794,19 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Eu => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (1, 9), (0, 0), + (1, 5), ], entries: &[ - ("egun", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("astebete", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hilabete", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("urtebete", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("aste", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("urte", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ordu", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ordubete", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("urte", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("egun", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("hilabete", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -1878,27 +1963,36 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Fi => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 10121458955350035957, disps: &[ - (2, 13), + (1, 6), + (2, 4), (0, 0), - (0, 11), + (4, 7), + (0, 1), ], entries: &[ - ("päivä", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("kuukausi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minuuttia", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("viikko", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tunti", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("vuotta", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("kk", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekunti", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("vk", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("vuosi", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("t", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sekuntia", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("kuukautta", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("tunti", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("vuosi", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuutti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("vuotta", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("v", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("tuntia", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("pv", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("viikkoa", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("päivä", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("kuukausi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuutti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minuuttia", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("päivää", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunti", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("viikko", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -1957,19 +2051,21 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Fil => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12913932095322966823, disps: &[ - (0, 0), - (0, 2), + (2, 2), + (7, 0), ], entries: &[ - ("araw", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("buwan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("seg.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("taon", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("linggo", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("oras", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("buwan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("taon", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("araw", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("linggo", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2041,26 +2137,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Fr | Language::FrCa => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 1937371814602216758, disps: &[ - (12, 3), - (2, 11), - (2, 0), + (6, 5), + (9, 7), + (4, 0), + (0, 3), ], entries: &[ - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("semaine", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("jour", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mois", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("semaines", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("jours", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("heures", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("secondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("j", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ans", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("jours", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("secondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mois", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("jour", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("semaine", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("heures", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("m.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("heure", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2138,27 +2241,32 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Gl => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (12, 6), - (3, 9), - (1, 0), + (0, 0), + (8, 9), + (11, 7), + (7, 3), ], entries: &[ - ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2229,18 +2337,19 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Gu => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (1, 0), - (3, 0), + (7, 1), + (4, 0), ], entries: &[ - ("સ\u{ac7}ક\u{a82}ડ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("દિવસ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("મહિના", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("વર\u{acd}ષ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("અઠ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("અઠવાડિયા", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("મિનિટ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("મહિના", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("દિવસ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("સ\u{ac7}ક\u{a82}ડ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("વર\u{acd}ષ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("કલાક", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, @@ -2313,19 +2422,22 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Hi => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 12213676231523076107, disps: &[ - (0, 5), (2, 0), + (1, 8), ], entries: &[ - ("वर\u{94d}ष", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("माह", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("सप\u{94d}ताह", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("स\u{947}क\u{902}ड", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("दिन", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("घ\u{902}ट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("मिनट", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("सप\u{94d}ताह", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("वर\u{94d}ष", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("माह", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("घ\u{902}॰", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("दिन", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("मि॰", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("स\u{947}॰", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("स\u{947}क\u{902}ड", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2399,34 +2511,43 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Hr => Entry { timeago_tokens: ::phf::Map { - key: 4066803471364472071, + key: 12913932095322966823, disps: &[ - (3, 3), - (3, 4), - (0, 0), - (1, 3), + (5, 26), + (0, 10), + (0, 10), + (0, 8), + (2, 0), + (0, 12), ], entries: &[ - ("tjedna", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tj.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("mjeseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("tjedan", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("tjedna", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("tjedana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("mjesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("g.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mj.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2597,17 +2718,23 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (2, 3), - (1, 0), + (4, 2), + (3, 6), + (2, 0), ], entries: &[ - ("վայրկյան", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("շաբաթ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("օր", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ամիս", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("րոպե", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ժամ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("տարի", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ժ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ժամ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("տ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("վրկ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("շաբաթ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("վայրկյան", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("շաբ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("օր", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ր", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("րոպե", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ամիս", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2683,17 +2810,24 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 10121458955350035957, disps: &[ - (0, 0), - (4, 1), + (1, 0), + (5, 3), + (4, 5), ], entries: &[ + ("mgg", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("bln", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("detik", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("menit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minggu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mnt", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("bulan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("hari", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("jam", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minggu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("bulan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("thn", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dtk", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("tahun", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("menit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2766,32 +2900,37 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Is => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (2, 0), - (1, 6), - (5, 16), - (4, 6), + (0, 0), + (4, 15), + (8, 13), + (0, 2), + (12, 7), ], entries: &[ - ("vikum", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("degi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mínútum", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mínúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mánuðum", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mínútu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("klukkustundum", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekúndum", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekúnda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("árum", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mínútur", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("klst.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ári", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("dögum", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekúndur", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mánuði", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("viku", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("klukkustund", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekúnda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mínútu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mín.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mínúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("árum", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mínútum", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mán.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mánuðum", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekúndum", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mínútur", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("viku", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sekúndu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("vikum", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekúndur", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("klukkustundum", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dögum", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mánuði", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("degi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2866,27 +3005,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::It => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 10121458955350035957, disps: &[ - (2, 3), - (0, 0), - (6, 12), + (0, 10), + (3, 19), + (6, 0), + (8, 16), ], entries: &[ - ("mese", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("giorni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("settimane", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("anni", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sett.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("giorno", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("mesi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("secondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("gg", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("anni", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sec.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("anno", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("secondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("settimana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("g", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("settimane", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("giorni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mese", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2958,35 +3104,39 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Iw => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 2980949210194914378, disps: &[ + (1, 24), + (1, 11), (2, 0), - (0, 15), - (2, 10), - (3, 6), - (0, 2), + (23, 19), + (16, 16), ], entries: &[ - ("שנתיים", TaToken { n: 2, unit: Some(TimeUnit::Year) }), - ("דקות", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("שעה", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("שבועיים", TaToken { n: 2, unit: Some(TimeUnit::Week) }), - ("שניה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("שנייה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("שעות", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("שתי", TaToken { n: 2, unit: None }), - ("יום", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("שבוע", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ימים", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("שנים", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("חודשים", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("שניות", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("חודשיים", TaToken { n: 2, unit: Some(TimeUnit::Month) }), + ("אתמול", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("חודש", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("שבועות", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("דקה", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("שנה", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("יומיים", TaToken { n: 2, unit: Some(TimeUnit::Day) }), + ("חודשיים", TaToken { n: 2, unit: Some(TimeUnit::Month) }), + ("שבועיים", TaToken { n: 2, unit: Some(TimeUnit::Week) }), + ("שע׳", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("שב׳", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("שנייה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("שנים", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("יום", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("שעות", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("שבוע", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("דקות", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("שניה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("שנה", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("דקה", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ימים", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("שנתיים", TaToken { n: 2, unit: Some(TimeUnit::Year) }), + ("דק׳", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("שניות", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("חודשים", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("שעתיים", TaToken { n: 2, unit: Some(TimeUnit::Hour) }), ], }, @@ -3086,11 +3236,11 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_nd_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 0), + (1, 0), ], entries: &[ - ("日", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("本", TaToken { n: 0, unit: Some(TimeUnit::Day) }), + ("昨", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, comma_decimal: false, @@ -3129,18 +3279,23 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 14108922650502679131, disps: &[ - (1, 0), + (3, 0), (0, 3), + (6, 0), ], entries: &[ + ("წამი", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("კვირის", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("საათის", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("წმ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("წლის", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("კვ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("წუთის", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("სთ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("თვის", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("დღის", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("წუთი", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("საათის", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("წლის", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("წამი", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("თვის", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("წთ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("წამის", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, @@ -3214,19 +3369,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Kk => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12913932095322966823, disps: &[ - (0, 3), - (2, 0), + (0, 1), + (3, 0), + (2, 7), ], entries: &[ - ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("сағат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ж.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("сағ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ап.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("сағат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -3385,31 +3546,32 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Kn => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12913932095322966823, disps: &[ - (0, 4), - (8, 2), - (8, 0), - (0, 2), + (2, 1), + (1, 10), + (1, 0), + (1, 11), ], entries: &[ - ("ನ\u{cbf}ಮ\u{cbf}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ತ\u{cbf}ಂಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷವು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ಸ\u{cc6}ಕ\u{cc6}ಂಡ\u{ccd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ವರ\u{ccd}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ತ\u{cbf}ಂಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ಗಂಟ\u{cc6}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ದ\u{cbf}ನದ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ದ\u{cbf}ನಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ವಾರಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ನ\u{cbf}ಮ\u{cbf}ಷವು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ತ\u{cbf}ಂಗಳುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ವಾರದ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ಗಂಟ\u{cc6}ಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ವರ\u{ccd}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ವಾರಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ಗಂಟ\u{cc6}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ತ\u{cbf}ಂಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ದ\u{cbf}ನಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ದ\u{cbf}ನದ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ಗಂಟ\u{cc6}ಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ವಾರದ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ತ\u{cbf}ಂಗಳುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -3551,19 +3713,24 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ky => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 15467950696543387533, disps: &[ - (3, 3), + (3, 4), + (2, 2), (0, 0), ], entries: &[ - ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("мүнөт", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("саат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("мүнөт", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("саат.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("мүн.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("апт.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -3636,21 +3803,27 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Lo => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 8694567506910003252, disps: &[ - (2, 0), - (2, 0), + (8, 0), + (7, 5), + (0, 2), ], entries: &[ ("ນາທ\u{eb5}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ຊ\u{ebb}\u{ec8}ວໂມງກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ວ\u{eb4}ນາທ\u{eb5}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ນາທ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ມ\u{eb7}\u{ec9}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ອາທ\u{eb4}ດກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ຊມ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ວ\u{eb4}ນາທ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ເດ\u{eb7}ອນກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ຊ\u{ebb}\u{ec8}ວໂມງກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ດ.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ປ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ອທ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ນາທ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ນທ.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ອາທ\u{eb4}ດກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ວ\u{eb4}.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ວ\u{eb4}ນາທ\u{eb5}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -3724,40 +3897,52 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Lt => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 7485420634051515786, disps: &[ - (0, 0), - (3, 23), - (18, 5), - (3, 9), - (2, 17), + (10, 3), + (8, 4), + (1, 15), + (1, 29), + (5, 0), + (0, 30), + (10, 17), ], entries: &[ - ("valandas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("savaičių", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minučių", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dienų", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekundės", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mėnesį", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundė", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("valandų", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundžių", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minutės", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("dieną", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("metų", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mėnesių", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("savaitę", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("valandą", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("metus", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mėnesius", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("minutė", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dieną", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("valandas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dienų", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekundė", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("savaitės", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundžių", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mėnesių", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mėnesius", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("valandą", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutės", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minučių", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("sekundę", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("savaitę", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("metus", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("val.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mėn.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mėnesio", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mėnesį", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("valandų", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("valandos", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dienos", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sav.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("m.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundės", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("savaites", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("savaičių", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("metų", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], @@ -3815,32 +4000,40 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Lv => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 7485420634051515786, disps: &[ - (2, 4), + (3, 3), + (17, 11), + (1, 1), (5, 0), - (0, 17), - (5, 6), + (10, 17), ], entries: &[ - ("gada", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunžu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekundēm", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("gadiem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mēneša", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("nedēļas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("stundām", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minūšu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minūtes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("nedēļām", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekunžu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minūtēm", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dienām", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("stundas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minūte", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ned.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("st.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("nedēļām", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("g.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("nedēļas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mēneša", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("gada", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minūšu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("mēnešiem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("stundām", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minūte", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("stundas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundēm", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("dienām", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mēn.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minūtes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("gadiem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minūtēm", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -3915,24 +4108,28 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 15467950696543387533, disps: &[ - (1, 11), - (11, 0), - (2, 7), + (0, 11), + (11, 7), + (2, 9), + (2, 0), ], entries: &[ - ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("дена", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("год.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, @@ -4076,21 +4273,26 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Mn => Entry { timeago_tokens: ::phf::Map { - key: 2126027241312876569, + key: 12913932095322966823, disps: &[ - (6, 6), - (0, 0), + (1, 2), + (2, 0), + (1, 1), ], entries: &[ - ("өдрийн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("секундын", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("цагийн", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("жилийн", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("хоногийн", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("минутын", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("сарын", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("өдрийн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("хоногийн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("жилийн", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("цагийн", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ц", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("долоо", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("минутын", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секундын", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], @@ -4148,31 +4350,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Mr => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (0, 0), - (0, 8), - (7, 4), - (1, 6), + (7, 3), + (15, 0), + (0, 13), + (1, 0), ], entries: &[ - ("दिवसाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("महिन\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("दिवसा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("आठवड\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("मिनिटाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("स\u{947}क\u{902}द", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("तासा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("स\u{947}क\u{902}दा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("मिनिटा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("महिन\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("स\u{947}क\u{902}दाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("मिनिट", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("आठवड\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("वर\u{94d}षाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("मिनिट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("तासाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("वर\u{94d}षा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("मिनिट", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("महिन\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("आठवड\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("स\u{947}क\u{902}दाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("तासाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("महिन\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("स\u{947}.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("दिवसाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("मिनिटाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("स\u{947}क\u{902}दा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("मिनि.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("दिवसा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("मिनिटा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("स\u{947}क\u{902}द", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("मिनिट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("वर\u{94d}षाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("तासा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("आठवड\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4247,19 +4451,24 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ms => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 12913932095322966823, disps: &[ - (3, 0), - (0, 1), + (3, 10), + (0, 0), + (10, 9), ], entries: &[ - ("hari", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("tahun", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("saat", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("bulan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minggu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("tahun", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mgu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("jam", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("bln", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minggu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("bulan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("thn", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("hari", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4510,25 +4719,28 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Nl => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 12213676231523076107, disps: &[ - (8, 0), - (2, 10), - (2, 6), + (3, 9), + (7, 7), + (1, 0), ], entries: &[ - ("weken", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("seconden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("maanden", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("minuten", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("maanden", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("weken", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sec.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dgn", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("seconden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4600,27 +4812,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::No => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12213676231523076107, disps: &[ - (0, 0), - (0, 0), - (5, 6), + (0, 2), + (3, 14), + (8, 14), + (12, 0), ], entries: &[ - ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("t", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("u.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("md.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minutt", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("døgn", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("uker", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("måneder", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dager", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("time", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dager", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("uker", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("uke", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("måneder", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4695,20 +4914,27 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Or => Entry { timeago_tokens: ::phf::Map { - key: 1937371814602216758, + key: 12913932095322966823, disps: &[ - (0, 7), - (5, 0), + (11, 1), + (7, 1), + (1, 0), ], entries: &[ - ("ସେକେଣ\u{b4d}ଡ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}\u{200c}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ଦ\u{b3f}ନ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ବର\u{b4d}ଷ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ମ\u{b3e}ସ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ଘଣ\u{b4d}ଟ\u{b3e}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ବ.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ଘ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ସପ\u{b4d}ତ\u{b3e}ହ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ମ\u{b3f}.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ବର\u{b4d}ଷ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ଦ\u{b3f}ନ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ସପ\u{b4d}ତ\u{b3e}.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ସେକେଣ\u{b4d}ଡ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ମ\u{b3e}.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ସେ.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ମ\u{b3e}ସ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}\u{200c}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ଘଣ\u{b4d}ଟ\u{b3e}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4877,36 +5103,49 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Pl => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 14108922650502679131, disps: &[ - (1, 0), - (1, 20), - (0, 16), - (6, 15), - (9, 5), + (0, 30), + (3, 11), + (1, 6), + (0, 0), + (7, 0), + (10, 5), + (26, 5), ], entries: &[ - ("sekundę", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("lat", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("rok", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("miesiące", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("miesięcy", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("tydzień", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("godzin", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("tygodnie", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("miesiące", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("godziny", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("miesięcy", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("miesiąc", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("tygodnia", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("dzień", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("tydz.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tygodnie", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundę", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("lat", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mies.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("lata", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("rok", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("godzinę", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("godziny", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("miesiąc", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("lata", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("miesiąca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("godz.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("godzin", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dnia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("tydzień", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tyg.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tygodni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4979,27 +5218,32 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Pt => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 14108922650502679131, disps: &[ - (6, 9), + (1, 13), + (0, 14), (0, 0), - (2, 6), + (3, 17), ], entries: &[ - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("seg.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5072,27 +5316,32 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::PtPt => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 7485420634051515786, disps: &[ - (6, 9), - (0, 0), - (2, 6), + (4, 15), + (0, 5), + (2, 0), + (2, 1), ], entries: &[ - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -5148,27 +5397,32 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ro => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 15467950696543387533, disps: &[ - (0, 0), - (4, 2), (0, 6), + (3, 2), + (12, 4), + (4, 0), ], entries: &[ + ("sec.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("lună", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("săptămână", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("luni", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("oră", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("lună", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("zi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("săptămâni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("secunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("săpt.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("oră", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("zile", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("secundă", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("săptămâni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("zi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5243,35 +5497,46 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (2, 0), - (0, 18), - (0, 9), - (7, 3), - (16, 13), + (25, 1), + (0, 0), + (0, 12), + (3, 1), + (5, 14), + (0, 1), + (27, 10), ], entries: &[ + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("дн.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("г.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("неделю", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("нед.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("дней", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("часов", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("недель", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("минуту", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("мес.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("л.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("лет", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("недели", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("месяцев", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("лет", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("минуты", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("неделю", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("дней", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("минуту", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("часов", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("месяцев", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5429,32 +5694,46 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 15467950696543387533, disps: &[ + (0, 14), (0, 0), - (1, 8), - (1, 1), - (0, 17), + (0, 3), + (0, 5), + (5, 21), + (16, 5), + (4, 10), ], entries: &[ - ("minútou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minút", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("týždňami", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("týždňom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mes.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mesiacmi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("sekúnd", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("hodinami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mesiacom", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("týž.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dňa", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("rokom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minútami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minúty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mesiacmi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dňom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("dňami", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("rokmi", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mesiacom", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("roka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("týždňami", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minútami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minútou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dňom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minúty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("týždňa", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("r.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dňami", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minút", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("týždňom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mesiaca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -5512,46 +5791,51 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sl => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 14108922650502679131, disps: &[ - (1, 2), - (5, 22), - (2, 4), - (0, 22), - (13, 22), - (2, 0), + (7, 9), + (0, 0), + (0, 3), + (0, 11), + (7, 26), + (0, 6), + (1, 17), ], entries: &[ - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("tednom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("dnevom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mesecema", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekundama", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dnevi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("letom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("letoma", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minutama", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("tedni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ted.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("urama", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dnevoma", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("tednoma", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("urami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dnevoma", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("uro", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dnevi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mesecem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mesecema", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutama", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("letoma", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("letom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("tednom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("urama", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dnevom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mes.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("tednoma", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("tedni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("urami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("leti", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekundama", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mesecem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5624,22 +5908,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sq => Entry { timeago_tokens: ::phf::Map { - key: 471159234146692604, + key: 15467950696543387533, disps: &[ - (8, 0), - (1, 3), + (1, 7), + (3, 10), + (2, 0), ], entries: &[ - ("sekonda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("orë", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("vit", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ditë", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("muaj", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekonda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("javë", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekondë", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("vit", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("minutë", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekondë", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("vjet", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ditë", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("orë", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5712,32 +5999,36 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sr => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 12913932095322966823, disps: &[ - (16, 6), - (3, 0), - (14, 6), - (5, 13), + (1, 20), + (7, 11), + (5, 0), + (2, 5), + (1, 13), ], entries: &[ - ("секунде", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("дана", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("недеље", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("дана", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("недеља", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("сати", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("сат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("недељу", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("дан", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("године", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("годину", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("нед.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("недеље", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("сата", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("секунде", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("године", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("д.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("мес.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("год.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ч.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -5795,31 +6086,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::SrLatn => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (3, 0), - (2, 9), - (1, 4), (0, 0), + (4, 16), + (1, 12), + (4, 19), + (2, 15), ], entries: &[ - ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("nedelju", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("nedelje", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("meseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("god.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("nedelje", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mes.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ned.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("č.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("nedelja", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], @@ -5879,26 +6173,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sv => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12213676231523076107, disps: &[ - (2, 11), - (2, 0), - (9, 1), + (9, 3), + (6, 13), + (8, 17), + (1, 0), ], entries: &[ - ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("månader", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("timmar", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dagar", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("vecka", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("månad", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("veckor", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("timme", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minuter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("månader", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mån.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("tim", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("vecka", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("månad", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dagar", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("v.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minuter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("veckor", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("timme", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("timmar", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6057,31 +6358,37 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ta => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 12913932095322966823, disps: &[ - (5, 3), - (2, 13), - (11, 0), - (1, 10), + (0, 6), + (3, 0), + (20, 14), + (4, 0), + (5, 17), ], entries: &[ - ("விந\u{bbe}டிகள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ம\u{bbe}தத\u{bcd}துக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("விந\u{bbe}டிகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("நிமிடங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ஆண\u{bcd}டிற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("நிமிடங\u{bcd}கள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("வ\u{bbe}ரங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("விந\u{bbe}டி", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("வ\u{bbe}ரத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ஆண\u{bcd}டுகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ம\u{bbe}தங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ந\u{bbe}ளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("வ\u{bbe}ரம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("மணிநேரம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ந\u{bbe}ட\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("வ\u{bbe}ரங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("நிமி.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("நிமிடம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("நிமிடங\u{bcd}கள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ந\u{bbe}ளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("விந\u{bbe}டிகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("விந\u{bbe}.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ஆண\u{bcd}டிற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("மணிநேரம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("விந\u{bbe}டிகள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ம\u{bbe}த.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("விந\u{bbe}டிக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ந\u{bbe}ட\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("விந\u{bbe}டி", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ம\u{bbe}தத\u{bcd}துக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("நிமிடங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("வ\u{bbe}ர.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("மணி.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ம\u{bbe}தங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6153,30 +6460,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Te => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 8694567506910003252, disps: &[ - (1, 4), - (1, 0), - (5, 0), - (9, 14), + (0, 0), + (2, 16), + (1, 2), + (3, 18), ], entries: &[ - ("వ\u{c3e}రం", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ర\u{c4b}జుల", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("గంట", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("వ\u{c3e}ర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("సంవత\u{c4d}సర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("స\u{c46}కన\u{c4d}ల", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("న\u{c3f}మ\u{c3f}షం", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ర\u{c4b}జు", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("న\u{c46}ల", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("స\u{c46}కన\u{c4d}లు", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("సంవత\u{c4d}సరం", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("న\u{c3f}మ\u{c3f}ష\u{c3e}లు", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("స\u{c46}కను", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("స\u{c46}క.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("గంటల", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("న\u{c3f}మ\u{c3f}ష\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("న\u{c3f}మ\u{c3f}ష\u{c3e}లు", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("న\u{c46}ల", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("గం.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("సం.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("స\u{c46}కన\u{c4d}ల", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ర\u{c4b}జుల", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("స\u{c46}కను", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("సంవత\u{c4d}సరం", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("న\u{c46}లల", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("న\u{c3f}మ\u{c3f}.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("గంట", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("సంవత\u{c4d}సర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ర\u{c4b}జు", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("వ\u{c3e}రం", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("వ\u{c3e}ర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("న\u{c3f}మ\u{c3f}ష\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("స\u{c46}కన\u{c4d}లు", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("న\u{c3f}మ\u{c3f}షం", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6249,22 +6560,30 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Th => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 8694567506910003252, disps: &[ + (0, 4), (0, 0), - (8, 2), + (5, 14), + (0, 15), ], entries: &[ - ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ว\u{e34}นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ช\u{e31}\u{e48}วโมงท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ชม.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ว\u{e34}นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ว\u{e31}นท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ป\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("เด\u{e37}อนท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ว\u{e31}นท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("เด\u{e37}อนท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ช\u{e31}\u{e48}วโมงท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6341,19 +6660,24 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Tr => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 7485420634051515786, disps: &[ - (6, 0), - (0, 6), + (4, 4), + (1, 0), + (2, 3), ], entries: &[ - ("gün", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("hafta", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("saat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("yıl", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("hf.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("dakika", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("hafta", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("saniye", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dk.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("yıl", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sn.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sa.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("gün", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6426,37 +6750,51 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Uk => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 8694567506910003252, disps: &[ - (1, 19), - (10, 3), - (15, 2), - (0, 9), + (0, 23), + (9, 17), (0, 0), + (25, 6), + (13, 19), + (1, 11), + (1, 24), ], entries: &[ ("тиждень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("тижні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("місяць", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("днів", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("рік", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("хвилини", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("хвилина", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("тижня", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("місяць", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("р.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("місяці", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("години", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("роки", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("хвилину", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("годин", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("місяців", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("хвилина", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("годину", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("годин", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("рік", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("року", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("години", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("днів", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("хвилини", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("тижні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("місяців", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("дн.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("років", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("хвилину", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("тижнів", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("хв", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("хвилин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("роки", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("місяця", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("міс.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("тиж.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6529,27 +6867,28 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ur => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 4066803471364472071, disps: &[ - (11, 7), - (0, 10), - (1, 0), + (14, 4), + (2, 0), + (1, 6), ], entries: &[ - ("منٹ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ہفتے", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ہفتہ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("منٹ،", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("گھنٹے", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("مہینے", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("سال", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("سیکنڈز", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("گھنٹے", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("منٹ،", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("گھنٹہ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ماہ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("دن", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ہفتے", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("مہینہ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("منٹس", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("منٹ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("سیکنڈ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("دنوں", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("منٹس", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("مہینہ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("گھنٹہ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("مہینے", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("سیکنڈز", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6706,20 +7045,19 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Vi => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 15467950696543387533, disps: &[ - (7, 3), - (7, 0), + (2, 3), + (1, 0), ], entries: &[ ("giờ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ngày", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("tuần", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("giây", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("năm", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("tiếng", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ngày", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("tháng", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("phút", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("năm", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("tuần", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -6801,11 +7139,11 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_nd_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 0), + (1, 0), ], entries: &[ - ("日", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("今", TaToken { n: 0, unit: Some(TimeUnit::Day) }), + ("昨", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, comma_decimal: false, @@ -6871,11 +7209,11 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_nd_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 0), + (1, 0), ], entries: &[ - ("天", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("今", TaToken { n: 0, unit: Some(TimeUnit::Day) }), + ("昨", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, comma_decimal: false, @@ -6938,11 +7276,11 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_nd_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 0), + (1, 0), ], entries: &[ - ("天", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("今", TaToken { n: 0, unit: Some(TimeUnit::Day) }), + ("昨", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, comma_decimal: false, @@ -6979,27 +7317,38 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Zu => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 106375038446233661, disps: &[ - (1, 8), - (0, 0), - (11, 4), + (0, 13), + (7, 20), + (6, 13), + (1, 0), + (21, 18), ], entries: &[ - ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("iviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("amasekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("izinyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("iminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ezinsukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("osukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("amaminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("unyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("iminyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ezedlule.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("inyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("isekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ihora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("amaviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("osukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ezingu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("elingu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("usuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("izinsuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("odlule", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("olungu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("unyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("amasekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ezinsukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("isekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("izinyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("iviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("evikini", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("olwedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("iminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("amaminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("iminyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ihora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], diff --git a/src/util/mod.rs b/src/util/mod.rs index f6e093f..5f05ae4 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -128,7 +128,35 @@ where buf.parse() } -/// Parse all numbers occurring in a string and reurn them as a vec +/// Parse a string after removing all non-numeric characters. +/// +/// If the string contains multiple numbers, it returns the product of them. +pub fn parse_numeric_prod(string: &str) -> Option +where + F: FromStr + Copy + std::ops::Mul, +{ + let mut n = None; + let mut buf = String::new(); + + for c in string.chars() { + if c.is_ascii_digit() { + buf.push(c); + } else if !buf.is_empty() { + if let Ok(x) = buf.parse::() { + n = n.map(|n| n * x).or(Some(x)); + } + buf.clear(); + } + } + if !buf.is_empty() { + if let Ok(x) = buf.parse::() { + n = n.map(|n| n * x).or(Some(x)); + } + } + n +} + +/// Parse all numbers occurring in a string and return them as a vec pub fn parse_numeric_vec(string: &str) -> Vec where F: FromStr, diff --git a/src/util/timeago.rs b/src/util/timeago.rs index 8f9cebd..5c90b16 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -199,7 +199,20 @@ pub fn parse_timeago(lang: Language, textual_date: &str) -> Option { let entry = dictionary::entry(lang); let filtered_str = filter_str(textual_date); - let qu: u8 = util::parse_numeric(textual_date).unwrap_or(1); + let qu: u8 = util::parse_numeric_prod(textual_date).unwrap_or(1); + + // French uses 'a' as a short form of years. + // Since 'a' is also a word in French, it cannot be parsed as a token. + if matches!( + lang, + Language::Fr | Language::FrCa | Language::Es | Language::Es419 | Language::EsUs + ) && textual_date.ends_with(" a") + { + return Some(TimeAgo { + n: qu, + unit: TimeUnit::Year, + }); + } TaTokenParser::new(&entry, util::lang_by_char(lang), false, &filtered_str) .next() @@ -403,10 +416,10 @@ mod tests { use crate::util::tests::TESTFILES; #[rstest] - #[case(Language::De, "vor 1 Sekunde", Some(TimeAgo { n: 1, unit: TimeUnit::Second }))] - #[case(Language::Ar, "قبل ساعة واحدة", Some(TimeAgo { n: 1, unit: TimeUnit::Hour }))] + #[case::de(Language::De, "vor 1 Sekunde", Some(TimeAgo { n: 1, unit: TimeUnit::Second }))] + #[case::ar(Language::Ar, "قبل ساعة واحدة", Some(TimeAgo { n: 1, unit: TimeUnit::Hour }))] // No-break space - #[case(Language::De, "Vor 3\u{a0}Tagen aktualisiert", Some(TimeAgo { n: 3, unit: TimeUnit::Day }))] + #[case::nbsp(Language::De, "Vor 3\u{a0}Tagen aktualisiert", Some(TimeAgo { n: 3, unit: TimeUnit::Day }))] fn t_parse( #[case] lang: Language, #[case] textual_date: &str, @@ -581,7 +594,196 @@ mod tests { assert_eq!( parse_timeago(*lang, s), Some(expect[n]), - "Language: {lang}, n: {n}" + "Language: {lang}, txt: `{s}`" + ); + }); + }) + } + + #[test] + fn t_testfile_short() { + let json_path = path!(*TESTFILES / "dict" / "timeago_samples_short.json"); + + let expect = [ + TimeAgo { + n: 35, + unit: TimeUnit::Minute, + }, + TimeAgo { + n: 50, + unit: TimeUnit::Minute, + }, + TimeAgo { + n: 1, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 2, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 3, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 4, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 5, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 6, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 7, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 8, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 9, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 12, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 17, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 18, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 19, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 20, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 10, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 11, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 13, + unit: TimeUnit::Hour, + }, + TimeAgo { + n: 1, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 2, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 3, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 4, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 6, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 8, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 10, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 11, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 12, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 13, + unit: TimeUnit::Day, + }, + TimeAgo { + n: 2, + unit: TimeUnit::Week, + }, + TimeAgo { + n: 3, + unit: TimeUnit::Week, + }, + TimeAgo { + n: 1, + unit: TimeUnit::Month, + }, + TimeAgo { + n: 4, + unit: TimeUnit::Week, + }, + TimeAgo { + n: 7, + unit: TimeUnit::Month, + }, + TimeAgo { + n: 10, + unit: TimeUnit::Month, + }, + TimeAgo { + n: 1, + unit: TimeUnit::Year, + }, + TimeAgo { + n: 2, + unit: TimeUnit::Year, + }, + TimeAgo { + n: 3, + unit: TimeUnit::Year, + }, + TimeAgo { + n: 4, + unit: TimeUnit::Year, + }, + TimeAgo { + n: 5, + unit: TimeUnit::Year, + }, + ]; + + let json_file = File::open(json_path).unwrap(); + let strings_map: BTreeMap> = + serde_json::from_reader(BufReader::new(json_file)).unwrap(); + + strings_map.iter().for_each(|(lang, strings)| { + assert_eq!(strings.len(), expect.len(), "Language: {lang}"); + strings.iter().enumerate().for_each(|(n, s)| { + let mut exp = expect[n]; + if *lang == Language::Mn && exp.unit == TimeUnit::Week { + exp.unit = TimeUnit::Day; + exp.n *= 7; + } + + assert_eq!( + parse_timeago(*lang, s), + Some(exp), + "Language: {lang}, txt: `{s}`" ); }); }) diff --git a/testfiles/dict/cldr_data/.gitignore b/testfiles/dict/cldr_data/.gitignore new file mode 100644 index 0000000..d5f19d8 --- /dev/null +++ b/testfiles/dict/cldr_data/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/testfiles/dict/cldr_data/collect_ta_tokens.js b/testfiles/dict/cldr_data/collect_ta_tokens.js new file mode 100644 index 0000000..57ee3c7 --- /dev/null +++ b/testfiles/dict/cldr_data/collect_ta_tokens.js @@ -0,0 +1,162 @@ +const fs = require("fs"); + +const DICT_PATH = "../dictionary.json"; + +function translateLang(lang) { + switch (lang) { + case "iw": // Hebrew + return "he"; + case "zh-CN": // Simplified Chinese + return "zh-Hans"; + case "zh-HK": + return "zh-Hant-HK"; + case "zh-TW": + return "zh-Hant"; + default: + return lang; + } +} + +function prepString(s, by_char) { + const replaced = s.toLowerCase().replace("{0}", "").replace("-", " "); + if (by_char) { + return replaced.replace(/\s/, "").split(""); + } else { + return replaced.split(/\s+/); + } +} + +function storeToken(tokens, word, unit) { + if (word) { + if (word in tokens && tokens[word] != unit) { + tokens[word] = null; + } else { + tokens[word] = unit; + } + } +} + +function validateTokens(tokens, lang) { + const units = { Y: 1, M: 1, W: 1, D: 1, h: 1, m: 1, s: 1 }; + + if (lang === "iw") { + tokens["שתי"] = "2"; + } + + for (const [key, val] of Object.entries(tokens)) { + if (val === null) { + delete tokens[key]; + } else { + delete units[val]; + } + } + if (Object.keys(units).length > 0) { + console.log( + `missing units ${JSON.stringify( + Object.keys(units) + )} for lang: ${lang}; tokens: ${JSON.stringify(tokens)}` + ); + } +} + +function validateNdTokens(tokens, lang) { + const units = { "0D": 1, "1D": 1 }; + + for (const [key, val] of Object.entries(tokens)) { + if (val === null) { + delete tokens[key]; + } else { + delete units[val]; + } + } + + if (Object.keys(units).length > 0) { + console.log( + `missing nd tokens ${JSON.stringify( + Object.keys(units) + )} for lang: ${lang}; tokens: ${JSON.stringify(tokens)}` + ); + } else if (Object.keys(tokens).length > 2) { + console.log( + `too many nd tokens for lang: ${lang}; tokens: ${JSON.stringify(tokens)}` + ); + } +} + +const sortObject = (obj) => + Object.keys(obj) + .sort() + .reduce((res, key) => ((res[key] = obj[key]), res), {}); + +function collectTimeago(lang, by_char, timeagoTokens, timeagoNdTokens) { + const cldrLang = translateLang(lang); + const dates = require(`cldr-dates-modern/main/${cldrLang}/dateFields.json`); + const dateFields = dates.main[cldrLang].dates.fields; + + for (const [unitStr, unit] of Object.entries(units)) { + for (const unitFields of [dateFields[unitStr], dateFields[`${unitStr}-short`]]) { + for (const [sKey, s] of Object.entries(unitFields["relativeTime-type-past"])) { + let u = unit; + if (s.indexOf("{0}") === -1) { + if (sKey.endsWith("-zero")) { + u = "0" + u; + } else if (sKey.endsWith("-one")) { + u = "1" + u; + } else if (sKey.endsWith("-two")) { + u = "2" + u; + } else { + throw new Error(`Invalid time pattern. lang: ${lang} key: ${sKey}`); + } + } + + const words = prepString(s, by_char); + for (const word of words) { + storeToken(timeagoTokens, word, u); + } + } + } + } + + if (dateFields.day["relative-type-0"]) { + const words = prepString(dateFields.day["relative-type-0"], by_char); + for (const word of words) { + storeToken(timeagoNdTokens, word, "0D"); + } + } + if (dateFields.day["relative-type--1"]) { + const words = prepString(dateFields.day["relative-type--1"], by_char); + for (const word of words) { + storeToken(timeagoNdTokens, word, "1D"); + } + } +} + +const dict = JSON.parse(fs.readFileSync(DICT_PATH)); + +const units = { + second: "s", + minute: "m", + hour: "h", + day: "D", + week: "W", + month: "M", + year: "Y", +}; + +for (const [mainLang, entry] of Object.entries(dict)) { + const langs = [mainLang, ...entry["equivalent"]]; + + const timeagoTokens = {}; + const timeagoNdTokens = {}; + + for (lang of langs) { + collectTimeago(lang, entry["by_char"], timeagoTokens, timeagoNdTokens); + } + validateTokens(timeagoTokens, mainLang); + // validateNdTokens(timeagoNdTokens, mainLang); + + dict[mainLang]["timeago_tokens"] = timeagoTokens; + // dict[mainLang]["timeago_nd_tokens"] = timeagoNdTokens; +} + +fs.writeFileSync(DICT_PATH, JSON.stringify(dict, null, 2)); diff --git a/testfiles/dict/cldr_data/package.json b/testfiles/dict/cldr_data/package.json new file mode 100644 index 0000000..18d5cae --- /dev/null +++ b/testfiles/dict/cldr_data/package.json @@ -0,0 +1,12 @@ +{ + "name": "cldr_data", + "version": "1.0.0", + "description": "Build the RustyPipe parsing dictionary using CLDR data", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "cldr-dates-modern": "^43.0.0", + "cldr-numbers-modern": "^43.0.0" + } +} diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index d58d03a..9f71cb2 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -3,19 +3,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dae": "D", - "dag": "D", - "jaar": "Y", - "maand": "M", - "maande": "M", - "minute": "m", - "minuut": "m", "sekonde": "s", "sekondes": "s", - "ure": "h", + "s.": "s", + "minuut": "m", + "minute": "m", + "min.": "m", "uur": "h", + "u.": "h", + "dag": "D", + "dae": "D", "week": "W", - "weke": "W" + "weke": "W", + "w.": "W", + "maand": "M", + "maande": "M", + "md.": "M", + "jaar": "Y", + "j.": "Y" }, "date_order": "DY", "months": { @@ -33,8 +38,8 @@ "sep.": 9 }, "timeago_nd_tokens": { - "gister": "1D", - "vandag": "0D" + "vandag": "0D", + "gister": "1D" }, "comma_decimal": true, "number_tokens": { @@ -58,20 +63,21 @@ "timeago_tokens": { "ሰከንድ": "s", "ሰከንዶች": "s", - "ሰዓት": "h", - "ሰዓቶች": "h", - "ሳምንታት": "W", - "ሳምንት": "W", - "ቀናት": "D", - "ቀን": "D", - "ወራት": "M", - "ወር": "M", - "ዓመታት": "Y", - "ዓመት": "Y", "ደቂቃ": "m", + "ደቂቃ፣": "m", "ደቂቃዎች": "m", "ደቂቃዎች፣": "m", - "ደቂቃ፣": "m" + "ሰዓት": "h", + "ሰዓቶች": "h", + "ቀን": "D", + "ቀናት": "D", + "ቀኖች": "D", + "ሳምንት": "W", + "ሳምንታት": "W", + "ወር": "M", + "ወራት": "M", + "ዓመት": "Y", + "ዓመታት": "Y" }, "date_order": "DY", "months": { @@ -89,8 +95,8 @@ "ፌብሩ": 2 }, "timeago_nd_tokens": { - "ትላንት": "1D", - "ዛሬ": "0D" + "ዛሬ": "0D", + "ትላንት": "1D" }, "comma_decimal": false, "number_tokens": { @@ -113,40 +119,42 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "أسابيع": "W", - "أسبوع": "W", - "أسبوعين": "2W", - "أشهر": "M", - "أيام": "D", "ثانية": "s", - "ثانيتين": "2s", - "ثوان": "s", - "ثوانٍ": "s", "ثوانِ": "s", + "ثوانٍ": "s", + "ثوان": "s", + "ثانيتين": "2s", + "وثانيتان": "2s", "دقائق": "m", "دقيقة": "m", "دقيقتان": "2m", "دقيقتين": "2m", + "ساعتين": "2h", "ساعات": "h", "ساعة": "h", - "ساعتين": "2h", - "سنة": "Y", + "يومين": "2D", + "أيام": "D", + "يومًا": "D", + "يوم": "D", + "أسبوعين": "2W", + "أسابيع": "W", + "أسبوعًا": "W", + "أسبوع": "W", + "شهرين": "2M", + "أشهر": "M", + "شهرًا": "M", + "خلال": "M", + "شهر": "M", "سنتين": "2Y", "سنوات": "Y", - "شهر": "M", - "شهرين": "2M", - "شهرًا": "M", - "وثانية": "s", - "وثانيتان": "2s", - "يوم": "D", - "يومين": "2D", - "يومًا": "D" + "سنة": "Y", + "وثانية": "s" }, "date_order": "DMY", "months": {}, "timeago_nd_tokens": { - "البارحة": "1D", - "اليوم": "0D" + "اليوم": "0D", + "البارحة": "1D" }, "comma_decimal": false, "number_tokens": { @@ -171,13 +179,13 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ঘণ্টা": "h", "ছেকেণ্ড": "s", - "দিন": "D", - "বছৰৰ": "Y", - "মাহ": "M", "মিনিট": "m", - "সপ্তাহ": "W" + "ঘণ্টা": "h", + "দিন": "D", + "সপ্তাহ": "W", + "মাহ": "M", + "বছৰৰ": "Y" }, "date_order": "DMY", "months": {}, @@ -216,13 +224,13 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ay": "M", + "saniyə": "s", "dəqiqə": "m", + "saat": "h", "gün": "D", "həftə": "W", - "il": "Y", - "saat": "h", - "saniyə": "s" + "ay": "M", + "il": "Y" }, "date_order": "DY", "months": { @@ -241,9 +249,7 @@ }, "timeago_nd_tokens": { "bugün": "0D", - "dünən": "1D", - "güncəlləndi": "1D", - "güncəllənib": "0D" + "dünən": "1D" }, "comma_decimal": true, "number_tokens": { @@ -265,32 +271,39 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "гадзін": "h", - "гадзіну": "h", - "гадзіны": "h", - "гадоў": "Y", - "гады": "Y", - "год": "Y", - "года": "Y", - "дзень": "D", - "дзён": "D", - "дня": "D", - "дні": "D", - "месяц": "M", - "месяца": "M", - "месяцаў": "M", - "месяцы": "M", - "секунд": "s", - "секунда": "s", "секунду": "s", "секунды": "s", - "тыдзень": "W", - "тыдня": "W", - "тыдні": "W", + "секунд": "s", + "секунда": "s", + "с": "s", + "хвіліну": "m", + "хвіліны": "m", "хвілін": "m", "хвіліна": "m", - "хвіліну": "m", - "хвіліны": "m" + "хв": "m", + "гадзіну": "h", + "гадзіны": "h", + "гадзін": "h", + "гадз": "h", + "дзень": "D", + "дні": "D", + "дзён": "D", + "дня": "D", + "тыдзень": "W", + "тыдні": "W", + "тыдняў": "W", + "тыдня": "W", + "тыд": "W", + "месяц": "M", + "месяцы": "M", + "месяцаў": "M", + "месяца": "M", + "мес.": "M", + "год": "Y", + "гады": "Y", + "гадоў": "Y", + "года": "Y", + "г.": "Y" }, "date_order": "DY", "months": { @@ -332,26 +345,32 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "година": "Y", - "години": "Y", - "ден": "D", - "дни": "D", - "месец": "M", - "месеца": "M", - "минута": "m", - "минути": "m", - "седмица": "W", - "седмици": "W", "секунда": "s", "секунди": "s", + "сек": "s", + "минута": "m", + "минути": "m", + "мин": "m", "час": "h", - "часа": "h" + "часа": "h", + "ч": "h", + "ден": "D", + "дни": "D", + "седмица": "W", + "седмици": "W", + "седм.": "W", + "месец": "M", + "месеца": "M", + "м.": "M", + "година": "Y", + "години": "Y", + "г.": "Y" }, "date_order": "DMY", "months": {}, "timeago_nd_tokens": { - "вчера": "1D", - "днес": "0D" + "днес": "0D", + "вчера": "1D" }, "comma_decimal": true, "number_tokens": { @@ -374,13 +393,13 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "সেকেন্ড": "s", + "মিনিট": "m", "ঘন্টা": "h", "দিন": "D", - "বছর": "Y", - "মাস": "M", - "মিনিট": "m", "সপ্তাহ": "W", - "সেকেন্ড": "s" + "মাস": "M", + "বছর": "Y" }, "date_order": "DY", "months": { @@ -427,26 +446,33 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dan": "D", - "dana": "D", - "godina": "Y", - "godine": "Y", - "godinu": "Y", - "minuta": "m", - "minute": "m", + "sekundu": "s", + "sekunde": "s", + "sekundi": "s", + "sekunda": "s", + "sek.": "s", "minutu": "m", - "mjesec": "M", - "mjeseca": "M", - "mjeseci": "M", + "minute": "m", + "minuta": "m", + "min.": "m", "sat": "h", "sata": "h", "sati": "h", - "sedmice": "W", + "dan": "D", + "dana": "D", + "d.": "D", "sedmicu": "W", - "sekunda": "s", - "sekunde": "s", - "sekundi": "s", - "sekundu": "s" + "sedmice": "W", + "sedmica": "W", + "sed.": "W", + "mjesec": "M", + "mjeseca": "M", + "mjeseci": "M", + "mj.": "M", + "godinu": "Y", + "godine": "Y", + "godina": "Y", + "god.": "Y" }, "date_order": "DY", "months": { @@ -488,20 +514,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "any": "Y", - "anys": "Y", - "dia": "D", - "dies": "D", - "hora": "h", - "hores": "h", - "mes": "M", - "mesos": "M", - "minut": "m", - "minuts": "m", "segon": "s", "segons": "s", + "s": "s", + "minut": "m", + "minuts": "m", + "min": "m", + "hora": "h", + "hores": "h", + "h": "h", + "dia": "D", + "dies": "D", "setmana": "W", - "setmanes": "W" + "setmanes": "W", + "setm.": "W", + "mes": "M", + "mesos": "M", + "any": "Y", + "anys": "Y" }, "date_order": "DY", "months": { @@ -519,8 +549,8 @@ "set.": 9 }, "timeago_nd_tokens": { - "ahir": "1D", - "avui": "0D" + "avui": "0D", + "ahir": "1D" }, "comma_decimal": true, "number_tokens": { @@ -542,27 +572,39 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dnem": "D", - "dny": "D", - "hodinami": "h", - "hodinou": "h", - "lety": "Y", - "minut": "m", - "minuta": "m", - "minutami": "m", - "minutou": "m", - "minuty": "m", - "měsícem": "M", - "měsíci": "M", - "rokem": "Y", - "roky": "Y", + "sekundou": "s", + "sekundami": "s", + "sekundy": "s", "sekund": "s", "sekunda": "s", - "sekundami": "s", - "sekundou": "s", - "sekundy": "s", + "s": "s", + "minutou": "m", + "minutami": "m", + "minuty": "m", + "minut": "m", + "minuta": "m", + "min": "m", + "hodinou": "h", + "hodinami": "h", + "hodiny": "h", + "h": "h", + "dnem": "D", + "dny": "D", + "dne": "D", "týdnem": "W", - "týdny": "W" + "týdny": "W", + "týdne": "W", + "týd.": "W", + "měsícem": "M", + "měsíci": "M", + "měsíce": "M", + "měs.": "M", + "rokem": "Y", + "lety": "Y", + "roku": "Y", + "roky": "Y", + "r.": "Y", + "l.": "Y" }, "date_order": "DMY", "months": {}, @@ -589,18 +631,22 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dag": "D", - "dage": "D", - "minut": "m", - "minutter": "m", - "måned": "M", - "måneder": "M", "sekund": "s", "sekunder": "s", + "sek.": "s", + "minut": "m", + "minutter": "m", + "min.": "m", "time": "h", "timer": "h", + "dag": "D", + "dage": "D", "uge": "W", "uger": "W", + "måned": "M", + "måneder": "M", + "md.": "M", + "mdr.": "M", "år": "Y" }, "date_order": "DY", @@ -642,26 +688,29 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "jahr": "Y", - "jahren": "Y", - "minute": "m", - "minuten": "m", - "monat": "M", - "monaten": "M", "sekunde": "s", "sekunden": "s", + "sek.": "s", + "minute": "m", + "minuten": "m", + "min.": "m", "stunde": "h", "stunden": "h", + "std.": "h", "tag": "D", "tagen": "D", "woche": "W", - "wochen": "W" + "wochen": "W", + "monat": "M", + "monaten": "M", + "jahr": "Y", + "jahren": "Y" }, "date_order": "DMY", "months": {}, "timeago_nd_tokens": { - "gestern": "1D", - "heute": "0D" + "heute": "0D", + "gestern": "1D" }, "comma_decimal": true, "number_tokens": { @@ -683,20 +732,25 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "έτη": "Y", - "έτος": "Y", - "δευτερόλεπτα": "s", "δευτερόλεπτο": "s", - "εβδομάδα": "W", - "εβδομάδες": "W", + "δευτερόλεπτα": "s", + "δευτ.": "s", + "λεπτό": "m", + "λεπτά": "m", + "λεπ.": "m", + "ώρα": "h", + "ώρες": "h", + "ώ.": "h", "ημέρα": "D", "ημέρες": "D", - "λεπτά": "m", - "λεπτό": "m", + "ημ.": "D", + "εβδομάδα": "W", + "εβδομάδες": "W", + "εβδ.": "W", "μήνα": "M", "μήνες": "M", - "ώρα": "h", - "ώρες": "h" + "έτος": "Y", + "έτη": "Y" }, "date_order": "DY", "months": { @@ -735,33 +789,35 @@ } }, "en": { - "equivalent": [ - "en-GB", - "en-IN" - ], + "equivalent": ["en-GB", "en-IN"], "by_char": false, "timeago_tokens": { - "day": "D", - "days": "D", - "hour": "h", - "hours": "h", - "minute": "m", - "minutes": "m", - "month": "M", - "months": "M", "second": "s", "seconds": "s", + "sec": "s", + "s": "s", + "minute": "m", + "minutes": "m", + "min": "m", + "m": "m", + "hour": "h", + "hours": "h", + "hr": "h", + "h": "h", + "day": "D", + "days": "D", + "d": "D", "week": "W", "weeks": "W", + "wk": "W", + "w": "W", + "month": "M", + "months": "M", + "mo": "M", "year": "Y", "years": "Y", - "y": "Y", - "mo": "M", - "w": "W", - "d": "D", - "h": "h", - "min": "m", - "s": "s" + "yr": "Y", + "y": "Y" }, "date_order": "DY", "months": { @@ -805,20 +861,26 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "año": "Y", - "años": "Y", - "día": "D", - "días": "D", - "hora": "h", - "horas": "h", - "mes": "M", - "meses": "M", - "minuto": "m", - "minutos": "m", "segundo": "s", "segundos": "s", + "s": "s", + "minuto": "m", + "minutos": "m", + "min": "m", + "hora": "h", + "horas": "h", + "h": "h", + "día": "D", + "días": "D", + "d": "D", "semana": "W", - "semanas": "W" + "semanas": "W", + "sem.": "W", + "mes": "M", + "meses": "M", + "m": "M", + "año": "Y", + "años": "Y" }, "date_order": "DY", "months": { @@ -836,8 +898,8 @@ "sept": 9 }, "timeago_nd_tokens": { - "ayer": "1D", - "hoy": "0D" + "hoy": "0D", + "ayer": "1D" }, "comma_decimal": true, "number_tokens": { @@ -854,25 +916,28 @@ } }, "es-US": { - "equivalent": [ - "es-419" - ], + "equivalent": ["es-419"], "by_char": false, "timeago_tokens": { - "año": "Y", - "años": "Y", - "día": "D", - "días": "D", - "hora": "h", - "horas": "h", - "mes": "M", - "meses": "M", - "minuto": "m", - "minutos": "m", "segundo": "s", "segundos": "s", + "s": "s", + "minuto": "m", + "minutos": "m", + "min": "m", + "hora": "h", + "horas": "h", + "h": "h", + "día": "D", + "días": "D", "semana": "W", - "semanas": "W" + "semanas": "W", + "sem.": "W", + "mes": "M", + "meses": "M", + "m": "M", + "año": "Y", + "años": "Y" }, "date_order": "DY", "months": { @@ -890,8 +955,8 @@ "sept": 9 }, "timeago_nd_tokens": { - "ayer": "1D", - "hoy": "0D" + "hoy": "0D", + "ayer": "1D" }, "comma_decimal": false, "number_tokens": { @@ -913,22 +978,26 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "aasta": "Y", - "aastat": "Y", - "kuu": "M", - "kuud": "M", - "minut": "m", + "sekundi": "s", + "sekund": "s", + "sekundit": "s", + "sek": "s", "minuti": "m", + "minut": "m", "minutit": "m", - "nädal": "W", - "nädala": "W", - "nädalat": "W", + "min": "m", + "tunni": "h", + "t": "h", "päev": "D", "päeva": "D", - "sekund": "s", - "sekundi": "s", - "sekundit": "s", - "tunni": "h" + "p": "D", + "nädala": "W", + "nädal": "W", + "näd": "W", + "kuu": "M", + "kuud": "M", + "aasta": "Y", + "a": "Y" }, "date_order": "DY", "months": { @@ -946,8 +1015,8 @@ "veebr": 2 }, "timeago_nd_tokens": { - "eile": "1D", - "täna": "0D" + "täna": "0D", + "eile": "1D" }, "comma_decimal": true, "number_tokens": { @@ -970,16 +1039,13 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "aste": "W", - "astebete": "W", - "egun": "D", - "hilabete": "M", + "segundo": "s", "minutu": "m", "ordu": "h", - "ordubete": "h", - "segundo": "s", - "urte": "Y", - "urtebete": "Y" + "egun": "D", + "aste": "W", + "hilabete": "M", + "urte": "Y" }, "date_order": "YD", "months": { @@ -997,8 +1063,8 @@ "uzt.": 7 }, "timeago_nd_tokens": { - "atzo": "1D", - "gaur": "0D" + "gaur": "0D", + "atzo": "1D" }, "comma_decimal": true, "number_tokens": { @@ -1021,11 +1087,11 @@ "timeago_tokens": { "ثانیه": "s", "دقیقه": "m", - "روز": "D", "ساعت": "h", - "سال": "Y", + "روز": "D", + "هفته": "W", "ماه": "M", - "هفته": "W" + "سال": "Y" }, "date_order": "DY", "months": { @@ -1068,26 +1134,33 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "kuukausi": "M", - "kuukautta": "M", - "minuutti": "m", - "minuuttia": "m", - "päivä": "D", - "päivää": "D", "sekunti": "s", "sekuntia": "s", + "s": "s", + "minuutti": "m", + "minuuttia": "m", + "min": "m", "tunti": "h", "tuntia": "h", + "t": "h", + "päivä": "D", + "päivää": "D", + "pv": "D", "viikko": "W", "viikkoa": "W", + "vk": "W", + "kuukausi": "M", + "kuukautta": "M", + "kk": "M", "vuosi": "Y", - "vuotta": "Y" + "vuotta": "Y", + "v": "Y" }, "date_order": "DMY", "months": {}, "timeago_nd_tokens": { - "eilen": "1D", - "tänään": "0D" + "tänään": "0D", + "eilen": "1D" }, "comma_decimal": true, "number_tokens": { @@ -1111,12 +1184,14 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "araw": "D", - "buwan": "M", - "linggo": "W", - "minuto": "m", - "oras": "h", "segundo": "s", + "seg.": "s", + "minuto": "m", + "min.": "m", + "oras": "h", + "araw": "D", + "linggo": "W", + "buwan": "M", "taon": "Y" }, "date_order": "DY", @@ -1135,8 +1210,8 @@ "set": 9 }, "timeago_nd_tokens": { - "kahapon": "1D", - "ngayong": "0D" + "ngayong": "0D", + "kahapon": "1D" }, "comma_decimal": false, "number_tokens": { @@ -1155,24 +1230,28 @@ } }, "fr": { - "equivalent": [ - "fr-CA" - ], + "equivalent": ["fr-CA"], "by_char": false, "timeago_tokens": { - "an": "Y", - "ans": "Y", - "heure": "h", - "heures": "h", - "jour": "D", - "jours": "D", - "minute": "m", - "minutes": "m", - "mois": "M", "seconde": "s", "secondes": "s", + "s": "s", + "minute": "m", + "minutes": "m", + "min": "m", + "heure": "h", + "heures": "h", + "h": "h", + "jour": "D", + "jours": "D", + "j": "D", "semaine": "W", - "semaines": "W" + "semaines": "W", + "sem.": "W", + "mois": "M", + "m.": "M", + "an": "Y", + "ans": "Y" }, "date_order": "DY", "months": { @@ -1218,20 +1297,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ano": "Y", - "anos": "Y", - "día": "D", - "días": "D", - "hora": "h", - "horas": "h", - "mes": "M", - "meses": "M", - "minuto": "m", - "minutos": "m", "segundo": "s", "segundos": "s", + "s": "s", + "minuto": "m", + "minutos": "m", + "min": "m", + "hora": "h", + "horas": "h", + "h": "h", + "día": "D", + "días": "D", "semana": "W", - "semanas": "W" + "semanas": "W", + "sem.": "W", + "mes": "M", + "meses": "M", + "ano": "Y", + "anos": "Y" }, "date_order": "DY", "months": { @@ -1271,13 +1354,14 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "અઠવાડિયા": "W", + "સેકંડ": "s", + "મિનિટ": "m", "કલાક": "h", "દિવસ": "D", + "અઠવાડિયા": "W", + "અઠ.": "W", "મહિના": "M", - "મિનિટ": "m", - "વર્ષ": "Y", - "સેકંડ": "s" + "વર્ષ": "Y" }, "date_order": "DY", "months": { @@ -1318,13 +1402,16 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "घंटे": "h", - "दिन": "D", - "माह": "M", + "सेकंड": "s", + "से॰": "s", "मिनट": "m", - "वर्ष": "Y", + "मि॰": "m", + "घंटे": "h", + "घं॰": "h", + "दिन": "D", "सप्ताह": "W", - "सेकंड": "s" + "माह": "M", + "वर्ष": "Y" }, "date_order": "DY", "months": { @@ -1367,26 +1454,33 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dan": "D", - "dana": "D", - "godina": "Y", - "godine": "Y", - "godinu": "Y", - "minuta": "m", - "minute": "m", + "sekundu": "s", + "sekunde": "s", + "sekundi": "s", + "sekunda": "s", + "s": "s", "minutu": "m", - "mjesec": "M", - "mjeseca": "M", - "mjeseci": "M", + "minute": "m", + "minuta": "m", + "min": "m", "sat": "h", "sata": "h", "sati": "h", - "sekunda": "s", - "sekunde": "s", - "sekundi": "s", - "sekundu": "s", + "h": "h", + "dan": "D", + "dana": "D", "tjedan": "W", - "tjedna": "W" + "tjedna": "W", + "tjedana": "W", + "tj.": "W", + "mjesec": "M", + "mjeseca": "M", + "mjeseci": "M", + "mj.": "M", + "godinu": "Y", + "godine": "Y", + "godina": "Y", + "g.": "Y" }, "date_order": "DY", "months": { @@ -1428,22 +1522,22 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "másodperc": "s", + "másodperccel": "s", + "másodperce": "s", + "perc": "m", + "perccel": "m", + "perce": "m", + "órája": "h", + "órával": "h", + "napja": "D", + "nappal": "D", "hete": "W", "héttel": "W", "hónapja": "M", "hónappal": "M", - "másodperc": "s", - "másodperccel": "s", - "másodperce": "s", - "napja": "D", - "nappal": "D", - "perc": "m", - "perccel": "m", - "perce": "m", "éve": "Y", - "évvel": "Y", - "órája": "h", - "órával": "h" + "évvel": "Y" }, "date_order": "YD", "months": { @@ -1485,13 +1579,18 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ամիս": "M", - "ժամ": "h", - "շաբաթ": "W", "վայրկյան": "s", - "տարի": "Y", + "վրկ": "s", "րոպե": "m", - "օր": "D" + "ր": "m", + "ժամ": "h", + "ժ": "h", + "օր": "D", + "շաբաթ": "W", + "շաբ": "W", + "ամիս": "M", + "տարի": "Y", + "տ": "Y" }, "date_order": "DY", "months": { @@ -1534,13 +1633,19 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "bulan": "M", "detik": "s", - "hari": "D", - "jam": "h", + "dtk": "s", "menit": "m", + "mnt": "m", + "jam": "h", + "hari": "D", + "h": "D", "minggu": "W", - "tahun": "Y" + "mgg": "W", + "bulan": "M", + "bln": "M", + "tahun": "Y", + "thn": "Y" }, "date_order": "DY", "months": { @@ -1582,22 +1687,26 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "degi": "D", - "dögum": "D", - "klukkustund": "h", - "klukkustundum": "h", - "mánuði": "M", - "mánuðum": "M", - "mínúta": "m", - "mínútu": "m", - "mínútum": "m", - "mínútur": "m", - "sekúnda": "s", "sekúndu": "s", "sekúndum": "s", + "sekúnda": "s", "sekúndur": "s", + "sek.": "s", + "mínútu": "m", + "mínútum": "m", + "mínúta": "m", + "mínútur": "m", + "mín.": "m", + "klukkustund": "h", + "klukkustundum": "h", + "klst.": "h", + "degi": "D", + "dögum": "D", "viku": "W", "vikum": "W", + "mánuði": "M", + "mánuðum": "M", + "mán.": "M", "ári": "Y", "árum": "Y" }, @@ -1643,20 +1752,26 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "anni": "Y", - "anno": "Y", - "giorni": "D", - "giorno": "D", - "mese": "M", - "mesi": "M", - "minuti": "m", + "secondo": "s", + "secondi": "s", + "sec.": "s", "minuto": "m", + "minuti": "m", + "min": "m", "ora": "h", "ore": "h", - "secondi": "s", - "secondo": "s", + "h": "h", + "giorno": "D", + "giorni": "D", + "g": "D", + "gg": "D", "settimana": "W", - "settimane": "W" + "settimane": "W", + "sett.": "W", + "mese": "M", + "mesi": "M", + "anno": "Y", + "anni": "Y" }, "date_order": "DY", "months": { @@ -1674,8 +1789,8 @@ "set": 9 }, "timeago_nd_tokens": { - "ieri": "1D", - "oggi": "0D" + "oggi": "0D", + "ieri": "1D" }, "comma_decimal": true, "number_tokens": { @@ -1697,26 +1812,30 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "דקה": "m", + "שניה": "s", + "שניות": "s", + "שנייה": "1s", + "דקה": "1m", + "דק׳": "m", "דקות": "m", - "חודש": "M", - "חודשיים": "2M", - "חודשים": "M", + "שעה": "1h", + "שעתיים": "2h", + "שעות": "h", + "שע׳": "h", "יום": "D", "יומיים": "2D", "ימים": "D", - "שבוע": "W", - "שבועות": "W", + "אתמול": "1D", + "שבוע": "1W", "שבועיים": "2W", - "שנה": "Y", - "שניה": "s", - "שניות": "s", - "שנייה": "s", - "שנים": "Y", + "שבועות": "W", + "שב׳": "W", + "חודש": "1M", + "חודשיים": "2M", + "חודשים": "M", "שנתיים": "2Y", - "שעה": "h", - "שעות": "h", - "שעתיים": "2h", + "שנים": "Y", + "שנה": "Y", "שתי": "2" }, "date_order": "DY", @@ -1735,8 +1854,8 @@ "בפבר׳": 2 }, "timeago_nd_tokens": { - "אתמול": "1D", - "היום": "0D" + "היום": "0D", + "אתמול": "1D" }, "comma_decimal": false, "number_tokens": { @@ -1759,19 +1878,19 @@ "equivalent": [], "by_char": true, "timeago_tokens": { - "分": "m", - "年": "Y", - "日": "D", - "時": "h", - "月": "M", "秒": "s", - "週": "W" + "分": "m", + "時": "h", + "日": "D", + "週": "W", + "月": "M", + "年": "Y" }, "date_order": "YMD", "months": {}, "timeago_nd_tokens": { - "日": "1D", - "本": "0D" + "本": "0D", + "昨": "1D" }, "comma_decimal": false, "number_tokens": { @@ -1791,15 +1910,19 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "წამი": "s", + "წამის": "s", + "წმ": "s", + "წუთი": "m", + "წუთის": "m", + "წთ": "m", + "საათის": "h", + "სთ": "h", "დღის": "D", "თვის": "M", "კვირის": "W", - "საათის": "h", - "წამი": "s", - "წამის": "s", - "წლის": "Y", - "წუთი": "m", - "წუთის": "m" + "კვ.": "W", + "წლის": "Y" }, "date_order": "DY", "months": { @@ -1817,8 +1940,8 @@ "სექ.": 9 }, "timeago_nd_tokens": { - "გუშინ": "1D", - "დღეს": "0D" + "დღეს": "0D", + "გუშინ": "1D" }, "comma_decimal": true, "number_tokens": { @@ -1841,13 +1964,18 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ай": "M", - "апта": "W", - "жыл": "Y", - "күн": "D", + "секунд": "s", + "сек.": "s", "минут": "m", + "мин.": "m", "сағат": "h", - "секунд": "s" + "сағ.": "h", + "күн": "D", + "апта": "W", + "ап.": "W", + "ай": "M", + "жыл": "Y", + "ж.": "Y" }, "date_order": "YD", "months": { @@ -1938,23 +2066,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ಗಂಟೆ": "h", - "ಗಂಟೆಗಳ": "h", - "ತಿಂಗಳ": "M", - "ತಿಂಗಳುಗಳ": "M", - "ದಿನಗಳ": "D", - "ದಿನದ": "D", - "ನಿಮಿಷಗಳ": "m", - "ನಿಮಿಷಗಳು": "m", - "ನಿಮಿಷದ": "m", - "ನಿಮಿಷವು": "m", - "ವರ್ಷಗಳ": "Y", - "ವರ್ಷದ": "Y", - "ವಾರಗಳ": "W", - "ವಾರದ": "W", + "ಸೆಕೆಂಡ್": "s", "ಸೆಕೆಂಡುಗಳ": "s", "ಸೆಕೆಂಡುಗಳು": "s", - "ಸೆಕೆಂಡ್": "s" + "ನಿಮಿಷದ": "m", + "ನಿಮಿಷಗಳ": "m", + "ನಿಮಿಷಗಳು": "m", + "ನಿಮಿಷವು": "m", + "ಗಂಟೆ": "h", + "ಗಂಟೆಗಳ": "h", + "ದಿನದ": "D", + "ದಿನಗಳ": "D", + "ವಾರದ": "W", + "ವಾರಗಳ": "W", + "ತಿಂಗಳ": "M", + "ತಿಂಗಳುಗಳ": "M", + "ತಿಂಗಳು": "M", + "ವರ್ಷದ": "Y", + "ವರ್ಷಗಳ": "Y" }, "date_order": "DY", "months": { @@ -1995,19 +2124,19 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "개월": "M", - "년": "Y", + "초": "s", "분": "m", "시간": "h", "일": "D", "주": "W", - "초": "s" + "개월": "M", + "년": "Y" }, "date_order": "YMD", "months": {}, "timeago_nd_tokens": { - "어제": "1D", - "오늘": "0D" + "오늘": "0D", + "어제": "1D" }, "comma_decimal": false, "number_tokens": { @@ -2030,13 +2159,17 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ай": "M", - "апта": "W", - "жыл": "Y", - "күн": "D", + "секунд": "s", + "сек.": "s", "мүнөт": "m", + "мүн.": "m", "саат": "h", - "секунд": "s" + "саат.": "h", + "күн": "D", + "апта": "W", + "апт.": "W", + "ай": "M", + "жыл": "Y" }, "date_order": "YD", "months": { @@ -2078,15 +2211,20 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ຊົ່ວໂມງກ່ອນ": "h", - "ນາທີ": "m", - "ນາທີກ່ອນ": "m", - "ປີກ່ອນ": "Y", - "ມື້ກ່ອນ": "D", - "ວິນາທີ": "s", "ວິນາທີກ່ອນ": "s", + "ວິນາທີ": "s", + "ວິ.": "s", + "ນາທີກ່ອນ": "m", + "ນາທີ": "m", + "ນທ.": "m", + "ຊົ່ວໂມງກ່ອນ": "h", + "ຊມ.": "h", + "ມື້ກ່ອນ": "D", "ອາທິດກ່ອນ": "W", - "ເດືອນກ່ອນ": "M" + "ອທ.": "W", + "ເດືອນກ່ອນ": "M", + "ດ.": "M", + "ປີກ່ອນ": "Y" }, "date_order": "DY", "months": { @@ -2104,8 +2242,8 @@ "ສ.ຫ.": 8 }, "timeago_nd_tokens": { - "ອັດເດດມື້ວານນີ້": "1D", - "ອັບເດດມື້ນີ້": "0D" + "ອັບເດດມື້ນີ້": "0D", + "ອັດເດດມື້ວານນີ້": "1D" }, "comma_decimal": true, "number_tokens": { @@ -2129,37 +2267,47 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "d.": "D", - "dienas": "D", + "sekundę": "s", + "sekundes": "s", + "sekundės": "s", + "sekundė": "s", + "sekundžių": "s", + "sek.": "s", + "minutę": "m", + "minutes": "m", + "minutės": "m", + "minutė": "m", + "minučių": "m", + "min.": "m", + "valandą": "h", + "valandas": "h", + "valandos": "h", + "valandų": "h", + "val.": "h", "dieną": "D", + "dienas": "D", + "dienos": "D", "dienų": "D", + "d.": "D", + "savaitę": "W", + "savaites": "W", + "savaitės": "W", + "savaičių": "W", + "sav.": "W", + "mėnesį": "M", + "mėnesius": "M", + "mėnesio": "M", + "mėnesių": "M", + "mėn.": "M", "metus": "Y", "metų": "Y", - "minutes": "m", - "minutė": "m", - "minutės": "m", - "minutę": "m", - "minučių": "m", - "mėnesius": "M", - "mėnesių": "M", - "mėnesį": "M", - "savaites": "W", - "savaitę": "W", - "savaičių": "W", - "sekundes": "s", - "sekundė": "s", - "sekundės": "s", - "sekundę": "s", - "sekundžių": "s", - "valandas": "h", - "valandą": "h", - "valandų": "h" + "m.": "Y" }, "date_order": "YMD", "months": {}, "timeago_nd_tokens": { - "vakar": "1D", - "šiandien": "0D" + "šiandien": "0D", + "vakar": "1D" }, "comma_decimal": true, "number_tokens": { @@ -2182,24 +2330,31 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dienas": "D", - "dienām": "D", - "gada": "Y", - "gadiem": "Y", - "minūte": "m", - "minūtes": "m", - "minūtēm": "m", - "minūšu": "m", - "mēneša": "M", - "mēnešiem": "M", - "nedēļas": "W", - "nedēļām": "W", - "sekunde": "s", - "sekundes": "s", "sekundēm": "s", + "sekundes": "s", + "sekunde": "s", "sekunžu": "s", + "sek.": "s", + "minūtēm": "m", + "minūtes": "m", + "minūte": "m", + "minūšu": "m", + "min.": "m", + "stundām": "h", "stundas": "h", - "stundām": "h" + "st.": "h", + "dienām": "D", + "dienas": "D", + "d.": "D", + "nedēļām": "W", + "nedēļas": "W", + "ned.": "W", + "mēnešiem": "M", + "mēneša": "M", + "mēn.": "M", + "gadiem": "Y", + "gada": "Y", + "g.": "Y" }, "date_order": "YD", "months": { @@ -2217,8 +2372,8 @@ "sept.": 9 }, "timeago_nd_tokens": { - "vakar": "1D", - "šodien": "0D" + "šodien": "0D", + "vakar": "1D" }, "comma_decimal": true, "number_tokens": { @@ -2241,26 +2396,29 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "година": "Y", - "години": "Y", - "ден": "D", - "дена": "D", - "месец": "M", - "месеци": "M", - "минута": "m", - "минути": "m", - "седмица": "W", - "седмици": "W", "секунда": "s", "секунди": "s", + "сек.": "s", + "минута": "m", + "минути": "m", + "мин.": "m", "час": "h", - "часа": "h" + "часа": "h", + "ден": "D", + "дена": "D", + "седмица": "W", + "седмици": "W", + "месец": "M", + "месеци": "M", + "година": "Y", + "години": "Y", + "год.": "Y" }, "date_order": "DMY", "months": {}, "timeago_nd_tokens": { - "вчера": "1D", - "денес": "0D" + "денес": "0D", + "вчера": "1D" }, "comma_decimal": true, "number_tokens": { @@ -2284,13 +2442,13 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ആഴ്ച": "W", - "ദിവസം": "D", - "മണിക്കൂർ": "h", - "മാസം": "M", + "സെക്കൻഡ്": "s", "മിനിറ്റ്": "m", - "വർഷം": "Y", - "സെക്കൻഡ്": "s" + "മണിക്കൂർ": "h", + "ദിവസം": "D", + "ആഴ്ച": "W", + "മാസം": "M", + "വർഷം": "Y" }, "date_order": "YD", "months": { @@ -2308,8 +2466,8 @@ "സെപ്റ്റം": 9 }, "timeago_nd_tokens": { - "ഇന്നലെ": "1D", - "ഇന്ന്": "0D" + "ഇന്ന്": "0D", + "ഇന്നലെ": "1D" }, "comma_decimal": false, "number_tokens": { @@ -2331,15 +2489,19 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "жилийн": "Y", - "минут": "m", - "минутын": "m", - "сарын": "M", - "секунд": "s", "секундын": "s", - "хоногийн": "W", + "секунд": "s", + "сек": "s", + "минутын": "m", + "минут": "m", + "мин": "m", "цагийн": "h", - "өдрийн": "D" + "ц": "h", + "өдрийн": "D", + "хоногийн": "D", + "долоо": "W", + "сарын": "M", + "жилийн": "Y" }, "date_order": "YMD", "months": {}, @@ -2368,23 +2530,25 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "आठवड्यांपूर्वी": "W", - "आठवड्यापूर्वी": "W", - "तासांपूर्वी": "h", - "तासापूर्वी": "h", - "दिवसांपूर्वी": "D", - "दिवसापूर्वी": "D", - "महिन्यांपूर्वी": "M", - "महिन्यापूर्वी": "M", - "मिनिट": "m", - "मिनिटांपूर्वी": "m", - "मिनिटापूर्वी": "m", - "मिनिटे": "m", - "वर्षांपूर्वी": "Y", - "वर्षापूर्वी": "Y", - "सेकंद": "s", + "सेकंदापूर्वी": "s", "सेकंदांपूर्वी": "s", - "सेकंदापूर्वी": "s" + "सेकंद": "s", + "से.": "s", + "मिनिटापूर्वी": "m", + "मिनिटांपूर्वी": "m", + "मिनिट": "m", + "मिनिटे": "m", + "मिनि.": "m", + "तासापूर्वी": "h", + "तासांपूर्वी": "h", + "दिवसापूर्वी": "D", + "दिवसांपूर्वी": "D", + "आठवड्यापूर्वी": "W", + "आठवड्यांपूर्वी": "W", + "महिन्यापूर्वी": "M", + "महिन्यांपूर्वी": "M", + "वर्षापूर्वी": "Y", + "वर्षांपूर्वी": "Y" }, "date_order": "DY", "months": { @@ -2428,13 +2592,17 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "bulan": "M", - "hari": "D", - "jam": "h", - "minggu": "W", - "minit": "m", "saat": "s", - "tahun": "Y" + "minit": "m", + "min": "m", + "jam": "h", + "hari": "D", + "minggu": "W", + "mgu": "W", + "bulan": "M", + "bln": "M", + "tahun": "Y", + "thn": "Y" }, "date_order": "DY", "months": { @@ -2501,8 +2669,8 @@ "ဩ": 8 }, "timeago_nd_tokens": { - "မနေ့က": "1D", - "ယနေ့": "0D" + "ယနေ့": "0D", + "မနေ့က": "1D" }, "comma_decimal": false, "number_tokens": { @@ -2579,18 +2747,21 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dag": "D", - "dagen": "D", - "jaar": "Y", - "maand": "M", - "maanden": "M", - "minuten": "m", - "minuut": "m", "seconde": "s", "seconden": "s", + "sec.": "s", + "minuut": "m", + "minuten": "m", + "min.": "m", "uur": "h", + "dag": "D", + "dagen": "D", + "dgn": "D", "week": "W", - "weken": "W" + "weken": "W", + "maand": "M", + "maanden": "M", + "jaar": "Y" }, "date_order": "DY", "months": { @@ -2608,8 +2779,8 @@ "sep": 9 }, "timeago_nd_tokens": { - "gisteren": "1D", - "vandaag": "0D" + "vandaag": "0D", + "gisteren": "1D" }, "comma_decimal": true, "number_tokens": { @@ -2631,19 +2802,25 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sekund": "s", + "sekunder": "s", + "sek": "s", + "minutt": "m", + "minutter": "m", + "min": "m", + "time": "h", + "timer": "h", + "t": "h", "dag": "D", "dager": "D", "døgn": "D", - "minutt": "m", - "minutter": "m", - "måned": "M", - "måneder": "M", - "sekund": "s", - "sekunder": "s", - "time": "h", - "timer": "h", + "d.": "D", "uke": "W", "uker": "W", + "u.": "W", + "måned": "M", + "måneder": "M", + "md.": "M", "år": "Y" }, "date_order": "DY", @@ -2688,14 +2865,20 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ଘଣ୍ଟା": "h", - "ଦିନ": "D", - "ବର୍ଷ": "Y", - "ମାସ": "M", + "ସେକେଣ୍ଡ": "s", + "ସେ.": "s", "ମିନିଟ୍": "m", "ମିନିଟ୍‌": "m", + "ମି.": "m", + "ଘଣ୍ଟା": "h", + "ଘ.": "h", + "ଦିନ": "D", "ସପ୍ତାହ": "W", - "ସେକେଣ୍ଡ": "s" + "ସପ୍ତା.": "W", + "ମାସ": "M", + "ମା.": "M", + "ବର୍ଷ": "Y", + "ବ.": "Y" }, "date_order": "DY", "months": { @@ -2743,16 +2926,16 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "ਸਕਿੰਟ": "s", + "ਮਿੰਟ": "m", "ਘੰਟਾ": "h", "ਘੰਟੇ": "h", "ਦਿਨ": "D", + "ਹਫ਼ਤਾ": "W", + "ਹਫ਼ਤੇ": "W", "ਮਹੀਨਾ": "M", "ਮਹੀਨੇ": "M", - "ਮਿੰਟ": "m", - "ਸਕਿੰਟ": "s", - "ਸਾਲ": "Y", - "ਹਫ਼ਤਾ": "W", - "ਹਫ਼ਤੇ": "W" + "ਸਾਲ": "Y" }, "date_order": "DY", "months": { @@ -2795,27 +2978,38 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dni": "D", - "dzień": "D", - "godzin": "h", - "godziny": "h", + "sekundę": "s", + "sekundy": "s", + "sekunda": "s", + "sekund": "s", + "sek.": "s", + "minutę": "m", + "minuty": "m", + "minut": "m", + "minuta": "m", + "min": "m", "godzinę": "h", - "lat": "Y", - "lata": "Y", + "godziny": "h", + "godzin": "h", + "godz.": "h", + "dzień": "D", + "dni": "D", + "dnia": "D", + "tydzień": "W", + "tygodnie": "W", + "tygodni": "W", + "tygodnia": "W", + "tydz.": "W", + "tyg.": "W", "miesiąc": "M", "miesiące": "M", "miesięcy": "M", - "minut": "m", - "minuta": "m", - "minuty": "m", - "minutę": "m", + "miesiąca": "M", + "mies.": "M", "rok": "Y", - "sekund": "s", - "sekunda": "s", - "sekundy": "s", - "sekundę": "s", - "tydzień": "W", - "tygodnie": "W" + "lata": "Y", + "lat": "Y", + "roku": "Y" }, "date_order": "DY", "months": { @@ -2857,20 +3051,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ano": "Y", - "anos": "Y", - "dia": "D", - "dias": "D", - "hora": "h", - "horas": "h", - "meses": "M", - "minuto": "m", - "minutos": "m", - "mês": "M", "segundo": "s", "segundos": "s", + "seg.": "s", + "minuto": "m", + "minutos": "m", + "min.": "m", + "hora": "h", + "horas": "h", + "h": "h", + "dia": "D", + "dias": "D", "semana": "W", - "semanas": "W" + "semanas": "W", + "sem.": "W", + "mês": "M", + "meses": "M", + "ano": "Y", + "anos": "Y" }, "date_order": "DY", "months": { @@ -2912,20 +3110,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ano": "Y", - "anos": "Y", - "dia": "D", - "dias": "D", - "hora": "h", - "horas": "h", - "meses": "M", - "minuto": "m", - "minutos": "m", - "mês": "M", "segundo": "s", "segundos": "s", + "s": "s", + "minuto": "m", + "minutos": "m", + "min": "m", + "hora": "h", + "horas": "h", + "h": "h", + "dia": "D", + "dias": "D", "semana": "W", - "semanas": "W" + "semanas": "W", + "sem.": "W", + "mês": "M", + "meses": "M", + "ano": "Y", + "anos": "Y" }, "date_order": "DMY", "months": {}, @@ -2952,20 +3154,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "an": "Y", - "ani": "Y", - "luni": "M", - "lună": "M", + "secundă": "s", + "secunde": "s", + "sec.": "s", "minut": "m", "minute": "m", - "ore": "h", + "min.": "m", "oră": "h", - "secunde": "s", - "secundă": "s", - "săptămâni": "W", - "săptămână": "W", + "ore": "h", + "h": "h", "zi": "D", - "zile": "D" + "zile": "D", + "săptămână": "W", + "săptămâni": "W", + "săpt.": "W", + "lună": "M", + "luni": "M", + "an": "Y", + "ani": "Y" }, "date_order": "DY", "months": { @@ -3007,28 +3213,37 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "год": "Y", - "года": "Y", + "секунду": "s", + "секунды": "s", + "секунд": "s", + "секунда": "s", + "сек.": "s", + "минуту": "m", + "минуты": "m", + "минут": "m", + "минута": "m", + "мин.": "m", + "час": "h", + "часа": "h", + "часов": "h", + "ч": "h", "день": "D", - "дней": "D", "дня": "D", - "лет": "Y", + "дней": "D", + "дн.": "D", + "неделю": "W", + "недели": "W", + "недель": "W", + "нед.": "W", "месяц": "M", "месяца": "M", "месяцев": "M", - "минут": "m", - "минута": "m", - "минуту": "m", - "минуты": "m", - "недели": "W", - "неделю": "W", - "секунд": "s", - "секунда": "s", - "секунду": "s", - "секунды": "s", - "час": "h", - "часа": "h", - "часов": "h" + "мес.": "M", + "год": "Y", + "года": "Y", + "лет": "Y", + "г.": "Y", + "л.": "Y" }, "date_order": "DY", "months": { @@ -3046,8 +3261,8 @@ "янв.": 1 }, "timeago_nd_tokens": { - "вчера": "1D", - "сегодня": "0D" + "сегодня": "0D", + "вчера": "1D" }, "comma_decimal": true, "number_tokens": { @@ -3069,12 +3284,12 @@ "by_char": false, "timeago_tokens": { "තත්පර": "s", - "දින": "D", - "පැය": "h", - "මාස": "M", "මිනිත්තු": "m", - "වසර": "Y", - "සති": "W" + "පැය": "h", + "දින": "D", + "සති": "W", + "මාස": "M", + "වසර": "Y" }, "date_order": "YD", "months": { @@ -3116,26 +3331,37 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dňami": "D", - "dňom": "D", - "hodinami": "h", - "hodinou": "h", - "mesiacmi": "M", - "mesiacom": "M", + "sekundou": "s", + "sekundami": "s", + "sekundy": "s", + "sekunda": "s", + "sekúnd": "s", + "s": "s", + "minútou": "m", + "minútami": "m", + "minúty": "m", "minút": "m", "minúta": "m", - "minútami": "m", - "minútou": "m", - "minúty": "m", - "rokmi": "Y", - "rokom": "Y", - "sekunda": "s", - "sekundami": "s", - "sekundou": "s", - "sekundy": "s", - "sekúnd": "s", + "min": "m", + "hodinou": "h", + "hodinami": "h", + "h": "h", + "dňom": "D", + "dňami": "D", + "dňa": "D", + "d.": "D", + "týždňom": "W", "týždňami": "W", - "týždňom": "W" + "týždňa": "W", + "týž.": "W", + "mesiacom": "M", + "mesiacmi": "M", + "mesiaca": "M", + "mes.": "M", + "rokom": "Y", + "rokmi": "Y", + "roka": "Y", + "r.": "Y" }, "date_order": "DMY", "months": {}, @@ -3164,36 +3390,40 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dnem": "D", - "dnevi": "D", - "dnevom": "D", - "dnevoma": "D", - "leti": "Y", - "letom": "Y", - "letoma": "Y", - "mesecem": "M", - "mesecema": "M", - "meseci": "M", - "minut": "m", - "minuta": "m", - "minutama": "m", - "minutami": "m", - "minute": "m", - "minuti": "m", - "minuto": "m", "sekund": "s", "sekunda": "s", - "sekundama": "s", - "sekundami": "s", "sekunde": "s", "sekundi": "s", "sekundo": "s", - "tedni": "W", - "tednom": "W", - "tednoma": "W", + "sekundama": "s", + "sekundami": "s", + "s": "s", + "minut": "m", + "minuta": "m", + "minute": "m", + "minuti": "m", + "minuto": "m", + "minutama": "m", + "minutami": "m", + "min.": "m", + "uro": "h", "urama": "h", "urami": "h", - "uro": "h" + "dnevom": "D", + "dnevoma": "D", + "dnevi": "D", + "dnem": "D", + "tednom": "W", + "tednoma": "W", + "tedni": "W", + "ted.": "W", + "mesecem": "M", + "mesecema": "M", + "meseci": "M", + "mes.": "M", + "letom": "Y", + "letoma": "Y", + "leti": "Y" }, "date_order": "DY", "months": { @@ -3235,14 +3465,16 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sekondë": "s", + "sekonda": "s", + "sek": "s", + "minutë": "m", + "minuta": "m", + "min": "m", + "orë": "h", "ditë": "D", "javë": "W", - "minuta": "m", - "minutë": "m", "muaj": "M", - "orë": "h", - "sekonda": "s", - "sekondë": "s", "vit": "Y", "vjet": "Y" }, @@ -3262,8 +3494,8 @@ "tet": 10 }, "timeago_nd_tokens": { - "dje": "1D", - "sot": "0D" + "sot": "0D", + "dje": "1D" }, "comma_decimal": true, "number_tokens": { @@ -3286,24 +3518,27 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "година": "Y", - "године": "Y", - "годину": "Y", - "дан": "D", - "дана": "D", - "месец": "M", - "месеца": "M", - "месеци": "M", - "минут": "m", + "секунде": "s", + "секунди": "s", + "секунда": "s", + "сек.": "s", "минута": "m", - "недеље": "W", - "недељу": "W", - "сат": "h", + "минут": "m", + "мин.": "m", "сата": "h", "сати": "h", - "секунда": "s", - "секунде": "s", - "секунди": "s" + "ч.": "h", + "дана": "D", + "д.": "D", + "недеље": "W", + "недеља": "W", + "нед.": "W", + "месеца": "M", + "месеци": "M", + "мес.": "M", + "године": "Y", + "година": "Y", + "год.": "Y" }, "date_order": "DMY", "months": {}, @@ -3332,25 +3567,27 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dan": "D", - "dana": "D", - "godina": "Y", - "godine": "Y", - "godinu": "Y", - "mesec": "M", - "meseca": "M", - "meseci": "M", - "minut": "m", + "sekunde": "s", + "sekundi": "s", + "sekunda": "s", + "sek.": "s", "minuta": "m", - "nedelja": "W", - "nedelje": "W", - "nedelju": "W", - "sat": "h", + "minut": "m", + "min.": "m", "sata": "h", "sati": "h", - "sekunda": "s", - "sekunde": "s", - "sekundi": "s" + "č.": "h", + "dana": "D", + "d.": "D", + "nedelje": "W", + "nedelja": "W", + "ned.": "W", + "meseca": "M", + "meseci": "M", + "mes.": "M", + "godine": "Y", + "godina": "Y", + "god.": "Y" }, "date_order": "DMY", "months": {}, @@ -3379,18 +3616,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "dag": "D", - "dagar": "D", - "minut": "m", - "minuter": "m", - "månad": "M", - "månader": "M", "sekund": "s", "sekunder": "s", - "timmar": "h", + "s": "s", + "minut": "m", + "minuter": "m", + "min": "m", "timme": "h", + "timmar": "h", + "tim": "h", + "dag": "D", + "dagar": "D", + "d": "D", "vecka": "W", "veckor": "W", + "v.": "W", + "månad": "M", + "månader": "M", + "mån.": "M", "år": "Y" }, "date_order": "DY", @@ -3432,15 +3675,15 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sekunde": "s", "dakika": "m", - "miaka": "Y", + "saa": "h", + "siku": "D", + "wiki": "W", + "mwezi": "M", "miezi": "M", "mwaka": "Y", - "mwezi": "M", - "saa": "h", - "sekunde": "s", - "siku": "D", - "wiki": "W" + "miaka": "Y" }, "date_order": "DY", "months": { @@ -3458,8 +3701,8 @@ "sep": 9 }, "timeago_nd_tokens": { - "jana": "1D", - "leo": "0D" + "leo": "0D", + "jana": "1D" }, "comma_decimal": false, "number_tokens": { @@ -3482,23 +3725,28 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ஆண்டிற்கு": "Y", - "ஆண்டுகளுக்கு": "Y", - "நாட்களுக்கு": "D", - "நாளுக்கு": "D", - "நிமிடங்களுக்கு": "m", - "நிமிடங்கள்": "m", + "விநாடிக்கு": "s", + "விநாடிகளுக்கு": "s", + "விநா.": "s", + "விநாடி": "s", + "விநாடிகள்": "s", "நிமிடத்திற்கு": "m", + "நிமிடங்களுக்கு": "m", + "நிமி.": "m", + "நிமிடங்கள்": "m", "நிமிடம்": "m", "மணிநேரம்": "h", - "மாதங்களுக்கு": "M", - "மாதத்துக்கு": "M", + "மணி.": "h", + "நாளுக்கு": "D", + "நாட்களுக்கு": "D", + "வாரத்திற்கு": "W", "வாரங்களுக்கு": "W", - "வாரம்": "W", - "விநாடி": "s", - "விநாடிகளுக்கு": "s", - "விநாடிகள்": "s", - "விநாடிக்கு": "s" + "வார.": "W", + "மாதத்துக்கு": "M", + "மாதங்களுக்கு": "M", + "மாத.": "M", + "ஆண்டிற்கு": "Y", + "ஆண்டுகளுக்கு": "Y" }, "date_order": "DY", "months": { @@ -3539,22 +3787,26 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "గంట": "h", - "గంటల": "h", + "సెకను": "s", + "సెకన్ల": "s", + "సెకన్లు": "s", + "సెక.": "s", "నిమిషం": "m", "నిమిషాల": "m", "నిమిషాలు": "m", - "నెల": "M", - "నెలల": "M", + "నిమి.": "m", + "గంట": "h", + "గంటల": "h", + "గం.": "h", "రోజు": "D", "రోజుల": "D", "వారం": "W", "వారాల": "W", + "నెల": "M", + "నెలల": "M", "సంవత్సరం": "Y", "సంవత్సరాల": "Y", - "సెకను": "s", - "సెకన్ల": "s", - "సెకన్లు": "s" + "సం.": "Y" }, "date_order": "DY", "months": { @@ -3596,16 +3848,22 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ชั่วโมงที่ผ่านมา": "h", - "นาที": "m", + "วินาทีที่ผ่านมา": "s", + "วินาทีที่แล้ว": "s", + "วินาที": "s", "นาทีที่ผ่านมา": "m", - "ปีที่แล้ว": "Y", + "นาทีที่แล้ว": "m", + "นาที": "m", + "ชั่วโมงที่ผ่านมา": "h", + "ชม.": "h", + "ที่แล้ว": "h", "วันที่ผ่านมา": "D", "วันที่แล้ว": "D", - "วินาที": "s", - "วินาทีที่ผ่านมา": "s", "สัปดาห์ที่ผ่านมา": "W", - "เดือนที่ผ่านมา": "M" + "สัปดาห์ที่แล้ว": "W", + "เดือนที่ผ่านมา": "M", + "เดือนที่แล้ว": "M", + "ปีที่แล้ว": "Y" }, "date_order": "DY", "months": { @@ -3623,8 +3881,8 @@ "เม.ย.": 4 }, "timeago_nd_tokens": { - "อัปเดตเมื่อวานนี้": "1D", - "อัปเดตแล้ววันนี้": "0D" + "อัปเดตแล้ววันนี้": "0D", + "อัปเดตเมื่อวานนี้": "1D" }, "comma_decimal": false, "number_tokens": { @@ -3650,12 +3908,16 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ay": "M", + "saniye": "s", + "sn.": "s", "dakika": "m", + "dk.": "m", + "saat": "h", + "sa.": "h", "gün": "D", "hafta": "W", - "saat": "h", - "saniye": "s", + "hf.": "W", + "ay": "M", "yıl": "Y" }, "date_order": "DY", @@ -3698,28 +3960,40 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "годин": "h", - "години": "h", + "секунду": "s", + "секунди": "s", + "секунд": "s", + "секунда": "s", + "с": "s", + "хвилину": "m", + "хвилини": "m", + "хвилин": "m", + "хвилина": "m", + "хв": "m", "годину": "h", + "години": "h", + "годин": "h", + "год": "h", "день": "D", "дні": "D", "днів": "D", + "дня": "D", + "дн.": "D", + "тиждень": "W", + "тижні": "W", + "тижнів": "W", + "тижня": "W", + "тиж.": "W", "місяць": "M", "місяці": "M", "місяців": "M", + "місяця": "M", + "міс.": "M", + "рік": "Y", "роки": "Y", "років": "Y", - "рік": "Y", - "секунд": "s", - "секунда": "s", - "секунди": "s", - "секунду": "s", - "тиждень": "W", - "тижні": "W", - "хвилин": "m", - "хвилина": "m", - "хвилини": "m", - "хвилину": "m" + "року": "Y", + "р.": "Y" }, "date_order": "DY", "months": { @@ -3737,8 +4011,8 @@ "черв.": 6 }, "timeago_nd_tokens": { - "вчора": "1D", - "сьогодні": "0D" + "сьогодні": "0D", + "вчора": "1D" }, "comma_decimal": true, "number_tokens": { @@ -3761,20 +4035,21 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "دن": "D", - "دنوں": "D", - "سال": "Y", - "سیکنڈ": "s", "سیکنڈز": "s", + "سیکنڈ": "s", "منٹ": "m", "منٹ،": "m", "منٹس": "m", - "مہینہ": "M", - "مہینے": "M", "گھنٹہ": "h", "گھنٹے": "h", + "دن": "D", + "دنوں": "D", "ہفتہ": "W", - "ہفتے": "W" + "ہفتے": "W", + "مہینہ": "M", + "مہینے": "M", + "ماہ": "M", + "سال": "Y" }, "date_order": "DY", "months": { @@ -3817,12 +4092,12 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "daqiqa": "m", - "hafta": "W", - "kun": "D", - "oy": "M", - "soat": "h", "soniya": "s", + "daqiqa": "m", + "soat": "h", + "kun": "D", + "hafta": "W", + "oy": "M", "yil": "Y" }, "date_order": "DY", @@ -3864,13 +4139,12 @@ "by_char": false, "timeago_tokens": { "giây": "s", + "phút": "m", "giờ": "h", "ngày": "D", - "năm": "Y", - "phút": "m", + "tuần": "W", "tháng": "M", - "tiếng": "h", - "tuần": "W" + "năm": "Y" }, "date_order": "DMY", "months": {}, @@ -3897,19 +4171,19 @@ "equivalent": [], "by_char": true, "timeago_tokens": { + "秒": "s", "分": "m", - "周": "W", - "天": "D", "小": "h", - "年": "Y", + "天": "D", + "周": "W", "月": "M", - "秒": "s" + "年": "Y" }, "date_order": "YMD", "months": {}, "timeago_nd_tokens": { "今": "0D", - "日": "1D" + "昨": "1D" }, "comma_decimal": false, "number_tokens": { @@ -3931,20 +4205,20 @@ "equivalent": [], "by_char": true, "timeago_tokens": { + "秒": "s", "分": "m", - "天": "D", "小": "h", - "年": "Y", + "天": "D", "日": "D", - "月": "M", "期": "W", - "秒": "s" + "月": "M", + "年": "Y" }, "date_order": "YMD", "months": {}, "timeago_nd_tokens": { "今": "0D", - "天": "1D" + "昨": "1D" }, "comma_decimal": false, "number_tokens": { @@ -3976,7 +4250,7 @@ "months": {}, "timeago_nd_tokens": { "今": "0D", - "天": "1D" + "昨": "1D" }, "comma_decimal": false, "number_tokens": { @@ -3996,20 +4270,29 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "amaminithi": "m", - "amasekhondi": "s", - "amaviki": "W", - "emahoreni": "h", - "ezinsukwini": "D", - "ihora": "h", - "iminithi": "m", - "iminyaka": "Y", - "inyanga": "M", "isekhondi": "s", - "iviki": "W", - "izinyanga": "M", + "amasekhondi": "s", + "iminithi": "m", + "amaminithi": "m", + "ihora": "h", + "emahoreni": "h", "osukwini": "D", - "unyaka": "Y" + "olungu": "D", + "olwedlule": "D", + "ezinsukwini": "D", + "ezingu": "D", + "ezedlule.": "D", + "usuku": "D", + "izinsuku": "D", + "iviki": "W", + "evikini": "W", + "elingu": "W", + "amaviki": "W", + "inyanga": "M", + "izinyanga": "M", + "unyaka": "Y", + "odlule": "Y", + "iminyaka": "Y" }, "date_order": "DY", "months": { @@ -4027,8 +4310,8 @@ "sep": 9 }, "timeago_nd_tokens": { - "izolo": "1D", - "namuhla": "0D" + "namuhla": "0D", + "izolo": "1D" }, "comma_decimal": false, "number_tokens": { diff --git a/testfiles/dict/timeago_samples_short.json b/testfiles/dict/timeago_samples_short.json new file mode 100644 index 0000000..1b3aac6 --- /dev/null +++ b/testfiles/dict/timeago_samples_short.json @@ -0,0 +1,3488 @@ +{ + "af": [ + "35 min. gelede", + "50 min. gelede", + "1 u. gelede", + "2 u. gelede", + "3 u. gelede", + "4 u. gelede", + "5 u. gelede", + "6 u. gelede", + "7 u. gelede", + "8 u. gelede", + "9 u. gelede", + "12 u. gelede", + "17 u. gelede", + "18 u. gelede", + "19 u. gelede", + "20 u. gelede", + "10 u. gelede", + "11 u. gelede", + "13 u. gelede", + "1 dag gelede", + "2 dae gelede", + "3 dae gelede", + "4 dae gelede", + "6 dae gelede", + "8 dae gelede", + "10 dae gelede", + "11 dae gelede", + "12 dae gelede", + "13 dae gelede", + "2 w. gelede", + "3 w. gelede", + "1 md. gelede", + "4 w. gelede", + "7 md. gelede", + "10 md. gelede", + "1 j. gelede", + "2 j. gelede", + "3 j. gelede", + "4 j. gelede", + "5 j. gelede" + ], + "am": [ + "ከ35 ደቂቃዎች በፊት", + "ከ50 ደቂቃዎች በፊት", + "ከ1 ሰዓት በፊት", + "ከ2 ሰዓቶች በፊት", + "ከ3 ሰዓቶች በፊት", + "ከ4 ሰዓቶች በፊት", + "ከ5 ሰዓቶች በፊት", + "ከ6 ሰዓቶች በፊት", + "ከ7 ሰዓቶች በፊት", + "ከ8 ሰዓቶች በፊት", + "ከ9 ሰዓቶች በፊት", + "ከ12 ሰዓቶች በፊት", + "ከ17 ሰዓቶች በፊት", + "ከ18 ሰዓቶች በፊት", + "ከ19 ሰዓቶች በፊት", + "ከ20 ሰዓቶች በፊት", + "ከ10 ሰዓቶች በፊት", + "ከ11 ሰዓቶች በፊት", + "ከ13 ሰዓቶች በፊት", + "ከ 1 ቀን በፊት", + "ከ2 ቀኖች በፊት", + "ከ3 ቀኖች በፊት", + "ከ4 ቀኖች በፊት", + "ከ6 ቀኖች በፊት", + "ከ8 ቀኖች በፊት", + "ከ10 ቀኖች በፊት", + "ከ11 ቀኖች በፊት", + "ከ12 ቀኖች በፊት", + "ከ13 ቀኖች በፊት", + "ከ2 ሳምንታት በፊት", + "ከ3 ሳምንታት በፊት", + "ከ1 ወራት በፊት", + "ከ4 ሳምንታት በፊት", + "ከ7 ወራት በፊት", + "ከ10 ወራት በፊት", + "ከ1 ዓመታት በፊት", + "ከ2 ዓመታት በፊት", + "ከ3 ዓመታት በፊት", + "ከ4 ዓመታት በፊት", + "ከ5 ዓመታት በፊት" + ], + "ar": [ + "قبل 35 دقيقة", + "قبل 50 دقيقة", + "قبل ساعة واحدة", + "قبل ساعتين", + "قبل 3 ساعات", + "قبل 4 ساعات", + "قبل 5 ساعات", + "قبل 6 ساعات", + "قبل 7 ساعات", + "قبل 8 ساعات", + "قبل 9 ساعات", + "قبل 12 ساعة", + "قبل 17 ساعة", + "قبل 18 ساعة", + "قبل 19 ساعة", + "قبل 20 ساعة", + "قبل 10 ساعات", + "قبل 11 ساعة", + "قبل 13 ساعة", + "قبل يوم واحد", + "قبل يومين", + "قبل 3 أيام", + "قبل 4 أيام", + "قبل 6 أيام", + "قبل 8 أيام", + "قبل 10 أيام", + "قبل 11 يومًا", + "قبل 12 يومًا", + "قبل 13 يومًا", + "قبل أسبوعين", + "قبل 3 أسابيع", + "قبل شهر واحد", + "قبل 4 أسابيع", + "خلال 7 أشهر", + "خلال 10 أشهر", + "قبل سنة واحدة", + "قبل سنتين", + "قبل 3 سنوات", + "قبل 4 سنوات", + "قبل 5 سنوات" + ], + "as": [ + "35 মিনিট পূৰ্বে", + "50 মিনিট পূৰ্বে", + "1 ঘণ্টা পূৰ্বে", + "2 ঘণ্টা পূৰ্বে", + "3 ঘণ্টা পূৰ্বে", + "4 ঘণ্টা পূৰ্বে", + "5 ঘণ্টা পূৰ্বে", + "6 ঘণ্টা পূৰ্বে", + "7 ঘণ্টা পূৰ্বে", + "8 ঘণ্টা পূৰ্বে", + "9 ঘণ্টা পূৰ্বে", + "12 ঘণ্টা পূৰ্বে", + "17 ঘণ্টা পূৰ্বে", + "18 ঘণ্টা পূৰ্বে", + "19 ঘণ্টা পূৰ্বে", + "20 ঘণ্টা পূৰ্বে", + "10 ঘণ্টা পূৰ্বে", + "11 ঘণ্টা পূৰ্বে", + "13 ঘণ্টা পূৰ্বে", + "1 দিন পূৰ্বে", + "2 দিন পূৰ্বে", + "3 দিন পূৰ্বে", + "4 দিন পূৰ্বে", + "6 দিন পূৰ্বে", + "8 দিন পূৰ্বে", + "10 দিন পূৰ্বে", + "11 দিন পূৰ্বে", + "12 দিন পূৰ্বে", + "13 দিন পূৰ্বে", + "2 সপ্তাহ পূৰ্বে", + "3 সপ্তাহ পূৰ্বে", + "1 মাহ পূৰ্বে", + "4 সপ্তাহ পূৰ্বে", + "7 মাহ পূৰ্বে", + "10 মাহ পূৰ্বে", + "1 বছৰৰ পূৰ্বে", + "2 বছৰৰ পূৰ্বে", + "3 বছৰৰ পূৰ্বে", + "4 বছৰৰ পূৰ্বে", + "5 বছৰৰ পূৰ্বে" + ], + "az": [ + "35 dəqiqə öncə", + "50 dəqiqə öncə", + "1 saat öncə", + "2 saat öncə", + "3 saat öncə", + "4 saat öncə", + "5 saat öncə", + "6 saat öncə", + "7 saat öncə", + "8 saat öncə", + "9 saat öncə", + "12 saat öncə", + "17 saat öncə", + "18 saat öncə", + "19 saat öncə", + "20 saat öncə", + "10 saat öncə", + "11 saat öncə", + "13 saat öncə", + "1 gün öncə", + "2 gün öncə", + "3 gün öncə", + "4 gün öncə", + "6 gün öncə", + "8 gün öncə", + "10 gün öncə", + "11 gün öncə", + "12 gün öncə", + "13 gün öncə", + "2 həftə öncə", + "3 həftə öncə", + "1 ay öncə", + "4 həftə öncə", + "7 ay öncə", + "10 ay öncə", + "1 il öncə", + "2 il öncə", + "3 il öncə", + "4 il öncə", + "5 il öncə" + ], + "be": [ + "35 хв таму", + "50 хв таму", + "1 гадз таму", + "2 гадз таму", + "3 гадз таму", + "4 гадз таму", + "5 гадз таму", + "6 гадз таму", + "7 гадз таму", + "8 гадз таму", + "9 гадз таму", + "12 гадз таму", + "17 гадз таму", + "18 гадз таму", + "19 гадз таму", + "20 гадз таму", + "10 гадз таму", + "11 гадз таму", + "13 гадз таму", + "1 дзень таму", + "2 дні таму", + "3 дні таму", + "4 дні таму", + "6 дзён таму", + "8 дзён таму", + "10 дзён таму", + "11 дзён таму", + "12 дзён таму", + "13 дзён таму", + "2 тыд таму", + "3 тыд таму", + "1 мес. таму", + "4 тыд таму", + "7 мес. таму", + "10 мес. таму", + "1 г. таму", + "2 г. таму", + "3 г. таму", + "4 г. таму", + "5 г. таму" + ], + "bg": [ + "преди 35 мин", + "преди 50 мин", + "преди 1 ч", + "преди 2 ч", + "преди 3 ч", + "преди 4 ч", + "преди 5 ч", + "преди 6 ч", + "преди 7 ч", + "преди 8 ч", + "преди 9 ч", + "преди 12 ч", + "преди 17 ч", + "преди 18 ч", + "преди 19 ч", + "преди 20 ч", + "преди 10 ч", + "преди 11 ч", + "преди 13 ч", + "преди 1 ден", + "преди 2 дни", + "преди 3 дни", + "преди 4 дни", + "преди 6 дни", + "преди 8 дни", + "преди 10 дни", + "преди 11 дни", + "преди 12 дни", + "преди 13 дни", + "преди 2 седм.", + "преди 3 седм.", + "преди 1 м.", + "преди 4 седм.", + "преди 7 м.", + "преди 10 м.", + "преди 1 г.", + "преди 2 г.", + "преди 3 г.", + "преди 4 г.", + "преди 5 г." + ], + "bn": [ + "35 মিনিট আগে", + "50 মিনিট আগে", + "1 ঘন্টা আগে", + "2 ঘন্টা আগে", + "3 ঘন্টা আগে", + "4 ঘন্টা আগে", + "5 ঘন্টা আগে", + "6 ঘন্টা আগে", + "7 ঘন্টা আগে", + "8 ঘন্টা আগে", + "9 ঘন্টা আগে", + "12 ঘন্টা আগে", + "17 ঘন্টা আগে", + "18 ঘন্টা আগে", + "19 ঘন্টা আগে", + "20 ঘন্টা আগে", + "10 ঘন্টা আগে", + "11 ঘন্টা আগে", + "13 ঘন্টা আগে", + "1 দিন আগে", + "2 দিন আগে", + "3 দিন আগে", + "4 দিন আগে", + "6 দিন আগে", + "8 দিন আগে", + "10 দিন আগে", + "11 দিন আগে", + "12 দিন আগে", + "13 দিন আগে", + "2 সপ্তাহ আগে", + "3 সপ্তাহ আগে", + "1 মাস আগে", + "4 সপ্তাহ আগে", + "7 মাস আগে", + "10 মাস আগে", + "1 বছর পূর্বে", + "2 বছর পূর্বে", + "3 বছর পূর্বে", + "4 বছর পূর্বে", + "5 বছর পূর্বে" + ], + "bs": [ + "prije 35 min.", + "prije 50 min.", + "prije 1 sat", + "prije 2 sata", + "prije 3 sata", + "prije 4 sata", + "prije 5 sati", + "prije 6 sati", + "prije 7 sati", + "prije 8 sati", + "prije 9 sati", + "prije 12 sati", + "prije 17 sati", + "prije 18 sati", + "prije 19 sati", + "prije 20 sati", + "prije 10 sati", + "prije 11 sati", + "prije 13 sati", + "prije 1 d.", + "prije 2 d.", + "prije 3 d.", + "prije 4 d.", + "prije 6 d.", + "prije 8 d.", + "prije 10 d.", + "prije 11 d.", + "prije 12 d.", + "prije 13 d.", + "prije 2 sed.", + "prije 3 sed.", + "prije 1 mj.", + "prije 4 sed.", + "prije 7 mj.", + "prije 10 mj.", + "prije 1 god.", + "prije 2 god.", + "prije 3 god.", + "prije 4 god.", + "prije 5 god." + ], + "ca": [ + "fa 35 min", + "fa 50 min", + "fa 1 h", + "fa 2 h", + "fa 3 h", + "fa 4 h", + "fa 5 h", + "fa 6 h", + "fa 7 h", + "fa 8 h", + "fa 9 h", + "fa 12 h", + "fa 17 h", + "fa 18 h", + "fa 19 h", + "fa 20 h", + "fa 10 h", + "fa 11 h", + "fa 13 h", + "fa 1 dia", + "fa 2 dies", + "fa 3 dies", + "fa 4 dies", + "fa 6 dies", + "fa 8 dies", + "fa 10 dies", + "fa 11 dies", + "fa 12 dies", + "fa 13 dies", + "fa 2 setm.", + "fa 3 setm.", + "fa 1 mes", + "fa 4 setm.", + "fa 7 mesos", + "fa 10 mesos", + "fa 1 any", + "fa 2 anys", + "fa 3 anys", + "fa 4 anys", + "fa 5 anys" + ], + "cs": [ + "před 35 min", + "před 50 min", + "před 1 h", + "před 2 h", + "před 3 h", + "před 4 h", + "před 5 h", + "před 6 h", + "před 7 h", + "před 8 h", + "před 9 h", + "před 12 h", + "před 17 h", + "před 18 h", + "před 19 h", + "před 20 h", + "před 10 h", + "před 11 h", + "před 13 h", + "před 1 dnem", + "před 2 dny", + "před 3 dny", + "před 4 dny", + "před 6 dny", + "před 8 dny", + "před 10 dny", + "před 11 dny", + "před 12 dny", + "před 13 dny", + "před 2 týd.", + "před 3 týd.", + "před 1 měs.", + "před 4 týd.", + "před 7 měs.", + "před 10 měs.", + "před 1 r.", + "před 2 r.", + "před 3 r.", + "před 4 r.", + "před 5 l." + ], + "da": [ + "35 min. siden", + "50 min. siden", + "1 time siden", + "2 timer siden", + "3 timer siden", + "4 timer siden", + "5 timer siden", + "6 timer siden", + "7 timer siden", + "8 timer siden", + "9 timer siden", + "12 timer siden", + "17 timer siden", + "18 timer siden", + "19 timer siden", + "20 timer siden", + "10 timer siden", + "11 timer siden", + "13 timer siden", + "1 dag siden", + "2 dage siden", + "3 dage siden", + "4 dage siden", + "6 dage siden", + "8 dage siden", + "10 dage siden", + "11 dage siden", + "12 dage siden", + "13 dage siden", + "2 uger siden", + "3 uger siden", + "1 md. siden", + "4 uger siden", + "7 mdr. siden", + "10 mdr. siden", + "1 år siden", + "2 år siden", + "3 år siden", + "4 år siden", + "5 år siden" + ], + "de": [ + "vor 35 Min.", + "vor 50 Min.", + "vor 1 Std.", + "vor 2 Std.", + "vor 3 Std.", + "vor 4 Std.", + "vor 5 Std.", + "vor 6 Std.", + "vor 7 Std.", + "vor 8 Std.", + "vor 9 Std.", + "vor 12 Std.", + "vor 17 Std.", + "vor 18 Std.", + "vor 19 Std.", + "vor 20 Std.", + "vor 10 Std.", + "vor 11 Std.", + "vor 13 Std.", + "vor 1 Tag", + "vor 2 Tagen", + "vor 3 Tagen", + "vor 4 Tagen", + "vor 6 Tagen", + "vor 8 Tagen", + "vor 10 Tagen", + "vor 11 Tagen", + "vor 12 Tagen", + "vor 13 Tagen", + "vor 2 Wochen", + "vor 3 Wochen", + "vor 1 Monat", + "vor 4 Wochen", + "vor 7 Monaten", + "vor 10 Monaten", + "vor 1 Jahr", + "vor 2 Jahren", + "vor 3 Jahren", + "vor 4 Jahren", + "vor 5 Jahren" + ], + "el": [ + "πριν από 35 λεπ.", + "πριν από 50 λεπ.", + "πριν από 1 ώ.", + "πριν από 2 ώ.", + "πριν από 3 ώ.", + "πριν από 4 ώ.", + "πριν από 5 ώ.", + "πριν από 6 ώ.", + "πριν από 7 ώ.", + "πριν από 8 ώ.", + "πριν από 9 ώ.", + "πριν από 12 ώ.", + "πριν από 17 ώ.", + "πριν από 18 ώ.", + "πριν από 19 ώ.", + "πριν από 20 ώ.", + "πριν από 10 ώ.", + "πριν από 11 ώ.", + "πριν από 13 ώ.", + "πριν από 1 ημ.", + "πριν από 2 ημ.", + "πριν από 3 ημ.", + "πριν από 4 ημ.", + "πριν από 6 ημ.", + "πριν από 8 ημ.", + "πριν από 10 ημ.", + "πριν από 11 ημ.", + "πριν από 12 ημ.", + "πριν από 13 ημ.", + "πριν από 2 εβδ.", + "πριν από 3 εβδ.", + "πριν από 1 μήνα", + "πριν από 4 εβδ.", + "πριν από 7 μήνες", + "πριν από 10 μήνες", + "πριν από 1 έτος", + "πριν από 2 έτη", + "πριν από 3 έτη", + "πριν από 4 έτη", + "πριν από 5 έτη" + ], + "en": [ + "35 min ago", + "50 min ago", + "1h ago", + "2h ago", + "3h ago", + "4h ago", + "5h ago", + "6h ago", + "7h ago", + "8h ago", + "9h ago", + "12h ago", + "17h ago", + "18h ago", + "19h ago", + "20h ago", + "10h ago", + "11h ago", + "13h ago", + "1d ago", + "2d ago", + "3d ago", + "4d ago", + "6d ago", + "8d ago", + "10d ago", + "11d ago", + "12d ago", + "13d ago", + "2w ago", + "3w ago", + "1mo ago", + "4w ago", + "7mo ago", + "10mo ago", + "1y ago", + "2y ago", + "3y ago", + "4y ago", + "5y ago" + ], + "en-GB": [ + "35 min ago", + "50 min ago", + "1 hr ago", + "2 hr ago", + "3 hr ago", + "4 hr ago", + "5 hr ago", + "6 hr ago", + "7 hr ago", + "8 hr ago", + "9 hr ago", + "12 hr ago", + "17 hr ago", + "18 hr ago", + "19 hr ago", + "20 hr ago", + "10 hr ago", + "11 hr ago", + "13 hr ago", + "1 day ago", + "2 days ago", + "3 days ago", + "4 days ago", + "6 days ago", + "8 days ago", + "10 days ago", + "11 days ago", + "12 days ago", + "13 days ago", + "2 wk ago", + "3 wk ago", + "1 mo ago", + "4 wk ago", + "7 mo ago", + "10 mo ago", + "1 yr ago", + "2 yr ago", + "3 yr ago", + "4 yr ago", + "5 yr ago" + ], + "en-IN": [ + "35 min ago", + "50 min ago", + "1 hr ago", + "2 hr ago", + "3 hr ago", + "4 hr ago", + "5 hr ago", + "6 hr ago", + "7 hr ago", + "8 hr ago", + "9 hr ago", + "12 hr ago", + "17 hr ago", + "18 hr ago", + "19 hr ago", + "20 hr ago", + "10 hr ago", + "11 hr ago", + "13 hr ago", + "1 day ago", + "2 days ago", + "3 days ago", + "4 days ago", + "6 days ago", + "8 days ago", + "10 days ago", + "11 days ago", + "12 days ago", + "13 days ago", + "2 wk ago", + "3 wk ago", + "1 mo ago", + "4 wk ago", + "7 mo ago", + "10 mo ago", + "1 yr ago", + "2 yr ago", + "3 yr ago", + "4 yr ago", + "5 yr ago" + ], + "es": [ + "hace 35 min", + "hace 50 min", + "hace 1 h", + "hace 2 h", + "hace 3 h", + "hace 4 h", + "hace 5 h", + "hace 6 h", + "hace 7 h", + "hace 8 h", + "hace 9 h", + "hace 12 h", + "hace 17 h", + "hace 18 h", + "hace 19 h", + "hace 20 h", + "hace 10 h", + "hace 11 h", + "hace 13 h", + "hace 1 d", + "hace 2 d", + "hace 3 d", + "hace 4 d", + "hace 6 d", + "hace 8 d", + "hace 10 d", + "hace 11 d", + "hace 12 d", + "hace 13 d", + "hace 2 sem.", + "hace 3 sem.", + "hace 1 m", + "hace 4 sem.", + "hace 7 m", + "hace 10 m", + "hace 1 a", + "hace 2 a", + "hace 3 a", + "hace 4 a", + "hace 5 a" + ], + "es-419": [ + "hace 35 min", + "hace 50 min", + "hace 1 h", + "hace 2 h", + "hace 3 h", + "hace 4 h", + "hace 5 h", + "hace 6 h", + "hace 7 h", + "hace 8 h", + "hace 9 h", + "hace 12 h", + "hace 17 h", + "hace 18 h", + "hace 19 h", + "hace 20 h", + "hace 10 h", + "hace 11 h", + "hace 13 h", + "hace 1 día", + "hace 2 días", + "hace 3 días", + "hace 4 días", + "hace 6 días", + "hace 8 días", + "hace 10 días", + "hace 11 días", + "hace 12 días", + "hace 13 días", + "hace 2 sem.", + "hace 3 sem.", + "hace 1 m", + "hace 4 sem.", + "hace 7 m", + "hace 10 m", + "hace 1 a", + "hace 2 a", + "hace 3 a", + "hace 4 a", + "hace 5 a" + ], + "es-US": [ + "hace 35 min", + "hace 50 min", + "hace 1 h", + "hace 2 h", + "hace 3 h", + "hace 4 h", + "hace 5 h", + "hace 6 h", + "hace 7 h", + "hace 8 h", + "hace 9 h", + "hace 12 h", + "hace 17 h", + "hace 18 h", + "hace 19 h", + "hace 20 h", + "hace 10 h", + "hace 11 h", + "hace 13 h", + "hace 1 día", + "hace 2 días", + "hace 3 días", + "hace 4 días", + "hace 6 días", + "hace 8 días", + "hace 10 días", + "hace 11 días", + "hace 12 días", + "hace 13 días", + "hace 2 sem.", + "hace 3 sem.", + "hace 1 m", + "hace 4 sem.", + "hace 7 m", + "hace 10 m", + "hace 1 a", + "hace 2 a", + "hace 3 a", + "hace 4 a", + "hace 5 a" + ], + "et": [ + "35 min eest", + "50 min eest", + "1 t eest", + "2 t eest", + "3 t eest", + "4 t eest", + "5 t eest", + "6 t eest", + "7 t eest", + "8 t eest", + "9 t eest", + "12 t eest", + "17 t eest", + "18 t eest", + "19 t eest", + "20 t eest", + "10 t eest", + "11 t eest", + "13 t eest", + "1 p eest", + "2 p eest", + "3 p eest", + "4 p eest", + "6 p eest", + "8 p eest", + "10 p eest", + "11 p eest", + "12 p eest", + "13 p eest", + "2 näd eest", + "3 näd eest", + "1 kuu eest", + "4 näd eest", + "7 kuu eest", + "10 kuu eest", + "1 a eest", + "2 a eest", + "3 a eest", + "4 a eest", + "5 a eest" + ], + "eu": [ + "Duela 35 minutu", + "Duela 50 minutu", + "Duela 1 ordu", + "Duela 2 ordu", + "Duela 3 ordu", + "Duela 4 ordu", + "Duela 5 ordu", + "Duela 6 ordu", + "Duela 7 ordu", + "Duela 8 ordu", + "Duela 9 ordu", + "Duela 12 ordu", + "Duela 17 ordu", + "Duela 18 ordu", + "Duela 19 ordu", + "Duela 20 ordu", + "Duela 10 ordu", + "Duela 11 ordu", + "Duela 13 ordu", + "Duela 1 egun", + "Duela 2 egun", + "Duela 3 egun", + "Duela 4 egun", + "Duela 6 egun", + "Duela 8 egun", + "Duela 10 egun", + "Duela 11 egun", + "Duela 12 egun", + "Duela 13 egun", + "Duela 2 aste", + "Duela 3 aste", + "Duela 1 hilabete", + "Duela 4 aste", + "Duela 7 hilabete", + "Duela 10 hilabete", + "Duela 1 urte", + "Duela 2 urte", + "Duela 3 urte", + "Duela 4 urte", + "Duela 5 urte" + ], + "fa": [ + "35 دقیقه پیش", + "50 دقیقه پیش", + "1 ساعت پیش", + "2 ساعت پیش", + "3 ساعت پیش", + "4 ساعت پیش", + "5 ساعت پیش", + "6 ساعت پیش", + "7 ساعت پیش", + "8 ساعت پیش", + "9 ساعت پیش", + "12 ساعت پیش", + "17 ساعت پیش", + "18 ساعت پیش", + "19 ساعت پیش", + "20 ساعت پیش", + "10 ساعت پیش", + "11 ساعت پیش", + "13 ساعت پیش", + "1 روز پیش", + "2 روز پیش", + "3 روز پیش", + "4 روز پیش", + "6 روز پیش", + "8 روز پیش", + "10 روز پیش", + "11 روز پیش", + "12 روز پیش", + "13 روز پیش", + "2 هفته پیش", + "3 هفته پیش", + "1 ماه پیش", + "4 هفته پیش", + "7 ماه پیش", + "10 ماه پیش", + "1 سال پیش", + "2 سال پیش", + "3 سال پیش", + "4 سال پیش", + "5 سال پیش" + ], + "fi": [ + "35 min sitten", + "50 min sitten", + "1 t sitten", + "2 t sitten", + "3 t sitten", + "4 t sitten", + "5 t sitten", + "6 t sitten", + "7 t sitten", + "8 t sitten", + "9 t sitten", + "12 t sitten", + "17 t sitten", + "18 t sitten", + "19 t sitten", + "20 t sitten", + "10 t sitten", + "11 t sitten", + "13 t sitten", + "1 pv sitten", + "2 pv sitten", + "3 pv sitten", + "4 pv sitten", + "6 pv sitten", + "8 pv sitten", + "10 pv sitten", + "11 pv sitten", + "12 pv sitten", + "13 pv sitten", + "2 vk sitten", + "3 vk sitten", + "1 kk sitten", + "4 vk sitten", + "7 kk sitten", + "10 kk sitten", + "1 v sitten", + "2 v sitten", + "3 v sitten", + "4 v sitten", + "5 v sitten" + ], + "fil": [ + "35 min. ang nakalipas", + "50 min. ang nakalipas", + "1 oras ang nakalipas", + "2 oras ang nakalipas", + "3 oras ang nakalipas", + "4 oras ang nakalipas", + "5 oras ang nakalipas", + "6 oras ang nakalipas", + "7 oras ang nakalipas", + "8 oras ang nakalipas", + "9 oras ang nakalipas", + "12 oras ang nakalipas", + "17 oras ang nakalipas", + "18 oras ang nakalipas", + "19 oras ang nakalipas", + "20 oras ang nakalipas", + "10 oras ang nakalipas", + "11 oras ang nakalipas", + "13 oras ang nakalipas", + "1 araw ang nakalipas", + "2 araw ang nakalipas", + "3 araw ang nakalipas", + "4 (na) araw ang nakalipas", + "6 (na) araw ang nakalipas", + "8 araw ang nakalipas", + "10 araw ang nakalipas", + "11 araw ang nakalipas", + "12 araw ang nakalipas", + "13 araw ang nakalipas", + "2 linggo ang nakalipas", + "3 linggo ang nakalipas", + "1 buwan ang nakalipas", + "4 (na) linggo ang nakalipas", + "7 buwan ang nakalipas", + "10 buwan ang nakalipas", + "1 taon ang nakalipas", + "2 taon ang nakalipas", + "3 taon ang nakalipas", + "4 taon ang nakalipas", + "5 taon ang nakalipas" + ], + "fr": [ + "il y a 35 min", + "il y a 50 min", + "il y a 1 h", + "il y a 2 h", + "il y a 3 h", + "il y a 4 h", + "il y a 5 h", + "il y a 6 h", + "il y a 7 h", + "il y a 8 h", + "il y a 9 h", + "il y a 12 h", + "il y a 17 h", + "il y a 18 h", + "il y a 19 h", + "il y a 20 h", + "il y a 10 h", + "il y a 11 h", + "il y a 13 h", + "il y a 1 j", + "il y a 2 j", + "il y a 3 j", + "il y a 4 j", + "il y a 6 j", + "il y a 8 j", + "il y a 10 j", + "il y a 11 j", + "il y a 12 j", + "il y a 13 j", + "il y a 2 sem.", + "il y a 3 sem.", + "il y a 1 m.", + "il y a 4 sem.", + "il y a 7 m.", + "il y a 10 m.", + "il y a 1 a", + "il y a 2 a", + "il y a 3 a", + "il y a 4 a", + "il y a 5 a" + ], + "fr-CA": [ + "il y a 35 min", + "il y a 50 min", + "il y a 1 h", + "il y a 2 h", + "il y a 3 h", + "il y a 4 h", + "il y a 5 h", + "il y a 6 h", + "il y a 7 h", + "il y a 8 h", + "il y a 9 h", + "il y a 12 h", + "il y a 17 h", + "il y a 18 h", + "il y a 19 h", + "il y a 20 h", + "il y a 10 h", + "il y a 11 h", + "il y a 13 h", + "il y a 1 j", + "il y a 2 j", + "il y a 3 j", + "il y a 4 j", + "il y a 6 j", + "il y a 8 j", + "il y a 10 j", + "il y a 11 j", + "il y a 12 j", + "il y a 13 j", + "il y a 2 sem.", + "il y a 3 sem.", + "il y a 1 m.", + "il y a 4 sem.", + "il y a 7 m.", + "il y a 10 m.", + "il y a 1 a", + "il y a 2 a", + "il y a 3 a", + "il y a 4 a", + "il y a 5 a" + ], + "gl": [ + "hai 35 min", + "hai 50 min", + "hai 1 h", + "hai 2 h", + "hai 3 h", + "hai 4 h", + "hai 5 h", + "hai 6 h", + "hai 7 h", + "hai 8 h", + "hai 9 h", + "hai 12 h", + "hai 17 h", + "hai 18 h", + "hai 19 h", + "hai 20 h", + "hai 10 h", + "hai 11 h", + "hai 13 h", + "hai 1 día", + "hai 2 días", + "hai 3 días", + "hai 4 días", + "hai 6 días", + "hai 8 días", + "hai 10 días", + "hai 11 días", + "hai 12 días", + "hai 13 días", + "hai 2 sem.", + "hai 3 sem.", + "hai 1 mes", + "hai 4 sem.", + "hai 7 meses", + "hai 10 meses", + "hai 1 ano", + "hai 2 anos", + "hai 3 anos", + "hai 4 anos", + "hai 5 anos" + ], + "gu": [ + "35 મિનિટ પહેલાં", + "50 મિનિટ પહેલાં", + "1 કલાક પહેલાં", + "2 કલાક પહેલાં", + "3 કલાક પહેલાં", + "4 કલાક પહેલાં", + "5 કલાક પહેલાં", + "6 કલાક પહેલાં", + "7 કલાક પહેલાં", + "8 કલાક પહેલાં", + "9 કલાક પહેલાં", + "12 કલાક પહેલાં", + "17 કલાક પહેલાં", + "18 કલાક પહેલાં", + "19 કલાક પહેલાં", + "20 કલાક પહેલાં", + "10 કલાક પહેલાં", + "11 કલાક પહેલાં", + "13 કલાક પહેલાં", + "1 દિવસ પહેલાં", + "2 દિવસ પહેલાં", + "3 દિવસ પહેલાં", + "4 દિવસ પહેલાં", + "6 દિવસ પહેલાં", + "8 દિવસ પહેલાં", + "10 દિવસ પહેલાં", + "11 દિવસ પહેલાં", + "12 દિવસ પહેલાં", + "13 દિવસ પહેલાં", + "2 અઠ. પહેલાં", + "3 અઠ. પહેલાં", + "1 મહિના પહેલાં", + "4 અઠ. પહેલાં", + "7 મહિના પહેલાં", + "10 મહિના પહેલાં", + "1 વર્ષ પહેલાં", + "2 વર્ષ પહેલાં", + "3 વર્ષ પહેલાં", + "4 વર્ષ પહેલાં", + "5 વર્ષ પહેલાં" + ], + "hi": [ + "35 मि॰ पहले", + "50 मि॰ पहले", + "1 घं॰ पहले", + "2 घं॰ पहले", + "3 घं॰ पहले", + "4 घं॰ पहले", + "5 घं॰ पहले", + "6 घं॰ पहले", + "7 घं॰ पहले", + "8 घं॰ पहले", + "9 घं॰ पहले", + "12 घं॰ पहले", + "17 घं॰ पहले", + "18 घं॰ पहले", + "19 घं॰ पहले", + "20 घं॰ पहले", + "10 घं॰ पहले", + "11 घं॰ पहले", + "13 घं॰ पहले", + "1 दिन पहले", + "2 दिन पहले", + "3 दिन पहले", + "4 दिन पहले", + "6 दिन पहले", + "8 दिन पहले", + "10 दिन पहले", + "11 दिन पहले", + "12 दिन पहले", + "13 दिन पहले", + "2 सप्ताह पहले", + "3 सप्ताह पहले", + "1 माह पहले", + "4 सप्ताह पहले", + "7 माह पहले", + "10 माह पहले", + "1 वर्ष पहले", + "2 वर्ष पहले", + "3 वर्ष पहले", + "4 वर्ष पहले", + "5 वर्ष पहले" + ], + "hr": [ + "prije 35 min", + "prije 50 min", + "prije 1 h", + "prije 2 h", + "prije 3 h", + "prije 4 h", + "prije 5 h", + "prije 6 h", + "prije 7 h", + "prije 8 h", + "prije 9 h", + "prije 12 h", + "prije 17 h", + "prije 18 h", + "prije 19 h", + "prije 20 h", + "prije 10 h", + "prije 11 h", + "prije 13 h", + "prije 1 dan", + "prije 2 dana", + "prije 3 dana", + "prije 4 dana", + "prije 6 dana", + "prije 8 dana", + "prije 10 dana", + "prije 11 dana", + "prije 12 dana", + "prije 13 dana", + "prije 2 tj.", + "prije 3 tj.", + "prije 1 mj.", + "prije 4 tj.", + "prije 7 mj.", + "prije 10 mj.", + "prije 1 g.", + "prije 2 g.", + "prije 3 g.", + "prije 4 g.", + "prije 5 g." + ], + "hu": [ + "35 perccel ezelőtt", + "50 perccel ezelőtt", + "1 órával ezelőtt", + "2 órával ezelőtt", + "3 órával ezelőtt", + "4 órával ezelőtt", + "5 órával ezelőtt", + "6 órával ezelőtt", + "7 órával ezelőtt", + "8 órával ezelőtt", + "9 órával ezelőtt", + "12 órával ezelőtt", + "17 órával ezelőtt", + "18 órával ezelőtt", + "19 órával ezelőtt", + "20 órával ezelőtt", + "10 órával ezelőtt", + "11 órával ezelőtt", + "13 órával ezelőtt", + "1 napja", + "2 napja", + "3 napja", + "4 napja", + "6 napja", + "8 napja", + "10 napja", + "11 napja", + "12 napja", + "13 napja", + "2 héttel ezelőtt", + "3 héttel ezelőtt", + "1 hónappal ezelőtt", + "4 héttel ezelőtt", + "7 hónappal ezelőtt", + "10 hónappal ezelőtt", + "1 évvel ezelőtt", + "2 évvel ezelőtt", + "3 évvel ezelőtt", + "4 évvel ezelőtt", + "5 évvel ezelőtt" + ], + "hy": [ + "35 ր առաջ", + "50 ր առաջ", + "1 ժ առաջ", + "2 ժ առաջ", + "3 ժ առաջ", + "4 ժ առաջ", + "5 ժ առաջ", + "6 ժ առաջ", + "7 ժ առաջ", + "8 ժ առաջ", + "9 ժ առաջ", + "12 ժ առաջ", + "17 ժ առաջ", + "18 ժ առաջ", + "19 ժ առաջ", + "20 ժ առաջ", + "10 ժ առաջ", + "11 ժ առաջ", + "13 ժ առաջ", + "1 օր առաջ", + "2 օր առաջ", + "3 օր առաջ", + "4 օր առաջ", + "6 օր առաջ", + "8 օր առաջ", + "10 օր առաջ", + "11 օր առաջ", + "12 օր առաջ", + "13 օր առաջ", + "2 շաբ առաջ", + "3 շաբ առաջ", + "1 ամիս առաջ", + "4 շաբ առաջ", + "7 ամիս առաջ", + "10 ամիս առաջ", + "1 տ առաջ", + "2 տ առաջ", + "3 տ առաջ", + "4 տ առաջ", + "5 տ առաջ" + ], + "id": [ + "35 mnt lalu", + "50 mnt lalu", + "1 jam lalu", + "2 jam lalu", + "3 jam lalu", + "4 jam lalu", + "5 jam lalu", + "6 jam lalu", + "7 jam lalu", + "8 jam lalu", + "9 jam lalu", + "12 jam lalu", + "17 jam lalu", + "18 jam lalu", + "19 jam lalu", + "20 jam lalu", + "10 jam lalu", + "11 jam lalu", + "13 jam lalu", + "1 h lalu", + "2 h lalu", + "3 h lalu", + "4 h lalu", + "6 h lalu", + "8 h lalu", + "10 h lalu", + "11 h lalu", + "12 h lalu", + "13 h lalu", + "2 mgg lalu", + "3 mgg lalu", + "1 bln lalu", + "4 mgg lalu", + "7 bln lalu", + "10 bln lalu", + "1 thn lalu", + "2 thn lalu", + "3 thn lalu", + "4 thn lalu", + "5 thn lalu" + ], + "is": [ + "fyrir 35 mín.", + "fyrir 50 mín.", + "fyrir 1 klst.", + "fyrir 2 klst.", + "fyrir 3 klst.", + "fyrir 4 klst.", + "fyrir 5 klst.", + "fyrir 6 klst.", + "fyrir 7 klst.", + "fyrir 8 klst.", + "fyrir 9 klst.", + "fyrir 12 klst.", + "fyrir 17 klst.", + "fyrir 18 klst.", + "fyrir 19 klst.", + "fyrir 20 klst.", + "fyrir 10 klst.", + "fyrir 11 klst.", + "fyrir 13 klst.", + "fyrir 1 degi", + "fyrir 2 dögum", + "fyrir 3 dögum", + "fyrir 4 dögum", + "fyrir 6 dögum", + "fyrir 8 dögum", + "fyrir 10 dögum", + "fyrir 11 dögum", + "fyrir 12 dögum", + "fyrir 13 dögum", + "fyrir 2 vikum", + "fyrir 3 vikum", + "fyrir 1 mán.", + "fyrir 4 vikum", + "fyrir 7 mán.", + "fyrir 10 mán.", + "fyrir 1 ári", + "fyrir 2 árum", + "fyrir 3 árum", + "fyrir 4 árum", + "fyrir 5 árum" + ], + "it": [ + "35 min fa", + "50 min fa", + "1 h fa", + "2 h fa", + "3 h fa", + "4 h fa", + "5 h fa", + "6 h fa", + "7 h fa", + "8 h fa", + "9 h fa", + "12 h fa", + "17 h fa", + "18 h fa", + "19 h fa", + "20 h fa", + "10 h fa", + "11 h fa", + "13 h fa", + "1 g fa", + "2 gg fa", + "3 gg fa", + "4 gg fa", + "6 gg fa", + "8 gg fa", + "10 gg fa", + "11 gg fa", + "12 gg fa", + "13 gg fa", + "2 sett. fa", + "3 sett. fa", + "1 mese fa", + "4 sett. fa", + "7 mesi fa", + "10 mesi fa", + "1 anno fa", + "2 anni fa", + "3 anni fa", + "4 anni fa", + "5 anni fa" + ], + "iw": [ + "לפני 35 דק׳", + "לפני 50 דק׳", + "לפני שעה", + "לפני שעתיים", + "לפני 3 שע׳", + "לפני 4 שע׳", + "לפני 5 שע׳", + "לפני 6 שע׳", + "לפני 7 שע׳", + "לפני 8 שע׳", + "לפני 9 שע׳", + "לפני 12 שע׳", + "לפני 17 שע׳", + "לפני 18 שע׳", + "לפני 19 שע׳", + "לפני 20 שע׳", + "לפני 10 שע׳", + "לפני 11 שע׳", + "לפני 13 שע׳", + "אתמול", + "לפני יומיים", + "לפני 3 ימים", + "לפני 4 ימים", + "לפני 6 ימים", + "לפני 8 ימים", + "לפני 10 ימים", + "לפני 11 ימים", + "לפני 12 ימים", + "לפני 13 ימים", + "לפני שבועיים", + "לפני 3 שב׳", + "לפני חודש", + "לפני 4 שב׳", + "לפני 7 חודשים", + "לפני 10 חודשים", + "לפני שנה", + "לפני שנתיים", + "לפני 3 שנים", + "לפני 4 שנים", + "לפני 5 שנים" + ], + "ja": [ + "35 分前", + "50 分前", + "1 時間前", + "2 時間前", + "3 時間前", + "4 時間前", + "5 時間前", + "6 時間前", + "7 時間前", + "8 時間前", + "9 時間前", + "12 時間前", + "17 時間前", + "18 時間前", + "19 時間前", + "20 時間前", + "10 時間前", + "11 時間前", + "13 時間前", + "1 日前", + "2 日前", + "3 日前", + "4 日前", + "6 日前", + "8 日前", + "10 日前", + "11 日前", + "12 日前", + "13 日前", + "2 週間前", + "3 週間前", + "1 か月前", + "4 週間前", + "7 か月前", + "10 か月前", + "1 年前", + "2 年前", + "3 年前", + "4 年前", + "5 年前" + ], + "ka": [ + "35 წთ წინ", + "50 წთ წინ", + "1 სთ წინ", + "2 სთ წინ", + "3 სთ წინ", + "4 სთ წინ", + "5 სთ წინ", + "6 სთ წინ", + "7 სთ წინ", + "8 სთ წინ", + "9 სთ წინ", + "12 სთ წინ", + "17 სთ წინ", + "18 სთ წინ", + "19 სთ წინ", + "20 სთ წინ", + "10 სთ წინ", + "11 სთ წინ", + "13 სთ წინ", + "1 დღის წინ", + "2 დღის წინ", + "3 დღის წინ", + "4 დღის წინ", + "6 დღის წინ", + "8 დღის წინ", + "10 დღის წინ", + "11 დღის წინ", + "12 დღის წინ", + "13 დღის წინ", + "2 კვ. წინ", + "3 კვ. წინ", + "1 თვის წინ", + "4 კვ. წინ", + "7 თვის წინ", + "10 თვის წინ", + "1 წლის წინ", + "2 წლის წინ", + "3 წლის წინ", + "4 წლის წინ", + "5 წლის წინ" + ], + "kk": [ + "35 мин. бұрын", + "50 мин. бұрын", + "1 сағ. бұрын", + "2 сағ. бұрын", + "3 сағ. бұрын", + "4 сағ. бұрын", + "5 сағ. бұрын", + "6 сағ. бұрын", + "7 сағ. бұрын", + "8 сағ. бұрын", + "9 сағ. бұрын", + "12 сағ. бұрын", + "17 сағ. бұрын", + "18 сағ. бұрын", + "19 сағ. бұрын", + "20 сағ. бұрын", + "10 сағ. бұрын", + "11 сағ. бұрын", + "13 сағ. бұрын", + "1 күн бұрын", + "2 күн бұрын", + "3 күн бұрын", + "4 күн бұрын", + "6 күн бұрын", + "8 күн бұрын", + "10 күн бұрын", + "11 күн бұрын", + "12 күн бұрын", + "13 күн бұрын", + "2 ап. бұрын", + "3 ап. бұрын", + "1 ай бұрын", + "4 ап. бұрын", + "7 ай бұрын", + "10 ай бұрын", + "1 ж. бұрын", + "2 ж. бұрын", + "3 ж. бұрын", + "4 ж. бұрын", + "5 ж. бұрын" + ], + "km": [ + "35 នាទី​​មុន", + "50 នាទី​​មុន", + "1 ម៉ោង​មុន", + "2 ម៉ោង​មុន", + "3 ម៉ោង​មុន", + "4 ម៉ោង​មុន", + "5 ម៉ោង​មុន", + "6 ម៉ោង​មុន", + "7 ម៉ោង​មុន", + "8 ម៉ោង​មុន", + "9 ម៉ោង​មុន", + "12 ម៉ោង​មុន", + "17 ម៉ោង​មុន", + "18 ម៉ោង​មុន", + "19 ម៉ោង​មុន", + "20 ម៉ោង​មុន", + "10 ម៉ោង​មុន", + "11 ម៉ោង​មុន", + "13 ម៉ោង​មុន", + "1 ថ្ងៃ​​មុន", + "2 ថ្ងៃ​​មុន", + "3 ថ្ងៃ​​មុន", + "4 ថ្ងៃ​​មុន", + "6 ថ្ងៃ​​មុន", + "8 ថ្ងៃ​​មុន", + "10 ថ្ងៃ​​មុន", + "11 ថ្ងៃ​​មុន", + "12 ថ្ងៃ​​មុន", + "13 ថ្ងៃ​​មុន", + "2 សប្ដាហ៍​មុន", + "3 សប្ដាហ៍​មុន", + "1 ខែមុន", + "4 សប្ដាហ៍​មុន", + "7 ខែមុន", + "10 ខែមុន", + "1 ឆ្នាំ​មុន", + "2 ឆ្នាំ​មុន", + "3 ឆ្នាំ​មុន", + "4 ឆ្នាំ​មុន", + "5 ឆ្នាំ​មុន" + ], + "kn": [ + "35 ನಿಮಿಷಗಳ ಹಿಂದೆ", + "50 ನಿಮಿಷಗಳ ಹಿಂದೆ", + "1 ಗಂಟೆ ಹಿಂದೆ", + "2 ಗಂಟೆಗಳ ಹಿಂದೆ", + "3 ಗಂಟೆಗಳ ಹಿಂದೆ", + "4 ಗಂಟೆಗಳ ಹಿಂದೆ", + "5 ಗಂಟೆಗಳ ಹಿಂದೆ", + "6 ಗಂಟೆಗಳ ಹಿಂದೆ", + "7 ಗಂಟೆಗಳ ಹಿಂದೆ", + "8 ಗಂಟೆಗಳ ಹಿಂದೆ", + "9 ಗಂಟೆಗಳ ಹಿಂದೆ", + "12 ಗಂಟೆಗಳ ಹಿಂದೆ", + "17 ಗಂಟೆಗಳ ಹಿಂದೆ", + "18 ಗಂಟೆಗಳ ಹಿಂದೆ", + "19 ಗಂಟೆಗಳ ಹಿಂದೆ", + "20 ಗಂಟೆಗಳ ಹಿಂದೆ", + "10 ಗಂಟೆಗಳ ಹಿಂದೆ", + "11 ಗಂಟೆಗಳ ಹಿಂದೆ", + "13 ಗಂಟೆಗಳ ಹಿಂದೆ", + "1 ದಿನದ ಹಿಂದೆ", + "2 ದಿನಗಳ ಹಿಂದೆ", + "3 ದಿನಗಳ ಹಿಂದೆ", + "4 ದಿನಗಳ ಹಿಂದೆ", + "6 ದಿನಗಳ ಹಿಂದೆ", + "8 ದಿನಗಳ ಹಿಂದೆ", + "10 ದಿನಗಳ ಹಿಂದೆ", + "11 ದಿನಗಳ ಹಿಂದೆ", + "12 ದಿನಗಳ ಹಿಂದೆ", + "13 ದಿನಗಳ ಹಿಂದೆ", + "2 ವಾರಗಳ ಹಿಂದೆ", + "3 ವಾರಗಳ ಹಿಂದೆ", + "1 ತಿಂಗಳು ಹಿಂದೆ", + "4 ವಾರಗಳ ಹಿಂದೆ", + "7 ತಿಂಗಳುಗಳ ಹಿಂದೆ", + "10 ತಿಂಗಳುಗಳ ಹಿಂದೆ", + "1 ವರ್ಷದ ಹಿಂದೆ", + "2 ವರ್ಷಗಳ ಹಿಂದೆ", + "3 ವರ್ಷಗಳ ಹಿಂದೆ", + "4 ವರ್ಷಗಳ ಹಿಂದೆ", + "5 ವರ್ಷಗಳ ಹಿಂದೆ" + ], + "ko": [ + "35분 전", + "50분 전", + "1시간 전", + "2시간 전", + "3시간 전", + "4시간 전", + "5시간 전", + "6시간 전", + "7시간 전", + "8시간 전", + "9시간 전", + "12시간 전", + "17시간 전", + "18시간 전", + "19시간 전", + "20시간 전", + "10시간 전", + "11시간 전", + "13시간 전", + "1일 전", + "2일 전", + "3일 전", + "4일 전", + "6일 전", + "8일 전", + "10일 전", + "11일 전", + "12일 전", + "13일 전", + "2주 전", + "3주 전", + "1개월 전", + "4주 전", + "7개월 전", + "10개월 전", + "1년 전", + "2년 전", + "3년 전", + "4년 전", + "5년 전" + ], + "ky": [ + "35 мүн. мурун", + "50 мүн. мурун", + "1 саат. мурун", + "2 саат. мурун", + "3 саат. мурун", + "4 саат. мурун", + "5 саат. мурун", + "6 саат. мурун", + "7 саат. мурун", + "8 саат. мурун", + "9 саат. мурун", + "12 саат. мурун", + "17 саат. мурун", + "18 саат. мурун", + "19 саат. мурун", + "20 саат. мурун", + "10 саат. мурун", + "11 саат. мурун", + "13 саат. мурун", + "1 күн мурун", + "2 күн мурун", + "3 күн мурун", + "4 күн мурун", + "6 күн мурун", + "8 күн мурун", + "10 күн мурун", + "11 күн мурун", + "12 күн мурун", + "13 күн мурун", + "2 апт. мурун", + "3 апт. мурун", + "1 ай мурун", + "4 апт. мурун", + "7 ай мурун", + "10 ай мурун", + "1 жыл мурун", + "2 жыл мурун", + "3 жыл мурун", + "4 жыл мурун", + "5 жыл мурун" + ], + "lo": [ + "35 ນທ. ກ່ອນ", + "50 ນທ. ກ່ອນ", + "1 ຊມ. ກ່ອນ", + "2 ຊມ. ກ່ອນ", + "3 ຊມ. ກ່ອນ", + "4 ຊມ. ກ່ອນ", + "5 ຊມ. ກ່ອນ", + "6 ຊມ. ກ່ອນ", + "7 ຊມ. ກ່ອນ", + "8 ຊມ. ກ່ອນ", + "9 ຊມ. ກ່ອນ", + "12 ຊມ. ກ່ອນ", + "17 ຊມ. ກ່ອນ", + "18 ຊມ. ກ່ອນ", + "19 ຊມ. ກ່ອນ", + "20 ຊມ. ກ່ອນ", + "10 ຊມ. ກ່ອນ", + "11 ຊມ. ກ່ອນ", + "13 ຊມ. ກ່ອນ", + "1 ມື້ກ່ອນ", + "2 ມື້ກ່ອນ", + "3 ມື້ກ່ອນ", + "4 ມື້ກ່ອນ", + "6 ມື້ກ່ອນ", + "8 ມື້ກ່ອນ", + "10 ມື້ກ່ອນ", + "11 ມື້ກ່ອນ", + "12 ມື້ກ່ອນ", + "13 ມື້ກ່ອນ", + "2 ອທ. ກ່ອນ", + "3 ອທ. ກ່ອນ", + "1 ດ. ກ່ອນ", + "4 ອທ. ກ່ອນ", + "7 ດ. ກ່ອນ", + "10 ດ. ກ່ອນ", + "1 ປີກ່ອນ", + "2 ປີກ່ອນ", + "3 ປີກ່ອນ", + "4 ປີກ່ອນ", + "5 ປີກ່ອນ" + ], + "lt": [ + "prieš 35 min.", + "prieš 50 min.", + "prieš 1 val.", + "prieš 2 val.", + "prieš 3 val.", + "prieš 4 val.", + "prieš 5 val.", + "prieš 6 val.", + "prieš 7 val.", + "prieš 8 val.", + "prieš 9 val.", + "prieš 12 val.", + "prieš 17 val.", + "prieš 18 val.", + "prieš 19 val.", + "prieš 20 val.", + "prieš 10 val.", + "prieš 11 val.", + "prieš 13 val.", + "prieš 1 d.", + "prieš 2 d.", + "prieš 3 d.", + "prieš 4 d.", + "prieš 6 d.", + "prieš 8 d.", + "prieš 10 d.", + "prieš 11 d.", + "prieš 12 d.", + "prieš 13 d.", + "prieš 2 sav.", + "prieš 3 sav.", + "prieš 1 mėn.", + "prieš 4 sav.", + "prieš 7 mėn.", + "prieš 10 mėn.", + "prieš 1 m.", + "prieš 2 m.", + "prieš 3 m.", + "prieš 4 m.", + "prieš 5 m." + ], + "lv": [ + "pirms 35 min.", + "pirms 50 min.", + "pirms 1 st.", + "pirms 2 st.", + "pirms 3 st.", + "pirms 4 st.", + "pirms 5 st.", + "pirms 6 st.", + "pirms 7 st.", + "pirms 8 st.", + "pirms 9 st.", + "pirms 12 st.", + "pirms 17 st.", + "pirms 18 st.", + "pirms 19 st.", + "pirms 20 st.", + "pirms 10 st.", + "pirms 11 st.", + "pirms 13 st.", + "pirms 1 d.", + "pirms 2 d.", + "pirms 3 d.", + "pirms 4 d.", + "pirms 6 d.", + "pirms 8 d.", + "pirms 10 d.", + "pirms 11 d.", + "pirms 12 d.", + "pirms 13 d.", + "pirms 2 ned.", + "pirms 3 ned.", + "pirms 1 mēn.", + "pirms 4 ned.", + "pirms 7 mēn.", + "pirms 10 mēn.", + "pirms 1 g.", + "pirms 2 g.", + "pirms 3 g.", + "pirms 4 g.", + "pirms 5 g." + ], + "mk": [ + "пред 35 мин.", + "пред 50 мин.", + "пред 1 час", + "пред 2 часа", + "пред 3 часа", + "пред 4 часа", + "пред 5 часа", + "пред 6 часа", + "пред 7 часа", + "пред 8 часа", + "пред 9 часа", + "пред 12 часа", + "пред 17 часа", + "пред 18 часа", + "пред 19 часа", + "пред 20 часа", + "пред 10 часа", + "пред 11 часа", + "пред 13 часа", + "пред 1 ден", + "пред 2 дена", + "пред 3 дена", + "пред 4 дена", + "пред 6 дена", + "пред 8 дена", + "пред 10 дена", + "пред 11 дена", + "пред 12 дена", + "пред 13 дена", + "пред 2 седмици", + "пред 3 седмици", + "пред 1 месец", + "пред 4 седмици", + "пред 7 месеци", + "пред 10 месеци", + "пред 1 год.", + "пред 2 год.", + "пред 3 год.", + "пред 4 год.", + "пред 5 год." + ], + "ml": [ + "35 മിനിറ്റ് മുമ്പ്", + "50 മിനിറ്റ് മുമ്പ്", + "1 മണിക്കൂർ മുമ്പ്", + "2 മണിക്കൂർ മുമ്പ്", + "3 മണിക്കൂർ മുമ്പ്", + "4 മണിക്കൂർ മുമ്പ്", + "5 മണിക്കൂർ മുമ്പ്", + "6 മണിക്കൂർ മുമ്പ്", + "7 മണിക്കൂർ മുമ്പ്", + "8 മണിക്കൂർ മുമ്പ്", + "9 മണിക്കൂർ മുമ്പ്", + "12 മണിക്കൂർ മുമ്പ്", + "17 മണിക്കൂർ മുമ്പ്", + "18 മണിക്കൂർ മുമ്പ്", + "19 മണിക്കൂർ മുമ്പ്", + "20 മണിക്കൂർ മുമ്പ്", + "10 മണിക്കൂർ മുമ്പ്", + "11 മണിക്കൂർ മുമ്പ്", + "13 മണിക്കൂർ മുമ്പ്", + "1 ദിവസം മുമ്പ്", + "2 ദിവസം മുമ്പ്", + "3 ദിവസം മുമ്പ്", + "4 ദിവസം മുമ്പ്", + "6 ദിവസം മുമ്പ്", + "8 ദിവസം മുമ്പ്", + "10 ദിവസം മുമ്പ്", + "11 ദിവസം മുമ്പ്", + "12 ദിവസം മുമ്പ്", + "13 ദിവസം മുമ്പ്", + "2 ആഴ്ച മുമ്പ്", + "3 ആഴ്ച മുമ്പ്", + "1 മാസം മുമ്പ്", + "4 ആഴ്ച മുമ്പ്", + "7 മാസം മുമ്പ്", + "10 മാസം മുമ്പ്", + "1 വർഷം മുമ്പ്", + "2 വർഷം മുമ്പ്", + "3 വർഷം മുമ്പ്", + "4 വർഷം മുമ്പ്", + "5 വർഷം മുമ്പ്" + ], + "mn": [ + "35 мин өмнө", + "50 мин өмнө", + "1 ц өмнө", + "2 ц өмнө", + "3 ц өмнө", + "4 ц өмнө", + "5 ц өмнө", + "6 ц өмнө", + "7 ц өмнө", + "8 ц өмнө", + "9 ц өмнө", + "12 ц өмнө", + "17 ц өмнө", + "18 ц өмнө", + "19 ц өмнө", + "20 ц өмнө", + "10 ц өмнө", + "11 ц өмнө", + "13 ц өмнө", + "1 өдрийн өмнө", + "2 өдрийн өмнө", + "3 өдрийн өмнө", + "4 өдрийн өмнө", + "6 өдрийн өмнө", + "8 өдрийн өмнө", + "10 өдрийн өмнө", + "11 өдрийн өмнө", + "12 өдрийн өмнө", + "13 өдрийн өмнө", + "2 7 хоногийн өмнө", + "3 7 хоногийн өмнө", + "1 сарын өмнө", + "4 7 хоногийн өмнө", + "7 сарын өмнө", + "10 сарын өмнө", + "1 жилийн өмнө", + "2 жилийн өмнө", + "3 жилийн өмнө", + "4 жилийн өмнө", + "5 жилийн өмнө" + ], + "mr": [ + "35 मिनि. पूर्वी", + "50 मिनि. पूर्वी", + "1 तासापूर्वी", + "2 तासांपूर्वी", + "3 तासांपूर्वी", + "4 तासांपूर्वी", + "5 तासांपूर्वी", + "6 तासांपूर्वी", + "7 तासांपूर्वी", + "8 तासांपूर्वी", + "9 तासांपूर्वी", + "12 तासांपूर्वी", + "17 तासांपूर्वी", + "18 तासांपूर्वी", + "19 तासांपूर्वी", + "20 तासांपूर्वी", + "10 तासांपूर्वी", + "11 तासांपूर्वी", + "13 तासांपूर्वी", + "1 दिवसापूर्वी", + "2 दिवसांपूर्वी", + "3 दिवसांपूर्वी", + "4 दिवसांपूर्वी", + "6 दिवसांपूर्वी", + "8 दिवसांपूर्वी", + "10 दिवसांपूर्वी", + "11 दिवसांपूर्वी", + "12 दिवसांपूर्वी", + "13 दिवसांपूर्वी", + "2 आठवड्यांपूर्वी", + "3 आठवड्यांपूर्वी", + "1 महिन्यापूर्वी", + "4 आठवड्यांपूर्वी", + "7 महिन्यांपूर्वी", + "10 महिन्यांपूर्वी", + "1 वर्षापूर्वी", + "2 वर्षांपूर्वी", + "3 वर्षांपूर्वी", + "4 वर्षांपूर्वी", + "5 वर्षांपूर्वी" + ], + "ms": [ + "35 min lalu", + "50 min lalu", + "1 jam lalu", + "2 jam lalu", + "3 jam lalu", + "4 jam lalu", + "5 jam lalu", + "6 jam lalu", + "7 jam lalu", + "8 jam lalu", + "9 jam lalu", + "12 jam lalu", + "17 jam lalu", + "18 jam lalu", + "19 jam lalu", + "20 jam lalu", + "10 jam lalu", + "11 jam lalu", + "13 jam lalu", + "1 hari lalu", + "2 hari lalu", + "3 hari lalu", + "4 hari lalu", + "6 hari lalu", + "8 hari lalu", + "10 hari lalu", + "11 hari lalu", + "12 hari lalu", + "13 hari lalu", + "2 mgu lalu", + "3 mgu lalu", + "1 bln lalu", + "4 mgu lalu", + "7 bln lalu", + "10 bln lalu", + "1 thn lalu", + "2 thn lalu", + "3 thn lalu", + "4 thn lalu", + "5 thn lalu" + ], + "my": [ + "ပြီးခဲ့သည့် 35 မိနစ်", + "ပြီးခဲ့သည့် 50 မိနစ်", + "ပြီးခဲ့သည့် 1 နာရီ", + "ပြီးခဲ့သည့် 2 နာရီ", + "ပြီးခဲ့သည့် 3 နာရီ", + "ပြီးခဲ့သည့် 4 နာရီ", + "ပြီးခဲ့သည့် 5 နာရီ", + "ပြီးခဲ့သည့် 6 နာရီ", + "ပြီးခဲ့သည့် 7 နာရီ", + "ပြီးခဲ့သည့် 8 နာရီ", + "ပြီးခဲ့သည့် 9 နာရီ", + "ပြီးခဲ့သည့် 12 နာရီ", + "ပြီးခဲ့သည့် 17 နာရီ", + "ပြီးခဲ့သည့် 18 နာရီ", + "ပြီးခဲ့သည့် 19 နာရီ", + "ပြီးခဲ့သည့် 20 နာရီ", + "ပြီးခဲ့သည့် 10 နာရီ", + "ပြီးခဲ့သည့် 11 နာရီ", + "ပြီးခဲ့သည့် 13 နာရီ", + "ပြီးခဲ့သည့် 1 ရက်", + "ပြီးခဲ့သည့် 2 ရက်", + "ပြီးခဲ့သည့် 3 ရက်", + "ပြီးခဲ့သည့် 4 ရက်", + "ပြီးခဲ့သည့် 6 ရက်", + "ပြီးခဲ့သည့် 8 ရက်", + "ပြီးခဲ့သည့် 10 ရက်", + "ပြီးခဲ့သည့် 11 ရက်", + "ပြီးခဲ့သည့် 12 ရက်", + "ပြီးခဲ့သည့် 13 ရက်", + "ပြီးခဲ့သည့် 2 ပတ်", + "ပြီးခဲ့သည့် 3 ပတ်", + "ပြီးခဲ့သည့် 1 လ", + "ပြီးခဲ့သည့် 4 ပတ်", + "ပြီးခဲ့သည့် 7 လ", + "ပြီးခဲ့သည့် 10 လ", + "ပြီးခဲ့သည့် 1 နှစ်", + "ပြီးခဲ့သည့် 2 နှစ်", + "ပြီးခဲ့သည့် 3 နှစ်", + "ပြီးခဲ့သည့် 4 နှစ်", + "ပြီးခဲ့သည့် 5 နှစ်" + ], + "ne": [ + "35 मिनेट पहिले", + "50 मिनेट पहिले", + "1 घण्टा पहिले", + "2 घण्टा पहिले", + "3 घण्टा पहिले", + "4 घण्टा पहिले", + "5 घण्टा पहिले", + "6 घण्टा पहिले", + "7 घण्टा पहिले", + "8 घण्टा पहिले", + "9 घण्टा पहिले", + "12 घण्टा पहिले", + "17 घण्टा पहिले", + "18 घण्टा पहिले", + "19 घण्टा पहिले", + "20 घण्टा पहिले", + "10 घण्टा पहिले", + "11 घण्टा पहिले", + "13 घण्टा पहिले", + "1 दिन पहिले", + "2 दिन पहिले", + "3 दिन पहिले", + "4 दिन पहिले", + "6 दिन पहिले", + "8 दिन पहिले", + "10 दिन पहिले", + "11 दिन पहिले", + "12 दिन पहिले", + "13 दिन पहिले", + "2 हप्ता पहिले", + "3 हप्ता पहिले", + "1 महिना पहिले", + "4 हप्ता पहिले", + "7 महिना पहिले", + "10 महिना पहिले", + "1 वर्ष अघि", + "2 वर्ष अघि", + "3 वर्ष अघि", + "4 वर्ष अघि", + "5 वर्ष अघि" + ], + "nl": [ + "35 min. geleden", + "50 min. geleden", + "1 uur geleden", + "2 uur geleden", + "3 uur geleden", + "4 uur geleden", + "5 uur geleden", + "6 uur geleden", + "7 uur geleden", + "8 uur geleden", + "9 uur geleden", + "12 uur geleden", + "17 uur geleden", + "18 uur geleden", + "19 uur geleden", + "20 uur geleden", + "10 uur geleden", + "11 uur geleden", + "13 uur geleden", + "1 dag geleden", + "2 dgn geleden", + "3 dgn geleden", + "4 dgn geleden", + "6 dgn geleden", + "8 dgn geleden", + "10 dgn geleden", + "11 dgn geleden", + "12 dgn geleden", + "13 dgn geleden", + "2 weken geleden", + "3 weken geleden", + "1 maand geleden", + "4 weken geleden", + "7 maanden geleden", + "10 maanden geleden", + "1 jaar geleden", + "2 jaar geleden", + "3 jaar geleden", + "4 jaar geleden", + "5 jaar geleden" + ], + "no": [ + "for 35 min siden", + "for 50 min siden", + "for 1 t siden", + "for 2 t siden", + "for 3 t siden", + "for 4 t siden", + "for 5 t siden", + "for 6 t siden", + "for 7 t siden", + "for 8 t siden", + "for 9 t siden", + "for 12 t siden", + "for 17 t siden", + "for 18 t siden", + "for 19 t siden", + "for 20 t siden", + "for 10 t siden", + "for 11 t siden", + "for 13 t siden", + "for 1 d. siden", + "for 2 d. siden", + "for 3 d. siden", + "for 4 d. siden", + "for 6 d. siden", + "for 8 d. siden", + "for 10 d. siden", + "for 11 d. siden", + "for 12 d. siden", + "for 13 d. siden", + "for 2 u. siden", + "for 3 u. siden", + "for 1 md. siden", + "for 4 u. siden", + "for 7 md. siden", + "for 10 md. siden", + "for 1 år siden", + "for 2 år siden", + "for 3 år siden", + "for 4 år siden", + "for 5 år siden" + ], + "or": [ + "35 ମି. ପୂର୍ବେ", + "50 ମି. ପୂର୍ବେ", + "1 ଘ. ପୂର୍ବେ", + "2 ଘ. ପୂର୍ବେ", + "3 ଘ. ପୂର୍ବେ", + "4 ଘ. ପୂର୍ବେ", + "5 ଘ. ପୂର୍ବେ", + "6 ଘ. ପୂର୍ବେ", + "7 ଘ. ପୂର୍ବେ", + "8 ଘ. ପୂର୍ବେ", + "9 ଘ. ପୂର୍ବେ", + "12 ଘ. ପୂର୍ବେ", + "17 ଘ. ପୂର୍ବେ", + "18 ଘ. ପୂର୍ବେ", + "19 ଘ. ପୂର୍ବେ", + "20 ଘ. ପୂର୍ବେ", + "10 ଘ. ପୂର୍ବେ", + "11 ଘ. ପୂର୍ବେ", + "13 ଘ. ପୂର୍ବେ", + "1 ଦିନ ପୂର୍ବେ", + "2 ଦିନ ପୂର୍ବେ", + "3 ଦିନ ପୂର୍ବେ", + "4 ଦିନ ପୂର୍ବେ", + "6 ଦିନ ପୂର୍ବେ", + "8 ଦିନ ପୂର୍ବେ", + "10 ଦିନ ପୂର୍ବେ", + "11 ଦିନ ପୂର୍ବେ", + "12 ଦିନ ପୂର୍ବେ", + "13 ଦିନ ପୂର୍ବେ", + "2 ସପ୍ତା. ପୂର୍ବେ", + "3 ସପ୍ତା. ପୂର୍ବେ", + "1 ମା. ପୂର୍ବେ", + "4 ସପ୍ତା. ପୂର୍ବେ", + "7 ମା. ପୂର୍ବେ", + "10 ମା. ପୂର୍ବେ", + "1 ବ. ପୂର୍ବେ", + "2 ବ. ପୂର୍ବେ", + "3 ବ. ପୂର୍ବେ", + "4 ବ. ପୂର୍ବେ", + "5 ବ. ପୂର୍ବେ" + ], + "pa": [ + "35 ਮਿੰਟ ਪਹਿਲਾਂ", + "50 ਮਿੰਟ ਪਹਿਲਾਂ", + "1 ਘੰਟਾ ਪਹਿਲਾਂ", + "2 ਘੰਟੇ ਪਹਿਲਾਂ", + "3 ਘੰਟੇ ਪਹਿਲਾਂ", + "4 ਘੰਟੇ ਪਹਿਲਾਂ", + "5 ਘੰਟੇ ਪਹਿਲਾਂ", + "6 ਘੰਟੇ ਪਹਿਲਾਂ", + "7 ਘੰਟੇ ਪਹਿਲਾਂ", + "8 ਘੰਟੇ ਪਹਿਲਾਂ", + "9 ਘੰਟੇ ਪਹਿਲਾਂ", + "12 ਘੰਟੇ ਪਹਿਲਾਂ", + "17 ਘੰਟੇ ਪਹਿਲਾਂ", + "18 ਘੰਟੇ ਪਹਿਲਾਂ", + "19 ਘੰਟੇ ਪਹਿਲਾਂ", + "20 ਘੰਟੇ ਪਹਿਲਾਂ", + "10 ਘੰਟੇ ਪਹਿਲਾਂ", + "11 ਘੰਟੇ ਪਹਿਲਾਂ", + "13 ਘੰਟੇ ਪਹਿਲਾਂ", + "1 ਦਿਨ ਪਹਿਲਾਂ", + "2 ਦਿਨ ਪਹਿਲਾਂ", + "3 ਦਿਨ ਪਹਿਲਾਂ", + "4 ਦਿਨ ਪਹਿਲਾਂ", + "6 ਦਿਨ ਪਹਿਲਾਂ", + "8 ਦਿਨ ਪਹਿਲਾਂ", + "10 ਦਿਨ ਪਹਿਲਾਂ", + "11 ਦਿਨ ਪਹਿਲਾਂ", + "12 ਦਿਨ ਪਹਿਲਾਂ", + "13 ਦਿਨ ਪਹਿਲਾਂ", + "2 ਹਫ਼ਤੇ ਪਹਿਲਾਂ", + "3 ਹਫ਼ਤੇ ਪਹਿਲਾਂ", + "1 ਮਹੀਨਾ ਪਹਿਲਾਂ", + "4 ਹਫ਼ਤੇ ਪਹਿਲਾਂ", + "7 ਮਹੀਨੇ ਪਹਿਲਾਂ", + "10 ਮਹੀਨੇ ਪਹਿਲਾਂ", + "1 ਸਾਲ ਪਹਿਲਾਂ", + "2 ਸਾਲ ਪਹਿਲਾਂ", + "3 ਸਾਲ ਪਹਿਲਾਂ", + "4 ਸਾਲ ਪਹਿਲਾਂ", + "5 ਸਾਲ ਪਹਿਲਾਂ" + ], + "pl": [ + "35 min temu", + "50 min temu", + "1 godz. temu", + "2 godz. temu", + "3 godz. temu", + "4 godz. temu", + "5 godz. temu", + "6 godz. temu", + "7 godz. temu", + "8 godz. temu", + "9 godz. temu", + "12 godz. temu", + "17 godz. temu", + "18 godz. temu", + "19 godz. temu", + "20 godz. temu", + "10 godz. temu", + "11 godz. temu", + "13 godz. temu", + "1 dzień temu", + "2 dni temu", + "3 dni temu", + "4 dni temu", + "6 dni temu", + "8 dni temu", + "10 dni temu", + "11 dni temu", + "12 dni temu", + "13 dni temu", + "2 tyg. temu", + "3 tyg. temu", + "1 mies. temu", + "4 tyg. temu", + "7 mies. temu", + "10 mies. temu", + "1 rok temu", + "2 lata temu", + "3 lata temu", + "4 lata temu", + "5 lat temu" + ], + "pt": [ + "há 35 min.", + "há 50 min.", + "há 1 h", + "há 2 h", + "há 3 h", + "há 4 h", + "há 5 h", + "há 6 h", + "há 7 h", + "há 8 h", + "há 9 h", + "há 12 h", + "há 17 h", + "há 18 h", + "há 19 h", + "há 20 h", + "há 10 h", + "há 11 h", + "há 13 h", + "há 1 dia", + "há 2 dias", + "há 3 dias", + "há 4 dias", + "há 6 dias", + "há 8 dias", + "há 10 dias", + "há 11 dias", + "há 12 dias", + "há 13 dias", + "há 2 sem.", + "há 3 sem.", + "há 1 mês", + "há 4 sem.", + "há 7 meses", + "há 10 meses", + "há 1 ano", + "há 2 anos", + "há 3 anos", + "há 4 anos", + "há 5 anos" + ], + "pt-PT": [ + "há 35 min", + "há 50 min", + "há 1 h", + "há 2 h", + "há 3 h", + "há 4 h", + "há 5 h", + "há 6 h", + "há 7 h", + "há 8 h", + "há 9 h", + "há 12 h", + "há 17 h", + "há 18 h", + "há 19 h", + "há 20 h", + "há 10 h", + "há 11 h", + "há 13 h", + "há 1 dia", + "há 2 dias", + "há 3 dias", + "há 4 dias", + "há 6 dias", + "há 8 dias", + "há 10 dias", + "há 11 dias", + "há 12 dias", + "há 13 dias", + "há 2 sem.", + "há 3 sem.", + "há 1 mês", + "há 4 sem.", + "há 7 meses", + "há 10 meses", + "há 1 ano", + "há 2 anos", + "há 3 anos", + "há 4 anos", + "há 5 anos" + ], + "ro": [ + "acum 35 min.", + "acum 50 min.", + "acum 1 h", + "acum 2 h", + "acum 3 h", + "acum 4 h", + "acum 5 h", + "acum 6 h", + "acum 7 h", + "acum 8 h", + "acum 9 h", + "acum 12 h", + "acum 17 h", + "acum 18 h", + "acum 19 h", + "acum 20 h", + "acum 10 h", + "acum 11 h", + "acum 13 h", + "acum 1 zi", + "acum 2 zile", + "acum 3 zile", + "acum 4 zile", + "acum 6 zile", + "acum 8 zile", + "acum 10 zile", + "acum 11 zile", + "acum 12 zile", + "acum 13 zile", + "acum 2 săpt.", + "acum 3 săpt.", + "acum 1 lună", + "acum 4 săpt.", + "acum 7 luni", + "acum 10 luni", + "acum 1 an", + "acum 2 ani", + "acum 3 ani", + "acum 4 ani", + "acum 5 ani" + ], + "ru": [ + "35 мин. назад", + "50 мин. назад", + "1 ч назад", + "2 ч назад", + "3 ч назад", + "4 ч назад", + "5 ч назад", + "6 ч назад", + "7 ч назад", + "8 ч назад", + "9 ч назад", + "12 ч назад", + "17 ч назад", + "18 ч назад", + "19 ч назад", + "20 ч назад", + "10 ч назад", + "11 ч назад", + "13 ч назад", + "1 дн. назад", + "2 дн. назад", + "3 дн. назад", + "4 дн. назад", + "6 дн. назад", + "8 дн. назад", + "10 дн. назад", + "11 дн. назад", + "12 дн. назад", + "13 дн. назад", + "2 нед. назад", + "3 нед. назад", + "1 мес. назад", + "4 нед. назад", + "7 мес. назад", + "10 мес. назад", + "1 г. назад", + "2 г. назад", + "3 г. назад", + "4 г. назад", + "5 л. назад" + ], + "si": [ + "මිනිත්තු 35කට පෙර", + "මිනිත්තු 50කට පෙර", + "පැය 1කට පෙර", + "පැය 2කට පෙර", + "පැය 3කට පෙර", + "පැය 4කට පෙර", + "පැය 5කට පෙර", + "පැය 6කට පෙර", + "පැය 7කට පෙර", + "පැය 8කට පෙර", + "පැය 9කට පෙර", + "පැය 12කට පෙර", + "පැය 17කට පෙර", + "පැය 18කට පෙර", + "පැය 19කට පෙර", + "පැය 20කට පෙර", + "පැය 10කට පෙර", + "පැය 11කට පෙර", + "පැය 13කට පෙර", + "දින 1කට පෙර", + "දින 2කට පෙර", + "දින 3කට පෙර", + "දින 4කට පෙර", + "දින 6කට පෙර", + "දින 8කට පෙර", + "දින 10කට පෙර", + "දින 11කට පෙර", + "දින 12කට පෙර", + "දින 13කට පෙර", + "සති 2කට පෙර", + "සති 3කට පෙර", + "මාස 1කට පෙර", + "සති 4කට පෙර", + "මාස 7කට පෙර", + "මාස 10කට පෙර", + "වසර 1කට පෙර", + "වසර 2කට පෙර", + "වසර 3කට පෙර", + "වසර 4කට පෙර", + "වසර 5කට පෙර" + ], + "sk": [ + "pred 35 min", + "pred 50 min", + "pred 1 h", + "pred 2 h", + "pred 3 h", + "pred 4 h", + "pred 5 h", + "pred 6 h", + "pred 7 h", + "pred 8 h", + "pred 9 h", + "pred 12 h", + "pred 17 h", + "pred 18 h", + "pred 19 h", + "pred 20 h", + "pred 10 h", + "pred 11 h", + "pred 13 h", + "pred 1 d.", + "pred 2 d.", + "pred 3 d.", + "pred 4 d.", + "pred 6 d.", + "pred 8 d.", + "pred 10 d.", + "pred 11 d.", + "pred 12 d.", + "pred 13 d.", + "pred 2 týž.", + "pred 3 týž.", + "pred 1 mes.", + "pred 4 týž.", + "pred 7 mes.", + "pred 10 mes.", + "pred 1 r.", + "pred 2 r.", + "pred 3 r.", + "pred 4 r.", + "pred 5 r." + ], + "sl": [ + "pred 35 min.", + "pred 50 min.", + "pred 1 uro", + "pred 2 urama", + "pred 3 urami", + "pred 4 urami", + "pred 5 urami", + "pred 6 urami", + "pred 7 urami", + "pred 8 urami", + "pred 9 urami", + "pred 12 urami", + "pred 17 urami", + "pred 18 urami", + "pred 19 urami", + "pred 20 urami", + "pred 10 urami", + "pred 11 urami", + "pred 13 urami", + "pred 1 dnevom", + "pred 2 dnevoma", + "pred 3 dnevi", + "pred 4 dnevi", + "pred 6 dnevi", + "pred 8 dnevi", + "pred 10 dnevi", + "pred 11 dnevi", + "pred 12 dnevi", + "pred 13 dnevi", + "pred 2 ted.", + "pred 3 ted.", + "pred 1 mes.", + "pred 4 ted.", + "pred 7 mes.", + "pred 10 mes.", + "pred 1 letom", + "pred 2 letoma", + "pred 3 leti", + "pred 4 leti", + "pred 5 leti" + ], + "sq": [ + "35 min më parë", + "50 min më parë", + "1 orë më parë", + "2 orë më parë", + "3 orë më parë", + "4 orë më parë", + "5 orë më parë", + "6 orë më parë", + "7 orë më parë", + "8 orë më parë", + "9 orë më parë", + "12 orë më parë", + "17 orë më parë", + "18 orë më parë", + "19 orë më parë", + "20 orë më parë", + "10 orë më parë", + "11 orë më parë", + "13 orë më parë", + "1 ditë më parë", + "2 ditë më parë", + "3 ditë më parë", + "4 ditë më parë", + "6 ditë më parë", + "8 ditë më parë", + "10 ditë më parë", + "11 ditë më parë", + "12 ditë më parë", + "13 ditë më parë", + "2 javë më parë", + "3 javë më parë", + "1 muaj më parë", + "4 javë më parë", + "7 muaj më parë", + "10 muaj më parë", + "1 vit më parë", + "2 vjet më parë", + "3 vjet më parë", + "4 vjet më parë", + "5 vjet më parë" + ], + "sr": [ + "пре 35 мин.", + "пре 50 мин.", + "пре 1 ч.", + "пре 2 ч.", + "пре 3 ч.", + "пре 4 ч.", + "пре 5 ч.", + "пре 6 ч.", + "пре 7 ч.", + "пре 8 ч.", + "пре 9 ч.", + "пре 12 ч.", + "пре 17 ч.", + "пре 18 ч.", + "пре 19 ч.", + "пре 20 ч.", + "пре 10 ч.", + "пре 11 ч.", + "пре 13 ч.", + "пре 1 д.", + "пре 2 д.", + "пре 3 д.", + "пре 4 д.", + "пре 6 д.", + "пре 8 д.", + "пре 10 д.", + "пре 11 д.", + "пре 12 д.", + "пре 13 д.", + "пре 2 нед.", + "пре 3 нед.", + "пре 1 мес.", + "пре 4 нед.", + "пре 7 мес.", + "пре 10 мес.", + "пре 1 год.", + "пре 2 год.", + "пре 3 год.", + "пре 4 год.", + "пре 5 год." + ], + "sr-Latn": [ + "pre 35 min.", + "pre 50 min.", + "pre 1 č.", + "pre 2 č.", + "pre 3 č.", + "pre 4 č.", + "pre 5 č.", + "pre 6 č.", + "pre 7 č.", + "pre 8 č.", + "pre 9 č.", + "pre 12 č.", + "pre 17 č.", + "pre 18 č.", + "pre 19 č.", + "pre 20 č.", + "pre 10 č.", + "pre 11 č.", + "pre 13 č.", + "pre 1 d.", + "pre 2 d.", + "pre 3 d.", + "pre 4 d.", + "pre 6 d.", + "pre 8 d.", + "pre 10 d.", + "pre 11 d.", + "pre 12 d.", + "pre 13 d.", + "pre 2 ned.", + "pre 3 ned.", + "pre 1 mes.", + "pre 4 ned.", + "pre 7 mes.", + "pre 10 mes.", + "pre 1 god.", + "pre 2 god.", + "pre 3 god.", + "pre 4 god.", + "pre 5 god." + ], + "sv": [ + "för 35 min sen", + "för 50 min sen", + "för 1 tim sedan", + "för 2 tim sedan", + "för 3 tim sedan", + "för 4 tim sedan", + "för 5 tim sedan", + "för 6 tim sedan", + "för 7 tim sedan", + "för 8 tim sedan", + "för 9 tim sedan", + "för 12 tim sedan", + "för 17 tim sedan", + "för 18 tim sedan", + "för 19 tim sedan", + "för 20 tim sedan", + "för 10 tim sedan", + "för 11 tim sedan", + "för 13 tim sedan", + "för 1 d sedan", + "för 2 d sedan", + "för 3 d sedan", + "för 4 d sedan", + "för 6 d sedan", + "för 8 d sedan", + "för 10 d sedan", + "för 11 d sedan", + "för 12 d sedan", + "för 13 d sedan", + "för 2 v. sedan", + "för 3 v. sedan", + "för 1 mån. sen", + "för 4 v. sedan", + "för 7 mån. sen", + "för 10 mån. sen", + "för 1 år sen", + "för 2 år sen", + "för 3 år sen", + "för 4 år sen", + "för 5 år sen" + ], + "sw": [ + "dakika 35 zilizopita", + "dakika 50 zilizopita", + "saa 1 iliyopita", + "saa 2 zilizopita", + "saa 3 zilizopita", + "saa 4 zilizopita", + "saa 5 zilizopita", + "saa 6 zilizopita", + "saa 7 zilizopita", + "saa 8 zilizopita", + "saa 9 zilizopita", + "saa 12 zilizopita", + "saa 17 zilizopita", + "saa 18 zilizopita", + "saa 19 zilizopita", + "saa 20 zilizopita", + "saa 10 zilizopita", + "saa 11 zilizopita", + "saa 13 zilizopita", + "siku 1 iliyopita", + "siku 2 zilizopita", + "siku 3 zilizopita", + "siku 4 zilizopita", + "siku 6 zilizopita", + "siku 8 zilizopita", + "siku 10 zilizopita", + "siku 11 zilizopita", + "siku 12 zilizopita", + "siku 13 zilizopita", + "wiki 2 zilizopita", + "wiki 3 zilizopita", + "mwezi 1 uliopita", + "wiki 4 zilizopita", + "miezi 7 iliyopita", + "miezi 10 iliyopita", + "mwaka 1 uliopita", + "miaka 2 iliyopita", + "miaka 3 iliyopita", + "miaka 4 iliyopita", + "miaka 5 iliyopita" + ], + "ta": [ + "35 நிமி. முன்", + "50 நிமி. முன்", + "1 மணி. முன்", + "2 மணி. முன்", + "3 மணி. முன்", + "4 மணி. முன்", + "5 மணி. முன்", + "6 மணி. முன்", + "7 மணி. முன்", + "8 மணி. முன்", + "9 மணி. முன்", + "12 மணி. முன்", + "17 மணி. முன்", + "18 மணி. முன்", + "19 மணி. முன்", + "20 மணி. முன்", + "10 மணி. முன்", + "11 மணி. முன்", + "13 மணி. முன்", + "1 நாளுக்கு முன்", + "2 நாட்களுக்கு முன்", + "3 நாட்களுக்கு முன்", + "4 நாட்களுக்கு முன்", + "6 நாட்களுக்கு முன்", + "8 நாட்களுக்கு முன்", + "10 நாட்களுக்கு முன்", + "11 நாட்களுக்கு முன்", + "12 நாட்களுக்கு முன்", + "13 நாட்களுக்கு முன்", + "2 வார. முன்", + "3 வார. முன்", + "1 மாத. முன்", + "4 வார. முன்", + "7 மாத. முன்", + "10 மாத. முன்", + "1 ஆண்டிற்கு முன்", + "2 ஆண்டுகளுக்கு முன்", + "3 ஆண்டுகளுக்கு முன்", + "4 ஆண்டுகளுக்கு முன்", + "5 ஆண்டுகளுக்கு முன்" + ], + "te": [ + "35 నిమి. క్రితం", + "50 నిమి. క్రితం", + "1 గం. క్రితం", + "2 గం. క్రితం", + "3 గం. క్రితం", + "4 గం. క్రితం", + "5 గం. క్రితం", + "6 గం. క్రితం", + "7 గం. క్రితం", + "8 గం. క్రితం", + "9 గం. క్రితం", + "12 గం. క్రితం", + "17 గం. క్రితం", + "18 గం. క్రితం", + "19 గం. క్రితం", + "20 గం. క్రితం", + "10 గం. క్రితం", + "11 గం. క్రితం", + "13 గం. క్రితం", + "1 రోజు క్రితం", + "2 రోజుల క్రితం", + "3 రోజుల క్రితం", + "4 రోజుల క్రితం", + "6 రోజుల క్రితం", + "8 రోజుల క్రితం", + "10 రోజుల క్రితం", + "11 రోజుల క్రితం", + "12 రోజుల క్రితం", + "13 రోజుల క్రితం", + "2 వారాల క్రితం", + "3 వారాల క్రితం", + "1 నెల క్రితం", + "4 వారాల క్రితం", + "7 నెలల క్రితం", + "10 నెలల క్రితం", + "1 సం. క్రితం", + "2 సం. క్రితం", + "3 సం. క్రితం", + "4 సం. క్రితం", + "5 సం. క్రితం" + ], + "th": [ + "35 นาทีที่แล้ว", + "50 นาทีที่แล้ว", + "1 ชม. ที่แล้ว", + "2 ชม. ที่แล้ว", + "3 ชม. ที่แล้ว", + "4 ชม. ที่แล้ว", + "5 ชม. ที่แล้ว", + "6 ชม. ที่แล้ว", + "7 ชม. ที่แล้ว", + "8 ชม. ที่แล้ว", + "9 ชม. ที่แล้ว", + "12 ชม. ที่แล้ว", + "17 ชม. ที่แล้ว", + "18 ชม. ที่แล้ว", + "19 ชม. ที่แล้ว", + "20 ชม. ที่แล้ว", + "10 ชม. ที่แล้ว", + "11 ชม. ที่แล้ว", + "13 ชม. ที่แล้ว", + "1 วันที่แล้ว", + "2 วันที่แล้ว", + "3 วันที่แล้ว", + "4 วันที่แล้ว", + "6 วันที่แล้ว", + "8 วันที่แล้ว", + "10 วันที่แล้ว", + "11 วันที่แล้ว", + "12 วันที่แล้ว", + "13 วันที่แล้ว", + "2 สัปดาห์ที่แล้ว", + "3 สัปดาห์ที่แล้ว", + "1 เดือนที่แล้ว", + "4 สัปดาห์ที่แล้ว", + "7 เดือนที่แล้ว", + "10 เดือนที่แล้ว", + "1 ปีที่แล้ว", + "2 ปีที่แล้ว", + "3 ปีที่แล้ว", + "4 ปีที่แล้ว", + "5 ปีที่แล้ว" + ], + "tr": [ + "35 dk. önce", + "50 dk. önce", + "1 sa. önce", + "2 sa. önce", + "3 sa. önce", + "4 sa. önce", + "5 sa. önce", + "6 sa. önce", + "7 sa. önce", + "8 sa. önce", + "9 sa. önce", + "12 sa. önce", + "17 sa. önce", + "18 sa. önce", + "19 sa. önce", + "20 sa. önce", + "10 sa. önce", + "11 sa. önce", + "13 sa. önce", + "1 gün önce", + "2 gün önce", + "3 gün önce", + "4 gün önce", + "6 gün önce", + "8 gün önce", + "10 gün önce", + "11 gün önce", + "12 gün önce", + "13 gün önce", + "2 hf. önce", + "3 hf. önce", + "1 ay önce", + "4 hf. önce", + "7 ay önce", + "10 ay önce", + "1 yıl önce", + "2 yıl önce", + "3 yıl önce", + "4 yıl önce", + "5 yıl önce" + ], + "uk": [ + "35 хв тому", + "50 хв тому", + "1 год тому", + "2 год тому", + "3 год тому", + "4 год тому", + "5 год тому", + "6 год тому", + "7 год тому", + "8 год тому", + "9 год тому", + "12 год тому", + "17 год тому", + "18 год тому", + "19 год тому", + "20 год тому", + "10 год тому", + "11 год тому", + "13 год тому", + "1 дн. тому", + "2 дн. тому", + "3 дн. тому", + "4 дн. тому", + "6 дн. тому", + "8 дн. тому", + "10 дн. тому", + "11 дн. тому", + "12 дн. тому", + "13 дн. тому", + "2 тиж. тому", + "3 тиж. тому", + "1 міс. тому", + "4 тиж. тому", + "7 міс. тому", + "10 міс. тому", + "1 р. тому", + "2 р. тому", + "3 р. тому", + "4 р. тому", + "5 р. тому" + ], + "ur": [ + "35 منٹ پہلے", + "50 منٹ پہلے", + "1 گھنٹے پہلے", + "2 گھنٹے پہلے", + "3 گھنٹے پہلے", + "4 گھنٹے پہلے", + "5 گھنٹے پہلے", + "6 گھنٹے پہلے", + "7 گھنٹے پہلے", + "8 گھنٹے پہلے", + "9 گھنٹے پہلے", + "12 گھنٹے پہلے", + "17 گھنٹے پہلے", + "18 گھنٹے پہلے", + "19 گھنٹے پہلے", + "20 گھنٹے پہلے", + "10 گھنٹے پہلے", + "11 گھنٹے پہلے", + "13 گھنٹے پہلے", + "1 دن پہلے", + "2 دن پہلے", + "3 دن پہلے", + "4 دن پہلے", + "6 دن پہلے", + "8 دن پہلے", + "10 دن پہلے", + "11 دن پہلے", + "12 دن پہلے", + "13 دن پہلے", + "2 ہفتے پہلے", + "3 ہفتے پہلے", + "1 ماہ قبل", + "4 ہفتے پہلے", + "7 ماہ قبل", + "10 ماہ قبل", + "1 سال پہلے", + "2 سال پہلے", + "3 سال پہلے", + "4 سال پہلے", + "5 سال پہلے" + ], + "uz": [ + "35 daqiqa oldin", + "50 daqiqa oldin", + "1 soat oldin", + "2 soat oldin", + "3 soat oldin", + "4 soat oldin", + "5 soat oldin", + "6 soat oldin", + "7 soat oldin", + "8 soat oldin", + "9 soat oldin", + "12 soat oldin", + "17 soat oldin", + "18 soat oldin", + "19 soat oldin", + "20 soat oldin", + "10 soat oldin", + "11 soat oldin", + "13 soat oldin", + "1 kun oldin", + "2 kun oldin", + "3 kun oldin", + "4 kun oldin", + "6 kun oldin", + "8 kun oldin", + "10 kun oldin", + "11 kun oldin", + "12 kun oldin", + "13 kun oldin", + "2 hafta oldin", + "3 hafta oldin", + "1 oy oldin", + "4 hafta oldin", + "7 oy oldin", + "10 oy oldin", + "1 yil oldin", + "2 yil oldin", + "3 yil oldin", + "4 yil oldin", + "5 yil oldin" + ], + "vi": [ + "35 phút trước", + "50 phút trước", + "1 giờ trước", + "2 giờ trước", + "3 giờ trước", + "4 giờ trước", + "5 giờ trước", + "6 giờ trước", + "7 giờ trước", + "8 giờ trước", + "9 giờ trước", + "12 giờ trước", + "17 giờ trước", + "18 giờ trước", + "19 giờ trước", + "20 giờ trước", + "10 giờ trước", + "11 giờ trước", + "13 giờ trước", + "1 ngày trước", + "2 ngày trước", + "3 ngày trước", + "4 ngày trước", + "6 ngày trước", + "8 ngày trước", + "10 ngày trước", + "11 ngày trước", + "12 ngày trước", + "13 ngày trước", + "2 tuần trước", + "3 tuần trước", + "1 tháng trước", + "4 tuần trước", + "7 tháng trước", + "10 tháng trước", + "1 năm trước", + "2 năm trước", + "3 năm trước", + "4 năm trước", + "5 năm trước" + ], + "zh-CN": [ + "35分钟前", + "50分钟前", + "1小时前", + "2小时前", + "3小时前", + "4小时前", + "5小时前", + "6小时前", + "7小时前", + "8小时前", + "9小时前", + "12小时前", + "17小时前", + "18小时前", + "19小时前", + "20小时前", + "10小时前", + "11小时前", + "13小时前", + "1天前", + "2天前", + "3天前", + "4天前", + "6天前", + "8天前", + "10天前", + "11天前", + "12天前", + "13天前", + "2周前", + "3周前", + "1个月前", + "4周前", + "7个月前", + "10个月前", + "1年前", + "2年前", + "3年前", + "4年前", + "5年前" + ], + "zh-HK": [ + "35 分鐘前", + "50 分鐘前", + "1 小時前", + "2 小時前", + "3 小時前", + "4 小時前", + "5 小時前", + "6 小時前", + "7 小時前", + "8 小時前", + "9 小時前", + "12 小時前", + "17 小時前", + "18 小時前", + "19 小時前", + "20 小時前", + "10 小時前", + "11 小時前", + "13 小時前", + "1 日前", + "2 日前", + "3 日前", + "4 日前", + "6 日前", + "8 日前", + "10 日前", + "11 日前", + "12 日前", + "13 日前", + "2 星期前", + "3 星期前", + "1 個月前", + "4 星期前", + "7 個月前", + "10 個月前", + "1 年前", + "2 年前", + "3 年前", + "4 年前", + "5 年前" + ], + "zh-TW": [ + "35 分鐘前", + "50 分鐘前", + "1 小時前", + "2 小時前", + "3 小時前", + "4 小時前", + "5 小時前", + "6 小時前", + "7 小時前", + "8 小時前", + "9 小時前", + "12 小時前", + "17 小時前", + "18 小時前", + "19 小時前", + "20 小時前", + "10 小時前", + "11 小時前", + "13 小時前", + "1 天前", + "2 天前", + "3 天前", + "4 天前", + "6 天前", + "8 天前", + "10 天前", + "11 天前", + "12 天前", + "13 天前", + "2 週前", + "3 週前", + "1 個月前", + "4 週前", + "7 個月前", + "10 個月前", + "1 年前", + "2 年前", + "3 年前", + "4 年前", + "5 年前" + ], + "zu": [ + "35 amaminithi edlule", + "50 amaminithi edlule", + "1 ihora eledlule", + "emahoreni angu-2 edlule", + "emahoreni angu-3 edlule", + "emahoreni angu-4 edlule", + "emahoreni angu-5 edlule", + "emahoreni angu-6 edlule", + "emahoreni angu-7 edlule", + "emahoreni angu-8 edlule", + "emahoreni angu-9 edlule", + "emahoreni angu-12 edlule", + "emahoreni angu-17 edlule", + "emahoreni angu-18 edlule", + "emahoreni angu-19 edlule", + "emahoreni angu-20 edlule", + "emahoreni angu-10 edlule", + "emahoreni angu-11 edlule", + "emahoreni angu-13 edlule", + "1 usuku olwedlule", + "2 izinsuku ezedlule", + "3 izinsuku ezedlule", + "4 izinsuku ezedlule", + "6 izinsuku ezedlule", + "8 izinsuku ezedlule", + "10 izinsuku ezedlule", + "11 izinsuku ezedlule", + "12 izinsuku ezedlule", + "13 izinsuku ezedlule", + "amaviki angu-2 edlule", + "amaviki angu-3 edlule", + "1 izinyanga ezedlule", + "amaviki angu-4 edlule", + "7 izinyanga ezedlule", + "10 izinyanga ezedlule", + "1 unyaka odlule", + "2 unyaka odlule", + "3 unyaka odlule", + "4 unyaka odlule", + "5 unyaka odlule" + ] +} From 182f9ebfb81f1d13909136c727c02a9fb8124e9b Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 31 May 2023 11:38:50 +0200 Subject: [PATCH 009/459] fix: extracting artist discography with without page type --- src/client/music_artist.rs | 30 ++++++++++++------- src/client/response/music_item.rs | 6 ++-- src/client/response/url_endpoint.rs | 17 +++++------ ...text__tests__t_attributed_description.snap | 20 +++++++++---- 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index 75dafb5..66d7261 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -4,7 +4,7 @@ use once_cell::sync::Lazy; use regex::Regex; use crate::{ - client::response::url_endpoint::{MusicPageType, NavigationEndpoint}, + client::response::url_endpoint::NavigationEndpoint, error::{Error, ExtractionError}, model::{AlbumItem, ArtistId, MusicArtist}, serializer::MapResult, @@ -191,20 +191,29 @@ fn map_artist_page( .music_carousel_shelf_basic_header_renderer .more_content_button { - match button.button_renderer.navigation_endpoint.music_page() { + if let NavigationEndpoint::Browse { + browse_endpoint, .. + } = button.button_renderer.navigation_endpoint + { // Music videos - Some((MusicPageType::Playlist, id)) => { + if browse_endpoint + .browse_endpoint_context_supported_configs + .map(|cfg| { + cfg.browse_endpoint_context_music_config.page_type + == PageType::Playlist + }) + .unwrap_or_default() + { if videos_playlist_id.is_none() { - videos_playlist_id = Some(id); + videos_playlist_id = Some(browse_endpoint.browse_id); } - } - // Albums - Some((MusicPageType::ArtistDiscography, _)) => { + } else if browse_endpoint + .browse_id + .starts_with(util::ARTIST_DISCOGRAPHY_PREFIX) + { can_fetch_more = true; extendable_albums = true; - } - // Albums or playlists - Some((MusicPageType::Artist, _)) => { + } else { // Peek at the first item to determine type if let Some(response::music_item::MusicResponseItem::MusicTwoRowItemRenderer(item)) = shelf.contents.c.first() { if let Some(PageType::Album) = item.navigation_endpoint.page_type() { @@ -213,7 +222,6 @@ fn map_artist_page( } } } - _ => {} } } } diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index bee91c9..6bbfdff 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -759,7 +759,7 @@ impl MusicListMapper { })); Ok(Some(MusicItemType::Playlist)) } - MusicPageType::None | MusicPageType::ArtistDiscography => { + MusicPageType::None => { // There may be broken YT channels from the artist search. They can be skipped. Ok(None) } @@ -901,7 +901,7 @@ impl MusicListMapper { })); Ok(Some(MusicItemType::Playlist)) } - MusicPageType::None | MusicPageType::ArtistDiscography => Ok(None), + MusicPageType::None => Ok(None), MusicPageType::Unknown => { self.has_unknown = true; Ok(None) @@ -1039,7 +1039,7 @@ impl MusicListMapper { })); Some(MusicItemType::Playlist) } - MusicPageType::None | MusicPageType::ArtistDiscography => None, + MusicPageType::None => None, MusicPageType::Unknown => { self.has_unknown = true; None diff --git a/src/client/response/url_endpoint.rs b/src/client/response/url_endpoint.rs index 1b9b225..01a9374 100644 --- a/src/client/response/url_endpoint.rs +++ b/src/client/response/url_endpoint.rs @@ -102,9 +102,12 @@ pub(crate) struct BrowseEndpointConfig { pub browse_endpoint_context_music_config: BrowseEndpointMusicConfig, } +#[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct BrowseEndpointMusicConfig { + #[serde(default)] + #[serde_as(as = "DefaultOnError")] pub page_type: PageType, } @@ -114,9 +117,12 @@ pub(crate) struct CommandMetadata { pub web_command_metadata: WebCommandMetadata, } +#[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct WebCommandMetadata { + #[serde(default)] + #[serde_as(as = "DefaultOnError")] pub web_page_type: PageType, } @@ -144,15 +150,13 @@ pub(crate) enum MusicVideoType { Track, } -#[derive(Debug, Clone, Copy, Deserialize, PartialEq, Eq)] +#[derive(Default, Debug, Clone, Copy, Deserialize, PartialEq, Eq)] pub(crate) enum PageType { #[serde( rename = "MUSIC_PAGE_TYPE_ARTIST", alias = "MUSIC_PAGE_TYPE_AUDIOBOOK_ARTIST" )] Artist, - #[serde(rename = "MUSIC_PAGE_TYPE_ARTIST_DISCOGRAPHY")] - ArtistDiscography, #[serde(rename = "MUSIC_PAGE_TYPE_ALBUM", alias = "MUSIC_PAGE_TYPE_AUDIOBOOK")] Album, #[serde( @@ -162,7 +166,7 @@ pub(crate) enum PageType { Channel, #[serde(rename = "MUSIC_PAGE_TYPE_PLAYLIST", alias = "WEB_PAGE_TYPE_PLAYLIST")] Playlist, - #[serde(rename = "MUSIC_PAGE_TYPE_UNKNOWN")] + #[default] Unknown, } @@ -170,9 +174,6 @@ impl PageType { pub(crate) fn to_url_target(self, id: String) -> Option { match self { PageType::Artist | PageType::Channel => Some(UrlTarget::Channel { id }), - PageType::ArtistDiscography => id - .strip_prefix(util::ARTIST_DISCOGRAPHY_PREFIX) - .map(|id| UrlTarget::Channel { id: id.to_owned() }), PageType::Album => Some(UrlTarget::Album { id }), PageType::Playlist => Some(UrlTarget::Playlist { id }), PageType::Unknown => None, @@ -183,7 +184,6 @@ impl PageType { #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub(crate) enum MusicPageType { Artist, - ArtistDiscography, Album, Playlist, Track { is_video: bool }, @@ -195,7 +195,6 @@ impl From for MusicPageType { fn from(t: PageType) -> Self { match t { PageType::Artist => MusicPageType::Artist, - PageType::ArtistDiscography => MusicPageType::ArtistDiscography, PageType::Album => MusicPageType::Album, PageType::Playlist => MusicPageType::Playlist, PageType::Channel => MusicPageType::None, diff --git a/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap b/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap index e937bcc..4966a2f 100644 --- a/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap +++ b/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap @@ -80,32 +80,42 @@ SAttributed { Text { text: "\n\n", }, - Text { + Browse { text: "#aespa", + page_type: Unknown, + browse_id: "FEhashtag", }, Text { text: " ", }, - Text { + Browse { text: "#æspa", + page_type: Unknown, + browse_id: "FEhashtag", }, Text { text: " ", }, - Text { + Browse { text: "#BlackMamba", + page_type: Unknown, + browse_id: "FEhashtag", }, Text { text: " ", }, - Text { + Browse { text: "#블랙맘바", + page_type: Unknown, + browse_id: "FEhashtag", }, Text { text: " ", }, - Text { + Browse { text: "#에스파", + page_type: Unknown, + browse_id: "FEhashtag", }, Text { text: "\naespa 에스파 'Black Mamba' MV ℗ SM Entertainment", From 32b4800b466e1f919792d34ea87c907b678d86b0 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 31 May 2023 12:14:11 +0200 Subject: [PATCH 010/459] fix!: remove possible panic from client builder fix: simplify integer divisions --- cli/src/main.rs | 5 ++++- codegen/src/collect_video_dates.rs | 3 ++- codegen/src/download_testfiles.rs | 3 ++- src/client/mod.rs | 12 ++++++------ src/client/player.rs | 5 ++--- src/lib.rs | 3 +-- src/util/mod.rs | 11 +++++++++++ src/util/timeago.rs | 10 +++++----- tests/youtube.rs | 9 +++++++-- 9 files changed, 40 insertions(+), 21 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 0a670ef..4cd1142 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -393,7 +393,10 @@ async fn main() { storage_dir.push("rustypipe"); _ = std::fs::create_dir(&storage_dir); - let rp = RustyPipe::builder().storage_dir(storage_dir).build(); + let rp = RustyPipe::builder() + .storage_dir(storage_dir) + .build() + .unwrap(); match cli.command { Commands::Download { diff --git a/codegen/src/collect_video_dates.rs b/codegen/src/collect_video_dates.rs index cff90e5..472df8c 100644 --- a/codegen/src/collect_video_dates.rs +++ b/codegen/src/collect_video_dates.rs @@ -16,7 +16,8 @@ pub async fn collect_video_dates(concurrency: usize) { let json_path = path!(*DICT_DIR / "timeago_samples_short.json"); let rp = RustyPipe::builder() .visitor_data("Cgtwel9tMkh2eHh0USiyzc6jBg%3D%3D") - .build(); + .build() + .unwrap(); let channels = [ "UCeY0bbntWzzVIaj2z3QigXg", diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 41daacc..0d1357f 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -134,6 +134,7 @@ fn rp_testfile(json_path: &Path) -> RustyPipe { .report() .strict() .build() + .unwrap() } async fn player() { @@ -155,7 +156,7 @@ async fn player() { } async fn player_model() { - let rp = RustyPipe::builder().strict().build(); + let rp = RustyPipe::builder().strict().build().unwrap(); for (name, id) in [("multilanguage", "tVWWp1PqDus"), ("hdr", "LXb3EKWsInQ")] { let json_path = diff --git a/src/client/mod.rs b/src/client/mod.rs index 22fc832..761667c 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -446,8 +446,7 @@ impl RustyPipeBuilder { } /// Return a new, configured RustyPipe instance. - #[must_use] - pub fn build(self) -> RustyPipe { + pub fn build(self) -> Result { let mut client_builder = ClientBuilder::new() .user_agent(self.user_agent.unwrap_or_else(|| DEFAULT_UA.to_owned())) .gzip(true) @@ -458,7 +457,7 @@ impl RustyPipeBuilder { client_builder = client_builder.timeout(timeout); } - let http = client_builder.build().unwrap(); + let http = client_builder.build()?; let storage_dir = self.storage_dir.unwrap_or_default(); @@ -480,7 +479,7 @@ impl RustyPipeBuilder { }) .unwrap_or_default(); - RustyPipe { + Ok(RustyPipe { inner: Arc::new(RustyPipeRef { http, storage, @@ -503,7 +502,7 @@ impl RustyPipeBuilder { }, default_opts: self.default_opts, }), - } + }) } /// Set the default directory to store the cachefile and reports. @@ -687,8 +686,9 @@ impl RustyPipe { /// /// To create an instance with custom options, use [`RustyPipeBuilder`] instead. #[must_use] + #[allow(clippy::missing_panics_doc)] pub fn new() -> Self { - RustyPipeBuilder::new().build() + RustyPipeBuilder::new().build().unwrap() } /// Create a new [`RustyPipeBuilder`] diff --git a/src/client/player.rs b/src/client/player.rs index 4061aac..9f74ef9 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -342,9 +342,8 @@ impl MapResponse for response::Player { + "&sigh=" + sigh; - let sprite_count = (f64::from(total_count) - / f64::from(frames_per_page_x * frames_per_page_y)) - .ceil() as u32; + let sprite_count = + util::div_ceil(total_count, frames_per_page_x * frames_per_page_y); Some(Frameset { url_template: url, diff --git a/src/lib.rs b/src/lib.rs index 3ea4373..e6868d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,8 +11,7 @@ clippy::cast_sign_loss, clippy::cast_precision_loss, clippy::single_match_else, - clippy::missing_errors_doc, - clippy::missing_panics_doc + clippy::missing_errors_doc )] //! ## Go to diff --git a/src/util/mod.rs b/src/util/mod.rs index 5f05ae4..f148c6f 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -272,6 +272,17 @@ pub fn sanitize_yt_url(url: &str) -> String { sanitize_yt_url_inner(url).unwrap_or_else(|| url.to_string()) } +pub fn div_ceil(a: u32, b: u32) -> u32 { + let d = a / b; + let r = a % b; + + if r > 0 && b > 0 { + d + 1 + } else { + d + } +} + pub trait TryRemove { /// Removes and returns the element at position `index` within the vector, /// shifting all elements after it to the left. diff --git a/src/util/timeago.rs b/src/util/timeago.rs index 5c90b16..f3b42f4 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -77,7 +77,7 @@ pub enum DateCmp { } impl TimeUnit { - pub fn secs(self) -> i64 { + pub fn secs(self) -> u32 { match self { TimeUnit::Second => 1, TimeUnit::Minute => 60, @@ -91,8 +91,8 @@ impl TimeUnit { } impl TimeAgo { - fn secs(self) -> i64 { - i64::from(self.n) * self.unit.secs() + fn secs(self) -> u32 { + u32::from(self.n) * self.unit.secs() } } @@ -109,7 +109,7 @@ impl Mul for TimeAgo { impl From for Duration { fn from(ta: TimeAgo) -> Self { - Duration::seconds(ta.secs()) + Duration::seconds(ta.secs().into()) } } @@ -331,7 +331,7 @@ pub fn parse_video_duration(lang: Language, video_duration: &str) -> Option tokens.peek()?; tokens.for_each(|ta| { - secs += n * ta.secs() as u32; + secs += n * ta.secs(); n = 1; }); } diff --git a/tests/youtube.rs b/tests/youtube.rs index 3aacb2f..7982e6a 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1695,7 +1695,7 @@ fn music_search_videos(rp: RustyPipe, unlocalized: bool) { #[tokio::test] async fn music_search_episode() { - let rp = RustyPipe::builder().strict().build(); + let rp = RustyPipe::builder().strict().build().unwrap(); let res = rp .query() .music_search_videos("Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1") @@ -2342,6 +2342,7 @@ fn rp(lang: Language) -> RustyPipe { .lang(lang) .visitor_data_opt(vdata) .build() + .unwrap() } /// Get a flag signaling if the language is set to English @@ -2352,7 +2353,11 @@ fn unlocalized(lang: Language) -> bool { /// Get a new RustyPipe instance with pre-set visitor data fn rp_visitor_data(vdata: &str) -> RustyPipe { - RustyPipe::builder().strict().visitor_data(vdata).build() + RustyPipe::builder() + .strict() + .visitor_data(vdata) + .build() + .unwrap() } /// Assert equality within 10% margin From 17fb2c98cb5712a581ea3d5c96274ff004e4f738 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 4 Jun 2023 14:59:45 +0200 Subject: [PATCH 011/459] tests: fix playlist search test --- tests/youtube.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 7982e6a..e67f061 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1818,11 +1818,11 @@ fn music_search_artists_cont(rp: RustyPipe) { #[case::default(true)] fn music_search_playlists(#[case] with_community: bool, rp: RustyPipe, unlocalized: bool) { let res = if with_community { - tokio_test::block_on(rp.query().music_search_playlists("pop biggest hits")).unwrap() + tokio_test::block_on(rp.query().music_search_playlists("todays rock hits")).unwrap() } else { tokio_test::block_on( rp.query() - .music_search_playlists_filter("pop biggest hits", false), + .music_search_playlists_filter("todays rock hits", false), ) .unwrap() }; @@ -1832,11 +1832,11 @@ fn music_search_playlists(#[case] with_community: bool, rp: RustyPipe, unlocaliz .items .items .iter() - .find(|p| p.id == "RDCLAK5uy_nmS3YoxSwVVQk9lEQJ0UX4ZCjXsW_psU8") + .find(|p| p.id == "RDCLAK5uy_nLtxizvEMkzYQUrA-bFf6MnBeR4bGYWUQ") .unwrap(); if unlocalized { - assert_eq!(playlist.name, "Pop's Biggest Hits"); + assert_eq!(playlist.name, "Today's Rock Hits"); } assert!(!playlist.thumbnail.is_empty(), "got no thumbnail"); assert_gte(playlist.track_count.unwrap(), 100, "tracks"); From dbcea10d2e7ada925b2280ed9fb765f193e23f35 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 4 Jun 2023 18:37:02 +0200 Subject: [PATCH 012/459] tests: fix playlist search test 2 --- tests/youtube.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index e67f061..a16eaf8 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1818,11 +1818,11 @@ fn music_search_artists_cont(rp: RustyPipe) { #[case::default(true)] fn music_search_playlists(#[case] with_community: bool, rp: RustyPipe, unlocalized: bool) { let res = if with_community { - tokio_test::block_on(rp.query().music_search_playlists("todays rock hits")).unwrap() + tokio_test::block_on(rp.query().music_search_playlists("today's rock hits")).unwrap() } else { tokio_test::block_on( rp.query() - .music_search_playlists_filter("todays rock hits", false), + .music_search_playlists_filter("today's rock hits", false), ) .unwrap() }; @@ -1833,7 +1833,7 @@ fn music_search_playlists(#[case] with_community: bool, rp: RustyPipe, unlocaliz .items .iter() .find(|p| p.id == "RDCLAK5uy_nLtxizvEMkzYQUrA-bFf6MnBeR4bGYWUQ") - .unwrap(); + .expect("no playlist"); if unlocalized { assert_eq!(playlist.name, "Today's Rock Hits"); @@ -1870,7 +1870,7 @@ fn music_search_playlists_community(rp: RustyPipe) { .items .iter() .find(|p| p.id == "PLMC9KNkIncKtGvr2kFRuXBVmBev6cAJ2u") - .unwrap(); + .expect("no playlist"); assert_eq!( playlist.name, From 745ee01067011204e6f3673c958c3774b5695156 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 10 Jun 2023 00:38:09 +0200 Subject: [PATCH 013/459] tests: replace agegate video (was made private) --- tests/youtube.rs | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index a16eaf8..43c0f19 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -706,34 +706,28 @@ fn get_video_details_live(rp: RustyPipe) { #[rstest] fn get_video_details_agegate(rp: RustyPipe) { - let details = tokio_test::block_on(rp.query().video_details("HRKu0cvrr_o")).unwrap(); + let details = tokio_test::block_on(rp.query().video_details("laru0QoJUmI")).unwrap(); // dbg!(&details); - assert_eq!(details.id, "HRKu0cvrr_o"); - assert_eq!( - details.name, - "AlphaOmegaSin Fanboy Logic: Likes/Dislikes Disabled = Point Invalid Lol wtf?" - ); + assert_eq!(details.id, "laru0QoJUmI"); + assert_eq!(details.name, "DJ Robin x Schürze - Layla (Official Video)"); insta::assert_ron_snapshot!(details.description, @"RichText([])"); - assert_eq!(details.channel.id, "UCQT2yul0lr6Ie9qNQNmw-sg"); - assert_eq!( - details.channel.name, - "Dale Earnhardt Junior’s Retired YouYoube Channel" - ); + assert_eq!(details.channel.id, "UCkJfSrMnLonOZWh-q5os5bg"); + assert_eq!(details.channel.name, "Summerfield Records"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); - assert_eq!(details.channel.verification, Verification::None); + assert_eq!(details.channel.verification, Verification::Verified); assert_gte( details.channel.subscriber_count.unwrap(), - 1400, + 250_000, "subscribers", ); - assert_gte(details.view_count, 200, "views"); - assert!(details.like_count.is_none(), "like count not hidden"); + assert_gte(details.view_count, 10_000_000, "views"); + assert_gte(details.like_count.unwrap(), 150_000, "likes"); let date = details.publish_date.unwrap(); - assert_eq!(date.date(), date!(2019 - 1 - 2)); + assert_eq!(date.date(), date!(2022 - 5 - 13)); assert!(!details.is_live); assert!(!details.is_ccommons); From c879dcf934492d1621242bce613313665e02ec86 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 20 Jun 2023 18:26:29 +0200 Subject: [PATCH 014/459] tests: fix tests --- src/client/response/music_item.rs | 3 ++ .../youtube__music_album_one_artist.snap | 36 +++++++++---------- .../youtube__music_artist_basic_all.snap | 2 +- tests/youtube.rs | 30 ++++++++-------- 4 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 6bbfdff..d695213 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -79,9 +79,11 @@ pub(crate) struct MusicCardShelf { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] +#[allow(clippy::enum_variant_names)] pub(crate) enum MusicResponseItem { MusicResponsiveListItemRenderer(ListMusicItem), MusicTwoRowItemRenderer(CoverMusicItem), + MessageRenderer(serde::de::IgnoredAny), } #[serde_as] @@ -910,6 +912,7 @@ impl MusicListMapper { None => Err("could not determine item type".to_owned()), } } + MusicResponseItem::MessageRenderer(_) => Ok(None), } } diff --git a/tests/snapshots/youtube__music_album_one_artist.snap b/tests/snapshots/youtube__music_album_one_artist.snap index 5276bf3..3fe60ce 100644 --- a/tests/snapshots/youtube__music_album_one_artist.snap +++ b/tests/snapshots/youtube__music_album_one_artist.snap @@ -22,7 +22,7 @@ MusicAlbum( TrackItem( id: "g0iRiJ_ck48", name: "Aulë und Yavanna", - duration: Some(216), + duration: Some(217), cover: [], artists: [ ArtistId( @@ -43,7 +43,7 @@ MusicAlbum( TrackItem( id: "rREEBXp0y9s", name: "Numenor", - duration: Some(224), + duration: Some(225), cover: [], artists: [ ArtistId( @@ -64,7 +64,7 @@ MusicAlbum( TrackItem( id: "zvU5Y8Q19hU", name: "Das Mädchen und die Liebe (feat. Santiano)", - duration: Some(176), + duration: Some(177), cover: [], artists: [ ArtistId( @@ -85,7 +85,7 @@ MusicAlbum( TrackItem( id: "ARKLrzzTQA0", name: "Niënna", - duration: Some(215), + duration: Some(216), cover: [], artists: [ ArtistId( @@ -106,7 +106,7 @@ MusicAlbum( TrackItem( id: "tstLgN8A_Ng", name: "Der fahle Mond", - duration: Some(268), + duration: Some(269), cover: [], artists: [ ArtistId( @@ -127,7 +127,7 @@ MusicAlbum( TrackItem( id: "k2DjgQOY3Ts", name: "Weise den Weg", - duration: Some(202), + duration: Some(203), cover: [], artists: [ ArtistId( @@ -148,7 +148,7 @@ MusicAlbum( TrackItem( id: "azHwhecxEsI", name: "Zeit der Sommernächte", - duration: Some(185), + duration: Some(186), cover: [], artists: [ ArtistId( @@ -169,7 +169,7 @@ MusicAlbum( TrackItem( id: "_FcsdYIQ2co", name: "Märchen enden gut", - duration: Some(226), + duration: Some(227), cover: [], artists: [ ArtistId( @@ -190,7 +190,7 @@ MusicAlbum( TrackItem( id: "27bOWEbshyE", name: "Das Mädchen und der Tod", - duration: Some(207), + duration: Some(208), cover: [], artists: [ ArtistId( @@ -211,7 +211,7 @@ MusicAlbum( TrackItem( id: "riD_3oZwt8w", name: "Wir sehn uns wieder", - duration: Some(211), + duration: Some(212), cover: [], artists: [ ArtistId( @@ -232,7 +232,7 @@ MusicAlbum( TrackItem( id: "8GNvjF3no9s", name: "Tanz mit mir", - duration: Some(179), + duration: Some(180), cover: [], artists: [ ArtistId( @@ -253,7 +253,7 @@ MusicAlbum( TrackItem( id: "YHMFzf1uN2U", name: "Nachtigall", - duration: Some(218), + duration: Some(219), cover: [], artists: [ ArtistId( @@ -274,7 +274,7 @@ MusicAlbum( TrackItem( id: "jvV-z5F3oAo", name: "Gayatri Mantra", - duration: Some(277), + duration: Some(278), cover: [], artists: [ ArtistId( @@ -295,7 +295,7 @@ MusicAlbum( TrackItem( id: "u8_9cxlrh8k", name: "Sing mir deine Lieder", - duration: Some(204), + duration: Some(205), cover: [], artists: [ ArtistId( @@ -316,7 +316,7 @@ MusicAlbum( TrackItem( id: "gSvKcvM1Wk0", name: "Laurië lantar", - duration: Some(202), + duration: Some(203), cover: [], artists: [ ArtistId( @@ -337,7 +337,7 @@ MusicAlbum( TrackItem( id: "wQHgKRJ0pDQ", name: "Wächter vor dem Tor", - duration: Some(222), + duration: Some(223), cover: [], artists: [ ArtistId( @@ -358,7 +358,7 @@ MusicAlbum( TrackItem( id: "Ckz5i6-hzf0", name: "Stroh zu Gold", - duration: Some(177), + duration: Some(178), cover: [], artists: [ ArtistId( @@ -379,7 +379,7 @@ MusicAlbum( TrackItem( id: "y5zuUgyFqrc", name: "Sonnenwendnacht", - duration: Some(220), + duration: Some(221), cover: [], artists: [ ArtistId( diff --git a/tests/snapshots/youtube__music_artist_basic_all.snap b/tests/snapshots/youtube__music_artist_basic_all.snap index 954148f..109ea14 100644 --- a/tests/snapshots/youtube__music_artist_basic_all.snap +++ b/tests/snapshots/youtube__music_artist_basic_all.snap @@ -6,7 +6,7 @@ MusicArtist( id: "UC7cl4MmM6ZZ2TcFyMk_b4pg", name: "Unheilig", header_image: "[header_image]", - description: Some("Unheilig was a German band that featured a variety of influences, including various pop and electronic styles as well as harder, nihilistic hard rock. The band was founded in 1999 and principally consisted of singer Bernd Heinrich \"Der Graf\" along with various musical partners. He was accompanied for live shows with musicians Christoph \"Licky\" Termühlen, Henning Verlage, and Martin \"Potti\" Potthoff. The group\'s debut, Phosphor, came out in 2000.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Unheilig) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), + description: Some("Unheilig is a German band that draws from a variety of influences, including various pop and electronic styles as well as heavier, nihilistic hard rock. The band was founded in Aachen in 1999 and principally consisted of singer Bernd Heinrich \"Der Graf\" along with various musical partners. He was accompanied for live shows with musicians Christoph \"Licky\" Termühlen, Henning Verlage, and Martin \"Potti\" Potthoff. The group\'s debut, Phosphor, came out in 2000.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Unheilig) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), wikipedia_url: Some("https://en.wikipedia.org/wiki/Unheilig"), subscriber_count: "[subscriber_count]", tracks: "[tracks]", diff --git a/tests/youtube.rs b/tests/youtube.rs index 43c0f19..c1a86dd 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -178,13 +178,13 @@ fn check_video_stream(s: impl YtStream) { false )] #[case::live( - "86YLFOog4GM", - "🌎 Earth From Space Live Stream : Live Views from the ISS", - "The station is crewed by NASA astronauts as well as Russian Cosmonauts", + "jfKfPfyJRdk", + "lofi hip hop radio 📚 - beats to relax/study to", + "Listen on Spotify, Apple music and more", 0, - "UCakgsb0w7QB0VHdnCc-OVEA", - "Space Videos", - 10, + "UCSJ4gkVC6NrvII8umztf0Ow", + "Lofi Girl", + 100, true, true )] @@ -661,23 +661,23 @@ fn get_video_details_chapters(rp: RustyPipe) { #[rstest] fn get_video_details_live(rp: RustyPipe) { - let details = tokio_test::block_on(rp.query().video_details("86YLFOog4GM")).unwrap(); + let details = tokio_test::block_on(rp.query().video_details("jfKfPfyJRdk")).unwrap(); // dbg!(&details); - assert_eq!(details.id, "86YLFOog4GM"); + assert_eq!(details.id, "jfKfPfyJRdk"); assert_eq!( details.name, - "🌎 Earth From Space Live Stream : Live Views from the ISS" + "lofi hip hop radio 📚 - beats to relax/study to" ); let desc = details.description.to_plaintext(); assert!( - desc.contains("The station is crewed by NASA astronauts as well as Russian Cosmonauts"), + desc.contains("Listen on Spotify, Apple music and more"), "bad description: {desc}" ); - assert_eq!(details.channel.id, "UCakgsb0w7QB0VHdnCc-OVEA"); - assert_eq!(details.channel.name, "Space Videos"); + assert_eq!(details.channel.id, "UCSJ4gkVC6NrvII8umztf0Ow"); + assert_eq!(details.channel.name, "Lofi Girl"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::Verified); assert_gte( @@ -685,11 +685,11 @@ fn get_video_details_live(rp: RustyPipe) { 5_500_000, "subscribers", ); - assert_gte(details.view_count, 10, "views"); - assert_gte(details.like_count.unwrap(), 872_290, "likes"); + assert_gte(details.view_count, 100, "views"); + assert_gte(details.like_count.unwrap(), 1_800_000, "likes"); let date = details.publish_date.unwrap(); - assert_eq!(date.date(), date!(2021 - 9 - 23)); + assert_eq!(date.date(), date!(2022 - 7 - 12)); assert!(details.is_live); assert!(!details.is_ccommons); From 1bab2ef30178cbfd0fc1c0dc8cab68f3936bcad8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 28 Jun 2023 17:51:09 +0200 Subject: [PATCH 015/459] fix: deobfuscator not extracting array_str --- src/deobfuscate.rs | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index 40a32c2..264d7a3 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -82,12 +82,12 @@ const DEOBF_NSIG_FUNC_NAME: &str = "deobf_nsig"; fn get_sig_fn_name(player_js: &str) -> Result { static FUNCTION_REGEXES: Lazy<[FancyRegex; 6]> = Lazy::new(|| { [ - FancyRegex::new("(?:\\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\\s*=\\s*function\\(\\s*a\\s*\\)\\s*\\{\\s*a\\s*=\\s*a\\.split\\(\\s*\"\"\\s*\\)").unwrap(), - FancyRegex::new("\\bm=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(h\\.s\\)\\)").unwrap(), - FancyRegex::new("\\bc&&\\(c=([a-zA-Z0-9$]{2,})\\(decodeURIComponent\\(c\\)\\)").unwrap(), - FancyRegex::new("([\\w$]+)\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(\"\"\\)\\s*;").unwrap(), - FancyRegex::new("\\b([\\w$]{2,})\\s*=\\s*function\\((\\w+)\\)\\{\\s*\\2=\\s*\\2\\.split\\(\"\"\\)\\s*;").unwrap(), - FancyRegex::new("\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(:encodeURIComponent\\s*\\()([a-zA-Z0-9$]+)\\(").unwrap(), + FancyRegex::new(r#"(?:\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\s*=\s*function\(\s*a\s*\)\s*\{\s*a\s*=\s*a\.split\(\s*""\s*\)"#).unwrap(), + FancyRegex::new(r#"\bm=([a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)"#).unwrap(), + FancyRegex::new(r#"\bc&&\(c=([a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)"#).unwrap(), + FancyRegex::new(r#"([\w$]+)\s*=\s*function\((\w+)\)\{\s*\2=\s*\2\.split\(""\)\s*;"#).unwrap(), + FancyRegex::new(r#"\b([\w$]{2,})\s*=\s*function\((\w+)\)\{\s*\2=\s*\2\.split\(""\)\s*;"#).unwrap(), + FancyRegex::new(r#"\bc\s*&&\s*d\.set\([^,]+\s*,\s*(:encodeURIComponent\s*\()([a-zA-Z0-9$]+)\("#).unwrap(), ] }); @@ -102,8 +102,10 @@ fn caller_function(mapped_name: &str, fn_name: &str) -> String { fn get_sig_fn(player_js: &str) -> Result { let dfunc_name = get_sig_fn_name(player_js)?; - let function_pattern_str = - "(".to_owned() + &dfunc_name.replace('$', "\\$") + "=function\\([a-zA-Z0-9_]+\\)\\{.+?\\})"; + let function_pattern_str = format!( + r#"({}=function\([a-zA-Z0-9_]+\)\{{.+?\}})"#, + dfunc_name.replace('$', "\\$") + ); let function_pattern = Regex::new(&function_pattern_str) .map_err(|_| DeobfError::Other("could not parse function pattern regex"))?; @@ -117,7 +119,7 @@ fn get_sig_fn(player_js: &str) -> Result { + ";"; static HELPER_OBJECT_NAME_REGEX: Lazy = - Lazy::new(|| Regex::new(";([A-Za-z0-9_\\$]{2})\\...\\(").unwrap()); + Lazy::new(|| Regex::new(r#";([A-Za-z0-9_\$]{2})\...\("#).unwrap()); let helper_object_name = HELPER_OBJECT_NAME_REGEX .captures(&deobfuscate_function) .ok_or(DeobfError::Extraction("helper object name"))? @@ -125,8 +127,10 @@ fn get_sig_fn(player_js: &str) -> Result { .unwrap() .as_str(); - let helper_pattern_str = - "(var ".to_owned() + &helper_object_name.replace('$', "\\$") + "=\\{.+?\\}\\};)"; + 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', ""); @@ -144,8 +148,10 @@ fn get_sig_fn(player_js: &str) -> Result { fn get_nsig_fn_name(player_js: &str) -> Result { static FUNCTION_NAME_REGEX: Lazy = Lazy::new(|| { - Regex::new("\\.get\\(\"n\"\\)\\)&&\\([a-zA-Z0-9$_]=([a-zA-Z0-9$_]+)(?:\\[(\\d+)])?\\([a-zA-Z0-9$_]\\)") - .unwrap() + Regex::new( + r#"\.get\("n"\)\)&&\([a-zA-Z0-9$_]=([a-zA-Z0-9$_]+)(?:\[(\d+)])?\([a-zA-Z0-9$_]\)"#, + ) + .unwrap() }); let fname_match = FUNCTION_NAME_REGEX @@ -164,8 +170,7 @@ fn get_nsig_fn_name(player_js: &str) -> Result { .as_str() .parse::() .or(Err(DeobfError::Other("could not parse array_num")))?; - let array_pattern_str = - "var ".to_owned() + ®ex::escape(function_name) + "\\s*=\\s*\\[(.+?)];"; + let array_pattern_str = format!(r#"var {}\s*=\s*\[(.+?)][;,]"#, regex::escape(function_name)); let array_pattern = Regex::new(&array_pattern_str).or(Err(DeobfError::Other( "could not parse helper pattern regex", )))?; From 031b730c4751e6871eeafa9cbdf85736787c8ee1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 3 Jul 2023 16:50:37 +0200 Subject: [PATCH 016/459] fix: add support for shorts playlists (A/B test 9) --- codegen/src/abtest.rs | 12 ++++++++++++ notes/AB_Tests.md | 29 +++++++++++++++++++++++++---- notes/_img/ab_9.png | Bin 0 -> 562780 bytes src/client/response/playlist.rs | 1 + tests/youtube.rs | 12 ++++-------- 5 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 notes/_img/ab_9.png diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index 9acf827..cc9491a 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -24,6 +24,7 @@ pub enum ABTest { TrendsPageHeaderRenderer = 5, DiscographyPage = 6, ShortDateFormat = 7, + PlaylistsForShorts = 9, } const TESTS_TO_RUN: [ABTest; 3] = [ @@ -94,6 +95,7 @@ pub async fn run_test( ABTest::TrendsPageHeaderRenderer => trends_page_header_renderer(&query).await, ABTest::DiscographyPage => discography_page(&query).await, ABTest::ShortDateFormat => short_date_format(&query).await, + ABTest::PlaylistsForShorts => playlists_for_shorts(&query).await, } .unwrap(); pb.inc(1); @@ -243,3 +245,13 @@ pub async fn short_date_format(rp: &RustyPipeQuery) -> Result { .unwrap_or_default() })) } + +pub async fn playlists_for_shorts(rp: &RustyPipeQuery) -> Result { + let playlist = rp.playlist("UUSHh8gHdtzO2tXd593_bjErWg").await?; + let v1 = playlist + .videos + .items + .first() + .ok_or_else(|| anyhow::anyhow!("no videos"))?; + Ok(v1.publish_date_txt.is_none()) +} diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index b9ffbf0..f4294cd 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -360,8 +360,8 @@ YouTube changed the header renderer type on the trending page to a `pageHeaderRe - **Impact:** 🟡 Medium - **Endpoint:** browse (music artist) -YouTube merged the 2 sections for singles and albums on artist pages together. Now -there is only a *Top Releases* section. +YouTube merged the 2 sections for singles and albums on artist pages together. Now there +is only a _Top Releases_ section. YouTube also changed the way the full discography page is fetched, surprisingly making it easier for alternative clients. The discography page now has its own content ID in @@ -382,5 +382,26 @@ visitor data cookie to be set, as it was the case with the old system. - **Encountered on:** 28.05.2023 - **Impact:** 🟡 Medium -YouTube changed their date format from the long format (*21 hours ago*, *3 days ago*) to -a short format (*21h ago*, *3d ago*). +YouTube changed their date format from the long format (_21 hours ago_, _3 days ago_) to +a short format (_21h ago_, _3d ago_). + +## [9] Playlists for Shorts + +- **Encountered on:** 26.06.2023 +- **Impact:** 🟡 Medium +- **Endpoint:** browse (playlist) + +![A/B test 9 screenshot](./_img/ab_9.png) + +Original issue: https://github.com/TeamNewPipe/NewPipeExtractor/issues/10774 + +YouTube added a filter system for playlists, allowing users to only see shorts/full +videos. + +When shorts filter is enabled or when there are only shorts in a playlist, YouTube +return shorts UI elements instead of standard video ones, the ones that are also used +for shorts shelves in searches and suggestions and shorts in the corresponding channel +tab. + +Since the reel items dont include upload date information you can circumvent this new UI +by using the mobile client. But that may change in the future. diff --git a/notes/_img/ab_9.png b/notes/_img/ab_9.png new file mode 100644 index 0000000000000000000000000000000000000000..adca439fd655a072a3a56530dc43a05c70dc8782 GIT binary patch literal 562780 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�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

2D|+wjmTX))?W?ZEvK0d9;1XZ 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

lphzrM6Q#E=c6 zu>b<58{~omg>s_;N?=aIZXB=DuvXcc`hX-QN`M10IN%iO&{eUQw*&ywg%(ui65&B= zsJ4`q(t>dn+9SqeHcN{Oh+qKeCNL9`5T>d8nvo1nlp@c=W=j@%ULAMK)gSp|f1Kj~ z_CNg%Ejt6JDuFu`qp_|HNr0dr$#Z>Uj8*L3)4v6AE}v9VZenAklV+qT#wtdOa>#{w z(#15QzkWPPZ_)H`|07`ECkWIMOeqtpV?uS&>_UOl!AeRs-}@*NMUsHt`!9X>H~;hh z!vFa{{^C#lnLoALZUF3u22De(e(`62`U8LIXW#z=AN=b-_cJwpPE5CMV6VOS@no(WLA5qC87Aw@6So}qQR=@MXy*TYzpU2D?Ew399*KSA#|8LJ zM^1^X(-!;P`DZ@)k$1lHU2lHo?(X72jD?w| z4;F)=89l>CQ5IsiYIE^oDs=a8*KYx~ZL{o}cF~0<2AWIbHf=7~WhX0O(z5GTtJRni z)3DoJg)ZEE>fZABB=p-|@P7Sj18*CRyS}6(A%xJDV(cgc70Aspjah7ktEHUV2mmGmgdReD@s*TBQ3;W z6(nJ#{k4d&001BWNklvHr6HpIu8)Z%k z?(XiSmtyW}0VzZTR0Xzn3W0rmcYpk29}6K6q0*F) zGBmHM0YEK0DM1owbuYlZ)NXyyo2TJnPDXg76#Wot3`qbX6nBgxB%4>Y52?(vDuJ4p zNpc~;%375g9aV3bayUnKFF?t8N>Tt2Lx>@ilI!)M`dJ03?(_htJm9V@m(wAiOFZvL z)XY~S3TiB=HrwoF?$c%tKw#3TAkbI?)vB%vN{v((%4-eO#3pikF<~OUucCeR?CpC} zb5$JH$de$T*6C|QlOzQIWxVuOo2zv7;KAvgyLV3S+<)dR{qeo!_Nw1)cKtf%E#wk% z>0OPXv!gpltFeqbmH`^muugd=0PjE$zaPO&I;tKzaRaK@l@cs=v<1U*wLCdKebc?C zpKFfar1tJ+Tn$6Kx>}!|pTGK*mp}Zgzxu+be&h1u)#Br{IOM|gK~+?pkpPV`#9CiY zg%D%?94$i(bthJ(OfQ=Wl)H!!LUkc!Ap-E}c8I(YxVY8yKOnD-d0nP^j4;X8LtmNEZxg1U|ZP^|D zp>O$TUwZKizxpfxplgFMKmuKp)b4flL~_)Flygr%$ohoG4Ie2bGXv}XIgMN`T3$@* znW%l=0Py|=(F#5*H3=$pWJQM zBm}FqF_VD+Oj-rNNt*xwK@iBjN`YyxP)(9GVpUy0Tx&AawencqYRB z;>DZZ*mHm|b*;&7&!NIJFhQtWi-0gy=s^zv_DLPE2J zOUg%gj_*8me>?29V_${1jMRh}8Z=$gc5OZFP{v#a&s!hXLxW}!W7~F%#iDInqf+Yo zJaD;+ckbT%nrCbkzxde{#_h1VxVpR=#{{XdxNNLX!y>e8*PYxsU9OJ$zGtvEJ@fQp zad)%6w0PBTcSGMBd=kT@oJtwfFqAYT6_@H65kM9iYeUQm(XH*8ZQk~2T%WHkgrG<& z!bAjR^TJd{_Mz>X5X}$-&>U!*=H%qWHdNJ+nji+5g%GW2rtkDg?j_~yUP>uZl0+lP zU?GH1pVl?XIPbSuJwrwS1W1^oN?fguyRL&Vl`F*nVx)tje`FhY(WAU-Oo?ESAfDH#AK*j$?5FNZHA0 zRIc??Pcc^VL5-b1^Ebd4tgm~kfw>g4v zI7on;!jPou_*89BEyCgGLwYH7tD_b$?6sp>^TtU=24q%B0Z1ARrr>bHw3@BGVg#Tz zFea9eTn>^|1)c+;^3!CIscJ^LetM3isH&h$74q1IzELsP76O<>oSPu8EBQ4+lB|-+ zv@}T)poH39hk*gqpcPiOk&71}YWi?4!jTlml{D^-bB8yo0ioBv&pjFZ2S@*maA=;-qO$yT$#}d(VdMq+Q(~ zQnSf%bEyYcSL>@+U;4~vKm8k@eBl$nk<*oYT(#zCTx|<8WMwnGy zVCE3g01yGlgb_&^sb0Bb*_O1?xC!lPT-~7^nL5#hV2F^5n2wuO+N|?DNSC7w+X2C3 zR5&`l|DE6U-4D)Q{qh%HiXloa6(<0>3-IC|I6YcGv;7LiA#U*Z0VI_%rJRCTKnNx+ zo5tL;>-v-rcv$?`k0cR*DKss>Q|$aQ0=wo@hHVjyY-)Gjp@mJ~$% ziy!>aXW#Lz|KuYeI0ttmYeC%ruuu6 zZ{`@a9u8e^B)5-q_$vV7esG^j9LB4tjq#AjZ98zw?NI?9=lY1WCkDBV$HafE`whIV zKo8^fM0-@2xted|aqa*xH~!5goxHC99%AMR-DJRhK%sI#RZ`~UALcRbd*$R(JKc4F z$@S3XVTXO3-v-pjgWzsLXH5*v)q{)8#Z`>4K}abTcri0;x~^-w9b^{mnbT)dDQD+r zyItS9HBDQ^@?4yx+(V3Q*BN8GTGDLWZ$fNC+b95mPQkQXF1ofe3%m6o_cnH(^VRxt zv)-oUO^m}Z#@MWf_4)aEKaTx4G;L!RaQ>i2?pDjVXc;Z?Gg=x3rBX)E zV`;28U7Xyzf7*3TouSQ$`l?jQN$O5k3qG}6-|>sQ-Dp!r)bqvi7}>?Afh%mLOrZp$(COK{2-QvgAtOmH*g0^>ie9XuBKZW0|cW(Ty_yy4JnI(F_Hm+X3;`GFiG;;ntK#WHx$DwHum`f(*CcvkqP?AP3#ibB}I87ch$Yn+Z%kF}6 z{xpPtS#brf-KT?otwB)f;bO3R&k_$${JI zP0dIpUNe0oZ?kZ77>6War1q{Pr676bbAhOrX(pkBnne03c&!x|fiMXUwFc@s>aA)Z z0o0rPlZ*Dw*VS>5>zm-C{c4K0YU8U02~C>d)Cv>jIqB;x93-eb9535k9PoF4{kvaz z_3U$>|HAoty;!V{juwlfqvgp{%RBeVkdV``*~mv}9EY8!p}>m@Sb}*_1_e2RV1WRm zAzFytVzG?PGB(FebCT67NnQ$6#&I0S(TlrOuVF!=SsO#MSj4vd zu^<2O1V$8&;Gz)`I(>Io}GulX{-(~3vvXKW}a1w zL;FEs&grc_a1%6+IgP_uPjdnwX>>!8iYxEGdG*!dNqWo8Jk6F#zL78~Fnhn+c{EE% zb6d_MPv3=kNSo&ws=3Ssood{|&#VhWe5B ze+vl+-~Q+Rt+zb){D1HlJ}_0907BD`0M^$|AYeZdf)WT}8WvfHZ4nfqy5Umu4uF$> z!nzh+2hy69rbMTZ^QefL57cOrp*o}b%)YZ>ZhB4Tz5ndEH{S5s<1oP+9*@Q$r(Nga zkVzLAF!6D2-l?d-FT0iS$hIrcfj8qlwpW51~M=R@L`NuN@LcL z$F#ZX)9B7vh0deZQQ!ADr+&AMvDt1nC3#@Oz@}?NsUI9pGnuVcr@imi+f8g^w~C9C zrG@TneZKB5n^kPb`jxW~VFiq_?fY@u4owVA6OUHQ7`vQP8PjOZZnJYRE|wrtDQB1K zfm-BYd2;L-M|N~_yeOW`Y|JGN15#Eh8cV+$`ZOMe#p&H;+eR-w^nK20(Y1}5w7D8D zFYi9})avf3ErpjCY0JL#v9X{`DWf1-8zboMBO5E8RT6yB4@piV+pbf}DUSghOUWtk z`XLR49+%xx9*R5UMo6mfi4Mb9>@DqkB3!c|2C(#)iHzx(Sy`N>c1hJ?B_2e?FIn4eagDAZ-z zi2wx$Rr_-l$&GZ0bj`Pk3a*C~ULUBsMh#}H=OnKkD=7f3qEt#INivWop$gD~lO`$W z(lpb>5Y;)i8s^!Fob;{zbXDBzVxf@+hWQ*4X{6vqoXX}<2oNX*dXWd4if3{MrqOOc z!cHP2K$=kN!8Iu@)t&qBP6xn9V7`_!XSoKhmiazR4FT+lU|RdGk*Z^b9hh&ys(|9BTU{rgWZ zSI4nwx~4r|o-CfeM>yd^_EPFGQAtvE7fBgO){Tz9CWHvGKFNKt?bk1FcDo1L&2F>X ze(v+1{f%G$_~$?SX$^_F)ArIl#j5;L z2$D&H$tibF^4`-r_m^e3I%@1|-u9NSy!_%PKlxEJ8M17YJ@lQE0MrK2&13syO{BJ6 zeTD&Why_MCU?!(X5Om263Cc)$q?2ylVDSjel3YoEL>M`}&hGRg0wn5~2QZgBKb!+w*_&Pk;B%{p??{`pM%^A3iZx$vKbXZX9zO^Ln$sdwP6vadD9KM}UGVqW}Or z7XTuPoGObLppkOHE00ouP*1zPAv{rUfdov-{Egmv6W6`<;P2!pilvm$>@RxOqE$j# z9-VyKpZ&mp@$dh;|LE`i=5PAL-+KSeZ~4fF{_ZdT?Z0{Ul`ntc)1L(Gr~dn20s!C} z|KNL{eeU_6|FM62&P~l1Fr5LT1kd%mymO~#4OmSM*&OydZ>R*ONHv31_c~BruEz`# zd+wWv1C!HS`rF1siyjf=ptf$fKMCR-Zg0Sp+uH$9nf5l-eI%&0}1M4Tt#kkJmab$}a=hvDBa9!dTQsH5hi@K}#S)C#Z0*9^Z8plcg%T5kq9wBDdT z<@(TVig4ic$S~JT@`Q?h?V|i^ZHB>p^jruw z(GnI%M@@?^E_0FsqqQ=2p&3hwy=O{3ofsxb#+-`-J-2PUXwamTvfze3C#IZAVb>h# z_}?8F_q$ClrR_S>WeH`u-drASF7V1L%e$+lIlA!R3IKG_`|BLP-EGWs({(hY zVVg%bP1jhE=j@}w8Ms)qIR>+s8X!~RIOb_OB1oE>T<%`Hux>_JpoM@?S&sxsk!BW~ z0AfsqEIEyy#~1= zF&Ih4rio!b+W^?KP$~r0+@74A#<&+EsutmZ*IO8qYdzRqb(K0DNV}nD9%*QrCWH`a zA($6gFoy@4Q*wEg*$Lc`60bp0!p%PR2-N(`AmMFqd+Tzw+>JY_uuAwQ$U|t%CS9ZU zZjxTAx>AWuGVmTo&XeziseWDyX6Ei*iu<$?5<>tc&9G*I#9k{ngrwpg53(vr?v;^h z;dG5Jn4>a{f*0pygg(v=09nb1QF!2&{z zA&_Rl0Ff|b+cp5)y_8~RrQ|xclZ-KvgjvqH>fvJ=f8X!_{onG>d}|Eh?Bcw?y2|~| zkb@P-EeLSbl?@bwQ)5n>aeJA^bB*hFzvF9PefdkD{mjQx-WlBtKoT-EMIhWZ~8sFXTiB1SYwCCiSrD0)o(-Ac30rq{`f^1YoYHYj@qWP1ZyIhiM$*!1tkm z`yy2w`X91wHQr$4*?h||)$!hV)Bl>n0qNW2olyfn?EV_KRfd~*1hq#vJppelGyvSF z;Jw>pEswz*MhE7{Vjoz*t%jVLrT*Pl{nS@N=+zm>GxukIvA|@W4Y>+zj)u z?{68p(4`???Ji=|&^(u{qF@wCF2!W4<-%z>`Ps$!<>fl1oJuLVc6oDi1_iT1C|a{x zAX?dA7zZCy7mmK>ZC`tKadx%4TyNG*yJ}X8)zLC6ErXtAo`LK|0>Yx9Oe}+E3r#)j zl#&lapCQzReFG3g$}E_l-BFz;z}V$cgPvoG!Za|$7MtabVnc&;3<{S zOMyf|?j`5qqFIdQG9TSU6ND=300y~ADKMJJkpY-7gu0+pzw$!R3PRh^%-SK3<3J@J zTehu8BLYYmU>*XB&$pPbLa)&aD=HFClIP;+jimk=im0FzxPsTLK%&WMRH*n$Lr`ouoyxl zAV{v-jFae5TlJ>gOinF1{b&-rC+kBX$q)c9snF(yK{@I{D#=xBPZXGa0l=LlXEPJv z?vSd+^{8R>23&$f8dPXBhw5rA43Nzy`FhzM$yqiz(+0DwLzDgm4>#Q*?N zkNyF$Ia1X~Cx0VUYxzd*Yr$)bTV7MOAJojD?=2k0omHt?IALlvR>MBnSAn`u0wCwi zfRqPXp>hN7OrL+@6JPqwiysRAN4Hqry?5{U`1GkaJ#+8=y{Dde=HC6MV$)fOF*LD> zBqg|e&MBq5*{u71x4yc%yg0kOJiofQ*sZTh9!p8eg-~ZlLOu&E4<& zzVBPDR_7NN{ncf^y+G=N<-kHZP)I={XmWU;`>S!h?6+t4?=FrPcR%&QKQt>qVUxk) za6)nirmen%H^TOubb}L#L&1;rBd}9O0Scr8FhVi_q=5RgV+ly|v82A_UC6mx1TIb$ z%$Y#|(Lk3??|lORT!6b#MdNzChW=mX-tE`6Cc6*%{YKTCYpuP{Ip6vE`t{xEi|zOl z2*^r;1=!f;A(BNTgA_#u!bOpIfER?|0gwYOlTn;I*))-ZNpluS$ za*M+;iMe@9Ew7FDvs985l^_Bj)YL7@0niHYA46jEDoec4h{!{HM?N-905QA@X0^+`Jew6|CPV~@BAD4>z80Gpg~I^j@E^MI!}r`2#8_V z#4OtV0aAjkmb|#c2MFq9o=}YaneOT}Jo0xzL8m$jgK7 zg(yCHIfF!h=q6ZC8jQZ<)T%9y@$O>f7g5hW^)jq+H}b1+H`*CeXXxBv{0GJTMtBv@ zL_Onm!YS}xv{$CO6MByWtH%eipv9#%$Crl(sU8&Kfk*EN_frPNhu`6NNac?RDJHR| z>Q!nreq%eCv#R(wj@1cZx7(FgU%tEs+|s5}r4~6T6mL!#vlER#PIM&9&{a z4S9N5^Jd&Vd6IY829nl<)iad4-2oaLYYonBa=4!QhskO9F%1MIkgFD)BJ|@jb zWV$3dNF)={;yPN9;5HBQ{?;WgQ!57>w_NpI15?hV(SQ`c!C(Lcku)<%^E@A>!(}ba z3nV~7RE8;KJFS-k=re0qdZG&uDG$5L%V*D@U%m6KHt#_aRCC3c*W|S=V}eSl0xaG; zCm@($f|@sgL?XR;gDk}f|6^xR6b*=V?p~O1oF<G>+p)(i96008Y1TAK7m-5Xn;SaIQtXC8?CTwdO7WaW!@;aj;Dh z!_0uB)z07vkFWK;!_u@Idj8a&2a^iPQ{nAjkX z3(@6Pl#(TG6JnQn$vSX+Bp`qgyxv^D1d!5`-NnV9{rR8&%2$5t8^8OzX+6JPL8dYY|=Hm3GUK^fCM3XdeT5A3A+Td~3Ew*f z#r-^9AMcaseDHbShd5vO*T+Lv+{YQewb#*oPfQ*V=Hhve;PQA!=1x6om88d9KP(Fg zz&Z_ls3sxTA94g-r}wmK@wa{L;le7H#eKzbeQIu zt?Dq%w}*Z4;$G%?mc_n=M5L59X@gmFE$_Z~F>c2j4?L5fZ8 zq#0ZD!|hemMM`6X4s&s*kX(&atX}7wktKMX}{ zqd8?}sR5{^w$f@NZLp+7mum6W;-|r3OyqHb_GH)$gQVjj1A`1+<%X0K@-R$OD+3Oo zMF0RG07*naRHa~=1~QM^WGR%CFdb6PvUoQ%gCJ>!WM(8>a<8q;(^TC_x;s4@mBtff zjQC)@z(5xSxLMwAKKsQl{Ko(Lf7@m=8$eQ^*yaK-gq)#dNJwg43Uf-yXaW&O&LJrV zPA9FZv03DkNI(!JwblR=ouoqX3@Kc)SfkHVF@GIB%rdOFzxn1zFE5_$Z(FP-Luwvp zIgUyXs+U?5nSr<=4FKhIuZY~^u=KIx0|~*e$gh{-F_5A5ku+~j5=eMg>%BEIbMFct z$&@Vii-0I_4L(FBtybi0W>i&h8;Ds}km$>Vdn!{`>x_a#x=VmyA|y$2IRzpE4#pun zxIv*O_lgHS0f=SjkdU55w9dT->LuuBcmRmr*EA6&0)Tiqq302`j+cFwN0S}N#ya{D zJ^q4-cFz+8X#ljcppHxP0Ju;;vhIi=wY)PDUU2u(Y#7Jw<&&%T-mb09Wd=0nyxVQ- z)RIZWKvGSm&GS6pT#=T?VgKGcc{5&KUT!xVA@)6@w`wr2wYhs}y)9m%^8UI>Yt@9- zeE0Ko15#K7xVm*s%9>eA;lRhh=iNhd3rhT->v(rANb_Q-h20( zH`m`bn_)BQt_BEV{CIH}ZwLgJ&engLh=3F$CJ-J32%$?Tx@ABb6pAnbI34}qnFFL! zEThw1Y{0B`<#T~~GNtVsLLw=o5I{0{JS^qfEd0?e=sVy}r; z+AWZRsh#=gZF2l3AS}J)UalcbQ8Lc^ea?fZ&N%|YCqMtCzxr?fYhVBJZ}m3Ok%%PqoxPKCXVY-E+Q*}T&S!czb|ML zOP#yP6wsr%uH#ZCDNwa=IK3i zKHWV@$cMvxD0?WUabrX>h;n#s71fj3m^a2U-M+~6^1Ziz|N7=ds`ci@dn%2D2#1b+ z-`&xe;5Ni^XU@aGlu}A%Y8F?Ik_4PtAO}*Z%x#+H66(t|SsunQr@=spFj8_$Hlzfw zwmR1;#KIrRm}Z&tkSj}dO|z3=O51F(Di;g@!IZNl&@xFHXpBQ0l0pwCwOqfv-d$X5 zFLvAAg-gbi(m)IQroScJcTtW9d;|vy{F9&iT;A={ZtIq513XTugqC}fkYj_^S^)@s z(F>uSERw#^mtw+Ma8gakjB7>Q!HGNBrL3%ZUF|DmVR&HPATP_-5XHitvdjc;+>6X zhU;nm#lQH^KmG9Y>zkL?*Dns&FV*H`03~PvWrw zTulO~kmaaC3^Gy+o2_$%gg{af$);7yhN8Q~ksUh(T(ZT&3AtH9w5Z&O&Oy2~yThk< z8ZZ)R`=&tYWNEKK==d^xou_Gk1LLsW{K${}_)q`r&;80T{jzEsH``JwtAilfyv2Kc z>n{8%=*YtkfQDf8 zqC8gVbAA9G4>;$4Y#*Mydc=q9yTiLhH2de`bHC(|(YRlj_48VEmr?6TYjGTl_v-oe zdy0BvyWO^y(rOhc&7Q59B^%vaGq*Gj<1m+c*x$A$g2Rw%ooQ__?f3gw5t2J7m|86k zA2vB*r~n#7?MtyCF`*wPN?i70g|4Q{2!@i9^DvNL7%*uZ;RGaWDKT$y&bi4YfwEyh zPL>itZ|=~Lj3a6*RrBT3XU{G#&3$mF`u^$~rS3MHVH}6eu-Rs?PHn==>-Npx;U=|G zb-ULz9p>4+5t3SUcZb~7;I#N<@}x8jLry06=3*=;?o9?rW41hI%r@_Vi>JoZb_K?E*=neXb@yPtrT*#)L7GP)V{bt&Bb&SAa_QJu#?$#2 zx9E>Sxj!(98|CRrWJGw31NUllL}c05_ZGx*`pzmJPcaN%+ipeBDOlGC&|4@aF2WBJbp&U-Q`YosX%O8wASJbFnXx~kdVBTxitr1 z#+(PnMIB}U60=Lq8&k^L%}@WSpZI|v{^Fs{*EcT?SMPe85@mh*BH)MvV{B!yJ&~%hN5duz)(+3SoAiL?Z zgq;xA5?TlptKcvP8zoKNfJAchJRv!<2*ow-ot#S^iw&d+?QnZ5GUdG8Ui|dW{M;}7 z?O)zs-|lbcXV0E|^IP8wbVMh+dR!vnOgJO+OQcvvis0` zH!sWWyxCn2n{8=zKNSo)WlNS!P4uZuE^PAFNH=&)FmWTO6wDxz%}7cWKvSqwE+a;o z4?=;#>CN1dXa>lL$_AR{1gJq~NJF-*vGH=)UOwFoV@^VHsg`!AS$h7_r#X*Jq8Vt$ zR?56B*Fvieb*`9dDU+*$Xnp(Ch1RM_Gs)d&LXyjeaY)(tWZ3UZb8m71u1qE;ELk2# z2W3nxH`mtiPR-hB4#*|S>OW}Am$$T^2nj^z{x&kX&>k z4a4^0Qf9;MNxQjqC6Qu3Ze$=JO12E_y(=tZdzEKd_;*)#rmh3>f*= zC*JzRTOa$zx4(Vl;aRvhHd+c+oYcGK?%tdhC+|TwHDe0vCA6py1TLySV^j0Bv1&?r z3;xAp>o-0DX34$w_@FH}S-7{>dl}6V3{+f)@OogcDc6U-+?W3Qy@JtPj<8<(^8fuf z9~8!;mi(PSax=P@d7k#Q-R^IuX>W;Mi=>N-3nEGC8aYD`0>C4$$~@OnHrvf+9OaVa zBCza3kRc(ZbTgy1RuKBV!uSlK3vHM%GqYsbGT>pGjl*DMvgGdWPA*#93b8XI$-U$} zn7MoWU`v5WvX$Drh22tGQ{v?9-}?9dUC(xy_g638tJ9RIL?;C{umKJ_RLiuVuHQMl z{MHvf_ttOz#;<$3%~^m04h8#?57|a!Rg9GTVR05<^g&+h64*T0Q?x2 z!z8xY+GUIztAad^E+M6uC0B{NT0kdyrv@E#sX-*unRb08US+qep!j3B74=;n*Hw{1 z4p%+^1ffia`7jRKoq(fx5u}2MPAP<*fh3|EI?+O*ZaElhD3mnMhj}`XJqd&`V2<>) z7(5Dlqm#pOgpBdAB$Q%sQ(QTNuv3A4%&k{RSO)uOqaYk~@hT`jj@6Ba)nkux|KX13 zeMFY$qHysJ{veFBc)Sb$^)MVW4Eq3{o1?IBu#tM)|VZ z0l?!}&hnXnB4;1G&}3oU5T?wA2BD8IMi^}{@i^ysLSwuXky0LW%G^AAO1YWRz#+xz z6`tyePgCAy8rYI(LKQh!^SKOEYPI;(P;FzhF(r&Xcyl$hR=s*+3WF=<6iUB@al5rm zwsDxIc{&_QY0aBrqD&md1WJ&Ss)ljQn{jaWT5D|r%vDM$^Hk>2*Yg0$82arpMJ9 zDH(EZwMul4HC8Ivfd;@N!pUZ4Ic1WqwLWD6jN76C0P)g6lvpbxg^TIZ$BVn>gS(^_ z6-{xgk%a{USm?P3mGhXSR?q!bsD4N$MkJE#ukVZGB9RevI;ghBscc7|RcIjiwKPXp zsn-!Ad2c%lCJO)r_7V{2Ght7;%7##QOQQVVGW-ha@^yMV;*^9-dDcE_k?Ouuh-DxS zQQWQ80`}8lDTXNHFyzvv+DffuOhyn$AdsU4K*DHw$Z5z{W1rJ(7`;|ktPPVVBL@J6 zA*W;{+>>g&_aIp`yZ|Wn2S~|l@roKNJ|P)K#5w z?9DgEaRfCCsm(Khl+${r>nsQdV1itr;;ldcBt>O2z~ea6y@VeKuW7fu4ipUlKmdDR z?}K3Y-n@MIB;`De5eG5zcbh>te#Hlb@VXP5>`f|wpjxfBFRvp95f6x2WPwp0} zJ0Br(ANPr#b)I>Ah+~9PX+oAyIQe%uTFSpR)!#Rx?=>!-Zb~UGKg=^VTT03qa;ZrM zSgExoR2FZoI%vZBIYAN%)e|g=Wedr(!!;puZ1VFK^;;xto z!mG7-Gu8=OO3$A^zr1`h4=-~bYMtYFMwpopybpl1XeI)J_h3jU?k=_E+TTRRB6@St zj06xbPrk-*^_rj$L;BK}zVK_m{&yvhHQBSBuC+w~+4n902#5)JaXSeIk_>=1FJ4Ia z$^bAbrE}^*7v4U@1L%#i7zrzfqaTlf;K|~0CYV`k0(30Zq6NZe6)j1mooW{%Ad)mn zbb?S!^}1I8u4;M~$H?~sJ_wHOx^Ccy6pvMiy^%gx#^=M>uZJV&*G+H-=fvXS^86bAcrHZeE}p##~hKRFdUvOisLbd6kBg(ojoTI%%vR^anGf6m}0| z)4La2uC=WgvZwfS0Bv>tP%bIn;CBh`Rg!y&w5_$)8Y%Y{wh9nO#j=^1K*sKzRp{yE zhkpLg{kb9Mci(w;e|1x|o4w_8q-N||%cvAjYsrSxRC`Boof z8W0;?4`uWHac*FG6pB7aKq0^}14s8^#0cSAM(ksOmNd6l?_Iv}X3BA~dN&l*X%Srb z+B>8~gg=%jy^$dbt<~GBm(Xbl0|3S#A%J0Nh+3FKcB2Fco28TM#Xb&u?D7I{q24|w3@d`W|a0cpsuZue^y-N5f z2iAztla$?uP7=3ro_mhRd-N8~Iy~1IoXhM~Gh19X1y`8W*W0$p+_XERT~b z?#)S$tH7SU`TXL^lj|YJIxa}j5GH3|3U)xSA=GC2JUlGj>?VYFne zHPR$4@8p9^?*IS@jgn4}(6OcZo?a{f(ItVs*Aq0O*%(q21(UoK2S6aD)FO)t6>__TkywN{ux^D#_Kt|><7eK#zdNMOaItY_sH>&-AT)vy(duD;JLb*h<+Cq->5Ko!PyXbu{_3xm))HahcDt>m z(qinrTZeO4IOI8Jm%`l4G>Q!Vc$$bF4%5LeD7J_#e?NHY&O7m<2BAlt ziF1S`tWCQUhl5W-u;3Kj*|DVRReZE?LGR?TqQ79(tmlfc#yP)xc#SB5M~nO&;FS6d zoiiDoiG`EzozU}90RW2_hWl;^aBQ2!r;9C@$5q7MlBcMr81Ij$(YgQ+D7-$g?*-C! z7~6JVt5K{@Bgj@;X$}tC&DOoCc`Maqi6%j=GR=o+0xjoZ7&h|cjqXHqQo_IA0FgAB3#HU)nn-Lm;}Ad7Mnf_p-LQEskfCQPN zp#-Rr#cSIaiA|QKc{)r0ERjt%AZA2&$=zF%n;95QAsRX#iVmwRm%{m_+O@E;%N5SFLp}+lw5LC8T6rF4YA9$|)p~P#Gne^e zPd|QrxOK^-5c^Q?Vz`qO`(p^5-fOGn!yo?er$6)A`P=UvuCL3@Z9n!cNQnxEHMnX^ zIa3~zZT+|k07~=_{(#)#4qk~=N*Kp6r5PwojPD#V{g8b6?CBT2@P*&`%GaagNluVp zsD>nC!$eZ8#ge67mpi@o2uX{5OrURV9pMt210cIK4uFe(L13Be03dQlOw~Mb{ut}j z769GN%#7Ze!iu zKjLis*F@ARWeeL+Qs}i^I8UPUT39pUK2sK-?tiY#J=0YXnHab5!3efmODRT^>*~de zR%?Ue9qWiMDb^s&Y#c|+NzS>|*6QIf0%3xpHbu)2$azR9_Fm$QAFP`t^fcKdJ6^OgSqv*~y@2}t9jlSF9#oO;tvowmlgFnvY@8|1r#%EA!rfV? zscxrI=9JRU{@g$LTfg~R^DquXBIaSJwJr^NUdGlC5O1AH0^~xR7aQ_2f_9E9++*kD zYvNUQOZ4Q2IJVE7;NDJ)$#AbZ0un%P{_@>-E}lKx>~`o{Ry3wUS7ul%0EAExx@oZx z5jY?A``hc@o{Rk;=qN%Ai$w?t3c|;8b?jfWSVatKOX~p)Z4f|E zjPLiyLTdTE>s4+? z^zTzN^$&F!Ir%)+EbN0YaBOTa+z2{L==T>d4>zSumT7UD5D5c}CRTa#<}o#jK%Wl0 zwo=M8&&@p#+oyIBKOro4Zvq4}^v<3nc@+$135#+DA!cQld24_{jU;FdN@mIO)2Ev< zPbp=9fSZv+CV6?eOKGU3ia;pp1~-s4?zWp@Yn4*6(KtZ1-EM_8 zh^_)!Gs!F|sd+PaEv=%~CNP=C-FR`a+m2hg=6NQSQ_7iAj7)ylMgRaH07*naRE!}z z61#{c*pRKZmQ!ujC6!VR(_uSqt+|)Bzqz@*xQthLk7_{}EhGiW9W=RaZ*RZ))i0-U zc=GgVs62i0({aAgN}Q$mb-Y@)WB$??zxa*c`0ZiLp}UiGfjSLj5}OOPq7Rf*oa>8M z_ZQOMCms=$Lck=23VyFAedmxsFfo1d6Q6wg?8)`ZJs0K#NNRPi#>^zOR)OfWYd##& zlS=|Tw521>&iQklJF@QbA3iu z`r^8~;I1L(xQ#dVVPYpllDjW9GbE9uE4EgmpajO8Nm@$DjAV0fwbDpH@|F^0bD8I9 zlF+*>V9WP?EKB^X8jx zTv_iO^>DZRkK>V8calF6 zXTkdf_Xx*WCr&+*@J{=jiL*539j{JyWo2~Fb8#Mop;LV*xr)D@av?4N(lQVpvwU5q ze-BW-O|`Vr;x`06Ns!s#21lJVIqhb;ZPTnY5(5A_GLu<)x!(^}ncJyWOJ-s+vz$Gt z8bD@RrIeh6VgVkE6GP2a8(X}`AqER+0OI6;L>uxJfT(zpGPzPtr8FormJs932=lm7 zX~>q6wYiisZO37^*$zmp`t|;LI!s$8+iowmyNip9akJZu8?cEw97?GbKxU>q<_0si zrc$a`Z>=T*q&wnA<(!~5P@sY44pdl5NFrc48E6@nTLMw!)eqikD~drP=YD{#H8>1} z%*;}165Sy+03Pp}N`M(TCNtZ4^HQfcxYnkkZAq3`tEVXm&0Wb!%h^)ucZCHKnaw1T zHc#`*moGNEQ5a}2+jOCnB=u!rm*i6OR=rhsKTPd2pZjAU`NYS+_LVPNHf2MDoLJ5> z0U(pCpQ#5ap~2x`0vkw?aC)*tfU@R*xe;x4PrNEuheM4QQ372%VV96sfC?GvNn&Uh z4A5sk``M>YpWIv@EJktmIZcu!^CpEBNP26lrykrPIjOERXE!wfO-oGloN ztoK?&f*WFL65Sg~>pc;qg+O9y4lIk?-s=N^!OsZA5_73Yq&hRsSv1y?kYo_5rAVr+ zK?V?@dnneOW~5#m!K)+gtUE5kcqhgY3$;EdN3?ZRSumUchG8W5&O7gZcyj>)f?3*a zH+8NrUtGC2G&v-xL7{kdg2pUQY}H+@9d6rp*qY^(@{nzsCYTLo0wfuj-BX zl02LqH-hzJE&}>XQKeQyyoFb_R)lz)k(4u5D~4g*Y`0SHym4AA@?fMVn9_JT{M66< zj6?hV?cw$sD#j_9;#G3MBu|95>H6yJCl~o^U-@lAam>Jsc(rY@KedeW3ZD0t?U1@D zvcjo-MKOjC0LL~3ND3fLY-W`A$z&n5qHjcSYDo^Ln=TSSVwUW^cfR@Yx4!s|ci&BE zyM6M}Msp=+=&VMhPK5+W(1BX!d7krF#&Pqf{>-2Gwg2N+29mW-*p zZpYm&k0U@J%zzciMU56zTbU1sGR@J*QJker)bcNA#CM1l0mPVlj0%wq@(_A07F#8J zg4sc)S0rqoV_l-GcdV2yH>+Crnmj~w#&E8^``6m9Kb^|D1TG|^s@*48vm{s^dg4|6 zqPnNRg%?M}%(b|W27`}j;J(|;@~Woju*S66 zUcT|h)aHHNPuG zvyJ`TOoJ?Q*pB1KxlH^09x$m5n+{#b)MV}-`{c(l7{{FI&`ObJEJ_lYSO}iwvAj#*IyJNRFg|VBZ0I2$G~l*7p#e?p>=R$;B4B z1Nw1hax@d!)hYmhU>24b0Q4ERD@p(WL(n8?mfRZvBPEHER^6ceUP6+f=<@5ljz-HL z0gh~uM5Cn?JOPl0T)d5&(Ynnsq-1aZ!F#oqo11IWdP9bGb3D%>5iqmXT#%%Ti;L&a zpF1%OL#@@_U%t2+hanFcU?bbILT@CQLTn@n9?VI3`C0d+Yp|O(M;kC0sFYH_Pq8&2 zeuUoK>ogs1_bu!eZ>_avDMdM>8cukvKl;ai_y>RR2OXTJdEW2ojY&p;OGzkihw1hz zu|9h`mc6U?BV-B_XgToq9fRj|bS}LH04*Gf^Ra-_q7_c#M!RdxuCP$1Lp52g<@Q6* zp1gha&CO<;1{1TvdSem*Ec!MOmb94g#PGXyi5%P`D1r)8D2gX=(ZLn5LxYe6 zg#I6L7A2<8t(5L5VzGWAyCvh5F|&Bx<pH zyI;&8C*wu^F9HEApPl2YQZJ!B&pwshtI67DZ4q_cFU}FGnD^s6AacTE{()8KSvIY3 zKJ>gVfJcK)-s=b};k$ze9vyf5S8QQ?tU}@;sP{2Xr4nUH{N*X>gB#3($18a zvN2KSOlYlDZ%LUMp48-uJ|9C1%w?^*xAh{NdvgG-ie^Ss6974K&Y7`jVu00JGKSWF zhysZOV2LS-V9FeZ#7Zw!&|nEhYnFxm&F#yVSFK_$2iG*@ZO$W58Mlb$mT8uAt7@uh zEvJM5CRl%aj(a)aGp z)F*psd+DQ`TJ9KV0NF2VI>w2F;jrZzu_HoB4PaS&j!v{@LKHGKE&vB8z#S>2W2yxN z!k__;oFt&77>rFA0Ek>7vP)-es>oC!0v^uq7LtNa&r#iTUFC;ZvlMFqy5oKy;W@sE zWn^zr&}hSuhm?x9l(*aM9Q}fEsYf^@$t62($;86)f*J=O z$<|t}wN<6GNQHU}hGafuO>zH;KmDh-yNmr{+8++JRhkmb;1m*RQc|04ujkvVkACFI z*MILfMjVKlXss27viDG1==+X=wVMF2%m{ayZrOID5z7rC0a`o-!xTOUnLMROe;@Br zIFM)!n%;ZoYi~UN%;;^td1v>=X7Fue0^@pR8I5EDC709LjI4F8^PvvoxY_)JfASyx z<-hZHpysaPZ8&?u-~&X3r2gwnM;L3)DJ3_xULjd9?LJrE53ekT7UnN%=4p@#|MUV?a3jaVd9F#`5)0iDRA+B1xt(BO`mVUPlN9923mde}pp9ex(SUWGO8 z1OdT6b&pfjbu=!yL|J+%yJPuY*%FMW&M**A=LCRN=UqDTDOdE^=Ss51gA`{2jyTJs zb!A=~4+ow*cx51fyD?rF`%IwvU$`Hov}ikLD0Hks9y*Uc_kvdbYs#JbS~0XsbAJL5 zeP!|KQ6uOW^ZO1PSZY1Y(~vWVgfV&bxz6oS2QP(Q5Wl5p00oE;;lPk=JC4r>UaDZ= zq0V!wOf+M;nNg}s-m00ksJkSfdMH+`-m2oz1JqaUP-~45*$gmO^3GSe8A&r5^niJc zn{5D~sooySG;y1TY{|_Nn2`-+1>jzlEI)a&GaHPX&1PF`O_oy5V@~5RTFP}UtrSW* z=OGO>{eR58S+ixybsqM8D|7F2?o@MkRdqMeb2mg06atVfl3^(vda!I+3d?>`go9!0 z!Oyn;fgc?qKX?c$Y;y{U7DrQITYi&*wxkF%1PT-ffFMB-LlX@&d#>RQXYZZ4K0mD7 zXSnxPRW|^G{3`06y)##?Tsg0m(>6<@RN&4cL(T@dk;qI5T{bg_NSR&VEvDtk@mcj! zN*RZ7I31@|$?Q^>`bF>VwUk<`ndO{^sd#McG0Kp0mQ+W?`SsRqGouzSIxDBeHBF;Z zW=c~X%ZhHaF>pGma5BDZWs!bqR*>88od%(z@GUw{4e#UK9B*WP#oqPwEgc<0@B&d$!J zQXH_9hG8tF5Gj^PMN}b7F9~LrQi@a8Ao_lB<;v0C-rmW{$zrkS`$d^1RhN`VoYh@6VBvZ0z+5n{Z^bjO5QVY=HOfo>; zxqJ6BpZ%PZ(=?r(9IF;HgwX;*szw;6T22-V+`spB$C@+B=&tIm{vveB#uDEXT7@TP z!;)*4w(vrb7V`_u3n1x|F;*mji?y_AX9DE(q;miMJC+W{vkw=0S8Z`XBq%kjs3EFQ zXnR#&hGCT#d)>0T^X%Q1Uw`$(x8LqM8;4rAC&PBnT41yTvG@$1rb)@%qE^Lx&+QgdJ&g-ZE?HI zJ8-U5ZsSotkn*X6QJd8tG{Ff97z$#i;rdR9s~I6QoKa(uR$vgOW_m($dpJRAlQoH!MS zSza!YQc93bi=|z=aWK}i3Em@3wG=O<7GD*}<<)@+By*yvpvbGUc!l7VPAjU@R6VZK zVO%dp2vpTHR(a0ZjFzl;N;O&P6EaPuOnH%W%9h#X4yf=tj+57#fG(x9PY>naEeS+2 zTIy_(mO1B?94vAq*ZyKr=`>^-Wl6~l>XW?GTFO*X1|Y#{4k$iIn2=JEM4FJ|Xn|PK zS>JVafA3&*d`4NpRI_WLL<8mSA^?l3P^FZ5d38y(5(ZYpcaUQ{cJw$fiC*chv6kv} zI(|61R@2Dpd9i1mO7XMPljGx))a6vC>G*6&i~TECn5+(~l+t3c+~40nI5;Y$SnAFm z+&5yN(*8kKt{#RG-~t^2RjRu~@>;#rTIFs6YPx#u){R?FKlt$8-of6=OI1OYOBLw4 zevvZ(14(sVKa8W-Aw~t02qhZYscRFFg%~oV~thsXFfzh+cW!xGbuZ12C%Z z)8{_>+5h{W|Fe>vA}R>dC^*dk8Wf8vE^%uw8JVOwgyM*(>2iw^4|AI~k~Fd%4vCu4 zSO9VnAV6Z8ikXQ3X=Z6&RUqjxfNX(e%DI-(?q>r?5{v#dS zmtZT&YDLt7lYmQ+jhLI6&`Q&j8R(=)92_iPdFiDWUwq-k7hihsz4yQN#v6c@$^Yc7 zw{6ia`hEq}>eYR!(`p>prOXb%Y#7f;ge197DfbX+^_-HsN+~I&TB{kmoQq29aSAMU z-KJ!1?WI*AL&%wElzWAfkYwDnmZ*O2p3FL+x|><8)oYb|O!1gS$-U5e;iIO0?L?<1P!RvH7j1R8t;rQW)rePWf`Q)rpD1Oj(88-np zFPfVzfO)xVt{l6FiXT?xu8#u*Xf_YAGLoP`2oOLsxGb6qFdHDY-jXUwsvse&kg3$^ z)Mdl!!$o(5)Pok$xMYZo+9ah)wU$!Ggzo0;8=w8$XaBcf{KX8vx_|hnery}gR?ibK zsk%HWjms0$t)s*Aow(;^P7pyRZ4{J`gvZ$}!D;*N<{^IOJeQiRTK{J&>1I2`-%$O7 zrj>D1gAjiNP@y#gXr{u`!XZMyTYimT2EiE@eLL1^s z9xleRjso!$6!AB5p|PG_BH|so=D4QY=KlmV(rpfp#N`y1y8@5%xq#gq*@iAU1uk=2 z<8sd}UQthW$hJIMfm}qmZnJ3atvNxMt9Q5uRr6i5T?gGx-8$IiQO|h1@BgnTgO4Xe zZ~fl>ejTMVVnsJHS&#nyhYw}uL>Z@{$dZ+b{oykA2?>L*P({MXL{ymMFdbbv>}wgz zRHf=ZR018~aFJ&eR}D& z=eP1LvY#}9j>O5msABLQU8h7a27Ll1nvCicryFI723K{}GMUA9Fa&t06vdrhD?N@~ z6L5Dknwgw{B(J5!uAcRnN{}MS<+AT{Pgp5MF>6MW9LI4eQ|fZ=b1en#aybj=fMnj7 zM+5{(SFNRZ^;$})uBk{U<5|~rq>bb1{rBIy`Rr44)Ty34d{}|2H?K42ezCZA1n^ejN>aL0Vk>TM6Bes*6MP1cR?Z?Ann$zr=Nc2nQy=OhL?R? zt){WKpelldF{kltWtR39i+Re%EqR7hTFl$3xfGl9tz;|d9EXXJMe+I)DJ z0Pw;~FYNuRMduir`8W=EgGxT48q>tFUG_GhLO+4qm{p^yweR$^wiN{xn9ig8H#$o`H zWklu!f(T2Qq+Ppy?U}oGe(2Bt(DR>o?%I_rw{JiDPk-&71IVe*IbXSQ<=)9dNnWc; zt+k$8M6E|GD`a%A7UFq=#$a?n5hnZM94 z7sEK7o*sKW>#PvfT3*2*pd3H=;Ak(ePT$Q|y{udVQPs|}L7~>@l9m$qD8(kp%xKX{ zEIL-Sev|-WH6B2+=7Pw`NYP9qZ8Tv3Vd@7MYAT|=I9LF}SL1L$FCON-B|!s)G@D7A zyF&mFs3L;fZ)`GXhG&&YS8-6 zj!XQk-N~(PZ1*=L+U2oB!Dzng;8X~?A>8sM5ZNM;2t5NW=hk5nR?y}ZTO`;-A4JvDsEwb%^yHF$6IsZ#YfADzwork@gFp7q>x7;@rqwV+0gw!vVL-Dar zSW+*92n8Y+%Oz`J%~Kg!#4bVoP**5YHIee_UZ=@x z@lq56h^5}4)(^XlW2t5A`-MBshH`XdsjJgehH*F>hWp2-cUQOf7yBmEQoAm`_~rtb z5)&m&<75??Nr1~yQ!UjUmYra-WX$efCYRdMeD1nhCQuc{Qv3c%CkYc&9n~avc=ci; zld1rgGNjazNm5QJfy-{Mb`^jn^IF|hr??_agqSR+oVu*j(`wdrouxFbhT>DHrBpBS zT70aroh+xW3)7G?OO|D&KwdhcR-cYf_xb~7gY5YD?CLmyaIeGZ>8ex_x$jr*@4r(H z4i5JB_EO5VlxnG*p5gp?MbtpJJJv}@;*i_T+ z4Mw`_){PrCZ`?RL8@#NS!rTgaFmq6rRGAm_M5P${NWNWPTHUJhS`RHz@6}D7kHz=?k ztS_QT9tVN8wzQE1H+l6vf+S+WBtEsSwPQS(VuflK+o|4$6iEbT8j=(tq^60s?mgu^ zP1Btlw_bkb<>#M&{+Va)+`W7E`qiVu{R1#g%;RLWx^v@(q%y8*tu(lMspZ4__iBsB z%~B$m8PmWH7esQoT)GR?;o;$;U%33r!O`jISxRY|CQFt*Ph;GoRyfh!E!i**DKRRN znNf`M6=BK5on?|@HD;a6lyld0?oKmEQz>Rfa1~ki3?$Ok=<3pT2$j^-sP2Tfg!7T5I1gOstnx+DAc(3oRizP{?XPmsu&qkwAbB zH+AVr`&qZ}IJ-sd&n9haG}n#Bx=S53aCSswM$5_>>qaICY^02`5~5VN&4vi0gX=Y= zP{(F}0O31p(iB4VZe=_>w;&{9A*MwcN;^PqY2ujsJ_?8_rkO?SLdXy|9M&mRgq(9@ z^K&^K>lwatm$l;tV9um%cLF*`4*)G)bAA(Wtg{Od43R5sDSypllX*LF5eUk)$C?|r zMl^1jU)wBp**y*)nesBKOS0lg*a@+Dc`Tz{&&M&e3*7(!AOJ~3K~$3N;zGc=hF>Cv zF66~d>Ke`Y$hTYL4)0($KeV@X=xsJ@nE-72%mM$@@tu3)vkMiUQa^QFpB6mW-|M<= zk$NhnQmoWeyMz5B07_J{n(Og&yeg|Ddzk=p_u_S|lbmQ8uShQ4kGGmdrqM znkGugl8U>g>X@7=uCdgV(g3+6O|_V%oSA3`2M2(qoQq9PC!NE0QLI;u<+ z=%DOA$?{^c?7B{7wU((&(R7VWT{ofBsgjHnv9Tc|_q}y_Ebd;DWzSxUgCq(GnNU$7 zR{;z(c9w_^9nHK7(%CpAIi+cJw!E@*L8W+6rB9`fUg>)Gop*0Mb!)NcYput}CpmR} z4@+sBMngXg<>dHue}4}EU}?U}4S=MJny3>X9Juw=(@)>N`^O)?-!GT7lyMln767%D zQY(d&FbsoSP`jC`R8Pi~%xjHpDwf*52L})r6aaa-hvVU`x8Hg7@Wt(@zZVcB+2!uF zS6+Slo%bw_G2tHjoi6M2cfc57FT*;lsvICaR2hT&tQa*t>k%9-LQ*ZBQU;xDr?E?| z?(R`*T@vFMMCfD@3NfxooCm9IT`3w}h!hFO9IANm6afD?3f4t%Hq5^7Xr`c@KLr%H z%$OlSGmr^$@QOmC$!Kb;rz8n8yMFV=r$7B8FFgOu)3!Tk zqb;kHC=svK-ARV6+oiNzE|ZyoDJQvVt(IfppCW?%b<$8i38Uihv8vw-b#w%(i zK`7u`##A)a(Cr|&Y68e2Kds}#)8h{ohrQcc^KUgUI7fvi;8PukvEQr9#p1_*{KvoZ z=C}6u_u2xNS_6C{LNp7D$YBOU$thK@ZgC-V1BFEz&Ne}xfXCS_+n6)zGL2X38Q!Gl^!Uod_c- zA`daqx~-WR)}l0C0HU0?1zx8<>Q?k8PrxSd*3-ovGZGzW56#kQX<7H}3O_2gcN6lK z&Uu+hbJ(B`4(ouyZBChp#$`(;5?ZfJ&CWX+vGu;|zC+Tm?RK8a8kf5^T-4Q{5a3bR z3DjPm#Aw(53DnwDl8dC<#ePweaM^ZW7Zv7)chUC}Y;oiI>4}&n-Ry<3VoS-GAmV1j1xv*5PF1R#KV}Uy)$(U#&1%o6L zz)Gubl^%l*M1y6QkK+y1Lx&Ns#PvM@mpiW{G5IciyF(+-j}Irzc&_y}B;-34~y@ zyvSuLIh*A?f2@s*oCRZIN?x3$jPnSkxg85G%E~lJnKC#fOykO{cZWwZ)T(KkXJE=!CccMLWS-~NT4~85+z7T*{mQF4l|?I>eZ1j zjKesM%4sTP97pHClunj?&er!!sc>PXR*gf-nPBSjFs!;Ro23E(mPAt3Jx&QT#svX_ zfhkmJ+H!CIg%@6W@6B&dJg!42{ZOVN_b^(_;X;Lv7>$%s^4zh@-JRRFzw_pIyw;iu zk>hKlVcmw^qTB<+@BRK)UVZt+$olUB^E@a*QFjP5n1A9E&mSIqaTrJVR9%oq)HPb8 zgV@nU)>way5kR|1V3!~usf{Oz!G~n)EeOoU1JJ(MutqQj<}QJ%nrJZ60h_NRlET1% zq*5zO>2iihXB#r5Aakh|+l)}(tIes~5`bQz7ItSkc_xa)&I>m!MQhC5F3FI~GqYu5 zdjT51HcdX$3I-rPgR{okmL{|o4}dcY1vr_t7voF2! z%5$H1=GxV(M@I*J-!B%6F6Go#WYYZy4*`7jYhV4h{>opTrm@zVXb&FVcb}$7r^l!F zKfGUtlJkN7hsH4_0O_owJL;Gq|JC(j(qf03zv)Bb%OEoi9 z7g46t=X`v8{3DU2ySVb$FogpvSCLTEd> zSZ6Lp%wG_j*(f915(@>01n4w?5(rR)$%B7n^P1ay(`0j+XVO|F0YHnX8Masp;P?ShGX!e;c5Gi;fo*R?)O9Fxz3Ej9O zvLQmv@if;KeS|~{auMP6c$Wr6oQ++RbIpAYHfynJj&oaEd&kfGJEwYXXNZ@GVz$`V zQMFiSg5a*RcX8Iw*qcTaqTEz4kffAY%g=rZT{!5E}{0Yk)Uy2Gu-m|Q^5cGjko^tQ!noC z?=6q^7JG}d%nl7@n#QpVb@Ea~CDtN~F$4rmpeQ%F7#}4hm}nIq6Q3j)gDm4WbgOtF zK)`GDQdO((A0E8?!t>ww+LymEtq!kT`8PiI+Q0nG-#fZ`xOZ@S9Q^&a9~>W_eE4C% zT0OP5za*2Tv{+b5N#;g#IaHVcODWSVce2Id;UaYyy>JAPOYYTmFan7NuhTHN*W7nz z%v~ZNd98&;2=1)43P6lw03bru<*rg>?8q*sC6Qg`XQwH5lEGO^oV0g3KlS;Dsq1pBm8Hntp-g)1Yc1nASYn4oK@o`9J0isdEq5wDD4LjL z&)k0I=;->xsZNX2Zd`QJR41>Rtcm~x0kyiwP&Fi!Qr>;{-INW9p(F+4%}7PuA0`0* zZg_uOZ0j!DNU4AN>DxDN+<18W(2Ju~`IA~-tFBmU9x?DWMdh&|5R<`A zKqP*bS&RZ+tCIk%R)9de!6AGF6t|f5>o*95NdpFga;A^$-^jeK zN+i`rC!Z@vU>!3g7ijK@Zplj>%edmAr*$sK))kG2WhE$a-3NVLh2-7MT8Y~?-o<}-z6 zBLD!vAe*xnAfPZzf)<>Omvwjs=h?4WDr#{m3Vh25f!J0BS|2@g2?^GjML?%aCBL%xcZLyEHIo=tq)Yoahn5J;tc0Wh9(*&`@{gG%SAA$05n1i4HJ%@A7 z7pN{cY$5XbBDSL3_-n^y!*;G)+r(R?)lBrqU=#3sTB4B##TNUy#$1ZWc>Tce&38Zi zcKV@z^XZ$8TB#hnr;FU31_LQo_cGR$6M@uqiP^GMIs~tB_X=5OF2Nz8qRQOmV6<@n z5MqPIde&BQFXQy^!SS7^pE^7`y0Uk8^V;(F|L}`1zxvGYef1BHPfwT^SFRk~`{2Pe zVVs83v(?_PI5^xVK{J}cu$qR|@dx{R{grF`mMmFH$xv0MVgj9(Q(op=GDl29F)$fP z>vHF!rDWvU$%!DN)kP&qgJolEuW#RE6yQ?vcEM*SSnifx-XptGu_zQ&Mor@|O~su+ zl4`BhV^ONHnX8ZFF4r{q1ORX|ODUUJRb1{~-M#BNTjXIiOtr#V=jd`vDR-SqwbGsL zJ`Stp;Xz7Rot`S2*C`IZ+~! zN)V*EKOx-UhP|Vs7hie#_kZ_c9+oz&Qr{ERME8*t2{}ZFZU%~qv&0%0s}X>LX$<}Z zfRn=;58pWk@YO&1+Q0toFMjqjpN{PMSWt-Fux?=_xmYZ2-@g5=Z+$DL235+mzrT3#r59d%<>fnfo_gl)GdFMET<$IVzVG{mSq{C0TWR}^ z-~6q2-+K?hSHJqz&;QHMfA%ka&b^X=TootBr+a(*!!RuRC1GgRYRm66o2Y(gXJ`8d z``2$=PiFi3M`q^kr>Cdg-rm8%ff>)v&Q_~I@^Kt%t!9>Ja_73BB}L64NSfJHMoBjB zdu-9oQAby@wr>GIN+~TCi?-fU9j(fQItGw0zWmbB_3OhhjHf3)3>H_Wh>%2)q^4oG z=k)|w(TYMfr$wVs8xJop(o4Zc%>WQhGq@Vq8cRzAiS`;9F;@VFrvc%*mH+Y6o(V!? z=%!n(!65@3Y6L`@rn75LADpgE_LhfY1;QO<4xR!C0ZzEPPo>o2UDv<%`fKle`%NH8 zB4%Cj5m3uq)ly3-^Fnbf+i8E1^P~Y)?xGV;Xz%#f-+K7Yc}9=M#T2D3%5 zCVDg!8FwB6*8L~uX3Lpht1MCbg2Otdc$gidTO`*(f^Tp|m={rU5D*O+%`4iBgy@Wd z9iu|GYOsk50vX)F5Okfih;ZZC#6(LBnut$A1o^m#L|^I@N!oVV@h2i-^Z$*@F6sFg zHo>v$L!gz|WAG&ZN8yriPkR42*b4hNHs|~Zt=Sn;TqbwtQ+e#c8GuA_=SJLdxZRzO|=nGqt$)G;GzjPu)Y7X`Tw!|?5IfBX3O zxQD%Y{NCQ)UPU*pM!4l(*RCJlzkm3_hYua~>}(LMEo4}7D5ZqTz2)M{)#d)dBIne1 zIWxhLgg$qvOO}~y*VSx;*F0fTM-U(kmh+;^DUU0vdbj8ndwT+40KL?)dW8%$vjh~c zGSbY%zV8nX53Y3m{xDRmO0s2{#s|j_&rVN)nscV)?(R}lCP*@ZByyKYOz>I?)C`DB z7&KKMr)e6?YBh~x>AP;R$SK)s7$LfQ+$H7?mm647B`0&4R`PMt?G5ED4Y>-0=m6oR zj>B+za+1srj*i?5yPhN=_puiDn!My@?s;Dn6G9rAeV_S1`_!(nx5 zi{8e84s%IeoeChu@D4x>J~r>=aUr#ltoa)W+V7rhww(X;Klu6o@kjn^YqPu`2N#;t zth;zh_UAtJso(q3mujh=5xsmW3BDc@w31`z~Y`temUFUX(KocHqrlw%=b!%BbwvNo z-~GG4_$$ABdU8Ujlu~QGfB(T$szU-qBq7m2#HOCLHo-WCVn%RvwpuQh(=8#yb@O;nmkM;C;y z>OL)(-Fxrf?~kr$>*CtX#*@Tc%&`Ylin|_5*Dqdu{ZqgGFaCuSA{?{+@n~okLvd{! z;3|Umi|%Nd)58K)c$GQivhwgt|HCeWC*W~*3(l35(6UP#3t`)Ti(D;f7q#^u*>*h7 zCX9snf%9*$6lMbfQ97g)Z5ja7#+PPRGy_9y&vOCCZxeDWh9F#z2!bX>cY#`!|&ZgDmrAjWhOy&&AXfDNfCv)x~m1!bHR-p)m=DEwI)^C2}js4eOymkGy zb^P*IzIJ>%rGC%g%Vod6-(SD+>@-d^93Jk`Jic$95_3jgF07WWx2cY<1h39Sr#n(l z6KZiEt5?efUFw#L&OjeWFGWO7sqYeMcQ&1!tL4*RwAJ z<2bH{0YIq`;O^mFs(bZzu@y-IKGpGbaqXZ^?zO@a5FI+I*J+x@VLY*uez^d9Ns`=) zJF0UkL(YlSYR%CJONzQ0J^yAYnh@hg8##G!cBNERqml_;M*(YH zp*1NHbO14{**bhel!!O?uD<)uX1n%R|LAK!_Y1%BcYfk;uU)o5R-maCh0DKZ3ehPUc6+aVHa z@mlNI>B_xKrFh*;Xh-GhyKXad2G#>kq+^Dp>P|qAG4?LuoJd=*@er{|5WuFMe*e(w zTU54)jJraA3^ajbOX^&vPRh)d2aA_qdHK~>UcG($_A}4idF~URP?`4j_edIzOev+P z?3?tHgnshx|NK|}@T;>MzWn7c|M&mxfA=5!t-nbUqPreGJRXO!dMF715xG_B=(S&v$Pskk_ePiCC|BYDK1SHkW)%2jkQ>cuVR_J0$MJ6(n505++jIA_tNuuxi~pJ z9ak%qDPhV5kSe)FU0Hvtv=+ zvR^EgV=Yq|yn4!9q~$nGLv`kP?#+?1IZAS+;;t!WT)%nk?wvbd|K^+HnSSiYfAl+l z{KxgDFjJQd$-3Mb%|H_v2XMzajm1k% zlet@U<5IFjnNwq(P~A07Oe8^%#UCb1*-Eimi`Pnu^5JZCwmMcBX@Yu+smnQ^-njM2 zyw|VZ{}bTURr<_nVRg(vsCab9<#3?HDin%&oRF5(S!c_1I;=p^3}B91fYh{rah&E0 zG;Jy+7F$Y*OKaWaU^1f%85Pr@VcP5W+>#KhQUWBHFlGn<4&8OB{OHuVZw{PEj`#ZyNH*~oyvRBnwm_S*q8c1Mbj8PJx z)O6ou0Gu#7klx$B@x`~#pE3RUU;fo=*RKADfAilv=f1|);JU3yY~!4sZI;p}Kl#Zw z-uPokIp^ZlUC~BqfNP%X+ys%T)Z&ulUd>{`gz?wrtJox|mQZXiKwHh-0h1&-;O?Q8 zL2|XR7m~c9)Z!JTly=yvdJ}_?+$Gd9jAP&T5h~`|5$Xlx*gB+6C;-$lbzKINV!~g< zTDY~*r6|4#5jO-l5GQUf1)H)Wj~4)Oo7{|6TFqJL!`a!{G!=;BIQIP#O{=JaXhgC_-;)Gm z4k#r{DW$IK_Vx}+nfku3)k%8iz2xqtl%t$#^-?DHRI8h%40x?lg;d>rngCFgywpOL zXi#R13nwUfnJiiEa=%!{J~1OTUz}^n$hI%IdWEr8KRrFE)w{jDmtK2K#4rx0rw^%0 zRG@-%DkXRwr}30^N^(eEE4(^f6p-3RIdI+j&K>XAu0pL!7#%QJEL1V-l4<6UoZfbS znE{GA5*0-Njls0ltgvp#&?8$-+^SXP2EY;Z%|Q{01<9!XBrW!Y0VIdvfturWq7B=g%*k8|6Gni*VsW& zWKVc#HcQsOp@EB0+yE3S1Q7Xa)~uQ7pDup-pM2rH`=9!Wzw~16vh|sXi^Wo8 zIcpa!##RcTcQjR+;G$pLxN*}uR(he5k9jh8x17z429{LKBu#Y`0SZ9ZQu&Y99QmR*JVpbs?#)`O(P@?!@!5f@4f%t*)-n!@ZMghS|)cSOY8|3M3ZVMis>B? z;53dyS-HErr<539a_ReV8f<--A6PDzIaSLg=QNI`)*92}Q<>ad?xDKPAjw+l>B;HU zn<5~O`DWkr^ir*5DwB=lIF5_O5&%TfBzpB)+>%#T04XJsMoF@0H|{2Qaj3S+2JeYLzQ?45s+Ey}&|RXiJxa z4nT0o!eUtKc5M_A0C-r3u3Cy$xHogB1 zX}(@&7o@d1`hCJ$ZzD-klJDl)K(qh=AOJ~3K~!F1@zFsO8Ec-B%jH+D+<4)I=U;sB zg*$ie-hTS&yLaybAek-aE}5B`0aTnUB0_-R=I%fJ_y6I~{lj0}j$)0U`pKXC;DZnT z+F$#3PEJnF&dy4yU6=cA0U&zxaU6@BB;(V8mU3?)n5c0YuU)%#c6R#8E3dx!=9{(F zVHf~Bc<=y#yVq$@=v085Wo>MbT~0aYoHGGc2Rcb+R#X;?g}XD#5*UZkQW#^iQ7uIR zC6!tLxmQUCA zE}N|)BiT&wwnq!V_dalv1_)Re`!?2X)7>X&H4c7=m|}?IK8=pFx%Xgbw9`~N_bxA9 zdhwMn{m#E8HudU>aQ9MbZfkF(2>RZlw*;%8``+6>_0|{v*K?sh3Z7)Q%o1wzcsaEG z)85;&fOVNj00Ff*ky*!)=^xez#LgbmGF z0-!1V6trbsZ1HF@w4X@6T3&>I;~IZSG}|T!wt@>So;e@{ZX(?%ITv-~RMp_~cbpkLx%~Eh(jSR>b!=+&!h7l1WN5m#3U8 zx4BBM9s^HKsb3x_B@uRdHjNrMx}VjeuIu)C4t-gz>e=e_!3XzI{mRk7bI&~^;`r>; z-D~wyba;65?z``e<8=MT^+mtPU6$1MJxwsDF;Qk_$&xG^;I2~YSXtf3jCS^PSPfV# z`aVY&5n z{sGypVWuQeivCo+1yoku_C0*)Q~_xbY3T+5DJkg^kZuqVM3EK&De3MMDUmK|QA)ZS z6r>v^6p;8Y?)}{{zV8{1S6+eVIcM*+*P3h2x%cT0XR%^)vTCppD7AADvD)V?Wa#b} zip+WZ2H&N}=KQ@IA&rgPqhv~Do#qK#;bBiri4jRurcefp$U&r9JC--0 zkcx`R*~m}EEm`5?s3rGeZC&S&qs1IG5K?Jc-jJ?|9`r zVqx0YZsq5L!f!vKSCzNt^L`hp6TtURq44l>N`G{DROa)V>RU34Zppy2A5D5s&wsVu zfLBuQ%B#KRyS7vX@tOmAu}wX%Q<>;(S0DWrL~D(=C)cr7*ymLpHX73=A>N`voCXeE zr8;BHGIMQUBgy-{?LQg!S@H_qBLx0L*zW9ywrlE)$P@ov%v)$p#-6HYI*{QeRaup) zIKqgRJV5P*1yLR!Vyo5 zd=}yf9!{c9hbZvK`}AEqwKjLKJd zl^V@3k$&`$E8A^~(7DxA*=Q&)NmX zD#HFSs(+F{b4A7#R?)L{`yH1;AD89v_V&pv&nfg^)hmlvGVx^vak?2jZYVwA&nN-D zBF=5TW4MOxYqs(zKg-Jgub=*Fng5nAei$oGxCmRd3sd!GxOC|`U}`2}ocX{586=6n z{rxgO_ky290~^~s>cIM@76&;jMxjUFoC{AW9wt3n~BPa>cWif~` zc;pDmGmVI4W9a7k_oAjVGQP8!Mp=tfx$*5ad+-_T^$%=QQ$!3Ejggv$unWjvlU=tp zrbURwUw<5VlQ2V6sFi4k7yhE6l%RblXLQ5a_u$}wy`&^sKW}vFNQ5^t=WCt(`|nPu@m4ky*dCV|zHoMS{;*(bWs%3mIru6~a*QJ9T2@MU!#l_VkWzA*_ z=3zP~AQ{;@l(Fql$JM4-$XBVVFVD+pzC6I4sCR4BjshLWwcf3N?6mJnxsqb-@kvWMr~X6MEv64 zSkAx46thn-6Sz!_S#EA<)>EZ*FqpR@%W3Fn?@d_9muF{9rwO=!k`m$K*-8dGGoW+8 zfx*lnjKVcMp1iLJ2yD?=N~D5GAId)uk=Izn8oozx=uGO~@*+GNezW8>?@vAu{8fjo_!7o)#Qboa$EM3W6bR=xeIb7D@ z-47n7Kh>y(@s@1l@`<@38n{|&nq#5e!3w`kV!P0Jb6LY_#&bV>7ghewsC(-}|Gf$R zO1YlA5%13RJO)&nhemDLhRzRd~x;$fCC8~nMI}BwmT>9{@ zHF7G0q<6;t?3Zd*MM^W0rSV#2*_J1_okaN`oi@#V`|CL0l$eqk6MOi#qU|215poh! zAcU)+la6og9!!aaC#(2$5Jm((=0KDCo?3C0eI_}R+bA9l!rn)THuCSC6OU|zh}2}j zN2|#RLd0uItXySK+~u_w1qNK0#=u=hImdaT#sfDegboRR6E4^tDK+yZMyA-<+lws> zPvJ!@1x@=}$cz8p2xHT>H{Q6P`$MspFS$^^$h<|+_#N&HJ?#tlShJ;oAxt%(B%2oV z>BuKLB*q5?+af)8DSN%S%k-3kK{mqboODEmu+P0E@M;dJ28v`I92`pGL&i8CX8!D_ z!w}8ACv{5ONwC5&5@Q+65HxVId%)Ggy0^f*2|wLi(A4&dL&UAtXOQJ&=mFw+hC?pl zso;nn_MMO}=Z<|8*08jGtfBi^Jjs7Y{bv)gV$<7zxmHdWvH04gD!mlNKIUx{Rw3cR z*}CTQf-E)?s_SdxL)nh%U5<@xLfS;vt^dgWz>gdq*`I@3`A?{2VjP^462%4&M=)nc z^_y2~(Y=Z%y%x$$lAdl|Jfl1KEsDfRDE+ZYbEk^+d1ap8BSvl^&kfps>TW-j*P)q< z9pv4S&sPGk{V#6)PrSnv;wuzb_Q?_M@XHq-<05B4q}SK3sn?YL%VjJ=-nH*y?36Oc zC`HWv?>12Tjtp|&q2KE6VbC(AA^M7NJMaGW$_;Gu@E?0RXX)N`gEywz;uCsT0(M@& ze})!r%d~XgF>rh>qq{RJG}Ddn;4x8 zTJm3ugSG#6hgyAq4BDT|V5_X(M}`zkA!L(Tg90C?Wxh@zrK;MVZ)tf{pbA^FlQh5n zY{H+x_;WMr`OHqV#r7sTUXe~Z^?!o%=W}C`)l&|884La|F(doW!j)0f>*Y#3Bhu6f z3*s%GJc)uwe&pddu^ZNv%SBK^8=W89)YL>NV5gkIi-COpx7!F`8@6~GvHoJR0h;CV z;ygifpeWmTDL>)qn5JSjamEeh`Tu>^9r!HdSMl!_2p64Yh;zag8H4LK*JU{E*nC*z?-7YLW}9MH{> zi+FQ@+O+URNl~$<=IP`|?IPF1_2Gw6)GXuam#i*LuLE-)7xJ*8Mjz?tvcFnLWB&Gk zOaFcHR_zc0I@(altWk zvsmtmQOguX@r9xk9UaZ2lIrf^agBmkrf8h#E)Wvu|Nc4-y?ZeG$pNP8@#fjaXhGGJ z!9Tx$pIr3|)S~hM_4V~InMeEkc0Zaxj;NJqMJA2 z*dUY7ULJXb1!D{h4DjUar%#{e`5olzeX>u{DRKaQPLp;mPEB0+`GTaUrziYgd&o@z z%7~Fgj%5rr@tv8PQM;OXpUY-Vvqb$GI4N?b#GsayWKgL13%5m3AQ?_j zfadiC!@&3HWJ|)B#@wA(LmNiQ0Xh%b-Ma-u1)&^94bH>wW#KAr@tDg%@N~t{SDamJ z!z|twb>|ima&HeNgcmI>tyYbBN9aJteK6dJ^76(W%E8!tGHVM$LBmwe5D{QuvF%Id zL4GZK^&b@fw+&HqlS%o5LG3O)4aSyiWvuWK4EAkq(=Ry>qu@Stw6xF>`iGHoEk2j< zD~+x@r(0z$Bb+@D2UkBxOuW3k4UZAnZ@IiMu)!*D7HWv!{9<`eVw$WAg_C;e@Wb7+ zSFZ%P$o9pWpZ}D~Yh@>4)0t~@b5vJXhX*z~J6Ed~z%8{;lo*s07suz95fW8uebiDY zM9OPwzE@a$gHUB>XJ1@e3JVRz#3%nX>)4{Fug|KY)L*PuRjpsLcq^mLtfHo7+^zU_iAnx-B(f z{Xh?bcrcmAf}c`FS-Ed#wl=|T0M8I&?`T!BakkTMZdE32dad-Il-mSZIbNi+BqyzSs+`SuM9iKG_uTx`ercnYM<40tZp)nT#u z`&^u0AtNIrJ&7FmZH8zJ4B&Y5$-_hE4AokYLI3^T16O6kv+oV(r$>-kW-2Tm{`<3o z@(yObNT&qVx3#qu(6lj3UU%Hx-@kv47O35=-8N}-byyq7sIu-yMG_Qita?fB-@nhr zRrUrAD^u*%1UOvKomDSlOUq`hgQI8oSHpSiR@b$G30a zsus+)__U13FP|Q52@4Ak4-ZrS=QZzjaE-815R%{bN~^Gz7N54DYmof9sZaj=`Gc4O zcp0_{ZUUwg0|Nt=dnUiF=7R@c%gx%x>|E^ZSdqic@!qz!w$agpAI-1sJ)5JU?nz*K zNVF`~1Cm(m6O6b?GpVEs|v@(72g-uPOnu!O>- zPgPpu@+9o&yIO& zY{x%pYiVhDdYkAJKK3>m>l9_kBIWaLIarR5v&d$!-tWTeE!@lxTV0?kK{Y8_@* z*VeEW&0&?NP8I9dY(j)v^~9t6M&`@S&@>Y225`j1#SLnosi>)`DJrH4JS9!JA^3En z7|L*aXD8|x$hs~fx6fxh!?-=k{WjvFhPBOt6B5QD(%}8oAirC5;s*ra8CVYx!Qp~i z)z#HuWLzT&6x7tE34_yob8N*WB{ljxu$CZi!77|AGikXv|5uQgr;;v2*tc6d);F}~ z*m9mfZZ}(PE6x5b>JH5DUFBpNeyR4c!VM^jmZ#I9By83C9REtP-$7Uu78XL#K{7X; z$^OZU>RVNHaCz~!1yDhLUS5e|{mArm3i*9uVSppdEG#TyVi_({)>wV%!Y{x2VZbaY zsj5QQd@B5YF&}l}YVlL$&r^0}c|%I_N4I|vIt3=XG9wDY`xRT-_*v<4>_IC!Iy#lm z^LPCI93mN;uhR^#%;nTPyd?v6_#by#`SW`gTcuUTxU*j1r2h`#)s ztbyGxvf|?J&$Tr&YU6F3il#WP||A0lt};osFaS z?1^Vte$GS_0IL{)82PPRFe;-*Ta&lEO$GoXjpQoaxFbFX|CVvzEgvAUd3$hiaq-ZQ zI&X^EN>744AMyp1>hA6hxYF&{&#tCkBc~IpKFXIq&6dAEUbUS6Nvo}Ob9Z;Qw`WgT zE*!Rj%A%Snii5xi(9;XT3f67*bV*>I!T`}uegkBp4$BX5gdR><+OJ3_N&2`d3gDi;?Q zZ?$Rw6tB|KQih(W;NYp6r%7dHdypch%KtU)eIB*phwo~C)Y7ZAA>6P_)u8xZXhYZo z8P(sxTrgp5rI_Q1|veGS6K`j z6}Y*70nmay*HA6e?m3p~RaqMvQX%}$=ExC1C4d9-hHdm=xd!6k;HYo9?Ed`u8+KW~ z^6&su_6yck+uIvig5a&Yf=>WXms9@+6Vi{_3H&~AHFGB?3eWUXF2R-dJlb4=U3a%` z8I&5Z&^Wim2D)d5UL84;BJ3L5FxuV3%Y)yE|#%R4CVknHa6zCJyKL#>+J z_NWE&$-g_Y1c|%t%wQmvsMtt!(PPNr2|bAK#-mZFNrRbUc*uRXUHog;1Ox;%v!wz7 zjQ}uo1St;pV|WC1gHojrc-LD z@W-n)npT?f-ZQV|F2Y;4(g0_?h5*+(ay9!rPxnA7E>?rm45{-m@Nm4hcJe{DVsRu- zDT%{ibz$M%7zI5o?N1mQNM$BWi+g)Mn`4D=Wy~rl$UCQ%o==}X!SehCQ+agcFjrTR zkU&x|r3}4`x15~Z+v~Sys%;N0{_R!8q-%V>y!ZzT=l9aLt0na2%^Qd>5JF2I6fLhrTOSjzf8@wAKFG}=l($mw&>}p0L54PtTkDgH{Ka8Xr=5>Gd>d`o? z4t~mhm?UT*$D!oIvU7CY15k!YdU-Vgo`bLjpqdK7Fu4Uy5FU~%6ynZ&760d#FV_YF z0|Qsq)^6Musn*O>grsn}T{Vb#gZd26UOe05U8ri7N+?LmPg`5t6G#>5;;%*c`N!JY zq|NvsUBSnC!9c=MZ%{A>KzDfz>lEiE)AH)7>+YPekWd|TR<+N*Q;Im-z>2jkgkR{( zlJJ=-H-kWd*xwi{ytzb#EIC25(%p0ix)g6;(}FUSNIJQQ{4*-dHF8L^^l(atqp_h=`m~YQMgxd`n;e3*>0voAWedKJ3W5m8Jz*()KYjmdU`_V)Mp^j zq2hW2xZRGp2|y}S)MLLRj0_6E!~D6~H$TnfxkXRRV!bi{=LL{t(ZOKk;fdK^%VnE- zFN??hD$$g-%|EwosKMo_l2R{#vyCH9J5#%|F1U8+&!VWs!d+=1c58{Hv#uINGc#J- zpyuY+(8WWGu#PSKwXe|jdxMK5yE80%s1l*G{y3zhq->8%i*-t7;CaB8F?)o3S1bNH zIrlre@s9v7aBy)?&khD5wl+65PQGH@(bd;4)vYjxJ`r#Y*ajR|`%-c=3#WKCmzS5L z#7}`)&@g#@M1t@;{z(7$gHv(V(L>HMZBsvgJGae4Tv4J=iuP?g#37o@>EQ;@@G2^e zT1DgZa^YQlefaQcD@i6-{T!^^s)MraogJX*%b}yxF4Dok!h(>Q8Cya3(6YP8%hp$XM2^Oz|)E2fB(u1>-UFq9zv4b zfb%T623s_{{#F>5wK#7OAwnV|r>CbgQ&TdsvN6{?m%c?^9xvUf(eF1_%4x>iUxB0b zmSA~7#{G)GB1~I^9j2b;}#lee6dNOwJ-kFc@-?RC+)(z+*C8_I{kha#XfO zd@HSb8yXu;nmq*=;bA3E;zXR5yJ)3@Xac$t_MwZ7+oFeO9f?6c2PC3s|EDFi!DUNd zUtjLw!?>`odU|>Q2N*t%*iVeS{JZ0|4JyRCA_`XhiCzhxVinkA#tV-y@jfV$Ja-rKovj%puT|9>H%!vh3#6V9kMfi3&q|vkE-;ieY z>z@Dg$GVZoX=L~GsZxzyjVELwNL)%uoB#)GAx8H1_u(ceuz0WL5;%bpSj7YB!VqI% z$dtvNo}Il)p}oCZa0<_7$r7-gB8WMoJ5l+tL^hhsU{!8!O}ir`b*;HW6K7cUAQmt_K~ zRaRDZc0PQ2$9sKe$HC0(0VX~qOe(_0@U2QQemkXrdUe6tUI^_s4 z`v|TP1(*cPL!9HmrlpX~I1uEj;j0J7<8&gsPgW2k8{#d5h&yeHIqOx_G zApH_pI1sE$3KIkp5)y6q{{jB)Vn9L7aJPdke1{Jz0J?5Z@xKvMh@cXNj1|LRlr4qP z_U3q{H)*uGw)UP8sp^J;u&XYMX8|0#`jx!uEm4YvipUSk>kRdVfRbMUHf_1QXoSiL zT_-Fuivl+CKtmZIp=fTTlz;lf`M5OQth&KwnC{`jZ!C}Ufp1hRn|vrIH&Lwj68Jah zL}}bkDFa0ch@5UmUT3TzNcgF>XWZ;5=6&W4x&Wi(9hsspFjTv-SFA@IZ$w{4Oj@xB4PcrfLSn7;` z?0-kXo62Gia3pYEj&pUtp^<@r`TF%MkSCVc;+-L3yO^4n`LVoRHw4R+(KZQ{SSXrZP7jR>I1*~R4?qMoFHogitw zUQGp90GKb}Ak)NN3D!SaPoavg=Q5(yw`NBOwC>H_m zU`eM3?ttDz4(N>{REg-{P&S`u$jG+SB3=-~*tBi)=;c*ako1gzBP$G0uI&=|_bV3A zi=Uq#XbaI?g3!8@8a0}SPY1=AX(uSkKAY4KbyUpLoSvHcpv5|3D*Ht-lO&(VT`t~57!zG{ZzYIx!JCM+YMkTh#j@}TH?YHDgiBf!VU2Qa1i$sl!&z7e#$(Pa&H)iQJQ z@|vMbxkky4Tyd;$F;KB!p~unsefc7}k6~E*%m}ItG$=S>%1Rmrrhti8oWDeC2g)m7``Aq-RsK74HKx~s;qH)&~U3G6QSUAKWrlXj{P z)l$)a4{hlu`@&zpl#}NRnE_dx{HM6mn^*#|>HG&sVnyIVpxi#v)P!FB`NEeskb(~n z40dd@%vO+si>qxZ!vjj7M>sZ%?)|kSp5Eu`4k6>o*xPUrsVLf&r8SR z^nos(wlMsv=R%B5&u2;V*7djrc0Y=uo%QNMVTBGC_^>+^6dRkHn`>)Hsi}&0$Zp-a zBLO9?*;wtA1K8;}CKXiww0#`QQ#~lh_V)JhOMjuQL&wBaP3HazR4~wtK!mvOFXOzX zxnTvWO@FFDnuv>?q~sTvta+cy^Pp?DR+pFU=RX^nb;riVRe^k>5XZDL-y*@uSqhR4 zG;-5*FX(RxmKZe(($T$#{uQ7PgqOA`g>u>C9Z(l?qQqzFUp}$6W=g4)ZTSh=10<5G zHv+cNzb`cZ>~K^KIOS{j`1a7kK+vbUM#&3k+s}`eq9Aa}%gfit zizcC6=@QVd+yupBeQAjg00nd|(D<>6ik?Af1zcq}RsM4iaxeTJz^#CQ0J!_T>8iVs zhJZ6=P1r0+V@l1)Xoio5`Gd&c10W5f!EEwbR3pKGLjG3$_t@88eQP7WB#BSS)LLAwN;1pkPK^L|2=a z(L~9-dJw*A3j+03Z_+un{^#}YM~@)pp}PY)0r-z8XeFLF9Yb7!#PAdV(C5#eAv7IF zazh{)=oEbolL45k=2K3a7p=kWb4Zi#BX| z?)yAeyhHau3{iaDX2=8 z-LY_^(DH!&3)n&^lDC0;wH?iej~53{?{1ctxqHoaYam{Rh|3J9C^ zB6P)j!l-NNvL0^~WUUTl7y$JKCz9deg#m2|tmH$pg_V_+-Cgg+_7LdfDaE-hplbuY z>j`9eV7$lx$OD?hC1H&&8h~CFN`KL#g2KpU4D)DA$`J3nudGhA#?8(GTF zr}P?HRW6_sfph{_eFt125paJ%PB`uLL%ye@r)SeCUfve4JuOT_vjFi4MBcrZjz3xwK@*48vINFqxilOI1r6i?Av?53qel{tjZEB+XhIdK-WuB6}pS}ZELYZXz8|i zHXYSqDmMAUln=|%GfQJBWL6n{af*Jeif41no^)0+K;7D9~F60<~rxRb8`XtFP zDAzwjA-avsf=4AnPnyB-l12y1F)eMs-D6|>M{}B}tJ?3I6;uN)=%ADDuk^<4hJySM zL;rC9;Gns=d4B8~e!33_NNSr9<^Za$`BbmDjDRXX(!$un)pzpP>{%wc?-YsI0LQki zT(CYjQp2E^Un_m{8~xvhL5{mqwJjeO;Cg(~S{y{+dd`>y@Lmzo1j^S2Dwqa_f)_{T zs%XG!wfGhZeu{UH1>v>q@mlfzfKM{O4E#IdO|V*^L2@h~)r8ZrK#%wY9Ygy@WBNT= zob$w_-ky5Ck7K31j?UoPA+{|bdOVQAx{BYxiRq_#aK;FhtHvv>8=AWNE}P(Taf9{X z`1!;dmVzSvfX^*>Qns4fAP}J-Mzgw<#Xtv9Z8N;MIbOu~WWej}xI(l4giO6vl!unc z43$VQ1fjsu?&{;wqoOzRFIis}{g>1~zB!gd1O_wDy3|Zk-s7t6#${pd!wu^c=vT`I}re?~U8FLUP{I~l#P!dnP-ZUH6U z_nW-l?+HS217vAYzu2dv#fGCRI*8-g&o^>`bkXKfpPQj5TIUe9F>m{z)l4NyYg!u{ zXF5i?)6!D$HyTQ(FM-UwH{HhndC-iB%1YvvwGl?8wT4n!!+`7KDgRynwQD6V}+4s7{lo;<*t)7ahtt8H9|0t@Dhw{WxhUmFP ze%zQe-?H7S`EK9TCs44J<6s~}&cgn2d`e{AD?Afz_qh4%+E*B|bh598EqNIaS};O9 zFwv1#`u5;N@qjL&_mN(#;W1~cCPddz>bdcqgPPTK-E(Yt{iO4x9u$Tz7+i!9pnhqW z>hO%YkfB`)`1B|xx@X9>=K|yDu$FR&qg?cIPuVMc%OY%Hx&GXaC(ENdObq4Gro6Ez zzu84-^_(2bKC=Yka+lZi5VG;+k@3q_^AcKE z*eEh6N?7KMoHAl0R4MR8p#=QAeqt8P_%@c9LQs)_@TG10O(bmchP=y2W;fk#p8Zp+ z#P?rsZP(JE$CyQ&4yrWAarA2!t$qke-qrExu^OFCIf(sv%kRocSLWw4ogDOgkB?QL z6q7(ev6&zbhk_@(?Y$odLvkqB&l?uQsfqM<8mvmb>+$lsCCQ{1eigX_C$S$B5{U3( zZwL}Z7Z4(dLxLG9V)2DMhMm+%;|{}{JYkv8=n3vt0eB84F6`u9P>M5Wd7zl6H-Ve? zNRTU4iQdPlzB&Nu(nSlwc&{(Rupf&cz6gE5o4$y6Qw~D9+XfyS!Dm$&daO_4uq6*= zNwLvP8J*%WoqN7*th>_lQX63(nQJYlu3>j4T+5y*tr#`+ z)@iB#o8b1KpPy~b^0}b6b?fPBq|5=k!6)USaS)Z23z-G%(TIPDiiv?R?Rs%`vcA6V z<}H2Yz76*GZv%P}c%!(~RDEb?@=oiq@$sRLgFO0}Rmf3-@yKB6LkG7O-Ck&t1_=pk zwcN_~{c&6=rUmOe{VY-fw7VH%OLYAb{D;)Djb&|Lupq%yj|vtm6@%<`KFE~vCf;S1ei2A=6oL{? z$)}%vUy{ygSnKd^FgKAgaVIGX(WyL*H|tLH@t_?cvJt6{!nzCwmZ zs=V&EglhemZp25>-4n87YvTceOifR-bmp4ewWj<9knWzt%pu6RklFXnf)<|tFavA} z{xd*tAGDf~)z{E7)dJ21e0ksN__?uhre^=ot_pQrVHQ`hoP)DcfL>UH#Z|n;brSCgyXSaBwiye7@)|tC6S8E#kOD44cNu@)m2CB z4b&u!Q4NVE;o!zZ+TCTUd+FlTC3N`-##&KvKKTXor$R)L3bbxYn&a8xFpv{k(#?o! zFl)ad=%-*&B6;66C4~^Vw33rNjj*MboY~xGwdzld^&9z;r%qBqB#E6n&hhE7ygxUy zd7WZ=;1k@T%{Tx_pux+%MEZ1J^y{U}=O$Z<)^p|;yE@mH50C@u?37skEb~5|V9D|?afo~0( z&XOxorJJFuK@Nv!n=bNXP}?s#LeRS+}xGG4Av?5T}DPm*+Rjfl9HV-Z_t1Y zd$m1P0bL9DFl$i&oh~k#=N$&x0%P$XHsSByW$gfd`dUuzZ_>Ev^?(Qse8xOET;K2@ zsZJi_xEENMJfx%-9n}oqv~q1o`g`81c#Nsdu`(*Bk_WRWFsGQYhqRNW#hGfw2E33Z z(j`*hD7a0DkI>9bN-}hE8;;}Rum-j#6AgWhQUt|3 z5be%)A$*8=efe5+3R|vU0A;X8y)=TLV~3~+s`K!oe_>Dljau#5?WagkL=sJQ?|Hrq zH}mkWKx|ssmMBkPXAd$oTooQjiQ@aps&{kGmf=whU|3mMSu1Pn&d$z18>4S~U>F(! zs{joE@Q_g{QRx2tN7_K1D8zt|0{GbkMGOS=S^W}MAUr@8QUK0WNy(tfI>O)I|3njr zCH;~=pu$kyduC{EZVvt;K+e#?gUzcKcmaUHz*2pb3dC)10~Qz<69xS|&4}Cg1wl-s zr>E!Tt%NqI`aO`=Fo9h3^h?kWfm@=wj>Yvq22kh>DR1A-NJ*g}B>cItF%9wva1eO~ z1$#f58-eR@k99!uz^w%=II1rY3pO<~!2W%C=@9HjQll^SY)&XZ-Nt4eF6#X3O#I^5 zV&Y2u0zTu$_3O`u-n|J7>}Ct0jK~MbTHM~>Ujn2n|0|HE0Y`D4K53hre4MAr@{zj( znDfk}q`%;D19KF!3)4DSY@uC&2=#{UFfa0e3FHvyeC~iDCm}Vp!C_Vqm{3Ib3cb5* zA@3aLKkJuFba&fAtFv4e85*i6FHd8ok^yJPWL*Ajxy%6mjDy1gqI$X7c0FzeI)9_0 zabVJJBC1*9%@*IT)BQa-fH^RLAqHm$DTltLqoZ0_vPR9b?;@i zAX(3Ra=1lEI1JoAP_VE>z=@=sCK#cw2~DH0%cfTNZy+Tg-r>|gaOt2TAQl@pINO3! z2|aLXa`IIVd;!EvPiyBD-2|RYP|d-QehwxbF5{+SxGG49K=lBr$>;qG1^EJ#3x*3E z1PF}l*RF|q9x}&Bj0U;CEriazsAvnK369`89eD38DL8CUg;rm)w!_| zn)V)q*8dv2z)GaPDdgw}%o`RaCbh5=gQ(~n_{2dE1OfC676Dija1c-$uU)(L8tjEU zkene)T)-;%a%ej`G2sf0*ZhH$UkM5smG2`DK~fwn|IcIpN?1^F^K$ORuT zI?BhyBv&*JdFct5GA;Lbb3TI53UdodDlI-<3#5C`LmPd(wcBmW;~7cVC!KAWAw<#B zJQTDcDD*u3C;@AJC`3<=f^jra3FLCo73lEEX#+OWDHv3}Xsxj&1#jS61Q1}-Fxr&R zbn%!5$eR&yD<;I8cFz8pE*X7J~Djw`;0f z*6-S*WbD8MwNTbZKVBc2-l6esMafD6aST43Y!WF&nRsS_9#LQNZ?}$P9!u9o+Y_Zw z$(hZ`*(H1(>B5c1NBz?JnMIo`A=-X`W((_oUVvoLVLZ)jeh#{#{&v;70>kf)lJvTE4>T9MJ4y;un)jgu%9I#~+6%eg!_>n))d2I(#}D{CJ33Lr?qeYgYZ2-?wz z$Vh5&uR7RD={EoRA>IC!Qoi-Qu@-(5!iq^b8F=Mc=thCnfkX#}rRR{xz+-=RSQl7# zNy#h61lUl)JKycF1ujJ%?a;n3nvXzVj2G)2z-PcbgBS$HdN)^BaS#z8YFBzu!0`w& zNz<#p&)~Yi)>WikM0)GieJIRO+`ogfq%{Bsigk;}LB4)TDb$0OmKGpCLaI7Jy1N3Y zW@dzBWNV9yyufk6lBEfNQernzys^FQ_3w{^6$OIGtElu33_vJa!X@hJk{7YA1j%=? ztCKe=L4RDPTj5uF36DSDbQYPQ0cMi_JOZkZYK90HXrfkhX>C@aS7D9hZz>eSj*8wjO+7r zH@A84(F11+mpYhn{~Psy!6$p#zjcrTQbZj7Kh_Q$92DQ7p&>Pi^F#j|;#0MbSsGbL zbX?p`Folql+d$>G5eIi-%byD70V;7Xa@s?Hw{8H4;9B9r_;bK-^Z{I^FcRHH{NVZ+ z2Qg{7L1+(ul{2~tTiz=nm?iB=0vh5g8k%S-?UACZ9-_~HpBv4d&&9y-!Eh|LctNU; zB$MGo0A=)yybgQuhljt~6?4h3k4BvkKP{a|Ef%eC9>OrD*a(`=_QI*>8dCe!G@ZHP zUxNxw6xFfb{}_|?;+fO7S3;*TJbvH8 zThkpWwOOQF>zT|;3bdcSYLCC(Y)(o_0=t){W~^M!ipEN+7Dxb)?f^cf{_pu!P?4h;dw z7GzwT&JF)nQ_#LZq4;n!5y)Y*R3R{hrKF~Mg4qHbkpa=! zSkhob!bU(3104d@x2{eIHZg-4galDs`WmhI3_EY}`{GxBELaFkwgKvZJwR$$Vai(s z%NM*?_KoL7CM};MA|i&bcY}&2VcnMud_K^dAge@C@WFmySzCqz&?P_x0w$0vH3>?mAowc4QUm*dBB;eg=;-Je7-08M z*1jGUW^YFU3 z_~!`L%wMMG@xe7UHUCX^aJ&sZFtxzAq4>h4A_|h=d)@Zm8xoFL`fHE@gV6f8z+(sc z07i0zM}sA%oHdpELV&Rrt236xFZu%$(dhube{jCJRHfO?WQt$W{twP-lv3hvo0wIO zadl(EftX#s5jGDQ?EOeBvsH}=vW*+`15|@^^Yz$s16)Hi0~2MbB4Uc$^~njJGVw(- zpyMO*Fa9<)al8-kB<$rCAc$EH>nb-am5)(Vo+D~!3eLBWLwqAmvD38mR1sQ)_x;_A zFkFOy)V~@nPV|jekDKKKbefuoegqY<9XETxF%_)$03$Y(p&f-TMaMpnIY(6<70tIg z=vpf436`l>OttdgpkS5WD3x9}R!73A>g^%Hm3cR!(!W`C(Ji~bawOuMy4CKuK3m2{ z0Ck5(MLh|NE3igEGKQR>gu?uQ4eR?ZIpT!N?-Z*-D}*JSg@J4v6pVPj)68+_V6_`U!% zeN1%p5Hx&{@lhm!tcFtrjy&m`Kf_wc0&L66ON3lGZy_cjE0>tG7~9^3xxVstjnsoQ zX$O*(mR9_TJi3K4bsy}d&lD%|PG19H#vor)lR*8dfB$gfQL}N`=!X0>1RN6s1Gp%t z5ZHPG3PdlcA~Byu){fNw>%+L>O0N+5+w1+^-9XQ)K*bRL(Z8^6vtO<7Y>mFQQeAPI zkFC76_91o*AH$nWj{Xmb@7Oat-Q)vKGa%;HJU-XT;7eycSx!;nBaCNfwxDNI&iAU| zbKoZLLq`h_IF3&t3i5UJ=I&fpGKxh~f-!x$QQzJ4@2ck4j3V!+i*|e0<(H~Ase7Cx z9#CygQt{*t({jSHrXLGydNuK9MeS^=Y0`TRwsjWRY|5O8YlO&o=w0(R71+(%Yp@gMb@J$N` zG{jV7x)_Bhjc#4xzHHKnCIu;PlF*4wx-PH`v{cf`F%eWEzqgG({gi1ovf`?R~oYH#s${^3p4>PcrQxBNSjn z9kdFd)RANn7uFDZr33p9j}>hN+kMb)+=zl)D8$bnAM|f9KrROiSGr(k`}nxb8!8*v zg`k1^IBu7B+ZP0W3Ql@3XnpodWQ9hj72Fi>#Q69zaLM1jdsk3|J?6>lPAxE( zvub~oahx2s;olzq>LF%nZ4DstTX%OMSO>uadAi@r1%3yO#e?;}bioin4tm=HlqEWB z6bXLm=~Ur7jS|sm|Ej90V3ujXss`dJ$g*6_?n!GIP7CAxH~HSwf9XsgK%^~*C@4*7 z@+xwOWkP977Zv?02(I>Kdm<6C#)nF7!t}X)1ju#A;EbRwOZeDSGN4krOwJanj0L}NUwk1 zT|pL}+Zme?V*2vUNXZtb$Hr>HwmRsN!N>s^40L@O*b*Zq)?8lx3sibUGV32dOm291 zI0zG9;{&-KyjO4Vvq8IZ-kBk>=nD!75;bArgS{E~ASnD-%s>{_*N>sAKLe{Kq7F}? zCTP6cqXoOGV#r>XT&;bw4_bvIusQ*afn*KC4-h6zK3pL%y$ynlM@)nc}2$c}o~PD@o90@W8?;E>J;{AWZs6s5L@} zik-uT_>u_V=zmPozm`j)Tbba6Q-ebAax-+-ToVP|S)lSLRF94iV|+w$*{L#h9W$E# z^xjw#%BhdmM&qymV*1T5=wQ;=xcMYycmT(Pys{fS8b*?|@yDSC zr($Aaq9R#Y=7?jk8#P$Q06_rf#F{@LiUss3crd|4>m()RSI8m;F$7{4Q$~aiWNN3R zCXJ6eC7ZCt6gH2F@K1t28vME-Gy-%5Co3JpS)Y!r-vF?R;XE6H{u^{xzphnCbbF-Y z)2G$RE)zc3NC06+|1c6ZH8i;G8H0QJ&{M45aT#<>WGGLG3`{^^tL+X=5p%eJ)By?| zC7*RT>@0z%JdNKLA_?|F0k9z!pGKjOhV5i^@Z<13a2hl;G@PECKnHLo(>B?God(eO z70abpm9Llwyg|zd*P7ASuJP1+A&a8+XVqt3+-9^cY#Dz$5Ora?ujE7Mq*eBQxzn0j z@>Z?tIB0~FJqe~?mH(I@$w8PQzT8VH#EQ1o)wuq{G)WmtG7&2H*u?P_R!I?o*-EK2x61bvstAUPA8` zfqVvgcTF)e9u}FBey9+}J)oi)tDF)-@G2_P}re z^8uR+eV-Jztkv$chtqko|nRD(T*qPEW9TLb98n(z@m1{mPw zzXU(J)F?!+_zsQ2|JT!3M@1EGeGlE;Aq+!z36fGXbVzrj0)mtXs30xfEh5sb2%?lU z($Xm)2qK{c$l zn|2J{E9?nyCIhcLi=pUsE-hW0DOf>3lHd*s5YQ$gpqxRiQ*pfTKLJ4xyGGjMH-I$y z@6C$?gL>u4YcTjYCA5OOYG;R;lJXiDnJ|`WcjT5~E(0jZqS^Plz5Ob5PJ+TPt_uhZ zfz;;${D7$p%6#M}7dF$%V;Xw;OJyb@jhYF zaV85DbD(C@dL~9)N1FbIm}G)nii3zB-`SZ1*GXJGPC4I>ONQ=h@53&91SgL!Iy@sa zMv52{n;@66q{H0IupZ5|;nm%7%#m5>i|8`rNJ~R>)@jkJRlX344EQR7cd?M+G z#P7;Z+mQ6J;w$?mM~8%Zir}Xt@;N%%_i*)*?`cwIX7D_!jTuMy@RngJZAOOrS!2u9 z0#?2&(rpe~+59VR*65(Qvag62>YkJrvwi!p+(!DPqReyZw;XWQXAZ%!Zbk^2k}X)c zpbPT-_xHp^#<@QMwkYP{vMCr`Ktgx4ze<6)C`I6rc)bcPeNbUT2|a+74g&P~E#wt& zs{qP%5kCO?5{$yY ze?mo7CS{rN>PPuMxCfR@>oDc_uAm9mTxRyiQ11GZWh z!7cpU?vgY$tD?^Q_!j*=w51uSD5+?kggCkEIitJ~lC)th%f&9lqJ+SN49F!Fjt+{aP67AoIte zbd=ely5`(a$c=i<-)ax@=Lp~ndwYAwBqW&p#pk|=Y#DL>+aw#VG9u`}iUaA-M@?|b6DM|R$bWf54Ca(sWx5-82gfLtmkpEM-vyzii^_3rkK7L zDW4F)Qf{d&5KnPW%cPd(Yrn7gHlGmT5^x|`K!)t1b*SzOzxC4oWhte9G!|viA6i3{ z(8G^dQOu5ZkH-2$UXD3EzuIyEmzO#M5r2|`E(~eC^W}o+)`L*sA}<)@A6{N z<+&@8_}s=-SGnb4NZK}jGrnFxT(lCs;qz8^R49{mBHpn^xB^ptry0*LuLSADQ;B}{ z!J-j~ZM>3l9GzN-BBPR^c4~EfZM36>L=;{Leo=~!n$}6R3PlX)BY(Tl-3Vv*d7WmK z^2JPy=C`#K`k0F@wT{G-T6Min=WD7-7OmrsbmVN638UJb(f_YOAr6cViD$A?uR)!N z?dwfyr)E>D=#r5Nxh2sJM>2+P=fn_AP@T~FGIm-7UMdi`gOMiA}1f+j5I7dae*B&g!2y!iDs^ma@zz$rekMZTt$kC2vylj zEirPe&^oz(Vl1LEIy^izuD7HqF4Opi&Giz5l-OKXq;)x@qc)nb(^S1(V@fbZ6k7Ut z67OI3V-;c38*mDXxy`tF&r&Jb84@#Xe$Wj}LL7jHpyP003cA!rphQVb# zQr*P&{a;|wh+pz+Bu^l>8_#dUe%a`Zk}DLoiCxNt$~kj*j59Y$0MU7Xp^oy1Lk@De2s23bM>;7*O$@e*96Yvj zVdvuauXou*>mGJSnz5K_@6vaU_vU1XDB+7;%|bOG96oP~J0pd33vQ!|NjL>XTo|{` zS662GE&NTt-ZYRG#$&EAad0?x)k&07PPvQky7x!hl|!#y+HBHdabDeXQuRl2R?cNA zIrYRYMluyteMre{FT2!)daXp;bfM%7xsj_D-+ThLBxwbo=(A1d`TgX>`ni>xtMUPq z&w>^xj#e6utlnGQ|LQl^UgLix8-TtfgrT+nWt!VWQZ4MlvBet2DctaHEfAy87T7sx zAH#`7;`wIJp0t*Nc>s%TJ6Hm-T{|$yQe61o`tAw9(5$wNhE#5k?|Y z0ih)+?)te*n;wX>GQm~XeXPz$-8~Vd`tFw~tTVp|pM(yCRfu47VgJ!<9N`>1O{>lz zlx5;H${iE)6^w0PdTfWzxXizv$GU)5dHD%`Kv1^XG@VRHI7RuUe6XQE;$1b)pxIGd zEEiR-FK(quBTKhFjrbE)!yH3ofxc>lgO>H~%ucY0p^S9BF$u1jOMmLUzOHCgR&V7o z2i5NN4P^&GdOF(w9yZ|gh0$D0`E$-F0OjyL>ac2ZTU9_1A*huG%+>8|UEeV-S@9356o zsHoH<7l*_5)ej;1E@wQ3jd`2K&dg&#Cx@)OIz!7!vm@g~mtb18S26w$9=CMo7 zhoOX08iT@TW~PX*Q?9tXv87B5ClgNX;ySUB^ImNRm+aq0?eHaRFuGXYdwQ+0XVR9Q zEQ8n-%W~$L-1~Y3uFjR#*^nN2s@l@u{sQ?S&dFP9i zCvjAC+zQyqH;>(Wa2T0XEnvE3HndaL6cLT@lBSzNerF8{oy%V9FnQ_GP55Y(!;g%aUvnpPfL}@xA$w~?QD|@8OmuRK|2|b- zT5m*+vn--vtjo66MM2|>j5<-5$r%BQkB*Pa-rdnR^-Ru}{Ja&dTf zdG`U8Y?SNJpHq$K&5bFOU91+OL5yhz?G~Dq5pgVD-Nx%@8)-5qo~dsA7~b)5lu&Ky za!%c+1=nIje~Vkp^5WKx)pUpM)zKQ!?7miyznbB#y(~wjW-~HT^|;zdGcK5(YMRiA z4d=<2E7tq|lfcmuHLJ*A>kkX{4^r)`^kI6gzK!|~K2dRX@-|s!}4*)>P+?SIs90brL zgB+pUfTE+=3ZjeZY=X|ujwnb;foqa6-4X+o;QfQok`RFL@ztE&{S_5@TH3$o{r+>d zN0kP_JI@}mL6F&m)SS)FeikpTNHBqe$>9@Vc2D8YfN1<5L>F^M9=KV0Yk99dB#_OX z){M(?_xr&7qDgvr2*o#f`3aSc5B)bwzEu&8?Ph7k_2D+I?f0^dm~pEV?Z%)nZ^9<2 zHZ(R9xpL0ixok!{B~y+bHS)xW(Q(d-SuCF_FO?b#E|1`pH$z;#BM*#o_T*_2IHl-_ zE6o&`0(dlccS~mkAEas z_r?j-(qqj4AUr((v+CvLWe-s}+#n;U1>tfmZ-MKrTdfB}c{-zTy#C-DpV`>dq@OE+ zX?@;yFjW2gt@|&|p4!(di__B?q=qCQWS0p#*nqI@Lw7Snl7N+;r_J$Z zPE6R=sq!7w(GN#;Ruaz=kE_o$E9hQW5SBR^KAU3ajoA#9<(X~Y=DC-v{Gjut_jj8U zw|n_WUS7)svD!6I%}qZ=36KQs|N2; z-5aD&Xu%r~cl>HX)TNQVy=s(VcUe;M(Fk`Z#02md6#Q-958elR3K-e$fzk_*OrbR} zCawS*v32#R8CU?zpm5M~0FE=R4X{MuuP=sQ-~L{_1y)MQQz{2=E?!v)ge+QXAhw_G z_~yv?I04}Xqd&MyOy{Rf_WkYyJprTF0%-36$TG48lmlyga#F%`v621ki^dsv0pX8> zCi_FPpYStKn9bKacO3VL;^X5N-2c`LpIPzlAuV|rFO!RDPG9Q&0&y?^-&s1rl4DO2y&n#55|B{k3GfZ9Uq9gpFP}moxi`Jv$ z`=}B{Dbr7@-SCmBn8P=@Q8Zaw(BnG7nI)5nieG*Ga%`=(&PGvMuB<`xE0_78@n`8c zuB`IGxc<6zEre!rzRblbJu&XwYLeWNM&1rF^&jSCQq0xT7jQ}53s2(9B5H$8NJVUW zaZ+lkWzd=Cj7={&QFF>Ij~NAir636Vzf*r?KRcp(s>X9Bv!9i?(M?h{q_R(OXtObC(ar$b1-EU zJUGxwgI>YrGb1bO-@Thkf8Ia*m)-(HfBTL=i)iS?hYuGvnHgZ~>zbPvs0lZxUVdCJ z4q3*Y9>cf~8d`6$@P2N{>SN+|Q3j zBIEI|g-g{#n3r^BXNAZH2VxB<^ei|{N8)=3zlXBEjdqIv80s3VVtA`jOi=QLa6r){ zZ$4Ef(G(|l{5u&QXM0sdW8H@dvV&pegElRFuI*BrW8EK2@%=xm3L6h@m>ghkU=hg>sqX1(|Wz5{Y`tSE^ za2i3v)wLrW_Tx^dxeb8y=HMZ&eDLl8P@=W9^&;p1g0tZEH8nPtlrVzc32rc85{h@e zTm!zSN?Haua6o_|cJIfCNAZlqaYJ=dJpH+rS(yWYzL4h) z28pZwLc<~mfztSG+_b=?ZZUWFd)|Xi?5R!l1cjeP-bgGWwuiMb0`CufQQzc#x-vH6 zQ(9Um)mJC*P+@p%ZVVJ(Rk~BOfFTbPTNtR0il8gUF+tiX2pMOzl-}c!(@h#K@XnHZ zL6nT~)vyUR!*ODZ8WmN!#jkEe^1EFZKUeY#^;%u)H)enqPi$X4*vvG)8xXL2-V18P zRmkr<{1<`<_~7#nKv%dL_CRqQXLtPFy!E`j35;$TE*JF%6lVf;_wL`9my zYDq+Nbo8%+X%Mmk7(Hwko%#_TM=*-8Ff)T5GUF%&GLDv)m%&&GVw;megAfUz{Q;IL zlLlK@Ha8fwAo`&n^eJzD^s~TknMujW9K$mCRsW9dB25ZjQhfyX^x}H|U;V1qx@nwR zVT=*>*VmUAOeE#h&gP;+aY$vj=4d5tawi{nfBzfMg>_SrD2%zFagoPUG0>+>;Yo3E z(ogBbj1FAQal{=P0b7)+R5)LDqO$Q=VKgIR*B6&%5>Le&-8!rB693xru>aR$6zAUK zX|&r(ZrW_`w-WZBoRCt!XjM=wGDpgmBooGm+vz76?)P0HH}ca$wt|-C<{-QNc*-%AK(1N4`Ew>PEY?q#2F4m1wg@9l5^~i1csrcZBaAi^-T+i z+4P4k;vUvLKfeaM3B!v;d|{IU+WnTBThPZa0*G%oU5^*7at8q@yk6pc14MB`bvnti zz8wS*B9L~~O8jP5g-JxN?#u~?r!;G3QBN{x`J$4<>tmBXr({q@slQR}`_Vybc+l&> zGWvv7xlX`TFYlV0yoqGXOsY$rS&d;&5JBh9ry`^cYjXTab4$-V9P3hWA1Q>$a+~Xs+5S6#73(ocd+Kqxy6rHBJyw zTj7=0K7g$195E1dy#8akIo?*v!O8VJ-#8@i(OKR&IvNG%|SxH6WSJM{iBk@Tt zyQRWQ;($7cmDqU)jum4yxGCGURPG~ z-zR!g1e6u%#K0Hbn8sii*mX@r0mzn+KTE6bN3f5mTf#LxS%Ezs?tcF)v=eGo=Uo zZwx;ch%X+?_^i*p{rw6!h?I?{C3vHb*Tc0a22fu3&zPFap7<3d+L-7uNZWv}Yr6J2 zcqx_KCb`bid_f?(5U&WcrikE&2R}zC6n{Y^(e9UbI#9jK1J-Er9zXtivk$6=d+dH<;Wp*Io0?X!E42>0BnOaVzjpP zAF+Yn+=wLW9)rc?>y_F^K_0xd8FnnqUj~~ahJ{Pcq$bob%E0n7e#(2i0s z2|ztQ{qqNCAK1QVPqp$hun@3qtGGzYiX3)h|wq}J`FHj>tJ?`bb z2(1Nq6bK}s6~Z1j7=~4S_s*S>$5-}Y2s{7&Na?|+#4FzxUkM(f{?kX&oV56rRAe?z zr&;&rw?$=sPOB!R{u-lz8=kE7LCVNWlWGAc#@v zQf}wuTx(=wqT^z19V1~_8-%zoER26J+mpF%r=5S}%fqIl=&ly&NU8Rw$}XT83o?44 zwKq^tqhan#btf3pH0hf}dWjWzrBSB&uI_wlC5h*4i3&RPkJ3Rp_*onlwD~sJx_Or? zYir3mfig6`AW(tQXg{2_4x3{fD^UCcucp!kVTgkRa)t;V+c%&_Ob*_2zUV3;qo@sx z>ah2TBFYS&zIB}_0xRs7?N9lzj#t6dF2&BussN$Q5cL6k%Q;ljWq85S#oh_iQVZn9 z=~PEu%s5Z~Zt!+|j}rZLczDr}Lv`WD`Lervv8w^2(+Z)qFctheey22Re^r=|?~R8K z+(@sGpO0bCe7I9t4ozb%q-&f&ot8zMH9k1m%zg*y=c~a-ws5;Iw$rhIx5isTOBdsl z_!`JRvxjic6&-6fDEk8uYn*Uf#}6 z^-JTYbz=$lp~~pDE){Hx-UtH|jY^oxNuyBU)~D{8*Q6Bh z7E*D(=qw_W`L>BM`LXrr=?BR#RhJCeFm9&n*|aL1Or^#9t)H+Xy5pR*>7CH)Z$_OK z;`Re2${0qAT~(KSoP#?pRTcY%Z{{xQAn<8)LstwIWpcKL zNx!h(nj(_?tD+#bkIIoD6`5ugQFzS)nz;2P)mO)FGKh)wN6kl=#@V4?s*-G}PX&%b zBS-@JQ?e8>E31YVk<2G&NMAVpuIo{7BfgJmv>#@j=ZR%Cu_eSWz3@FOedvC9&zvVW^5jeAq)L^nb_fHTy`A1O{hGB^UTT`=PKdC1ZM;3s7Dp` zGOkoR%cmYYMWSQj;Ts={k}&Q!=989rwu%pbCs}*(^Zn;IJ`Z!8wRSHZj%}kS(@f(Z z3smjT=#*Jk7(7rwGDHPEHIunv8D%BiO8ixsGO^mGwrqKPJl;9-oq8;{hY`a&jqiU^ zrHnB}4Z0`Ttt{?7fxn_De=@(S>cm_6`FjG979nXAxuk~j@n+e`RMj>`zWm|6&qQI{K#?g@$= z1_P?g+tkS)PO00S|A$42FhZA-7k=%a+m^wEt&OkCjl5h*>RNLznnRJoK!-jV?{=y8Q*Wz8I8{8Er{JsDfiUl0XCq-X*y0!NrBbxhN)z^YTNX;E{k^{) zc+Y>MJIZHpWg>=7R%^hHQe@Z3OF|imkfui5QOu|695m3c3g$CMUE6?`_dmxu(e!g` zRaF{pey!Wo*HsS>==B;ZQtg~E-6l8wH1QDmGC!3R%KZHHIPrlS=a`%z7DAU?NJMus zNoz@UidRJPo1#)!O^bAuBrATs%8G($ErA>&2pvbIM?Szf%~~GUD{V1bp%)&eQP6vc zFVNuI!uPEE1vbssOYYpN!95 zAIUDgE;y{jW^4H$TB;Q3xRXVjncr7W)iPa#%Y&}Id-{EhrjHOqrXSw3w2a+ zH3fi`7&`mwH#TE4?#6N~MNNY)`aj1x>CUY1)gjBaGJ&)c?-rEoH8zfCKIEaJ3BB=D zlu=ZI&NAdl5^6=M&+^bop0C$mqmbUn%f^{JBXJzTc;7DT#I^z^54`{1~q8h zi}{3-cB%T!nC~rY_80L7zL1kxZ+LIB(&sMV+8v`CFmRU3EPBJEaFt$TkeFMPCrWD+!x+{mP^znGBsicqrkjF4HFamOK1F4X8Am=VG48f$ zp=bvG`u8UfhK@o%#rnL*e^2H1fGvfEph#1)h>_Xul0NxeD}`*soC${y3@??X zZkKT5Ui;BIO{0alHcKd1!CpUkdGSVsE3VvE{8XKY z)n|-dS1Z}RvMR)Emm1@&MWRYfjIl5R1V{nB1m1V8c4NHn-FcQwY11^PG_hIOyc@Ml z=qD`7*qf(Q+}@i!N*{2Ze~v>*U-^HhDE5!SzhAOvr(81(0f!bwA6=*F5dQxF2bIkF literal 0 HcmV?d00001 diff --git a/src/client/response/playlist.rs b/src/client/response/playlist.rs index e0fe342..fbc76b4 100644 --- a/src/client/response/playlist.rs +++ b/src/client/response/playlist.rs @@ -29,6 +29,7 @@ pub(crate) struct ItemSection { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct PlaylistVideoListRenderer { + #[serde(alias = "richGridRenderer")] pub playlist_video_list_renderer: YouTubeListRenderer, } diff --git a/tests/youtube.rs b/tests/youtube.rs index c1a86dd..5835b1d 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2241,14 +2241,10 @@ fn music_genre(#[case] id: &str, #[case] name: &str, rp: RustyPipe, unlocalized: assert!(!playlist.thumbnail.is_empty(), "got no cover"); if !playlist.from_ytm { - assert!( - playlist.channel.is_some(), - "pl: {}, got no channel", - playlist.id - ); - let channel = playlist.channel.as_ref().unwrap(); - validate::channel_id(&channel.id).unwrap(); - assert!(!channel.name.is_empty()); + if let Some(channel) = playlist.channel.as_ref() { + validate::channel_id(&channel.id).unwrap(); + assert!(!channel.name.is_empty()); + } } else { assert!(playlist.channel.is_none()); } From 8ea69d54535e64d2595698943a5d4fd8ac5675cd Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 3 Jul 2023 16:57:23 +0200 Subject: [PATCH 017/459] fix!: remove music playlist search without filter --- cli/src/main.rs | 10 ++------- codegen/src/download_testfiles.rs | 2 +- src/client/music_search.rs | 37 +++++++------------------------ tests/youtube.rs | 35 +++++++++-------------------- 4 files changed, 22 insertions(+), 62 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 4cd1142..c96cd98 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -173,7 +173,6 @@ enum MusicSearchCategory { Videos, Artists, Albums, - Playlists, PlaylistsYtm, PlaylistsCommunity, } @@ -676,15 +675,10 @@ async fn main() { res.items.extend_limit(rp.query(), limit).await.unwrap(); print_data(&res, format, pretty); } - Some(MusicSearchCategory::Playlists) => { - let mut res = rp.query().music_search_playlists(&query).await.unwrap(); - res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); - } Some(MusicSearchCategory::PlaylistsYtm) => { let mut res = rp .query() - .music_search_playlists_filter(&query, false) + .music_search_playlists(&query, false) .await .unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); @@ -693,7 +687,7 @@ async fn main() { Some(MusicSearchCategory::PlaylistsCommunity) => { let mut res = rp .query() - .music_search_playlists_filter(&query, true) + .music_search_playlists(&query, true) .await .unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 0d1357f..147db3e 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -619,7 +619,7 @@ async fn music_search_playlists() { let rp = rp_testfile(&json_path); rp.query() - .music_search_playlists_filter("pop", community) + .music_search_playlists("pop", community) .await .unwrap(); } diff --git a/src/client/music_search.rs b/src/client/music_search.rs index 3e2389d..f844cf9 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -40,8 +40,6 @@ enum Params { Albums, #[serde(rename = "EgWKAQIgAWoMEAMQBBAJEA4QChAF")] Artists, - #[serde(rename = "EgWKAQIoAWoMEAMQBBAJEA4QChAF")] - Playlists, #[serde(rename = "EgeKAQQoADgBagwQAxAEEAkQDhAKEAU%3D")] YtmPlaylists, #[serde(rename = "EgeKAQQoAEABagwQAxAEEAkQDhAKEAU%3D")] @@ -152,44 +150,25 @@ impl RustyPipeQuery { ) .await } - /// Search YouTube Music playlists + /// + /// Playlists are filtered whether they are created by users + /// (`community=true`) or by YouTube Music (`community=false`) pub async fn music_search_playlists>( &self, query: S, - ) -> Result, Error> { - self._music_search_playlists(query, Params::Playlists).await - } - - /// Search YouTube Music playlists that were created by users - /// (`community=true`) or by YouTube Music (`community=false`) - pub async fn music_search_playlists_filter>( - &self, - query: S, community: bool, - ) -> Result, Error> { - self._music_search_playlists( - query, - if community { - Params::CommunityPlaylists - } else { - Params::YtmPlaylists - }, - ) - .await - } - - async fn _music_search_playlists>( - &self, - query: S, - params: Params, ) -> Result, Error> { let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, query, - params: Some(params), + params: Some(if community { + Params::CommunityPlaylists + } else { + Params::YtmPlaylists + }), }; self.execute_request::( diff --git a/tests/youtube.rs b/tests/youtube.rs index 5835b1d..121870b 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1808,18 +1808,12 @@ fn music_search_artists_cont(rp: RustyPipe) { } #[rstest] -#[case::ytm(false)] -#[case::default(true)] -fn music_search_playlists(#[case] with_community: bool, rp: RustyPipe, unlocalized: bool) { - let res = if with_community { - tokio_test::block_on(rp.query().music_search_playlists("today's rock hits")).unwrap() - } else { - tokio_test::block_on( - rp.query() - .music_search_playlists_filter("today's rock hits", false), - ) - .unwrap() - }; +fn music_search_playlists(rp: RustyPipe, unlocalized: bool) { + let res = tokio_test::block_on( + rp.query() + .music_search_playlists("today's rock hits", false), + ) + .unwrap(); assert_eq!(res.corrected_query, None); let playlist = res @@ -1837,24 +1831,17 @@ fn music_search_playlists(#[case] with_community: bool, rp: RustyPipe, unlocaliz assert_eq!(playlist.channel, None); assert!(playlist.from_ytm); - if with_community { - assert!( - res.items.items.iter().any(|p| !p.from_ytm), - "no community items found" - ) - } else { - assert!( - res.items.items.iter().all(|p| p.from_ytm), - "community items found" - ) - } + assert!( + res.items.items.iter().all(|p| p.from_ytm), + "community items found" + ) } #[rstest] fn music_search_playlists_community(rp: RustyPipe) { let res = tokio_test::block_on( rp.query() - .music_search_playlists_filter("Best Pop Music Videos - Top Pop Hits Playlist", true), + .music_search_playlists("Best Pop Music Videos - Top Pop Hits Playlist", true), ) .unwrap(); From b18698604b3cab7bae52137d4f55d6faa4bf57d7 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 4 Jul 2023 12:46:19 +0200 Subject: [PATCH 018/459] add item types enum --- codegen/Cargo.toml | 5 ++++- codegen/src/collect_playlist_dates.rs | 3 ++- codegen/src/model.rs | 18 ++++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/codegen/Cargo.toml b/codegen/Cargo.toml index 6f48494..e3bfff8 100644 --- a/codegen/Cargo.toml +++ b/codegen/Cargo.toml @@ -11,7 +11,9 @@ tokio = { version = "1.20.0", features = ["macros", "rt-multi-thread"] } futures = "0.3.21" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.82" -serde_with = { version = "3.0.0", default-features = false, features = ["macros"] } +serde_with = { version = "3.0.0", default-features = false, features = [ + "macros", +] } anyhow = "1.0" log = "0.4.17" env_logger = "0.10.0" @@ -24,3 +26,4 @@ num_enum = "0.6.1" path_macro = "1.0.0" intl_pluralrules = "7.0.2" unic-langid = "0.9.1" +ordered_hash_map = { version = "0.2.0", features = ["serde"] } diff --git a/codegen/src/collect_playlist_dates.rs b/codegen/src/collect_playlist_dates.rs index 4a87d36..21cce76 100644 --- a/codegen/src/collect_playlist_dates.rs +++ b/codegen/src/collect_playlist_dates.rs @@ -6,6 +6,7 @@ use std::{ }; use futures::{stream, StreamExt}; +use ordered_hash_map::OrderedHashMap; use path_macro::path; use rustypipe::{ client::RustyPipe, @@ -170,7 +171,7 @@ pub fn write_samples_to_dict() { dict_entry.months = BTreeMap::new(); if collect_nd_tokens { - dict_entry.timeago_nd_tokens = BTreeMap::new(); + dict_entry.timeago_nd_tokens = OrderedHashMap::new(); } for datestr_table in &datestr_tables { diff --git a/codegen/src/model.rs b/codegen/src/model.rs index a5f9e11..f7599cf 100644 --- a/codegen/src/model.rs +++ b/codegen/src/model.rs @@ -1,5 +1,6 @@ use std::collections::BTreeMap; +use ordered_hash_map::OrderedHashMap; use rustypipe::{client::YTContext, model::AlbumType, param::Language}; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DefaultOnError, VecSkipError}; @@ -18,7 +19,7 @@ pub struct DictEntry { /// /// Identifiers: `Y`(ear), `M`(month), `W`(eek), `D`(ay), /// `h`(our), `m`(inute), `s`(econd) - pub timeago_tokens: BTreeMap, + pub timeago_tokens: OrderedHashMap, /// Order in which to parse numeric date components. Formatted as /// a string of date identifiers (Y, M, D). /// @@ -34,7 +35,7 @@ pub struct DictEntry { /// Tokens for parsing date strings with no digits (e.g. Today, Tomorrow) /// /// Format: Parsed token -> \[Quantity\] Identifier - pub timeago_nd_tokens: BTreeMap, + pub timeago_nd_tokens: OrderedHashMap, /// Are commas (instead of points) used as decimal separators? pub comma_decimal: bool, /// Tokens for parsing decimal prefixes (K, M, B, ...) @@ -49,6 +50,10 @@ pub struct DictEntry { /// /// Format: Parsed text -> Album type pub album_types: BTreeMap, + /// Names of item types (Song, Video, Artist, Playlist) + /// + /// Format: Parsed text -> Item type + pub item_types: BTreeMap, } /// Parsed TimeAgo string, contains amount and time unit. @@ -99,6 +104,15 @@ impl TimeUnit { } } +#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum ExtItemType { + Track, + Video, + Episode, + Playlist, + Artist, +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct QBrowse<'a> { From 375c08d11b5ce9c14c875089d2979e0efccf170a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 4 Jul 2023 12:47:05 +0200 Subject: [PATCH 019/459] fix: playlist id regex --- src/util/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/mod.rs b/src/util/mod.rs index f148c6f..1a261d7 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -26,7 +26,7 @@ pub static VIDEO_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^[A-Za-z0-9_- pub static CHANNEL_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^UC[A-Za-z0-9_-]{22}$").unwrap()); pub static PLAYLIST_ID_REGEX: Lazy = - Lazy::new(|| Regex::new(r"^(?:PL|RD|OLAK|UU)[A-Za-z0-9_-]{16,50}$").unwrap()); + Lazy::new(|| Regex::new(r"^(?:PL|RD|OLAK|UU)[A-Za-z0-9_-]{5,50}$").unwrap()); pub static ALBUM_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^MPREb_[A-Za-z0-9_-]{11}$").unwrap()); pub static VANITY_PATH_REGEX: Lazy = Lazy::new(|| { From 1d94d0241b0793d3322cbf56dd1fa1262172d68d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 22 Jul 2023 16:11:56 +0200 Subject: [PATCH 020/459] tests: fix tests --- src/client/response/music_item.rs | 2 +- tests/youtube.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index d695213..1b53b27 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -579,7 +579,7 @@ impl MusicListMapper { } // Is it a podcast episode? else if subtitle_parts.len() <= 3 && c3.is_some() { - (subtitle_parts.rev().next(), None, None) + (subtitle_parts.next_back(), None, None) } else { // Skip first part (track type) if subtitle_parts.len() > 3 diff --git a/tests/youtube.rs b/tests/youtube.rs index 121870b..f3c5c96 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1719,7 +1719,7 @@ async fn music_search_episode() { "UC_MxOdawj_BStPs4CKBYD0Q", 2020, AlbumType::Single, - true + false )] #[case::ep( "waldbrand", @@ -1732,7 +1732,7 @@ async fn music_search_episode() { false )] #[case::album( - "märchen enden gut", + "märchen enden", "Märchen enden gut", "MPREb_nlBWQROfvjo", "Oonagh", From 68926b9ca26928fdfcac6fa8e1c3673b701a9070 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 22 Jul 2023 16:36:20 +0200 Subject: [PATCH 021/459] refactor: split music item mapping into multiple fns --- src/client/response/music_item.rs | 845 +++++++++++++++--------------- src/serializer/text.rs | 6 +- src/util/mod.rs | 8 +- 3 files changed, 423 insertions(+), 436 deletions(-) diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 1b53b27..675b042 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -482,436 +482,13 @@ impl MusicListMapper { } } + /// Map a MusicResponseItem (list item or tile) fn map_item(&mut self, item: MusicResponseItem) -> Result, String> { match item { // List item - MusicResponseItem::MusicResponsiveListItemRenderer(item) => { - let mut columns = item.flex_columns.into_iter(); - let c1 = columns.next(); - let c2 = columns.next(); - let c3 = columns.next(); - - let title = c1.as_ref().map(|col| col.renderer.text.to_string()); - - let first_tn = item - .thumbnail - .music_thumbnail_renderer - .thumbnail - .thumbnails - .first(); - - let pt_id = item - .navigation_endpoint - .and_then(NavigationEndpoint::music_page) - .or_else(|| { - c1.and_then(|c1| { - c1.renderer.text.0.into_iter().next().and_then(|t| match t { - crate::serializer::text::TextComponent::Video { - video_id, - is_video, - .. - } => Some((MusicPageType::Track { is_video }, video_id)), - crate::serializer::text::TextComponent::Browse { - page_type, - browse_id, - .. - } => Some((page_type.into(), browse_id)), - _ => None, - }) - }) - }) - .or_else(|| { - item.playlist_item_data.map(|d| { - ( - MusicPageType::Track { - is_video: self.album.is_none() - && !first_tn - .map(|tn| tn.height == tn.width) - .unwrap_or_default(), - }, - d.video_id, - ) - }) - }) - .or_else(|| { - first_tn.and_then(|tn| { - util::video_id_from_thumbnail_url(&tn.url).map(|id| { - ( - MusicPageType::Track { - is_video: self.album.is_none() && tn.width != tn.height, - }, - id, - ) - }) - }) - }); - - match pt_id { - // Track - Some((MusicPageType::Track { is_video }, id)) => { - let title = - title.ok_or_else(|| format!("track {id}: could not get title"))?; - - let (artists_p, album_p, duration_p) = match item.flex_column_display_style - { - // Search result - FlexColumnDisplayStyle::TwoLines => { - // Is this a related track? - if !is_video && item.item_height == ItemHeight::Compact { - ( - c2.map(TextComponents::from), - c3.map(TextComponents::from), - None, - ) - } else { - let mut subtitle_parts = c2 - .ok_or_else(|| { - format!("track {id}: could not get subtitle") - })? - .renderer - .text - .split(util::DOT_SEPARATOR) - .into_iter(); - - // Is this a related video? - if item.item_height == ItemHeight::Compact { - (subtitle_parts.next(), subtitle_parts.next(), None) - } - // Is it a podcast episode? - else if subtitle_parts.len() <= 3 && c3.is_some() { - (subtitle_parts.next_back(), None, None) - } else { - // Skip first part (track type) - if subtitle_parts.len() > 3 - || (is_video && subtitle_parts.len() == 2) - { - subtitle_parts.next(); - } - - ( - subtitle_parts.next(), - subtitle_parts.next(), - subtitle_parts.next(), - ) - } - } - } - // Playlist item - FlexColumnDisplayStyle::Default => ( - c2.map(TextComponents::from), - c3.map(TextComponents::from), - item.fixed_columns - .into_iter() - .next() - .map(TextComponents::from), - ), - }; - - let duration = - duration_p.and_then(|p| util::parse_video_length(p.first_str())); - - let (album, view_count) = match (item.flex_column_display_style, is_video) { - // The album field contains the view count for search videos - (FlexColumnDisplayStyle::TwoLines, true) => ( - None, - album_p.and_then(|p| { - util::parse_large_numstr_or_warn( - p.first_str(), - self.lang, - &mut self.warnings, - ) - }), - ), - (_, false) => ( - album_p.and_then(|p| { - p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok()) - }), - None, - ), - (FlexColumnDisplayStyle::Default, true) => (None, None), - }; - let album = album.or_else(|| self.album.clone()); - - let (mut artists, by_va) = map_artists(artists_p); - - // Extract artist id from dropdown menu - let artist_id = map_artist_id_fallback(item.menu, artists.first()); - - // Fall back to the artist given when constructing the mapper. - // This is used for extracting artist pages. - // On some albums, the artist name of the tracks is not given but different - // from the album artist. In this case dont copy the album artist. - if let Some((fb_artists, _)) = &self.artists { - if artists.is_empty() - && (self.artist_page - || artist_id.is_none() - || fb_artists.iter().any(|fb_id| { - fb_id - .id - .as_deref() - .map(|aid| artist_id.as_deref() == Some(aid)) - .unwrap_or_default() - })) - { - artists = fb_artists.clone(); - } - } - - let track_nr = item.index.and_then(|txt| util::parse_numeric(&txt).ok()); - - self.items.push(MusicItem::Track(TrackItem { - id, - name: title, - duration, - cover: item.thumbnail.into(), - artists, - artist_id, - album, - view_count, - is_video, - track_nr, - by_va, - })); - Ok(Some(MusicItemType::Track)) - } - // Artist / Album / Playlist - Some((page_type, id)) => { - let mut subtitle_parts = c2 - .ok_or_else(|| "could not get subtitle".to_owned())? - .renderer - .text - .split(util::DOT_SEPARATOR) - .into_iter(); - - let title = - title.ok_or_else(|| format!("track {id}: could not get title"))?; - - let subtitle_p1 = subtitle_parts.next(); - let subtitle_p2 = subtitle_parts.next(); - let subtitle_p3 = subtitle_parts.next(); - - match page_type { - MusicPageType::Artist => { - let subscriber_count = subtitle_p2.and_then(|p| { - util::parse_large_numstr_or_warn( - p.first_str(), - self.lang, - &mut self.warnings, - ) - }); - - self.items.push(MusicItem::Artist(ArtistItem { - id, - name: title, - avatar: item.thumbnail.into(), - subscriber_count, - })); - Ok(Some(MusicItemType::Artist)) - } - MusicPageType::Album => { - let album_type = subtitle_p1 - .map(|st| map_album_type(st.first_str(), self.lang)) - .unwrap_or_default(); - - let (artists, by_va) = map_artists(subtitle_p2); - - let artist_id = map_artist_id_fallback(item.menu, artists.first()); - - let year = subtitle_p3 - .and_then(|st| util::parse_numeric(st.first_str()).ok()); - - self.items.push(MusicItem::Album(AlbumItem { - id, - name: title, - cover: item.thumbnail.into(), - artists, - artist_id, - album_type, - year, - by_va, - })); - Ok(Some(MusicItemType::Album)) - } - MusicPageType::Playlist => { - // Part 1 may be the "Playlist" label - let (channel_p, tcount_p) = match subtitle_p3 { - Some(_) => (subtitle_p2, subtitle_p3), - None => (subtitle_p1, subtitle_p2), - }; - - let from_ytm = channel_p - .as_ref() - .and_then(|p| p.0.first()) - .map(util::is_ytm) - .unwrap_or_default(); - let channel = channel_p.and_then(|p| { - p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok()) - }); - let track_count = tcount_p - .filter(|_| from_ytm) - .and_then(|p| util::parse_numeric(p.first_str()).ok()); - - self.items.push(MusicItem::Playlist(MusicPlaylistItem { - id, - name: title, - thumbnail: item.thumbnail.into(), - channel, - track_count, - from_ytm, - })); - Ok(Some(MusicItemType::Playlist)) - } - MusicPageType::None => { - // There may be broken YT channels from the artist search. They can be skipped. - Ok(None) - } - // Tracks were already handled above - MusicPageType::Track { .. } => unreachable!(), - MusicPageType::Unknown => { - self.has_unknown = true; - Ok(None) - } - } - } - None => { - if item.music_item_renderer_display_policy == DisplayPolicy::GreyOut { - Ok(None) - } else { - Err("could not determine item type".to_owned()) - } - } - } - } + MusicResponseItem::MusicResponsiveListItemRenderer(item) => self.map_list_item(item), // Tile - MusicResponseItem::MusicTwoRowItemRenderer(item) => { - let mut subtitle_parts = item.subtitle.split(util::DOT_SEPARATOR).into_iter(); - let subtitle_p1 = subtitle_parts.next(); - let subtitle_p2 = subtitle_parts.next(); - - match item.navigation_endpoint.music_page() { - Some((page_type, id)) => match page_type { - MusicPageType::Track { is_video } => { - let (artists, by_va) = map_artists(subtitle_p1); - - self.items.push(MusicItem::Track(TrackItem { - id, - name: item.title, - duration: None, - cover: item.thumbnail_renderer.into(), - artist_id: artists.first().and_then(|a| a.id.clone()), - artists, - album: None, - view_count: subtitle_p2.and_then(|c| { - util::parse_large_numstr_or_warn( - c.first_str(), - self.lang, - &mut self.warnings, - ) - }), - is_video, - track_nr: None, - by_va, - })); - Ok(Some(MusicItemType::Track)) - } - MusicPageType::Artist => { - let subscriber_count = subtitle_p1.and_then(|p| { - util::parse_large_numstr_or_warn( - p.first_str(), - self.lang, - &mut self.warnings, - ) - }); - - self.items.push(MusicItem::Artist(ArtistItem { - id, - name: item.title, - avatar: item.thumbnail_renderer.into(), - subscriber_count, - })); - Ok(Some(MusicItemType::Artist)) - } - MusicPageType::Album => { - let mut year = None; - let mut album_type = AlbumType::Single; - - let (artists, by_va) = - match (subtitle_p1, subtitle_p2, &self.artists, self.artist_page) { - // "2022" (Artist singles) - (Some(year_txt), None, Some(artists), true) => { - year = util::parse_numeric(year_txt.first_str()).ok(); - artists.clone() - } - // "Album", "2022" (Artist albums) - (Some(atype_txt), Some(year_txt), Some(artists), true) => { - year = util::parse_numeric(year_txt.first_str()).ok(); - album_type = - map_album_type(atype_txt.first_str(), self.lang); - artists.clone() - } - // Album on artist page with unknown year - (None, None, Some(artists), true) => artists.clone(), - // "Album", <"Oonagh"> (Album variants, new releases) - (Some(atype_txt), Some(p2), _, false) => { - album_type = - map_album_type(atype_txt.first_str(), self.lang); - map_artists(Some(p2)) - } - // "Album" (Album variants, no artist) - (Some(atype_txt), None, _, false) => { - album_type = - map_album_type(atype_txt.first_str(), self.lang); - (Vec::new(), true) - } - _ => { - return Err(format!( - "could not parse subtitle of album {id}" - )); - } - }; - - self.items.push(MusicItem::Album(AlbumItem { - id, - name: item.title, - cover: item.thumbnail_renderer.into(), - artist_id: artists.first().and_then(|a| a.id.clone()), - artists, - album_type, - year, - by_va, - })); - Ok(Some(MusicItemType::Album)) - } - MusicPageType::Playlist => { - // When the playlist subtitle has only 1 part, it is a playlist from YT Music - // (featured on the startpage or in genres) - let from_ytm = subtitle_p2 - .as_ref() - .and_then(|p| p.0.first()) - .map_or(true, util::is_ytm); - let channel = subtitle_p2.and_then(|p| { - p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok()) - }); - - self.items.push(MusicItem::Playlist(MusicPlaylistItem { - id, - name: item.title, - thumbnail: item.thumbnail_renderer.into(), - channel, - track_count: None, - from_ytm, - })); - Ok(Some(MusicItemType::Playlist)) - } - MusicPageType::None => Ok(None), - MusicPageType::Unknown => { - self.has_unknown = true; - Ok(None) - } - }, - None => Err("could not determine item type".to_owned()), - } - } + MusicResponseItem::MusicTwoRowItemRenderer(item) => self.map_tile(item), MusicResponseItem::MessageRenderer(_) => Ok(None), } } @@ -932,6 +509,422 @@ impl MusicListMapper { etype } + /// Map a ListMusicItem (album/playlist tile) + fn map_list_item(&mut self, item: ListMusicItem) -> Result, String> { + let mut columns = item.flex_columns.into_iter(); + let c1 = columns.next(); + let c2 = columns.next(); + let c3 = columns.next(); + + let title = c1.as_ref().map(|col| col.renderer.text.to_string()); + + let first_tn = item + .thumbnail + .music_thumbnail_renderer + .thumbnail + .thumbnails + .first(); + + let pt_id = item + .navigation_endpoint + .and_then(NavigationEndpoint::music_page) + .or_else(|| { + c1.and_then(|c1| { + c1.renderer.text.0.into_iter().next().and_then(|t| match t { + crate::serializer::text::TextComponent::Video { + video_id, + is_video, + .. + } => Some((MusicPageType::Track { is_video }, video_id)), + crate::serializer::text::TextComponent::Browse { + page_type, + browse_id, + .. + } => Some((page_type.into(), browse_id)), + _ => None, + }) + }) + }) + .or_else(|| { + item.playlist_item_data.map(|d| { + ( + MusicPageType::Track { + is_video: self.album.is_none() + && !first_tn.map(|tn| tn.height == tn.width).unwrap_or_default(), + }, + d.video_id, + ) + }) + }) + .or_else(|| { + first_tn.and_then(|tn| { + util::video_id_from_thumbnail_url(&tn.url).map(|id| { + ( + MusicPageType::Track { + is_video: self.album.is_none() && tn.width != tn.height, + }, + id, + ) + }) + }) + }); + + match pt_id { + // Track + Some((MusicPageType::Track { is_video }, id)) => { + let title = title.ok_or_else(|| format!("track {id}: could not get title"))?; + + let (artists_p, album_p, duration_p) = match item.flex_column_display_style { + // Search result + FlexColumnDisplayStyle::TwoLines => { + // Is this a related track? + if !is_video && item.item_height == ItemHeight::Compact { + ( + c2.map(TextComponents::from), + c3.map(TextComponents::from), + None, + ) + } else { + let mut subtitle_parts = c2 + .ok_or_else(|| format!("track {id}: could not get subtitle"))? + .renderer + .text + .split(util::DOT_SEPARATOR) + .into_iter(); + + // Is this a related video? + if item.item_height == ItemHeight::Compact { + (subtitle_parts.next(), subtitle_parts.next(), None) + } + // Is it a podcast episode? + else if subtitle_parts.len() <= 3 && c3.is_some() { + (subtitle_parts.next_back(), None, None) + } else { + // Skip first part (track type) + if subtitle_parts.len() > 3 + || (is_video && subtitle_parts.len() == 2) + { + subtitle_parts.next(); + } + + ( + subtitle_parts.next(), + subtitle_parts.next(), + subtitle_parts.next(), + ) + } + } + } + // Playlist item + FlexColumnDisplayStyle::Default => ( + c2.map(TextComponents::from), + c3.map(TextComponents::from), + item.fixed_columns + .into_iter() + .next() + .map(TextComponents::from), + ), + }; + + let duration = duration_p.and_then(|p| util::parse_video_length(p.first_str())); + + let (album, view_count) = match (item.flex_column_display_style, is_video) { + // The album field contains the view count for search videos + (FlexColumnDisplayStyle::TwoLines, true) => ( + None, + album_p.and_then(|p| { + util::parse_large_numstr_or_warn( + p.first_str(), + self.lang, + &mut self.warnings, + ) + }), + ), + (_, false) => ( + album_p + .and_then(|p| p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok())), + None, + ), + (FlexColumnDisplayStyle::Default, true) => (None, None), + }; + let album = album.or_else(|| self.album.clone()); + + let (mut artists, by_va) = map_artists(artists_p); + + // Extract artist id from dropdown menu + let artist_id = map_artist_id_fallback(item.menu, artists.first()); + + // Fall back to the artist given when constructing the mapper. + // This is used for extracting artist pages. + // On some albums, the artist name of the tracks is not given but different + // from the album artist. In this case dont copy the album artist. + if let Some((fb_artists, _)) = &self.artists { + if artists.is_empty() + && (self.artist_page + || artist_id.is_none() + || fb_artists.iter().any(|fb_id| { + fb_id + .id + .as_deref() + .map(|aid| artist_id.as_deref() == Some(aid)) + .unwrap_or_default() + })) + { + artists = fb_artists.clone(); + } + } + + let track_nr = item.index.and_then(|txt| util::parse_numeric(&txt).ok()); + + self.items.push(MusicItem::Track(TrackItem { + id, + name: title, + duration, + cover: item.thumbnail.into(), + artists, + artist_id, + album, + view_count, + is_video, + track_nr, + by_va, + })); + Ok(Some(MusicItemType::Track)) + } + // Artist / Album / Playlist + Some((page_type, id)) => { + let mut subtitle_parts = c2 + .ok_or_else(|| "could not get subtitle".to_owned())? + .renderer + .text + .split(util::DOT_SEPARATOR) + .into_iter(); + + let title = title.ok_or_else(|| format!("track {id}: could not get title"))?; + + let subtitle_p1 = subtitle_parts.next(); + let subtitle_p2 = subtitle_parts.next(); + let subtitle_p3 = subtitle_parts.next(); + + match page_type { + MusicPageType::Artist => { + let subscriber_count = subtitle_p2.and_then(|p| { + util::parse_large_numstr_or_warn( + p.first_str(), + self.lang, + &mut self.warnings, + ) + }); + + self.items.push(MusicItem::Artist(ArtistItem { + id, + name: title, + avatar: item.thumbnail.into(), + subscriber_count, + })); + Ok(Some(MusicItemType::Artist)) + } + MusicPageType::Album => { + let album_type = subtitle_p1 + .map(|st| map_album_type(st.first_str(), self.lang)) + .unwrap_or_default(); + + let (artists, by_va) = map_artists(subtitle_p2); + + let artist_id = map_artist_id_fallback(item.menu, artists.first()); + + let year = + subtitle_p3.and_then(|st| util::parse_numeric(st.first_str()).ok()); + + self.items.push(MusicItem::Album(AlbumItem { + id, + name: title, + cover: item.thumbnail.into(), + artists, + artist_id, + album_type, + year, + by_va, + })); + Ok(Some(MusicItemType::Album)) + } + MusicPageType::Playlist => { + // Part 1 may be the "Playlist" label + let (channel_p, tcount_p) = match subtitle_p3 { + Some(_) => (subtitle_p2, subtitle_p3), + None => (subtitle_p1, subtitle_p2), + }; + + let from_ytm = channel_p + .as_ref() + .and_then(|p| p.0.first()) + .map(util::is_ytm) + .unwrap_or_default(); + let channel = channel_p.and_then(|p| { + p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok()) + }); + let track_count = tcount_p + .filter(|_| from_ytm) + .and_then(|p| util::parse_numeric(p.first_str()).ok()); + + self.items.push(MusicItem::Playlist(MusicPlaylistItem { + id, + name: title, + thumbnail: item.thumbnail.into(), + channel, + track_count, + from_ytm, + })); + Ok(Some(MusicItemType::Playlist)) + } + MusicPageType::None => { + // There may be broken YT channels from the artist search. They can be skipped. + Ok(None) + } + // Tracks were already handled above + MusicPageType::Track { .. } => unreachable!(), + MusicPageType::Unknown => { + self.has_unknown = true; + Ok(None) + } + } + } + None => { + if item.music_item_renderer_display_policy == DisplayPolicy::GreyOut { + Ok(None) + } else { + Err("could not determine item type".to_owned()) + } + } + } + } + + /// Map a CoverMusicItem (album/playlist tile) + fn map_tile(&mut self, item: CoverMusicItem) -> Result, String> { + let mut subtitle_parts = item.subtitle.split(util::DOT_SEPARATOR).into_iter(); + let subtitle_p1 = subtitle_parts.next(); + let subtitle_p2 = subtitle_parts.next(); + + match item.navigation_endpoint.music_page() { + Some((page_type, id)) => match page_type { + MusicPageType::Track { is_video } => { + let (artists, by_va) = map_artists(subtitle_p1); + + self.items.push(MusicItem::Track(TrackItem { + id, + name: item.title, + duration: None, + cover: item.thumbnail_renderer.into(), + artist_id: artists.first().and_then(|a| a.id.clone()), + artists, + album: None, + view_count: subtitle_p2.and_then(|c| { + util::parse_large_numstr_or_warn( + c.first_str(), + self.lang, + &mut self.warnings, + ) + }), + is_video, + track_nr: None, + by_va, + })); + Ok(Some(MusicItemType::Track)) + } + MusicPageType::Artist => { + let subscriber_count = subtitle_p1.and_then(|p| { + util::parse_large_numstr_or_warn( + p.first_str(), + self.lang, + &mut self.warnings, + ) + }); + + self.items.push(MusicItem::Artist(ArtistItem { + id, + name: item.title, + avatar: item.thumbnail_renderer.into(), + subscriber_count, + })); + Ok(Some(MusicItemType::Artist)) + } + MusicPageType::Album => { + let mut year = None; + let mut album_type = AlbumType::Single; + + let (artists, by_va) = + match (subtitle_p1, subtitle_p2, &self.artists, self.artist_page) { + // "2022" (Artist singles) + (Some(year_txt), None, Some(artists), true) => { + year = util::parse_numeric(year_txt.first_str()).ok(); + artists.clone() + } + // "Album", "2022" (Artist albums) + (Some(atype_txt), Some(year_txt), Some(artists), true) => { + year = util::parse_numeric(year_txt.first_str()).ok(); + album_type = map_album_type(atype_txt.first_str(), self.lang); + artists.clone() + } + // Album on artist page with unknown year + (None, None, Some(artists), true) => artists.clone(), + // "Album", <"Oonagh"> (Album variants, new releases) + (Some(atype_txt), Some(p2), _, false) => { + album_type = map_album_type(atype_txt.first_str(), self.lang); + map_artists(Some(p2)) + } + // "Album" (Album variants, no artist) + (Some(atype_txt), None, _, false) => { + album_type = map_album_type(atype_txt.first_str(), self.lang); + (Vec::new(), true) + } + _ => { + return Err(format!("could not parse subtitle of album {id}")); + } + }; + + self.items.push(MusicItem::Album(AlbumItem { + id, + name: item.title, + cover: item.thumbnail_renderer.into(), + artist_id: artists.first().and_then(|a| a.id.clone()), + artists, + album_type, + year, + by_va, + })); + Ok(Some(MusicItemType::Album)) + } + MusicPageType::Playlist => { + // When the playlist subtitle has only 1 part, it is a playlist from YT Music + // (featured on the startpage or in genres) + let from_ytm = subtitle_p2 + .as_ref() + .and_then(|p| p.0.first()) + .map_or(true, util::is_ytm); + let channel = subtitle_p2 + .and_then(|p| p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok())); + + self.items.push(MusicItem::Playlist(MusicPlaylistItem { + id, + name: item.title, + thumbnail: item.thumbnail_renderer.into(), + channel, + track_count: None, + from_ytm, + })); + Ok(Some(MusicItemType::Playlist)) + } + MusicPageType::None => Ok(None), + MusicPageType::Unknown => { + self.has_unknown = true; + Ok(None) + } + }, + None => Err("could not determine item type".to_owned()), + } + } + + /// Map a MusicCardShelf (used for the top search result) pub fn map_card(&mut self, card: MusicCardShelf) -> Option { /* "Artist" " • " "" diff --git a/src/serializer/text.rs b/src/serializer/text.rs index 2e5549d..e1c6ae9 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -297,7 +297,7 @@ impl<'de> DeserializeAs<'de, TextComponents> for AttributedText { } impl TryFrom for crate::model::ChannelId { - type Error = util::MappingError; + type Error = (); fn try_from(value: TextComponent) -> Result { match value { @@ -310,9 +310,9 @@ impl TryFrom for crate::model::ChannelId { id: browse_id, name: text, }), - _ => Err(util::MappingError("invalid channel link type".into())), + _ => Err(()), }, - _ => Err(util::MappingError("invalid channel link".into())), + _ => Err(()), } } } diff --git a/src/util/mod.rs b/src/util/mod.rs index 1a261d7..ad881e3 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -8,7 +8,6 @@ pub use date::{now_sec, shift_months, shift_years}; pub use protobuf::{string_from_pb, ProtoBuilder}; use std::{ - borrow::{Borrow, Cow}, collections::BTreeMap, str::{FromStr, SplitWhitespace}, }; @@ -42,11 +41,6 @@ pub const ARTIST_DISCOGRAPHY_PREFIX: &str = "MPAD"; const CONTENT_PLAYBACK_NONCE_ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; -/// Internal error -#[derive(thiserror::Error, Debug)] -#[error("mapping error: {0}")] -pub struct MappingError(pub(crate) Cow<'static, str>); - /// Return the given capture group that matches first in a list of regexes pub fn get_cg_from_regexes<'a, I>(mut regexes: I, text: &str, cg: usize) -> Option where @@ -249,7 +243,7 @@ pub fn sanitize_yt_url(url: &str) -> String { if parsed_url.query().is_some() { let params = parsed_url .query_pairs() - .filter_map(|(k, v)| match k.borrow() { + .filter_map(|(k, v)| match k.as_ref() { "utm_source" | "utm_medium" | "utm_campaign" | "utm_content" => None, _ => Some((k.to_string(), v.to_string())), }) From dd8a1a085b6f5474667c093d6b2917da383fc2f9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 22 Jul 2023 16:44:40 +0200 Subject: [PATCH 022/459] chore: update dependencies --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 25116ed..708866b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,12 +60,12 @@ ress = "0.11.4" phf = "0.11.1" base64 = "0.21.0" urlencoding = "2.1.2" -quick-xml = { version = "0.28.1", features = ["serialize"], optional = true } +quick-xml = { version = "0.29.0", features = ["serialize"], optional = true } [dev-dependencies] env_logger = "0.10.0" test-log = "0.2.11" -rstest = "0.17.0" +rstest = "0.18.1" tokio-test = "0.4.2" insta = { version = "1.17.1", features = ["ron", "redactions"] } path_macro = "1.0.0" From 9d385e8e9b69f63661790963f9c03ca1aa44d342 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 30 Jul 2023 17:00:47 +0200 Subject: [PATCH 023/459] fix: player from android client --- src/client/player.rs | 5 +++++ tests/snapshots/youtube__music_artist_only_singles.snap | 2 +- tests/youtube.rs | 3 +-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/client/player.rs b/src/client/player.rs index 9f74ef9..f5bd905 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -40,6 +40,8 @@ struct QPlayer<'a> { content_check_ok: bool, /// Probably refers to allowing sensitive content, too racy_check_ok: bool, + #[serde(skip_serializing_if = "Option::is_none")] + params: Option<&'a str>, } #[derive(Debug, Serialize)] @@ -113,6 +115,7 @@ impl RustyPipeQuery { video_id, content_check_ok: true, racy_check_ok: true, + params: None, } } else { QPlayer { @@ -122,6 +125,8 @@ impl RustyPipeQuery { video_id, content_check_ok: true, racy_check_ok: true, + // Source: https://github.com/TeamNewPipe/NewPipeExtractor/pull/1084 + params: Some("CgIQBg").filter(|_| client_type == ClientType::Android), } }; diff --git a/tests/snapshots/youtube__music_artist_only_singles.snap b/tests/snapshots/youtube__music_artist_only_singles.snap index 9258bcb..9e673ba 100644 --- a/tests/snapshots/youtube__music_artist_only_singles.snap +++ b/tests/snapshots/youtube__music_artist_only_singles.snap @@ -6,7 +6,7 @@ MusicArtist( id: "UCfwCE5VhPMGxNPFxtVv7lRw", name: "Sulli", header_image: "[header_image]", - description: Some("Choi Jin-ri, better known by her stage name Sulli, was a South Korean actress and singer. She first made her debut as a child actress, appearing as a supporting cast member on the SBS historical drama Ballad of Seodong. Following this, she earned a number of guest roles, appearing in the television series Love Needs a Miracle and Drama City, and the film Vacation. She then subsequently appeared in the independent films Punch Lady and BA:BO, the former being her first time cast in a substantial dramatic role.\nAfter signing a record deal with SM Entertainment, Sulli rose to prominence as a member of the girl group f(x) formed in 2009. The group achieved both critical and commercial success, with four Korean number-one singles and international recognition after becoming the first K-pop act to perform at SXSW. Concurrently with her music career, Sulli returned to acting by starring in the SBS romantic comedy series, To the Beautiful You, a Korean adaptation of the shōjo manga Hana-Kimi where her performance was positively received and earned her two SBS Drama Awards and a nomination at the 49th Paeksang Arts Awards.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Sulli) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), + description: Some("Choi Jin-ri, better known by her stage name Sulli, was a South Korean singer and actress. She first made her debut as a child actress, appearing as a supporting cast member on the SBS historical drama Ballad of Seodong. Following this, she earned a number of guest roles, appearing in the television series Love Needs a Miracle and Drama City, and the film Vacation. She then subsequently appeared in the independent films Punch Lady and BA:BO, the former being her first time cast in a substantial dramatic role.\nAfter signing a record deal with SM Entertainment, Sulli rose to prominence as a member of the girl group f(x) formed in 2009. The group achieved both critical and commercial success, with four Korean number-one singles and international recognition after becoming the first K-pop act to perform at SXSW. Concurrently with her music career, Sulli returned to acting by starring in the SBS romantic comedy series, To the Beautiful You, a Korean adaptation of the shōjo manga Hana-Kimi where her performance was positively received and earned her two SBS Drama Awards and a nomination at the 49th Paeksang Arts Awards.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Sulli) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), wikipedia_url: Some("https://en.wikipedia.org/wiki/Sulli"), subscriber_count: "[subscriber_count]", tracks: "[tracks]", diff --git a/tests/youtube.rs b/tests/youtube.rs index f3c5c96..e3c9027 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -28,8 +28,7 @@ use rustypipe::param::{ #[rstest] #[case::desktop(ClientType::Desktop)] #[case::tv_html5_embed(ClientType::TvHtml5Embed)] -// The Android client became flaky -// #[case::android(ClientType::Android)] +#[case::android(ClientType::Android)] #[case::ios(ClientType::Ios)] #[test_log::test] fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { From 687ddec50d2a1cad217b6fbaa8a78625b1e60682 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 30 Jul 2023 17:02:03 +0200 Subject: [PATCH 024/459] fix: make error enums exhaustive --- src/error.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/error.rs b/src/error.rs index 471568c..0b29cc0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -6,7 +6,6 @@ use reqwest::StatusCode; /// Error type for the RustyPipe library #[derive(thiserror::Error, Debug)] -#[non_exhaustive] pub enum Error { /// Error extracting content from YouTube #[error("extraction error: {0}")] @@ -24,7 +23,6 @@ pub enum Error { /// Error extracting content from YouTube #[derive(thiserror::Error, Debug)] -#[non_exhaustive] pub enum ExtractionError { /// Video cannot be extracted with RustyPipe /// From ca2335d03f5f656dcb9c2f0ad783b7813fc89cfe Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 30 Jul 2023 18:02:06 +0200 Subject: [PATCH 025/459] fix: parsing playlist channel (more than 1 text component led to an error) --- src/serializer/text.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/serializer/text.rs b/src/serializer/text.rs index e1c6ae9..f8d070d 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -201,13 +201,6 @@ impl<'de> Deserialize<'de> for TextComponent { D: Deserializer<'de>, { let mut text = RichTextInternal::deserialize(deserializer)?; - if text.runs.len() != 1 { - return Err(serde::de::Error::invalid_length( - text.runs.len(), - &"1 run, use TextComponents for more", - )); - } - Ok(text.runs.swap_remove(0).into()) } } From 5736d53c993e15481db71a8cb6d1e2eca5f3d000 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 3 Aug 2023 17:42:31 +0200 Subject: [PATCH 026/459] feat: add error reporting for deobf data extraction --- src/client/channel_rss.rs | 6 ++--- src/client/mod.rs | 56 ++++++++++++++++++++++++++++++--------- src/deobfuscate.rs | 47 +++++++++++++++++++++++++++----- src/report.rs | 7 +++-- 4 files changed, 90 insertions(+), 26 deletions(-) diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index 68f700c..f12f9de 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -1,5 +1,3 @@ -use std::collections::BTreeMap; - use crate::{ error::{Error, ExtractionError}, model::ChannelRss, @@ -46,9 +44,9 @@ impl RustyPipeQuery { http_request: crate::report::HTTPRequest { url: &url, method: "GET", - req_header: BTreeMap::new(), - req_body: String::new(), status: 200, + req_header: None, + req_body: None, resp_body: xml, }, }; diff --git a/src/client/mod.rs b/src/client/mod.rs index 761667c..50c7f53 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -399,6 +399,7 @@ struct RequestResult { } impl CacheEntry { + /// Get the content of the cache if it is still fresh fn get(&self) -> Option<&T> { match self { CacheEntry::Some { last_update, data } => { @@ -411,6 +412,14 @@ impl CacheEntry { CacheEntry::None => None, } } + + /// Get the content of the cache, even if it is expired + fn get_expired(&self) -> Option<&T> { + match self { + CacheEntry::Some { data, .. } => Some(data), + CacheEntry::None => None, + } + } } impl From for CacheEntry { @@ -901,7 +910,7 @@ impl RustyPipe { } } - /// Instantiate a new deobfuscator from either cached or extracted YouTube JavaScript code. + /// Get deobfuscation data (either from cache or extracted from YouTube's JavaScript code) async fn get_deobf_data(&self) -> Result { // Write lock here to prevent concurrent tasks from fetching the same data let mut deobf_data = self.inner.cache.deobf.write().await; @@ -909,12 +918,29 @@ impl RustyPipe { match deobf_data.get() { Some(deobf_data) => Ok(deobf_data.clone()), None => { - log::debug!("getting deobfuscator"); - let new_data = DeobfData::download(self.inner.http.clone()).await?; - *deobf_data = CacheEntry::from(new_data.clone()); - drop(deobf_data); - self.store_cache().await; - Ok(new_data) + log::debug!("getting deobf data"); + + match DeobfData::extract(self.inner.http.clone(), self.inner.reporter.as_deref()) + .await + { + Ok(new_data) => { + // Write new data to the cache + *deobf_data = CacheEntry::from(new_data.clone()); + drop(deobf_data); + self.store_cache().await; + Ok(new_data) + } + Err(e) => { + // Try to fall back to expired cache data if available, otherwise return error + match deobf_data.get_expired() { + Some(d) => { + log::warn!("could not get new deobf data ({e}), falling back to expired cache"); + Ok(d.clone()) + } + None => Err(e), + } + } + } } } } @@ -1370,12 +1396,16 @@ impl RustyPipeQuery { http_request: crate::report::HTTPRequest { url: request.url().as_str(), method: request.method().as_str(), - req_header: request - .headers() - .iter() - .map(|(k, v)| (k.as_str(), v.to_str().unwrap_or_default().to_owned())) - .collect(), - req_body: serde_json::to_string(body).unwrap_or_default(), + req_header: Some( + request + .headers() + .iter() + .map(|(k, v)| { + (k.as_str(), v.to_str().unwrap_or_default().to_owned()) + }) + .collect(), + ), + req_body: serde_json::to_string(body).ok(), status: req_res.status.into(), resp_body: req_res.body, }, diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index 264d7a3..bc731ee 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -6,6 +6,7 @@ use serde::{Deserialize, Serialize}; use crate::{ error::{internal::DeobfError, Error}, + report::{Level, Report, Reporter, RustyPipeInfo}, util, }; @@ -22,18 +23,47 @@ pub struct DeobfData { } impl DeobfData { - pub async fn download(http: Client) -> Result { + /// Download and extract the latest deobfuscation data from YouTube + /// + /// Creates a report if the data could not be extracted + pub async fn extract(http: Client, reporter: Option<&dyn Reporter>) -> Result { let js_url = get_player_js_url(&http).await?; let player_js = get_response(&http, &js_url).await?; - log::debug!("downloaded player.js from {}", js_url); - let sig_fn = get_sig_fn(&player_js)?; - let nsig_fn = get_nsig_fn(&player_js)?; - let sts = get_sts(&player_js)?; + let res = Self::extract_fns(&js_url, &player_js); + + if let Err(e) = &res { + if let Some(reporter) = reporter { + let report = Report { + info: RustyPipeInfo::default(), + level: Level::ERR, + operation: "extract_deobf", + error: Some(e.to_string()), + msgs: vec![], + deobf_data: None, + http_request: crate::report::HTTPRequest { + url: &js_url, + method: "GET", + req_header: None, + req_body: None, + status: 200, + resp_body: player_js, + }, + }; + reporter.report(&report); + } + } + res + } + + fn extract_fns(js_url: &str, player_js: &str) -> Result { + let sig_fn = get_sig_fn(player_js)?; + let nsig_fn = get_nsig_fn(player_js)?; + let sts = get_sts(player_js)?; Ok(Self { - js_url, + js_url: js_url.to_owned(), sig_fn, nsig_fn, sts, @@ -42,6 +72,7 @@ impl DeobfData { } impl Deobfuscator { + /// Instantiate a new deobfuscator with the given data pub fn new(data: &DeobfData) -> Result { let ctx = quick_js::Context::new().or(Err(DeobfError::Other("could not create QuickJS rt")))?; @@ -51,6 +82,7 @@ impl Deobfuscator { Ok(Self { ctx }) } + /// Deobfuscate the `s` parameter from the `signature_cipher` field pub fn deobfuscate_sig(&self, sig: &str) -> Result { let res = self.ctx.call_function(DEOBF_SIG_FUNC_NAME, vec![sig])?; @@ -63,6 +95,7 @@ impl Deobfuscator { ) } + /// Deobfuscate the `n` stream URL parameter to circumvent throttling pub fn deobfuscate_nsig(&self, nsig: &str) -> Result { let res = self.ctx.call_function(DEOBF_NSIG_FUNC_NAME, vec![nsig])?; @@ -403,7 +436,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] fn t_update() { let client = Client::new(); - let deobf_data = tokio_test::block_on(DeobfData::download(client)).unwrap(); + let deobf_data = tokio_test::block_on(DeobfData::extract(client, None)).unwrap(); let deobf = Deobfuscator::new(&deobf_data).unwrap(); let deobf_sig = deobf.deobfuscate_sig("GOqGOqGOq0QJ8wRAIgaryQHfplJ9xJSKFywyaSMHuuwZYsoMTAvRvfm51qIGECIA5061zWeyfMPX9hEl_U6f9J0tr7GTJMKyPf5XNrJb5fb5i").unwrap(); diff --git a/src/report.rs b/src/report.rs index 1e1aa1f..a995fe3 100644 --- a/src/report.rs +++ b/src/report.rs @@ -47,6 +47,7 @@ pub struct Report<'a> { /// Error (if occurred) pub error: Option, /// Detailed error/warning messages + #[serde(default, skip_serializing_if = "Vec::is_empty")] pub msgs: Vec, /// Deobfuscation data (only for player requests) #[serde(skip_serializing_if = "Option::is_none")] @@ -77,9 +78,11 @@ pub struct HTTPRequest<'a> { /// HTTP method pub method: &'a str, /// HTTP request header - pub req_header: BTreeMap<&'a str, String>, + #[serde(skip_serializing_if = "Option::is_none")] + pub req_header: Option>, /// HTTP request body - pub req_body: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub req_body: Option, /// HTTP response status code pub status: u16, /// HTTP response body From ed84f72aced948b905e9680962d920b835e3048a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 3 Aug 2023 18:29:33 +0200 Subject: [PATCH 027/459] fix: hold back regex crate (v1.9.0 causes issues) Reported issue: https://github.com/rust-lang/regex/issues/1060 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 708866b..e1900b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ quick-js-dtp = { version = "0.4.1", default-features = false, features = [ "patch-dateparser", ] } once_cell = "1.12.0" -regex = "1.6.0" +regex = ">=1.6.0, <1.9.0" fancy-regex = "0.11.0" thiserror = "1.0.36" url = "2.2.2" From e5c51fe99592519bca5500ce4082aad4a0cb8b7d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 3 Aug 2023 19:31:34 +0200 Subject: [PATCH 028/459] fix: extract visitor data from html page --- src/client/mod.rs | 53 +++++++++++++++++++++++++++++++++-------------- src/util/mod.rs | 15 ++++++-------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 50c7f53..bf5413e 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -209,8 +209,10 @@ const ANDROID_API_KEY: &str = "AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w"; const IOS_API_KEY: &str = "AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAc"; const IOS_DEVICE_MODEL: &str = "iPhone14,5"; -static CLIENT_VERSION_REGEXES: Lazy<[Regex; 1]> = - Lazy::new(|| [Regex::new(r#"INNERTUBE_CONTEXT_CLIENT_VERSION":"([\w\d\._-]+?)""#).unwrap()]); +static CLIENT_VERSION_REGEX: Lazy = + Lazy::new(|| Regex::new(r#""INNERTUBE_CONTEXT_CLIENT_VERSION":"([\w\d\._-]+?)""#).unwrap()); +static VISITOR_DATA_REGEX: Lazy = + Lazy::new(|| Regex::new(r#""visitorData":"([\w\d_\-%]+?)""#).unwrap()); /// The RustyPipe client used to access YouTube's API /// @@ -814,11 +816,11 @@ impl RustyPipe { ) .await?; - util::get_cg_from_regexes(CLIENT_VERSION_REGEXES.iter(), &swjs, 1).ok_or( - Error::Extraction(ExtractionError::InvalidData(Cow::Borrowed( + util::get_cg_from_regex(&CLIENT_VERSION_REGEX, &swjs, 1).ok_or(Error::Extraction( + ExtractionError::InvalidData(Cow::Borrowed( "Could not find client version in sw.js", - ))), - ) + )), + )) }); let from_html = async { @@ -829,11 +831,11 @@ impl RustyPipe { let html = self.http_request_txt(&builder.build().unwrap()).await?; - util::get_cg_from_regexes(CLIENT_VERSION_REGEXES.iter(), &html, 1).ok_or( - Error::Extraction(ExtractionError::InvalidData(Cow::Borrowed( + util::get_cg_from_regex(&CLIENT_VERSION_REGEX, &html, 1).ok_or(Error::Extraction( + ExtractionError::InvalidData(Cow::Borrowed( "Could not find client version on html page", - ))), - ) + )), + )) }; if let Some(from_swjs) = from_swjs { @@ -965,11 +967,15 @@ impl RustyPipe { /// /// Since the cookie is shared between YT and YTM and the YTM page loads faster, /// we request that. + /// + /// Sometimes YouTube does not set the `__Secure-YEC` cookie. In this case, the + /// visitor data is extracted from the html page. async fn get_visitor_data(&self) -> Result { log::debug!("getting YT visitor data"); let resp = self.inner.http.get(YOUTUBE_MUSIC_HOME_URL).send().await?; - resp.headers() + let vdata = resp + .headers() .get_all(header::SET_COOKIE) .iter() .find_map(|c| { @@ -979,10 +985,27 @@ impl RustyPipe { } } None - }) - .ok_or(Error::Extraction(ExtractionError::InvalidData( - Cow::Borrowed("could not get YTM cookies"), - ))) + }); + + match vdata { + Some(vdata) => Ok(vdata), + None => { + if resp.status().is_success() { + // Extract visitor data from html + let html = resp.text().await?; + + util::get_cg_from_regex(&VISITOR_DATA_REGEX, &html, 1).ok_or(Error::Extraction( + ExtractionError::InvalidData(Cow::Borrowed( + "Could not find visitor data on html page", + )), + )) + } else { + Err(Error::Extraction(ExtractionError::InvalidData( + format!("Could not get visitor data, status: {}", resp.status()).into(), + ))) + } + } + } } } diff --git a/src/util/mod.rs b/src/util/mod.rs index ad881e3..363d48d 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -41,14 +41,11 @@ pub const ARTIST_DISCOGRAPHY_PREFIX: &str = "MPAD"; const CONTENT_PLAYBACK_NONCE_ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; -/// Return the given capture group that matches first in a list of regexes -pub fn get_cg_from_regexes<'a, I>(mut regexes: I, text: &str, cg: usize) -> Option -where - I: Iterator, -{ - regexes - .find_map(|pattern| pattern.captures(text)) - .map(|c| c.get(cg).unwrap().as_str().to_owned()) +/// Return the given capture group that matches the regex +pub fn get_cg_from_regex(regex: &Regex, text: &str, cg: usize) -> Option { + regex + .captures(text) + .and_then(|c| c.get(cg).map(|c| c.as_str().to_owned())) } /// Return the given capture group that matches first in a list of fancy regexes @@ -58,7 +55,7 @@ where { regexes .find_map(|pattern| pattern.captures(text).ok().flatten()) - .map(|c| c.get(cg).unwrap().as_str().to_owned()) + .and_then(|c| c.get(cg).map(|c| c.as_str().to_owned())) } /// Generate a random string with given length and byte charset. From 57086cab9ad7c31ec68d94e4f63b39a37d3b6d11 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 3 Aug 2023 20:49:30 +0200 Subject: [PATCH 029/459] feat: add report flag to CLI --- cli/src/main.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index c96cd98..ff53c77 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -19,6 +19,9 @@ use serde::Serialize; struct Cli { #[clap(subcommand)] command: Commands, + /// Always generate a report (used for debugging) + #[clap(long)] + report: bool, } #[derive(Subcommand)] @@ -392,10 +395,11 @@ async fn main() { storage_dir.push("rustypipe"); _ = std::fs::create_dir(&storage_dir); - let rp = RustyPipe::builder() - .storage_dir(storage_dir) - .build() - .unwrap(); + let mut rp = RustyPipe::builder().storage_dir(storage_dir); + if cli.report { + rp = rp.report(); + } + let rp = rp.build().unwrap(); match cli.command { Commands::Download { From b752b6ea9b10d089f5bc7d328803624de0f91170 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 4 Aug 2023 01:14:36 +0200 Subject: [PATCH 030/459] fix(tests): replace short playlist, add new pop genre id --- Justfile | 10 +--------- README.md | 26 ++++++++++++++++++++++++++ tests/youtube.rs | 12 ++++++------ 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/Justfile b/Justfile index 7d7ca4d..c2f3fdf 100644 --- a/Justfile +++ b/Justfile @@ -7,14 +7,6 @@ unittest: testyt: cargo test --features=rss --test youtube -testyt10: - #!/usr/bin/env bash - set -e - for i in {1..10}; do \ - echo "---TEST RUN $i---"; \ - cargo test --features=rss --test youtube; \ - done - testintl: #!/usr/bin/env bash LANGUAGES=( @@ -47,4 +39,4 @@ testfiles: report2yaml: mkdir -p rustypipe_reports/conv - for f in rustypipe_reports/*.json; do yq '.http_request.resp_body' $f | yq -o json -P > rustypipe_reports/conv/`basename $f .json`_body.json; yq e -Pi $f; mv $f rustypipe_reports/conv/`basename $f .json`.yaml; done; + for f in rustypipe_reports/*.json; do yq '.http_request.resp_body' $f | yq -o json -P > rustypipe_reports/conv/`basename $f .json`_body.json; yq e -Pi "del(.http_request.resp_body)" $f; mv $f rustypipe_reports/conv/`basename $f .json`.yaml; done; diff --git a/README.md b/README.md index a237ebc..83bd294 100644 --- a/README.md +++ b/README.md @@ -154,3 +154,29 @@ Subscribers: 1780000 [6Fv8bd9ICb4] Who owns this? (199s) ... ``` + +## Development + +**Requirements:** + +- Current version of stable Rust +- [`just`](https://github.com/casey/just) task runner +- [`pre-commit`](https://pre-commit.com/) +- yq (YAML processor) + +### Tasks + +**Testing** + +- `just test` Run unit+integration tests +- `just unittest` Run unit tests +- `just testyt` Run YouTube integration tests +- `just testintl` Run YouTube integration tests for all supported languages (this takes + a long time and is therefore not run in CI) +- `YT_LANG=de just testyt` Run YouTube integration tests for a specific language + +**Tools** + +- `just testfiles` Download missing testfiles for unit tests +- `just report2yaml` Convert RustyPipe reports into a more readable yaml format + (requires `yq`) diff --git a/tests/youtube.rs b/tests/youtube.rs index e3c9027..0f448de 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1278,10 +1278,10 @@ fn trending(rp: RustyPipe) { false, )] #[case::short( - "RDCLAK5uy_kFQXdnqMaQCVx2wpUM4ZfbsGCDibZtkJk", - "Easy Pop", + "RDCLAK5uy_nLNY4ReQKH2kx5U23cyGMHql9ciHD9RSM", + "Presenting BLACKPINK (블랙핑크)", false, - Some("Stress-free tunes from classic rockers and newer artists.\nThis playlist is no longer being updated.".to_owned()), + Some("The most played hits and essential tracks. #blackpink #best #kpop".to_owned()), None, true )] @@ -2181,7 +2181,7 @@ fn music_genres(rp: RustyPipe, unlocalized: bool) { let chill = genres .iter() .find(|g| g.id == "ggMPOg1uX1JOQWZFeDByc2Jm") - .unwrap(); + .expect("genre: Chill"); if unlocalized { assert_eq!(chill.name, "Chill"); } @@ -2189,8 +2189,8 @@ fn music_genres(rp: RustyPipe, unlocalized: bool) { let pop = genres .iter() - .find(|g| g.id == "ggMPOg1uX1lMbVZmbzl6NlJ3") - .unwrap(); + .find(|g| g.id == "ggMPOg1uX1lMbVZmbzl6NlJ3" || g.id == "ggMPOg1uX1BmNzc2V2p0YXJ5") + .expect("genre: Pop"); assert_eq!(pop.name, "Pop"); assert!(!pop.is_mood); From 43ed52daf9e79d53471580841aba6fd7e0e89b2c Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 4 Aug 2023 01:26:26 +0200 Subject: [PATCH 031/459] fix: parsing video details for DRM-restricted movies --- src/client/response/video_details.rs | 4 ++-- ...eo_details__tests__map_video_details_20220924_newdesc.snap | 2 +- ...s__tests__map_video_details_20221011_new_continuation.snap | 2 +- ...eo_details__tests__map_video_details_20221011_rec_isr.snap | 2 +- ...ient__video_details__tests__map_video_details_agegate.snap | 2 +- ...ent__video_details__tests__map_video_details_ccommons.snap | 2 +- ...ent__video_details__tests__map_video_details_chapters.snap | 2 +- ..._client__video_details__tests__map_video_details_live.snap | 2 +- ...client__video_details__tests__map_video_details_music.snap | 2 +- ...e__client__video_details__tests__map_video_details_mv.snap | 2 +- src/client/video_details.rs | 4 +++- src/model/mod.rs | 2 +- 12 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/client/response/video_details.rs b/src/client/response/video_details.rs index f43878a..c9b4d2e 100644 --- a/src/client/response/video_details.rs +++ b/src/client/response/video_details.rs @@ -77,8 +77,8 @@ pub(crate) enum VideoResultsItem { /// Like/Dislike button video_actions: VideoActions, /// Absolute textual date (e.g. `Dec 29, 2019`) - #[serde_as(as = "Text")] - date_text: String, + #[serde_as(as = "Option")] + date_text: Option, }, #[serde(rename_all = "camelCase")] VideoSecondaryInfoRenderer { diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20220924_newdesc.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20220924_newdesc.snap index fd92e05..a360227 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20220924_newdesc.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20220924_newdesc.snap @@ -139,7 +139,7 @@ VideoDetails( view_count: 233243423, like_count: Some(4015532), publish_date: "[date]", - publish_date_txt: "Nov 17, 2020", + publish_date_txt: Some("Nov 17, 2020"), is_live: false, is_ccommons: false, chapters: [], diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_new_continuation.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_new_continuation.snap index 0841f39..68e704d 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_new_continuation.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_new_continuation.snap @@ -139,7 +139,7 @@ VideoDetails( view_count: 234258725, like_count: Some(4027586), publish_date: "[date]", - publish_date_txt: "Nov 17, 2020", + publish_date_txt: Some("Nov 17, 2020"), is_live: false, is_ccommons: false, chapters: [], diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_rec_isr.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_rec_isr.snap index 10880e8..4cfe502 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_rec_isr.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20221011_rec_isr.snap @@ -389,7 +389,7 @@ VideoDetails( view_count: 1251797, like_count: Some(58077), publish_date: "[date]", - publish_date_txt: "Sep 15, 2022", + publish_date_txt: Some("Sep 15, 2022"), is_live: false, is_ccommons: false, chapters: [ diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_agegate.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_agegate.snap index ca890dd..970147c 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_agegate.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_agegate.snap @@ -32,7 +32,7 @@ VideoDetails( view_count: 205, like_count: None, publish_date: "[date]", - publish_date_txt: "Jan 2, 2019", + publish_date_txt: Some("Jan 2, 2019"), is_live: false, is_ccommons: false, chapters: [], diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_ccommons.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_ccommons.snap index 1cc3cc7..9f51720 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_ccommons.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_ccommons.snap @@ -50,7 +50,7 @@ VideoDetails( view_count: 2493983, like_count: Some(52274), publish_date: "[date]", - publish_date_txt: "Dec 29, 2019", + publish_date_txt: Some("Dec 29, 2019"), is_live: false, is_ccommons: true, chapters: [], diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_chapters.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_chapters.snap index cc9ce07..187bff9 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_chapters.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_chapters.snap @@ -371,7 +371,7 @@ VideoDetails( view_count: 971966, like_count: Some(48244), publish_date: "[date]", - publish_date_txt: "Sep 15, 2022", + publish_date_txt: Some("Sep 15, 2022"), is_live: false, is_ccommons: false, chapters: [ diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_live.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_live.snap index 8236ef8..62979ec 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_live.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_live.snap @@ -94,7 +94,7 @@ VideoDetails( view_count: 681, like_count: Some(872230), publish_date: "[date]", - publish_date_txt: "Started streaming on Sep 23, 2021", + publish_date_txt: Some("Started streaming on Sep 23, 2021"), is_live: true, is_ccommons: false, chapters: [], diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_music.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_music.snap index ce4edf3..2e65156 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_music.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_music.snap @@ -36,7 +36,7 @@ VideoDetails( view_count: 20304, like_count: Some(146), publish_date: "[date]", - publish_date_txt: "Aug 6, 2020", + publish_date_txt: Some("Aug 6, 2020"), is_live: false, is_ccommons: false, chapters: [], diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_mv.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_mv.snap index 9071e3e..3442496 100644 --- a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_mv.snap +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_mv.snap @@ -139,7 +139,7 @@ VideoDetails( view_count: 232792465, like_count: Some(4010156), publish_date: "[date]", - publish_date_txt: "Nov 17, 2020", + publish_date_txt: Some("Nov 17, 2020"), is_live: false, is_ccommons: false, chapters: [], diff --git a/src/client/video_details.rs b/src/client/video_details.rs index 92570cc..6d24583 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -175,7 +175,9 @@ impl MapResponse for response::VideoDetails { // accessibility_data contains no digits if the like count is hidden, // so we ignore parse errors here for now like_btn.and_then(|btn| util::parse_numeric(&btn.accessibility_data).ok()), - timeago::parse_textual_date_or_warn(lang, &date_text, &mut warnings), + date_text.as_deref().and_then(|txt| { + timeago::parse_textual_date_or_warn(lang, txt, &mut warnings) + }), date_text, view_count .map(|vc| vc.video_view_count_renderer.is_live) diff --git a/src/model/mod.rs b/src/model/mod.rs index 252cab6..ffbf652 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -567,7 +567,7 @@ pub struct VideoDetails { #[serde(with = "time::serde::rfc3339::option")] pub publish_date: Option, /// Textual video publishing date (e.g. `Aug 2, 2013`, depends on language) - pub publish_date_txt: String, + pub publish_date_txt: Option, /// Is the video a livestream? pub is_live: bool, /// Is the video published under the Creative Commons BY 3.0 license? From 43ef8d15c4f0f5bdd47417dc0487ff4fb916df23 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 4 Aug 2023 15:14:55 +0200 Subject: [PATCH 032/459] feat: add build_with_client method to RustyPipeBuilder fix: create data dir if it doesn't exist --- cli/src/main.rs | 2 +- src/client/mod.rs | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index ff53c77..a79b12a 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -393,7 +393,7 @@ async fn main() { let mut storage_dir = dirs::data_dir().expect("no data dir"); storage_dir.push("rustypipe"); - _ = std::fs::create_dir(&storage_dir); + std::fs::create_dir_all(&storage_dir).expect("could not create data dir"); let mut rp = RustyPipe::builder().storage_dir(storage_dir); if cli.report { diff --git a/src/client/mod.rs b/src/client/mod.rs index bf5413e..bd2d609 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -458,7 +458,12 @@ impl RustyPipeBuilder { /// Return a new, configured RustyPipe instance. pub fn build(self) -> Result { - let mut client_builder = ClientBuilder::new() + self.build_with_client(ClientBuilder::new()) + } + + /// Return a new, configured RustyPipe instance using a Reqwest client builder. + pub fn build_with_client(self, mut client_builder: ClientBuilder) -> Result { + client_builder = client_builder .user_agent(self.user_agent.unwrap_or_else(|| DEFAULT_UA.to_owned())) .gzip(true) .brotli(true) From d78fa371e9f6f0246c9b731e8ad81abfc9a902b2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 4 Aug 2023 16:15:04 +0200 Subject: [PATCH 033/459] fix: handle navigation endpoints for shorts (reelWatchEndpoint) --- src/client/response/url_endpoint.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/response/url_endpoint.rs b/src/client/response/url_endpoint.rs index 01a9374..4477103 100644 --- a/src/client/response/url_endpoint.rs +++ b/src/client/response/url_endpoint.rs @@ -15,7 +15,10 @@ pub(crate) struct ResolvedUrl { #[serde(untagged)] pub(crate) enum NavigationEndpoint { #[serde(rename_all = "camelCase")] - Watch { watch_endpoint: WatchEndpoint }, + Watch { + #[serde(alias = "reelWatchEndpoint")] + watch_endpoint: WatchEndpoint, + }, #[serde(rename_all = "camelCase")] Browse { browse_endpoint: BrowseEndpoint, From 7fe3b0391c3d89c009e2d6455f995dd49edf8842 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 4 Aug 2023 16:33:58 +0200 Subject: [PATCH 034/459] tests: output invalid visitor data --- src/client/mod.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index bd2d609..d4e84ad 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1563,7 +1563,9 @@ mod tests { fn t_get_visitor_data() { let rp = RustyPipe::new(); let visitor_data = tokio_test::block_on(rp.get_visitor_data()).unwrap(); - assert!(visitor_data.ends_with("%3D")); - assert_eq!(visitor_data.len(), 32) + assert!( + visitor_data.ends_with("%3D") && visitor_data.len() == 32, + "got: {visitor_data}" + ); } } From dc7247ac14ab28428dd46f2b022dcb2eb8563d1a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 6 Aug 2023 15:07:34 +0200 Subject: [PATCH 035/459] chore: update regex dependency Issue was fixed: https://github.com/rust-lang/regex/issues/1060 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e1900b3..708866b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ quick-js-dtp = { version = "0.4.1", default-features = false, features = [ "patch-dateparser", ] } once_cell = "1.12.0" -regex = ">=1.6.0, <1.9.0" +regex = "1.6.0" fancy-regex = "0.11.0" thiserror = "1.0.36" url = "2.2.2" From dff95d12728daf2a5d8c0ce27013a57d891d0477 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 15 Aug 2023 16:24:05 +0200 Subject: [PATCH 036/459] chore: update email address --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 708866b..fb0549d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "rustypipe" version = "0.1.0" edition = "2021" -authors = ["ThetaDev "] +authors = ["ThetaDev "] license = "GPL-3.0" description = "Client for the public YouTube / YouTube Music API (Innertube), inspired by NewPipe" keywords = ["youtube", "video", "music"] From 6cf59a167a8e3d97d40f408419cf5ee0d9d86471 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 15 Aug 2023 22:37:55 +0200 Subject: [PATCH 037/459] fix: use visitor data for ordered channel videos tests: fix tests --- src/client/channel.rs | 5 +-- src/client/mod.rs | 11 ++++-- .../youtube__music_album_one_artist_intl.snap | 36 +++++++++---------- .../youtube__music_album_various_artists.snap | 4 +-- ...ube__music_album_various_artists_intl.snap | 5 +-- tests/youtube.rs | 24 ++++++++----- 6 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/client/channel.rs b/src/client/channel.rs index 7ec1be5..7091278 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -117,10 +117,7 @@ impl RustyPipeQuery { tab: ChannelVideoTab, order: ChannelOrder, ) -> Result, Error> { - let visitor_data = match tab { - ChannelVideoTab::Shorts => Some(self.get_visitor_data().await?), - _ => None, - }; + let visitor_data = Some(self.get_visitor_data().await?); self.continuation( order_ctoken(channel_id.as_ref(), tab, order), diff --git a/src/client/mod.rs b/src/client/mod.rs index d4e84ad..826919c 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1563,9 +1563,14 @@ mod tests { fn t_get_visitor_data() { let rp = RustyPipe::new(); let visitor_data = tokio_test::block_on(rp.get_visitor_data()).unwrap(); + + // First part of visitor data must be 22 characters + // Example: CgthVjBVUDJrd2Q3dyi3te-mBg%3D%3D assert!( - visitor_data.ends_with("%3D") && visitor_data.len() == 32, - "got: {visitor_data}" - ); + visitor_data.starts_with("Cg") + && visitor_data.len() > 23 + && &visitor_data[22..23] == "-", + "invalid visitor data: {visitor_data}" + ) } } diff --git a/tests/snapshots/youtube__music_album_one_artist_intl.snap b/tests/snapshots/youtube__music_album_one_artist_intl.snap index 69f594d..5314034 100644 --- a/tests/snapshots/youtube__music_album_one_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_one_artist_intl.snap @@ -22,7 +22,7 @@ MusicAlbum( TrackItem( id: "g0iRiJ_ck48", name: "[name]", - duration: Some(216), + duration: Some(217), cover: [], artists: [ ArtistId( @@ -43,7 +43,7 @@ MusicAlbum( TrackItem( id: "rREEBXp0y9s", name: "[name]", - duration: Some(224), + duration: Some(225), cover: [], artists: [ ArtistId( @@ -64,7 +64,7 @@ MusicAlbum( TrackItem( id: "zvU5Y8Q19hU", name: "[name]", - duration: Some(176), + duration: Some(177), cover: [], artists: [ ArtistId( @@ -85,7 +85,7 @@ MusicAlbum( TrackItem( id: "ARKLrzzTQA0", name: "[name]", - duration: Some(215), + duration: Some(216), cover: [], artists: [ ArtistId( @@ -106,7 +106,7 @@ MusicAlbum( TrackItem( id: "tstLgN8A_Ng", name: "[name]", - duration: Some(268), + duration: Some(269), cover: [], artists: [ ArtistId( @@ -127,7 +127,7 @@ MusicAlbum( TrackItem( id: "k2DjgQOY3Ts", name: "[name]", - duration: Some(202), + duration: Some(203), cover: [], artists: [ ArtistId( @@ -148,7 +148,7 @@ MusicAlbum( TrackItem( id: "azHwhecxEsI", name: "[name]", - duration: Some(185), + duration: Some(186), cover: [], artists: [ ArtistId( @@ -169,7 +169,7 @@ MusicAlbum( TrackItem( id: "_FcsdYIQ2co", name: "[name]", - duration: Some(226), + duration: Some(227), cover: [], artists: [ ArtistId( @@ -190,7 +190,7 @@ MusicAlbum( TrackItem( id: "27bOWEbshyE", name: "[name]", - duration: Some(207), + duration: Some(208), cover: [], artists: [ ArtistId( @@ -211,7 +211,7 @@ MusicAlbum( TrackItem( id: "riD_3oZwt8w", name: "[name]", - duration: Some(211), + duration: Some(212), cover: [], artists: [ ArtistId( @@ -232,7 +232,7 @@ MusicAlbum( TrackItem( id: "8GNvjF3no9s", name: "[name]", - duration: Some(179), + duration: Some(180), cover: [], artists: [ ArtistId( @@ -253,7 +253,7 @@ MusicAlbum( TrackItem( id: "YHMFzf1uN2U", name: "[name]", - duration: Some(218), + duration: Some(219), cover: [], artists: [ ArtistId( @@ -274,7 +274,7 @@ MusicAlbum( TrackItem( id: "jvV-z5F3oAo", name: "[name]", - duration: Some(277), + duration: Some(278), cover: [], artists: [ ArtistId( @@ -295,7 +295,7 @@ MusicAlbum( TrackItem( id: "u8_9cxlrh8k", name: "[name]", - duration: Some(204), + duration: Some(205), cover: [], artists: [ ArtistId( @@ -316,7 +316,7 @@ MusicAlbum( TrackItem( id: "gSvKcvM1Wk0", name: "[name]", - duration: Some(202), + duration: Some(203), cover: [], artists: [ ArtistId( @@ -337,7 +337,7 @@ MusicAlbum( TrackItem( id: "wQHgKRJ0pDQ", name: "[name]", - duration: Some(222), + duration: Some(223), cover: [], artists: [ ArtistId( @@ -358,7 +358,7 @@ MusicAlbum( TrackItem( id: "Ckz5i6-hzf0", name: "[name]", - duration: Some(177), + duration: Some(178), cover: [], artists: [ ArtistId( @@ -379,7 +379,7 @@ MusicAlbum( TrackItem( id: "y5zuUgyFqrc", name: "[name]", - duration: Some(220), + duration: Some(221), cover: [], artists: [ ArtistId( diff --git a/tests/snapshots/youtube__music_album_various_artists.snap b/tests/snapshots/youtube__music_album_various_artists.snap index 59714e0..0a335da 100644 --- a/tests/snapshots/youtube__music_album_various_artists.snap +++ b/tests/snapshots/youtube__music_album_various_artists.snap @@ -126,11 +126,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: None, + id: Some("UChm_d4qO8txdwS4YadlvpSw"), name: "Brave Girls", ), ], - artist_id: None, + artist_id: Some("UChm_d4qO8txdwS4YadlvpSw"), album: Some(AlbumId( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", diff --git a/tests/snapshots/youtube__music_album_various_artists_intl.snap b/tests/snapshots/youtube__music_album_various_artists_intl.snap index bff7311..8f3c587 100644 --- a/tests/snapshots/youtube__music_album_various_artists_intl.snap +++ b/tests/snapshots/youtube__music_album_various_artists_intl.snap @@ -1,5 +1,6 @@ --- source: tests/youtube.rs +assertion_line: 1396 expression: album --- MusicAlbum( @@ -126,11 +127,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: None, + id: Some("UChm_d4qO8txdwS4YadlvpSw"), name: "[name]", ), ], - artist_id: None, + artist_id: Some("UChm_d4qO8txdwS4YadlvpSw"), album: Some(AlbumId( id: "MPREb_8QkDeEIawvX", name: "[name]", diff --git a/tests/youtube.rs b/tests/youtube.rs index 0f448de..cc2f1c5 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -978,15 +978,10 @@ fn channel_more( } #[rstest] -#[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos, "XqZsoesa55w")] -#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts, "k91vRvXGwHs")] -#[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live, "ojes5ULOqhc")] -fn channel_order( - #[case] id: &str, - #[case] tab: ChannelVideoTab, - #[case] most_popular: &str, - rp: RustyPipe, -) { +#[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos)] +#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts)] +#[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live)] +fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: RustyPipe) { let latest = tokio_test::block_on(rp.query().channel_videos_tab_order( id, tab, @@ -1007,7 +1002,18 @@ fn channel_order( } } assert_next(latest, rp.query(), 15, 1); +} +#[rstest] +#[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos, "XqZsoesa55w")] +#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts, "k91vRvXGwHs")] +#[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live, "ojes5ULOqhc")] +fn channel_order_popular( + #[case] id: &str, + #[case] tab: ChannelVideoTab, + #[case] most_popular: &str, + rp: RustyPipe, +) { let popular = tokio_test::block_on(rp.query().channel_videos_tab_order( id, tab, From d8e3841fb695ef760a950d30841272665d960737 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 16 Aug 2023 01:37:20 +0200 Subject: [PATCH 038/459] feat: add channel videos sort by oldest --- src/param/mod.rs | 2 ++ tests/youtube.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/param/mod.rs b/src/param/mod.rs index 60060bc..884a8c9 100644 --- a/src/param/mod.rs +++ b/src/param/mod.rs @@ -29,6 +29,8 @@ pub enum ChannelOrder { Latest = 1, /// Order videos with the highest number of views first Popular = 2, + /// Order videos with the earliest upload date first + Oldest = 4, } impl ChannelVideoTab { diff --git a/tests/youtube.rs b/tests/youtube.rs index cc2f1c5..6b54b00 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1041,6 +1041,39 @@ fn channel_order_popular( assert_next(popular, rp.query(), 15, 1); } +#[rstest] +#[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos, "P2gDffkC0rY")] +#[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live, "aW43RH1kQ70")] +fn channel_order_oldest( + #[case] id: &str, + #[case] tab: ChannelVideoTab, + #[case] oldest: &str, + rp: RustyPipe, +) { + let videos = tokio_test::block_on(rp.query().channel_videos_tab_order( + id, + tab, + ChannelOrder::Oldest, + )) + .unwrap(); + + // Check oldest video + assert_eq!(videos.items.first().expect("no videos").id, oldest); + + // Upload dates should be in ascending order + let mut latest_items = videos.items.iter().peekable(); + while let (Some(v), Some(next_v)) = (latest_items.next(), latest_items.peek()) { + if !v.is_upcoming && !v.is_live && !next_v.is_upcoming && !next_v.is_live { + assert_gte( + next_v.publish_date.unwrap(), + v.publish_date.unwrap(), + "oldest video date", + ); + } + } + assert_next(videos, rp.query(), 15, 1); +} + #[rstest] #[case::not_exist("UCOpNcN46UbXVtpKMrmU4Abx")] #[case::gaming("UCOpNcN46UbXVtpKMrmU4Abg")] From 57628d1392e0a4268d74935a05258dd274631dc8 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 16 Aug 2023 01:52:39 +0200 Subject: [PATCH 039/459] fix: adjust deobf helper object name regex --- src/client/mod.rs | 6 +----- src/deobfuscate.rs | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 826919c..ccb3020 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1564,12 +1564,8 @@ mod tests { let rp = RustyPipe::new(); let visitor_data = tokio_test::block_on(rp.get_visitor_data()).unwrap(); - // First part of visitor data must be 22 characters - // Example: CgthVjBVUDJrd2Q3dyi3te-mBg%3D%3D assert!( - visitor_data.starts_with("Cg") - && visitor_data.len() > 23 - && &visitor_data[22..23] == "-", + visitor_data.starts_with("Cg") && visitor_data.len() > 23, "invalid visitor data: {visitor_data}" ) } diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index bc731ee..33cb494 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -152,7 +152,7 @@ fn get_sig_fn(player_js: &str) -> Result { + ";"; static HELPER_OBJECT_NAME_REGEX: Lazy = - Lazy::new(|| Regex::new(r#";([A-Za-z0-9_\$]{2})\...\("#).unwrap()); + Lazy::new(|| Regex::new(r#";([A-Za-z0-9_\$]{2,3})\...\("#).unwrap()); let helper_object_name = HELPER_OBJECT_NAME_REGEX .captures(&deobfuscate_function) .ok_or(DeobfError::Extraction("helper object name"))? From e2eda901b17d69acceafc28d3a28119b689df25a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 22 Aug 2023 22:58:28 +0200 Subject: [PATCH 040/459] fix: add support for new channel about data model --- src/client/response/video_item.rs | 39 ++++++++++++++++++++++++++----- src/serializer/text.rs | 33 ++++++++++++++++++++++++-- src/util/mod.rs | 4 ++-- 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index d030ed4..3283f42 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -14,7 +14,7 @@ use crate::{ }, param::Language, serializer::{ - text::{AccessibilityText, Text, TextComponent}, + text::{AccessibilityText, AttributedText, Text, TextComponent}, MapResult, }, util::{self, timeago, TryRemove}, @@ -369,6 +369,9 @@ pub(crate) struct ChannelFullMetadata { #[serde(default)] #[serde_as(as = "VecSkipError<_>")] pub primary_links: Vec, + #[serde(default)] + // #[serde_as(as = "VecSkipError<_>")] + pub links: Vec, } #[serde_as] @@ -380,6 +383,22 @@ pub(crate) struct PrimaryLink { pub navigation_endpoint: NavigationEndpoint, } +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ExternalLink { + pub channel_external_link_view_model: ExternalLinkInner, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ExternalLinkInner { + #[serde_as(as = "AttributedText")] + pub title: TextComponent, + #[serde_as(as = "AttributedText")] + pub link: TextComponent, +} + trait IsLive { fn is_live(&self) -> bool; } @@ -726,6 +745,18 @@ impl YouTubeListMapper { self.corrected_query = Some(corrected_query); } YouTubeListItem::ChannelAboutFullMetadataRenderer(meta) => { + let mut links = meta + .primary_links + .into_iter() + .filter_map(|l| l.navigation_endpoint.url().map(|url| (l.title, url))) + .collect::>(); + for l in meta.links { + let l = l.channel_external_link_view_model; + if let TextComponent::Web { url, .. } = l.link { + links.push((l.title.into(), util::sanitize_yt_url(&url))); + } + } + self.channel_info = Some(ChannelInfo { create_date: timeago::parse_textual_date_or_warn( self.lang, @@ -736,11 +767,7 @@ impl YouTubeListMapper { view_count: meta .view_count_text .and_then(|txt| util::parse_numeric_or_warn(&txt, &mut self.warnings)), - links: meta - .primary_links - .into_iter() - .filter_map(|l| l.navigation_endpoint.url().map(|url| (l.title, url))) - .collect(), + links, }); } YouTubeListItem::RichItemRenderer { content } => { diff --git a/src/serializer/text.rs b/src/serializer/text.rs index f8d070d..f76e1a9 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -200,8 +200,12 @@ impl<'de> Deserialize<'de> for TextComponent { where D: Deserializer<'de>, { - let mut text = RichTextInternal::deserialize(deserializer)?; - Ok(text.runs.swap_remove(0).into()) + let text = RichTextInternal::deserialize(deserializer)?; + text.runs + .into_iter() + .next() + .map(TextComponent::from) + .ok_or(serde::de::Error::invalid_length(0, &"at least 1")) } } @@ -289,6 +293,20 @@ impl<'de> DeserializeAs<'de, TextComponents> for AttributedText { } } +impl<'de> DeserializeAs<'de, TextComponent> for AttributedText { + fn deserialize_as(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let components: TextComponents = AttributedText::deserialize_as(deserializer)?; + components + .0 + .into_iter() + .next() + .ok_or(serde::de::Error::invalid_length(0, &"at least 1")) + } +} + impl TryFrom for crate::model::ChannelId { type Error = (); @@ -404,6 +422,17 @@ impl TextComponent { } } +impl From for String { + fn from(value: TextComponent) -> Self { + match value { + TextComponent::Video { text, .. } + | TextComponent::Browse { text, .. } + | TextComponent::Web { text, .. } + | TextComponent::Text { text } => text, + } + } +} + impl TextComponents { /// Return the string representation of the first text component pub fn first_str(&self) -> &str { diff --git a/src/util/mod.rs b/src/util/mod.rs index 363d48d..5a6b82b 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -224,7 +224,7 @@ pub fn retry_delay( /// Also strips google analytics tracking parameters /// (`utm_source`, `utm_medium`, `utm_campaign`, `utm_content`) because google analytics is bad. pub fn sanitize_yt_url(url: &str) -> String { - fn sanitize_yt_url_inner(url: &str) -> Option { + fn try_sanitize_yt_url(url: &str) -> Option { let mut parsed_url = Url::parse(url).ok()?; // Convert redirect url @@ -260,7 +260,7 @@ pub fn sanitize_yt_url(url: &str) -> String { Some(parsed_url.to_string()) } - sanitize_yt_url_inner(url).unwrap_or_else(|| url.to_string()) + try_sanitize_yt_url(url).unwrap_or_else(|| url.to_string()) } pub fn div_ceil(a: u32, b: u32) -> u32 { From 93e5ad22e96ac1fcadb9d9ebcbacbaae42f4d059 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 22 Aug 2023 23:35:07 +0200 Subject: [PATCH 041/459] feat(cli): add vdata argument --- cli/src/main.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index a79b12a..e14607d 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -22,6 +22,9 @@ struct Cli { /// Always generate a report (used for debugging) #[clap(long)] report: bool, + /// YouTube visitor data cookie + #[clap(long)] + vdata: Option, } #[derive(Subcommand)] @@ -391,13 +394,14 @@ async fn main() { let cli = Cli::parse(); - let mut storage_dir = dirs::data_dir().expect("no data dir"); - storage_dir.push("rustypipe"); - std::fs::create_dir_all(&storage_dir).expect("could not create data dir"); - - let mut rp = RustyPipe::builder().storage_dir(storage_dir); + let mut rp = RustyPipe::builder().visitor_data_opt(cli.vdata); if cli.report { rp = rp.report(); + } else { + let mut storage_dir = dirs::data_dir().expect("no data dir"); + storage_dir.push("rustypipe"); + std::fs::create_dir_all(&storage_dir).expect("could not create data dir"); + rp = rp.storage_dir(storage_dir); } let rp = rp.build().unwrap(); From 22e298ff98964de53c51d950fdd04aa09e457308 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 23 Aug 2023 11:28:00 +0200 Subject: [PATCH 042/459] fix: a/b test 8: parsing view count for tracks --- Justfile | 3 + cli/src/main.rs | 4 +- codegen/src/abtest.rs | 16 + notes/AB_Tests.md | 20 +- notes/_img/ab_8.png | Bin 0 -> 13967 bytes notes/_img/ab_8_old.png | Bin 0 -> 13453 bytes src/client/music_search.rs | 2 +- src/client/response/music_item.rs | 277 ++++++++++++------ src/client/response/url_endpoint.rs | 23 +- ...__map_music_search_suggestion_default.snap | 5 +- src/deobfuscate.rs | 9 +- src/model/richtext.rs | 3 +- ...text__tests__t_attributed_description.snap | 2 +- src/serializer/text.rs | 10 +- tests/snapshots/youtube__music_album_ep.snap | 10 +- .../youtube__music_album_ep_intl.snap | 10 +- .../youtube__music_album_no_artist.snap | 9 +- .../youtube__music_album_no_artist_intl.snap | 8 +- .../youtube__music_album_no_year.snap | 2 +- .../youtube__music_album_no_year_intl.snap | 2 +- .../youtube__music_album_one_artist.snap | 36 +-- .../youtube__music_album_one_artist_intl.snap | 36 +-- .../snapshots/youtube__music_album_show.snap | 28 +- .../youtube__music_album_show_intl.snap | 28 +- .../youtube__music_album_single.snap | 2 +- .../youtube__music_album_single_intl.snap | 2 +- .../youtube__music_album_unavailable.snap | 24 +- ...youtube__music_album_unavailable_intl.snap | 24 +- .../youtube__music_album_various_artists.snap | 12 +- ...ube__music_album_various_artists_intl.snap | 13 +- ...outube__music_album_version_no_artist.snap | 9 +- ...e__music_album_version_no_artist_intl.snap | 8 +- tests/youtube.rs | 12 +- 33 files changed, 389 insertions(+), 260 deletions(-) create mode 100644 notes/_img/ab_8.png create mode 100644 notes/_img/ab_8_old.png diff --git a/Justfile b/Justfile index c2f3fdf..4628423 100644 --- a/Justfile +++ b/Justfile @@ -7,6 +7,9 @@ unittest: testyt: cargo test --features=rss --test youtube +testyt-localized: + YT_LANG=th cargo test --features=rss --test youtube + testintl: #!/usr/bin/env bash LANGUAGES=( diff --git a/cli/src/main.rs b/cli/src/main.rs index e14607d..3bef694 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -20,10 +20,10 @@ struct Cli { #[clap(subcommand)] command: Commands, /// Always generate a report (used for debugging) - #[clap(long)] + #[clap(long, global = true)] report: bool, /// YouTube visitor data cookie - #[clap(long)] + #[clap(long, global = true)] vdata: Option, } diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index cc9491a..b9d7f09 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -24,6 +24,7 @@ pub enum ABTest { TrendsPageHeaderRenderer = 5, DiscographyPage = 6, ShortDateFormat = 7, + TrackViewcount = 8, PlaylistsForShorts = 9, } @@ -96,6 +97,7 @@ pub async fn run_test( ABTest::DiscographyPage => discography_page(&query).await, ABTest::ShortDateFormat => short_date_format(&query).await, ABTest::PlaylistsForShorts => playlists_for_shorts(&query).await, + ABTest::TrackViewcount => track_viewcount(&query).await, } .unwrap(); pb.inc(1); @@ -246,6 +248,20 @@ pub async fn short_date_format(rp: &RustyPipeQuery) -> Result { })) } +pub async fn track_viewcount(rp: &RustyPipeQuery) -> Result { + let res = rp.music_search("lieblingsmensch namika").await?; + + let track = &res + .tracks + .iter() + .find(|a| a.id == "6485PhOtHzY") + .unwrap_or_else(|| { + panic!("could not find track, got {:#?}", &res.tracks); + }); + + Ok(track.view_count.is_some()) +} + pub async fn playlists_for_shorts(rp: &RustyPipeQuery) -> Result { let playlist = rp.playlist("UUSHh8gHdtzO2tXd593_bjErWg").await?; let v1 = playlist diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index f4294cd..745b1e1 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -293,7 +293,7 @@ The data model for the video shelves did not change. **NEW** -![A/B test 4 old screenshot](./_img/ab_4_new.png) +![A/B test 4 new screenshot](./_img/ab_4_new.png) ## [5] Page header renderer on the Trending page @@ -371,20 +371,32 @@ visitor data cookie to be set, as it was the case with the old system. **OLD** -![A/B test 4 old screenshot](./_img/ab_6_old.png) +![A/B test 6 old screenshot](./_img/ab_6_old.png) **NEW** -![A/B test 4 old screenshot](./_img/ab_6_new.png) +![A/B test 6 screenshot](./_img/ab_6_new.png) ## [7] Short timeago format - **Encountered on:** 28.05.2023 -- **Impact:** 🟡 Medium +- **Impact:** 🟢 Low YouTube changed their date format from the long format (_21 hours ago_, _3 days ago_) to a short format (_21h ago_, _3d ago_). +## [8] Track playback count in search results and artist views + +- **Encountered on:** 29.06.2023 +- **Impact:** 🟡 Medium + +YouTube added the track playback count to search results and top artist tracks. +In exchange, they removed the "Song" type identifier from search results. + +![A/B test 8 old screenshot](./_img/ab_8_old.png) + +![A/B test 8 screenshot](./_img/ab_8.png) + ## [9] Playlists for Shorts - **Encountered on:** 26.06.2023 diff --git a/notes/_img/ab_8.png b/notes/_img/ab_8.png new file mode 100644 index 0000000000000000000000000000000000000000..42f426b397a292e8eb8d3716fdd4f1519c3f7eca GIT binary patch literal 13967 zcmY+LWmJ@JwDt!C1Q8q>lp0zY8l(m3?(UYB?h;3kmhR>c3?b4Xjetl=cQ=SMNS~W` zz30PWErky-^UQwszV^O;`+mYyl%#QSP(x%T-fDOm?Jsx+X-u^69Uky+CGAvKSNkVhdLpq=)zJRK zEH0MFGmH2{dK4x`xFJj!S(utaifJZJpI7`d0v{dy>8tS1K{9x;i}e?r{*Hnh7rk^R zbMR8LK3}?nfV(vQ`hl76o~^D!jTZsWXb?ezR@MH2PFtwygI3p$f4-Sj&$Pbt(5alU zU*Zxho3^hzNTtxSe?51huxkKu>T*wB@I4r=!mcvFg{{u-xzN27N5d{mB^JkIuKEbY zg254x0R$8i0*UKG3xWo_;^ISx;GtcnsUeWRr;YJp5^&h7l35)2jbQoD*h759sJi5E zG*VM&FbXE(3p6MN5-ExaMTMZ@qr&Lm2roW-U(1=}XRqyVdc)`J>$t>7$`kLec4EF; z_M=E9qsM6^e}Kz&>Ocs{%_BLaFtK0=D5<$D4K)JZU#Vk&NsTa(jnmL%!dJ7*Op{5n ztd}pE$CpWI>c&}tNO`HnJR%NyNutn+MjMIV8BEX5Hyekenx>?J`W#QoWvCUWh?EO0q#!A6HdY(M13DnK0VeOc( zNCY&4;}=U0vXGIUMxQ}5O#KnrgB)vvQiX2_n8x~e{8PF}h#*wz zCnvu+(hCL^3*0+}E-PR{KH%X8eOktZi5gHtM8!S_memeg397r1X*C}N7)VyS_a=52 zgwg(~LZd}+{8ETFjpRuBg5c=P;Oa@Sd0xK1Uj@HzMxmvAZ&x14&C{)?Un^0STiE(v z?n^;NMmEOB?3MHU{2P{O10Q9&RpZmrUb=pX!Cv|U>{r7Sm7E=e!valT#3M#fhnL})9G<_e{T1erwgOB*FV{Ckw$it~h%jN<_uVxIp zw@x_~aa=`%2ou>&v4-d(Nt4*$>d;7tVc}Hs)sx1ucVeP#iA`rxr|&mxB?`Zt?G$t}L?pNjN=_>&p$&bF;e*|xK=F*QJpROxCwvL2i^>N~VR{to&85GI> zv#QJq0pVcaGl9VPq*2|yZRSD!VKqHrmQXWz6OBONRlD`zG2o^$aVB9>FQdYup;DxL zPLGLxtl2u+OxM|IyK=f+{|I~Z>pQw1rPa5P+1=f%$tx!zO4%o2YfmfWkJ$U!xudp) zCMnN}HYr7X3RVwe@A5{XQ zCd5(|27%E)xci-cMawXS2Sp2g=lyTRNk1`%16P)2Eb^(eQeiI(o+;@E(I6&#Rl1nr z2rO9D0G5jYd19zCgP3YC)*88~NzzLQ#}I@M6Pke~#Zg6$5TNUasTN64;A_)QHZB@( zeRxcnlMwx!r^GzBYo)lX>}K$Nz*yzC_@<_&7?HaM_1xaI+yqv`CPGLE&I@APP`1YP zIHkRt2wPiQy|w`VEw%Lh8ut;sTp-7$sfCD2x_&em+H_TeV=9(-QRF2`e_SvWwZo8l zPYg52s6}qVuR`WW3OfN@4E@Q!mhjc3Cij>!nIHR~)gs6W9d#+Q>s$YuSUY=efaX#y zK3G0TR7?NpTFvy8s9Qg3BoijODMSKYtkbPD$PZs>;W;A|bs2fR)ymbQqo}B8XJ@yC zz9hk!T2@vT*=?3dGHrj)=#Hng>dZoHtK382DCu0PBthrM@l^mvHoQANn5$@4LPu`F zp@QR4o>&m(I))!)+4Ez_=Ut~OgP`_NRSzvCb9J>snp6b=JWeEie--nxtAK&hLiiTC z{`1|^3#$H?FD*EEIhasggP#tO(vZ@A_$HCEBtKt*Ku}YofyQvVf7EmEtE!B{yvL38 zHUyVa$m@LOohNJU%w5H99>EWmuk@!9eE5!z4tCb|UyDol-MHr|t%BSmI8ZQ6(J-OJ zs92$SuGKph-K~oHaH+G;h321p7HqYW>T^WR71$R`^($v6oz)Qy>~OBPP4N?zP6&O537qAmWrm{X)!hA~=)9Jl8A^Z7WZv)|HGG@;AgtuXFQ|Pzw=

    YKLV zy^~kCWVGz=yJ{_zp}j9l`CB8OCM(m#4Z#`sFbYgWb3H_b+J@UR^;^B1`+iLs>%AMV z*WY&@i_1jm-b(a21p@Sr#){Jl@0VSv-3=?1dGp&C-B>T`Wu%Y_o=ur&F*%cYNf;@8 zf~zBJC`eb7|uSY(^ri1b@)#)cSEKu7%$IDbl|kjDLzi_5hm7@aa^t8pt!oe&*%x?5U-`{K2IUmX2o zT=Itfx;ZtwtJ^ysyGd%q--fkl5bT?yUaGd6<9_uB*5*U8qOr?A)x%eQt(N^s3$DY$ z!$Kzmi!HwIzwg&+6#Fa#Z3y_cQoj`73*M$H^jY9q6t5bu@T2zmM%N{;wWz2UyhhI5 zM4t1`k0FsScpZ;cyR!qXc20N3EOi4wavYzW;EBC&KI&<3UL%I+3<3iKIchAtSl~X0hrX2>zp-+qFlK({{8P{w3>BHopA0Iz^2&vUz+S&Qs z`{7JM5(u}V@9Bv2^~FKqj@{H(cY(|iYqy_YU=Vie-_#JVzl~dU;MF}37W-Mh z53D$WpxbW$&aHko9IzV32%%>J?_Lyej-_V+(_snStndfEIK~o3~Wc;d56lvF2-O5O5Y9ik?<>8 zedbyjwIhDnb{qp{)~5kRy6#U4VQ9JOBn}U)2xzC&((YH?;M>__+RHak5;0j2?U;Nk*)>&te5V{y>68 zM@LTuik^HDLnh{rFhLp?{u;ITpom_%sL{mAv`n`J-fs@32cD!afoj=V@LV#iv)2W; z#5T6j21$YxRoB*j42hLNgESkxmz9;JhNf`as0loM8#-H8U;ikm(5BGFM~D*Qbu!3% z0K^LDW8lA)(1YfaArP+@QBrJ8+cc1Wpn}x&|67%j+xn|xUj&dnBfXBDLavL?wJOE z$)KF&ce#~+Wp%v>nr*SAStS1>79Isn*1+$z zv?Q{h?WFH4(Dc%t6NGuab@X88;vy2vKnZ;t_sV0p=>v)&0?w?EWT~l%1&efz{=GE! zYUxjezX0g6n2>;2+HG z-w_qB@WjMJp4!;i z?KLkhDW<a@vx;5l~wNq52ka|2S&lW``a(B4W1!4C(Tpnkvfi^Ey|_31p{uO4WJPURCv)0N(=>i10&wU1sS@=b-4c80&f3Gh}=uEldFRrm__&_}G%%U8!=F1ExVDBU~N8q7C5XH-pTt^ofPnSBQco+G6PPfPR($dmEcPJoX(XFzW zEYk&@_wQ6iHq>l$AQhX0^=9E9;4$R(>P)}I=WHlbut+(ZGNRiENZzSd(b|}@$U^=5 zrQ3_8gEOB6$BUT2n>7t@KJwPJXu+$qy$hf$&nN^4A+7&bBLb(7<=J~ShqLd0i$80* z{`>u*i0G3IIQ{+|j(6vlF5gK8YUIPuRI!%aKno!r}0bx=BbG{0$SA5_%q%apIrD zK3nB%VBmCV9FF~HYyLrE`dg5ln6kALJ0n+!cM79IWY>z5k_W5SMm(bu@#ZG6`(6*f z-LqN~8rir48GMzeGWbE6O1w1Wut*M6$dI>fLQ*=zJ0xXC{ZnQnGwsW4zhl|nZ=;Kg z0e$qzLRZ`QKw6dP@Igb+vxO5tKu8HGT-$>PCmXn6ncEL%2~Qb%E>r~G?)@j9{QC9lH>bbF*+8S-ib7dVP=Z2kR-Og6 zlP-D8Iei#Q4Ajy6-aFLoItw}*NB z@=7|3;zm1ZVwNVJhuOIAZyAcL%$G9$B*z*E`-0Yk|2CtjYAzUJN-C?UynDpX^Av#< zTj0ugx6c|Ahy@y9MQLe%0%|+38$)ld|Cq2(d()@yF9BpkWVVZsiW}?_&0&@SLB$Bd zOX9$nP$QCD9gvei=P6c-FJB=~b{&p=^oeY3H)s;^%J;EPG3tv1%MB9y*_MTDU9@2K z-#n=jH7cS<0xgc&%G@=R8;#iMo#kaMnyTa)CfReyy+R2(FoKZNE(`HU{6at@_0lML zd7>U^6|mX{FzDCXY6?*rgKE%ym&xPtXWC8hr`7evSoc|iOaTjV#I{~WszB}2ewp3A zhQe-SY66}+hx(5$y_$vJ=7mHNJXA+b{PZ-YZzUybCp0pX(_bh{)#!|8tJZi1n#-pz zdYZKLgxETgH5Jx|(xP@>ox@MBD|rQ>6YwD&@rJ>T6R&wkLtgfdBuiio8z4RC|BbUN z#=A;kIyd>@Du?VI|1A0L+A?g<^=^nz>}Hd`+%l@gUUa;!t;v5 z#kJ_#B`}wXEkC<3V7kB*#8_Aucw5K698m|)TAyDT(@%Vnn0XCIVD?WN6aw4A0;{MG}O5Oda2G zu_=7}B_|=R&_<5|Ga8FV;`kjJnR&u!V2?lZy#}bAJ}?*xB+uI4M*}3sgdg`=6oHZ_ zqk{=Yq>2*0{E4rnfGw-Ee#8gOD^aK#4^B(_=6Ia)^^>@BnSK)G6#loZ6Y;^^64R}7 zCRXO@`g;>0ybB+8-nmMJwJ;eQ-K@TWO&un#;p{{TzO7CU-OEO$85r~}sctYqi9A=`Pit4Dk&D36E8NKnniEYJy5&`{-782Fr6 z_ENJ;X z_PvZrWNdDJTF=n8rlFv{R1`i6f85O4HpQ)AsKctOxQj)`F4m6D4kiB}`k59B?-PfW zZlqoU*KFhB>-7DB-vCo!{#bJ4e-vh-8yhCUM-*ZTi-gjINzCIn5%fvH|Hev0j`fKM zy{C>6XLvtT^`D&Yp+Mw`%V zyKT~s`1Pxa`lTaMmM$)YO|ZI(eiaY5vD|R**JwwwcG7)E-I~KlL45I@Xb4-%2aeaI z=3uNK(yfDIo73H$YCWZ#A<12dO1GcWWI*0D{T<1#jWw0%I>vWY4iKZpRPU=y!Gd-Pt_bL-rEp% zBBd3x#|+ab28P)vMk}^H!&+tRejd2YJKyFQEpS$Lz0Gq@rS03N)_|g*1;Ik_*n1G7 zq_RPn8>mjU#Lpt>6PcFOJBiW<&;4nO-c)4cjZD~5v)hrI^14uW%1V4 z7m{^yDmY=dW_atm7&(U#$As#4CMKRm=9gs%6?JugGQmfft9E>X_XAhc7jCJGW-c42 z<~cgWT; z@k5;dzYn*MalbTtCG)YmSma+g`S@Y^3uWqmx_M1aL=C};%0Fy>4qlL8Jh^Y$jcA(n znh5*-bwL_s^^6E7g1Fi9RL4C;S_^rz8_}*a-s3S<4GnIG z*&2j& z1R#t9PuANaFusDB&iz$tfBnhA#o@uqX8L=;rVei|PjI?Y0Ik}u zUup%TLNqfVH|FPmX24fuWpqq=447>}Sc$~`-QKBFO&m~OW61Fc;marej1c?kq_&|u=ShK+V&1&2#;T6P$SmxizwNyJX)_Q?}Re~?=G3O%J|&2e*+Ts zfCV%rBce4l4eK2jSnB81)YZo-GoZ)7EG`CI?^9qahtkOc7?%0Q|LXdnZONM~Xly4# zz}>cY#=IwzOkG#E(RQL_cXyY>$P2|hL+;`+Bv<9Wh-#=)SNOq^SLBO=BRo%kLA1^FS{>H}sTx>42``widOO2udI_908PEuRkzM&x=D!c;I0vw5 z!Kn*}D)7d+x7ijF1Wgn2KK>C#a2s$RM!*QF%0N?d!--F;Oy_7dg3ZY9sGFakAB_E8 z08#-f#rfb+XorxOZj@fjAL{DrL~eJKDLlOv+@}l!E;j%LG!_@{`excysF13rp)o!` z-|TmJto-J(U@Z+Iig|Q>i!5_AE(I(DFt7Wgm_YIxw(bT#?_I3*nuy}c;oM* zq%_p(f8DwAEsqJ<9x9Xv!U=@OTuVy}u*^7m`DjXEpEPMK2rHm%%oWXQstI7U6#<2K z=B4FF_&Qo=v^8w9FLpb^%b2 zQ7J=a|1wUVwejw1Pg8TD#%2sS_ob;^!W29NGozcPX+lT0Qz#W!W!~@cr3&x@ugtsPHuj0csJLVogbmz!@+Y4J{yu54FPAWLHY^H} ztSxZdC4LudTPQd-Q>uKiiRtH7kg4C)o}1sdUWpOK)X2}@;n;|-0sZ-tOt?y@BY(JJ z_G&0(82cjSA>)?pVy!1lj_?UV{&^r>*BJUX)?^+r!DOG#un>;hbu9{=hI!!L<|fJZh-l!ud4$V`2yJCY*5q5!k>gZ z{HL9@AP{1nhqC~GrXMijMcciIhK6e^YID?f~4qZ@UEwTdmH2A($o-co)Ie zI?b`aW&@nLmWRjraKL$WFQu=2=L4@%kV(AQo2qDP@&RxW{E*G>Y6V_Q#PQ%(C_hSO`ve>Ney{D$t~;FQfiNDe^#)${8yB|e z8T%##9Dby_ISdssXmDD2^i1eWYHI2b2@gO&ierC4#{{f*D20QTN3$Jd9VaIzAOzJW z9l?NiiX`&;{myv{QhPZ4eJj7+WEnuk_s7X?ZjA;I>i%QU*B>zQyDaZbkh-##Uw5|q zao+<#C&}ElB;tL%{!HZNi|Y{S14$a45oyabVQ+BT8BI3wK^nIOWG4HE#l^)%ur_Uj zdN|P8c4-vY{4PU>j}#$;Sm@qu=f_Azlc(O1JOF6W&PS7lJ_%a?&MC_B*{z#%EG;X` z5cG5`vg0w#x=-hQPswTVxuoO)&6p^TfvCHVNRlX~u$wM6dn0e&g4yFwLv{jK35Y@! zCAum4c5% z)1@yiJlXmLivmsU#0}LqDw|ggzWCqet#;<{1sq!!H-$;!d%v-wpB1ky$Iv!Qpncru z@-bT_9+N^|VT_YpPKjFFPTt=8n)b04AJ->^R3a_{Jj0kBz0vXb%sqb}QgitvIGIR* zA4oBQqyxa8hcfuD&-d*d9gV(wIH;}pTSN9UAF&1oe z$6RoCs$vO1-fW*;?|PB0%P31AS}-QnwskL?=s!BdXFm-esHWx__!P2n30FLujz6 z%u1X#ekCH;JC^hSpP$=LqC>u4YRyb`M~86(c?O@gwx-4nesH=$B32*|at{zLoGuwd z*Ps3Udt*hzVC6;E@6xL{3b4J3zCHlN$#7k;)e)qKVjaFW{O;jAr0!}0x{E!yKarK4 zot=e+g|yPq0IIU-)ohO!^197namF1D{IT!gkNy0L-xBUEY*fxMt}&&P@gkCE>QkJS z=|!t>czC;|zsI&$$ndXMB8-*yCYSB5dv>;i!@OtDIeh$3!V$LTx_7ReW|j+&3LVoz z`gbn+x?6w55;QLKS1ptjRk+=<&{c|h zQ_$8#R9VN3sj7BO{0|Mb_Wps zi}Rir?+4O&O2MrKx_I+%Ek^y4J0d(>?NU_TSBX9oE(hDC`e99}=?G$2T#(Yv3}3fO>lVndY$g`9))O9V{AR zKt~3^NkdIvZ;E)MC^@!IrUGa8dOk5; zP=-&`c0Y1dQ}yf)d{g6jJC~T~yE?LtGsaM1T)iu?u~HT+lp1$#(Yf!wEjvb2$Tmh0 zA;X&cKAkxyoQVBnyRR^9pvWaAl>GX8~%+~k67MMFb_`R>kp zG;=>78M)%2N*R343r+5j-vDAhu;9vG%DF~Y#{X*8YP)JKPqsW+1%#6+!P0}vY;dsB;EI~7JR8`-*CM&%%e(wevP0X7sYbmLR)uz^0gH+ag z+c-LRz5V{7`@wYH;SB!j=4OMW4Ir%$QGb7b+iAP$Z>DY63kP7T^4zsnCCSWrLvQ(s z-}_B{@4*qtIx(Tu7Mfq{O<6|sAIRIu#;y?bM>C>1g}JRY4au=NC6)sCgQ+M>m+F59 zf_ija4{F4sqQpk8*WdA5>lc>~Cy3OK_Y#zsyEjd+(DKzNgE}*v=bmFO8EX6UE7SL! z_-rR$-QY=xs1g~UCQ5gZe!_O2j$}&wOZ8)5lm>?P zrFvn3JO)@KgK)+(DnEfW*?-Jn7`g=UOky?k>1U}2bqr|-C{)wfxXoeiwcJbCx?P}x zlCgtBIlP}Wnfa_6921bM*Aj?kINu)0&&`G1p1X}tO(iEJ6mUH*+!F#f5ll4?pdWNC zAS!>C+5(GO*OO)G@Bu1eWMtHw2nh*s;+waGqCs?%9(X`Yh zw&E0gPC1}KELZ}aFD@*u3HEpce2QO>R=m$9z*#vvXxTdPZlU@66r=x_l>5PmtIBW( zzf!aRSST~qwQkL(1#=QnBDT0Xk=to|tmA?_wr_@INmf;We<%*c@-r)jGYdGG77?NC zdvw{jSosKvX1$SU+`UVGEfRWr9O!wT~ zNiox%eDHgU=~@~Zpjpg<%N&>KovpP44b>M+avK{Pz-K6u82cS*E4)6eRT#6kwQV|^ z)b9rd-hJ;iSiyjPTj1d}p{Wgi*L`t08`;>{Xx^?^oBOnDy2?`C)O3Ys%0OL5htGXi zL(Zn8@ApVg)Qg8xE8vz}9G7B{v$dR#0!K(lLh?}MNTkhDt3O3@z|7@)-O2O)xrcQ; zrFh@)@coW*pq`OYR&p{g2rtND_4F@>H!f|FElG$F#zM|+gcS=-givf1bZm})SeYAg4u}1UG~4)+B2{& zYydam(T8@=MpJvxmVn7#2SeNK)m}w~UhOUbLbY%^py)sXpW+yo2HxN8j1WM;(I66m zEU2>3(GTDm0*)e#sS)4^NMe?q^VU!%sHOXnm;l0<-fXYcFfg#4G86%*0t$P*2snL^ z3&1vh2g}v*n9Dkcxra$3`(~Z-gJ@1`Yrx&j<^KMDW)Ej8Xyta~xV_-457?AH(5Y$j zm`opm!rQxxHsys3tF+CphTp*-6G8aEt`VI7`Pz1OMaE?XTF|O?+tq}&1-b~ugOeLa zs#E!F!w|p0R1MPYF$D1iPztbv%L@2$vt?s%4~EG5fAQcNLS8r)BaxT42Z4dRQOW7A z9hxpT)74$O{XRW3KM<1xK!$dyrgoM+z3)JSdejcCe+Zmi0w1|((xA>hl};A8zZ`f! z$gBOTk28|te+<);UX@5|3hQ_WdiS1Kctv?lzvM@gF0a(N@65to-;5+WBll`9 ze4VfSwjR!d5b1Lx`rbtHsq?JyR+`dIKk(ZBfiz7l4Hp)JhQp0y<2S%|f))Ms*Ey;16j( zuC~uZK44OJD!$@0pc7P&?q+fiM<^Mh75D3^{5dCdW7J{ZSxiU9NxQqV{X&+PzhvDZ z{^MS!p}rcY(xKb+q#uK)XJe1;TGrtV3m#S-nne)NZ61s0-KkLM!9K=bD_`04vg<@> zFV3@H2FJ#;GO-@!H_45iT3B9lHeDS4&=m=*gML8Mg2U)WB?ldrk}WtJ0i=52*Z>m| zY0J%hu&zsPG}3czAMj|UZh8Z69t2UD;`gPkp<8hDU;k{ilHynSPtAXjF;Z>~SyuF( z+l%Z4SKn4GCG4CGzh87ZE&l6v(KkruX_Q@MB>YT!TwgZr?SN|6_ujZ03rodyi&|R2 zoU0qP3@UrRBl3z^$;YvNu&`}S1cwZ9$RCL+w@#{gZfG-cWcQTgp8@IV5VMX05U zt*!=jk0QD$EX7jSm}B-`^~{|oIJ`m^OczEC4dzgK=_HkEvx`-sKnSqrkrUltXL$w^ zN;nZQ3G~l|c`ezScL!BL%Ab<81Aed|3)r~^UP|H8V!?FzeP!;O%ivh)17b;%b93gH z4RqpCg_lU!gh6zDJ8y%a#0aeDZ-sl~7770Sb9rE| zbsxmq`9zEw&rFw?2WN~sMbbRPRJSSbS1?wH1WgvE7X`IEb;DG;uBQHh=a{`Q#$)%v z(7Cv{`%ygM1)rxHny#;SCKU5Ao)#3cMp~m<$feqF_UBdVaHmidJ482y%^@+w`#d~V zp7cgK@;gd`!wt5&sPf@c;&cjFk0SKP$9baC5;&|viPHBY!5L|r_YUzy-Q0@uQ#cDb zg)`(&?D`Ol+uEP2>F48O@z~?FB;*OV2(3pDyJF$;adfSA??2JMGh)9fd%C!)LLP>& zo-~Wjq3Xo*{B5qwZR*mID#>rMe(aO3H=FO=QqX?teFCSbucvpH-;A?N4e5$C7bAzk zEoRtHEojQR2R;*PenEV|98!-jo&_nRLgG2|WEnv%Nkdu0#q}jNkqpzyf~f?~M3*O9 z)SH=@m`Qc22defZ-CMkoNQHLp4xNkRDx=h8{2K|w>!e?Lf1bQDh~i(LL_oB^zG9Ap za}<*K4D6`s>Cf4f*hXu2Yf!NbaKbDEiU$Q)!&leZ9~r!EUnVEb4><}Hu1+2F=-FM>rotX*G!erT#f0Vk z46fF(lTo8fUZQ_lm1{TmMkMGPUFnlYGY1KJbI)I-(ejfyvLx9@S*vDVR=IL=p@yp` zk*n#;m-g;+)=G$tt;v2=8$z4p&Q#mG|yfLYng*OdN^_Yd~TKroJ~lz#6v-RT%=5-Pl%20;7CcR3#DCg z(ooZ2P~lEf;dtX#rRwfOZ-Nn6rH%ZUT zd1n7DHR-#MuP>4k)8m0s7cZyDDrc0Lk#j4$3S{CI{VLYfo8RB0TH^EgL;4ic91h}5 zx~1R*`2dAb!-CXGUNn8B=Mf&6p1&!w%p_O@PhN3JfSjEL7v(u3Y1eH99?Zi2KTl*0 t;4*_Xzwbl64W0{EcZGu|xUz0V*yxM0oFZ#Pz!PQ=SxF^{uVN;_{{xK!YnuQ7 literal 0 HcmV?d00001 diff --git a/notes/_img/ab_8_old.png b/notes/_img/ab_8_old.png new file mode 100644 index 0000000000000000000000000000000000000000..036e1114d8691926a50bda4f2a88d552242189f3 GIT binary patch literal 13453 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 literal 0 HcmV?d00001 diff --git a/src/client/music_search.rs b/src/client/music_search.rs index f844cf9..5c3d15c 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -339,7 +339,7 @@ impl MapResponse for response::MusicSearchSuggestion { _deobf: Option<&crate::deobfuscate::DeobfData>, _vdata: Option<&str>, ) -> Result, ExtractionError> { - let mut mapper = MusicListMapper::new(lang); + let mut mapper = MusicListMapper::new_search_suggest(lang); let mut terms = Vec::new(); for section in self.contents { diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 675b042..6c7f3cf 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -16,7 +16,9 @@ use crate::{ }; use super::{ - url_endpoint::{BrowseEndpointWrap, MusicPageType, NavigationEndpoint, PageType}, + url_endpoint::{ + BrowseEndpointWrap, MusicPageType, MusicVideoType, NavigationEndpoint, PageType, + }, ContentsRenderer, MusicContinuationData, Thumbnails, ThumbnailsWrap, }; @@ -429,6 +431,7 @@ pub(crate) struct MusicListMapper { artists: Option<(Vec, bool)>, album: Option, artist_page: bool, + search_suggestion: bool, items: Vec, warnings: Vec, /// True if unknown items were mapped @@ -450,6 +453,20 @@ impl MusicListMapper { artists: None, album: None, artist_page: false, + search_suggestion: false, + items: Vec::new(), + warnings: Vec::new(), + has_unknown: false, + } + } + + pub fn new_search_suggest(lang: Language) -> Self { + Self { + lang, + artists: None, + album: None, + artist_page: false, + search_suggestion: true, items: Vec::new(), warnings: Vec::new(), has_unknown: false, @@ -463,6 +480,7 @@ impl MusicListMapper { artists: Some((vec![artist], false)), album: None, artist_page: true, + search_suggestion: false, items: Vec::new(), warnings: Vec::new(), has_unknown: false, @@ -476,6 +494,7 @@ impl MusicListMapper { artists: Some((artists, by_va)), album: Some(album), artist_page: false, + search_suggestion: false, items: Vec::new(), warnings: Vec::new(), has_unknown: false, @@ -515,6 +534,7 @@ impl MusicListMapper { let c1 = columns.next(); let c2 = columns.next(); let c3 = columns.next(); + let c4 = columns.next(); let title = c1.as_ref().map(|col| col.renderer.text.to_string()); @@ -532,10 +552,8 @@ impl MusicListMapper { c1.and_then(|c1| { c1.renderer.text.0.into_iter().next().and_then(|t| match t { crate::serializer::text::TextComponent::Video { - video_id, - is_video, - .. - } => Some((MusicPageType::Track { is_video }, video_id)), + video_id, vtype, .. + } => Some((MusicPageType::Track { vtype }, video_id)), crate::serializer::text::TextComponent::Browse { page_type, browse_id, @@ -549,8 +567,12 @@ impl MusicListMapper { item.playlist_item_data.map(|d| { ( MusicPageType::Track { - is_video: self.album.is_none() - && !first_tn.map(|tn| tn.height == tn.width).unwrap_or_default(), + vtype: MusicVideoType::from_is_video( + self.album.is_none() + && !first_tn + .map(|tn| tn.height == tn.width) + .unwrap_or_default(), + ), }, d.video_id, ) @@ -561,7 +583,9 @@ impl MusicListMapper { util::video_id_from_thumbnail_url(&tn.url).map(|id| { ( MusicPageType::Track { - is_video: self.album.is_none() && tn.width != tn.height, + vtype: MusicVideoType::from_is_video( + self.album.is_none() && tn.width != tn.height, + ), }, id, ) @@ -571,19 +595,28 @@ impl MusicListMapper { match pt_id { // Track - Some((MusicPageType::Track { is_video }, id)) => { + Some((MusicPageType::Track { vtype }, id)) => { let title = title.ok_or_else(|| format!("track {id}: could not get title"))?; - let (artists_p, album_p, duration_p) = match item.flex_column_display_style { + #[derive(Default)] + struct Parsed { + artists: Option, + album: Option, + duration: Option, + view_count: Option, + } + + let p = match item.flex_column_display_style { // Search result FlexColumnDisplayStyle::TwoLines => { - // Is this a related track? - if !is_video && item.item_height == ItemHeight::Compact { - ( - c2.map(TextComponents::from), - c3.map(TextComponents::from), - None, - ) + // Is this a related track (from the "similar titles" tab in the player)? + if vtype != MusicVideoType::Video && item.item_height == ItemHeight::Compact + { + Parsed { + artists: c2.map(TextComponents::from), + album: c3.map(TextComponents::from), + ..Default::default() + } } else { let mut subtitle_parts = c2 .ok_or_else(|| format!("track {id}: could not get subtitle"))? @@ -594,62 +627,98 @@ impl MusicListMapper { // Is this a related video? if item.item_height == ItemHeight::Compact { - (subtitle_parts.next(), subtitle_parts.next(), None) + Parsed { + artists: subtitle_parts.next(), + view_count: subtitle_parts.next(), + ..Default::default() + } + } + // Is this an item from search suggestion? + else if self.search_suggestion { + // Skip first part (track type) + subtitle_parts.next(); + Parsed { + artists: subtitle_parts.next(), + album: c3.map(TextComponents::from), + view_count: subtitle_parts.next(), + ..Default::default() + } } // Is it a podcast episode? - else if subtitle_parts.len() <= 3 && c3.is_some() { - (subtitle_parts.next_back(), None, None) + else if vtype == MusicVideoType::Episode { + Parsed { + artists: subtitle_parts.next_back(), + ..Default::default() + } } else { // Skip first part (track type) if subtitle_parts.len() > 3 - || (is_video && subtitle_parts.len() == 2) + || (vtype == MusicVideoType::Video && subtitle_parts.len() == 2) { subtitle_parts.next(); } - ( - subtitle_parts.next(), - subtitle_parts.next(), - subtitle_parts.next(), - ) + match vtype { + MusicVideoType::Video => Parsed { + artists: subtitle_parts.next(), + view_count: subtitle_parts.next(), + duration: subtitle_parts.next(), + ..Default::default() + }, + _ => Parsed { + artists: subtitle_parts.next(), + album: subtitle_parts.next(), + duration: subtitle_parts.next(), + view_count: c3.map(TextComponents::from), + }, + } } } } // Playlist item - FlexColumnDisplayStyle::Default => ( - c2.map(TextComponents::from), - c3.map(TextComponents::from), - item.fixed_columns + FlexColumnDisplayStyle::Default => { + let artists = c2.map(TextComponents::from); + let duration = item + .fixed_columns .into_iter() .next() - .map(TextComponents::from), - ), + .map(TextComponents::from); + if self.album.is_some() { + Parsed { + artists, + view_count: c3.map(TextComponents::from), + duration, + ..Default::default() + } + } else if self.artist_page && c4.is_some() { + Parsed { + artists, + view_count: c3.map(TextComponents::from), + album: c4.map(TextComponents::from), + duration, + } + } else { + Parsed { + artists, + album: c3.map(TextComponents::from), + duration, + ..Default::default() + } + } + } }; - let duration = duration_p.and_then(|p| util::parse_video_length(p.first_str())); - - let (album, view_count) = match (item.flex_column_display_style, is_video) { - // The album field contains the view count for search videos - (FlexColumnDisplayStyle::TwoLines, true) => ( - None, - album_p.and_then(|p| { - util::parse_large_numstr_or_warn( - p.first_str(), - self.lang, - &mut self.warnings, - ) - }), - ), - (_, false) => ( - album_p - .and_then(|p| p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok())), - None, - ), - (FlexColumnDisplayStyle::Default, true) => (None, None), - }; - let album = album.or_else(|| self.album.clone()); - - let (mut artists, by_va) = map_artists(artists_p); + let duration = p + .duration + .and_then(|p| util::parse_video_length(p.first_str())); + let album = p + .album + .and_then(|p| p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok())) + .or_else(|| self.album.clone()); + let view_count = p.view_count.and_then(|p| { + util::parse_large_numstr_or_warn(p.first_str(), self.lang, &mut self.warnings) + }); + let (mut artists, by_va) = map_artists(p.artists); // Extract artist id from dropdown menu let artist_id = map_artist_id_fallback(item.menu, artists.first()); @@ -685,7 +754,7 @@ impl MusicListMapper { artist_id, album, view_count, - is_video, + is_video: vtype.is_video(), track_nr, by_va, })); @@ -807,7 +876,7 @@ impl MusicListMapper { match item.navigation_endpoint.music_page() { Some((page_type, id)) => match page_type { - MusicPageType::Track { is_video } => { + MusicPageType::Track { vtype } => { let (artists, by_va) = map_artists(subtitle_p1); self.items.push(MusicItem::Track(TrackItem { @@ -825,7 +894,7 @@ impl MusicListMapper { &mut self.warnings, ) }), - is_video, + is_video: vtype.is_video(), track_nr: None, by_va, })); @@ -976,43 +1045,61 @@ impl MusicListMapper { })); Some(MusicItemType::Album) } - MusicPageType::Track { is_video } => { - let (artists, by_va) = map_artists(subtitle_p2); - let duration = - subtitle_p4.and_then(|p| util::parse_video_length(p.first_str())); - let (album, view_count) = if is_video { - ( - None, - subtitle_p3.and_then(|p| { - util::parse_large_numstr_or_warn( - p.first_str(), - self.lang, - &mut self.warnings, - ) - }), - ) - } else { - ( - subtitle_p3.and_then(|p| { - p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok()) - }), - None, - ) - }; + MusicPageType::Track { vtype } => { + if vtype == MusicVideoType::Episode { + let (artists, by_va) = map_artists(subtitle_p3); - self.items.push(MusicItem::Track(TrackItem { - id, - name: card.title, - duration, - cover: card.thumbnail.into(), - artist_id: artists.first().and_then(|a| a.id.clone()), - artists, - album, - view_count, - is_video, - track_nr: None, - by_va, - })); + self.items.push(MusicItem::Track(TrackItem { + id, + name: card.title, + duration: None, + cover: card.thumbnail.into(), + artist_id: artists.first().and_then(|a| a.id.clone()), + artists, + album: None, + view_count: None, + is_video: vtype.is_video(), + track_nr: None, + by_va, + })); + } else { + let (artists, by_va) = map_artists(subtitle_p2); + let duration = + subtitle_p4.and_then(|p| util::parse_video_length(p.first_str())); + let (album, view_count) = if vtype.is_video() { + ( + None, + subtitle_p3.and_then(|p| { + util::parse_large_numstr_or_warn( + p.first_str(), + self.lang, + &mut self.warnings, + ) + }), + ) + } else { + ( + subtitle_p3.and_then(|p| { + p.0.into_iter().find_map(|c| AlbumId::try_from(c).ok()) + }), + None, + ) + }; + + self.items.push(MusicItem::Track(TrackItem { + id, + name: card.title, + duration, + cover: card.thumbnail.into(), + artist_id: artists.first().and_then(|a| a.id.clone()), + artists, + album, + view_count, + is_video: vtype.is_video(), + track_nr: None, + by_va, + })); + } Some(MusicItemType::Track) } MusicPageType::Playlist => { diff --git a/src/client/response/url_endpoint.rs b/src/client/response/url_endpoint.rs index 4477103..bbdee34 100644 --- a/src/client/response/url_endpoint.rs +++ b/src/client/response/url_endpoint.rs @@ -151,6 +151,22 @@ pub(crate) enum MusicVideoType { Video, #[serde(rename = "MUSIC_VIDEO_TYPE_ATV")] Track, + #[serde(rename = "MUSIC_VIDEO_TYPE_PODCAST_EPISODE")] + Episode, +} + +impl MusicVideoType { + pub fn is_video(self) -> bool { + self != Self::Track + } + + pub fn from_is_video(is_video: bool) -> Self { + if is_video { + Self::Video + } else { + Self::Track + } + } } #[derive(Default, Debug, Clone, Copy, Deserialize, PartialEq, Eq)] @@ -189,7 +205,7 @@ pub(crate) enum MusicPageType { Artist, Album, Playlist, - Track { is_video: bool }, + Track { vtype: MusicVideoType }, Unknown, None, } @@ -221,11 +237,10 @@ impl NavigationEndpoint { } else { Some(( MusicPageType::Track { - is_video: watch_endpoint + vtype: watch_endpoint .watch_endpoint_music_supported_configs .watch_endpoint_music_config - .music_video_type - == MusicVideoType::Video, + .music_video_type, }, watch_endpoint.video_id, )) diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_suggestion_default.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_suggestion_default.snap index 85ed274..719c930 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_suggestion_default.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_suggestion_default.snap @@ -67,7 +67,10 @@ MusicSearchSuggestion( ), ], artist_id: Some("UC56hLMPuEsERdmTBbR_JGHA"), - album: None, + album: Some(AlbumId( + id: "MPREb_kz546sNB1mH", + name: "Was Spaß macht...", + )), view_count: None, is_video: false, track_nr: None, diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index 33cb494..b7e99f5 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -142,14 +142,15 @@ fn get_sig_fn(player_js: &str) -> Result { let function_pattern = Regex::new(&function_pattern_str) .map_err(|_| DeobfError::Other("could not parse function pattern regex"))?; - let deobfuscate_function = "var ".to_owned() - + function_pattern + let deobfuscate_function = format!( + "var {};", + function_pattern .captures(player_js) .ok_or(DeobfError::Extraction("deobf function"))? .get(1) .unwrap() .as_str() - + ";"; + ); static HELPER_OBJECT_NAME_REGEX: Lazy = Lazy::new(|| Regex::new(r#";([A-Za-z0-9_\$]{2,3})\...\("#).unwrap()); @@ -203,7 +204,7 @@ fn get_nsig_fn_name(player_js: &str) -> Result { .as_str() .parse::() .or(Err(DeobfError::Other("could not parse array_num")))?; - let array_pattern_str = format!(r#"var {}\s*=\s*\[(.+?)][;,]"#, regex::escape(function_name)); + let array_pattern_str = format!(r#"var {}\s*=\s*\[(.+?)]"#, regex::escape(function_name)); let array_pattern = Regex::new(&array_pattern_str).or(Err(DeobfError::Other( "could not parse helper pattern regex", )))?; diff --git a/src/model/richtext.rs b/src/model/richtext.rs index 57e8abd..4afe63b 100644 --- a/src/model/richtext.rs +++ b/src/model/richtext.rs @@ -170,6 +170,7 @@ mod tests { use once_cell::sync::Lazy; + use crate::client::response::url_endpoint::MusicVideoType; use crate::serializer::text; static TEXT_SOURCE: Lazy = Lazy::new(|| { @@ -177,7 +178,7 @@ mod tests { text::TextComponent::Text { text: "🎧Listen and download aespa's debut single \"Black Mamba\": ".to_owned() }, text::TextComponent::Web { text: "https://smarturl.it/aespa_BlackMamba".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbFY1QmpQamJPSms0Z1FnVTlQUS00ZFhBZnBJZ3xBQ3Jtc0tuRGJBanludGoyRnphb2dZWVd3cUNnS3dEd0FnNHFOZEY1NHBJaHFmLXpaWUJwX3ZucDZxVnpGeHNGX1FpMzFkZW9jQkI2Mi1wNGJ1UVFNN3h1MnN3R3JLMzdxU01nZ01POHBGcmxHU2puSUk1WHRzQQ&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E".to_owned() }, text::TextComponent::Text { text: "\n🐍The Debut Stage ".to_owned() }, - text::TextComponent::Video { text: "https://youtu.be/Ky5RT5oGg0w".to_owned(), video_id: "Ky5RT5oGg0w".to_owned(), start_time: 0, is_video: true }, + text::TextComponent::Video { text: "https://youtu.be/Ky5RT5oGg0w".to_owned(), video_id: "Ky5RT5oGg0w".to_owned(), start_time: 0, vtype: MusicVideoType::Video }, text::TextComponent::Text { text: "\n\n🎟️ aespa Showcase SYNK in LA! Tickets now on sale: ".to_owned() }, text::TextComponent::Web { text: "https://www.ticketmaster.com/event/0A...".to_owned(), url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbFpUMEZiaXJWWkszaVZXaEM0emxWU1JQV3NoQXxBQ3Jtc0tuU2g4VWNPNE5UY3hoSWYtamFzX0h4bUVQLVJiRy1ubDZrTnh3MUpGdDNSaUo0ZlMyT3lUM28ycUVBdHJLMndGcDhla3BkOFpxSVFfOS1QdVJPVHBUTEV1LXpOV0J2QXdhV05lV210cEJtZUJMeHdaTQ&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E".to_owned() }, text::TextComponent::Text { text: "\n\nSubscribe to aespa Official YouTube Channel!\n".to_owned() }, diff --git a/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap b/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap index 4966a2f..25c6179 100644 --- a/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap +++ b/src/serializer/snapshots/rustypipe__serializer__text__tests__t_attributed_description.snap @@ -19,7 +19,7 @@ SAttributed { text: "aespa 에스파 'Black ...", video_id: "Ky5RT5oGg0w", start_time: 0, - is_video: true, + vtype: Video, }, Text { text: "\n\n🎟\u{fe0f} aespa Showcase SYNK in LA! Tickets now on sale: ", diff --git a/src/serializer/text.rs b/src/serializer/text.rs index f76e1a9..c3c9617 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -94,8 +94,7 @@ pub(crate) enum TextComponent { text: String, video_id: String, start_time: u32, - /// True if the item is a video, false if it is a YTM track - is_video: bool, + vtype: MusicVideoType, }, Browse { text: String, @@ -167,11 +166,10 @@ fn map_text_component(text: String, nav: Option) -> TextComp text, video_id: watch_endpoint.video_id, start_time: watch_endpoint.start_time_seconds, - is_video: watch_endpoint + vtype: watch_endpoint .watch_endpoint_music_supported_configs .watch_endpoint_music_config - .music_video_type - == MusicVideoType::Video, + .music_video_type, }, Some(NavigationEndpoint::Browse { browse_endpoint, @@ -612,7 +610,7 @@ mod tests { text: "DEEP", video_id: "wZIoIgz5mbs", start_time: 0, - is_video: true, + vtype: Video, }, } "###); diff --git a/tests/snapshots/youtube__music_album_ep.snap b/tests/snapshots/youtube__music_album_ep.snap index 161096d..10e5e03 100644 --- a/tests/snapshots/youtube__music_album_ep.snap +++ b/tests/snapshots/youtube__music_album_ep.snap @@ -35,7 +35,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "Waldbrand", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -56,7 +56,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "Waldbrand", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -77,7 +77,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "Waldbrand", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -98,7 +98,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "Waldbrand", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -119,7 +119,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "Waldbrand", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, diff --git a/tests/snapshots/youtube__music_album_ep_intl.snap b/tests/snapshots/youtube__music_album_ep_intl.snap index 72f3ef4..c48bcd4 100644 --- a/tests/snapshots/youtube__music_album_ep_intl.snap +++ b/tests/snapshots/youtube__music_album_ep_intl.snap @@ -35,7 +35,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -56,7 +56,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -77,7 +77,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -98,7 +98,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -119,7 +119,7 @@ MusicAlbum( id: "MPREb_u1I69lSAe5v", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, diff --git a/tests/snapshots/youtube__music_album_no_artist.snap b/tests/snapshots/youtube__music_album_no_artist.snap index c401024..60a3b5b 100644 --- a/tests/snapshots/youtube__music_album_no_artist.snap +++ b/tests/snapshots/youtube__music_album_no_artist.snap @@ -1,6 +1,5 @@ --- source: tests/youtube.rs -assertion_line: 1391 expression: album --- MusicAlbum( @@ -31,7 +30,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -52,7 +51,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -73,7 +72,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -94,7 +93,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, diff --git a/tests/snapshots/youtube__music_album_no_artist_intl.snap b/tests/snapshots/youtube__music_album_no_artist_intl.snap index 82c381b..c450608 100644 --- a/tests/snapshots/youtube__music_album_no_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_no_artist_intl.snap @@ -30,7 +30,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -51,7 +51,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -72,7 +72,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -93,7 +93,7 @@ MusicAlbum( id: "MPREb_bqWA6mAZFWS", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, diff --git a/tests/snapshots/youtube__music_album_no_year.snap b/tests/snapshots/youtube__music_album_no_year.snap index f5a730a..e9a913e 100644 --- a/tests/snapshots/youtube__music_album_no_year.snap +++ b/tests/snapshots/youtube__music_album_no_year.snap @@ -51,7 +51,7 @@ MusicAlbum( id: "MPREb_F3Af9UZZVxX", name: "La Ultima Vez (Remix)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, diff --git a/tests/snapshots/youtube__music_album_no_year_intl.snap b/tests/snapshots/youtube__music_album_no_year_intl.snap index 163b70b..2ff6a5f 100644 --- a/tests/snapshots/youtube__music_album_no_year_intl.snap +++ b/tests/snapshots/youtube__music_album_no_year_intl.snap @@ -51,7 +51,7 @@ MusicAlbum( id: "MPREb_F3Af9UZZVxX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, diff --git a/tests/snapshots/youtube__music_album_one_artist.snap b/tests/snapshots/youtube__music_album_one_artist.snap index 3fe60ce..85f2d34 100644 --- a/tests/snapshots/youtube__music_album_one_artist.snap +++ b/tests/snapshots/youtube__music_album_one_artist.snap @@ -35,7 +35,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -56,7 +56,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -77,7 +77,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -98,7 +98,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -119,7 +119,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -140,7 +140,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -161,7 +161,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -182,7 +182,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -203,7 +203,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -224,7 +224,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(10), by_va: false, @@ -245,7 +245,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -266,7 +266,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -287,7 +287,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -308,7 +308,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, @@ -329,7 +329,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(15), by_va: false, @@ -350,7 +350,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(16), by_va: false, @@ -371,7 +371,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(17), by_va: false, @@ -392,7 +392,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "Märchen enden gut", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(18), by_va: false, diff --git a/tests/snapshots/youtube__music_album_one_artist_intl.snap b/tests/snapshots/youtube__music_album_one_artist_intl.snap index 5314034..e667a66 100644 --- a/tests/snapshots/youtube__music_album_one_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_one_artist_intl.snap @@ -35,7 +35,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -56,7 +56,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -77,7 +77,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -98,7 +98,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -119,7 +119,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -140,7 +140,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -161,7 +161,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -182,7 +182,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -203,7 +203,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -224,7 +224,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(10), by_va: false, @@ -245,7 +245,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -266,7 +266,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -287,7 +287,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -308,7 +308,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, @@ -329,7 +329,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(15), by_va: false, @@ -350,7 +350,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(16), by_va: false, @@ -371,7 +371,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(17), by_va: false, @@ -392,7 +392,7 @@ MusicAlbum( id: "MPREb_nlBWQROfvjo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(18), by_va: false, diff --git a/tests/snapshots/youtube__music_album_show.snap b/tests/snapshots/youtube__music_album_show.snap index e66b686..f202333 100644 --- a/tests/snapshots/youtube__music_album_show.snap +++ b/tests/snapshots/youtube__music_album_show.snap @@ -35,7 +35,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -56,7 +56,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -77,7 +77,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -98,7 +98,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -119,7 +119,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -140,7 +140,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -161,7 +161,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -182,7 +182,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -203,7 +203,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -224,7 +224,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(10), by_va: false, @@ -245,7 +245,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -266,7 +266,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -287,7 +287,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -308,7 +308,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, diff --git a/tests/snapshots/youtube__music_album_show_intl.snap b/tests/snapshots/youtube__music_album_show_intl.snap index b8dda33..bac426b 100644 --- a/tests/snapshots/youtube__music_album_show_intl.snap +++ b/tests/snapshots/youtube__music_album_show_intl.snap @@ -35,7 +35,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -56,7 +56,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -77,7 +77,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -98,7 +98,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -119,7 +119,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -140,7 +140,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -161,7 +161,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -182,7 +182,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -203,7 +203,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -224,7 +224,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(10), by_va: false, @@ -245,7 +245,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -266,7 +266,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -287,7 +287,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -308,7 +308,7 @@ MusicAlbum( id: "MPREb_cwzk8EUwypZ", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, diff --git a/tests/snapshots/youtube__music_album_single.snap b/tests/snapshots/youtube__music_album_single.snap index 5061942..7b557d0 100644 --- a/tests/snapshots/youtube__music_album_single.snap +++ b/tests/snapshots/youtube__music_album_single.snap @@ -43,7 +43,7 @@ MusicAlbum( id: "MPREb_bHfHGoy7vuv", name: "Der Himmel reißt auf", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, diff --git a/tests/snapshots/youtube__music_album_single_intl.snap b/tests/snapshots/youtube__music_album_single_intl.snap index 3df94d9..c831216 100644 --- a/tests/snapshots/youtube__music_album_single_intl.snap +++ b/tests/snapshots/youtube__music_album_single_intl.snap @@ -43,7 +43,7 @@ MusicAlbum( id: "MPREb_bHfHGoy7vuv", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, diff --git a/tests/snapshots/youtube__music_album_unavailable.snap b/tests/snapshots/youtube__music_album_unavailable.snap index 2efb6db..ef83f26 100644 --- a/tests/snapshots/youtube__music_album_unavailable.snap +++ b/tests/snapshots/youtube__music_album_unavailable.snap @@ -30,7 +30,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -51,7 +51,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -72,7 +72,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -93,7 +93,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -114,7 +114,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -135,7 +135,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -156,7 +156,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -177,7 +177,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -198,7 +198,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -219,7 +219,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -240,7 +240,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -261,7 +261,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(18), by_va: false, diff --git a/tests/snapshots/youtube__music_album_unavailable_intl.snap b/tests/snapshots/youtube__music_album_unavailable_intl.snap index 1b7b540..cdf785d 100644 --- a/tests/snapshots/youtube__music_album_unavailable_intl.snap +++ b/tests/snapshots/youtube__music_album_unavailable_intl.snap @@ -30,7 +30,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -51,7 +51,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -72,7 +72,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -93,7 +93,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -114,7 +114,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -135,7 +135,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -156,7 +156,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -177,7 +177,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -198,7 +198,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -219,7 +219,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -240,7 +240,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -261,7 +261,7 @@ MusicAlbum( id: "MPREb_AzuWg8qAVVl", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(18), by_va: false, diff --git a/tests/snapshots/youtube__music_album_various_artists.snap b/tests/snapshots/youtube__music_album_various_artists.snap index 0a335da..eac36e1 100644 --- a/tests/snapshots/youtube__music_album_various_artists.snap +++ b/tests/snapshots/youtube__music_album_various_artists.snap @@ -30,7 +30,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -51,7 +51,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -72,7 +72,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -93,7 +93,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -114,7 +114,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -135,7 +135,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, diff --git a/tests/snapshots/youtube__music_album_various_artists_intl.snap b/tests/snapshots/youtube__music_album_various_artists_intl.snap index 8f3c587..f44751e 100644 --- a/tests/snapshots/youtube__music_album_various_artists_intl.snap +++ b/tests/snapshots/youtube__music_album_various_artists_intl.snap @@ -1,6 +1,5 @@ --- source: tests/youtube.rs -assertion_line: 1396 expression: album --- MusicAlbum( @@ -31,7 +30,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -52,7 +51,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -73,7 +72,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -94,7 +93,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -115,7 +114,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -136,7 +135,7 @@ MusicAlbum( id: "MPREb_8QkDeEIawvX", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, diff --git a/tests/snapshots/youtube__music_album_version_no_artist.snap b/tests/snapshots/youtube__music_album_version_no_artist.snap index c5f9504..f1fb92f 100644 --- a/tests/snapshots/youtube__music_album_version_no_artist.snap +++ b/tests/snapshots/youtube__music_album_version_no_artist.snap @@ -1,6 +1,5 @@ --- source: tests/youtube.rs -assertion_line: 1391 expression: album --- MusicAlbum( @@ -44,7 +43,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -65,7 +64,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -86,7 +85,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -107,7 +106,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "Pedha Rasi Peddamma Katha", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, diff --git a/tests/snapshots/youtube__music_album_version_no_artist_intl.snap b/tests/snapshots/youtube__music_album_version_no_artist_intl.snap index 805a4be..da0a781 100644 --- a/tests/snapshots/youtube__music_album_version_no_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_version_no_artist_intl.snap @@ -43,7 +43,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -64,7 +64,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -85,7 +85,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -106,7 +106,7 @@ MusicAlbum( id: "MPREb_h8ltx5oKvyY", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, diff --git a/tests/youtube.rs b/tests/youtube.rs index 6b54b00..933ef18 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1429,7 +1429,7 @@ fn music_album(#[case] name: &str, #[case] id: &str, rp: RustyPipe, unlocalized: if unlocalized { insta::assert_ron_snapshot!(format!("music_album_{name}"), album, - {".cover" => "[cover]"} + {".cover" => "[cover]", ".tracks[].view_count" => "[view_count]"} ); } else { insta::assert_ron_snapshot!(format!("music_album_{name}_intl"), album, @@ -1439,6 +1439,7 @@ fn music_album(#[case] name: &str, #[case] id: &str, rp: RustyPipe, unlocalized: ".description" => "[description]", ".artists[].name" => "[name]", ".tracks[].name" => "[name]", + ".tracks[].view_count" => "[view_count]", ".tracks[].album.name" => "[name]", ".tracks[].artists[].name" => "[name]", ".variants[].artists[].name" => "[name]", @@ -1730,16 +1731,11 @@ async fn music_search_episode() { let rp = RustyPipe::builder().strict().build().unwrap(); let res = rp .query() - .music_search_videos("Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1") + .music_search("Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1") .await .unwrap(); - let track = &res - .items - .items - .iter() - .find(|a| a.id == "Zq_-LDy7AgE") - .unwrap(); + let track = &res.tracks.iter().find(|a| a.id == "Zq_-LDy7AgE").unwrap(); assert_eq!( track.name, From ba9403a089350bacccbfcbc90f14e686d066ef31 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 23 Aug 2023 21:15:26 +0200 Subject: [PATCH 043/459] tests: add second test case for episode search --- tests/youtube.rs | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 933ef18..24a2098 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1629,7 +1629,6 @@ fn music_search(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { assert_eq!(track_album.id, "MPREb_RXHxrUFfrvQ"); assert_eq!(track_album.name, "Lieblingsmensch"); - assert_eq!(track.view_count, None); assert!(!track.is_video, "got mv"); assert_eq!(track.track_nr, None); } @@ -1726,22 +1725,41 @@ fn music_search_videos(rp: RustyPipe, unlocalized: bool) { assert_next(res.items, rp.query(), 15, 2); } -#[tokio::test] -async fn music_search_episode() { - let rp = RustyPipe::builder().strict().build().unwrap(); - let res = rp - .query() - .music_search("Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1") - .await - .unwrap(); +#[rstest] +#[case::main(false)] +#[case::videos(true)] +fn music_search_episode(rp: RustyPipe, #[case] videos: bool) { + let query = "Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1"; + let tracks = if videos { + tokio_test::block_on(rp.query().music_search_videos(query)) + .unwrap() + .items + .items + } else { + tokio_test::block_on(rp.query().music_search(query)) + .unwrap() + .tracks + }; - let track = &res.tracks.iter().find(|a| a.id == "Zq_-LDy7AgE").unwrap(); + let track = &tracks.iter().find(|a| a.id == "Zq_-LDy7AgE").unwrap(); + assert_eq!(track.artists.len(), 1); + let track_artist = &track.artists[0]; assert_eq!( track.name, "Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1" ); + assert_eq!(track_artist.name, "BLOND_OFFICIAL"); + assert_eq!( + track_artist.id.as_ref().unwrap(), + "UC8SmM4bue6bKHT4p-_YFZHQ" + ); + assert_eq!( + track.artist_id.as_ref().unwrap(), + "UC8SmM4bue6bKHT4p-_YFZHQ" + ); assert!(!track.cover.is_empty(), "got no cover"); + assert!(track.is_video); } #[rstest] From 4780096b00560da113d5d635b065c382a1fe147a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 30 Aug 2023 21:57:53 +0200 Subject: [PATCH 044/459] tests: fix check for A/B test 6 (discography page) --- codegen/src/abtest.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index b9d7f09..9d6a4ce 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -231,9 +231,20 @@ pub async fn trends_page_header_renderer(rp: &RustyPipeQuery) -> Result { } pub async fn discography_page(rp: &RustyPipeQuery) -> Result { - let artist = rp.music_artist("UC7cl4MmM6ZZ2TcFyMk_b4pg", false).await?; - - Ok(artist.albums.len() <= 10) + let id = "UC7cl4MmM6ZZ2TcFyMk_b4pg"; + let res = rp + .raw( + ClientType::DesktopMusic, + "browse", + &QBrowse { + context: rp.get_context(ClientType::DesktopMusic, true, None).await, + browse_id: id, + params: None, + }, + ) + .await + .unwrap(); + Ok(res.contains(&format!("\"MPAD{id}\""))) } pub async fn short_date_format(rp: &RustyPipeQuery) -> Result { From ac25490435d110cfc8c9c5f28c29f6cb64952598 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 30 Aug 2023 22:05:18 +0200 Subject: [PATCH 045/459] chore: fix clippy lints --- codegen/src/gen_locales.rs | 2 +- codegen/src/util.rs | 2 +- downloader/src/lib.rs | 2 +- src/client/mod.rs | 2 +- src/client/music_artist.rs | 7 ++++-- src/client/player.rs | 10 ++++---- src/client/response/music_item.rs | 8 +++---- src/client/video_details.rs | 2 +- src/deobfuscate.rs | 12 +++++----- src/model/richtext.rs | 4 ++-- src/param/stream_filter.rs | 40 +++++++++++++++---------------- src/serializer/text.rs | 2 +- src/util/mod.rs | 16 ++++++------- src/util/timeago.rs | 30 +++++++++-------------- tests/youtube.rs | 4 +++- 15 files changed, 70 insertions(+), 73 deletions(-) diff --git a/codegen/src/gen_locales.rs b/codegen/src/gen_locales.rs index 66e1da9..bb9e523 100644 --- a/codegen/src/gen_locales.rs +++ b/codegen/src/gen_locales.rs @@ -309,7 +309,7 @@ async fn get_locales() -> (BTreeMap, BTreeMap) { .post("https://www.youtube.com/youtubei/v1/account/account_menu?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false") .header(header::CONTENT_TYPE, "application/json") .body( - r##"{"context":{"client":{"clientName":"WEB","clientVersion":"2.20220914.06.00","platform":"DESKTOP","originalUrl":"https://www.youtube.com/","hl":"en","gl":"US"},"request":{"internalExperimentFlags":[],"useSsl":true},"user":{"lockedSafetyMode":false}}}"## + r#"{"context":{"client":{"clientName":"WEB","clientVersion":"2.20220914.06.00","platform":"DESKTOP","originalUrl":"https://www.youtube.com/","hl":"en","gl":"US"},"request":{"internalExperimentFlags":[],"useSsl":true},"user":{"lockedSafetyMode":false}}}"# ) .send().await .unwrap() diff --git a/codegen/src/util.rs b/codegen/src/util.rs index 6d7d830..5254255 100644 --- a/codegen/src/util.rs +++ b/codegen/src/util.rs @@ -186,7 +186,7 @@ pub fn parse_largenum_en(string: &str) -> Option { /// and return the duration in seconds. pub fn parse_video_length(text: &str) -> Option { static VIDEO_LENGTH_REGEX: Lazy = - Lazy::new(|| Regex::new(r#"(?:(\d+)[:.])?(\d{1,2})[:.](\d{2})"#).unwrap()); + Lazy::new(|| Regex::new(r"(?:(\d+)[:.])?(\d{1,2})[:.](\d{2})").unwrap()); VIDEO_LENGTH_REGEX.captures(text).map(|cap| { let hrs = cap .get(1) diff --git a/downloader/src/lib.rs b/downloader/src/lib.rs index 0ad54d5..6377289 100644 --- a/downloader/src/lib.rs +++ b/downloader/src/lib.rs @@ -46,7 +46,7 @@ fn get_download_range(offset: u64, size: Option) -> Range { } fn parse_cr_header(cr_header: &str) -> Result<(u64, u64)> { - static PATTERN: Lazy = Lazy::new(|| Regex::new(r#"bytes (\d+)-(\d+)/(\d+)"#).unwrap()); + static PATTERN: Lazy = Lazy::new(|| Regex::new(r"bytes (\d+)-(\d+)/(\d+)").unwrap()); let captures = PATTERN.captures(cr_header).ok_or_else(|| { DownloadError::Progressive( diff --git a/src/client/mod.rs b/src/client/mod.rs index ccb3020..b234af7 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1567,6 +1567,6 @@ mod tests { assert!( visitor_data.starts_with("Cg") && visitor_data.len() > 23, "invalid visitor data: {visitor_data}" - ) + ); } } diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index 66d7261..9ec1202 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -301,7 +301,10 @@ impl MapResponse> for response::MusicArtistAlbums { // dbg!(&self); let Some(header) = self.header else { - return Err(ExtractionError::NotFound { id: id.into(), msg: "no header".into() }); + return Err(ExtractionError::NotFound { + id: id.into(), + msg: "no header".into(), + }); }; let grids = self @@ -427,7 +430,7 @@ mod tests { match e { ExtractionError::Redirect(id) => { - assert_eq!(id, "UCOR4_bSVIXPsGa4BbCSt60Q") + assert_eq!(id, "UCOR4_bSVIXPsGa4BbCSt60Q"); } _ => panic!("error: {e}"), } diff --git a/src/client/player.rs b/src/client/player.rs index f5bd905..a4a4500 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -505,13 +505,13 @@ fn map_video_stream( "Invalid mime type `{}` in video format {:?}", &f.mime_type, &f )], - } + }; }; let Some(format) = get_video_format(mtype) else { return MapResult { c: None, warnings: vec![format!("invalid video format. itag: {}", f.itag)], - } + }; }; let map_res = map_url(&f.url, &f.signature_cipher, deobf, last_nsig); @@ -560,13 +560,13 @@ fn map_audio_stream( "Invalid mime type `{}` in video format {:?}", &f.mime_type, &f )], - } + }; }; let Some(format) = get_audio_format(mtype) else { return MapResult { c: None, warnings: vec![format!("invalid audio format. itag: {}", f.itag)], - } + }; }; let map_res = map_url(&f.url, &f.signature_cipher, deobf, last_nsig); let mut warnings = map_res.warnings; @@ -750,7 +750,7 @@ mod tests { #[test] fn cipher_to_url() { let signature_cipher = "s=w%3DAe%3DA6aDNQLkViKS7LOm9QtxZJHKwb53riq9qEFw-ecBWJCAiA%3DcEg0tn3dty9jEHszfzh4Ud__bg9CEHVx4ix-7dKsIPAhIQRw8JQ0qOA&sp=sig&url=https://rr5---sn-h0jelnez.googlevideo.com/videoplayback%3Fexpire%3D1659376413%26ei%3Dvb7nYvH5BMK8gAfBj7ToBQ%26ip%3D2003%253Ade%253Aaf06%253A6300%253Ac750%253A1b77%253Ac74a%253A80e3%26id%3Do-AB_BABwrXZJN428ZwDxq5ScPn2AbcGODnRlTVhCQ3mj2%26itag%3D251%26source%3Dyoutube%26requiressl%3Dyes%26mh%3DhH%26mm%3D31%252C26%26mn%3Dsn-h0jelnez%252Csn-4g5ednsl%26ms%3Dau%252Conr%26mv%3Dm%26mvi%3D5%26pl%3D37%26initcwndbps%3D1588750%26spc%3DlT-Khi831z8dTejFIRCvCEwx_6romtM%26vprv%3D1%26mime%3Daudio%252Fwebm%26ns%3Db_Mq_qlTFcSGlG9RpwpM9xQH%26gir%3Dyes%26clen%3D3781277%26dur%3D229.301%26lmt%3D1655510291473933%26mt%3D1659354538%26fvip%3D5%26keepalive%3Dyes%26fexp%3D24001373%252C24007246%26c%3DWEB%26rbqsm%3Dfr%26txp%3D4532434%26n%3Dd2g6G2hVqWIXxedQ%26sparams%3Dexpire%252Cei%252Cip%252Cid%252Citag%252Csource%252Crequiressl%252Cspc%252Cvprv%252Cmime%252Cns%252Cgir%252Cclen%252Cdur%252Clmt%26lsparams%3Dmh%252Cmm%252Cmn%252Cms%252Cmv%252Cmvi%252Cpl%252Cinitcwndbps%26lsig%3DAG3C_xAwRQIgCKCGJ1iu4wlaGXy3jcJyU3inh9dr1FIfqYOZEG_MdmACIQCbungkQYFk7EhD6K2YvLaHFMjKOFWjw001_tLb0lPDtg%253D%253D"; - let mut last_nsig: [String; 2] = ["".to_owned(), "".to_owned()]; + let mut last_nsig: [String; 2] = [String::new(), String::new()]; let deobf = Deobfuscator::new(&DEOBF_DATA).unwrap(); let map_res = map_url( &None, diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 6c7f3cf..62dc45a 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -1346,11 +1346,11 @@ mod tests { let atype_samples: BTreeMap> = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - atype_samples.iter().for_each(|(lang, entry)| { - entry.iter().for_each(|(album_type, txt)| { + for (lang, entry) in &atype_samples { + for (album_type, txt) in entry { let res = map_album_type(txt, *lang); assert_eq!(res, *album_type, "lang: {lang}, txt: {txt}"); - }); - }); + } + } } } diff --git a/src/client/video_details.rs b/src/client/video_details.rs index 6d24583..6b9033e 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -594,7 +594,7 @@ mod tests { assert!(matches!( err, crate::error::ExtractionError::NotFound { .. } - )) + )); } #[rstest] diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index b7e99f5..abb6a6b 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -116,11 +116,11 @@ fn get_sig_fn_name(player_js: &str) -> Result { static FUNCTION_REGEXES: Lazy<[FancyRegex; 6]> = Lazy::new(|| { [ FancyRegex::new(r#"(?:\b|[^a-zA-Z0-9$])([a-zA-Z0-9$]{2,})\s*=\s*function\(\s*a\s*\)\s*\{\s*a\s*=\s*a\.split\(\s*""\s*\)"#).unwrap(), - FancyRegex::new(r#"\bm=([a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)"#).unwrap(), - FancyRegex::new(r#"\bc&&\(c=([a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)"#).unwrap(), + FancyRegex::new(r"\bm=([a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)").unwrap(), + FancyRegex::new(r"\bc&&\(c=([a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)").unwrap(), FancyRegex::new(r#"([\w$]+)\s*=\s*function\((\w+)\)\{\s*\2=\s*\2\.split\(""\)\s*;"#).unwrap(), FancyRegex::new(r#"\b([\w$]{2,})\s*=\s*function\((\w+)\)\{\s*\2=\s*\2\.split\(""\)\s*;"#).unwrap(), - FancyRegex::new(r#"\bc\s*&&\s*d\.set\([^,]+\s*,\s*(:encodeURIComponent\s*\()([a-zA-Z0-9$]+)\("#).unwrap(), + FancyRegex::new(r"\bc\s*&&\s*d\.set\([^,]+\s*,\s*(:encodeURIComponent\s*\()([a-zA-Z0-9$]+)\(").unwrap(), ] }); @@ -153,7 +153,7 @@ fn get_sig_fn(player_js: &str) -> Result { ); static HELPER_OBJECT_NAME_REGEX: Lazy = - Lazy::new(|| Regex::new(r#";([A-Za-z0-9_\$]{2,3})\...\("#).unwrap()); + Lazy::new(|| Regex::new(r";([A-Za-z0-9_\$]{2,3})\...\(").unwrap()); let helper_object_name = HELPER_OBJECT_NAME_REGEX .captures(&deobfuscate_function) .ok_or(DeobfError::Extraction("helper object name"))? @@ -293,7 +293,7 @@ async fn get_player_js_url(http: &Client) -> Result { let text = resp.text().await?; static PLAYER_HASH_PATTERN: Lazy = Lazy::new(|| { - Regex::new(r#"https:\\/\\/www\.youtube\.com\\/s\\/player\\/([a-z0-9]{8})\\/"#).unwrap() + Regex::new(r"https:\\/\\/www\.youtube\.com\\/s\\/player\\/([a-z0-9]{8})\\/").unwrap() }); let player_hash = PLAYER_HASH_PATTERN .captures(&text) @@ -417,7 +417,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] fn t_get_sts() { let res = get_sts(&TEST_JS).unwrap(); - assert_eq!(res, "19187") + assert_eq!(res, "19187"); } #[rstest] diff --git a/src/model/richtext.rs b/src/model/richtext.rs index 4afe63b..4f52ab7 100644 --- a/src/model/richtext.rs +++ b/src/model/richtext.rs @@ -250,10 +250,10 @@ aespa 에스파 'Black Mamba' MV ℗ SM Entertainment"# fn to_markdown() { let richtext = RichText::from(TEXT_SOURCE.clone()); let markdown = richtext.to_markdown_yt_host("https://piped.kavin.rocks"); - println!("{}", markdown); + println!("{markdown}"); assert_eq!( markdown, r#"🎧Listen and download aespa's debut single "Black Mamba"\: [https\://smarturl.it/aespa\_BlackMamba](https://smarturl.it/aespa_BlackMamba)
    🐍The Debut Stage [https\://youtu.be/Ky5RT5oGg0w](https://piped.kavin.rocks/watch?v=Ky5RT5oGg0w)

    🎟️ aespa Showcase SYNK in LA! Tickets now on sale\: [https\://www.ticketmaster.com/event/0A...](https://www.ticketmaster.com/event/0A005CCD9E871F6E)

    Subscribe to aespa Official YouTube Channel!
    [https\://www.youtube.com/aespa?sub\_con...](https://www.youtube.com/aespa?sub_confirmation=1)

    aespa official
    [https\://www.youtube.com/c/aespa](https://www.youtube.com/c/aespa)
    [https\://www.instagram.com/aespa\_official](https://www.instagram.com/aespa_official)
    [https\://www.tiktok.com/@aespa\_official](https://www.tiktok.com/@aespa_official)
    [https\://twitter.com/aespa\_Official](https://twitter.com/aespa_Official)
    [https\://www.facebook.com/aespa.official](https://www.facebook.com/aespa.official)
    [https\://weibo.com/aespa](https://weibo.com/aespa)

    \#aespa \#æspa \#BlackMamba \#블랙맘바 \#에스파
    aespa 에스파 'Black Mamba' MV ℗ SM Entertainment"# - ) + ); } } diff --git a/src/param/stream_filter.rs b/src/param/stream_filter.rs index 8792b82..44c92b2 100644 --- a/src/param/stream_filter.rs +++ b/src/param/stream_filter.rs @@ -372,14 +372,14 @@ mod tests { #[rstest] #[case::default(StreamFilter::default(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104136&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683782301237288&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPcUhhfkNVA_JcdU6KLTOFjRCnNl6n8gamJA-Q0PgCpIAiBTMV2k2JfHzbHBtsHxuNW7zHvSaYaUbz-dEIQC45o1eA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] - #[case::bitrate(StreamFilter::default().audio_max_bitrate(100000).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8217508&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683782195315620&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIga2iMQsToMxO7hTOx0gNAzhYoV1lL5PpE9lkAuBXt1nkCIQCuFuQXWNixIquEugtkT1C9khuKRP_C-wzSOiUmRp1DRg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] - #[case::m4a_format(StreamFilter::default().audio_formats(&[AudioFormat::M4a]).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] - #[case::m4a_codec(StreamFilter::default().audio_codecs(&[AudioCodec::Mp4a]).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] - #[case::french(StreamFilter::default().audio_language("fr").to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=940286&dur=60.101&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774002236584&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAIUUin7WZBnoVDb2p0wuTPc7HZwbF8I5sxzLrVN9WeBwAiBQTZwhxCQ1IdrUkkD1-cSGYBtMF1aKkjPZ-LWeie0aZA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr"))] - #[case::br_fallback(StreamFilter::default().audio_max_bitrate(0).to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6306327&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683782187865292&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgW1DTCrLV_GyEM1rdjScgyceZE1llb73KJMFXmPm5Y04CIAYOLZuuzFX4ba5720kMOcQ1-Ld1DULs85nLxJglitCl&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] - #[case::lang_fallback(StreamFilter::default().audio_language("xx").to_owned(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104136&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683782301237288&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPcUhhfkNVA_JcdU6KLTOFjRCnNl6n8gamJA-Q0PgCpIAiBTMV2k2JfHzbHBtsHxuNW7zHvSaYaUbz-dEIQC45o1eA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] - #[case::noformat(StreamFilter::default().audio_formats(&[]).to_owned(), None)] - #[case::nocodec(StreamFilter::default().audio_codecs(&[]).to_owned(), None)] + #[case::bitrate(StreamFilter::default().audio_max_bitrate(100_000).clone(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=8217508&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=250&keepalive=yes&lmt=1683782195315620&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIga2iMQsToMxO7hTOx0gNAzhYoV1lL5PpE9lkAuBXt1nkCIQCuFuQXWNixIquEugtkT1C9khuKRP_C-wzSOiUmRp1DRg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::m4a_format(StreamFilter::default().audio_formats(&[AudioFormat::M4a]).clone(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::m4a_codec(StreamFilter::default().audio_codecs(&[AudioCodec::Mp4a]).clone(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16390508&dur=1012.691&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=140&keepalive=yes&lmt=1683782363698612&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fmp4&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRgIhAMgM470I-QXq4lTRuPtXf5UInHB_tG0tTGXRhVZ6nwImAiEAn0JYRknq5dtTwcmzZheekxVOZKhZ2Rpxc_UyvX2CMRY%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::french(StreamFilter::default().audio_language("fr").clone(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=940286&dur=60.101&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683774002236584&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAIUUin7WZBnoVDb2p0wuTPc7HZwbF8I5sxzLrVN9WeBwAiBQTZwhxCQ1IdrUkkD1-cSGYBtMF1aKkjPZ-LWeie0aZA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Ddubbed%3Alang%3Dfr"))] + #[case::br_fallback(StreamFilter::default().audio_max_bitrate(0).clone(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=6306327&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=249&keepalive=yes&lmt=1683782187865292&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRAIgW1DTCrLV_GyEM1rdjScgyceZE1llb73KJMFXmPm5Y04CIAYOLZuuzFX4ba5720kMOcQ1-Ld1DULs85nLxJglitCl&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::lang_fallback(StreamFilter::default().audio_language("xx").clone(), Some("https://rr4---sn-h0jeener.googlevideo.com/videoplayback?c=WEB&clen=16104136&dur=1012.661&ei=6OtcZNqtBdOi7gP1upHYCQ&expire=1683832904&fexp=24007246&fvip=2&gir=yes&id=o-ABVtPh3j24hkJeXp8igjvreyODn-oV0CacOqb7pDjJoG&initcwndbps=1720000&ip=2003%3Ade%3Aaf31%3A5200%3A791a%3A897%3Ac15c%3Aae59&itag=251&keepalive=yes&lmt=1683782301237288&lsig=AG3C_xAwRQIgC7HZtYuc6dI92m6wCcoXYpdzSpVtPTIbO7jBKGpUrYMCIQCc0WNtFvN8Awqx9uuRVp5SUSe3rOt2D7M-rCKpgVv_0A%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=wB&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jeener%2Csn-h0jeln7l&ms=au%2Crdu&mt=1683811031&mv=m&mvi=4&n=U8mCOo4eYD4n0A&ns=LToEdXWVFHcH53e3aTe1N7kN&pl=37&requiressl=yes&sig=AOq0QJ8wRQIhAPcUhhfkNVA_JcdU6KLTOFjRCnNl6n8gamJA-Q0PgCpIAiBTMV2k2JfHzbHBtsHxuNW7zHvSaYaUbz-dEIQC45o1eA%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cxtags%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=qEK7B81AP536F3aOi5JzMyLCUDiktWigtEpf9nI2xg&svpuc=1&txp=4532434&vprv=1&xtags=acont%3Doriginal%3Alang%3Den-US"))] + #[case::noformat(StreamFilter::default().audio_formats(&[]).clone(), None)] + #[case::nocodec(StreamFilter::default().audio_codecs(&[]).clone(), None)] fn t_select_audio_stream(#[case] filter: StreamFilter, #[case] expect_url: Option<&str>) { let selection = PLAYER_ML.select_audio_stream(&filter); @@ -391,14 +391,14 @@ mod tests { #[rstest] #[case::default(StreamFilter::default(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=998696577&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=315&keepalive=yes&lmt=1647476955807851&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIfP4IVSo-00_kq_JIkuh032hcLoJzNEhYjvwgLiDpEzQIhALPVrvDBjRwiFddXiAyADmRtYygte4HvlJ3XOrkOf_TR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::hdr(StreamFilter::default().video_hdr().to_owned(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=976824147&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=701&keepalive=yes&lmt=1647469891607029&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAOax_lAWCW5ENOYxe3gZfBHgHA5oZJPyMlYQFy73t7-pAiEA46J7dsT-1pv9smuoP3Kx5T7c_IJ6cEZN4U9UkSNuT7o%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::resolution(StreamFilter::default().video_max_res(720).to_owned(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=76313586&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=302&keepalive=yes&lmt=1647455155369524&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgW0H1434eh9Axw6zw95qezJB0D2aVd2bxEIs4T5bcfFACIDOjha9WLycp0L188FZyFGa1RBkLPoGrrJOppsaXqwDR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::resolution_fps(StreamFilter::default().video_max_res(720).video_max_fps(30).to_owned(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=47531179&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=247&keepalive=yes&lmt=1647458657499381&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMUsmcl1zgbr3YQranPWNV1kcxT5IdEoLL7FTFEDdHHPAiEAhQnrfYMU0A9xZ69MfBujWA4pXtCOQCg2Jn6ve9J_vBQ%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::res_fallback(StreamFilter::default().video_max_res(100).to_owned(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=2763284&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=160&keepalive=yes&lmt=1647456833049253&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgLPNxzLxppSSpnDEHxVblrQ38890NMbGnLXlmxljprfQCIQDn4Ir_sjYh7S3ms-Rynm-K0nJpHpQGYsz1nv4TiqeELQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::webm_format(StreamFilter::default().video_formats(&[VideoFormat::Webm]).to_owned(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=998696577&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=315&keepalive=yes&lmt=1647476955807851&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIfP4IVSo-00_kq_JIkuh032hcLoJzNEhYjvwgLiDpEzQIhALPVrvDBjRwiFddXiAyADmRtYygte4HvlJ3XOrkOf_TR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::vp9_codec(StreamFilter::default().video_codecs(&[VideoCodec::Vp9]).to_owned(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=998696577&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=315&keepalive=yes&lmt=1647476955807851&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIfP4IVSo-00_kq_JIkuh032hcLoJzNEhYjvwgLiDpEzQIhALPVrvDBjRwiFddXiAyADmRtYygte4HvlJ3XOrkOf_TR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] - #[case::noformat(StreamFilter::default().video_formats(&[]).to_owned(), None)] - #[case::nocodec(StreamFilter::default().video_codecs(&[]).to_owned(), None)] + #[case::hdr(StreamFilter::default().video_hdr().clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=976824147&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=701&keepalive=yes&lmt=1647469891607029&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAOax_lAWCW5ENOYxe3gZfBHgHA5oZJPyMlYQFy73t7-pAiEA46J7dsT-1pv9smuoP3Kx5T7c_IJ6cEZN4U9UkSNuT7o%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] + #[case::resolution(StreamFilter::default().video_max_res(720).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=76313586&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=302&keepalive=yes&lmt=1647455155369524&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIgW0H1434eh9Axw6zw95qezJB0D2aVd2bxEIs4T5bcfFACIDOjha9WLycp0L188FZyFGa1RBkLPoGrrJOppsaXqwDR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] + #[case::resolution_fps(StreamFilter::default().video_max_res(720).video_max_fps(30).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=47531179&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=247&keepalive=yes&lmt=1647458657499381&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRgIhAMUsmcl1zgbr3YQranPWNV1kcxT5IdEoLL7FTFEDdHHPAiEAhQnrfYMU0A9xZ69MfBujWA4pXtCOQCg2Jn6ve9J_vBQ%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] + #[case::res_fallback(StreamFilter::default().video_max_res(100).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=2763284&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=160&keepalive=yes&lmt=1647456833049253&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgLPNxzLxppSSpnDEHxVblrQ38890NMbGnLXlmxljprfQCIQDn4Ir_sjYh7S3ms-Rynm-K0nJpHpQGYsz1nv4TiqeELQ%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] + #[case::webm_format(StreamFilter::default().video_formats(&[VideoFormat::Webm]).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=998696577&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=315&keepalive=yes&lmt=1647476955807851&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIfP4IVSo-00_kq_JIkuh032hcLoJzNEhYjvwgLiDpEzQIhALPVrvDBjRwiFddXiAyADmRtYygte4HvlJ3XOrkOf_TR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] + #[case::vp9_codec(StreamFilter::default().video_codecs(&[VideoCodec::Vp9]).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=998696577&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=315&keepalive=yes&lmt=1647476955807851&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIfP4IVSo-00_kq_JIkuh032hcLoJzNEhYjvwgLiDpEzQIhALPVrvDBjRwiFddXiAyADmRtYygte4HvlJ3XOrkOf_TR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"))] + #[case::noformat(StreamFilter::default().video_formats(&[]).clone(), None)] + #[case::nocodec(StreamFilter::default().video_codecs(&[]).clone(), None)] fn t_select_video_only_stream(#[case] filter: StreamFilter, #[case] expect_url: Option<&str>) { let selection = PLAYER_HDR.select_video_only_stream(&filter); @@ -415,21 +415,21 @@ mod tests { Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?c=WEB&clen=5199784&dur=313.801&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=251&keepalive=yes&lmt=1647453650291076&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhALtI3j8ZChpNb0LcyDZ3yosbWnSpqaO0-jKAe_UM_RQyAiAMwrpdeNbJEnQn3q1eveaAcRcNIwy5iJ4fIjeBW_MUfg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1") )] #[case::webm( - StreamFilter::default().video_formats(&[VideoFormat::Webm]).to_owned(), + StreamFilter::default().video_formats(&[VideoFormat::Webm]).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278%2C298%2C299%2C302%2C303%2C308%2C315%2C330%2C331%2C332%2C333%2C334%2C335%2C336%2C337%2C394%2C395%2C396%2C397%2C398%2C399%2C400%2C401%2C694%2C695%2C696%2C697%2C698%2C699%2C700%2C701&c=WEB&clen=998696577&dur=313.780&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=315&keepalive=yes&lmt=1647476955807851&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRAIfP4IVSo-00_kq_JIkuh032hcLoJzNEhYjvwgLiDpEzQIhALPVrvDBjRwiFddXiAyADmRtYygte4HvlJ3XOrkOf_TR&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1"), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?c=WEB&clen=5199784&dur=313.801&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=251&keepalive=yes&lmt=1647453650291076&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhALtI3j8ZChpNb0LcyDZ3yosbWnSpqaO0-jKAe_UM_RQyAiAMwrpdeNbJEnQn3q1eveaAcRcNIwy5iJ4fIjeBW_MUfg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1") )] #[case::noaudio( - StreamFilter::default().audio_formats(&[]).to_owned(), + StreamFilter::default().audio_formats(&[]).clone(), Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?c=WEB&clen=23544588&dur=313.834&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=18&lmt=1647456546485912&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=video%2Fmp4&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=HWZNhARNT_nJgg&ns=pLFQxzhiCbZ9F2HJmDLveKoH&pl=37&ratebypass=yes&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIgeCEjusAq6p33rH0NHyTAbPIRaaEkjDE32AXBFzDvR-ICIQD0LI8hQVH8oCMWu6OuADzc1FSQhIqYs5RLkxBmObIdsw%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4530434&vprv=1"), None )] #[case::novideo( - StreamFilter::default().no_video().to_owned(), + StreamFilter::default().no_video().clone(), None, Some("https://rr5---sn-h0jelne7.googlevideo.com/videoplayback?c=WEB&clen=5199784&dur=313.801&ei=eckIY72IKcGZ8gOMt6CwDg&expire=1661541849&fexp=24001373%2C24007246&fvip=2&gir=yes&id=o-AOqXE9lVS424yszv6LN5V_gaevdHxenJl-tYNy3Drs6g&initcwndbps=1428750&ip=2003%3Ade%3Aaf05%3A2500%3A5dad%3A319b%3Aca30%3Ae212&itag=251&keepalive=yes&lmt=1647453650291076&lsig=AG3C_xAwRQIhAMioKyc-dqs-6uvAwLViCcCTXKHn9sIbo0cbSSBXGG4kAiBQNsRBAvQrbWdOjZIsQXYrfPEb1KDpE_AlSEGQZXB9uA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&mh=NH&mime=audio%2Fwebm&mm=31%2C29&mn=sn-h0jelne7%2Csn-h0jeenl6&ms=au%2Crdu&mt=1661519833&mv=m&mvi=5&n=Zd7nrOM1B2C6PA&ns=426LxLap5MonJD_YWdS4lSYH&pl=37&rbqsm=fr&requiressl=yes&sig=AOq0QJ8wRQIhALtI3j8ZChpNb0LcyDZ3yosbWnSpqaO0-jKAe_UM_RQyAiAMwrpdeNbJEnQn3q1eveaAcRcNIwy5iJ4fIjeBW_MUfg%3D%3D&source=youtube&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&spc=lT-KhuPtxVzL5-QbZ7S9zNeOHsWTdms&txp=4532434&vprv=1") )] - #[case::noformat(StreamFilter::default().audio_formats(&[]).video_formats(&[]).to_owned(), None, None)] + #[case::noformat(StreamFilter::default().audio_formats(&[]).video_formats(&[]).clone(), None, None)] fn t_select_video_audio_stream( #[case] filter: StreamFilter, #[case] expect_video_url: Option<&str>, diff --git a/src/serializer/text.rs b/src/serializer/text.rs index c3c9617..6b0d877 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -809,7 +809,7 @@ mod tests { let test_json = r#"{"ln": {}}"#; let res = serde_json::from_str::(test_json).unwrap(); - assert!(res.ln.0.is_empty()) + assert!(res.ln.0.is_empty()); } #[test] diff --git a/src/util/mod.rs b/src/util/mod.rs index 5a6b82b..91c1ddc 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -174,7 +174,7 @@ where /// and return the duration in seconds. pub fn parse_video_length(text: &str) -> Option { static VIDEO_LENGTH_REGEX: Lazy = - Lazy::new(|| Regex::new(r#"(?:(\d+)[:.])?(\d{1,2})[:.](\d{2})"#).unwrap()); + Lazy::new(|| Regex::new(r"(?:(\d+)[:.])?(\d{1,2})[:.](\d{2})").unwrap()); VIDEO_LENGTH_REGEX.captures(text).map(|cap| { let hrs = cap .get(1) @@ -550,7 +550,7 @@ pub(crate) mod tests { #[case("bla 2:02 h3llo w0rld", Some(122))] #[case("18:22", Some(1102))] #[case("1:48:18", Some(6498))] - #[case("102:12:39", Some(367959))] + #[case("102:12:39", Some(367_959))] #[case("42", None)] fn t_parse_video_length(#[case] text: &str, #[case] expect: Option) { let n = parse_video_length(text); @@ -625,11 +625,11 @@ pub(crate) mod tests { let number_samples: BTreeMap> = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - number_samples.iter().for_each(|(lang, entry)| { - entry.iter().for_each(|(txt, expect)| { + for (lang, entry) in &number_samples { + for (txt, expect) in entry { testcase_parse_large_numstr(txt, *lang, *expect); - }); - }); + } + } } fn testcase_parse_large_numstr(string: &str, lang: Language, expect: u64) { @@ -658,7 +658,7 @@ pub(crate) mod tests { let res = SplitTokens::new(teststr, true).collect::>(); assert_eq!(res.len(), 10); let res_str = res.into_iter().collect::(); - assert_eq!(res_str, teststr) + assert_eq!(res_str, teststr); } #[test] @@ -667,7 +667,7 @@ pub(crate) mod tests { let res = SplitTokens::new(teststr, false).collect::>(); assert_eq!(res.len(), 3); let res_str = res.join(" "); - assert_eq!(res_str, teststr) + assert_eq!(res_str, teststr); } #[rstest] diff --git a/src/util/timeago.rs b/src/util/timeago.rs index f3b42f4..673e4de 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -597,7 +597,7 @@ mod tests { "Language: {lang}, txt: `{s}`" ); }); - }) + }); } #[test] @@ -786,7 +786,7 @@ mod tests { "Language: {lang}, txt: `{s}`" ); }); - }) + }); } #[test] @@ -808,7 +808,7 @@ mod tests { let mut n_cases = 0; timeago_table.entries.iter().for_each(|(lang, entries)| { - entries.iter().for_each(|(t, entry)| { + for (t, entry) in entries { entry.cases.iter().for_each(|(txt, n)| { let timeago = parse_timeago(*lang, txt); assert_eq!( @@ -818,11 +818,11 @@ mod tests { ); n_cases += 1; - }) - }); + }); + } }); - assert_eq!(n_cases, 1065) + assert_eq!(n_cases, 1065); } #[rstest] @@ -837,7 +837,7 @@ mod tests { )] #[case( Language::Bn, - "যোগ দিয়েছেন 24 সেপ, 2013", + "যোগ দিয়েছেন 24 সেপ, 2013", Some(ParsedDate::Absolute(date!(2013-9-24))) )] fn t_parse_date( @@ -941,7 +941,7 @@ mod tests { Some(ParsedDate::Absolute(date!(2021 - 12 - 24))), "lang: {lang}" ); - }) + }); } #[test] @@ -951,15 +951,15 @@ mod tests { let date_samples: BTreeMap> = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - date_samples.iter().for_each(|(lang, samples)| { + for (lang, samples) in &date_samples { samples.iter().for_each(|(txt, duration)| { assert_eq!( parse_video_duration(*lang, txt), Some(*duration), "lang: {lang}; txt: `{txt}`" ); - }) - }); + }); + } } #[rstest] @@ -985,12 +985,4 @@ mod tests { let now = OffsetDateTime::now_utc(); assert_eq!(date.year(), now.year() - 1); } - - #[test] - fn tx() { - let s = "Abcdef"; - let lc: (usize, char) = s.char_indices().last().unwrap(); - let t = &s[(lc.0 + lc.1.len_utf8())..]; - dbg!(&t); - } } diff --git a/tests/youtube.rs b/tests/youtube.rs index 24a2098..cdc6a53 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1,3 +1,5 @@ +#![allow(clippy::too_many_arguments, clippy::items_after_test_module)] + use std::collections::{HashMap, HashSet}; use std::fmt::Display; use std::str::FromStr; @@ -2029,7 +2031,7 @@ fn music_related(#[case] id: &str, #[case] full: bool, rp: RustyPipe) { let artist = track.artists.first().unwrap(); assert!(!artist.name.is_empty()); if let Some(artist_id) = &artist.id { - validate::channel_id(&artist_id).unwrap(); + validate::channel_id(artist_id).unwrap(); track_artists += 1; } From abd3317a10535203adab0bda236c4ace66435b63 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 16 Sep 2023 23:34:34 +0200 Subject: [PATCH 046/459] chore: fix clippy lints --- .pre-commit-config.yaml | 2 +- src/util/timeago.rs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5c65c90..defbeb7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,4 +10,4 @@ repos: hooks: - id: cargo-fmt - id: cargo-clippy - args: ["--all", "--features=rss", "--", "-D", "warnings"] + args: ["--all", "--tests", "--features=rss", "--", "-D", "warnings"] diff --git a/src/util/timeago.rs b/src/util/timeago.rs index 673e4de..1069ffc 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -588,7 +588,7 @@ mod tests { let strings_map: BTreeMap> = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - strings_map.iter().for_each(|(lang, strings)| { + for (lang, strings) in &strings_map { assert_eq!(strings.len(), expect.len()); strings.iter().enumerate().for_each(|(n, s)| { assert_eq!( @@ -597,7 +597,7 @@ mod tests { "Language: {lang}, txt: `{s}`" ); }); - }); + } } #[test] @@ -771,7 +771,7 @@ mod tests { let strings_map: BTreeMap> = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - strings_map.iter().for_each(|(lang, strings)| { + for (lang, strings) in &strings_map { assert_eq!(strings.len(), expect.len(), "Language: {lang}"); strings.iter().enumerate().for_each(|(n, s)| { let mut exp = expect[n]; @@ -786,7 +786,7 @@ mod tests { "Language: {lang}, txt: `{s}`" ); }); - }); + } } #[test] @@ -856,7 +856,7 @@ mod tests { let date_samples: BTreeMap> = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - date_samples.iter().for_each(|(lang, samples)| { + for (lang, samples) in &date_samples { assert_eq!( parse_textual_date(*lang, samples.get("Today").unwrap()), Some(ParsedDate::Relative(TimeAgo { @@ -941,7 +941,7 @@ mod tests { Some(ParsedDate::Absolute(date!(2021 - 12 - 24))), "lang: {lang}" ); - }); + } } #[test] @@ -952,13 +952,13 @@ mod tests { serde_json::from_reader(BufReader::new(json_file)).unwrap(); for (lang, samples) in &date_samples { - samples.iter().for_each(|(txt, duration)| { + for (txt, duration) in samples { assert_eq!( parse_video_duration(*lang, txt), Some(*duration), "lang: {lang}; txt: `{txt}`" ); - }); + } } } From ab599206c59bb4522e8ba3bf5fb7366c5d276120 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Sep 2023 02:50:44 +0200 Subject: [PATCH 047/459] tests: expect album for artist top tracks --- tests/youtube.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index cdc6a53..9528b99 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1491,12 +1491,17 @@ fn music_artist( assert_gte(artist.subscriber_count.unwrap(), 30000, "subscribers"); } + artist.tracks.iter().for_each(|t| { + assert!(!t.cover.is_empty()); + if t.is_video { + assert!(t.view_count.is_some()); + } else { + assert!(t.album.is_some()); + } + }); + // Check images assert!(!artist.header_image.is_empty(), "got no header image"); - artist - .tracks - .iter() - .for_each(|t| assert!(!t.cover.is_empty())); artist .albums .iter() From 1d1dcd622fa068d2c2b1cd03c0bc74163c6bd137 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Sep 2023 03:22:38 +0200 Subject: [PATCH 048/459] feat: add tracing --- Cargo.toml | 4 +--- cli/Cargo.toml | 2 +- cli/src/main.rs | 3 ++- src/cache.rs | 2 +- src/client/channel.rs | 23 ++++++++++++++++------- src/client/channel_rss.rs | 8 +++++++- src/client/mod.rs | 29 ++++++++++++++++------------- src/client/music_artist.rs | 3 ++- src/client/music_charts.rs | 1 + src/client/music_details.rs | 26 +++++++++++++++++++------- src/client/music_genres.rs | 9 +++++++-- src/client/music_new.rs | 2 ++ src/client/music_playlist.rs | 11 ++++++++--- src/client/music_search.rs | 29 ++++++++++++++++++++--------- src/client/pagination.rs | 5 ++++- src/client/player.rs | 7 +++++-- src/client/playlist.rs | 5 +++-- src/client/search.rs | 14 +++++++++++--- src/client/trends.rs | 2 ++ src/client/url_resolver.rs | 8 +++++--- src/client/video_details.rs | 11 +++++++++-- src/deobfuscate.rs | 6 +++--- src/report.rs | 2 +- tests/youtube.rs | 2 -- 24 files changed, 146 insertions(+), 68 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fb0549d..620b143 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,6 @@ regex = "1.6.0" fancy-regex = "0.11.0" thiserror = "1.0.36" url = "2.2.2" -log = "0.4.17" reqwest = { version = "0.11.11", default-features = false, features = [ "json", "gzip", @@ -61,10 +60,9 @@ phf = "0.11.1" base64 = "0.21.0" urlencoding = "2.1.2" quick-xml = { version = "0.29.0", features = ["serialize"], optional = true } +tracing = { version = "0.1.37", features = ["log"] } [dev-dependencies] -env_logger = "0.10.0" -test-log = "0.2.11" rstest = "0.18.1" tokio-test = "0.4.2" insta = { version = "1.17.1", features = ["ron", "redactions"] } diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 5dab51e..8f2fa8c 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -47,7 +47,7 @@ indicatif = "0.17.0" futures = "0.3.21" anyhow = "1.0" clap = { version = "4.0.29", features = ["derive"] } -env_logger = "0.10.0" +tracing-subscriber = "0.3.17" serde = "1.0" serde_json = "1.0.82" serde_yaml = "0.9.19" diff --git a/cli/src/main.rs b/cli/src/main.rs index 3bef694..b960851 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -390,7 +390,8 @@ async fn download_videos( #[tokio::main] async fn main() { - env_logger::builder().format_timestamp_micros().init(); + // env_logger::builder().format_timestamp_micros().init(); + tracing_subscriber::fmt::init(); let cli = Cli::parse(); diff --git a/src/cache.rs b/src/cache.rs index 970ca1a..8015cb9 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -20,7 +20,7 @@ use std::{ path::{Path, PathBuf}, }; -use log::error; +use tracing::error; pub(crate) const DEFAULT_CACHE_FILE: &str = "rustypipe_cache.json"; diff --git a/src/client/channel.rs b/src/client/channel.rs index 7091278..a002908 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use serde::Serialize; use url::Url; @@ -78,7 +80,8 @@ impl RustyPipeQuery { } /// Get the videos from a YouTube channel - pub async fn channel_videos>( + #[tracing::instrument(skip(self))] + pub async fn channel_videos + Debug>( &self, channel_id: S, ) -> Result>, Error> { @@ -89,7 +92,8 @@ impl RustyPipeQuery { /// Get a ordered list of videos from a YouTube channel /// /// This function does not return channel metadata. - pub async fn channel_videos_order>( + #[tracing::instrument(skip(self))] + pub async fn channel_videos_order + Debug>( &self, channel_id: S, order: ChannelOrder, @@ -99,7 +103,8 @@ impl RustyPipeQuery { } /// Get the videos of the given tab (Shorts, Livestreams) from a YouTube channel - pub async fn channel_videos_tab>( + #[tracing::instrument(skip(self))] + pub async fn channel_videos_tab + Debug>( &self, channel_id: S, tab: ChannelVideoTab, @@ -111,7 +116,8 @@ impl RustyPipeQuery { /// Get a ordered list of videos from the given tab (Shorts, Livestreams) of a YouTube channel /// /// This function does not return channel metadata. - pub async fn channel_videos_tab_order>( + #[tracing::instrument(skip(self))] + pub async fn channel_videos_tab_order + Debug>( &self, channel_id: S, tab: ChannelVideoTab, @@ -128,7 +134,8 @@ impl RustyPipeQuery { } /// Search the videos of a channel - pub async fn channel_search, S2: AsRef>( + #[tracing::instrument(skip(self))] + pub async fn channel_search + Debug, S2: AsRef + Debug>( &self, channel_id: S, query: S2, @@ -143,7 +150,8 @@ impl RustyPipeQuery { } /// Get the playlists of a channel - pub async fn channel_playlists>( + #[tracing::instrument(skip(self))] + pub async fn channel_playlists + Debug>( &self, channel_id: S, ) -> Result>, Error> { @@ -167,7 +175,8 @@ impl RustyPipeQuery { } /// Get additional metadata from the *About* tab of a channel - pub async fn channel_info>( + #[tracing::instrument(skip(self))] + pub async fn channel_info + Debug>( &self, channel_id: S, ) -> Result, Error> { diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index f12f9de..ad9e1b9 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use crate::{ error::{Error, ExtractionError}, model::ChannelRss, @@ -15,7 +17,11 @@ impl RustyPipeQuery { /// for checking a lot of channels or implementing a subscription feed. /// /// The downside of using the RSS feed is that it does not provide video durations. - pub async fn channel_rss>(&self, channel_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn channel_rss + Debug>( + &self, + channel_id: S, + ) -> Result { let channel_id = channel_id.as_ref(); let url = format!("https://www.youtube.com/feeds/videos.xml?channel_id={channel_id}"); let xml = self diff --git a/src/client/mod.rs b/src/client/mod.rs index b234af7..6c688de 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -489,7 +489,7 @@ impl RustyPipeBuilder { .and_then(|data| match serde_json::from_str::(&data) { Ok(data) => Some(data), Err(e) => { - log::error!("Could not deserialize cache. Error: {}", e); + tracing::error!("Could not deserialize cache. Error: {}", e); None } }) @@ -745,7 +745,7 @@ impl RustyPipe { // Retry in case of a recoverable status code (server err, too many requests) if n != self.inner.n_http_retries { let ms = util::retry_delay(n, 1000, 60000, 3); - log::warn!( + tracing::warn!( "Retry attempt #{}. Error: {}. Waiting {} ms", n + 1, status, @@ -866,7 +866,7 @@ impl RustyPipe { match desktop_client.get() { Some(cdata) => cdata.version.clone(), None => { - log::debug!("getting desktop client version"); + tracing::debug!("getting desktop client version"); match self.extract_desktop_client_version().await { Ok(version) => { *desktop_client = CacheEntry::from(ClientData { @@ -877,7 +877,7 @@ impl RustyPipe { version } Err(e) => { - log::warn!("{}, falling back to hardcoded desktop client version", e); + tracing::warn!("{}, falling back to hardcoded desktop client version", e); DESKTOP_CLIENT_VERSION.to_owned() } } @@ -898,7 +898,7 @@ impl RustyPipe { match music_client.get() { Some(cdata) => cdata.version.clone(), None => { - log::debug!("getting music client version"); + tracing::debug!("getting music client version"); match self.extract_music_client_version().await { Ok(version) => { *music_client = CacheEntry::from(ClientData { @@ -909,7 +909,7 @@ impl RustyPipe { version } Err(e) => { - log::warn!("{}, falling back to hardcoded music client version", e); + tracing::warn!("{}, falling back to hardcoded music client version", e); DESKTOP_MUSIC_CLIENT_VERSION.to_owned() } } @@ -925,7 +925,7 @@ impl RustyPipe { match deobf_data.get() { Some(deobf_data) => Ok(deobf_data.clone()), None => { - log::debug!("getting deobf data"); + tracing::debug!("getting deobf data"); match DeobfData::extract(self.inner.http.clone(), self.inner.reporter.as_deref()) .await @@ -941,7 +941,7 @@ impl RustyPipe { // Try to fall back to expired cache data if available, otherwise return error match deobf_data.get_expired() { Some(d) => { - log::warn!("could not get new deobf data ({e}), falling back to expired cache"); + tracing::warn!("could not get new deobf data ({e}), falling back to expired cache"); Ok(d.clone()) } None => Err(e), @@ -963,7 +963,7 @@ impl RustyPipe { match serde_json::to_string(&cdata) { Ok(data) => storage.write(&data), - Err(e) => log::error!("Could not serialize cache. Error: {}", e), + Err(e) => tracing::error!("Could not serialize cache. Error: {}", e), } } } @@ -976,7 +976,7 @@ impl RustyPipe { /// Sometimes YouTube does not set the `__Secure-YEC` cookie. In this case, the /// visitor data is extracted from the html page. async fn get_visitor_data(&self) -> Result { - log::debug!("getting YT visitor data"); + tracing::debug!("getting YT visitor data"); let resp = self.inner.http.get(YOUTUBE_MUSIC_HOME_URL).send().await?; let vdata = resp @@ -1284,6 +1284,7 @@ impl RustyPipeQuery { let status = response.status(); let body = response.text().await?; + tracing::debug!("fetched {} bytes from YT", body.len()); let res = if status.is_client_error() || status.is_server_error() { let error_msg = serde_json::from_str::(&body) @@ -1314,9 +1315,11 @@ impl RustyPipeQuery { } }; + tracing::debug!("mapped response"); Ok(RequestResult { res, status, body }) } + #[tracing::instrument(skip_all)] async fn yt_request + Debug, M>( &self, request: &Request, @@ -1339,7 +1342,7 @@ impl RustyPipeQuery { if n != self.client.inner.n_http_retries { let ms = util::retry_delay(n, 1000, 60000, 3); - log::warn!( + tracing::warn!( "Retry attempt #{}. Error: {}. Waiting {} ms", n + 1, err, @@ -1380,7 +1383,7 @@ impl RustyPipeQuery { body: &B, deobf: Option<&DeobfData>, ) -> Result { - log::debug!("getting {}({})", operation, id); + tracing::debug!("getting {}({})", operation, id); let request = self .request_builder(ctype, endpoint) @@ -1528,7 +1531,7 @@ trait MapResponse { fn validate_country(country: Country) -> Country { if country == Country::Zz { - log::warn!("Country:Zz (Global) can only be used for fetching music charts, falling back to Country:Us"); + tracing::warn!("Country:Zz (Global) can only be used for fetching music charts, falling back to Country:Us"); Country::Us } else { country diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index 9ec1202..dcb7c77 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use once_cell::sync::Lazy; use regex::Regex; +use tracing::debug; use crate::{ client::response::url_endpoint::NavigationEndpoint, @@ -29,7 +30,7 @@ impl RustyPipeQuery { let res = self._music_artist(artist_id, all_albums).await; if let Err(Error::Extraction(ExtractionError::Redirect(id))) = res { - log::debug!("music artist {} redirects to {}", artist_id, &id); + debug!("music artist {} redirects to {}", artist_id, &id); self._music_artist(&id, all_albums).await } else { res diff --git a/src/client/music_charts.rs b/src/client/music_charts.rs index 87bc5a2..7fc5b5a 100644 --- a/src/client/music_charts.rs +++ b/src/client/music_charts.rs @@ -32,6 +32,7 @@ struct FormData { impl RustyPipeQuery { /// Get the YouTube Music charts for a given country + #[tracing::instrument(skip(self))] pub async fn music_charts(&self, country: Option) -> Result { let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QCharts { diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 9a6d620..60980c9 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Debug}; use serde::Serialize; @@ -38,7 +38,11 @@ struct QRadio<'a> { impl RustyPipeQuery { /// Get the metadata of a YouTube music track - pub async fn music_details>(&self, video_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn music_details + Debug>( + &self, + video_id: S, + ) -> Result { let video_id = video_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QMusicDetails { @@ -62,7 +66,8 @@ impl RustyPipeQuery { /// Get the lyrics of a YouTube music track /// /// The `lyrics_id` has to be obtained using [`RustyPipeQuery::music_details`]. - pub async fn music_lyrics>(&self, lyrics_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn music_lyrics + Debug>(&self, lyrics_id: S) -> Result { let lyrics_id = lyrics_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { @@ -83,7 +88,11 @@ impl RustyPipeQuery { /// Get related items (tracks, playlists, artists) to a YouTube Music track /// /// The `related_id` has to be obtained using [`RustyPipeQuery::music_details`]. - pub async fn music_related>(&self, related_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn music_related + Debug>( + &self, + related_id: S, + ) -> Result { let related_id = related_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { @@ -104,7 +113,8 @@ impl RustyPipeQuery { /// Get a YouTube Music radio (a dynamically generated playlist) /// /// The `radio_id` can be obtained using [`RustyPipeQuery::music_artist`] to get an artist's radio. - pub async fn music_radio>( + #[tracing::instrument(skip(self))] + pub async fn music_radio + Debug>( &self, radio_id: S, ) -> Result, Error> { @@ -133,7 +143,8 @@ impl RustyPipeQuery { } /// Get a YouTube Music radio (a dynamically generated playlist) for a track - pub async fn music_radio_track>( + #[tracing::instrument(skip(self))] + pub async fn music_radio_track + Debug>( &self, video_id: S, ) -> Result, Error> { @@ -142,7 +153,8 @@ impl RustyPipeQuery { } /// Get a YouTube Music radio (a dynamically generated playlist) for a playlist - pub async fn music_radio_playlist>( + #[tracing::instrument(skip(self))] + pub async fn music_radio_playlist + Debug>( &self, playlist_id: S, ) -> Result, Error> { diff --git a/src/client/music_genres.rs b/src/client/music_genres.rs index f62273d..7fc2511 100644 --- a/src/client/music_genres.rs +++ b/src/client/music_genres.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Debug}; use crate::{ error::{Error, ExtractionError}, @@ -13,6 +13,7 @@ use super::{ impl RustyPipeQuery { /// Get a list of moods and genres from YouTube Music + #[tracing::instrument(skip(self))] pub async fn music_genres(&self) -> Result, Error> { let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { @@ -31,7 +32,11 @@ impl RustyPipeQuery { } /// Get the playlists from a YouTube Music genre - pub async fn music_genre>(&self, genre_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn music_genre + Debug>( + &self, + genre_id: S, + ) -> Result { let genre_id = genre_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowseParams { diff --git a/src/client/music_new.rs b/src/client/music_new.rs index 7abb1fa..dde4d2c 100644 --- a/src/client/music_new.rs +++ b/src/client/music_new.rs @@ -10,6 +10,7 @@ use super::{response, ClientType, MapResponse, QBrowse, RustyPipeQuery}; impl RustyPipeQuery { /// Get the new albums that were released on YouTube Music + #[tracing::instrument(skip(self))] pub async fn music_new_albums(&self) -> Result, Error> { let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { @@ -28,6 +29,7 @@ impl RustyPipeQuery { } /// Get the new music videos that were released on YouTube Music + #[tracing::instrument(skip(self))] pub async fn music_new_videos(&self) -> Result, Error> { let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 41f8974..00230e6 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Debug}; use crate::{ error::{Error, ExtractionError}, @@ -17,7 +17,8 @@ use super::{ impl RustyPipeQuery { /// Get a playlist from YouTube Music - pub async fn music_playlist>( + #[tracing::instrument(skip(self))] + pub async fn music_playlist + Debug>( &self, playlist_id: S, ) -> Result { @@ -39,7 +40,11 @@ impl RustyPipeQuery { } /// Get an album from YouTube Music - pub async fn music_album>(&self, album_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn music_album + Debug>( + &self, + album_id: S, + ) -> Result { let album_id = album_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { diff --git a/src/client/music_search.rs b/src/client/music_search.rs index 5c3d15c..765f913 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Debug}; use serde::Serialize; @@ -48,7 +48,11 @@ enum Params { impl RustyPipeQuery { /// Search YouTube Music. Returns items from any type. - pub async fn music_search>(&self, query: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn music_search + Debug>( + &self, + query: S, + ) -> Result { let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { @@ -68,7 +72,8 @@ impl RustyPipeQuery { } /// Search YouTube Music tracks - pub async fn music_search_tracks>( + #[tracing::instrument(skip(self))] + pub async fn music_search_tracks + Debug>( &self, query: S, ) -> Result, Error> { @@ -76,7 +81,8 @@ impl RustyPipeQuery { } /// Search YouTube Music videos - pub async fn music_search_videos>( + #[tracing::instrument(skip(self))] + pub async fn music_search_videos + Debug>( &self, query: S, ) -> Result, Error> { @@ -107,7 +113,8 @@ impl RustyPipeQuery { } /// Search YouTube Music albums - pub async fn music_search_albums>( + #[tracing::instrument(skip(self))] + pub async fn music_search_albums + Debug>( &self, query: S, ) -> Result, Error> { @@ -130,10 +137,12 @@ impl RustyPipeQuery { } /// Search YouTube Music artists - pub async fn music_search_artists( + #[tracing::instrument(skip(self))] + pub async fn music_search_artists + Debug>( &self, - query: &str, + query: S, ) -> Result, Error> { + let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, @@ -154,7 +163,8 @@ impl RustyPipeQuery { /// /// Playlists are filtered whether they are created by users /// (`community=true`) or by YouTube Music (`community=false`) - pub async fn music_search_playlists>( + #[tracing::instrument(skip(self))] + pub async fn music_search_playlists + Debug>( &self, query: S, community: bool, @@ -182,7 +192,8 @@ impl RustyPipeQuery { } /// Get YouTube Music search suggestions - pub async fn music_search_suggestion>( + #[tracing::instrument(skip(self))] + pub async fn music_search_suggestion + Debug>( &self, query: S, ) -> Result { diff --git a/src/client/pagination.rs b/src/client/pagination.rs index 57387b6..4602b78 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use crate::error::{Error, ExtractionError}; use crate::model::{ paginator::{ContinuationEndpoint, Paginator}, @@ -11,7 +13,8 @@ use super::{response, ClientType, MapResponse, QContinuation, RustyPipeQuery}; impl RustyPipeQuery { /// Get more YouTube items from the given continuation token and endpoint - pub async fn continuation>( + #[tracing::instrument(skip(self))] + pub async fn continuation + Debug>( &self, ctoken: S, endpoint: ContinuationEndpoint, diff --git a/src/client/player.rs b/src/client/player.rs index a4a4500..c12b802 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -1,6 +1,7 @@ use std::{ borrow::Cow, collections::{BTreeMap, HashMap}, + fmt::Debug, }; use once_cell::sync::Lazy; @@ -61,7 +62,8 @@ struct QContentPlaybackContext<'a> { impl RustyPipeQuery { /// Get YouTube player data (video/audio streams + basic metadata) - pub async fn player>(&self, video_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn player + Debug>(&self, video_id: S) -> Result { let video_id = video_id.as_ref(); let desktop_res = self.player_from_client(video_id, ClientType::Desktop).await; @@ -90,7 +92,8 @@ impl RustyPipeQuery { } /// Get YouTube player data (video/audio streams + basic metadata) using the specified client - pub async fn player_from_client>( + #[tracing::instrument(skip(self))] + pub async fn player_from_client + Debug>( &self, video_id: S, client_type: ClientType, diff --git a/src/client/playlist.rs b/src/client/playlist.rs index bfdc03e..d312010 100644 --- a/src/client/playlist.rs +++ b/src/client/playlist.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, convert::TryFrom}; +use std::{borrow::Cow, convert::TryFrom, fmt::Debug}; use time::OffsetDateTime; @@ -12,7 +12,8 @@ use super::{response, ClientType, MapResponse, MapResult, QBrowse, RustyPipeQuer impl RustyPipeQuery { /// Get a YouTube playlist - pub async fn playlist>(&self, playlist_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn playlist + Debug>(&self, playlist_id: S) -> Result { let playlist_id = playlist_id.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QBrowse { diff --git a/src/client/search.rs b/src/client/search.rs index 1d9d186..48da18f 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use serde::Serialize; use crate::{ @@ -19,7 +21,8 @@ struct QSearch<'a> { impl RustyPipeQuery { /// Search YouTube - pub async fn search>(&self, query: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn search + Debug>(&self, query: S) -> Result { let query = query.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QSearch { @@ -39,7 +42,8 @@ impl RustyPipeQuery { } /// Search YouTube using the given [`SearchFilter`] - pub async fn search_filter>( + #[tracing::instrument(skip(self))] + pub async fn search_filter + Debug>( &self, query: S, filter: &SearchFilter, @@ -63,7 +67,11 @@ impl RustyPipeQuery { } /// Get YouTube search suggestions - pub async fn search_suggestion>(&self, query: S) -> Result, Error> { + #[tracing::instrument(skip(self))] + pub async fn search_suggestion + Debug>( + &self, + query: S, + ) -> Result, Error> { let url = url::Url::parse_with_params( "https://suggestqueries-clients6.youtube.com/complete/search?client=youtube&xhr=t", &[ diff --git a/src/client/trends.rs b/src/client/trends.rs index 6e3505a..10bbbdc 100644 --- a/src/client/trends.rs +++ b/src/client/trends.rs @@ -11,6 +11,7 @@ use super::{response, ClientType, MapResponse, QBrowse, QBrowseParams, RustyPipe impl RustyPipeQuery { /// Get the videos from the YouTube startpage + #[tracing::instrument(skip(self))] pub async fn startpage(&self) -> Result, Error> { let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QBrowse { @@ -29,6 +30,7 @@ impl RustyPipeQuery { } /// Get the videos from the YouTube trending page + #[tracing::instrument(skip(self))] pub async fn trending(&self) -> Result, Error> { let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QBrowseParams { diff --git a/src/client/url_resolver.rs b/src/client/url_resolver.rs index 6ca8cb6..b9b0a0b 100644 --- a/src/client/url_resolver.rs +++ b/src/client/url_resolver.rs @@ -1,4 +1,4 @@ -use std::borrow::Cow; +use std::{borrow::Cow, fmt::Debug}; use serde::Serialize; @@ -59,7 +59,8 @@ impl RustyPipeQuery { /// ); /// # }); /// ``` - pub async fn resolve_url>( + #[tracing::instrument(skip(self))] + pub async fn resolve_url + Debug>( self, url: S, resolve_albums: bool, @@ -236,7 +237,8 @@ impl RustyPipeQuery { /// ); /// # }); /// ``` - pub async fn resolve_string>( + #[tracing::instrument(skip(self))] + pub async fn resolve_string + Debug>( self, s: S, resolve_albums: bool, diff --git a/src/client/video_details.rs b/src/client/video_details.rs index 6b9033e..aebe99f 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -1,3 +1,5 @@ +use std::fmt::Debug; + use serde::Serialize; use crate::{ @@ -26,7 +28,11 @@ struct QVideo<'a> { impl RustyPipeQuery { /// Get the metadata for a video - pub async fn video_details>(&self, video_id: S) -> Result { + #[tracing::instrument(skip(self))] + pub async fn video_details + Debug>( + &self, + video_id: S, + ) -> Result { let video_id = video_id.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QVideo { @@ -47,7 +53,8 @@ impl RustyPipeQuery { } /// Get the comments for a video using the continuation token obtained from `rusty_pipe_query.video_details()` - pub async fn video_comments>( + #[tracing::instrument(skip(self))] + pub async fn video_comments + Debug>( &self, ctoken: S, visitor_data: Option<&str>, diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index abb6a6b..a8fff16 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -29,7 +29,7 @@ impl DeobfData { pub async fn extract(http: Client, reporter: Option<&dyn Reporter>) -> Result { let js_url = get_player_js_url(&http).await?; let player_js = get_response(&http, &js_url).await?; - log::debug!("downloaded player.js from {}", js_url); + tracing::debug!("downloaded player.js from {}", js_url); let res = Self::extract_fns(&js_url, &player_js); @@ -89,7 +89,7 @@ impl Deobfuscator { res.as_str().map_or( Err(DeobfError::Other("sig deobfuscation func returned null")), |res| { - log::debug!("deobfuscated sig"); + tracing::debug!("deobfuscated sig"); Ok(res.to_owned()) }, ) @@ -102,7 +102,7 @@ impl Deobfuscator { res.as_str().map_or( Err(DeobfError::Other("nsig deobfuscation func returned null")), |res| { - log::debug!("deobfuscated nsig"); + tracing::debug!("deobfuscated nsig"); Ok(res.to_owned()) }, ) diff --git a/src/report.rs b/src/report.rs index a995fe3..f5a163b 100644 --- a/src/report.rs +++ b/src/report.rs @@ -23,9 +23,9 @@ use std::{ path::{Path, PathBuf}, }; -use log::error; use serde::{Deserialize, Serialize}; use time::{macros::format_description, OffsetDateTime}; +use tracing::error; use crate::{deobfuscate::DeobfData, util}; diff --git a/tests/youtube.rs b/tests/youtube.rs index 9528b99..918b51c 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -32,7 +32,6 @@ use rustypipe::param::{ #[case::tv_html5_embed(ClientType::TvHtml5Embed)] #[case::android(ClientType::Android)] #[case::ios(ClientType::Ios)] -#[test_log::test] fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { let player_data = tokio_test::block_on(rp.query().player_from_client("n4tK7LYFxI0", client_type)).unwrap(); @@ -1469,7 +1468,6 @@ fn music_album_not_found(rp: RustyPipe) { #[case::no_artist("no_artist", "UCh8gHdtzO2tXd593_bjErWg", false, 0, 2)] // querying Trailerpark's secondary YouTube channel should result in the YTM channel being fetched #[case::secondary_channel("no_more_albums", "UCC9192yGQD25eBZgFZ84MPw", true, 15, 0)] -#[test_log::test] fn music_artist( #[case] name: &str, #[case] id: &str, From 127596687b0f5a29be65adfe80c40059edc4cc50 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Sep 2023 03:25:39 +0200 Subject: [PATCH 049/459] chore: update quick-xml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 620b143..8e04bb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,7 +59,7 @@ ress = "0.11.4" phf = "0.11.1" base64 = "0.21.0" urlencoding = "2.1.2" -quick-xml = { version = "0.29.0", features = ["serialize"], optional = true } +quick-xml = { version = "0.30.0", features = ["serialize"], optional = true } tracing = { version = "0.1.37", features = ["log"] } [dev-dependencies] From b25e9ebbb75e532bd7bfa6b1bc5e3860d7fda743 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 28 Sep 2023 01:00:00 +0200 Subject: [PATCH 050/459] fix: send visitor data for YTM playlists --- src/client/channel.rs | 2 +- src/client/mod.rs | 85 +++++++++++++++++++++++++++++++----- src/client/music_details.rs | 16 +++---- src/client/music_playlist.rs | 28 ++++++++---- src/client/music_search.rs | 12 ++--- src/client/pagination.rs | 19 ++++++-- src/client/player.rs | 1 + src/client/search.rs | 7 ++- src/client/trends.rs | 7 ++- src/client/video_details.rs | 11 +++-- tests/youtube.rs | 22 ++++++---- 11 files changed, 156 insertions(+), 54 deletions(-) diff --git a/src/client/channel.rs b/src/client/channel.rs index a002908..3116348 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -238,7 +238,7 @@ impl MapResponse>> for response::Channel { mapper.items, mapper.ctoken, visitor_data, - crate::model::paginator::ContinuationEndpoint::Browse, + ContinuationEndpoint::Browse, ); Ok(MapResult { diff --git a/src/client/mod.rs b/src/client/mod.rs index 6c688de..5b21882 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1185,8 +1185,14 @@ impl RustyPipeQuery { /// - `ctype`: Client type (`Desktop`, `DesktopMusic`, `Android`, ...) /// - `method`: HTTP method /// - `endpoint`: YouTube API endpoint (`https://www.youtube.com/youtubei/v1/?key=...`) - async fn request_builder(&self, ctype: ClientType, endpoint: &str) -> RequestBuilder { - match ctype { + /// - `visitor_data`: YouTube visitor data cookie + async fn request_builder( + &self, + ctype: ClientType, + endpoint: &str, + visitor_data: Option<&str>, + ) -> RequestBuilder { + let mut r = match ctype { ClientType::Desktop => self .client .inner @@ -1215,7 +1221,7 @@ impl RustyPipeQuery { .header("X-YouTube-Client-Name", "67") .header( "X-YouTube-Client-Version", - self.client.get_music_client_version().await, + self.client.get_music_client_version().await ), ClientType::TvHtml5Embed => self .client @@ -1258,7 +1264,11 @@ impl RustyPipeQuery { ), ) .header("X-Goog-Api-Format-Version", "2"), + }; + if let Some(vdata) = self.opts.visitor_data.as_deref().or(visitor_data) { + r = r.header("X-Goog-EOM-Visitor-Id", vdata); } + r } /// Get a YouTube visitor data cookie, which is necessary for certain requests @@ -1273,6 +1283,7 @@ impl RustyPipeQuery { &self, request: &Request, id: &str, + visitor_data: Option<&str>, deobf: Option<&DeobfData>, ) -> Result, Error> { let response = self @@ -1306,7 +1317,7 @@ impl RustyPipeQuery { id, self.opts.lang, deobf, - self.opts.visitor_data.as_deref(), + self.opts.visitor_data.as_deref().or(visitor_data), ) { Ok(mapres) => Ok(mapres), Err(e) => Err(e.into()), @@ -1324,11 +1335,14 @@ impl RustyPipeQuery { &self, request: &Request, id: &str, + visitor_data: Option<&str>, deobf: Option<&DeobfData>, ) -> Result, Error> { let mut last_resp = None; for n in 0..=self.client.inner.n_http_retries { - let resp = self.yt_request_attempt::(request, id, deobf).await?; + let resp = self + .yt_request_attempt::(request, id, visitor_data, deobf) + .await?; let err = match &resp.res { Ok(_) => return Ok(resp), @@ -1369,7 +1383,9 @@ impl RustyPipeQuery { /// - `method`: HTTP method /// - `endpoint`: YouTube API endpoint (`https://www.youtube.com/youtubei/v1/?key=...`) /// - `body`: Serializable request body to be sent in json format + /// - `visitor_data`: YouTube visitor data cookie /// - `deobf`: Deobfuscator (is passed to the mapper to deobfuscate stream URLs). + #[allow(clippy::too_many_arguments)] async fn execute_request_deobf< R: DeserializeOwned + MapResponse + Debug, M, @@ -1381,17 +1397,20 @@ impl RustyPipeQuery { id: &str, endpoint: &str, body: &B, + visitor_data: Option<&str>, deobf: Option<&DeobfData>, ) -> Result { tracing::debug!("getting {}({})", operation, id); let request = self - .request_builder(ctype, endpoint) + .request_builder(ctype, endpoint, visitor_data) .await .json(body) .build()?; - let req_res = self.yt_request::(&request, id, deobf).await?; + let req_res = self + .yt_request::(&request, id, visitor_data, deobf) + .await?; // Uncomment to debug response text // println!("{}", &req_res.body); @@ -1477,11 +1496,55 @@ impl RustyPipeQuery { endpoint: &str, body: &B, ) -> Result { - self.execute_request_deobf::(ctype, operation, id, endpoint, body, None) + self.execute_request_deobf::(ctype, operation, id, endpoint, body, None, None) .await } + /// Execute a request to the YouTube API, then map the response. + /// + /// Creates a report in case of failure for easy debugging. + /// + /// # Parameters + /// - `ctype`: Client type (`Desktop`, `DesktopMusic`, `Android`, ...) + /// - `operation`: Name of the RustyPipe operation (only for reporting, e.g. `get_player`) + /// - `id`: ID of the requested entity (Video ID, Channel ID, ...). + /// The ID is included in reports and is also passed to the mapper for validating the response. + /// Set it to an empty string if you are not requesting an entity with an ID. + /// - `method`: HTTP method + /// - `endpoint`: YouTube API endpoint (`https://www.youtube.com/youtubei/v1/?key=...`) + /// - `body`: Serializable request body to be sent in json format + /// - `visitor_data`: YouTube visitor data cookie + async fn execute_request_vdata< + R: DeserializeOwned + MapResponse + Debug, + M, + B: Serialize + ?Sized, + >( + &self, + ctype: ClientType, + operation: &str, + id: &str, + endpoint: &str, + body: &B, + visitor_data: Option<&str>, + ) -> Result { + self.execute_request_deobf::( + ctype, + operation, + id, + endpoint, + body, + visitor_data, + None, + ) + .await + } + /// Execute a request to the YouTube API and return the response string + /// + /// # Parameters + /// - `ctype`: Client type (`Desktop`, `DesktopMusic`, `Android`, ...) + /// - `endpoint`: YouTube API endpoint (`https://www.youtube.com/youtubei/v1/?key=...`) + /// - `body`: Serializable request body to be sent in json format pub async fn raw( &self, ctype: ClientType, @@ -1489,7 +1552,7 @@ impl RustyPipeQuery { body: &B, ) -> Result { let request = self - .request_builder(ctype, endpoint) + .request_builder(ctype, endpoint, None) .await .json(body) .build()?; @@ -1519,13 +1582,13 @@ trait MapResponse { /// that the returned entity matches this ID and return an error instead. /// - `lang`: Language of the request. Used for mapping localized information like dates. /// - `deobf`: Deobfuscator (if passed to the `execute_request_deobf` method) - /// - `vdata`: Visitor data option of the client + /// - `visitor_data`: Visitor data option of the client fn map_response( self, id: &str, lang: Language, deobf: Option<&DeobfData>, - vdata: Option<&str>, + visitor_data: Option<&str>, ) -> Result, ExtractionError>; } diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 60980c9..0e189ab 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -4,7 +4,10 @@ use serde::Serialize; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, ArtistId, Lyrics, MusicRelated, TrackDetails, TrackItem}, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + ArtistId, Lyrics, MusicRelated, TrackDetails, TrackItem, + }, param::Language, serializer::MapResult, }; @@ -132,12 +135,13 @@ impl RustyPipeQuery { tuner_setting_value: "AUTOMIX_SETTING_NORMAL", }; - self.execute_request::( + self.execute_request_vdata::( ClientType::DesktopMusic, "music_radio", radio_id, "next", &request_body, + Some(&visitor_data), ) .await } @@ -293,13 +297,7 @@ impl MapResponse> for response::MusicDetails { .map(|c| c.next_continuation_data.continuation); Ok(MapResult { - c: Paginator::new_ext( - None, - tracks, - ctoken, - None, - crate::model::paginator::ContinuationEndpoint::MusicNext, - ), + c: Paginator::new_ext(None, tracks, ctoken, None, ContinuationEndpoint::MusicNext), warnings, }) } diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 00230e6..ecf76dc 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -2,7 +2,10 @@ use std::{borrow::Cow, fmt::Debug}; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, AlbumId, ChannelId, MusicAlbum, MusicPlaylist, TrackItem}, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + AlbumId, ChannelId, MusicAlbum, MusicPlaylist, TrackItem, + }, serializer::MapResult, util::{self, TryRemove, DOT_SEPARATOR}, }; @@ -23,18 +26,27 @@ impl RustyPipeQuery { playlist_id: S, ) -> Result { let playlist_id = playlist_id.as_ref(); - let context = self.get_context(ClientType::DesktopMusic, true, None).await; + // YTM playlists require visitor data for continuations to work + let visitor_data = if playlist_id.starts_with("RD") { + Some(self.get_visitor_data().await?) + } else { + None + }; + let context = self + .get_context(ClientType::DesktopMusic, true, visitor_data.as_deref()) + .await; let request_body = QBrowse { context, browse_id: &format!("VL{playlist_id}"), }; - self.execute_request::( + self.execute_request_vdata::( ClientType::DesktopMusic, "music_playlist", playlist_id, "browse", &request_body, + visitor_data.as_deref(), ) .await } @@ -127,7 +139,7 @@ impl MapResponse for response::MusicPlaylist { id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, - _vdata: Option<&str>, + vdata: Option<&str>, ) -> Result, ExtractionError> { // dbg!(&self); @@ -251,15 +263,15 @@ impl MapResponse for response::MusicPlaylist { track_count, map_res.c, ctoken, - None, - crate::model::paginator::ContinuationEndpoint::MusicBrowse, + vdata.map(str::to_owned), + ContinuationEndpoint::MusicBrowse, ), related_playlists: Paginator::new_ext( None, Vec::new(), related_ctoken, - None, - crate::model::paginator::ContinuationEndpoint::MusicBrowse, + vdata.map(str::to_owned), + ContinuationEndpoint::MusicBrowse, ), }, warnings: map_res.warnings, diff --git a/src/client/music_search.rs b/src/client/music_search.rs index 765f913..309bc1e 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -6,8 +6,10 @@ use crate::{ client::response::music_item::MusicListMapper, error::{Error, ExtractionError}, model::{ - paginator::Paginator, traits::FromYtItem, AlbumItem, ArtistItem, MusicPlaylistItem, - MusicSearchFiltered, MusicSearchResult, MusicSearchSuggestion, TrackItem, + paginator::{ContinuationEndpoint, Paginator}, + traits::FromYtItem, + AlbumItem, ArtistItem, MusicPlaylistItem, MusicSearchFiltered, MusicSearchResult, + MusicSearchSuggestion, TrackItem, }, serializer::MapResult, }; @@ -287,7 +289,7 @@ impl MapResponse> for response::MusicSearc _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, - _vdata: Option<&str>, + vdata: Option<&str>, ) -> Result>, ExtractionError> { // dbg!(&self); @@ -332,8 +334,8 @@ impl MapResponse> for response::MusicSearc None, map_res.c, ctoken, - None, - crate::model::paginator::ContinuationEndpoint::MusicSearch, + vdata.map(str::to_owned), + ContinuationEndpoint::MusicSearch, ), corrected_query, }, diff --git a/src/client/pagination.rs b/src/client/pagination.rs index 4602b78..20ce792 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::fmt::Debug; use crate::error::{Error, ExtractionError}; @@ -22,8 +23,13 @@ impl RustyPipeQuery { ) -> Result, Error> { let ctoken = ctoken.as_ref(); if endpoint.is_music() { + // Visitor data is required for YTM continuations + let visitor_data = match visitor_data { + Some(vd) => Cow::Borrowed(vd), + None => Cow::Owned(self.get_visitor_data().await?), + }; let context = self - .get_context(ClientType::DesktopMusic, true, visitor_data) + .get_context(ClientType::DesktopMusic, true, Some(&visitor_data)) .await; let request_body = QContinuation { context, @@ -31,16 +37,17 @@ impl RustyPipeQuery { }; let p = self - .execute_request::, _>( + .execute_request_vdata::, _>( ClientType::DesktopMusic, "music_continuation", ctoken, endpoint.as_str(), &request_body, + Some(&visitor_data), ) .await?; - Ok(map_ytm_paginator(p, visitor_data, endpoint)) + Ok(map_ytm_paginator(p, Some(&visitor_data), endpoint)) } else { let context = self .get_context(ClientType::Desktop, true, visitor_data) @@ -211,6 +218,9 @@ impl Paginator { let mut items = paginator.items; self.items.append(&mut items); self.ctoken = paginator.ctoken; + if paginator.visitor_data.is_some() { + self.visitor_data = paginator.visitor_data; + } Ok(true) } Ok(None) => Ok(false), @@ -285,6 +295,9 @@ macro_rules! paginator { let mut items = paginator.items; self.items.append(&mut items); self.ctoken = paginator.ctoken; + if paginator.visitor_data.is_some() { + self.visitor_data = paginator.visitor_data; + } Ok(true) } Ok(None) => Ok(false), diff --git a/src/client/player.rs b/src/client/player.rs index c12b802..b948eda 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -139,6 +139,7 @@ impl RustyPipeQuery { video_id, "player", &request_body, + None, Some(&deobf), ) .await diff --git a/src/client/search.rs b/src/client/search.rs index 48da18f..a2e6001 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -4,7 +4,10 @@ use serde::Serialize; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, SearchResult, YouTubeItem}, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + SearchResult, YouTubeItem, + }, param::search_filter::SearchFilter, }; @@ -119,7 +122,7 @@ impl MapResponse for response::Search { mapper.items, mapper.ctoken, None, - crate::model::paginator::ContinuationEndpoint::Search, + ContinuationEndpoint::Search, ), corrected_query: mapper.corrected_query, visitor_data: self diff --git a/src/client/trends.rs b/src/client/trends.rs index 10bbbdc..8b6f3b8 100644 --- a/src/client/trends.rs +++ b/src/client/trends.rs @@ -2,7 +2,10 @@ use std::borrow::Cow; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, VideoItem}, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + VideoItem, + }, param::Language, serializer::MapResult, }; @@ -124,7 +127,7 @@ fn map_startpage_videos( mapper.items, mapper.ctoken, visitor_data, - crate::model::paginator::ContinuationEndpoint::Browse, + ContinuationEndpoint::Browse, ), warnings: mapper.warnings, } diff --git a/src/client/video_details.rs b/src/client/video_details.rs index aebe99f..32b63f4 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -4,7 +4,10 @@ use serde::Serialize; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, ChannelTag, Chapter, Comment, VideoDetails, VideoItem}, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + ChannelTag, Chapter, Comment, VideoDetails, VideoItem, + }, param::Language, serializer::MapResult, util::{self, timeago, TryRemove}, @@ -360,14 +363,14 @@ impl MapResponse for response::VideoDetails { Vec::new(), comment_ctoken, visitor_data.clone(), - crate::model::paginator::ContinuationEndpoint::Next, + ContinuationEndpoint::Next, ), latest_comments: Paginator::new_ext( comment_count, Vec::new(), latest_comments_ctoken, visitor_data.clone(), - crate::model::paginator::ContinuationEndpoint::Next, + ContinuationEndpoint::Next, ), visitor_data, }, @@ -459,7 +462,7 @@ fn map_recommendations( mapper.items, mapper.ctoken, visitor_data, - crate::model::paginator::ContinuationEndpoint::Next, + ContinuationEndpoint::Next, ), warnings: mapper.warnings, } diff --git a/tests/youtube.rs b/tests/youtube.rs index 918b51c..1054a61 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1368,17 +1368,21 @@ fn music_playlist( } #[rstest] -fn music_playlist_cont(rp: RustyPipe) { - let mut playlist = tokio_test::block_on( - rp.query() - .music_playlist("PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"), - ) - .unwrap(); +#[case::user("PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj")] +#[case::ytm("RDCLAK5uy_kb7EBi6y3GrtJri4_ZH56Ms786DFEimbM")] +fn music_playlist_cont(#[case] id: &str, rp: RustyPipe) { + let mut playlist = tokio_test::block_on(rp.query().music_playlist(id)).unwrap(); - tokio_test::block_on(playlist.tracks.extend_pages(rp.query(), usize::MAX)).unwrap(); + tokio_test::block_on(playlist.tracks.extend_pages(rp.query(), 5)).unwrap(); - assert_gte(playlist.tracks.items.len(), 100, "tracks"); - assert_gte(playlist.tracks.count.unwrap(), 100, "track count"); + let track_count = playlist.track_count.unwrap(); + assert_gte(track_count, 100, "tracks"); + + assert_eq!(track_count, playlist.tracks.count.unwrap()); + assert_eq!( + usize::try_from(track_count).unwrap(), + playlist.tracks.items.len() + ); } #[rstest] From d6de428549bfe7881e5ac52857d4bc1fa2db7f5d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 28 Sep 2023 01:40:18 +0200 Subject: [PATCH 051/459] fix: fetch YTM playlists with visitor data feat: add lang/country options to cli --- cli/src/main.rs | 16 ++++++++++++++-- src/client/playlist.rs | 26 ++++++++++++++++++++++---- src/param/locale.rs | 6 +++++- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index b960851..d048820 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,6 +1,6 @@ #![warn(clippy::todo, clippy::dbg_macro)] -use std::{path::PathBuf, time::Duration}; +use std::{path::PathBuf, str::FromStr, time::Duration}; use anyhow::{Context, Result}; use clap::{Parser, Subcommand, ValueEnum}; @@ -10,7 +10,7 @@ use reqwest::{Client, ClientBuilder}; use rustypipe::{ client::RustyPipe, model::{UrlTarget, VideoId}, - param::{search_filter, ChannelVideoTab, StreamFilter}, + param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; use serde::Serialize; @@ -25,6 +25,12 @@ struct Cli { /// YouTube visitor data cookie #[clap(long, global = true)] vdata: Option, + /// YouTube content language + #[clap(long, global = true)] + lang: Option, + /// YouTube content country + #[clap(long, global = true)] + country: Option, } #[derive(Subcommand)] @@ -404,6 +410,12 @@ async fn main() { std::fs::create_dir_all(&storage_dir).expect("could not create data dir"); rp = rp.storage_dir(storage_dir); } + if let Some(lang) = cli.lang { + rp = rp.lang(Language::from_str(&lang.to_ascii_lowercase()).expect("invalid language")); + } + if let Some(country) = cli.country { + rp = rp.country(Country::from_str(&country.to_ascii_uppercase()).expect("invalid country")); + } let rp = rp.build().unwrap(); match cli.command { diff --git a/src/client/playlist.rs b/src/client/playlist.rs index d312010..39485c1 100644 --- a/src/client/playlist.rs +++ b/src/client/playlist.rs @@ -4,7 +4,10 @@ use time::OffsetDateTime; use crate::{ error::{Error, ExtractionError}, - model::{paginator::Paginator, ChannelId, Playlist, VideoItem}, + model::{ + paginator::{ContinuationEndpoint, Paginator}, + ChannelId, Playlist, VideoItem, + }, util::{self, timeago, TryRemove}, }; @@ -15,18 +18,27 @@ impl RustyPipeQuery { #[tracing::instrument(skip(self))] pub async fn playlist + Debug>(&self, playlist_id: S) -> Result { let playlist_id = playlist_id.as_ref(); - let context = self.get_context(ClientType::Desktop, true, None).await; + // YTM playlists require visitor data for continuations to work + let visitor_data: Option = if playlist_id.starts_with("RD") { + Some(self.get_visitor_data().await?) + } else { + None + }; + let context = self + .get_context(ClientType::Desktop, true, visitor_data.as_deref()) + .await; let request_body = QBrowse { context, browse_id: &format!("VL{playlist_id}"), }; - self.execute_request::( + self.execute_request_vdata::( ClientType::Desktop, "playlist", playlist_id, "browse", &request_body, + visitor_data.as_deref(), ) .await } @@ -147,7 +159,13 @@ impl MapResponse for response::Playlist { c: Playlist { id: playlist_id, name, - videos: Paginator::new(Some(n_videos), mapper.items, mapper.ctoken), + videos: Paginator::new_ext( + Some(n_videos), + mapper.items, + mapper.ctoken, + vdata.map(str::to_owned), + ContinuationEndpoint::Browse, + ), video_count: n_videos, thumbnail: thumbnails.into(), description, diff --git a/src/param/locale.rs b/src/param/locale.rs index a9f1be2..21f049d 100644 --- a/src/param/locale.rs +++ b/src/param/locale.rs @@ -844,7 +844,11 @@ impl FromStr for Language { Some(pos) => { sub = &sub[..pos]; } - None => return Err(Error::Other("could not parse language `{s}`".into())), + None => { + return Err(Error::Other( + format!("could not parse language `{s}`").into(), + )) + } } } } From e247b0c5d9874313d8a350142694bc90db805a11 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 6 Oct 2023 03:26:07 +0200 Subject: [PATCH 052/459] fix: remove error on YTM track redirects Example: ZKrwJi0fa34 => z10dAMnp1gc --- src/client/music_details.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 0e189ab..b6d9361 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -227,13 +227,6 @@ impl MapResponse for response::MusicDetails { .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no video item")))?; let mut track = map_queue_item(track_item, lang); - if track.c.id != id { - return Err(ExtractionError::WrongResult(format!( - "got wrong video id {}, expected {}", - track.c.id, id - ))); - } - let mut warnings = content.contents.warnings; warnings.append(&mut track.warnings); From 1ec1666d770e86db894f50eba30c0d53e20a1827 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 8 Oct 2023 01:04:52 +0200 Subject: [PATCH 053/459] fix: tests, clippy lints --- codegen/src/gen_locales.rs | 19 +++++++++---------- codegen/src/util.rs | 8 ++++++-- src/util/mod.rs | 8 ++++++-- tests/youtube.rs | 13 +++---------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/codegen/src/gen_locales.rs b/codegen/src/gen_locales.rs index bb9e523..0f4ad48 100644 --- a/codegen/src/gen_locales.rs +++ b/codegen/src/gen_locales.rs @@ -228,16 +228,15 @@ pub enum Country { .to_owned(); for (code, native_name) in &languages { - let enum_name = code - .split('-') - .map(|c| { - format!( - "{}{}", - c[0..1].to_owned().to_uppercase(), - c[1..].to_owned().to_lowercase() - ) - }) - .collect::(); + let enum_name = code.split('-').fold(String::new(), |mut output, c| { + let _ = write!( + output, + "{}{}", + c[0..1].to_owned().to_uppercase(), + c[1..].to_owned().to_lowercase() + ); + output + }); let en_name = lang_names.get(code).expect(code); diff --git a/codegen/src/util.rs b/codegen/src/util.rs index 5254255..6f547d7 100644 --- a/codegen/src/util.rs +++ b/codegen/src/util.rs @@ -134,12 +134,16 @@ where if c.is_ascii_digit() { buf.push(c); } else if !buf.is_empty() { - buf.parse::().map_or((), |n| numbers.push(n)); + if let Ok(n) = buf.parse::() { + numbers.push(n); + } buf.clear(); } } if !buf.is_empty() { - buf.parse::().map_or((), |n| numbers.push(n)); + if let Ok(n) = buf.parse::() { + numbers.push(n); + } } numbers diff --git a/src/util/mod.rs b/src/util/mod.rs index 91c1ddc..a29a6d2 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -159,12 +159,16 @@ where if c.is_ascii_digit() { buf.push(c); } else if !buf.is_empty() { - buf.parse::().map_or((), |n| numbers.push(n)); + if let Ok(n) = buf.parse::() { + numbers.push(n); + } buf.clear(); } } if !buf.is_empty() { - buf.parse::().map_or((), |n| numbers.push(n)); + if let Ok(n) = buf.parse::() { + numbers.push(n); + } } numbers diff --git a/tests/youtube.rs b/tests/youtube.rs index 1054a61..4307278 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -326,13 +326,6 @@ fn get_player_error(#[case] id: &str, #[case] expect: UnavailabilityReason, rp: None, Some(("UCIekuFeMaV78xYfvpmoCnPg", "Best Music")), )] -#[case::short( - "RDCLAK5uy_kFQXdnqMaQCVx2wpUM4ZfbsGCDibZtkJk", - "Easy Pop", - false, - None, - None -)] #[case::nomusic( "PL1J-6JOckZtE_P9Xx8D3b2O6w0idhuKBe", "Minecraft SHINE", @@ -1127,10 +1120,10 @@ mod channel_rss { #[rstest] fn get_channel_rss_empty(rp: RustyPipe) { let channel = - tokio_test::block_on(rp.query().channel_rss("UC4fJNIVEOQ1fk15B_sqoOqg")).unwrap(); + tokio_test::block_on(rp.query().channel_rss("UCAyFbMjB3qAQSZBj6NCuBSg")).unwrap(); - assert_eq!(channel.id, "UC4fJNIVEOQ1fk15B_sqoOqg"); - assert_eq!(channel.name, "Bilal Saeed - Topic"); + assert_eq!(channel.id, "UCAyFbMjB3qAQSZBj6NCuBSg"); + assert_eq!(channel.name, "Cheryl Calogero"); assert!(channel.videos.is_empty()); } From cced12539086b7d68301dfe4faf2b8f2b01760a9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 3 Nov 2023 16:16:53 +0100 Subject: [PATCH 054/459] fix: Handle trimmed channel ID from RSS feed --- src/client/channel_rss.rs | 88 +- src/client/response/channel_rss.rs | 51 - ...s__map_channel_rss_trimmed_channel_id.snap | 221 +++ testfiles/channel_rss/trimmed_channel_id.xml | 1179 +++++++++++++++++ 4 files changed, 1474 insertions(+), 65 deletions(-) create mode 100644 src/client/snapshots/rustypipe__client__channel_rss__tests__map_channel_rss_trimmed_channel_id.snap create mode 100644 testfiles/channel_rss/trimmed_channel_id.xml diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index ad9e1b9..32bcaaf 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -4,6 +4,7 @@ use crate::{ error::{Error, ExtractionError}, model::ChannelRss, report::{Report, RustyPipeInfo}, + util, }; use super::{response, RustyPipeQuery}; @@ -36,8 +37,11 @@ impl RustyPipeQuery { _ => e, })?; - match quick_xml::de::from_str::(&xml) { - Ok(feed) => Ok(feed.into()), + match quick_xml::de::from_str::(&xml) + .map_err(|e| ExtractionError::InvalidData(e.to_string().into())) + .and_then(|feed| feed.map_response(channel_id)) + { + Ok(res) => Ok(res), Err(e) => { if let Some(reporter) = &self.client.inner.reporter { let report = Report { @@ -59,38 +63,94 @@ impl RustyPipeQuery { reporter.report(&report); } - - Err( - ExtractionError::InvalidData(format!("could not deserialize xml: {e}").into()) - .into(), - ) + Err(Error::Extraction(e)) } } } } +impl response::ChannelRss { + fn map_response(self, id: &str) -> Result { + let channel_id = if self.channel_id.is_empty() { + self.entry + .iter() + .find_map(|entry| { + Some(entry.channel_id.as_str()) + .filter(|id| id.is_empty()) + .map(str::to_owned) + }) + .or_else(|| { + self.author + .uri + .strip_prefix("https://www.youtube.com/channel/") + .and_then(|id| { + if util::CHANNEL_ID_REGEX.is_match(id) { + Some(id.to_owned()) + } else { + None + } + }) + }) + .ok_or(ExtractionError::InvalidData( + "could not get channel id".into(), + ))? + } else if self.channel_id.len() == 22 { + // As of November 2023, YouTube seems to output channel IDs without the UC prefix + format!("UC{}", self.channel_id) + } else { + self.channel_id + }; + + if channel_id != id { + return Err(ExtractionError::WrongResult(format!( + "got wrong channel id {channel_id}, expected {id}", + ))); + } + + Ok(ChannelRss { + id: channel_id, + name: self.title, + videos: self + .entry + .into_iter() + .map(|item| crate::model::ChannelRssVideo { + id: item.video_id, + name: item.title, + description: item.media_group.description, + thumbnail: item.media_group.thumbnail.into(), + publish_date: item.published, + update_date: item.updated, + view_count: item.media_group.community.statistics.views, + like_count: item.media_group.community.rating.count, + }) + .collect(), + create_date: self.create_date, + }) + } +} + #[cfg(test)] mod tests { use std::{fs::File, io::BufReader}; - use crate::{client::response, model::ChannelRss, util::tests::TESTFILES}; + use crate::{client::response, util::tests::TESTFILES}; use path_macro::path; use rstest::rstest; #[rstest] - #[case::base("base")] - #[case::no_likes("no_likes")] - #[case::no_channel_id("no_channel_id")] - fn map_channel_rss(#[case] name: &str) { + #[case::base("base", "UCHnyfMqiRRG1u-2MsSQLbXA")] + #[case::no_likes("no_likes", "UCdfxp4cUWsWryZOy-o427dw")] + #[case::no_channel_id("no_channel_id", "UCHnyfMqiRRG1u-2MsSQLbXA")] + #[case::trimmed_channel_id("trimmed_channel_id", "UCHnyfMqiRRG1u-2MsSQLbXA")] + fn map_channel_rss(#[case] name: &str, #[case] id: &str) { let xml_path = path!(*TESTFILES / "channel_rss" / format!("{}.xml", name)); let xml_file = File::open(xml_path).unwrap(); let feed: response::ChannelRss = quick_xml::de::from_reader(BufReader::new(xml_file)).unwrap(); - let map_res: ChannelRss = feed.into(); - + let map_res = feed.map_response(id).unwrap(); insta::assert_ron_snapshot!(format!("map_channel_rss_{}", name), map_res); } } diff --git a/src/client/response/channel_rss.rs b/src/client/response/channel_rss.rs index d3e1e6f..92f28c9 100644 --- a/src/client/response/channel_rss.rs +++ b/src/client/response/channel_rss.rs @@ -1,8 +1,6 @@ use serde::Deserialize; use time::OffsetDateTime; -use crate::util; - #[derive(Debug, Deserialize)] pub(crate) struct ChannelRss { #[serde(rename = "channelId")] @@ -80,52 +78,3 @@ impl From for crate::model::Thumbnail { } } } - -impl From for crate::model::ChannelRss { - fn from(feed: ChannelRss) -> Self { - let id = if feed.channel_id.is_empty() { - feed.entry - .iter() - .find_map(|entry| { - Some(entry.channel_id.as_str()) - .filter(|id| id.is_empty()) - .map(str::to_owned) - }) - .or_else(|| { - feed.author - .uri - .strip_prefix("https://www.youtube.com/channel/") - .and_then(|id| { - if util::CHANNEL_ID_REGEX.is_match(id) { - Some(id.to_owned()) - } else { - None - } - }) - }) - .unwrap_or_default() - } else { - feed.channel_id - }; - - Self { - id, - name: feed.title, - videos: feed - .entry - .into_iter() - .map(|item| crate::model::ChannelRssVideo { - id: item.video_id, - name: item.title, - description: item.media_group.description, - thumbnail: item.media_group.thumbnail.into(), - publish_date: item.published, - update_date: item.updated, - view_count: item.media_group.community.statistics.views, - like_count: item.media_group.community.rating.count, - }) - .collect(), - create_date: feed.create_date, - } - } -} diff --git a/src/client/snapshots/rustypipe__client__channel_rss__tests__map_channel_rss_trimmed_channel_id.snap b/src/client/snapshots/rustypipe__client__channel_rss__tests__map_channel_rss_trimmed_channel_id.snap new file mode 100644 index 0000000..46a9bc0 --- /dev/null +++ b/src/client/snapshots/rustypipe__client__channel_rss__tests__map_channel_rss_trimmed_channel_id.snap @@ -0,0 +1,221 @@ +--- +source: src/client/channel_rss.rs +expression: map_res +--- +ChannelRss( + id: "UCHnyfMqiRRG1u-2MsSQLbXA", + name: "Veritasium", + videos: [ + ChannelRssVideo( + id: "czjisEGe5Cw", + name: "The Problem With Science Communication", + description: "To kickstart your business or online store with a free trial of Shopify, go to http://shopify.com/veritasium\n\nIf you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV \n\n▀▀▀\nHuge thanks to Carlo Rovelli: https://t.co/FF5ohRQB8R\nAnd Geraint Lewis: https://www.geraintflewis.com/\n\n▀▀▀\nImages and references:\nHolographic wormhole, via Nature - https://ve42.co/Holographic\n\n‘Did physicists create a wormhole in a quantum computer?’ by Davide Castelvecchi, via Nature - https://ve42.co/NatureWormhole\n\nTraversable Holographic Wormhole by Sarag Wells, via Vice - https://ve42.co/ViceWormhole\n\n‘Quantum teleportation opens a ‘wormhole in space–time’’ by Martijn Boerkamp, via Physics World - https://ve42.co/PWTeleportation\n\n‘Physicists Create a Holographic Wormhole’ by Natalie Wolchover, via Quanta - https://ve42.co/QuantaWormhole\n\n‘the Smallest, Crummiest Wormhole You Can Imagine’, via The New York Times - https://ve42.co/NYTWormhole\n\n‘How Physicists Created a Holographic, via Quanta - https://ve42.co/QuantaYTWormhole\n\nQuantum computer imagery, via Quantumai - https://ve42.co/Quantumai\n\n‘Nuclear fusion breakthrough’, via Sky News - https://ve42.co/SkyWormhole\n\n‘NASA scientist explains why images from new telescope astounded him’, via CNN on YouTube - https://ve42.co/CNNWormhole\n\n‘Neutrino Faster Than Speed of Light’, via Associated Press - https://ve42.co/APWormhole\n\n‘Michio Kaku on Quantum Computing’, via PowerfulJRE - https://ve42.co/JRE\n\nAskScience AMA Series, via r/askscience on Reddit - https://ve42.co/ClimateAMA\n\n‘Professor Andrei Linde celebrates physics breakthrough’, via Stanford - https://ve42.co/AndreiLinde\n\n‘Gravitational waves turn to dust’ by Ian Sample, via The Guardian - https://ve42.co/Waves2Dust\n\n‘The First Room-Temperature Ambient-Pressure Superconductor’, Sukbae Lee, Ji-Hoon Kim, Young-Wan Kwon, 2023, via arXiv - https://ve42.co/Superconductor\n\n‘What\'s the buzz about LK-99?’, via Global News - https://ve42.co/GlobalLK99\n\nMeissner effect, via @andrewmccalip on Twitter - https://ve42.co/Meissner\n\n‘Will LK99 Superconductor CHANGE THE WORLD?’, via Breaking Points on YouTube - https://ve42.co/BreakingPoints\n\n‘Superconductor Breakthroughs’, via WSJ - https://ve42.co/WSJSuperconductor\n\nLK99 claims forum post, via Spacebattles - https://ve42.co/KL99Forum\n\nCopper graph, via Handbook of Electromagnetic Materials - https://ve42.co/CopperGraph\n\nLK-99 Superconductor \u{200b}showing levitation - https://ve42.co/Levitation\n\n‘Unreliable social science research’ by Cathleen O’Grady, via Science - https://ve42.co/SocialScience\n\nTiny Neutrinos article by Dennis Overbye, via The NYT - https://ve42.co/NYTNeutrinos\n\n‘The Crisis in Cosmology’ by Astrophysics in Process, via Medium - https://ve42.co/CosmoCrisis\n\n‘Some scientists speak of a “crisis in cosmology.”’ by Adam Frank, via Big Think - https://ve42.co/BigThinkCosmo\n\n‘Why is there a \'crisis\' in cosmology?’ by Paul Sutter, via Space - https://ve42.co/SpaceCosmo\n\n‘Breakthrough in nuclear fusion, via PBS NewsHour on YouTube - https://ve42.co/PBSBreakthrough\n\nDOE National Lab press conference, via U.S. Department of Energy on YouTube - https://ve42.co/DOEPress\n\n‘Nuclear fusion breakthrough’ by Catherine Clifford, via CNBC - https://ve42.co/CNBCFusion\n\n‘US officials announce nuclear fusion breakthrough’, via CNN - https://ve42.co/CNNFusion\n\nNuclear fusion article, via CNN - https://ve42.co/CNNNuclear\n\nClimate catastrophe article by Robin McKie, via The Guardian - https://ve42.co/GuardianClimate\n\nNuclear fusion article by Nicola Davis, via The Guardian - https://ve42.co/GuardianFusion\n\nFusion breakthrough article, via Imperial College London - https://ve42.co/ImperialFusion\n\nWednesday briefing by Archive Bland, via The Guardian - https://ve42.co/GuardianBriefing\n\nSky Sport News Bulletin, via Sky Sport NZ on YouTube - https://ve42.co/SkyBulletin\n\nAlien Probe Ignored Us article by Ed Maz - https://ve42.co/AlienProbe\n\nAttempts to scan the mysterious Oumuamua \'comet\' article by Shivali Best, via MailOnline - https://ve42.co/Oumuamua\n\n‘Have Aliens Found Us?’ by Isaac Chotiner - https://ve42.co/NYTAliens\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAdam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Chris Harper, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, Max Maladino, Meekay, meg noah, Michael Krugman, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nWritten by Derek Muller\nEdited by Peter Nelson\nFilmed by Derek Muller\nProduced by Derek Muller\n\nAdditional video/photos supplied by Getty Images and Storyblocks\nMusic from Epidemic Sound\nThumbnail by Geoff Barrett", + thumbnail: Thumbnail( + url: "https://i4.ytimg.com/vi/czjisEGe5Cw/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-10-31T23:00:20Z", + update_date: "2023-11-01T15:51:15Z", + view_count: 1725916, + like_count: 77012, + ), + ChannelRssVideo( + id: "lFlu60qs7_4", + name: "How One Line in the Oldest Math Text Hinted at Hidden Universes", + description: "Discover strange new universes that turn up at the core of Einstein’s General Relativity. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription.\n\nIf you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV \n\n▀▀▀\nA massive thank you to Prof. Alex Kontorovich for all his help with this video.\n\nA huge thank you to Prof. Geraint Lewis and Dr. Ashmeet Singh for helping us understand the applications of Non-Euclidean geometry in astronomy/cosmology.\n\nLastly, a big thank you to Dr. Henry Segerman and Dr. Rémi Coulon for helping us visualize what it’s like to be inside hyperbolic space and helping us understand hyperbolic geometry.\n\n▀▀▀\nImages:\nEuclid via Science Museum Group - https://ve42.co/Euclid\n\nGeodesy survey via ams - https://ve42.co/Geodesy\n\nJohn Wheeler via NAS Online - https://ve42.co/Wheeler\n\n▀▀▀\nReferences:\nDunham, W. (1991). Journey through Genius: Great Theorems of Mathematics. John Wiley & Sons.\n\nBonola, R. (1955). Non-Euclidean geometry: A critical and historical study of its development. Courier Corporation.\n\nLibrary of Congress. (n.d.). The Library of Congress. - https://ve42.co/LibofCongress\n \nEuclid’s Elements, Wikipedia - https://ve42.co/Elements\n\nThe History of Non-Euclidean Geometry, Extra History via YouTube - https://ve42.co/ExtraHistory\n\nWe (could) live on a 4D Pringle - Physics for the Birds via YouTube - https://ve42.co/4DPringle\n\nParallel Postulate, Wikipedia - https://ve42.co/Parallel\n\nPrékopa, A., & Molnár, E. (Eds.). (2006). Non-euclidean geometries: János Bolyai memorial volume (Vol. 581). Springer Science & Business Media. \n\nSt Andrews, University of. (n.d.). Bolyai. MacTutor History of Mathematics. - https://ve42.co/Bolyai\n\nBolyai, J. (1896). The Science Absolute of Space.. (Vol. 3). The Neomon.\n\nGauss, Wikipedia - https://ve42.co/Gauss\n\nSingh, U. (2022). Gauss-Bolyai-Lobachevsky: The dawn of non-euclidean geometry. Medium. - https://ve42.co/CPNonEuclidean\n \nLandvermessung, D. Z. (1929). Abhandlungen ueber Gauss\' wissenschaftliche Taetigkeit auf den Gebieten der Geodaesie, Physik und Astronomie Bd. 11, Abt. - https://ve42.co/Landvermessung\n\nNikolai Lobachevsky, Wikipedia - https://ve42.co/Lobachevsky\n\nLobachevskiĭ, N. I. (1891). Geometrical researches on the theory of parallels. University of Texas. \n\nA Problem with the Parallel Postulate, Numberphile via YouTube - https://ve42.co/NumberphileParallel\n\nRiemann, B. (2016). On the hypotheses which lie at the bases of geometry. Birkhäuser. - https://ve42.co/Riemann\n\nEinstein, A. (1905). On the electrodynamics of moving bodies. Annalen der physik, 17(10), 891-921. - https://ve42.co/Einstein1905\n\nESA/Hubble. (n.d.). Hubblecast 90: The final frontier of the Frontier Fields. ESA/Hubble. - https://ve42.co/Einstein1905\n\nAgazie, G., et al. (2023). The NANOGrav 15 yr data set: Constraints on supermassive black hole binaries from the gravitational-wave background. - https://ve42.co/NANOGrav\n\nSecrets of the Cosmic Microwave Background, PBS Spacetime via YouTube - https://ve42.co/PBSCMB\n\nWood, C. (2020). How Ancient Light Reveals the Universe\'s Contents. Quanta Magazine. - https://ve42.co/AncientLight\n\nCollaboration (2014). Planck 2013 results. XVI. Cosmological parameters. A&A, 571, A16. - https://ve42.co/Planck2013\n\nWMAP Science Team, NASA. (2014). Matter in the Universe. WMAP, NASA. - https://ve42.co/WMAP2014\n\nWhat Is The Shape of Space, minutephysics via YouTube - https://ve42.co/SpaceShape\n\nShape of the universe, Wikipedia - https://ve42.co/UniverseShape\n\nCrocheting Hyperbolic Planes: Daina Taimina by Ted, via YouTube - https://ve42.co/Hyperbolic\n\nHyperbolic Crochet model - https://ve42.co/Crochet\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAdam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, Max Maladino, Meekay, meg noah, Michael Krugman, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nDirected by Casper Mebius\nWritten by Casper Mebius, Petr Lebedev, Emily Zhang, Derek Muller, and Alex Kontorovich\nEdited by Jack Saxon\nAnimated by Fabio Albertelli, Ivy Tello, and Mike Radjabov \nIllustrations by Jakub Misiek and Celia Bode\nFilmed by Derek Muller\nProduced by Casper Mebius, Derek Muller, and Han Evans\n\nAdditional video/photos supplied by Getty Images, Pond5, and by courtesy of: NASA, NASA\'s Goddard Space Flight Center, NASA Goddard Flight Lab/ CI Lab, NASA’s WMAP science teams, ESO, and ESA/Hubble.\nMusic from Epidemic Sound\nThumbnail by Ren Hurley", + thumbnail: Thumbnail( + url: "https://i1.ytimg.com/vi/lFlu60qs7_4/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-10-21T16:31:35Z", + update_date: "2023-10-27T23:43:35Z", + view_count: 3753202, + like_count: 151665, + ), + ChannelRssVideo( + id: "QQkmJI63ykI", + name: "The Man Who Killed Millions and Saved Billions (Clean Version)", + description: "YES, THIS IS A REUPLOAD. The original was age-restricted and demonetized. To support the channel directly, you can buy Snatoms: https://ve42.co/snatoms1 https://ve42.co/amzn or support on Patreon: https://ve42.co/p\n\nFritz Haber is the scientist who arguably most transformed the world. \n▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\nA huge thanks to Dan Charles for writing a fantastic biography of Fritz Haber, for taking the time to talk to us about it, and providing valuable feedback. This video would not be what it is without his contributions. http://site.danielcharles.us https://ve42.co/Charles\n\nThanks to Tom de Prinse from Explosions and Fire for helping us with the chemistry of explosives. If you like explosions and/or fire, you will love his channel. https://www.youtube.com/c/ExplosionsFire2\n\nThanks to Michael Kuiper of CSIRO for the animation of the composition of air - https://www.youtube.com/watch?v=j9JvX58aRfg\n\nSpecial thanks to Sonya Pemberton, Karl Kruszelnicki, Mary Dobbie, Olivia McRae, and the patreon supporters for giving us feedback on the earlier version of this video.\n\n▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\nReferences:\n\nThe primary reference used is Vaclav Smil’s excellent book, Enriching The Earth – \nSmil, V. (2004). Enriching the earth: Fritz Haber, Carl Bosch, and the transformation of world food production. MIT press. – https://ve42.co/Smil\n\nMastermind: The Rise and Fall of Fritz Haber, the Nobel Laureate Who Launched the Age of Chemical Warfare, by Dan Charles – https://ve42.co/Charles\n\nStoltzenberg, D. (2004). Fritz Haber: Chemist, Nobel Laureate, German, Jew. Chemical Heritage Foundation. – https://ve42.co/Stoltzenberg\n\nPostgate, J. R. (1982). The fundamentals of nitrogen fixation. CUP Archive. – https://ve42.co/postgate\n\nMiles, A. G. (1992). Biological nitrogen fixation. – https://ve42.co/Miles\n\nFriedrich, B., & Hoffmann, D. (2017). Clara Immerwahr: A life in the shadow of Fritz Haber. In One Hundred Years of Chemical Warfare: Research, Deployment, Consequences(pp. 45-67). Springer, Cham. – https://ve42.co/Friedrich2017\n\nDa Silva, G. (2020). What is ammonium nitrate, the chemical that exploded in Beirut. Sci Am, 5. – https://ve42.co/Silva\n\nRodrigues, P., & Micael, J. (2021). The importance of guano birds to the Inca Empire and the first conservation measures implemented by humans. – https://ve42.co/rodrigues\n\nAllison, F. E. (1957). Nitrogen and soil fertility. Soil, the, 85-94. – https://ve42.co/Allison\n\nCrookes, W. (1898). Address of the President before the British Association for the Advancement of Science, Bristol, 1898. Science, 8(200), 561-575. – https://ve42.co/Crookes\n\n▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\nSpecial thanks to Patreon supporters: RayJ Johnson, Brian Busbee, Jerome Barakos M.D., Amadeo Bee, Julian Lee, Inconcision, TTST, Balkrishna Heroor, Chris LaClair, Avi Yashchin, John H. Austin, Jr., OnlineBookClub.org, Matthew Gonzalez, Eric Sexton, john kiehl, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Dumky, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Timothy O’Brien, Mac Malkawi, Michael Schneider, jim buckmaster, Juan Benet, Ruslan Khroma, Robert Blum, Richard Sundvall, Lee Redden, Vincent, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Cy \'kkm\' K\'Nelson, Sam Lutfi, Ron Neal \n\n▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\nWritten by Petr Lebedev, Derek Muller, Felicity Nelson and Kovi Rose\nEdited by Trenton Oliver\nAnimation by Jakub Mistek, Fabio Albertelli, Ivy Tello, Alex Drakoulis, Nils Ramses Kullack, and Charlie Davies\nSFX by Shaun Clifford\nFilmed by Petr Lebedev, Derek Muller and Raquel Nuno\nPhoto of nitrogen deficiency in rice from https://ve42.co/rice\nAdditional video/photos supplied by Getty Images\nMusic from Epidemic Sound: https://ve42.co/music", + thumbnail: Thumbnail( + url: "https://i2.ytimg.com/vi/QQkmJI63ykI/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-10-07T17:45:44Z", + update_date: "2023-10-22T23:24:43Z", + view_count: 1532306, + like_count: 49237, + ), + ChannelRssVideo( + id: "Is2Lip1cJUc", + name: "Extreme Breath-Holding", + description: "This is how people can hold their breath for tens of minutes. Check out our sponsor: https://betterhelp.com/veritasium to get matched with a professional therapist who will listen and help.\n\n▀▀▀\nA huge thanks to Brandon Birchak for all his help with this video. To learn how to hold your breath for 5 minutes, or see one of Brandon’s performances, visit https://eliteperformancedesign.com and https://Sixfootcreations.com\n\nA special thanks to Juan Valdivia for his expert advice on the science of extreme breath holding.\n\n▀▀▀\nReferences:\nU.S. Department of Health and Human Services. (n.d.). How your body controls breathing. National Heart Lung and Blood Institute. - https://ve42.co/BodyBreathing\n\nAnatomy, autonomic nervous system - statpearls - NCBI bookshelf. (n.d.-a). - https://ve42.co/ANS\n\nBiochemistry, oxidative phosphorylation - statpearls - NCBI bookshelf. (n.d.-c). - https://ve42.co/ncbiATP\n\nAcidosis. Acidosis - an overview | ScienceDirect Topics. (n.d.). - https://ve42.co/Acidosis\n\nEvaluation of respiratory alkalosis. Evaluation of respiratory alkalosis - Differential diagnosis of symptoms | BMJ Best Practice US. (n.d.). - https://ve42.co/Alkalosis\n\nWilmshurst, P. (1998, October 10). Diving and Oxygen. BMJ (Clinical research ed.). - https://ve42.co/DivingO\n\nLópez-Barneo, J., Ortega-Sáenz, P., Pardal, R., Pascual, A., & Piruat, J. I. (2008). Carotid body oxygen sensing. European Respiratory Journal, 32(5), 1386-1398. - https://ve42.co/Barneo2008\n\nJeff, & Huffy. (2022, November 17). The Bolt score test: Measure your breathing volume capacity. Marathon Handbook. - https://ve42.co/BOLT\n\nLindholm, P., & Lundgren, C. E. (2009). The physiology and pathophysiology of human breath-hold diving. Journal of Applied Physiology, 106(1), 284-292. - https://ve42.co/Lindholm2009\n\nPhysiology, lung capacity - statpearls - NCBI bookshelf. (n.d.-c). - https://ve42.co/LungCapacity\n\nPanneton, W. M., & Gan, Q. (2020). The mammalian diving response: inroads to its neural control. Frontiers in Neuroscience, 14, 524. - https://ve42.co/Panneton2020 \n\nBaković, D., Eterović, D., Saratlija‐Novaković, X., Palada, I., Valic, Z., Bilopavlović, N., & Dujić, X. (2005). Effect of human splenic contraction on variation in circulating blood cell counts. Clinical and experimental pharmacology and physiology, 32(11), 944-951. https://ve42.co/Bakovic2005 \n\nGooden, B. (1971). The diving response in man, rat and echidna (Doctoral dissertation). - https://ve42.co/Gooden1971 \n\nLongest duration breath hold - freediving static apnea (male). Guinness World Records. (n.d.). - https://ve42.co/DivingRecord \n\nWhat’s the longest a human can hold their breath underwater? BBC Science Focus Magazine. (n.d.). - https://ve42.co/Southwell2023 \n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAdam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, Max Paladino, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nDirected by Derek Muller\nWritten by Felicity Nelson and Derek Muller\nEdited by Trenton Oliver\nAnimated by Ivy Tello\nFilmed by Derek Muller \nProduced by Derek Muller\nAdditional video/photos supplied by Getty Images and Pond5\nMusic from Epidemic Sound", + thumbnail: Thumbnail( + url: "https://i2.ytimg.com/vi/Is2Lip1cJUc/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-09-30T16:39:15Z", + update_date: "2023-10-23T16:33:01Z", + view_count: 1919642, + like_count: 86340, + ), + ChannelRssVideo( + id: "ILgSesWMUEI", + name: "All The Times We Nearly Blew Up The World", + description: "This is a video about some of the many times we have nearly blown up the world. Head over to\nhttps://hensonshaving.com/veritasium and enter code \'Veritasium\' for 100 free blades with the purchase of a razor. Make sure to add both the razor and the blades to your cart for the code to take effect. \n\n▀▀▀\nReferences:\nList of Broken Arrows -- https://ve42.co/AtomicArchive https://ve42.co/BrokenArrowsReport\nDeclassified Goldsboro Report -- https://ve42.co/Goldsboro\nOperation ChromeDome -- https://ve42.co/OperationChromeDome\nCIA website -- https://ve42.co/CIA\n\nCataclysmic cargo: The hunt for four missing nuclear bombs after a B-52 crash -- https://ve42.co/WoPo\nTHE LAST FLIGHT OF HOBO 28 -- https://ve42.co/lastflight\nThe Voice of Larry Messinger is from this documentary -- https://ve42.co/Messinger\nEven Without Detonation, 4 Hydrogen Bombs From ’66 Scar Spanish Village -- https://ve42.co/NYTPalomares\nDecades Later, Sickness Among Airmen After a Hydrogen Bomb Accident -- https://ve42.co/NYTPalomares2\nPicture of ReVelle -- https://ve42.co/JackReVelle1\nGreat NPR where the audio of ReVelle is from -- https://ve42.co/JackReVelle2\nCIA Website -- https://ve42.co/CIA\n\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAnton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nDirected by Petr Lebedev\nWritten by Petr Lebedev and Derek Muller\nEdited by Peter Nelson\nAnimated by Fabio Albertelli, Jakub Misiek, Ivy Tello and Mike Radjabov\nFilmed by Derek Muller \nProduced by Petr Lebedev and Derek Muller\nAdditional video/photos supplied by Getty Images and Pond5\nMusic from Epidemic Sound", + thumbnail: Thumbnail( + url: "https://i2.ytimg.com/vi/ILgSesWMUEI/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-09-11T17:41:27Z", + update_date: "2023-10-06T12:35:16Z", + view_count: 2266326, + like_count: 103243, + ), + ChannelRssVideo( + id: "8DBhTXM_Br4", + name: "How The Most Useless Branch of Math Could Save Your Life", + description: "There is an entire branch of math simply devoted to knots – and it has changed the world. We’ll rope you in. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription.\n\n▀▀▀\nHuge thanks to Prof. Colin Adams for his excellent help guiding us through the world of knots.\nMany thanks to Prof. Doug Smith, Dorian Raymer, Prof. David Leigh, and Prof. Dorothy Buck for helping us understand applications of knot theory.\nMany thanks to Prof. Dan Silver & Prof. Jim Hoste for speaking with us about the history and tabulation of knots. \n\nIf you want to learn more about knots and play with them yourself, check out:\nThe amazing KnotPlot tool — https://knotplot.com/. Thanks to Rob Scharein for providing technical help as well!\nA table of knots and all their invariants — https://knotinfo.math.indiana.edu/\nThe Knot Atlas for general info on knots — http://katlas.org/wiki/Main_Page\n\n▀▀▀\nKnot Theory Video References – https://ve42.co/KnotTheoryRefs\n\nImages & Video:\nAlexander Cutting the Gordian Knot by Donato Creti via Fine Art America - https://ve42.co/GordianCut\nIndus Valley tablet via Quora - https://ve42.co/IndusValley\nPages from the Book of Kells via National Trust of Scotland - https://ve42.co/BookOfKells \nMedieval Celtic designs from @thebookofkellsofficial via Instagram - https://ve42.co/KellsInsta\nChinese knotwork by YWang9174 via Wikimedia Commons - https://ve42.co/Panchang\nQuipu cords by Pi3.124 via Wikimedia Commons - https://ve42.co/Quipu\nBorromeo heraldry via Terre Borromeo - https://ve42.co/Borromeo\nBirman/Jones letter via Celebratio Mathematica - https://ve42.co/JonesBirman\nMolecular trefoil knot by M stone via Wikimedia Commons - https://ve42.co/TrefoilMolecule\nX-ray structure of trefoil knot by Ll0103 via Wikimedia Commons - https://ve42.co/XrayTrefoil\nBacteria animation from Your Body\'s Molecular Machines by Drew Berry via the Walter and Eliza Hall Institute of Medical Research - http://wehi.tv\nTopoisomerase and knots from Orlandini et al. Synergy of topoisomerase. PNAS, vol. 116, no. 17, 2019, pp. 8149–8154. – https://ve42.co/Orlandini2019\nKnotProt 2.0: A database of proteins with knots and slipknots - https://ve42.co/Knotprot\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAnton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nDirected by Emily Zhang\nWritten by Emily Zhang and Derek Muller\nEdited by Trenton Oliver\nAnimated by Fabio Albertelli, Ivy Tello, Jakub Misiek, and Mike Radjabov \nFilmed by Derek Muller, Raquel Nuno, and Emily Zhang\nProduced by Emily Zhang and Derek Muller\n\nThumbnail by Ignat Berbeci and Mike Radjabov\nAdditional video/photos supplied by Getty Images and Pond5\nMusic from Epidemic Sound", + thumbnail: Thumbnail( + url: "https://i1.ytimg.com/vi/8DBhTXM_Br4/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-09-03T13:54:14Z", + update_date: "2023-09-20T11:42:17Z", + view_count: 4706084, + like_count: 153733, + ), + ChannelRssVideo( + id: "ZjBgEkbnX2I", + name: "Should Airships Make a Comeback?", + description: "Will we see a new generation of airships roaming our skies? Head to https://www.odoo.com/r/veritasium to start building your own website for free.\n\nIf you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV \n\n▀▀▀\nThank you to Eli Dourado for letting us explore the argument he describes in his article: https://ve42.co/Dourado \n\nA huge thank you to Dan Grossman and Nick Allman for their time, help, and expertise.\n\nAlso a massive thank you to those who helped us understand the world of modern airships, and provided valuable feedback - Prof. Barry Prentice, Gennadiy Verba, Prof. \nChristoph Pflaum, Heather Roszczyk, Dr. Casey Handmer, Richard Van Trueren, & Thibault Proux.\n\nWe are also grateful for the collaboration of the companies who are working hard to make this comeback happen - Atlas LTA, Buoyant Aircraft Systems International, Hybrid Air Vehicles, LTA Research, & Flying Whales.\n\n\n▀▀▀\nReferences:\n\nHow Airships Could Overcome a Century of Failure, Bloomberg Originals via YouTube - https://ve42.co/AirshipsCoF \n\nWhy the Airship May Be the Future of Air Travel, Undecided with Matt Ferrell via YouTube - https://ve42.co/FutureAirships \n\nAirship, Wikipedia - https://ve42.co/AirshipWiki \n\nHandmer, C. (2020). A quick note on airships. Casey Handmer’s Blog - https://ve42.co/Handmer2020 \n\nUNCTAD (2020). Review of Maritime Transport 2020 - https://ve42.co/RMT2020 \n\nNational Transportation Research Center (2023). Freight Analysis Framework Version 5 (FAF5) - https://ve42.co/FAF5 \n\nHybrid Air Vehicles (2023). HAV - https://ve42.co/HAV \n\nLTA Research (2023). Lighter Than Air (LTA) Research - https://ve42.co/LTAResearch \n\nOceanSkyCruises (2023). North Pole Expedition - OceanSkyCruises - https://ve42.co/NPExpedition \n\nFlying Whales (2023). Flying Whales - https://ve42.co/FlyingWhales \n\nBuoyant Aircraft Systems International (2023). BASI - https://ve42.co/BASI \n\nAtlas LTA (2023). Atlas Electric Airships | Atlas LTA Airships - https://ve42.co/AtlasLTA \n\nPrentice, B. (2021). Hydrogen gas-fuelled airships could spur development in remote communities. The Conversation - https://ve42.co/HydrogenAirships \n\nGrossman, D. (2009). The Hindenburg Disaster. Airships - https://ve42.co/Hindenburg1 \n\nHindenburg Disaster, Wikipedia - https://ve42.co/HindenburgWiki \n\nWhat happened to the Hindenburg?, Jared Owen via Youtube - https://ve42.co/Owen2019 \n\nNational Museum of the U.S. Navy. USS Akron (ZRS-4) - https://ve42.co/USSAkron \n\nUSS Akron, Wikipedia - https://ve42.co/USSAkronWiki \n\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAdam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Benedikt Heinen, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nWritten by Casper Mebius & Derek Muller\nDirected by Casper Mebius\nEdited by Jack Saxon\nFilmed by Derek Muller, Jamie MacLeod, Han Evans, & Raquel Nuno\nAnimation by Mike Radjabov & Fabio Albertelli\nAdditional video/photos supplied by Getty Images, Pond5, & Envato Elements\nMusic from Epidemic Sound & Pond5\nProduced by Casper Mebius, Derek Muller, & Han Evans\n\n\nMore footage & photos from:\nThermite Rail Welding video by dulevoz via YouTube - https://www.youtube.com/watch?v=rNjosF789X4 \n\nO’Rourke, T. (2016). Chronicle Covers: When the Hindenburg burst into flames. San Francisco Chronicle - https://ve42.co/Hindenburg2 \n\nWind turbine blade transport video by DOLL Fahrzeugbau via YouTube - https://www.youtube.com/watch?v=5aPXuap0LZw \n\nWind turbine blade transport through mountains video by CGTN via Youtube - https://www.youtube.com/watch?v=9dtUrY8_1CM \n\nFormer Airship Hangar by Stefan Kühn - https://ve42.co/Aerium", + thumbnail: Thumbnail( + url: "https://i3.ytimg.com/vi/ZjBgEkbnX2I/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-08-31T14:59:55Z", + update_date: "2023-09-21T04:43:36Z", + view_count: 2442840, + like_count: 105275, + ), + ChannelRssVideo( + id: "FkKPsLxgpuY", + name: "I Took an IQ Test to Find Out What it Actually Measures", + description: "IQ is supposed to measure intelligence, but does it? Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription.\n\nIf you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV \n\n▀▀▀\nA huge thank you to Emeritus Professor Cecil R. Reynolds and Dr. Stuart J. Ritchie for their expertise and time.\n\nAlso a massive thank you to Prof. Steven Piantadosi and Prof. Alan S. Kaufman for helping us understand this complicated topic. As well as to Jay Zagrosky from Boston University\'s Questrom School of Business for providing data from his study.\n\n▀▀▀\nReferences:\nKaufman, A. S. (2009). IQ testing 101. Springer Publishing Company.\n\nReynolds, C. R., & Livingston, R. A. (2021). Mastering modern psychological testing. Springer International Publishing.\n\nRitchie, S. (2015). Intelligence: All that matters. John Murray.\n\nSpearman, C. (1961). \" General Intelligence\" Objectively Determined and Measured. - https://ve42.co/Spearman1904 \n\nBinet, A., & Simon, T. (1907). Le développement de l\'intelligence chez les enfants. L\'Année psychologique, 14(1), 1-94.. - https://ve42.co/Binet1907 \n\nIntelligence Quotient, Wikipedia - https://ve42.co/IQWiki \n\nRadiolab Presents: G. - https://ve42.co/RadioLabG \n\nMcDaniel, M. A. (2005). Big-brained people are smarter: A meta-analysis of the relationship between in vivo brain volume and intelligence. Intelligence, 33(4), 337-346. - https://ve42.co/McDaniel2005 \n\nDeary, I. J., Strand, S., Smith, P., & Fernandes, C. (2007). Intelligence and educational achievement. Intelligence, 35(1), 13-21. - https://ve42.co/Deary2007 \n\nLozano-Blasco, R., Quílez-Robres, A., Usán, P., Salavera, C., & Casanovas-López, R. (2022). Types of Intelligence and Academic Performance: A Systematic Review and Meta-Analysis. Journal of Intelligence, 10(4), 123. - https://ve42.co/Blasco2022 \n\nKuncel, N. R., & Hezlett, S. A. (2010). Fact and fiction in cognitive ability testing for admissions and hiring decisions. Current Directions in Psychological Science, 19(6), 339-345. - https://ve42.co/Kuncel2010 \n\nLaurence, J. H., & Ramsberger, P. F. (1991). Low-aptitude men in the military: Who profits, who pays?. Praeger Publishers. - https://ve42.co/Laurence1991 \n\nGregory, H. (2015). McNamara\'s Folly: The Use of Low-IQ Troops in the Vietnam War; Plus the Induction of Unfit Men, Criminals, and Misfits. Infinity Publishing.\n\nGottfredson, L. S., & Deary, I. J. (2004). Intelligence predicts health and longevity, but why?. Current Directions in Psychological Science, 13(1), 1-4. - https://ve42.co/Gottfredson2004 \n\nSanchez-Izquierdo, M., Fernandez-Ballesteros, R., Valeriano-Lorenzo, E. L., & Botella, J. (2023). Intelligence and life expectancy in late adulthood: A meta-analysis. Intelligence, 98, 101738. - https://ve42.co/Izquierdo2023 \n\nZagorsky, J. L. (2007). Do you have to be smart to be rich? The impact of IQ on wealth, income and financial distress. Intelligence, 35(5), 489-501. - https://ve42.co/Zagorsky2007 \n\nStrenze, T. (2007). Intelligence and socioeconomic success: A meta-analytic review of longitudinal research. Intelligence, 35(5), 401-426. - https://ve42.co/Strenze2007 \n\nDeary, I. J., Pattie, A., & Starr, J. M. (2013). The stability of intelligence from age 11 to age 90 years: the Lothian birth cohort of 1921. Psychological science, 24(12), 2361-2368. - https://ve42.co/Deary2013 \n\nFlynn, J. R. (1987). Massive IQ gains in 14 nations: What IQ tests really measure. Psychological bulletin, 101(2), 171. - https://ve42.co/Flynn1987 \n\nWhy our IQ levels are higher than our grandparents\' | James Flynn, TED via YouTube - https://www.youtube.com/watch?v=9vpqilhW9uI \n\nDuckworth, A. L., Quinn, P. D., Lynam, D. R., Loeber, R., & Stouthamer-Loeber, M. (2011). Role of test motivation in intelligence testing. Proceedings of the National Academy of Sciences, 108(19), 7716-7720. - https://ve42.co/Duckworth2011 \n\nKulik, J. A., Bangert-Drowns, R. L., & Kulik, C. L. C. (1984). Effectiveness of coaching for aptitude tests. Psychological Bulletin, 95(2), 179. - https://ve42.co/Kulik1984 \n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAdam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Benedikt Heinen, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nWritten by Derek Muller, Casper Mebius, & Petr Lebedev\nEdited by Trenton Oliver \nFilmed by Derek Muller, Han Evans, & Raquel Nuno\nAnimation by Fabio Albertelli & Ivy Tello\nAdditional video/photos supplied by Getty Images & Pond5\nMusic from Epidemic Sound\nProduced by Derek Muller, Casper Mebius, & Han Evans", + thumbnail: Thumbnail( + url: "https://i3.ytimg.com/vi/FkKPsLxgpuY/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-08-03T16:49:08Z", + update_date: "2023-09-21T13:05:23Z", + view_count: 5414817, + like_count: 190081, + ), + ChannelRssVideo( + id: "Xzv84ZdtlE0", + name: "Why Oppenheimer Deserves His Own Movie", + description: "J. Robert Oppenheimer forever changed the course of history. He may be the most important physicist to have ever lived. Part of this video is sponsored by Wren. Offset your carbon footprint on Wren: \u{200b}https://www.wren.co/start/veritasium1 For the first 100 people who sign up, I will personally pay for the first month of your subscription!\n\nIf you want to learn more about Oppeheimer, I strongly recommend the book “American Prometheus” By Kai Bird and Martin Sherwin. It is a remarkable book, very much deserving of the Pulitzer prize it received.\n\nIf you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV\n\n▀▀▀\nA huge thank you to Dr. Martin Rohde and Dr. Antonia Denkova from the TU Delft for proofreading the script and providing valuable feedback.\n\n▀▀▀\nReferences:\n\nBird, K., & Sherwin, M. J. (2021). American Prometheus: the triumph and tragedy of J. Robert Oppenheimer. Atlantic Books.\n\nSmith, A. K., & Weiner, C. (1980). Robert Oppenheimer: letters and recollections. Bulletin of the Atomic Scientists, 36(5), 19-27. - https://ve42.co/Smith1980 \n\nCombes, J. M., Duclos, P., & Seiler, R. (1981). The born-oppenheimer approximation. Rigorous atomic and molecular physics, 185-213. - https://ve42.co/Combes1981 \n\nRhodes, R. (2012). The making of the atomic bomb. Simon and Schuster.\n\nOppenheimer, J. R., & Volkoff, G. M. (1939). On massive neutron cores. Physical Review, 55(4), 374. - https://ve42.co/Oppenheimer1939b \n\nOppenheimer, J. R. (1927). Bemerkung zur Zerstreuung der α-Teilchen. Zeitschrift für Physik, 43(5-6), 413-415. - https://ve42.co/Oppenheimer1927 \n\nOppenheimer, J. R. (1927). Zur quantenmechanik der richtungsentartung. Zeitschrift für Physik, 43(1-2), 27-46. - https://ve42.co/Oppenheimer1927b \n\nBorn, M., & Oppenheimer, R. (1927). Zur Quantentheorie der Molekeln Annalen der Physik, v. 84. - https://ve42.co/Born1927 \n\nOppenheimer, J. R. (1928). Three notes on the quantum theory of aperiodic effects. Physical review, 31(1), 66.\n\nOppenheimer, J. R. (1928). On the quantum theory of the capture of electrons. Physical review, 31(3), 349.\n\nOppenheimer, J. R. (1931). Note on light quanta and the electromagnetic field. Physical Review, 38(4), 725.\n\nFurry, W. H., & Oppenheimer, J. R. (1934). On the theory of the electron and positive. Physical Review, 45(4), 245. - https://ve42.co/Oppenheimer1934 \n\nOppenheimer, J. R. (1935). Note on charge and field fluctuations. Physical Review, 47(2), 144. - https://ve42.co/Oppenheimer1935 \n\nOppenheimer, J. R., & Snyder, H. (1939). On continued gravitational contraction. Physical Review, 56(5), 455. - https://ve42.co/Oppenheimer1939 \n\nOppenheimer, J. R., & Phillips, M. (1935). Note on the transmutation function for deuterons. Physical Review, 48(6), 500. - https://ve42.co/Oppenheimer1935b \n\nMalik, J. (1985). Yields of the Hiroshima and Nagasaki nuclear explosions (No. LA-8819). Los Alamos National Lab.(LANL), Los Alamos, NM (United States). - https://ve42.co/Malik1985 \n\nIgnition of the atmosphere with nuclear bombs -- https://ve42.co/Konopinski46\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nAdam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Benedikt Heinen, Bernard McGee, Bill Linder, Blake Byers, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures\n\n▀▀▀\nWritten by Petr Lebedev & Derek Muller\nEdited by Trenton Oliver & Katrina Jackson\nFilmed by Derek Muller\nAnimation by Fabio Albertelli, Ivy Tello, & Mike Radjabov\nIllustration by Jakub Misiek and Celia Bode\nAdditional video/photos supplied by Getty Images & Pond5\nMusic from Epidemic Sound", + thumbnail: Thumbnail( + url: "https://i1.ytimg.com/vi/Xzv84ZdtlE0/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-07-18T23:28:16Z", + update_date: "2023-08-11T23:59:47Z", + view_count: 10037682, + like_count: 345549, + ), + ChannelRssVideo( + id: "lfkjm2YRG-Q", + name: "The Hidden Science of Fireworks", + description: "This is the biggest, brightest, hottest video there is about the science of fireworks. This video is brought to you by Kiwico – go to https://kiwico.com/veritasium for your first month free!\n\nIf you\'re looking for a molecular modeling kit, try Snatoms - a kit I invented where the atoms snap together magnetically: https://snatoms.com\n\nCheck out Gene’s channel here -- @PotatoJet \n\nMassive thanks to Mike Tockstein from Pyrotechnic Innovations @PyroInnovations \nand Will Scott from Las Vegas Display Fireworks Inc, for all your pyro knowledge and keeping us safe.\n\n▀▀▀\nMassive thanks to Gene Nagata from PotatoJet for filming this episode – check out his wonderful channel for more videos about cameras and FPV drones.\n\nThanks to Brandon Williams for helping with the chemistry and sourcing of materials. \n\nThanks to Matthew Tosh for the help with the chemistry conversation about fireworks.\n\nThanks to Simon Werrett for the help with the history of fireworks.\n\n▀▀▀\nWerrett, S. (2010). Fireworks: pyrotechnic arts and sciences in European history. University of Chicago Press\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nEmil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi.\n\n▀▀▀\nWritten by Derek Muller\nEdited by Trenton Oliver\nAnimated by Ivy Tello and Fabio Albertelli\nFilmed by Derek Muller, Hunter Peterson, Gene Nagata, Raquel Nuno\nProduction by Hunter Peterson and Stephanie Castillo\nAdditional video/photos supplied by Mike Tockstein/Pyrotechnic Innovations\nMusic from Epidemic Sound & Jonny Hyman\nProduced by Derek Muller, Petr Lebedev, Emily Zhang, & Casper Mebius", + thumbnail: Thumbnail( + url: "https://i1.ytimg.com/vi/lfkjm2YRG-Q/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-07-07T17:43:14Z", + update_date: "2023-09-21T07:49:06Z", + view_count: 3000045, + like_count: 128355, + ), + ChannelRssVideo( + id: "DxL2HoqLbyA", + name: "The Most Misunderstood Concept in Physics", + description: "One of the most important, yet least understood, concepts in all of physics. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription.\n\nIf you\'re looking for a molecular modeling kit, try Snatoms - a kit I invented where the atoms snap together magnetically: https://snatoms.com\n\n▀▀▀\nA huge thank you to those who helped us understand different aspects of this complicated topic - Dr. Ashmeet Singh, Supriya Krishnamurthy, Dr. Jos Thijssen, Dr. Bijoy Bera, Dr. Timon Idema, Álvaro Bermejillo Seco and Dr. Misha Titov. \n\n▀▀▀\nReferences: \nCarnot, S. (1824). Reflections on the motive power of heat: and on machines fitted to develop that power. - https://ve42.co/Carnot1890 \n\nHarnessing The True Power Of Atoms | Order And Disorder Documentaries, Spark via YouTube - https://ve42.co/OrderDisorder \n\nA better description of entropy, Steve Mould via YouTube - https://ve42.co/Mould2016 \n\nDugdale, J. S. (1996). Entropy and its physical meaning. CRC Press. - https://ve42.co/Dugdale1996 \n\nSchroeder, D. V. (1999). An introduction to thermal physics. - https://ve42.co/Schroeder2021 \n\nFowler, M. Heat Engines: the Carnot Cycle, University of Virginia. - https://ve42.co/Fowler2023 \n\nChandler, D.L. (2010). Explained: The Carnot Limit, MIT News - https://ve42.co/Chandler2010 \n\nEntropy, Wikipedia - https://ve42.co/EntropyWiki \n\nClausius, R. (1867). The mechanical theory of heat. Van Voorst. - https://ve42.co/Clausius1867 \n\nWhat is entropy? TED-Ed via YouTube - https://ve42.co/Phillips2017 \n\nThijssen, J. (2018) Lecture Notes Statistical Physics, TU Delft.\n\nSchneider, E. D., & Kay, J. J. (1994). Life as a manifestation of the second law of thermodynamics. Mathematical and computer modelling, 19(6-8), 25-48. - https://ve42.co/Schneider1994 \n\nLineweaver, C. H., & Egan, C. A. (2008). Life, gravity and the second law of thermodynamics. Physics of Life Reviews, 5(4), 225-242. - https://ve42.co/Lineweaver2008 \n\nMichaelian, K. (2012). HESS Opinions\" Biological catalysis of the hydrological cycle: life\'s thermodynamic function\". Hydrology and Earth System Sciences, 16(8), 2629-2645. - https://ve42.co/Michaelian2012 \n\nEngland, J. L. (2013). Statistical physics of self-replication. The Journal of chemical physics, 139(12), 09B623_1. - https://ve42.co/England2013 \n\nEngland, J. L. (2015). Dissipative adaptation in driven self-assembly. Nature nanotechnology, 10(11), 919-923. - https://ve42.co/England2015 \n\nWolchover, N. (2014). A New Physics Theory of Life, Quantamagazine - https://ve42.co/Wolchover2014 \n\nLineweaver, C. H. (2013). The entropy of the universe and the maximum entropy production principle. In Beyond the Second Law: Entropy Production and Non-equilibrium Systems (pp. 415-427). Berlin, Heidelberg: Springer Berlin Heidelberg. - https://ve42.co/LineweaverEntropy \n\nBekenstein, J.D. (1972). Black holes and the second law. Lett. Nuovo Cimento 4, 737–740. - https://ve42.co/Bekenstein1972 \n\nCarroll, S.M. (2022). The Biggest Ideas in the Universe: Space, Time, and Motion. Penguin Publishing Group. - https://ve42.co/Carroll2022 \n\nBlack hole thermodynamics, Wikipedia - https://ve42.co/BlackHoleTD \n\nCosmology and the arrow of time: Sean Carroll at TEDxCaltech, TEDx Talks via YouTube - https://ve42.co/CarrollTEDx \n\nCarroll, S. M. (2008). The cosmic origins of time’s arrow. Scientific American, 298(6), 48-57. - https://ve42.co/Carroll2008 \n\nThe Passage of Time and the Meaning of Life | Sean Carroll (Talk + Q&A), Long Now Foundation via YouTube - https://ve42.co/CarrollLNF \n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nEmil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi.\n\n▀▀▀\nWritten by Casper Mebius, Derek Muller & Petr Lebedev\nEdited by Trenton Oliver & Jamie MacLeod\nAnimated by Mike Radjabov, Ivy Tello, Fabio Albertelli and Jakub Misiek\nFilmed by Derek Muller, Albert Leung & Raquel Nuno\nMolecular collisions video by CSIRO\'s Data61 via YouTube: Simulation of air \nAdditional video/photos supplied by Getty Images, Pond5 and by courtesy of NASA, NASA\'s Goddard Space Flight Center, NASA Goddard Flight Lab/ CI Lab, NASA/SDO and the AIA, EVE, HMI, and WMAP science teams. As well as the Advanced Visualization Laboratory at the National Center for Supercomputing Applications, B. Robertson, L. Hernquist\nMusic from Epidemic Sound & Jonny Hyman\nProduced by Derek Muller, Petr Lebedev, Emily Zhang, & Casper Mebius", + thumbnail: Thumbnail( + url: "https://i1.ytimg.com/vi/DxL2HoqLbyA/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-07-01T16:08:04Z", + update_date: "2023-07-08T09:01:44Z", + view_count: 9561195, + like_count: 388217, + ), + ChannelRssVideo( + id: "6bgNm9l_3qU", + name: "I Vacuum Venom from the World\'s Deadliest Spider", + description: "Go to our sponsor https://betterhelp.com/veritasium to get matched with a professional therapist who will listen and help.\n\n▀▀▀\nHuge thanks to the Australian Reptile Park for having us over to film – special thanks to Jake Meney for showing us the spiders and Caitlin Vine for organizing the shoot. https://www.reptilepark.com.au\n\nHuge thanks to Dr Timothy Jackson with his help and answering our questions. \n\nThanks to Seqirus Australia for providing B-roll footage of the antivenom production process. \n\n\n▀▀▀\nReferences:\n\nPineda, S. S., Sollod, B. L., Wilson, D., Darling, A., Sunagar, K., Undheim, E. A., ... & King, G. F. (2014). Diversification of a single ancestral gene into a successful toxin superfamily in highly venomous Australian funnel-web spiders. BMC genomics, 15(1), 1-16 - https://ve42.co/Pineda2014\n\nIsbister, G. K., Gray, M. R., Balit, C. R., Raven, R. J., Stokes, B. J., Porges, K., ... & Fisher, M. M. (2005). Funnel-web spider bite: a systematic review of recorded clinical cases. Medical journal of Australia, 182(8), 407-411 - https://ve42.co/Isbister2005\n\nHerzig, V., Sunagar, K., Wilson, D. T., Pineda, S. S., Israel, M. R., Dutertre, S., ... & Fry, B. G. (2020). Australian funnel-web spiders evolved human-lethal δ-hexatoxins for defense against vertebrate predators. Proceedings of the National Academy of Sciences, 117(40), 24920-24928 - https://ve42.co/Herzig2020\n\nNicholson, G. M., & Graudins, A. (2002). Spiders of medical importance in the Asia–Pacific: Atracotoxin, latrotoxin and related spider neurotoxins. Clinical and experimental pharmacology and physiology, 29(9), 785-794 - https://ve42.co/Nicholson2002\n\nFletcher, J. I., Chapman, B. E., Mackay, J. P., Howden, M. E., & King, G. F. (1997). The structure of versutoxin (δ-atracotoxin-Hv1) provides insights into the binding of site 3 neurotoxins to the voltage-gated sodium channel. Structure, 5(11), 1525-1535 - https://ve42.co/Fletcher1997\n\nAustralian Reptile Park. (2022). Snake and Spider First Aid - https://ve42.co/ARPFirstAid\n\nThe Australian Museum. (20 ). Spider facts - https://ve42.co/SpiderFacts\n\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nOrlando Bassotto, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Benedikt Heinen, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, and Sam Lutfi\n\n\n▀▀▀\nWritten by Katie Barnshaw & Derek Muller\nEdited by Trenton Oliver\nFilmed by Petr Lebedev, Derek Muller and Jason Tran\nAnimation by Ivy Tello, Jakub Misiek and Fabio Albertelli\nNeuron animation by Reciprocal Space – https://www.reciprocal.space\nAdditional video/photos supplied from Getty Images, Pond5\nB-roll supplied by Seqirus Australia \nMusic from Epidemic Sound\nProduced by Derek Muller, Petr Lebedev, Emily Zhang & Katie Barnshaw", + thumbnail: Thumbnail( + url: "https://i3.ytimg.com/vi/6bgNm9l_3qU/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-06-21T14:01:56Z", + update_date: "2023-09-28T16:06:27Z", + view_count: 2135220, + like_count: 88348, + ), + ChannelRssVideo( + id: "tRaq4aYPzCc", + name: "Mathematicians Use Numbers Differently From The Rest of Us", + description: "There\'s a strange number system, featured in the work of a dozen Fields Medalists, that helps solve problems that are intractable with real numbers. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription.\n\nIf you\'re looking for a molecular modeling kit, try Snatoms - a kit I invented where the atoms snap together magnetically: https://snatoms.com\n\n▀▀▀\nReferences: \n\nKoblitz, N. (2012). p-adic Numbers, p-adic Analysis, and Zeta-Functions (Vol. 58). Springer Science & Business Media.\n\nAmazing intro to p-adic numbers here: https://youtu.be/3gyHKCDq1YA\nExcellent series on p-adic numbers: https://youtu.be/VTtBDSWR1Ac\nGreat videos by James Tanton: @JamesTantonMath \n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nEmil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi.\n\n▀▀▀\nWritten by Derek Muller and Alex Kontorovich \nEdited by Trenton Oliver\nAnimated by Mike Radjabov, Ivy Tello, Fabio Albertelli and Jakub Misiek\nFilmed by Derek Muller\nAdditional video/photos supplied by Getty Images & Pond5\nMusic from Epidemic Sound & Jonny Hyman\nProduced by Derek Muller, Petr Lebedev, & Emily Zhang", + thumbnail: Thumbnail( + url: "https://i1.ytimg.com/vi/tRaq4aYPzCc/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-06-06T13:43:15Z", + update_date: "2023-09-21T07:33:44Z", + view_count: 5263436, + like_count: 156728, + ), + ChannelRssVideo( + id: "ZMQbHMgK2rw", + name: "The Fastest Maze-Solving Competition On Earth", + description: "Welcome to Micromouse, the fastest maze-solving competition on Earth. Join Onshape’s community of over 3 million CAD users by creating a free account here: https://Onshape.pro/Veritasium.\n\n▀▀▀\nA huge thank you to Peter Harrison for all of his help introducing us to the world of Micromouse – check out https://ukmars.org & https://micromouseonline.com.\nThank you to David Otten, APEC, and the All-Japan Micromouse Competition for having us.\nThank you to Juing-Hei (https://www.youtube.com/@suhu9379) & Derek Hall (https://www.youtube.com/@MicroMouse) for usage of their micromouse videos.\nThank you to John McBride, Yusaku Kanagawa, and Katie Barnshaw for their help with Japanese translations. \n\n▀▀▀\nReferences: \nClaude Shannon Demonstrates Machine Learning, AT&T Tech Channel Archive - https://ve42.co/ClaudeShannon\nMighty mouse, MIT News Magazine - https://ve42.co/MightyMouse\nHistory, Micromouse Online Blog - https://ve42.co/MMHistory\nChristiansen, D. (1977). Spectral lines: Announcing the Amazing Micro-Mouse Maze Contest. IEEE Spectrum, vol. 14, no. 5, pp. 27-27 - https://ve42.co/Christiansen1977\nAllan, R. (1979). Microprocessors: The amazing micromice: See how they won: Probing the innards of the smartest and fastest entries in the Amazing Micro-Mouse Maze Contest. IEEE Spectrum, vol. 16, no. 9, pp. 62-65, - https://ve42.co/Allan1979\n1977-79 – “MOONLIGHT SPECIAL” Battelle Inst. (American), CyberNetic Zoo - https://ve42.co/MoonlightSpecial\nChristiansen, D. (2014). The Amazing MicroMouse Roars On. Spectral Lines - https://ve42.co/Christiansen2014\n1986 - MicroMouse history, competition & how it got started in the USA, via YouTube - https://ve42.co/MMArchiveYT\nThe first World Micromouse Contest in Tsubuka, Japan, August 1985 [1/2] by TKsTclip via YouTube - https://ve42.co/MMTsukubaYT\nIEEE. (2018). Micromouse Competition Rules - https://ve42.co/IEEERules\nTondra, D. (2004). The Inception of Chedda: A detailed design and analysis of micromouse. University of Nevada - https://ve42.co/Tondra2004\nBraunl, T. (1999). Research relevance of mobile robot competitions. IEEE Robotics & Automation Magazine, vol. 6, no. 4, pp. 32-37 - https://ve42.co/Braunl1999\nAll Japan Micromouse 2017 by Peter Harrison, Micromouse Online - https://ve42.co/RedComet\nWinning record of the national competition micromouse (half size) competition. mm3sakusya @ wiki (Google translated from Japanese) - https://ve42.co/JapanFinishTimes\nThe Fosbury Flop—A Game-Changing Technique, Smithsonian Magazine - https://ve42.co/FosburyFlop\nGold medal winning heights in the Men\'s and Women\'s high jump at the Summer Olympics from 1896 to 2020, Statistica - https://ve42.co/HighJump\nZhang, H., Wang, Y., Wang, Y., & Soon, P. L. (2016). Design and realization of two-wheel micro-mouse diagonal dashing. Journal of Intelligent & Fuzzy Systems, 31(4), 2299-2306. - https://ve42.co/Zhang2016\nMicromouse Turn List, Keri’s Lab - https://ve42.co/MMTurns\nGreen Ye via YouTube - https://ve42.co/Greenye\nClassic Micromouse, Excel 9a. Demonstrate fan suction, by TzongYong Khiew via YouTube - https://ve42.co/MMFanYT\nVacuum Micromouse by Eliot, HACKADAY - https://ve42.co/MMVacuum\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nEmil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi.\n\n▀▀▀\nWritten by Tom Lum and Emily Zhang\nEdited by Trenton Oliver\nAnimated by Ivy Tello\nCoordinated by Emily Zhang\nFilmed by Yusaku Kanagawa, Emily Zhang, and Derek Muller\nAdditional video/photos supplied by Getty Images and Pond5\nMusic from Epidemic Sound\nThumbnail by Ren Hurley and Ignat Berbeci\nReferences by Katie Barnshaw\nProduced by Derek Muller, Petr Lebedev, and Emily Zhang", + thumbnail: Thumbnail( + url: "https://i3.ytimg.com/vi/ZMQbHMgK2rw/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-05-24T17:39:57Z", + update_date: "2023-07-02T08:30:42Z", + view_count: 14014652, + like_count: 306094, + ), + ChannelRssVideo( + id: "FU_YFpfDqqA", + name: "Why The First Computers Were Made Out Of Light Bulbs", + description: "Lightbulbs might be the best idea ever – just not for light. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription.\n\nA huge thanks to David Lovett for showing me his awesome relay and vacuum tube based computers. Check out his YouTube channel @UsagiElectric \n\n▀▀▀\nReferences: \nHerring, C., & Nichols, M. H. (1949). Thermionic emission. Reviews of modern physics, 21(2), 185. – https://ve42.co/Herring1949\n\nGoldstine, H. H., & Goldstine, A. (1946). The electronic numerical integrator and computer (eniac). Mathematical Tables and Other Aids to Computation, 2(15), 97-110. – https://ve42.co/ENIAC\n\nShannon, C. E. (1938). A symbolic analysis of relay and switching circuits. Electrical Engineering, 57(12), 713-723. – https://ve42.co/Shannon38\n\nBoole, G. (1847). The mathematical analysis of logic. Philosophical Library. – https://ve42.co/Boole1847\n\nThe world’s first general purpose computer turns 75 – https://ve42.co/ENIAC2\n\nDylla, H. F., & Corneliussen, S. T. (2005). John Ambrose Fleming and the beginning of electronics. Journal of Vacuum Science & Technology A: Vacuum, Surfaces, and Films, 23(4), 1244-1251. – https://ve42.co/Dylla2005\n\nStibitz, G. R. (1980). Early computers. In A History of Computing in the Twentieth Century (pp. 479-483). Academic Press.\n\nENIAC’s Hydrogen Bomb Calculations – https://ve42.co/ENIAC3\n\n\n▀▀▀\nSpecial thanks to our Patreon supporters:\nEmil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Benedikt Heinen, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Cy ‘kkm’ K’Nelson, Sam Lutfi.\n\n▀▀▀\nWritten by Petr Lebedev, Derek Muller and Kovi Rose\nEdited by Trenton Oliver\nAnimated by Mike Radjabov, Ivy Tello and Fabio Albertelli\nFilmed by Derek Muller & Raquel Nuno\nAdditional video/photos supplied by Getty Images & Pond5\nMusic from Epidemic Sound \nProduced by Derek Muller, Petr Lebedev, & Emily Zhang\nThumbnail by Ignat Berbeci", + thumbnail: Thumbnail( + url: "https://i3.ytimg.com/vi/FU_YFpfDqqA/hqdefault.jpg", + width: 480, + height: 360, + ), + publish_date: "2023-05-13T14:06:52Z", + update_date: "2023-09-21T10:14:38Z", + view_count: 4180622, + like_count: 178251, + ), + ], + create_date: "2010-07-21T07:18:02Z", +) diff --git a/testfiles/channel_rss/trimmed_channel_id.xml b/testfiles/channel_rss/trimmed_channel_id.xml new file mode 100644 index 0000000..dee9159 --- /dev/null +++ b/testfiles/channel_rss/trimmed_channel_id.xml @@ -0,0 +1,1179 @@ + + + + yt:channel:HnyfMqiRRG1u-2MsSQLbXA + HnyfMqiRRG1u-2MsSQLbXA + Veritasium + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2010-07-21T07:18:02+00:00 + + yt:video:czjisEGe5Cw + czjisEGe5Cw + UCHnyfMqiRRG1u-2MsSQLbXA + The Problem With Science Communication + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-10-31T23:00:20+00:00 + 2023-11-01T15:51:15+00:00 + + The Problem With Science Communication + + + To kickstart your business or online store with a free trial of Shopify, go to http://shopify.com/veritasium + +If you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV + +▀▀▀ +Huge thanks to Carlo Rovelli: https://t.co/FF5ohRQB8R +And Geraint Lewis: https://www.geraintflewis.com/ + +▀▀▀ +Images and references: +Holographic wormhole, via Nature - https://ve42.co/Holographic + +‘Did physicists create a wormhole in a quantum computer?’ by Davide Castelvecchi, via Nature - https://ve42.co/NatureWormhole + +Traversable Holographic Wormhole by Sarag Wells, via Vice - https://ve42.co/ViceWormhole + +‘Quantum teleportation opens a ‘wormhole in space–time’’ by Martijn Boerkamp, via Physics World - https://ve42.co/PWTeleportation + +‘Physicists Create a Holographic Wormhole’ by Natalie Wolchover, via Quanta - https://ve42.co/QuantaWormhole + +‘the Smallest, Crummiest Wormhole You Can Imagine’, via The New York Times - https://ve42.co/NYTWormhole + +‘How Physicists Created a Holographic, via Quanta - https://ve42.co/QuantaYTWormhole + +Quantum computer imagery, via Quantumai - https://ve42.co/Quantumai + +‘Nuclear fusion breakthrough’, via Sky News - https://ve42.co/SkyWormhole + +‘NASA scientist explains why images from new telescope astounded him’, via CNN on YouTube - https://ve42.co/CNNWormhole + +‘Neutrino Faster Than Speed of Light’, via Associated Press - https://ve42.co/APWormhole + +‘Michio Kaku on Quantum Computing’, via PowerfulJRE - https://ve42.co/JRE + +AskScience AMA Series, via r/askscience on Reddit - https://ve42.co/ClimateAMA + +‘Professor Andrei Linde celebrates physics breakthrough’, via Stanford - https://ve42.co/AndreiLinde + +‘Gravitational waves turn to dust’ by Ian Sample, via The Guardian - https://ve42.co/Waves2Dust + +‘The First Room-Temperature Ambient-Pressure Superconductor’, Sukbae Lee, Ji-Hoon Kim, Young-Wan Kwon, 2023, via arXiv - https://ve42.co/Superconductor + +‘What's the buzz about LK-99?’, via Global News - https://ve42.co/GlobalLK99 + +Meissner effect, via @andrewmccalip on Twitter - https://ve42.co/Meissner + +‘Will LK99 Superconductor CHANGE THE WORLD?’, via Breaking Points on YouTube - https://ve42.co/BreakingPoints + +‘Superconductor Breakthroughs’, via WSJ - https://ve42.co/WSJSuperconductor + +LK99 claims forum post, via Spacebattles - https://ve42.co/KL99Forum + +Copper graph, via Handbook of Electromagnetic Materials - https://ve42.co/CopperGraph + +LK-99 Superconductor ​showing levitation - https://ve42.co/Levitation + +‘Unreliable social science research’ by Cathleen O’Grady, via Science - https://ve42.co/SocialScience + +Tiny Neutrinos article by Dennis Overbye, via The NYT - https://ve42.co/NYTNeutrinos + +‘The Crisis in Cosmology’ by Astrophysics in Process, via Medium - https://ve42.co/CosmoCrisis + +‘Some scientists speak of a “crisis in cosmology.”’ by Adam Frank, via Big Think - https://ve42.co/BigThinkCosmo + +‘Why is there a 'crisis' in cosmology?’ by Paul Sutter, via Space - https://ve42.co/SpaceCosmo + +‘Breakthrough in nuclear fusion, via PBS NewsHour on YouTube - https://ve42.co/PBSBreakthrough + +DOE National Lab press conference, via U.S. Department of Energy on YouTube - https://ve42.co/DOEPress + +‘Nuclear fusion breakthrough’ by Catherine Clifford, via CNBC - https://ve42.co/CNBCFusion + +‘US officials announce nuclear fusion breakthrough’, via CNN - https://ve42.co/CNNFusion + +Nuclear fusion article, via CNN - https://ve42.co/CNNNuclear + +Climate catastrophe article by Robin McKie, via The Guardian - https://ve42.co/GuardianClimate + +Nuclear fusion article by Nicola Davis, via The Guardian - https://ve42.co/GuardianFusion + +Fusion breakthrough article, via Imperial College London - https://ve42.co/ImperialFusion + +Wednesday briefing by Archive Bland, via The Guardian - https://ve42.co/GuardianBriefing + +Sky Sport News Bulletin, via Sky Sport NZ on YouTube - https://ve42.co/SkyBulletin + +Alien Probe Ignored Us article by Ed Maz - https://ve42.co/AlienProbe + +Attempts to scan the mysterious Oumuamua 'comet' article by Shivali Best, via MailOnline - https://ve42.co/Oumuamua + +‘Have Aliens Found Us?’ by Isaac Chotiner - https://ve42.co/NYTAliens + +▀▀▀ +Special thanks to our Patreon supporters: +Adam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Chris Harper, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, Max Maladino, Meekay, meg noah, Michael Krugman, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Written by Derek Muller +Edited by Peter Nelson +Filmed by Derek Muller +Produced by Derek Muller + +Additional video/photos supplied by Getty Images and Storyblocks +Music from Epidemic Sound +Thumbnail by Geoff Barrett + + + + + + + + yt:video:lFlu60qs7_4 + lFlu60qs7_4 + UCHnyfMqiRRG1u-2MsSQLbXA + How One Line in the Oldest Math Text Hinted at Hidden Universes + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-10-21T16:31:35+00:00 + 2023-10-27T23:43:35+00:00 + + How One Line in the Oldest Math Text Hinted at Hidden Universes + + + Discover strange new universes that turn up at the core of Einstein’s General Relativity. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription. + +If you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV + +▀▀▀ +A massive thank you to Prof. Alex Kontorovich for all his help with this video. + +A huge thank you to Prof. Geraint Lewis and Dr. Ashmeet Singh for helping us understand the applications of Non-Euclidean geometry in astronomy/cosmology. + +Lastly, a big thank you to Dr. Henry Segerman and Dr. Rémi Coulon for helping us visualize what it’s like to be inside hyperbolic space and helping us understand hyperbolic geometry. + +▀▀▀ +Images: +Euclid via Science Museum Group - https://ve42.co/Euclid + +Geodesy survey via ams - https://ve42.co/Geodesy + +John Wheeler via NAS Online - https://ve42.co/Wheeler + +▀▀▀ +References: +Dunham, W. (1991). Journey through Genius: Great Theorems of Mathematics. John Wiley & Sons. + +Bonola, R. (1955). Non-Euclidean geometry: A critical and historical study of its development. Courier Corporation. + +Library of Congress. (n.d.). The Library of Congress. - https://ve42.co/LibofCongress + +Euclid’s Elements, Wikipedia - https://ve42.co/Elements + +The History of Non-Euclidean Geometry, Extra History via YouTube - https://ve42.co/ExtraHistory + +We (could) live on a 4D Pringle - Physics for the Birds via YouTube - https://ve42.co/4DPringle + +Parallel Postulate, Wikipedia - https://ve42.co/Parallel + +Prékopa, A., & Molnár, E. (Eds.). (2006). Non-euclidean geometries: János Bolyai memorial volume (Vol. 581). Springer Science & Business Media. + +St Andrews, University of. (n.d.). Bolyai. MacTutor History of Mathematics. - https://ve42.co/Bolyai + +Bolyai, J. (1896). The Science Absolute of Space.. (Vol. 3). The Neomon. + +Gauss, Wikipedia - https://ve42.co/Gauss + +Singh, U. (2022). Gauss-Bolyai-Lobachevsky: The dawn of non-euclidean geometry. Medium. - https://ve42.co/CPNonEuclidean + +Landvermessung, D. Z. (1929). Abhandlungen ueber Gauss' wissenschaftliche Taetigkeit auf den Gebieten der Geodaesie, Physik und Astronomie Bd. 11, Abt. - https://ve42.co/Landvermessung + +Nikolai Lobachevsky, Wikipedia - https://ve42.co/Lobachevsky + +Lobachevskiĭ, N. I. (1891). Geometrical researches on the theory of parallels. University of Texas. + +A Problem with the Parallel Postulate, Numberphile via YouTube - https://ve42.co/NumberphileParallel + +Riemann, B. (2016). On the hypotheses which lie at the bases of geometry. Birkhäuser. - https://ve42.co/Riemann + +Einstein, A. (1905). On the electrodynamics of moving bodies. Annalen der physik, 17(10), 891-921. - https://ve42.co/Einstein1905 + +ESA/Hubble. (n.d.). Hubblecast 90: The final frontier of the Frontier Fields. ESA/Hubble. - https://ve42.co/Einstein1905 + +Agazie, G., et al. (2023). The NANOGrav 15 yr data set: Constraints on supermassive black hole binaries from the gravitational-wave background. - https://ve42.co/NANOGrav + +Secrets of the Cosmic Microwave Background, PBS Spacetime via YouTube - https://ve42.co/PBSCMB + +Wood, C. (2020). How Ancient Light Reveals the Universe's Contents. Quanta Magazine. - https://ve42.co/AncientLight + +Collaboration (2014). Planck 2013 results. XVI. Cosmological parameters. A&A, 571, A16. - https://ve42.co/Planck2013 + +WMAP Science Team, NASA. (2014). Matter in the Universe. WMAP, NASA. - https://ve42.co/WMAP2014 + +What Is The Shape of Space, minutephysics via YouTube - https://ve42.co/SpaceShape + +Shape of the universe, Wikipedia - https://ve42.co/UniverseShape + +Crocheting Hyperbolic Planes: Daina Taimina by Ted, via YouTube - https://ve42.co/Hyperbolic + +Hyperbolic Crochet model - https://ve42.co/Crochet + +▀▀▀ +Special thanks to our Patreon supporters: +Adam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, Max Maladino, Meekay, meg noah, Michael Krugman, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Directed by Casper Mebius +Written by Casper Mebius, Petr Lebedev, Emily Zhang, Derek Muller, and Alex Kontorovich +Edited by Jack Saxon +Animated by Fabio Albertelli, Ivy Tello, and Mike Radjabov +Illustrations by Jakub Misiek and Celia Bode +Filmed by Derek Muller +Produced by Casper Mebius, Derek Muller, and Han Evans + +Additional video/photos supplied by Getty Images, Pond5, and by courtesy of: NASA, NASA's Goddard Space Flight Center, NASA Goddard Flight Lab/ CI Lab, NASA’s WMAP science teams, ESO, and ESA/Hubble. +Music from Epidemic Sound +Thumbnail by Ren Hurley + + + + + + + + yt:video:QQkmJI63ykI + QQkmJI63ykI + UCHnyfMqiRRG1u-2MsSQLbXA + The Man Who Killed Millions and Saved Billions (Clean Version) + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-10-07T17:45:44+00:00 + 2023-10-22T23:24:43+00:00 + + The Man Who Killed Millions and Saved Billions (Clean Version) + + + YES, THIS IS A REUPLOAD. The original was age-restricted and demonetized. To support the channel directly, you can buy Snatoms: https://ve42.co/snatoms1 https://ve42.co/amzn or support on Patreon: https://ve42.co/p + +Fritz Haber is the scientist who arguably most transformed the world. +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +A huge thanks to Dan Charles for writing a fantastic biography of Fritz Haber, for taking the time to talk to us about it, and providing valuable feedback. This video would not be what it is without his contributions. http://site.danielcharles.us https://ve42.co/Charles + +Thanks to Tom de Prinse from Explosions and Fire for helping us with the chemistry of explosives. If you like explosions and/or fire, you will love his channel. https://www.youtube.com/c/ExplosionsFire2 + +Thanks to Michael Kuiper of CSIRO for the animation of the composition of air - https://www.youtube.com/watch?v=j9JvX58aRfg + +Special thanks to Sonya Pemberton, Karl Kruszelnicki, Mary Dobbie, Olivia McRae, and the patreon supporters for giving us feedback on the earlier version of this video. + +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +References: + +The primary reference used is Vaclav Smil’s excellent book, Enriching The Earth – +Smil, V. (2004). Enriching the earth: Fritz Haber, Carl Bosch, and the transformation of world food production. MIT press. – https://ve42.co/Smil + +Mastermind: The Rise and Fall of Fritz Haber, the Nobel Laureate Who Launched the Age of Chemical Warfare, by Dan Charles – https://ve42.co/Charles + +Stoltzenberg, D. (2004). Fritz Haber: Chemist, Nobel Laureate, German, Jew. Chemical Heritage Foundation. – https://ve42.co/Stoltzenberg + +Postgate, J. R. (1982). The fundamentals of nitrogen fixation. CUP Archive. – https://ve42.co/postgate + +Miles, A. G. (1992). Biological nitrogen fixation. – https://ve42.co/Miles + +Friedrich, B., & Hoffmann, D. (2017). Clara Immerwahr: A life in the shadow of Fritz Haber. In One Hundred Years of Chemical Warfare: Research, Deployment, Consequences(pp. 45-67). Springer, Cham. – https://ve42.co/Friedrich2017 + +Da Silva, G. (2020). What is ammonium nitrate, the chemical that exploded in Beirut. Sci Am, 5. – https://ve42.co/Silva + +Rodrigues, P., & Micael, J. (2021). The importance of guano birds to the Inca Empire and the first conservation measures implemented by humans. – https://ve42.co/rodrigues + +Allison, F. E. (1957). Nitrogen and soil fertility. Soil, the, 85-94. – https://ve42.co/Allison + +Crookes, W. (1898). Address of the President before the British Association for the Advancement of Science, Bristol, 1898. Science, 8(200), 561-575. – https://ve42.co/Crookes + +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Special thanks to Patreon supporters: RayJ Johnson, Brian Busbee, Jerome Barakos M.D., Amadeo Bee, Julian Lee, Inconcision, TTST, Balkrishna Heroor, Chris LaClair, Avi Yashchin, John H. Austin, Jr., OnlineBookClub.org, Matthew Gonzalez, Eric Sexton, john kiehl, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Dumky, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Timothy O’Brien, Mac Malkawi, Michael Schneider, jim buckmaster, Juan Benet, Ruslan Khroma, Robert Blum, Richard Sundvall, Lee Redden, Vincent, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Cy 'kkm' K'Nelson, Sam Lutfi, Ron Neal + +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Written by Petr Lebedev, Derek Muller, Felicity Nelson and Kovi Rose +Edited by Trenton Oliver +Animation by Jakub Mistek, Fabio Albertelli, Ivy Tello, Alex Drakoulis, Nils Ramses Kullack, and Charlie Davies +SFX by Shaun Clifford +Filmed by Petr Lebedev, Derek Muller and Raquel Nuno +Photo of nitrogen deficiency in rice from https://ve42.co/rice +Additional video/photos supplied by Getty Images +Music from Epidemic Sound: https://ve42.co/music + + + + + + + + yt:video:Is2Lip1cJUc + Is2Lip1cJUc + UCHnyfMqiRRG1u-2MsSQLbXA + Extreme Breath-Holding + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-09-30T16:39:15+00:00 + 2023-10-23T16:33:01+00:00 + + Extreme Breath-Holding + + + This is how people can hold their breath for tens of minutes. Check out our sponsor: https://betterhelp.com/veritasium to get matched with a professional therapist who will listen and help. + +▀▀▀ +A huge thanks to Brandon Birchak for all his help with this video. To learn how to hold your breath for 5 minutes, or see one of Brandon’s performances, visit https://eliteperformancedesign.com and https://Sixfootcreations.com + +A special thanks to Juan Valdivia for his expert advice on the science of extreme breath holding. + +▀▀▀ +References: +U.S. Department of Health and Human Services. (n.d.). How your body controls breathing. National Heart Lung and Blood Institute. - https://ve42.co/BodyBreathing + +Anatomy, autonomic nervous system - statpearls - NCBI bookshelf. (n.d.-a). - https://ve42.co/ANS + +Biochemistry, oxidative phosphorylation - statpearls - NCBI bookshelf. (n.d.-c). - https://ve42.co/ncbiATP + +Acidosis. Acidosis - an overview | ScienceDirect Topics. (n.d.). - https://ve42.co/Acidosis + +Evaluation of respiratory alkalosis. Evaluation of respiratory alkalosis - Differential diagnosis of symptoms | BMJ Best Practice US. (n.d.). - https://ve42.co/Alkalosis + +Wilmshurst, P. (1998, October 10). Diving and Oxygen. BMJ (Clinical research ed.). - https://ve42.co/DivingO + +López-Barneo, J., Ortega-Sáenz, P., Pardal, R., Pascual, A., & Piruat, J. I. (2008). Carotid body oxygen sensing. European Respiratory Journal, 32(5), 1386-1398. - https://ve42.co/Barneo2008 + +Jeff, & Huffy. (2022, November 17). The Bolt score test: Measure your breathing volume capacity. Marathon Handbook. - https://ve42.co/BOLT + +Lindholm, P., & Lundgren, C. E. (2009). The physiology and pathophysiology of human breath-hold diving. Journal of Applied Physiology, 106(1), 284-292. - https://ve42.co/Lindholm2009 + +Physiology, lung capacity - statpearls - NCBI bookshelf. (n.d.-c). - https://ve42.co/LungCapacity + +Panneton, W. M., & Gan, Q. (2020). The mammalian diving response: inroads to its neural control. Frontiers in Neuroscience, 14, 524. - https://ve42.co/Panneton2020 + +Baković, D., Eterović, D., Saratlija‐Novaković, X., Palada, I., Valic, Z., Bilopavlović, N., & Dujić, X. (2005). Effect of human splenic contraction on variation in circulating blood cell counts. Clinical and experimental pharmacology and physiology, 32(11), 944-951. https://ve42.co/Bakovic2005 + +Gooden, B. (1971). The diving response in man, rat and echidna (Doctoral dissertation). - https://ve42.co/Gooden1971 + +Longest duration breath hold - freediving static apnea (male). Guinness World Records. (n.d.). - https://ve42.co/DivingRecord + +What’s the longest a human can hold their breath underwater? BBC Science Focus Magazine. (n.d.). - https://ve42.co/Southwell2023 + +▀▀▀ +Special thanks to our Patreon supporters: +Adam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, Max Paladino, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Directed by Derek Muller +Written by Felicity Nelson and Derek Muller +Edited by Trenton Oliver +Animated by Ivy Tello +Filmed by Derek Muller +Produced by Derek Muller +Additional video/photos supplied by Getty Images and Pond5 +Music from Epidemic Sound + + + + + + + + yt:video:ILgSesWMUEI + ILgSesWMUEI + UCHnyfMqiRRG1u-2MsSQLbXA + All The Times We Nearly Blew Up The World + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-09-11T17:41:27+00:00 + 2023-10-06T12:35:16+00:00 + + All The Times We Nearly Blew Up The World + + + This is a video about some of the many times we have nearly blown up the world. Head over to +https://hensonshaving.com/veritasium and enter code 'Veritasium' for 100 free blades with the purchase of a razor. Make sure to add both the razor and the blades to your cart for the code to take effect. + +▀▀▀ +References: +List of Broken Arrows -- https://ve42.co/AtomicArchive https://ve42.co/BrokenArrowsReport +Declassified Goldsboro Report -- https://ve42.co/Goldsboro +Operation ChromeDome -- https://ve42.co/OperationChromeDome +CIA website -- https://ve42.co/CIA + +Cataclysmic cargo: The hunt for four missing nuclear bombs after a B-52 crash -- https://ve42.co/WoPo +THE LAST FLIGHT OF HOBO 28 -- https://ve42.co/lastflight +The Voice of Larry Messinger is from this documentary -- https://ve42.co/Messinger +Even Without Detonation, 4 Hydrogen Bombs From ’66 Scar Spanish Village -- https://ve42.co/NYTPalomares +Decades Later, Sickness Among Airmen After a Hydrogen Bomb Accident -- https://ve42.co/NYTPalomares2 +Picture of ReVelle -- https://ve42.co/JackReVelle1 +Great NPR where the audio of ReVelle is from -- https://ve42.co/JackReVelle2 +CIA Website -- https://ve42.co/CIA + + +▀▀▀ +Special thanks to our Patreon supporters: +Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Directed by Petr Lebedev +Written by Petr Lebedev and Derek Muller +Edited by Peter Nelson +Animated by Fabio Albertelli, Jakub Misiek, Ivy Tello and Mike Radjabov +Filmed by Derek Muller +Produced by Petr Lebedev and Derek Muller +Additional video/photos supplied by Getty Images and Pond5 +Music from Epidemic Sound + + + + + + + + yt:video:8DBhTXM_Br4 + 8DBhTXM_Br4 + UCHnyfMqiRRG1u-2MsSQLbXA + How The Most Useless Branch of Math Could Save Your Life + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-09-03T13:54:14+00:00 + 2023-09-20T11:42:17+00:00 + + How The Most Useless Branch of Math Could Save Your Life + + + There is an entire branch of math simply devoted to knots – and it has changed the world. We’ll rope you in. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription. + +▀▀▀ +Huge thanks to Prof. Colin Adams for his excellent help guiding us through the world of knots. +Many thanks to Prof. Doug Smith, Dorian Raymer, Prof. David Leigh, and Prof. Dorothy Buck for helping us understand applications of knot theory. +Many thanks to Prof. Dan Silver & Prof. Jim Hoste for speaking with us about the history and tabulation of knots. + +If you want to learn more about knots and play with them yourself, check out: +The amazing KnotPlot tool — https://knotplot.com/. Thanks to Rob Scharein for providing technical help as well! +A table of knots and all their invariants — https://knotinfo.math.indiana.edu/ +The Knot Atlas for general info on knots — http://katlas.org/wiki/Main_Page + +▀▀▀ +Knot Theory Video References – https://ve42.co/KnotTheoryRefs + +Images & Video: +Alexander Cutting the Gordian Knot by Donato Creti via Fine Art America - https://ve42.co/GordianCut +Indus Valley tablet via Quora - https://ve42.co/IndusValley +Pages from the Book of Kells via National Trust of Scotland - https://ve42.co/BookOfKells +Medieval Celtic designs from @thebookofkellsofficial via Instagram - https://ve42.co/KellsInsta +Chinese knotwork by YWang9174 via Wikimedia Commons - https://ve42.co/Panchang +Quipu cords by Pi3.124 via Wikimedia Commons - https://ve42.co/Quipu +Borromeo heraldry via Terre Borromeo - https://ve42.co/Borromeo +Birman/Jones letter via Celebratio Mathematica - https://ve42.co/JonesBirman +Molecular trefoil knot by M stone via Wikimedia Commons - https://ve42.co/TrefoilMolecule +X-ray structure of trefoil knot by Ll0103 via Wikimedia Commons - https://ve42.co/XrayTrefoil +Bacteria animation from Your Body's Molecular Machines by Drew Berry via the Walter and Eliza Hall Institute of Medical Research - http://wehi.tv +Topoisomerase and knots from Orlandini et al. Synergy of topoisomerase. PNAS, vol. 116, no. 17, 2019, pp. 8149–8154. – https://ve42.co/Orlandini2019 +KnotProt 2.0: A database of proteins with knots and slipknots - https://ve42.co/Knotprot + +▀▀▀ +Special thanks to our Patreon supporters: +Anton Ragin, Balkrishna Heroor, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Directed by Emily Zhang +Written by Emily Zhang and Derek Muller +Edited by Trenton Oliver +Animated by Fabio Albertelli, Ivy Tello, Jakub Misiek, and Mike Radjabov +Filmed by Derek Muller, Raquel Nuno, and Emily Zhang +Produced by Emily Zhang and Derek Muller + +Thumbnail by Ignat Berbeci and Mike Radjabov +Additional video/photos supplied by Getty Images and Pond5 +Music from Epidemic Sound + + + + + + + + yt:video:ZjBgEkbnX2I + ZjBgEkbnX2I + UCHnyfMqiRRG1u-2MsSQLbXA + Should Airships Make a Comeback? + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-08-31T14:59:55+00:00 + 2023-09-21T04:43:36+00:00 + + Should Airships Make a Comeback? + + + Will we see a new generation of airships roaming our skies? Head to https://www.odoo.com/r/veritasium to start building your own website for free. + +If you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV + +▀▀▀ +Thank you to Eli Dourado for letting us explore the argument he describes in his article: https://ve42.co/Dourado + +A huge thank you to Dan Grossman and Nick Allman for their time, help, and expertise. + +Also a massive thank you to those who helped us understand the world of modern airships, and provided valuable feedback - Prof. Barry Prentice, Gennadiy Verba, Prof. +Christoph Pflaum, Heather Roszczyk, Dr. Casey Handmer, Richard Van Trueren, & Thibault Proux. + +We are also grateful for the collaboration of the companies who are working hard to make this comeback happen - Atlas LTA, Buoyant Aircraft Systems International, Hybrid Air Vehicles, LTA Research, & Flying Whales. + + +▀▀▀ +References: + +How Airships Could Overcome a Century of Failure, Bloomberg Originals via YouTube - https://ve42.co/AirshipsCoF + +Why the Airship May Be the Future of Air Travel, Undecided with Matt Ferrell via YouTube - https://ve42.co/FutureAirships + +Airship, Wikipedia - https://ve42.co/AirshipWiki + +Handmer, C. (2020). A quick note on airships. Casey Handmer’s Blog - https://ve42.co/Handmer2020 + +UNCTAD (2020). Review of Maritime Transport 2020 - https://ve42.co/RMT2020 + +National Transportation Research Center (2023). Freight Analysis Framework Version 5 (FAF5) - https://ve42.co/FAF5 + +Hybrid Air Vehicles (2023). HAV - https://ve42.co/HAV + +LTA Research (2023). Lighter Than Air (LTA) Research - https://ve42.co/LTAResearch + +OceanSkyCruises (2023). North Pole Expedition - OceanSkyCruises - https://ve42.co/NPExpedition + +Flying Whales (2023). Flying Whales - https://ve42.co/FlyingWhales + +Buoyant Aircraft Systems International (2023). BASI - https://ve42.co/BASI + +Atlas LTA (2023). Atlas Electric Airships | Atlas LTA Airships - https://ve42.co/AtlasLTA + +Prentice, B. (2021). Hydrogen gas-fuelled airships could spur development in remote communities. The Conversation - https://ve42.co/HydrogenAirships + +Grossman, D. (2009). The Hindenburg Disaster. Airships - https://ve42.co/Hindenburg1 + +Hindenburg Disaster, Wikipedia - https://ve42.co/HindenburgWiki + +What happened to the Hindenburg?, Jared Owen via Youtube - https://ve42.co/Owen2019 + +National Museum of the U.S. Navy. USS Akron (ZRS-4) - https://ve42.co/USSAkron + +USS Akron, Wikipedia - https://ve42.co/USSAkronWiki + + +▀▀▀ +Special thanks to our Patreon supporters: +Adam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Benedikt Heinen, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, Jesse Brandsoy, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Mario Bottion, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Written by Casper Mebius & Derek Muller +Directed by Casper Mebius +Edited by Jack Saxon +Filmed by Derek Muller, Jamie MacLeod, Han Evans, & Raquel Nuno +Animation by Mike Radjabov & Fabio Albertelli +Additional video/photos supplied by Getty Images, Pond5, & Envato Elements +Music from Epidemic Sound & Pond5 +Produced by Casper Mebius, Derek Muller, & Han Evans + + +More footage & photos from: +Thermite Rail Welding video by dulevoz via YouTube - https://www.youtube.com/watch?v=rNjosF789X4 + +O’Rourke, T. (2016). Chronicle Covers: When the Hindenburg burst into flames. San Francisco Chronicle - https://ve42.co/Hindenburg2 + +Wind turbine blade transport video by DOLL Fahrzeugbau via YouTube - https://www.youtube.com/watch?v=5aPXuap0LZw + +Wind turbine blade transport through mountains video by CGTN via Youtube - https://www.youtube.com/watch?v=9dtUrY8_1CM + +Former Airship Hangar by Stefan Kühn - https://ve42.co/Aerium + + + + + + + + yt:video:FkKPsLxgpuY + FkKPsLxgpuY + UCHnyfMqiRRG1u-2MsSQLbXA + I Took an IQ Test to Find Out What it Actually Measures + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-08-03T16:49:08+00:00 + 2023-09-21T13:05:23+00:00 + + I Took an IQ Test to Find Out What it Actually Measures + + + IQ is supposed to measure intelligence, but does it? Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription. + +If you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV + +▀▀▀ +A huge thank you to Emeritus Professor Cecil R. Reynolds and Dr. Stuart J. Ritchie for their expertise and time. + +Also a massive thank you to Prof. Steven Piantadosi and Prof. Alan S. Kaufman for helping us understand this complicated topic. As well as to Jay Zagrosky from Boston University's Questrom School of Business for providing data from his study. + +▀▀▀ +References: +Kaufman, A. S. (2009). IQ testing 101. Springer Publishing Company. + +Reynolds, C. R., & Livingston, R. A. (2021). Mastering modern psychological testing. Springer International Publishing. + +Ritchie, S. (2015). Intelligence: All that matters. John Murray. + +Spearman, C. (1961). " General Intelligence" Objectively Determined and Measured. - https://ve42.co/Spearman1904 + +Binet, A., & Simon, T. (1907). Le développement de l'intelligence chez les enfants. L'Année psychologique, 14(1), 1-94.. - https://ve42.co/Binet1907 + +Intelligence Quotient, Wikipedia - https://ve42.co/IQWiki + +Radiolab Presents: G. - https://ve42.co/RadioLabG + +McDaniel, M. A. (2005). Big-brained people are smarter: A meta-analysis of the relationship between in vivo brain volume and intelligence. Intelligence, 33(4), 337-346. - https://ve42.co/McDaniel2005 + +Deary, I. J., Strand, S., Smith, P., & Fernandes, C. (2007). Intelligence and educational achievement. Intelligence, 35(1), 13-21. - https://ve42.co/Deary2007 + +Lozano-Blasco, R., Quílez-Robres, A., Usán, P., Salavera, C., & Casanovas-López, R. (2022). Types of Intelligence and Academic Performance: A Systematic Review and Meta-Analysis. Journal of Intelligence, 10(4), 123. - https://ve42.co/Blasco2022 + +Kuncel, N. R., & Hezlett, S. A. (2010). Fact and fiction in cognitive ability testing for admissions and hiring decisions. Current Directions in Psychological Science, 19(6), 339-345. - https://ve42.co/Kuncel2010 + +Laurence, J. H., & Ramsberger, P. F. (1991). Low-aptitude men in the military: Who profits, who pays?. Praeger Publishers. - https://ve42.co/Laurence1991 + +Gregory, H. (2015). McNamara's Folly: The Use of Low-IQ Troops in the Vietnam War; Plus the Induction of Unfit Men, Criminals, and Misfits. Infinity Publishing. + +Gottfredson, L. S., & Deary, I. J. (2004). Intelligence predicts health and longevity, but why?. Current Directions in Psychological Science, 13(1), 1-4. - https://ve42.co/Gottfredson2004 + +Sanchez-Izquierdo, M., Fernandez-Ballesteros, R., Valeriano-Lorenzo, E. L., & Botella, J. (2023). Intelligence and life expectancy in late adulthood: A meta-analysis. Intelligence, 98, 101738. - https://ve42.co/Izquierdo2023 + +Zagorsky, J. L. (2007). Do you have to be smart to be rich? The impact of IQ on wealth, income and financial distress. Intelligence, 35(5), 489-501. - https://ve42.co/Zagorsky2007 + +Strenze, T. (2007). Intelligence and socioeconomic success: A meta-analytic review of longitudinal research. Intelligence, 35(5), 401-426. - https://ve42.co/Strenze2007 + +Deary, I. J., Pattie, A., & Starr, J. M. (2013). The stability of intelligence from age 11 to age 90 years: the Lothian birth cohort of 1921. Psychological science, 24(12), 2361-2368. - https://ve42.co/Deary2013 + +Flynn, J. R. (1987). Massive IQ gains in 14 nations: What IQ tests really measure. Psychological bulletin, 101(2), 171. - https://ve42.co/Flynn1987 + +Why our IQ levels are higher than our grandparents' | James Flynn, TED via YouTube - https://www.youtube.com/watch?v=9vpqilhW9uI + +Duckworth, A. L., Quinn, P. D., Lynam, D. R., Loeber, R., & Stouthamer-Loeber, M. (2011). Role of test motivation in intelligence testing. Proceedings of the National Academy of Sciences, 108(19), 7716-7720. - https://ve42.co/Duckworth2011 + +Kulik, J. A., Bangert-Drowns, R. L., & Kulik, C. L. C. (1984). Effectiveness of coaching for aptitude tests. Psychological Bulletin, 95(2), 179. - https://ve42.co/Kulik1984 + +▀▀▀ +Special thanks to our Patreon supporters: +Adam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Benedikt Heinen, Bernard McGee, Bill Linder, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, MaxPal, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Written by Derek Muller, Casper Mebius, & Petr Lebedev +Edited by Trenton Oliver +Filmed by Derek Muller, Han Evans, & Raquel Nuno +Animation by Fabio Albertelli & Ivy Tello +Additional video/photos supplied by Getty Images & Pond5 +Music from Epidemic Sound +Produced by Derek Muller, Casper Mebius, & Han Evans + + + + + + + + yt:video:Xzv84ZdtlE0 + Xzv84ZdtlE0 + UCHnyfMqiRRG1u-2MsSQLbXA + Why Oppenheimer Deserves His Own Movie + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-07-18T23:28:16+00:00 + 2023-08-11T23:59:47+00:00 + + Why Oppenheimer Deserves His Own Movie + + + J. Robert Oppenheimer forever changed the course of history. He may be the most important physicist to have ever lived. Part of this video is sponsored by Wren. Offset your carbon footprint on Wren: ​https://www.wren.co/start/veritasium1 For the first 100 people who sign up, I will personally pay for the first month of your subscription! + +If you want to learn more about Oppeheimer, I strongly recommend the book “American Prometheus” By Kai Bird and Martin Sherwin. It is a remarkable book, very much deserving of the Pulitzer prize it received. + +If you’re looking for a molecular modeling kit, try Snatoms – a kit I invented where the atoms snap together magnetically – https://ve42.co/SnatomsV + +▀▀▀ +A huge thank you to Dr. Martin Rohde and Dr. Antonia Denkova from the TU Delft for proofreading the script and providing valuable feedback. + +▀▀▀ +References: + +Bird, K., & Sherwin, M. J. (2021). American Prometheus: the triumph and tragedy of J. Robert Oppenheimer. Atlantic Books. + +Smith, A. K., & Weiner, C. (1980). Robert Oppenheimer: letters and recollections. Bulletin of the Atomic Scientists, 36(5), 19-27. - https://ve42.co/Smith1980 + +Combes, J. M., Duclos, P., & Seiler, R. (1981). The born-oppenheimer approximation. Rigorous atomic and molecular physics, 185-213. - https://ve42.co/Combes1981 + +Rhodes, R. (2012). The making of the atomic bomb. Simon and Schuster. + +Oppenheimer, J. R., & Volkoff, G. M. (1939). On massive neutron cores. Physical Review, 55(4), 374. - https://ve42.co/Oppenheimer1939b + +Oppenheimer, J. R. (1927). Bemerkung zur Zerstreuung der α-Teilchen. Zeitschrift für Physik, 43(5-6), 413-415. - https://ve42.co/Oppenheimer1927 + +Oppenheimer, J. R. (1927). Zur quantenmechanik der richtungsentartung. Zeitschrift für Physik, 43(1-2), 27-46. - https://ve42.co/Oppenheimer1927b + +Born, M., & Oppenheimer, R. (1927). Zur Quantentheorie der Molekeln Annalen der Physik, v. 84. - https://ve42.co/Born1927 + +Oppenheimer, J. R. (1928). Three notes on the quantum theory of aperiodic effects. Physical review, 31(1), 66. + +Oppenheimer, J. R. (1928). On the quantum theory of the capture of electrons. Physical review, 31(3), 349. + +Oppenheimer, J. R. (1931). Note on light quanta and the electromagnetic field. Physical Review, 38(4), 725. + +Furry, W. H., & Oppenheimer, J. R. (1934). On the theory of the electron and positive. Physical Review, 45(4), 245. - https://ve42.co/Oppenheimer1934 + +Oppenheimer, J. R. (1935). Note on charge and field fluctuations. Physical Review, 47(2), 144. - https://ve42.co/Oppenheimer1935 + +Oppenheimer, J. R., & Snyder, H. (1939). On continued gravitational contraction. Physical Review, 56(5), 455. - https://ve42.co/Oppenheimer1939 + +Oppenheimer, J. R., & Phillips, M. (1935). Note on the transmutation function for deuterons. Physical Review, 48(6), 500. - https://ve42.co/Oppenheimer1935b + +Malik, J. (1985). Yields of the Hiroshima and Nagasaki nuclear explosions (No. LA-8819). Los Alamos National Lab.(LANL), Los Alamos, NM (United States). - https://ve42.co/Malik1985 + +Ignition of the atmosphere with nuclear bombs -- https://ve42.co/Konopinski46 + +▀▀▀ +Special thanks to our Patreon supporters: +Adam Foreman, Amadeo Bee, Anton Ragin, Balkrishna Heroor, Benedikt Heinen, Bernard McGee, Bill Linder, Blake Byers, Burt Humburg, Dave Kircher, Diffbot, Evgeny Skvortsov, Gnare, John H. Austin, Jr., john kiehl, Josh Hibschman, Juan Benet, KeyWestr, Lee Redden, Marinus Kuivenhoven, Meekay, meg noah, Michael Krugman, Orlando Bassotto, Paul Peijzel, Richard Sundvall, Sam Lutfi, Stephen Wilcox, Tj Steyn, TTST, Ubiquity Ventures + +▀▀▀ +Written by Petr Lebedev & Derek Muller +Edited by Trenton Oliver & Katrina Jackson +Filmed by Derek Muller +Animation by Fabio Albertelli, Ivy Tello, & Mike Radjabov +Illustration by Jakub Misiek and Celia Bode +Additional video/photos supplied by Getty Images & Pond5 +Music from Epidemic Sound + + + + + + + + yt:video:lfkjm2YRG-Q + lfkjm2YRG-Q + UCHnyfMqiRRG1u-2MsSQLbXA + The Hidden Science of Fireworks + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-07-07T17:43:14+00:00 + 2023-09-21T07:49:06+00:00 + + The Hidden Science of Fireworks + + + This is the biggest, brightest, hottest video there is about the science of fireworks. This video is brought to you by Kiwico – go to https://kiwico.com/veritasium for your first month free! + +If you're looking for a molecular modeling kit, try Snatoms - a kit I invented where the atoms snap together magnetically: https://snatoms.com + +Check out Gene’s channel here -- @PotatoJet + +Massive thanks to Mike Tockstein from Pyrotechnic Innovations @PyroInnovations +and Will Scott from Las Vegas Display Fireworks Inc, for all your pyro knowledge and keeping us safe. + +▀▀▀ +Massive thanks to Gene Nagata from PotatoJet for filming this episode – check out his wonderful channel for more videos about cameras and FPV drones. + +Thanks to Brandon Williams for helping with the chemistry and sourcing of materials. + +Thanks to Matthew Tosh for the help with the chemistry conversation about fireworks. + +Thanks to Simon Werrett for the help with the history of fireworks. + +▀▀▀ +Werrett, S. (2010). Fireworks: pyrotechnic arts and sciences in European history. University of Chicago Press + +▀▀▀ +Special thanks to our Patreon supporters: +Emil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi. + +▀▀▀ +Written by Derek Muller +Edited by Trenton Oliver +Animated by Ivy Tello and Fabio Albertelli +Filmed by Derek Muller, Hunter Peterson, Gene Nagata, Raquel Nuno +Production by Hunter Peterson and Stephanie Castillo +Additional video/photos supplied by Mike Tockstein/Pyrotechnic Innovations +Music from Epidemic Sound & Jonny Hyman +Produced by Derek Muller, Petr Lebedev, Emily Zhang, & Casper Mebius + + + + + + + + yt:video:DxL2HoqLbyA + DxL2HoqLbyA + UCHnyfMqiRRG1u-2MsSQLbXA + The Most Misunderstood Concept in Physics + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-07-01T16:08:04+00:00 + 2023-07-08T09:01:44+00:00 + + The Most Misunderstood Concept in Physics + + + One of the most important, yet least understood, concepts in all of physics. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription. + +If you're looking for a molecular modeling kit, try Snatoms - a kit I invented where the atoms snap together magnetically: https://snatoms.com + +▀▀▀ +A huge thank you to those who helped us understand different aspects of this complicated topic - Dr. Ashmeet Singh, Supriya Krishnamurthy, Dr. Jos Thijssen, Dr. Bijoy Bera, Dr. Timon Idema, Álvaro Bermejillo Seco and Dr. Misha Titov. + +▀▀▀ +References: +Carnot, S. (1824). Reflections on the motive power of heat: and on machines fitted to develop that power. - https://ve42.co/Carnot1890 + +Harnessing The True Power Of Atoms | Order And Disorder Documentaries, Spark via YouTube - https://ve42.co/OrderDisorder + +A better description of entropy, Steve Mould via YouTube - https://ve42.co/Mould2016 + +Dugdale, J. S. (1996). Entropy and its physical meaning. CRC Press. - https://ve42.co/Dugdale1996 + +Schroeder, D. V. (1999). An introduction to thermal physics. - https://ve42.co/Schroeder2021 + +Fowler, M. Heat Engines: the Carnot Cycle, University of Virginia. - https://ve42.co/Fowler2023 + +Chandler, D.L. (2010). Explained: The Carnot Limit, MIT News - https://ve42.co/Chandler2010 + +Entropy, Wikipedia - https://ve42.co/EntropyWiki + +Clausius, R. (1867). The mechanical theory of heat. Van Voorst. - https://ve42.co/Clausius1867 + +What is entropy? TED-Ed via YouTube - https://ve42.co/Phillips2017 + +Thijssen, J. (2018) Lecture Notes Statistical Physics, TU Delft. + +Schneider, E. D., & Kay, J. J. (1994). Life as a manifestation of the second law of thermodynamics. Mathematical and computer modelling, 19(6-8), 25-48. - https://ve42.co/Schneider1994 + +Lineweaver, C. H., & Egan, C. A. (2008). Life, gravity and the second law of thermodynamics. Physics of Life Reviews, 5(4), 225-242. - https://ve42.co/Lineweaver2008 + +Michaelian, K. (2012). HESS Opinions" Biological catalysis of the hydrological cycle: life's thermodynamic function". Hydrology and Earth System Sciences, 16(8), 2629-2645. - https://ve42.co/Michaelian2012 + +England, J. L. (2013). Statistical physics of self-replication. The Journal of chemical physics, 139(12), 09B623_1. - https://ve42.co/England2013 + +England, J. L. (2015). Dissipative adaptation in driven self-assembly. Nature nanotechnology, 10(11), 919-923. - https://ve42.co/England2015 + +Wolchover, N. (2014). A New Physics Theory of Life, Quantamagazine - https://ve42.co/Wolchover2014 + +Lineweaver, C. H. (2013). The entropy of the universe and the maximum entropy production principle. In Beyond the Second Law: Entropy Production and Non-equilibrium Systems (pp. 415-427). Berlin, Heidelberg: Springer Berlin Heidelberg. - https://ve42.co/LineweaverEntropy + +Bekenstein, J.D. (1972). Black holes and the second law. Lett. Nuovo Cimento 4, 737–740. - https://ve42.co/Bekenstein1972 + +Carroll, S.M. (2022). The Biggest Ideas in the Universe: Space, Time, and Motion. Penguin Publishing Group. - https://ve42.co/Carroll2022 + +Black hole thermodynamics, Wikipedia - https://ve42.co/BlackHoleTD + +Cosmology and the arrow of time: Sean Carroll at TEDxCaltech, TEDx Talks via YouTube - https://ve42.co/CarrollTEDx + +Carroll, S. M. (2008). The cosmic origins of time’s arrow. Scientific American, 298(6), 48-57. - https://ve42.co/Carroll2008 + +The Passage of Time and the Meaning of Life | Sean Carroll (Talk + Q&A), Long Now Foundation via YouTube - https://ve42.co/CarrollLNF + +▀▀▀ +Special thanks to our Patreon supporters: +Emil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi. + +▀▀▀ +Written by Casper Mebius, Derek Muller & Petr Lebedev +Edited by Trenton Oliver & Jamie MacLeod +Animated by Mike Radjabov, Ivy Tello, Fabio Albertelli and Jakub Misiek +Filmed by Derek Muller, Albert Leung & Raquel Nuno +Molecular collisions video by CSIRO's Data61 via YouTube: Simulation of air +Additional video/photos supplied by Getty Images, Pond5 and by courtesy of NASA, NASA's Goddard Space Flight Center, NASA Goddard Flight Lab/ CI Lab, NASA/SDO and the AIA, EVE, HMI, and WMAP science teams. As well as the Advanced Visualization Laboratory at the National Center for Supercomputing Applications, B. Robertson, L. Hernquist +Music from Epidemic Sound & Jonny Hyman +Produced by Derek Muller, Petr Lebedev, Emily Zhang, & Casper Mebius + + + + + + + + yt:video:6bgNm9l_3qU + 6bgNm9l_3qU + UCHnyfMqiRRG1u-2MsSQLbXA + I Vacuum Venom from the World's Deadliest Spider + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-06-21T14:01:56+00:00 + 2023-09-28T16:06:27+00:00 + + I Vacuum Venom from the World's Deadliest Spider + + + Go to our sponsor https://betterhelp.com/veritasium to get matched with a professional therapist who will listen and help. + +▀▀▀ +Huge thanks to the Australian Reptile Park for having us over to film – special thanks to Jake Meney for showing us the spiders and Caitlin Vine for organizing the shoot. https://www.reptilepark.com.au + +Huge thanks to Dr Timothy Jackson with his help and answering our questions. + +Thanks to Seqirus Australia for providing B-roll footage of the antivenom production process. + + +▀▀▀ +References: + +Pineda, S. S., Sollod, B. L., Wilson, D., Darling, A., Sunagar, K., Undheim, E. A., ... & King, G. F. (2014). Diversification of a single ancestral gene into a successful toxin superfamily in highly venomous Australian funnel-web spiders. BMC genomics, 15(1), 1-16 - https://ve42.co/Pineda2014 + +Isbister, G. K., Gray, M. R., Balit, C. R., Raven, R. J., Stokes, B. J., Porges, K., ... & Fisher, M. M. (2005). Funnel-web spider bite: a systematic review of recorded clinical cases. Medical journal of Australia, 182(8), 407-411 - https://ve42.co/Isbister2005 + +Herzig, V., Sunagar, K., Wilson, D. T., Pineda, S. S., Israel, M. R., Dutertre, S., ... & Fry, B. G. (2020). Australian funnel-web spiders evolved human-lethal δ-hexatoxins for defense against vertebrate predators. Proceedings of the National Academy of Sciences, 117(40), 24920-24928 - https://ve42.co/Herzig2020 + +Nicholson, G. M., & Graudins, A. (2002). Spiders of medical importance in the Asia–Pacific: Atracotoxin, latrotoxin and related spider neurotoxins. Clinical and experimental pharmacology and physiology, 29(9), 785-794 - https://ve42.co/Nicholson2002 + +Fletcher, J. I., Chapman, B. E., Mackay, J. P., Howden, M. E., & King, G. F. (1997). The structure of versutoxin (δ-atracotoxin-Hv1) provides insights into the binding of site 3 neurotoxins to the voltage-gated sodium channel. Structure, 5(11), 1525-1535 - https://ve42.co/Fletcher1997 + +Australian Reptile Park. (2022). Snake and Spider First Aid - https://ve42.co/ARPFirstAid + +The Australian Museum. (20 ). Spider facts - https://ve42.co/SpiderFacts + + +▀▀▀ +Special thanks to our Patreon supporters: +Orlando Bassotto, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Benedikt Heinen, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, and Sam Lutfi + + +▀▀▀ +Written by Katie Barnshaw & Derek Muller +Edited by Trenton Oliver +Filmed by Petr Lebedev, Derek Muller and Jason Tran +Animation by Ivy Tello, Jakub Misiek and Fabio Albertelli +Neuron animation by Reciprocal Space – https://www.reciprocal.space +Additional video/photos supplied from Getty Images, Pond5 +B-roll supplied by Seqirus Australia +Music from Epidemic Sound +Produced by Derek Muller, Petr Lebedev, Emily Zhang & Katie Barnshaw + + + + + + + + yt:video:tRaq4aYPzCc + tRaq4aYPzCc + UCHnyfMqiRRG1u-2MsSQLbXA + Mathematicians Use Numbers Differently From The Rest of Us + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-06-06T13:43:15+00:00 + 2023-09-21T07:33:44+00:00 + + Mathematicians Use Numbers Differently From The Rest of Us + + + There's a strange number system, featured in the work of a dozen Fields Medalists, that helps solve problems that are intractable with real numbers. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription. + +If you're looking for a molecular modeling kit, try Snatoms - a kit I invented where the atoms snap together magnetically: https://snatoms.com + +▀▀▀ +References: + +Koblitz, N. (2012). p-adic Numbers, p-adic Analysis, and Zeta-Functions (Vol. 58). Springer Science & Business Media. + +Amazing intro to p-adic numbers here: https://youtu.be/3gyHKCDq1YA +Excellent series on p-adic numbers: https://youtu.be/VTtBDSWR1Ac +Great videos by James Tanton: @JamesTantonMath + +▀▀▀ +Special thanks to our Patreon supporters: +Emil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi. + +▀▀▀ +Written by Derek Muller and Alex Kontorovich +Edited by Trenton Oliver +Animated by Mike Radjabov, Ivy Tello, Fabio Albertelli and Jakub Misiek +Filmed by Derek Muller +Additional video/photos supplied by Getty Images & Pond5 +Music from Epidemic Sound & Jonny Hyman +Produced by Derek Muller, Petr Lebedev, & Emily Zhang + + + + + + + + yt:video:ZMQbHMgK2rw + ZMQbHMgK2rw + UCHnyfMqiRRG1u-2MsSQLbXA + The Fastest Maze-Solving Competition On Earth + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-05-24T17:39:57+00:00 + 2023-07-02T08:30:42+00:00 + + The Fastest Maze-Solving Competition On Earth + + + Welcome to Micromouse, the fastest maze-solving competition on Earth. Join Onshape’s community of over 3 million CAD users by creating a free account here: https://Onshape.pro/Veritasium. + +▀▀▀ +A huge thank you to Peter Harrison for all of his help introducing us to the world of Micromouse – check out https://ukmars.org & https://micromouseonline.com. +Thank you to David Otten, APEC, and the All-Japan Micromouse Competition for having us. +Thank you to Juing-Hei (https://www.youtube.com/@suhu9379) & Derek Hall (https://www.youtube.com/@MicroMouse) for usage of their micromouse videos. +Thank you to John McBride, Yusaku Kanagawa, and Katie Barnshaw for their help with Japanese translations. + +▀▀▀ +References: +Claude Shannon Demonstrates Machine Learning, AT&T Tech Channel Archive - https://ve42.co/ClaudeShannon +Mighty mouse, MIT News Magazine - https://ve42.co/MightyMouse +History, Micromouse Online Blog - https://ve42.co/MMHistory +Christiansen, D. (1977). Spectral lines: Announcing the Amazing Micro-Mouse Maze Contest. IEEE Spectrum, vol. 14, no. 5, pp. 27-27 - https://ve42.co/Christiansen1977 +Allan, R. (1979). Microprocessors: The amazing micromice: See how they won: Probing the innards of the smartest and fastest entries in the Amazing Micro-Mouse Maze Contest. IEEE Spectrum, vol. 16, no. 9, pp. 62-65, - https://ve42.co/Allan1979 +1977-79 – “MOONLIGHT SPECIAL” Battelle Inst. (American), CyberNetic Zoo - https://ve42.co/MoonlightSpecial +Christiansen, D. (2014). The Amazing MicroMouse Roars On. Spectral Lines - https://ve42.co/Christiansen2014 +1986 - MicroMouse history, competition & how it got started in the USA, via YouTube - https://ve42.co/MMArchiveYT +The first World Micromouse Contest in Tsubuka, Japan, August 1985 [1/2] by TKsTclip via YouTube - https://ve42.co/MMTsukubaYT +IEEE. (2018). Micromouse Competition Rules - https://ve42.co/IEEERules +Tondra, D. (2004). The Inception of Chedda: A detailed design and analysis of micromouse. University of Nevada - https://ve42.co/Tondra2004 +Braunl, T. (1999). Research relevance of mobile robot competitions. IEEE Robotics & Automation Magazine, vol. 6, no. 4, pp. 32-37 - https://ve42.co/Braunl1999 +All Japan Micromouse 2017 by Peter Harrison, Micromouse Online - https://ve42.co/RedComet +Winning record of the national competition micromouse (half size) competition. mm3sakusya @ wiki (Google translated from Japanese) - https://ve42.co/JapanFinishTimes +The Fosbury Flop—A Game-Changing Technique, Smithsonian Magazine - https://ve42.co/FosburyFlop +Gold medal winning heights in the Men's and Women's high jump at the Summer Olympics from 1896 to 2020, Statistica - https://ve42.co/HighJump +Zhang, H., Wang, Y., Wang, Y., & Soon, P. L. (2016). Design and realization of two-wheel micro-mouse diagonal dashing. Journal of Intelligent & Fuzzy Systems, 31(4), 2299-2306. - https://ve42.co/Zhang2016 +Micromouse Turn List, Keri’s Lab - https://ve42.co/MMTurns +Green Ye via YouTube - https://ve42.co/Greenye +Classic Micromouse, Excel 9a. Demonstrate fan suction, by TzongYong Khiew via YouTube - https://ve42.co/MMFanYT +Vacuum Micromouse by Eliot, HACKADAY - https://ve42.co/MMVacuum + +▀▀▀ +Special thanks to our Patreon supporters: +Emil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Sam Lutfi. + +▀▀▀ +Written by Tom Lum and Emily Zhang +Edited by Trenton Oliver +Animated by Ivy Tello +Coordinated by Emily Zhang +Filmed by Yusaku Kanagawa, Emily Zhang, and Derek Muller +Additional video/photos supplied by Getty Images and Pond5 +Music from Epidemic Sound +Thumbnail by Ren Hurley and Ignat Berbeci +References by Katie Barnshaw +Produced by Derek Muller, Petr Lebedev, and Emily Zhang + + + + + + + + yt:video:FU_YFpfDqqA + FU_YFpfDqqA + UCHnyfMqiRRG1u-2MsSQLbXA + Why The First Computers Were Made Out Of Light Bulbs + + + Veritasium + https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA + + 2023-05-13T14:06:52+00:00 + 2023-09-21T10:14:38+00:00 + + Why The First Computers Were Made Out Of Light Bulbs + + + Lightbulbs might be the best idea ever – just not for light. Head to https://brilliant.org/veritasium to start your free 30-day trial, and the first 200 people get 20% off an annual premium subscription. + +A huge thanks to David Lovett for showing me his awesome relay and vacuum tube based computers. Check out his YouTube channel @UsagiElectric + +▀▀▀ +References: +Herring, C., & Nichols, M. H. (1949). Thermionic emission. Reviews of modern physics, 21(2), 185. – https://ve42.co/Herring1949 + +Goldstine, H. H., & Goldstine, A. (1946). The electronic numerical integrator and computer (eniac). Mathematical Tables and Other Aids to Computation, 2(15), 97-110. – https://ve42.co/ENIAC + +Shannon, C. E. (1938). A symbolic analysis of relay and switching circuits. Electrical Engineering, 57(12), 713-723. – https://ve42.co/Shannon38 + +Boole, G. (1847). The mathematical analysis of logic. Philosophical Library. – https://ve42.co/Boole1847 + +The world’s first general purpose computer turns 75 – https://ve42.co/ENIAC2 + +Dylla, H. F., & Corneliussen, S. T. (2005). John Ambrose Fleming and the beginning of electronics. Journal of Vacuum Science & Technology A: Vacuum, Surfaces, and Films, 23(4), 1244-1251. – https://ve42.co/Dylla2005 + +Stibitz, G. R. (1980). Early computers. In A History of Computing in the Twentieth Century (pp. 479-483). Academic Press. + +ENIAC’s Hydrogen Bomb Calculations – https://ve42.co/ENIAC3 + + +▀▀▀ +Special thanks to our Patreon supporters: +Emil Abu Milad, Tj Steyn, meg noah, Bernard McGee, KeyWestr, Amadeo Bee, TTST, Balkrishna Heroor, John H. Austin, Jr., john kiehl, Anton Ragin, Benedikt Heinen, Diffbot, Gnare, Dave Kircher, Burt Humburg, Blake Byers, Evgeny Skvortsov, Meekay, Bill Linder, Paul Peijzel, Josh Hibschman, Mac Malkawi, Juan Benet, Ubiquity Ventures, Richard Sundvall, Lee Redden, Stephen Wilcox, Marinus Kuivenhoven, Michael Krugman, Cy ‘kkm’ K’Nelson, Sam Lutfi. + +▀▀▀ +Written by Petr Lebedev, Derek Muller and Kovi Rose +Edited by Trenton Oliver +Animated by Mike Radjabov, Ivy Tello and Fabio Albertelli +Filmed by Derek Muller & Raquel Nuno +Additional video/photos supplied by Getty Images & Pond5 +Music from Epidemic Sound +Produced by Derek Muller, Petr Lebedev, & Emily Zhang +Thumbnail by Ignat Berbeci + + + + + + + From ba06e2c8c8afc36afb80a1257d751ecdd249ea8c Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 3 Nov 2023 21:46:55 +0100 Subject: [PATCH 055/459] fix: a/b test 10: channel about modal --- codegen/src/abtest.rs | 35 +- codegen/src/download_testfiles.rs | 2 +- codegen/src/gen_locales.rs | 47 +- notes/AB_Tests.md | 15 + notes/_img/ab_10.png | Bin 0 -> 44238 bytes src/client/channel.rs | 174 +- src/client/response/channel.rs | 69 +- src/client/response/mod.rs | 11 +- src/client/response/url_endpoint.rs | 12 +- src/client/response/video_item.rs | 81 +- ...ent__channel__tests__map_channel_info.snap | 180 +- src/model/mod.rs | 17 +- src/param/locale.rs | 217 +- src/serializer/text.rs | 8 +- src/util/mod.rs | 23 +- testfiles/channel/channel_info.json | 3683 ++++++----------- tests/youtube.rs | 44 +- 17 files changed, 1686 insertions(+), 2932 deletions(-) create mode 100644 notes/_img/ab_10.png diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index 9d6a4ce..a87873f 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -26,6 +26,7 @@ pub enum ABTest { ShortDateFormat = 7, TrackViewcount = 8, PlaylistsForShorts = 9, + ChannelAboutModal = 10, } const TESTS_TO_RUN: [ABTest; 3] = [ @@ -98,6 +99,7 @@ pub async fn run_test( ABTest::ShortDateFormat => short_date_format(&query).await, ABTest::PlaylistsForShorts => playlists_for_shorts(&query).await, ABTest::TrackViewcount => track_viewcount(&query).await, + ABTest::ChannelAboutModal => channel_about_modal(&query).await, } .unwrap(); pb.inc(1); @@ -259,6 +261,16 @@ pub async fn short_date_format(rp: &RustyPipeQuery) -> Result { })) } +pub async fn playlists_for_shorts(rp: &RustyPipeQuery) -> Result { + let playlist = rp.playlist("UUSHh8gHdtzO2tXd593_bjErWg").await?; + let v1 = playlist + .videos + .items + .first() + .ok_or_else(|| anyhow::anyhow!("no videos"))?; + Ok(v1.publish_date_txt.is_none()) +} + pub async fn track_viewcount(rp: &RustyPipeQuery) -> Result { let res = rp.music_search("lieblingsmensch namika").await?; @@ -273,12 +285,19 @@ pub async fn track_viewcount(rp: &RustyPipeQuery) -> Result { Ok(track.view_count.is_some()) } -pub async fn playlists_for_shorts(rp: &RustyPipeQuery) -> Result { - let playlist = rp.playlist("UUSHh8gHdtzO2tXd593_bjErWg").await?; - let v1 = playlist - .videos - .items - .first() - .ok_or_else(|| anyhow::anyhow!("no videos"))?; - Ok(v1.publish_date_txt.is_none()) +pub async fn channel_about_modal(rp: &RustyPipeQuery) -> Result { + let id = "UC2DjFE7Xf11URZqWBigcVOQ"; + let res = rp + .raw( + ClientType::Desktop, + "browse", + &QBrowse { + context: rp.get_context(ClientType::Desktop, true, None).await, + browse_id: id, + params: None, + }, + ) + .await + .unwrap(); + Ok(!res.contains("\"EgVhYm91dPIGBAoCEgA%3D\"")) } diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 147db3e..239dabb 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -339,7 +339,7 @@ async fn channel_playlists() { } async fn channel_info() { - let json_path = path!(*TESTFILES_DIR / "channel" / "channel_info.json"); + let json_path = path!(*TESTFILES_DIR / "channel" / "channel_info2.json"); if json_path.exists() { return; } diff --git a/codegen/src/gen_locales.rs b/codegen/src/gen_locales.rs index 0f4ad48..fdd0410 100644 --- a/codegen/src/gen_locales.rs +++ b/codegen/src/gen_locales.rs @@ -202,11 +202,20 @@ pub enum Country { .to_owned(); let mut code_lang_array = format!( - "/// Array of all available languages\npub const LANGUAGES: [Language; {}] = [\n", + r#"/// Array of all available languages +/// The languages are sorted by their native names. This array can be used to display +/// a language selection or to get the language code from a language name using binary search. +pub const LANGUAGES: [Language; {}] = [ +"#, languages.len() ); let mut code_country_array = format!( - "/// Array of all available countries\npub const COUNTRIES: [Country; {}] = [\n", + r#"/// Array of all available countries +/// +/// The countries are sorted by their english names. This array can be used to display +/// a country selection or to get the country code from a country name using binary search. +pub const COUNTRIES: [Country; {}] = [ +"#, countries.len() ); @@ -252,9 +261,6 @@ pub enum Country { code_langs += &enum_name; code_langs += ",\n"; - // Language array - writeln!(code_lang_array, " Language::{enum_name},").unwrap(); - // Language names writeln!( code_lang_names, @@ -264,6 +270,24 @@ pub enum Country { } code_langs += "}\n"; + // Language array + let languages_by_name = languages + .iter() + .map(|(k, v)| (v, k)) + .collect::>(); + for code in languages_by_name.values() { + let enum_name = code.split('-').fold(String::new(), |mut output, c| { + let _ = write!( + output, + "{}{}", + c[0..1].to_owned().to_uppercase(), + c[1..].to_owned().to_lowercase() + ); + output + }); + writeln!(code_lang_array, " Language::{enum_name},").unwrap(); + } + for (c, n) in &countries { let enum_name = c[0..1].to_owned().to_uppercase() + &c[1..].to_owned().to_lowercase(); @@ -271,9 +295,6 @@ pub enum Country { writeln!(code_countries, " /// {n}").unwrap(); writeln!(code_countries, " {enum_name},").unwrap(); - // Country array - writeln!(code_country_array, " Country::{enum_name},").unwrap(); - // Country names writeln!( code_country_names, @@ -282,6 +303,16 @@ pub enum Country { .unwrap(); } + // Country array + let countries_by_name = countries + .iter() + .map(|(k, v)| (v, k)) + .collect::>(); + for c in countries_by_name.values() { + let enum_name = c[0..1].to_owned().to_uppercase() + &c[1..].to_owned().to_lowercase(); + writeln!(code_country_array, " Country::{enum_name},").unwrap(); + } + // Add Country::Zz / Global code_countries += " /// Global (can only be used for music charts)\n"; code_countries += " Zz,\n"; diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index 745b1e1..20efb3b 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -417,3 +417,18 @@ tab. Since the reel items dont include upload date information you can circumvent this new UI by using the mobile client. But that may change in the future. + +## [10] Channel About modal + +- **Encountered on:** 03.11.2023 +- **Impact:** 🟡 Medium +- **Endpoint:** browse (channel info) + +![A/B test 10 screenshot](./_img/ab_10.png) + +YouTube replaced the *About* channel tab with a modal. This changes the way additional +channel metadata has to be fetched. + +The new modal uses a continuation request with a token which can be easily generated. +Attempts to fetch the old about tab with the A/B test enabled will lead to a redirect to +the main tab. diff --git a/notes/_img/ab_10.png b/notes/_img/ab_10.png new file mode 100644 index 0000000000000000000000000000000000000000..21101dd1b314fe1a0de1f70b392b5b937aba090a GIT binary patch literal 44238 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 Q0kIA#%WJ?&pP9Y?Kkl)j+W-In literal 0 HcmV?d00001 diff --git a/src/client/channel.rs b/src/client/channel.rs index 3116348..4af14ee 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -1,20 +1,21 @@ use std::fmt::Debug; use serde::Serialize; +use time::OffsetDateTime; use url::Url; use crate::{ error::{Error, ExtractionError}, model::{ paginator::{ContinuationEndpoint, Paginator}, - Channel, ChannelInfo, PlaylistItem, VideoItem, YouTubeItem, + Channel, ChannelInfo, PlaylistItem, VideoItem, }, param::{ChannelOrder, ChannelVideoTab, Language}, - serializer::MapResult, - util::{self, ProtoBuilder}, + serializer::{text::TextComponent, MapResult}, + util::{self, timeago, ProtoBuilder}, }; -use super::{response, ClientType, MapResponse, RustyPipeQuery, YTContext}; +use super::{response, ClientType, MapResponse, QContinuation, RustyPipeQuery, YTContext}; #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] @@ -36,8 +37,6 @@ enum ChannelTab { Live, #[serde(rename = "EglwbGF5bGlzdHMgAQ%3D%3D")] Playlists, - #[serde(rename = "EgVhYm91dPIGBAoCEgA%3D")] - Info, #[serde(rename = "EgZzZWFyY2jyBgQKAloA")] Search, } @@ -126,7 +125,7 @@ impl RustyPipeQuery { let visitor_data = Some(self.get_visitor_data().await?); self.continuation( - order_ctoken(channel_id.as_ref(), tab, order), + order_ctoken(channel_id.as_ref(), tab, order, &random_target()), ContinuationEndpoint::Browse, visitor_data.as_deref(), ) @@ -179,19 +178,17 @@ impl RustyPipeQuery { pub async fn channel_info + Debug>( &self, channel_id: S, - ) -> Result, Error> { + ) -> Result { let channel_id = channel_id.as_ref(); - let context = self.get_context(ClientType::Desktop, true, None).await; - let request_body = QChannel { + let context = self.get_context(ClientType::Desktop, false, None).await; + let request_body = QContinuation { context, - browse_id: channel_id, - params: ChannelTab::Info, - query: None, + continuation: &channel_info_ctoken(channel_id, &random_target()), }; - self.execute_request::( + self.execute_request::( ClientType::Desktop, - "channel_info", + "channel_info2", channel_id, "browse", &request_body, @@ -290,46 +287,64 @@ impl MapResponse>> for response::Channel { } } -impl MapResponse> for response::Channel { +impl MapResponse for response::ChannelAbout { fn map_response( self, - id: &str, + _id: &str, lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, - vdata: Option<&str>, - ) -> Result>, ExtractionError> { - let content = map_channel_content(id, self.contents, self.alerts)?; - let channel_data = map_channel( - MapChannelData { - header: self.header, - metadata: self.metadata, - microformat: self.microformat, - visitor_data: self - .response_context - .visitor_data - .or_else(|| vdata.map(str::to_owned)), - has_shorts: content.has_shorts, - has_live: content.has_live, - }, - id, - lang, - )?; + _visitor_data: Option<&str>, + ) -> Result, ExtractionError> { + let ep = self + .on_response_received_endpoints + .into_iter() + .next() + .ok_or(ExtractionError::InvalidData("no received endpoint".into()))?; + let continuations = ep.append_continuation_items_action.continuation_items; + let about = continuations + .c + .into_iter() + .next() + .ok_or(ExtractionError::InvalidData("no aboutChannel data".into()))? + .about_channel_renderer + .metadata + .about_channel_view_model; + let mut warnings = continuations.warnings; - let mut mapper = response::YouTubeListMapper::::new(lang); - mapper.map_response(content.content); - let mut warnings = mapper.warnings; - - let cinfo = mapper.channel_info.unwrap_or_else(|| { - warnings.push("no aboutFullMetadata".to_owned()); - ChannelInfo { - create_date: None, - view_count: None, - links: Vec::new(), - } - }); + let links = about + .links + .into_iter() + .filter_map(|l| { + let lv = l.channel_external_link_view_model; + if let TextComponent::Web { url, .. } = lv.link { + Some((String::from(lv.title), util::sanitize_yt_url(&url))) + } else { + None + } + }) + .collect::>(); Ok(MapResult { - c: combine_channel_data(channel_data.c, cinfo), + c: ChannelInfo { + id: about.channel_id, + url: about.canonical_channel_url, + description: about.description, + subscriber_count: about + .subscriber_count_text + .and_then(|txt| util::parse_large_numstr_or_warn(&txt, lang, &mut warnings)), + video_count: about + .video_count_text + .and_then(|txt| util::parse_numeric_or_warn(&txt, &mut warnings)), + create_date: about.joined_date_text.and_then(|txt| { + timeago::parse_textual_date_or_warn(lang, &txt, &mut warnings) + .map(OffsetDateTime::date) + }), + view_count: about + .view_count_text + .and_then(|txt| util::parse_numeric_or_warn(&txt, &mut warnings)), + country: about.country.and_then(|c| util::country_from_name(&c)), + links, + }, warnings, }) } @@ -549,18 +564,7 @@ fn combine_channel_data(channel_data: Channel<()>, content: T) -> Channel } /// Get the continuation token to fetch channel videos in the given order -fn order_ctoken(channel_id: &str, tab: ChannelVideoTab, order: ChannelOrder) -> String { - _order_ctoken( - channel_id, - tab, - order, - &format!("\n${}", util::random_uuid()), - ) -} - -/// Get the continuation token to fetch channel videos in the given order -/// (fixed targetId for testing) -fn _order_ctoken( +fn order_ctoken( channel_id: &str, tab: ChannelVideoTab, order: ChannelOrder, @@ -589,6 +593,32 @@ fn _order_ctoken( pb.to_base64() } +/// Get the continuation token to fetch channel +fn channel_info_ctoken(channel_id: &str, target_id: &str) -> String { + let mut pb_3 = ProtoBuilder::new(); + pb_3.string(19, target_id); + + let mut pb_110 = ProtoBuilder::new(); + pb_110.embedded(3, pb_3); + + let mut pbi = ProtoBuilder::new(); + pbi.embedded(110, pb_110); + + let mut pb_80226972 = ProtoBuilder::new(); + pb_80226972.string(2, channel_id); + pb_80226972.string(3, &pbi.to_base64()); + + let mut pb = ProtoBuilder::new(); + pb.embedded(80_226_972, pb_80226972); + + pb.to_base64() +} + +/// Create a random UUId to build continuation tokens +fn random_target() -> String { + format!("\n${}", util::random_uuid()) +} + #[cfg(test)] mod tests { use std::{fs::File, io::BufReader}; @@ -604,7 +634,7 @@ mod tests { util::tests::TESTFILES, }; - use super::_order_ctoken; + use super::{channel_info_ctoken, order_ctoken}; #[rstest] #[case::base("videos_base", "UC2DjFE7Xf11URZqWBigcVOQ")] @@ -668,10 +698,10 @@ mod tests { let json_path = path!(*TESTFILES / "channel" / "channel_info.json"); let json_file = File::open(json_path).unwrap(); - let channel: response::Channel = + let channel: response::ChannelAbout = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = channel - .map_response("UC2DjFE7Xf11URZqWBigcVOQ", Language::En, None, None) + let map_res: MapResult = channel + .map_response("UC2DjFE7Xf11U-RZqWBigcVOQ", Language::En, None, None) .unwrap(); assert!( @@ -683,10 +713,10 @@ mod tests { } #[test] - fn order_ctoken() { + fn t_order_ctoken() { let channel_id = "UCXuqSBlHAE6Xw-yeJA0Tunw"; - let videos_popular_token = _order_ctoken( + let videos_popular_token = order_ctoken( channel_id, ChannelVideoTab::Videos, ChannelOrder::Popular, @@ -694,7 +724,7 @@ mod tests { ); assert_eq!(videos_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXg2S2hJbUNpUTJORFl4WkRkak9DMHdNREF3TFRJd05EQXRPRGRoWVMwd09EbGxNRGd5TjJVME1qQVlBZyUzRCUzRA%3D%3D"); - let shorts_popular_token = _order_ctoken( + let shorts_popular_token = order_ctoken( channel_id, ChannelVideoTab::Shorts, ChannelOrder::Popular, @@ -702,7 +732,7 @@ mod tests { ); assert_eq!(shorts_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXhTS2hJbUNpUTJORFkzT1dabVlpMHdNREF3TFRJMllqTXRZVEZpWkMwMU9ESTBNamxrTW1NM09UUVlBZyUzRCUzRA%3D%3D"); - let live_popular_token = _order_ctoken( + let live_popular_token = order_ctoken( channel_id, ChannelVideoTab::Live, ChannelOrder::Popular, @@ -710,4 +740,12 @@ mod tests { ); assert_eq!(live_popular_token, "4qmFsgJkEhhVQ1h1cVNCbEhBRTZYdy15ZUpBMFR1bncaSDhnWXVHaXh5S2hJbUNpUTJORFk1TXpBMk9TMHdNREF3TFRKaE1XVXRPR00zWkMwMU9ESTBNamxpWkRWaVlUZ1lBZyUzRCUzRA%3D%3D"); } + + #[test] + fn t_channel_info_ctoken() { + let channel_id = "UCh8gHdtzO2tXd593_bjErWg"; + + let token = channel_info_ctoken(channel_id, "\n$655b339a-0000-20b9-92dc-582429d254b4"); + assert_eq!(token, "4qmFsgJgEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caRDhnWXJHaW1hQVNZS0pEWTFOV0l6TXpsaExUQXdNREF0TWpCaU9TMDVNbVJqTFRVNE1qUXlPV1F5TlRSaU5BJTNEJTNE"); + } } diff --git a/src/client/response/channel.rs b/src/client/response/channel.rs index 826a663..b6a9259 100644 --- a/src/client/response/channel.rs +++ b/src/client/response/channel.rs @@ -2,10 +2,10 @@ use serde::Deserialize; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError}; use super::{ - video_item::YouTubeListRenderer, Alert, ChannelBadge, ContentsRenderer, ResponseContext, - Thumbnails, TwoColumnBrowseResults, + video_item::YouTubeListRenderer, Alert, ChannelBadge, ContentsRenderer, ContinuationActionWrap, + ResponseContext, Thumbnails, TwoColumnBrowseResults, }; -use crate::serializer::text::Text; +use crate::serializer::text::{AttributedText, Text, TextComponent}; #[serde_as] #[derive(Debug, Deserialize)] @@ -145,3 +145,66 @@ pub(crate) struct MicroformatDataRenderer { #[serde(default)] pub tags: Vec, } + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ChannelAbout { + #[serde_as(as = "VecSkipError<_>")] + pub on_response_received_endpoints: Vec>, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AboutChannelRendererWrap { + pub about_channel_renderer: AboutChannelRenderer, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AboutChannelRenderer { + pub metadata: ChannelMetadata, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ChannelMetadata { + pub about_channel_view_model: ChannelMetadataView, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ChannelMetadataView { + pub channel_id: String, + pub canonical_channel_url: String, + pub country: Option, + #[serde(default)] + pub description: String, + #[serde_as(as = "Option")] + pub joined_date_text: Option, + #[serde_as(as = "Option")] + pub subscriber_count_text: Option, + #[serde_as(as = "Option")] + pub video_count_text: Option, + #[serde_as(as = "Option")] + pub view_count_text: Option, + #[serde(default)] + pub links: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ExternalLink { + pub channel_external_link_view_model: ExternalLinkInner, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ExternalLinkInner { + #[serde_as(as = "AttributedText")] + pub title: TextComponent, + #[serde_as(as = "AttributedText")] + pub link: TextComponent, +} diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index 2538963..e914998 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -16,6 +16,7 @@ pub(crate) mod video_details; pub(crate) mod video_item; pub(crate) use channel::Channel; +pub(crate) use channel::ChannelAbout; pub(crate) use music_artist::MusicArtist; pub(crate) use music_artist::MusicArtistAlbums; pub(crate) use music_charts::MusicCharts; @@ -208,7 +209,7 @@ pub(crate) struct Continuation { alias = "onResponseReceivedEndpoints" )] #[serde_as(as = "Option>")] - pub on_response_received_actions: Option>, + pub on_response_received_actions: Option>>, /// Used for channel video rich grid renderer /// /// A/B test seen on 19.10.2022 @@ -217,15 +218,15 @@ pub(crate) struct Continuation { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub(crate) struct ContinuationActionWrap { +pub(crate) struct ContinuationActionWrap { #[serde(alias = "reloadContinuationItemsCommand")] - pub append_continuation_items_action: ContinuationAction, + pub append_continuation_items_action: ContinuationAction, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub(crate) struct ContinuationAction { - pub continuation_items: MapResult>, +pub(crate) struct ContinuationAction { + pub continuation_items: MapResult>, } #[derive(Debug, Deserialize)] diff --git a/src/client/response/url_endpoint.rs b/src/client/response/url_endpoint.rs index bbdee34..fb629fb 100644 --- a/src/client/response/url_endpoint.rs +++ b/src/client/response/url_endpoint.rs @@ -1,7 +1,7 @@ use serde::Deserialize; use serde_with::{serde_as, DefaultOnError}; -use crate::{model::UrlTarget, util}; +use crate::model::UrlTarget; /// navigation/resolve_url response model #[derive(Debug, Deserialize)] @@ -280,14 +280,4 @@ impl NavigationEndpoint { None } } - - /// Get the sanitized URL from a url endpoint - pub(crate) fn url(&self) -> Option { - match self { - NavigationEndpoint::Url { url_endpoint } => { - Some(util::sanitize_yt_url(&url_endpoint.url)) - } - _ => None, - } - } } diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index 3283f42..d25fe40 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -6,15 +6,15 @@ use serde_with::{ }; use time::OffsetDateTime; -use super::{url_endpoint::NavigationEndpoint, ChannelBadge, ContinuationEndpoint, Thumbnails}; +use super::{ChannelBadge, ContinuationEndpoint, Thumbnails}; use crate::{ model::{ - Channel, ChannelId, ChannelInfo, ChannelItem, ChannelTag, PlaylistItem, Verification, - VideoItem, YouTubeItem, + Channel, ChannelId, ChannelItem, ChannelTag, PlaylistItem, Verification, VideoItem, + YouTubeItem, }, param::Language, serializer::{ - text::{AccessibilityText, AttributedText, Text, TextComponent}, + text::{AccessibilityText, Text, TextComponent}, MapResult, }, util::{self, timeago, TryRemove}, @@ -48,9 +48,6 @@ pub(crate) enum YouTubeListItem { corrected_query: String, }, - /// Channel metadata (about tab) - ChannelAboutFullMetadataRenderer(ChannelFullMetadata), - /// Contains video on startpage /// /// Seems to be currently A/B tested on the channel page, @@ -358,47 +355,6 @@ pub(crate) struct ReelPlayerHeaderRenderer { pub timestamp_text: String, } -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct ChannelFullMetadata { - #[serde_as(as = "Text")] - pub joined_date_text: String, - #[serde_as(as = "Option")] - pub view_count_text: Option, - #[serde(default)] - #[serde_as(as = "VecSkipError<_>")] - pub primary_links: Vec, - #[serde(default)] - // #[serde_as(as = "VecSkipError<_>")] - pub links: Vec, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct PrimaryLink { - #[serde_as(as = "Text")] - pub title: String, - pub navigation_endpoint: NavigationEndpoint, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct ExternalLink { - pub channel_external_link_view_model: ExternalLinkInner, -} - -#[serde_as] -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct ExternalLinkInner { - #[serde_as(as = "AttributedText")] - pub title: TextComponent, - #[serde_as(as = "AttributedText")] - pub link: TextComponent, -} - trait IsLive { fn is_live(&self) -> bool; } @@ -446,7 +402,6 @@ pub(crate) struct YouTubeListMapper { pub warnings: Vec, pub ctoken: Option, pub corrected_query: Option, - pub channel_info: Option, } impl YouTubeListMapper { @@ -458,7 +413,6 @@ impl YouTubeListMapper { warnings: Vec::new(), ctoken: None, corrected_query: None, - channel_info: None, } } @@ -476,7 +430,6 @@ impl YouTubeListMapper { warnings, ctoken: None, corrected_query: None, - channel_info: None, } } @@ -744,32 +697,6 @@ impl YouTubeListMapper { YouTubeListItem::ShowingResultsForRenderer { corrected_query } => { self.corrected_query = Some(corrected_query); } - YouTubeListItem::ChannelAboutFullMetadataRenderer(meta) => { - let mut links = meta - .primary_links - .into_iter() - .filter_map(|l| l.navigation_endpoint.url().map(|url| (l.title, url))) - .collect::>(); - for l in meta.links { - let l = l.channel_external_link_view_model; - if let TextComponent::Web { url, .. } = l.link { - links.push((l.title.into(), util::sanitize_yt_url(&url))); - } - } - - self.channel_info = Some(ChannelInfo { - create_date: timeago::parse_textual_date_or_warn( - self.lang, - &meta.joined_date_text, - &mut self.warnings, - ) - .map(OffsetDateTime::date), - view_count: meta - .view_count_text - .and_then(|txt| util::parse_numeric_or_warn(&txt, &mut self.warnings)), - links, - }); - } YouTubeListItem::RichItemRenderer { content } => { self.map_item(*content); } diff --git a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_info.snap b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_info.snap index 4bb2028..43b8e24 100644 --- a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_info.snap +++ b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_info.snap @@ -2,166 +2,28 @@ source: src/client/channel.rs expression: map_res.c --- -Channel( +ChannelInfo( id: "UC2DjFE7Xf11URZqWBigcVOQ", - name: "EEVblog", - subscriber_count: Some(881000), - avatar: [ - Thumbnail( - url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s48-c-k-c0x00ffffff-no-rj", - width: 48, - height: 48, - ), - Thumbnail( - url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s88-c-k-c0x00ffffff-no-rj", - width: 88, - height: 88, - ), - Thumbnail( - url: "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s176-c-k-c0x00ffffff-no-rj", - width: 176, - height: 176, - ), - ], - verification: Verified, + url: "http://www.youtube.com/@EEVblog", description: "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON\'T DO PAID VIDEO SPONSORSHIPS, DON\'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don\'t be offended if I don\'t have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA", - tags: [ - "electronics", - "engineering", - "maker", - "hacker", - "design", - "circuit", - "hardware", - "pic", - "atmel", - "oscilloscope", - "multimeter", - "diy", - "hobby", - "review", - "teardown", - "microcontroller", - "arduino", - "video", - "blog", - "tutorial", - "how-to", - "interview", - "rant", - "industry", - "news", - "mailbag", - "dumpster diving", - "debunking", + subscriber_count: Some(920000), + video_count: Some(1920), + create_date: Some("2009-04-04"), + view_count: Some(199087682), + country: Some(AU), + links: [ + ("EEVblog Web Site", "http://www.eevblog.com/"), + ("Twitter", "http://www.twitter.com/eevblog"), + ("Facebook", "http://www.facebook.com/EEVblog"), + ("EEVdiscover", "https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ"), + ("The EEVblog Forum", "http://www.eevblog.com/forum"), + ("EEVblog Merchandise (T-Shirts)", "http://www.eevblog.com/merch"), + ("EEVblog Donations", "http://www.eevblog.com/donations/"), + ("Patreon", "https://www.patreon.com/eevblog"), + ("SubscribeStar", "https://www.subscribestar.com/eevblog"), + ("The AmpHour Radio Show", "http://www.theamphour.com/"), + ("Flickr", "http://www.flickr.com/photos/eevblog"), + ("EEVblog AMAZON Store", "http://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.com%2F&tag=ee04-20&linkCode=ur2&camp=1789&creative=390957"), + ("2nd EEVblog Channel", "http://www.youtube.com/EEVblog2"), ], - vanity_url: Some("https://www.youtube.com/c/EevblogDave"), - banner: [ - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - width: 1060, - height: 175, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - width: 1138, - height: 188, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1707-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - width: 1707, - height: 283, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - width: 2120, - height: 351, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2276-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - width: 2276, - height: 377, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - width: 2560, - height: 424, - ), - ], - mobile_banner: [ - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - width: 320, - height: 88, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w640-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - width: 640, - height: 175, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w960-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - width: 960, - height: 263, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - width: 1280, - height: 351, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1440-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - width: 1440, - height: 395, - ), - ], - tv_banner: [ - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - width: 320, - height: 180, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w854-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - width: 854, - height: 480, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - width: 1280, - height: 720, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1920-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - width: 1920, - height: 1080, - ), - Thumbnail( - url: "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - width: 2120, - height: 1192, - ), - ], - has_shorts: false, - has_live: false, - visitor_data: Some("CgszMUUzZDlGLWxiRSipqr2ZBg%3D%3D"), - content: ChannelInfo( - create_date: Some("2009-04-04"), - view_count: Some(186854342), - links: [ - ("EEVblog Web Site", "http://www.eevblog.com/"), - ("Twitter", "http://www.twitter.com/eevblog"), - ("Facebook", "http://www.facebook.com/EEVblog"), - ("EEVdiscover", "https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ"), - ("The EEVblog Forum", "http://www.eevblog.com/forum"), - ("EEVblog Merchandise (T-Shirts)", "http://www.eevblog.com/merch"), - ("EEVblog Donations", "http://www.eevblog.com/donations/"), - ("Patreon", "https://www.patreon.com/eevblog"), - ("SubscribeStar", "https://www.subscribestar.com/eevblog"), - ("The AmpHour Radio Show", "http://www.theamphour.com/"), - ("Flickr", "http://www.flickr.com/photos/eevblog"), - ("EEVblog AMAZON Store", "http://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.com%2F&tag=ee04-20&linkCode=ur2&camp=1789&creative=390957"), - ("2nd EEVblog Channel", "http://www.youtube.com/EEVblog2"), - ], - ), ) diff --git a/src/model/mod.rs b/src/model/mod.rs index ffbf652..4bf7b37 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -738,16 +738,31 @@ pub struct Channel { pub content: T, } -/// Additional channel metadata fetched from the "About" tab. +/// Detailed channel information #[serde_as] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct ChannelInfo { + /// Unique YouTube Channel-ID (e.g. `UC-lHJZR3Gqxm24_Vd_AJ5Yw`) + pub id: String, + /// Channel URL + pub url: String, + /// Channel description text + pub description: String, + /// Channel subscriber count + /// + /// [`None`] if the subscriber count was hidden by the owner + /// or could not be parsed. + pub subscriber_count: Option, + /// Channel video count + pub video_count: Option, /// Channel creation date #[serde_as(as = "Option")] pub create_date: Option, /// Channel view count pub view_count: Option, + /// Channel origin country + pub country: Option, /// Links to other websites or social media profiles pub links: Vec<(String, String)>, } diff --git a/src/param/locale.rs b/src/param/locale.rs index 21f049d..e886666 100644 --- a/src/param/locale.rs +++ b/src/param/locale.rs @@ -419,202 +419,207 @@ pub enum Country { } /// Array of all available languages +/// The languages are sorted by their native names. This array can be used to display +/// a language selection or to get the language code from a language name using binary search. pub const LANGUAGES: [Language; 83] = [ Language::Af, - Language::Am, - Language::Ar, - Language::As, Language::Az, - Language::Be, - Language::Bg, - Language::Bn, + Language::Id, + Language::Ms, Language::Bs, Language::Ca, - Language::Cs, Language::Da, Language::De, - Language::El, - Language::En, - Language::EnGb, + Language::Et, Language::EnIn, + Language::EnGb, + Language::En, Language::Es, Language::Es419, Language::EsUs, - Language::Et, Language::Eu, - Language::Fa, - Language::Fi, Language::Fil, Language::Fr, Language::FrCa, Language::Gl, - Language::Gu, - Language::Hi, Language::Hr, - Language::Hu, - Language::Hy, - Language::Id, - Language::Is, + Language::Zu, Language::It, - Language::Iw, - Language::Ja, - Language::Ka, - Language::Kk, - Language::Km, - Language::Kn, - Language::Ko, - Language::Ky, - Language::Lo, - Language::Lt, + Language::Sw, Language::Lv, - Language::Mk, - Language::Ml, - Language::Mn, - Language::Mr, - Language::Ms, - Language::My, - Language::Ne, + Language::Lt, + Language::Hu, Language::Nl, Language::No, - Language::Or, - Language::Pa, + Language::Uz, Language::Pl, - Language::Pt, Language::PtPt, + Language::Pt, Language::Ro, - Language::Ru, - Language::Si, + Language::Sq, Language::Sk, Language::Sl, - Language::Sq, - Language::Sr, Language::SrLatn, + Language::Fi, Language::Sv, - Language::Sw, + Language::Vi, + Language::Tr, + Language::Is, + Language::Cs, + Language::El, + Language::Be, + Language::Bg, + Language::Ky, + Language::Mk, + Language::Mn, + Language::Ru, + Language::Sr, + Language::Uk, + Language::Kk, + Language::Hy, + Language::Iw, + Language::Ur, + Language::Ar, + Language::Fa, + Language::Ne, + Language::Mr, + Language::Hi, + Language::As, + Language::Bn, + Language::Pa, + Language::Gu, + Language::Or, Language::Ta, Language::Te, + Language::Kn, + Language::Ml, + Language::Si, Language::Th, - Language::Tr, - Language::Uk, - Language::Ur, - Language::Uz, - Language::Vi, + Language::Lo, + Language::My, + Language::Ka, + Language::Am, + Language::Km, Language::ZhCn, - Language::ZhHk, Language::ZhTw, - Language::Zu, + Language::ZhHk, + Language::Ja, + Language::Ko, ]; /// Array of all available countries +/// +/// The countries are sorted by their english names. This array can be used to display +/// a country selection or to get the country code from a country name using binary search. pub const COUNTRIES: [Country; 109] = [ - Country::Ae, + Country::Dz, Country::Ar, - Country::At, Country::Au, + Country::At, Country::Az, - Country::Ba, - Country::Bd, - Country::Be, - Country::Bg, Country::Bh, - Country::Bo, - Country::Br, + Country::Bd, Country::By, + Country::Be, + Country::Bo, + Country::Ba, + Country::Br, + Country::Bg, + Country::Kh, Country::Ca, - Country::Ch, Country::Cl, Country::Co, Country::Cr, + Country::Hr, Country::Cy, Country::Cz, - Country::De, Country::Dk, Country::Do, - Country::Dz, Country::Ec, - Country::Ee, Country::Eg, - Country::Es, + Country::Sv, + Country::Ee, Country::Fi, Country::Fr, - Country::Gb, Country::Ge, + Country::De, Country::Gh, Country::Gr, Country::Gt, - Country::Hk, Country::Hn, - Country::Hr, + Country::Hk, Country::Hu, + Country::Is, + Country::In, Country::Id, + Country::Iq, Country::Ie, Country::Il, - Country::In, - Country::Iq, - Country::Is, Country::It, Country::Jm, - Country::Jo, Country::Jp, - Country::Ke, - Country::Kh, - Country::Kr, - Country::Kw, + Country::Jo, Country::Kz, + Country::Ke, + Country::Kw, Country::La, + Country::Lv, Country::Lb, + Country::Ly, Country::Li, - Country::Lk, Country::Lt, Country::Lu, - Country::Lv, - Country::Ly, - Country::Ma, - Country::Me, - Country::Mk, + Country::My, Country::Mt, Country::Mx, - Country::My, - Country::Ng, - Country::Ni, - Country::Nl, - Country::No, + Country::Me, + Country::Ma, Country::Np, + Country::Nl, Country::Nz, + Country::Ni, + Country::Ng, + Country::Mk, + Country::No, Country::Om, - Country::Pa, - Country::Pe, - Country::Pg, - Country::Ph, Country::Pk, - Country::Pl, - Country::Pr, - Country::Pt, + Country::Pa, + Country::Pg, Country::Py, + Country::Pe, + Country::Ph, + Country::Pl, + Country::Pt, + Country::Pr, Country::Qa, Country::Ro, - Country::Rs, Country::Ru, Country::Sa, - Country::Se, - Country::Sg, - Country::Si, - Country::Sk, Country::Sn, - Country::Sv, + Country::Rs, + Country::Sg, + Country::Sk, + Country::Si, + Country::Za, + Country::Kr, + Country::Es, + Country::Lk, + Country::Se, + Country::Ch, + Country::Tw, + Country::Tz, Country::Th, Country::Tn, Country::Tr, - Country::Tw, - Country::Tz, - Country::Ua, Country::Ug, + Country::Ua, + Country::Ae, + Country::Gb, Country::Us, Country::Uy, Country::Ve, Country::Vn, Country::Ye, - Country::Za, Country::Zw, ]; @@ -844,11 +849,7 @@ impl FromStr for Language { Some(pos) => { sub = &sub[..pos]; } - None => { - return Err(Error::Other( - format!("could not parse language `{s}`").into(), - )) - } + None => return Err(Error::Other("could not parse language `{s}`".into())), } } } diff --git a/src/serializer/text.rs b/src/serializer/text.rs index 6b0d877..4d628af 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -44,13 +44,14 @@ use crate::{ #[serde(untagged)] pub(crate) enum Text { Simple { - #[serde(alias = "simpleText")] + #[serde(alias = "simpleText", alias = "content")] text: String, }, Multiple { #[serde_as(as = "Vec")] runs: Vec, }, + Str(String), } impl<'de> DeserializeAs<'de, String> for Text { @@ -60,7 +61,7 @@ impl<'de> DeserializeAs<'de, String> for Text { { let text = Text::deserialize(deserializer)?; match text { - Text::Simple { text } => Ok(text), + Text::Simple { text } | Text::Str(text) => Ok(text), Text::Multiple { runs } => Ok(runs.join("")), } } @@ -73,7 +74,7 @@ impl<'de> DeserializeAs<'de, Vec> for Text { { let text = Text::deserialize(deserializer)?; match text { - Text::Simple { text } => Ok(vec![text]), + Text::Simple { text } | Text::Str(text) => Ok(vec![text]), Text::Multiple { runs } => Ok(runs), } } @@ -542,6 +543,7 @@ mod tests { }"#, vec!["Abo für ", "MBCkpop", " beenden?"] )] + #[case(r#"{"txt":"Hello World"}"#, vec!["Hello World"])] fn t_deserialize_text(#[case] test_json: &str, #[case] exp: Vec<&str>) { #[serde_as] #[derive(Deserialize)] diff --git a/src/util/mod.rs b/src/util/mod.rs index a29a6d2..be7c50c 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -19,7 +19,11 @@ use rand::Rng; use regex::Regex; use url::Url; -use crate::{error::Error, param::Language, serializer::text::TextComponent}; +use crate::{ + error::Error, + param::{Country, Language, COUNTRIES}, + serializer::text::TextComponent, +}; pub static VIDEO_ID_REGEX: Lazy = Lazy::new(|| Regex::new(r"^[A-Za-z0-9_-]{11}$").unwrap()); pub static CHANNEL_ID_REGEX: Lazy = @@ -462,6 +466,14 @@ pub fn b64_decode>(input: T) -> Result, base64::DecodeErr base64::engine::general_purpose::STANDARD.decode(input) } +/// Get the country from its English name +pub fn country_from_name(name: &str) -> Option { + COUNTRIES + .binary_search_by_key(&name, Country::name) + .ok() + .map(|i| COUNTRIES[i]) +} + /// An iterator over the chars in a string (in str format) pub struct SplitChar<'a> { txt: &'a str, @@ -685,4 +697,13 @@ pub(crate) mod tests { let res = Language::from_str(s).ok(); assert_eq!(res, expect); } + + #[rstest] + #[case("United States", Some(Country::Us))] + #[case("Zimbabwe", Some(Country::Zw))] + #[case("foobar", None)] + fn t_country_from_name(#[case] name: &str, #[case] expect: Option) { + let res = country_from_name(name); + assert_eq!(res, expect); + } } diff --git a/testfiles/channel/channel_info.json b/testfiles/channel/channel_info.json index 939ca6e..d771f46 100644 --- a/testfiles/channel/channel_info.json +++ b/testfiles/channel/channel_info.json @@ -1,321 +1,391 @@ { - "contents": { - "twoColumnBrowseResultsRenderer": { - "tabs": [ - { - "tabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EghmZWF0dXJlZPIGBAoCMgA%3D" - }, - "clickTrackingParams": "CCsQ8JMBGAUiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/featured", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "title": "Home", - "trackingParams": "CCsQ8JMBGAUiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "tabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EgZ2aWRlb3PyBgQKAjoA" - }, - "clickTrackingParams": "CCoQ8JMBGAYiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/videos", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "title": "Videos", - "trackingParams": "CCoQ8JMBGAYiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "tabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EglwbGF5bGlzdHPyBgQKAkIA" - }, - "clickTrackingParams": "CCkQ8JMBGAciEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/playlists", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "title": "Playlists", - "trackingParams": "CCkQ8JMBGAciEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "tabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "Egljb21tdW5pdHnyBgQKAkoA" - }, - "clickTrackingParams": "CCgQ8JMBGAgiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/community", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "title": "Community", - "trackingParams": "CCgQ8JMBGAgiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "tabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EgVzdG9yZfIGBAoCGgA%3D" - }, - "clickTrackingParams": "CCcQ8JMBGAkiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/store", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "title": "Store", - "trackingParams": "CCcQ8JMBGAkiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "tabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EghjaGFubmVsc_IGBAoCUgA%3D" - }, - "clickTrackingParams": "CCYQ8JMBGAoiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/channels", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "title": "Channels", - "trackingParams": "CCYQ8JMBGAoiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "tabRenderer": { - "content": { - "sectionListRenderer": { - "contents": [ - { - "itemSectionRenderer": { - "contents": [ - { - "channelAboutFullMetadataRenderer": { - "avatar": { - "thumbnails": [ - { - "height": 48, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s48-c-k-c0x00ffffff-no-rj", - "width": 48 - }, - { - "height": 88, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s88-c-k-c0x00ffffff-no-rj", - "width": 88 - }, - { - "height": 176, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s176-c-k-c0x00ffffff-no-rj", - "width": 176 - } - ] + "onResponseReceivedEndpoints": [ + { + "appendContinuationItemsAction": { + "continuationItems": [ + { + "aboutChannelRenderer": { + "metadata": { + "aboutChannelViewModel": { + "additionalInfoLabel": { + "content": "Channel details", + "styleRuns": [ + { + "length": 15, + "startIndex": 0 + } + ] + }, + "canonicalChannelUrl": "http://www.youtube.com/@EEVblog", + "channelId": "UC2DjFE7Xf11URZqWBigcVOQ", + "country": "Australia", + "customLinksLabel": { + "content": "Links", + "styleRuns": [ + { + "length": 5, + "startIndex": 0 + } + ] + }, + "customUrlOnTap": { + "innertubeCommand": { + "clickTrackingParams": "CAAQhGciEwis363HrqiCAxWfHwYAHc0nDmw=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "shareEntityEndpoint": { + "serializedShareEntity": "GhhVQzJEakZFN1hmMTFVUlpxV0JpZ2NWT1E%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + } + }, + "description": "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON'T DO PAID VIDEO SPONSORSHIPS, DON'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don't be offended if I don't have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA", + "descriptionLabel": { + "content": "Description", + "styleRuns": [ + { + "length": 11, + "startIndex": 0 + } + ] + }, + "joinedDateText": { + "content": "Joined Apr 4, 2009", + "styleRuns": [ + { + "length": 18, + "startIndex": 0 + } + ] + }, + "links": [ + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ", + "width": 16 }, - "businessEmailLabel": { - "runs": [ - { - "text": "For business inquiries:" - } - ] + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSRO3yoShMv5k2DaoKeuCUuLO7tqU2tq_5dmjuYm6jI5FVUVzAR3hzAYKXBLihGwpLTHHwvZytTudtTbT5BcynVneVmScYFWQD5YeySuJdm44lkuA", + "width": 24 }, - "bypassBusinessEmailCaptcha": false, - "canonicalChannelUrl": "http://www.youtube.com/c/EevblogDave", - "channelId": "UC2DjFE7Xf11URZqWBigcVOQ", - "country": { - "simpleText": "Australia" + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRIUJbfp6w0pB_u9CGjMzaTsTI7tiSAdSGBA8Hf6zMS5vjmNxUZEU01jHbVZSLbD05OQVHJDuqOf3H2kubCIp5bt4C73Y3H4zbT64CPQBojEE0HKw", + "width": 32 }, - "countryLabel": { - "runs": [ - { - "deemphasize": true, - "text": "\nLocation:\n " - } - ] + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSjc0VmcVmJs-FQFvHFOGGfCa1T2yvy_37_qvLeaEenpYij0Awawk3H_89y3FUOMQfYYoJgGEWOUeqSNiuP2HhWCepbiORY3nOV4rirtii6ZK0Okw", + "width": 48 }, - "description": { - "simpleText": "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON'T DO PAID VIDEO SPONSORSHIPS, DON'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don't be offended if I don't have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA" + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcT69ZCUPz_NCxzzBSTaa3UsDtYstRJkHNQDosDuc6opuZoSNQyfeH7q70magR_sCmcOXrhlVt90kJaYfuaxaMinr4NvcvyxLvkxablKlWLUz3dNwQ", + "width": 50 }, - "descriptionLabel": { - "runs": [ - { - "text": "Description" - } - ] + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRVbUVWS0NUsck5BjE03J5DCtX6Pddc7dbdTW-UfOYeh68FLygzZKr7m7aCt0gSW7BW1mNleXfBXdT3F2wLroI4OJCX2_hTEvzhpf7N4Vskdn_DvA", + "width": 64 }, - "detailsLabel": { - "runs": [ - { - "text": "Details" - } - ] + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIioE30qOAuAgsby1zHK_3DQ4OM1dudwAsAJeGgsL_t1-VgVsL325ZVzk6jUiMsAUCEIpoGeDm9dCRs6b0G1HTJ-TwMVsZ9TZh5sk0hyuaoUS-PQ", + "width": 96 }, - "joinedDateText": { - "runs": [ - { - "text": "Joined " - }, - { - "text": "Apr 4, 2009" - } - ] + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcR4jzSwbUFOQnTnk8rdJjrsB83EHczjKxbbKin2Tzvn0-b-aphjcZNP6_ymFrDzQLic_m2agRA6_JWVrfZTRtmaEU2p9hUr-jy9ON_XmhCSm-8VBus", + "width": 128 }, - "onBusinessEmailRevealClickCommand": { - "clickTrackingParams": "CBgQuy8YACITCNCX8umPrvoCFcXoUQodyk0HAw==", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/channel/reveal_business_email", - "sendPost": true - } - }, - "revealBusinessEmailCommand": {} + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTj0M93LmbNQ3X0LfHkLbS80j63DGUfWfQe-HjX-TgO0_h-ff1as0nlf11EZ2OLGra-LaVc4tuO_BR6xd8KoWcG566_zyyjB_rfC8zsNjUWcrZIZyc", + "width": 180 }, - "primaryLinks": [ - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CCUQobIHGAEiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSe0igGE-TpaxmAu93lpaP5Mj8QreWzoqq-Egda_PGitzD3-ZOoO0bD5bpBFQDVjQnpOu2cEQOwJkohhaYiSJGk6bWt8MogG2OByyg624RjVHSbqoU", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 11, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBIQobIHGAIiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbWtPX3hfT29YN05DV0hLbnllb1dVV0Rsb29ZQXxBQ3Jtc0tuX1ZTVW9IZExYdkpMcTQwTUxENWphU3R1dWx2RG1xVkIxNkY0Qk5qa2RRZ21kRy15YzI4Z2lOcFNoM3RiOVZNSVczNTRhRnprZFNFWmdITTNzNDItRUc4WEhzcEtKZjgtLWZGNllpbjNReW85SGtJbw&q=http%3A%2F%2Fwww.eevblog.com", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa1NiX0hYdzFzZkdPc3lhOUZ6ZHozTy05QTFyQXxBQ3Jtc0ttVG4tTDRKb0FVUkwzT0d2d2xOd092M3g4Um4yeVJXQTRCb2NrY1pJYW1YSVEyVlBnNk9BVlFSU2FxVkx3WFBCZUUzRTlQY1lVU1lzaWVlVUJWdGV2VzZqcW1mTy1xQXdqNTRsTUVJdHZ0VlkxcGJRSQ&q=http%3A%2F%2Fwww.eevblog.com", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbWtPX3hfT29YN05DV0hLbnllb1dVV0Rsb29ZQXxBQ3Jtc0tuX1ZTVW9IZExYdkpMcTQwTUxENWphU3R1dWx2RG1xVkIxNkY0Qk5qa2RRZ21kRy15YzI4Z2lOcFNoM3RiOVZNSVczNTRhRnprZFNFWmdITTNzNDItRUc4WEhzcEtKZjgtLWZGNllpbjNReW85SGtJbw&q=http%3A%2F%2Fwww.eevblog.com" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa1NiX0hYdzFzZkdPc3lhOUZ6ZHozTy05QTFyQXxBQ3Jtc0ttVG4tTDRKb0FVUkwzT0d2d2xOd092M3g4Um4yeVJXQTRCb2NrY1pJYW1YSVEyVlBnNk9BVlFSU2FxVkx3WFBCZUUzRTlQY1lVU1lzaWVlVUJWdGV2VzZqcW1mTy1xQXdqNTRsTUVJdHZ0VlkxcGJRSQ&q=http%3A%2F%2Fwww.eevblog.com" } - }, - "title": { - "simpleText": "EEVblog Web Site" - }, - "trackingParams": "CCUQobIHGAEiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSnyfGgzwnk19b891nCqykpMzr3jlkKm0Z65gNVJbtXsk9-gzW5EiqqEvM02nZyYKmI2x1JQI9OuGsWU69bgq9_rNrHCYrXLP6HqhP9iVwr0bm2IQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CCQQobIHGAIiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "eevblog.com" + }, + "title": { + "content": "EEVblog Web Site" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSnyfGgzwnk19b891nCqykpMzr3jlkKm0Z65gNVJbtXsk9-gzW5EiqqEvM02nZyYKmI2x1JQI9OuGsWU69bgq9_rNrHCYrXLP6HqhP9iVwr0bm2IQ", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcScCAZA1pWe29pjcrDQ6ARryPtvg1JzLCqkwhF6damck941gd8uDg_jxeFgVG7t3DqkSXq2egnOMb07AGBBn3Q6Zg95j7Iro9M1D_CSCVpUPQbRzw", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRpQXrl3L7Mh9_WhjFYD823T6DTyA6HEAOepg7_UMgQ7mwTd7OrCd0CsdcYiX6moKSPUH907oroRJrs-VOKiIVAU9CgUGhxvPMa1cLzLtcwRWIx2A", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRcmurwwdiD-gN00M74VmxNy57-L302TT4xgD49uw4ejJfOIP_yJkssnKNfiyeWT7GfGlX8XJBXrwPv_72R7LJcTQX24kzySpixmFGKytFUfpHZ6Q", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcTPRhtaw3kt4XYlip73DgoHG_ERUbPgYJP8QoThvpfTj4Llwa1YQKIPJkBJYSyEZ3BuVGo7lKWYvAJ3VHVbSb-279au9kdvNg6p3BbPHK1IRNTkag", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSdPY-HkyqXBC5OxvGsPoKZ67TvqoXlt9m50r5_RjKodEza608Tie-MDqpYB1Te-Snc-vDXU5kAEjnA9tsA_840ZiF0wh4iDASnuazpeR_oRH5tzw", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRcADsxfrGPrKjkJVxF0TH8uREzOhAbtAXxfAnPEUCYSxFE8gnUb-xRv7Oig5zQt3oarUs7RtqKJKB_4C7RVNblRPtB2OfWK9XTBn0UIFxk5TbbuA", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRilnE8pw1jlpQcH8L3o9D_FHJcGQi6IcaN-HYxBbsGVViHVeiZHmag5b8biEsFdAoaVh_T7u5t1_1Ip5U9sttsmUiJmEsFUWqBmHutNQOWjKznCrw", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcQV-kyjo0dRmiYBr5B0I6hU5rB5a8WrWxPvfSR76Psy5JXGznp60J9_7jfVVXk41BW0aQwr9xgVC88g6SvEnnAZwzs-fQrNMLQaI5AHC0JMbFIyfqs", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSca19F4khsR_Gvs4fJj-8RGK6A_gVRdQIz3wd-c1My9_pVi5a-vFN5FJ-QwAe_Te5gL8R06bZkdTH2Zl2bSRtznEu3H-BILV3tCQ_0U92zwGdBOag", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 19, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBEQobIHGAMiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa0NBT2M1UkV5ejJZbXNITWdaRFh4QmNaQ0Rxd3xBQ3Jtc0tscXlScUJZWjFVUGNwampKUGwxbWVoQU9HRHFfdGZpTmxuMEY3bGlEV000em15bExiZGhiM09WSlp4cXlpWVk0OWFMdE1Wei1vYzh4aGgtS1gtUDFCb2tsOFZyU3BFSW1HdXh6OU1peThJWTBrNnZlbw&q=http%3A%2F%2Fwww.twitter.com%2Feevblog", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqazZQR1hvdnF4TGZFTVM1WFdERzRoa2lCYS04d3xBQ3Jtc0ttblJLVFdHZmppbzdwdVZWZEtFWXZURFNCYzlnU1lkOC00dVdVbm5lb3FLalZpZDY3MFNuSUx0N0VJOHdNUGxLRTdac1N2MjZaRF9EdTFKOXd3WXRiV3BMVElmRHJPc2l3T0taWTkwclFsUU9QTVRrZw&q=http%3A%2F%2Fwww.twitter.com%2Feevblog", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa0NBT2M1UkV5ejJZbXNITWdaRFh4QmNaQ0Rxd3xBQ3Jtc0tscXlScUJZWjFVUGNwampKUGwxbWVoQU9HRHFfdGZpTmxuMEY3bGlEV000em15bExiZGhiM09WSlp4cXlpWVk0OWFMdE1Wei1vYzh4aGgtS1gtUDFCb2tsOFZyU3BFSW1HdXh6OU1peThJWTBrNnZlbw&q=http%3A%2F%2Fwww.twitter.com%2Feevblog" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqazZQR1hvdnF4TGZFTVM1WFdERzRoa2lCYS04d3xBQ3Jtc0ttblJLVFdHZmppbzdwdVZWZEtFWXZURFNCYzlnU1lkOC00dVdVbm5lb3FLalZpZDY3MFNuSUx0N0VJOHdNUGxLRTdac1N2MjZaRF9EdTFKOXd3WXRiV3BMVElmRHJPc2l3T0taWTkwclFsUU9QTVRrZw&q=http%3A%2F%2Fwww.twitter.com%2Feevblog" } - }, - "title": { - "simpleText": "Twitter" - }, - "trackingParams": "CCQQobIHGAIiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRmQS0-yT-68TopCQcxwbvtkTB0rdiUtc7g4WFZBVWFT4tJ8tSTon4n5uCmm9_b69_7bgTNZNmFw3-zyF-kWNXXZJEBTm_-r1qZrKLyDfCYxiEXY50" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CCMQobIHGAMiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "twitter.com/eevblog" + }, + "title": { + "content": "Twitter" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRmQS0-yT-68TopCQcxwbvtkTB0rdiUtc7g4WFZBVWFT4tJ8tSTon4n5uCmm9_b69_7bgTNZNmFw3-zyF-kWNXXZJEBTm_-r1qZrKLyDfCYxiEXY50", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcS8otgTiKPgqN8mKk_rEms8i-dD0fPpajLNtgX3i9Ltnwt2zOCwlQE7ohhSyjTmX_QmmtwRwXswtvHnCQMTp4BzIkGSH5VrQOhhEvLPWGzOm6K_lko", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcSQwKmCiL86h8J5lhsv_kTzPmGIeRf8tpUu4kdbMKHdpA_hS8PXW8j57tZ07ZtmlIpZbh7K2YaLfDzL_pfkwnugANQd4D9yQ7aYkElDR1Az1Gq4xyc", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQtIIRFpUFfy65PMCPCAAmH2b-wyOlfC3t6ZhPXPGUvOHz-BJiArv0mfVApyLvbyIPXBgvbIZyMWsVEWevJ0UU9yULa3WqKR4ZQdyhdxb_0ySw9aJ0", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQh8ek3XunoGAkVEDYUaXBZ58HJx0vM9r-Z_YtKhr_uPPMNqkH05gPJaCZQx3zJrGRWHRvNiOF9W0bidd-IXQdN4XthC1d4ckyebYwEtWuZO0nucCM", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeUOxWnqrDefQZi8PgarCi1oZd40iUDem-3Ga-62W7B9uaZpMfXXVl9SfRPgmNCFYlBjlWW56IGy_pqbO-FdmLXo_nqQca0FqOo-LVQn5xzB09JU0", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRGO_28W535adEPw3Cq1zrUQ9fip21lsuPafoDtbTbD8rEnIBnZcwEkUIqwAgNBqqLU5ntuRPXHU0OKr45_SVfGTDYRB83nzudGuyQpd4x0ITlF52A", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcS5CVDk95gkKYbGrFxRwYkKEkPXTnut3B_-KAXuP2RDhs_1pSYgjx08rZd_8I3cGu9M8jy-p6mWDhoBYbJlNRByhZMGbqbTh7IW5abtfKiSaMUx53U7", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRfzOKlcHk8k6zchfRr9Jn5QIa6JREy2wav2z8MXLK9VNWeMfnWelcecYVNhaO8wJ0iKwRswuxmSThRZCw1eZp4ylFsdNSgouEbSFEwFjUwmM8mZeu-", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQ2LIUEtAkaYZrdof_ncH1T3Qqx6XwbcIKf5Dree6ALdc661BOJg524uzYrEGAmkD11Lc4yDSlhkanMbzxY9IRL9Iimne1LKoXC9kWZLL2JC_TAXhXT", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBAQobIHGAQiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbEZNRmEzZ05TbUxQaE1lVzRhOUd3MktPcmM0Z3xBQ3Jtc0ttck5kdXFBMGlWc3E3aTh1UTc2UWV5YXJFeVozbkl3enV6bXJsZ3huRmgtaTFXcDdXcG1pVWgycWg1NzdEMDQ3bEdSMzVjRWFkQjVQWnVsQ3FyYmRNOUN2RGkzLS0yYW9VTFNISDFqYjg4enNwRWExWQ&q=http%3A%2F%2Fwww.facebook.com%2FEEVblog", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa0RwZWhBMnNUWXFPV2o3Rmt1NzRhQ3VEQjhhQXxBQ3Jtc0ttSTdTUDMtWlRlX28zUzJ5LXNidGt2YmFTV1ZWMWo0TUUwSnpOSHB4NUQ3MlNSMFU0Ui1xOGJfb1MzekhYTGt4T3puRFY5UG5FUDZyem5MQmpZeXc2RkNHX0E3dDVLN1VOdTdSbTBPaEtXR08ydnROVQ&q=http%3A%2F%2Fwww.facebook.com%2FEEVblog", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbEZNRmEzZ05TbUxQaE1lVzRhOUd3MktPcmM0Z3xBQ3Jtc0ttck5kdXFBMGlWc3E3aTh1UTc2UWV5YXJFeVozbkl3enV6bXJsZ3huRmgtaTFXcDdXcG1pVWgycWg1NzdEMDQ3bEdSMzVjRWFkQjVQWnVsQ3FyYmRNOUN2RGkzLS0yYW9VTFNISDFqYjg4enNwRWExWQ&q=http%3A%2F%2Fwww.facebook.com%2FEEVblog" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa0RwZWhBMnNUWXFPV2o3Rmt1NzRhQ3VEQjhhQXxBQ3Jtc0ttSTdTUDMtWlRlX28zUzJ5LXNidGt2YmFTV1ZWMWo0TUUwSnpOSHB4NUQ3MlNSMFU0Ui1xOGJfb1MzekhYTGt4T3puRFY5UG5FUDZyem5MQmpZeXc2RkNHX0E3dDVLN1VOdTdSbTBPaEtXR08ydnROVQ&q=http%3A%2F%2Fwww.facebook.com%2FEEVblog" } - }, - "title": { - "simpleText": "Facebook" - }, - "trackingParams": "CCMQobIHGAMiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcRY4no9kYJtEAHXBEY2GDprV__HH1zc94olyS6G6fT5isS71bPyqvIi7-9VE1MMy3_3vsNOQLAerwcSQqGNyADWfxKpd2hLc8HuacZdgEjgZc_WLN8" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CCIQobIHGAQiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "facebook.com/EEVblog" + }, + "title": { + "content": "Facebook" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcRY4no9kYJtEAHXBEY2GDprV__HH1zc94olyS6G6fT5isS71bPyqvIi7-9VE1MMy3_3vsNOQLAerwcSQqGNyADWfxKpd2hLc8HuacZdgEjgZc_WLN8", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcR3bOXx13RY_obv-voM2TlthNpZMagIsgiu8wV9zd57RK5F8fQRcX8ZEWdYeqOhdF9-f-phFxphm8gcg6O-DjRJTkWxXlK8N7CTfLdOA5lD_ThPvP4", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcQK5VoWBWTP7Ca7anSCgAxMQf1k1TanOES5v9d-Cvsi9IgVh1v8PELi_eaSU-gpcfF4RHtEteDc0sD6AznYZ_vg3GtGigex4dpmwp39A6Tpz34UyAg", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcSvLexm8CmfHe1mWIhDwUpNa8k4W7FcoaDZ06FA3L8eynFgpea0H8hnnXafsIzd3SSOVPaZrVIXgA0JtmGGApMNR2IWHH5CoLpYEwsNBlJefu9T8q8", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcTkqbHEhNZwnQSrMwokjIhrt0Znyf5tvA7NvjJhjRD3ciZSWNIhNYDVUZaAdALePpQ6nHQZcciA8m8C3xuM_FVBtRMDNakswvL8Zq07dbyikCXgjTo", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcSZFktJQ7FEgRVlbSuaa1asP7-PYreh8SgOHqwUSbvNQftPWbmYjFqQzBTg5IbiFTRONPscrGoHQamkRRCA-pH9oluygYrxjyKrQiZHKB2ZW060914", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcRWkaZm4SFATrThoHcIEbjkNod9w0wtEceD2y2CT7updp3wKpDpWpoTyhndKu49gRzzIJJR80T_OygsgIKZsrOLSwDUrratDfLhVpP_eX59hpxKL4M", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcRELoD6mOxIwfWGX_oINw_1Sla5T2wM9QR7lnwMC_eM5JVGu0XUxkJkGzcOtqKCYDwIjDQRLfLgV_dFdpxxaZGzZ0YUS9alEqzVDYbtc4yj88cPk8KB", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcTWpG-7KVv4rTjF6NvDiCm6IYxH6Ye_MndNVoQ6PICDpfPfbPgjb3HD9abahrUwwV_wD5oFjdxaRbWchddCSpxgdUUdt6trZbfIbv4TXkpP4pwsbS0q", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcQeYEn7J_6R4HhkWWEfFuyPIN4Fz9EWNsVKCSiKtM6rSbZqKHYn0KuxjptJmIxZl7ita5EkI9cuETexUPlSl6brI8VE5jqAWA7srAcLl1QpcboEx_70", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 44, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CA8QobIHGAUiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, @@ -327,246 +397,777 @@ "nofollow": true, "url": "https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ" } - }, - "title": { - "simpleText": "EEVdiscover" - }, - "trackingParams": "CCIQobIHGAQiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CCEQobIHGAUiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ" + }, + "title": { + "content": "EEVdiscover" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSRO3yoShMv5k2DaoKeuCUuLO7tqU2tq_5dmjuYm6jI5FVUVzAR3hzAYKXBLihGwpLTHHwvZytTudtTbT5BcynVneVmScYFWQD5YeySuJdm44lkuA", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRIUJbfp6w0pB_u9CGjMzaTsTI7tiSAdSGBA8Hf6zMS5vjmNxUZEU01jHbVZSLbD05OQVHJDuqOf3H2kubCIp5bt4C73Y3H4zbT64CPQBojEE0HKw", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSjc0VmcVmJs-FQFvHFOGGfCa1T2yvy_37_qvLeaEenpYij0Awawk3H_89y3FUOMQfYYoJgGEWOUeqSNiuP2HhWCepbiORY3nOV4rirtii6ZK0Okw", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcT69ZCUPz_NCxzzBSTaa3UsDtYstRJkHNQDosDuc6opuZoSNQyfeH7q70magR_sCmcOXrhlVt90kJaYfuaxaMinr4NvcvyxLvkxablKlWLUz3dNwQ", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRVbUVWS0NUsck5BjE03J5DCtX6Pddc7dbdTW-UfOYeh68FLygzZKr7m7aCt0gSW7BW1mNleXfBXdT3F2wLroI4OJCX2_hTEvzhpf7N4Vskdn_DvA", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIioE30qOAuAgsby1zHK_3DQ4OM1dudwAsAJeGgsL_t1-VgVsL325ZVzk6jUiMsAUCEIpoGeDm9dCRs6b0G1HTJ-TwMVsZ9TZh5sk0hyuaoUS-PQ", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcR4jzSwbUFOQnTnk8rdJjrsB83EHczjKxbbKin2Tzvn0-b-aphjcZNP6_ymFrDzQLic_m2agRA6_JWVrfZTRtmaEU2p9hUr-jy9ON_XmhCSm-8VBus", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTj0M93LmbNQ3X0LfHkLbS80j63DGUfWfQe-HjX-TgO0_h-ff1as0nlf11EZ2OLGra-LaVc4tuO_BR6xd8KoWcG566_zyyjB_rfC8zsNjUWcrZIZyc", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSe0igGE-TpaxmAu93lpaP5Mj8QreWzoqq-Egda_PGitzD3-ZOoO0bD5bpBFQDVjQnpOu2cEQOwJkohhaYiSJGk6bWt8MogG2OByyg624RjVHSbqoU", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 17, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CA4QobIHGAYiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa3lZaE8tLVBneVh2R3Z5TXplU2wzbUVRcVJ1Z3xBQ3Jtc0trQnl4NVltWkFDa3hXVUZzQ0o4UHo2dENwX3ZYaklNQzZNNDJrUFBtOVVFemVsSU4zaTd6UmZJYWRWck9mU0d1UEtZYXBQSUxkc1k0Zi1fU1BmQWVnY09NSU1KXzN1M2RsaDVnT1hsbHk0YmRLNWNlTQ&q=http%3A%2F%2Fwww.eevblog.com%2Fforum", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqblQ3NGhVMnR6R29DQkF4WDFDdHc1aE1sZkdmd3xBQ3Jtc0ttdHhMWk1aSjdaRE8zX3AtN0l2eXhhTXBiMXNLLTBtTFJaWTg1eS1PeGlGVHZ0cTdlc0dKUGFrNHJzUjA2RDU2bGFTVEZPZkEzaHV6aGduWWl6V25ETFhEMHhTYUZOUWZNckNIR3gtMVY1bzliYlFmbw&q=http%3A%2F%2Fwww.eevblog.com%2Fforum", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa3lZaE8tLVBneVh2R3Z5TXplU2wzbUVRcVJ1Z3xBQ3Jtc0trQnl4NVltWkFDa3hXVUZzQ0o4UHo2dENwX3ZYaklNQzZNNDJrUFBtOVVFemVsSU4zaTd6UmZJYWRWck9mU0d1UEtZYXBQSUxkc1k0Zi1fU1BmQWVnY09NSU1KXzN1M2RsaDVnT1hsbHk0YmRLNWNlTQ&q=http%3A%2F%2Fwww.eevblog.com%2Fforum" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqblQ3NGhVMnR6R29DQkF4WDFDdHc1aE1sZkdmd3xBQ3Jtc0ttdHhMWk1aSjdaRE8zX3AtN0l2eXhhTXBiMXNLLTBtTFJaWTg1eS1PeGlGVHZ0cTdlc0dKUGFrNHJzUjA2RDU2bGFTVEZPZkEzaHV6aGduWWl6V25ETFhEMHhTYUZOUWZNckNIR3gtMVY1bzliYlFmbw&q=http%3A%2F%2Fwww.eevblog.com%2Fforum" } - }, - "title": { - "simpleText": "The EEVblog Forum" - }, - "trackingParams": "CCEQobIHGAUiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CCAQobIHGAYiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "eevblog.com/forum" + }, + "title": { + "content": "The EEVblog Forum" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSRO3yoShMv5k2DaoKeuCUuLO7tqU2tq_5dmjuYm6jI5FVUVzAR3hzAYKXBLihGwpLTHHwvZytTudtTbT5BcynVneVmScYFWQD5YeySuJdm44lkuA", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRIUJbfp6w0pB_u9CGjMzaTsTI7tiSAdSGBA8Hf6zMS5vjmNxUZEU01jHbVZSLbD05OQVHJDuqOf3H2kubCIp5bt4C73Y3H4zbT64CPQBojEE0HKw", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSjc0VmcVmJs-FQFvHFOGGfCa1T2yvy_37_qvLeaEenpYij0Awawk3H_89y3FUOMQfYYoJgGEWOUeqSNiuP2HhWCepbiORY3nOV4rirtii6ZK0Okw", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcT69ZCUPz_NCxzzBSTaa3UsDtYstRJkHNQDosDuc6opuZoSNQyfeH7q70magR_sCmcOXrhlVt90kJaYfuaxaMinr4NvcvyxLvkxablKlWLUz3dNwQ", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRVbUVWS0NUsck5BjE03J5DCtX6Pddc7dbdTW-UfOYeh68FLygzZKr7m7aCt0gSW7BW1mNleXfBXdT3F2wLroI4OJCX2_hTEvzhpf7N4Vskdn_DvA", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIioE30qOAuAgsby1zHK_3DQ4OM1dudwAsAJeGgsL_t1-VgVsL325ZVzk6jUiMsAUCEIpoGeDm9dCRs6b0G1HTJ-TwMVsZ9TZh5sk0hyuaoUS-PQ", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcR4jzSwbUFOQnTnk8rdJjrsB83EHczjKxbbKin2Tzvn0-b-aphjcZNP6_ymFrDzQLic_m2agRA6_JWVrfZTRtmaEU2p9hUr-jy9ON_XmhCSm-8VBus", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTj0M93LmbNQ3X0LfHkLbS80j63DGUfWfQe-HjX-TgO0_h-ff1as0nlf11EZ2OLGra-LaVc4tuO_BR6xd8KoWcG566_zyyjB_rfC8zsNjUWcrZIZyc", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSe0igGE-TpaxmAu93lpaP5Mj8QreWzoqq-Egda_PGitzD3-ZOoO0bD5bpBFQDVjQnpOu2cEQOwJkohhaYiSJGk6bWt8MogG2OByyg624RjVHSbqoU", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 17, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CA0QobIHGAciEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbHY3a0x2WU5BMTJ0SmlqVEVVay1pMW9Jc2c2Z3xBQ3Jtc0tsYktFRk4xLXNJQ1NfZDZlcVZrSVN0QWlidjcxZEY2bFpSTWVGNTJIUXJGdkhDeEJMX2lFLTVBaHNXSXlvUTVQcUhTNUcwVUktRVJuUVdCc3Ftd2F5T3VNNnRfelYtR05ENGFPaTFHOGpuajh5YzlEQQ&q=http%3A%2F%2Fwww.eevblog.com%2Fmerch", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqblVUZlV5UzZ6TmZISGd4dm5Hb1d6X3h1RzRiQXxBQ3Jtc0ttbGU4anZXVnR2VlpYNFFlU2tqbldzVkFfZGVaTTQyaUhhbUhlMU1YYkU3TThjekh5UFRKWWxUOUNuTmxraEVLcWprZkVRRjVlNzl4UzByUHktY01NRTN6ODluSzNWR0U4UWp1NC1wWXNHdjI3TUkxQQ&q=http%3A%2F%2Fwww.eevblog.com%2Fmerch", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbHY3a0x2WU5BMTJ0SmlqVEVVay1pMW9Jc2c2Z3xBQ3Jtc0tsYktFRk4xLXNJQ1NfZDZlcVZrSVN0QWlidjcxZEY2bFpSTWVGNTJIUXJGdkhDeEJMX2lFLTVBaHNXSXlvUTVQcUhTNUcwVUktRVJuUVdCc3Ftd2F5T3VNNnRfelYtR05ENGFPaTFHOGpuajh5YzlEQQ&q=http%3A%2F%2Fwww.eevblog.com%2Fmerch" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqblVUZlV5UzZ6TmZISGd4dm5Hb1d6X3h1RzRiQXxBQ3Jtc0ttbGU4anZXVnR2VlpYNFFlU2tqbldzVkFfZGVaTTQyaUhhbUhlMU1YYkU3TThjekh5UFRKWWxUOUNuTmxraEVLcWprZkVRRjVlNzl4UzByUHktY01NRTN6ODluSzNWR0U4UWp1NC1wWXNHdjI3TUkxQQ&q=http%3A%2F%2Fwww.eevblog.com%2Fmerch" } - }, - "title": { - "simpleText": "EEVblog Merchandise (T-Shirts)" - }, - "trackingParams": "CCAQobIHGAYiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CB8QobIHGAciEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "eevblog.com/merch" + }, + "title": { + "content": "EEVblog Merchandise (T-Shirts)" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSRO3yoShMv5k2DaoKeuCUuLO7tqU2tq_5dmjuYm6jI5FVUVzAR3hzAYKXBLihGwpLTHHwvZytTudtTbT5BcynVneVmScYFWQD5YeySuJdm44lkuA", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRIUJbfp6w0pB_u9CGjMzaTsTI7tiSAdSGBA8Hf6zMS5vjmNxUZEU01jHbVZSLbD05OQVHJDuqOf3H2kubCIp5bt4C73Y3H4zbT64CPQBojEE0HKw", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSjc0VmcVmJs-FQFvHFOGGfCa1T2yvy_37_qvLeaEenpYij0Awawk3H_89y3FUOMQfYYoJgGEWOUeqSNiuP2HhWCepbiORY3nOV4rirtii6ZK0Okw", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcT69ZCUPz_NCxzzBSTaa3UsDtYstRJkHNQDosDuc6opuZoSNQyfeH7q70magR_sCmcOXrhlVt90kJaYfuaxaMinr4NvcvyxLvkxablKlWLUz3dNwQ", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRVbUVWS0NUsck5BjE03J5DCtX6Pddc7dbdTW-UfOYeh68FLygzZKr7m7aCt0gSW7BW1mNleXfBXdT3F2wLroI4OJCX2_hTEvzhpf7N4Vskdn_DvA", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIioE30qOAuAgsby1zHK_3DQ4OM1dudwAsAJeGgsL_t1-VgVsL325ZVzk6jUiMsAUCEIpoGeDm9dCRs6b0G1HTJ-TwMVsZ9TZh5sk0hyuaoUS-PQ", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcR4jzSwbUFOQnTnk8rdJjrsB83EHczjKxbbKin2Tzvn0-b-aphjcZNP6_ymFrDzQLic_m2agRA6_JWVrfZTRtmaEU2p9hUr-jy9ON_XmhCSm-8VBus", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTj0M93LmbNQ3X0LfHkLbS80j63DGUfWfQe-HjX-TgO0_h-ff1as0nlf11EZ2OLGra-LaVc4tuO_BR6xd8KoWcG566_zyyjB_rfC8zsNjUWcrZIZyc", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSe0igGE-TpaxmAu93lpaP5Mj8QreWzoqq-Egda_PGitzD3-ZOoO0bD5bpBFQDVjQnpOu2cEQOwJkohhaYiSJGk6bWt8MogG2OByyg624RjVHSbqoU", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 21, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAwQobIHGAgiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqblZ3bHNZVy11YW1IWjhHR0FIdEpQMVJoWVpOd3xBQ3Jtc0ttbnVFV2JHWnRBVUhLaE83WmpKZU4xYi1GVS0tSTVjYUtGck5zUkgyVl94VXQtakNYU0xsOER1SWdjcVhSVlQ0TWszUWNHT3pFNzVKVGZESzBRcGwwdVVlb1k2cm5LaklXcDBMN3NSdjZ5NTk5S2JGSQ&q=http%3A%2F%2Fwww.eevblog.com%2Fdonations%2F", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbkdmREdPTlIzY2pSZ2RfX1NvRTNzZVVncEdxUXxBQ3Jtc0tuQUlockhNQ2NDV2xhQkNoMWUyM2ZnU2Jac3NkZlVKR1RtV1gyNk1fRWVrLTJDY1JiUHloRGVIeGh0blhfamZTY0RhckdwSTF4elhjTkMtcmtGME9KYlhGRmtlQ3hKeUlKWWtCRDBCRGkwbnNQcTJYQQ&q=http%3A%2F%2Fwww.eevblog.com%2Fdonations%2F", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqblZ3bHNZVy11YW1IWjhHR0FIdEpQMVJoWVpOd3xBQ3Jtc0ttbnVFV2JHWnRBVUhLaE83WmpKZU4xYi1GVS0tSTVjYUtGck5zUkgyVl94VXQtakNYU0xsOER1SWdjcVhSVlQ0TWszUWNHT3pFNzVKVGZESzBRcGwwdVVlb1k2cm5LaklXcDBMN3NSdjZ5NTk5S2JGSQ&q=http%3A%2F%2Fwww.eevblog.com%2Fdonations%2F" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbkdmREdPTlIzY2pSZ2RfX1NvRTNzZVVncEdxUXxBQ3Jtc0tuQUlockhNQ2NDV2xhQkNoMWUyM2ZnU2Jac3NkZlVKR1RtV1gyNk1fRWVrLTJDY1JiUHloRGVIeGh0blhfamZTY0RhckdwSTF4elhjTkMtcmtGME9KYlhGRmtlQ3hKeUlKWWtCRDBCRGkwbnNQcTJYQQ&q=http%3A%2F%2Fwww.eevblog.com%2Fdonations%2F" } - }, - "title": { - "simpleText": "EEVblog Donations" - }, - "trackingParams": "CB8QobIHGAciEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRNePy1H3QW5dJzuE2mHt-ObVgw6hqhXf2AjZ0DoWRBGk1XNRiGO-okaP7raQeazic8D4yZgoYSQsT3WmYKNXCZf0rk6Pc4KqozGcSQDWt7jGXeYeA" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CB4QobIHGAgiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "eevblog.com/donations" + }, + "title": { + "content": "EEVblog Donations" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRNePy1H3QW5dJzuE2mHt-ObVgw6hqhXf2AjZ0DoWRBGk1XNRiGO-okaP7raQeazic8D4yZgoYSQsT3WmYKNXCZf0rk6Pc4KqozGcSQDWt7jGXeYeA", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSkFJt58idInfFAW7lrZ-6EfRiA3ThDqnAywUsJYr78mSnsfxQdWiv3tHor6qgINIu_Z7IrF-RMmKtCFPhz3-blesNh9xcotKUJv1PV4WNrBKESFCY", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcQO-SmPSHM8ETQwZDYhA4w265KjgTPxsXjE9aZpX_cQev3IpPohPRd3_GFziR3_l_kQ9uavjzUJqj2aR8MB-l4hFfT8eGv-HKRhExrkL1m0LCH-JIE", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRstfwnAaG4kF2cOJLSXbrTomU5vDwsOu6RuyY-uAmD0yM2p8Nfrp4Ycoccz_g8580M2qq6qLHXguC53YwiAIjJtl3pjX0rJKUjkyMeqhY8Sgn83qk", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTEshIGFGiBVLYGGP-t5xPGSeQ9bTSkyHDqXxcrOJTn4Wkg2lG0xzQqoJsOOGlFZLleG7WDXuMo4hcE5U-5F0nZkEo_Xtd1ovFIRgkZc1HjhMKLWlE", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcR4mq4xdRu9LRUZ2HzIIwJWwtxWhx3--EWTK9AebXRGFNBhvhTu_HdUKiHwgHsawcTKSgOz9C4FBktD3zY9FqFx_IGs82iO282qpUr5QaCD01J5RXU", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRIVNMFDnR4cqNqYXN0h9Nl5J-iSg_RfceC_ZBK5ST5BRGP9gCy7ghL7FTYks1tHusczalImHmcvqeIqE-Wx_UpTHwKtCB6mfGLg3EZ7xwH9iMEKxY", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSugACwO6xJT_J_s8qW2oIM6LwDHESwc6riWfaIuPf_7uloRpaWEJ3Kxa_yMu108U7DHkbXL5zMEut8-_G5RJ8kexXJa7mRRfY9YH59scKIbYsE_WER", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTkN-MU5mf_oxSQ6en8TSyVAqyiFyoVmqPdPSX3-4l4JkNY4xwXY2uuBXyR-OGRTeKFYNjlaL55opuJdsArK0PYd9afjUdJdVc9RrSwIFDkX9KWswRo", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcR4HPodwM-_foWK97KTrM0CQfu9jLcOjuGpZ7DoYWRPX1Rn7pfUmcPHvaWsABP-O8DoQ94LSBKXhhjyxtLExJEshdyoiYhrNxKFN0HbbtB5PTK1N50d", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 19, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAsQobIHGAkiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa3VOaGVjWmc4amtOdThCSGp3QXdQSkZYSWhQQXxBQ3Jtc0tsS29ENFZBRWJ1UkZCVUhTeWRIbWw2V1FKNnZGblJJZUhzRlRXaVd5NjNyakJXOWwtbzVIZTdLV3poYk4ya0djeXZwZi1BYnhYSjRUMHJtWkdNVzQya1AtQ0hDcGRCXzk2Tlpxa3dTVHdoNmZnNjR1dw&q=https%3A%2F%2Fwww.patreon.com%2Feevblog", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbVB6Z1dNMkdXMkstVUprZzRaZXpVczNld0p6QXxBQ3Jtc0tuZ3M2cEduTXBlR0oxOWxnSHhQcmQ4Vm5RRUlkdGNEOVRBWERQcC1JYzFXb0JLVGdMMTlra2FKaS16Q3Q2cGFrRUFrWEpvMzVxNGtlOEJXWnNHWUcwdFdFNHhnVmgxVTdaOWE5Y0lIOVpneUw3VVNfRQ&q=https%3A%2F%2Fwww.patreon.com%2Feevblog", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa3VOaGVjWmc4amtOdThCSGp3QXdQSkZYSWhQQXxBQ3Jtc0tsS29ENFZBRWJ1UkZCVUhTeWRIbWw2V1FKNnZGblJJZUhzRlRXaVd5NjNyakJXOWwtbzVIZTdLV3poYk4ya0djeXZwZi1BYnhYSjRUMHJtWkdNVzQya1AtQ0hDcGRCXzk2Tlpxa3dTVHdoNmZnNjR1dw&q=https%3A%2F%2Fwww.patreon.com%2Feevblog" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbVB6Z1dNMkdXMkstVUprZzRaZXpVczNld0p6QXxBQ3Jtc0tuZ3M2cEduTXBlR0oxOWxnSHhQcmQ4Vm5RRUlkdGNEOVRBWERQcC1JYzFXb0JLVGdMMTlra2FKaS16Q3Q2cGFrRUFrWEpvMzVxNGtlOEJXWnNHWUcwdFdFNHhnVmgxVTdaOWE5Y0lIOVpneUw3VVNfRQ&q=https%3A%2F%2Fwww.patreon.com%2Feevblog" } - }, - "title": { - "simpleText": "Patreon" - }, - "trackingParams": "CB4QobIHGAgiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcT-8_XQ6FFFUhxPG6nO8fXwP8nLrLo1gEtxRF_P1hQjbuDENZeK3-2W5bUaDp8oWDpP0PEdTBO5MsLEtmSucmSL0PMvOUOgYIWi8-_A7I9ANgBBhnemRCe8cOc" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CB0QobIHGAkiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "patreon.com/eevblog" + }, + "title": { + "content": "Patreon" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcT-8_XQ6FFFUhxPG6nO8fXwP8nLrLo1gEtxRF_P1hQjbuDENZeK3-2W5bUaDp8oWDpP0PEdTBO5MsLEtmSucmSL0PMvOUOgYIWi8-_A7I9ANgBBhnemRCe8cOc", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQx_Ds2OBT2_iejNv8KJMfq4SkGioo9jy-wKc8TTJoEVZ-4zeYMps-5_VwxENrzklDc_xyDKrrkiag_FRRbS9maYOaDY9poYU_Zxkj__ZDvP19XoITmGgUhFa4", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQWxtxRIq_f94D-jLf1Y5IiJgZvyLl62yUd3hQbogAA3SvF8CayVFdTenZniRJoSygkiNRt3a2k4-xjuEoTLYazE5DoFREU5NKMgHz6nP9LH0oaMlJA5vDvyms", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRn16r7E_WqC4BLd0LJCAb-K9KJDEroLRMKrXinMK5RPPzmGJLeDiXjZPkDpPgaURI15J9pnjzAGSypfYGWZ3XGMP3BCpyvmzsj9WuRrprhI2cxCpDmQnGWotg", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcTC7RINGwpFa5fJEITxaFkLuGfxdCs-uN_cdeJf5up9GHD9YeR5euLEikQibIikWp6Wtffbdjz2jflyrByVxWxgmTZU9UcXvmhy1MM75TBq12jy84StKI5f9F4", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRrWwAxDvDU4oXyhpGbSCTLk8cB6ym43sFuIMB-WWdX0eHbThFv5VhFdFPNUXozQEWzX9T_3_lPf2tinG41M4YI50HJW6eWiN4dzzvGQagSWSwHgcjYMXsWxAY", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcTlVSX75EriGP0NtQ8286O5U5i9uv0NoE5A6ZeIsKcym7G25kCXG3CPdfuZ2b4M55sM7R4pLQgRAeelK-mgRw2Ft4eDCdMs6Ube5qma--Z1HmUI1qzWNcw1_7M", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcTCVuC9skhEwVgfEz_zEcBHhG--SkHyEbnx5MYR-ZaQ83_rQTS67xJB97OPld4r5GQjTbBCVfR_P1ik6O8AbfVYbUe7XcSkv28q-GA22QkRNxaLsI5gYPmBcYHp", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQZSj3n8tVLdCF3U5Osf1QOr18Um6zHr7vT7wHSDZmWx01F4LTTfeYrbUDr22uxi_EwFSfwcbSRJPSgDJ1DuelyrZCLqarjzRNE5M945jSFcnUaKmRutqNQbgKv", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcQnb7Y6PZyo6rRTG0fcBXEpsU8fKhlcETqpth0usbgSOmOU5IWXTPbN7JHgvEL34uF9Kf8Si2SYW2S1L6rNHjmqwzN1WEKrtZRVEKxnwpeL6WrzeCoxoyGUzU8C", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 25, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAoQobIHGAoiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbW56T0MweUZyVVdFRmlpcUtJZ0VrZHFvbUZwZ3xBQ3Jtc0ttZEp5bnNtMWlSTHg3aVF1b19jV2hVYzZRQWtpbDdjcHB2OHd5VEZNRkxQY3hSeWZsN0pIVU94cnNSMjVGWjVJNTRHQVpaNmtfWnZaTEgzQmdQMk44S3pLWFFoRnVmbEwtLVViSmdjTjVpS1c4M1F2bw&q=https%3A%2F%2Fwww.subscribestar.com%2Feevblog", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbXZESU9oZ0dHV3lyQkwyTjlKeUgxQnZfdkU4UXxBQ3Jtc0tuMHAwVDdzWVpYbDFoYjh2VXFXQnJqRVp4STh2REI1ZFJfdFNYX1VodEV3em5BSWZ6NmdsM0JZRTFhckV2VDQ5U1ZzMHNVV3lRWllNVGZSdEUzQVJxTF94X2F5WlFid3R1ZnpDbFM4NkR5a0NCaWFwbw&q=https%3A%2F%2Fwww.subscribestar.com%2Feevblog", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbW56T0MweUZyVVdFRmlpcUtJZ0VrZHFvbUZwZ3xBQ3Jtc0ttZEp5bnNtMWlSTHg3aVF1b19jV2hVYzZRQWtpbDdjcHB2OHd5VEZNRkxQY3hSeWZsN0pIVU94cnNSMjVGWjVJNTRHQVpaNmtfWnZaTEgzQmdQMk44S3pLWFFoRnVmbEwtLVViSmdjTjVpS1c4M1F2bw&q=https%3A%2F%2Fwww.subscribestar.com%2Feevblog" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbXZESU9oZ0dHV3lyQkwyTjlKeUgxQnZfdkU4UXxBQ3Jtc0tuMHAwVDdzWVpYbDFoYjh2VXFXQnJqRVp4STh2REI1ZFJfdFNYX1VodEV3em5BSWZ6NmdsM0JZRTFhckV2VDQ5U1ZzMHNVV3lRWllNVGZSdEUzQVJxTF94X2F5WlFid3R1ZnpDbFM4NkR5a0NCaWFwbw&q=https%3A%2F%2Fwww.subscribestar.com%2Feevblog" } - }, - "title": { - "simpleText": "SubscribeStar" - }, - "trackingParams": "CB0QobIHGAkiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcQM5g9rHwU86NCDHZAnvIGK40lhLrquyZVKRCGft0DGiGrzrooBQXjgRtUY4xqEBgwe57w7ytbX7kUubPHTmsWL1wIqcW8XkaoYfuC4ENqJjMhOsX592A" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBwQobIHGAoiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "subscribestar.com/eevblog" + }, + "title": { + "content": "SubscribeStar" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcQM5g9rHwU86NCDHZAnvIGK40lhLrquyZVKRCGft0DGiGrzrooBQXjgRtUY4xqEBgwe57w7ytbX7kUubPHTmsWL1wIqcW8XkaoYfuC4ENqJjMhOsX592A", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTHn1LQ7DJ9GP6-kx3WqDehgU6X3diEby7pm3m7tuxwRjfkvkYRJQonfDkOg1wsF8q7v69sNt_KB3vG-QdImTndnLOf9pon12kvDJ9WUQy7X5_GfNqB3g", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRwkdSTNpWhCOTkjaMzCAt3Si4YzJgd3u8CnzI1Hv9al4HjNk6yjnRY119-4KvVEYsy078DAsLORPTGOmWPo6YIy6fh9KEsg_inciXHZmYmIcPn-4jD2A", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcT9mwjRi5BdPHzHHJdQCE1D2yqm11S6mIkcikM6rma9xpKXy-H8ujbsZCSxAGDzfb_yenr-yTzoDG4APeiBoAyeaKro2Cpz5GxA27k_khYqFvYVAewlqw", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTWhSVgHPXadIPDfYsrPeYIiE0ajUnIBUUr9eO1YCvTrWvmcRZqnkLnWZWCwl5OAjKxtCXBNcxoYsJX2S_eIKq_ipbGDEko6wlGWZjlZH5jRJj8WOaXsA", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcQZ00OGihD4ta9FqvsoTmgMqYRALOsSytUFgsbjHW6p-Pc7z8dMCcp4jQ-YKMAaWDz6lySlrfRFfhVv5IHXoIf34ALe6ZDM1mbWWrROzIyv0vpIu0khtg", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRAR6db3LScHfv_Z-ZWev0XcFjp_LKw34d3Mqe8It81AnkC4poW5Gd97c2XI1wHbnPper7pt0Xk3rT1zYt3dVATKcLztxkxRtgR7I6NakFXhBZYznawoQ", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTzjfPKAN6eeIYAqlR6bmpzdzs6Fo-s6kxApUegIbILaVHh3eD00dNhu6g_0N_YYEFsj2aPStFWnXk9OnvQTOqRLvxoU_KnnHQv8L7QrdyZQDUNxy8nnR0", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRzZvVZUWYdDdX3zY-_2lBwVj6CSjI_eeoz9-2LFFEQIP8Lp1TbjRl7vtmSzxyMdyGIGVgXp39Rg6BvPm5VOOxOvXLHPU5ctGeu1Q2R4uLNjAEjRsvouwo", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRPVnzDMmaa61TYzZ6dM0VI-IJJvYHYdH17apVgubfGbIEiPgNrEMvKmGZkHkv1WILzGLOj5CSE9A1Y6Tj4L-TVVQG0lILAhGvxeUm9yDpWEkPB7siXQJY", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 14, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAkQobIHGAsiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbF9Mb0tHaDVHSmlJSXNNaVZRVHFHRnR0Nl9MUXxBQ3Jtc0tuYTgxUlluQV9Ga0tra09Id3N4RndoRm9zTXlzYV9qT3JEMHJNQzJoVDFBd2EydlpTWUpXTGpfb19iU2xhT1YzVzFjd2NGb2NwQnBnckJfQ3ZxRWdPTV84dE1OOVhlV2FjWjdCX1JDenA4YnFOVEVVUQ&q=http%3A%2F%2Fwww.theamphour.com", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbmlnbTB1UWYwQUtabGpmRk9MTTdlRlh1Znkxd3xBQ3Jtc0trU2JGcDkxR01qWkRDUGxkWG5ZaVZudW4wdjBuOFVSN29HMWVva092TER4bHA2anFVQldMR2ZWOENNTjJYX3JDMG9UbzA1dVZTWXYyclRKR3A4cVgyYkNsZEdERUpnVTJWLXV1Z2VfVTFYMUYxNXJpRQ&q=http%3A%2F%2Fwww.theamphour.com", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbF9Mb0tHaDVHSmlJSXNNaVZRVHFHRnR0Nl9MUXxBQ3Jtc0tuYTgxUlluQV9Ga0tra09Id3N4RndoRm9zTXlzYV9qT3JEMHJNQzJoVDFBd2EydlpTWUpXTGpfb19iU2xhT1YzVzFjd2NGb2NwQnBnckJfQ3ZxRWdPTV84dE1OOVhlV2FjWjdCX1JDenA4YnFOVEVVUQ&q=http%3A%2F%2Fwww.theamphour.com" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbmlnbTB1UWYwQUtabGpmRk9MTTdlRlh1Znkxd3xBQ3Jtc0trU2JGcDkxR01qWkRDUGxkWG5ZaVZudW4wdjBuOFVSN29HMWVva092TER4bHA2anFVQldMR2ZWOENNTjJYX3JDMG9UbzA1dVZTWXYyclRKR3A4cVgyYkNsZEdERUpnVTJWLXV1Z2VfVTFYMUYxNXJpRQ&q=http%3A%2F%2Fwww.theamphour.com" } - }, - "title": { - "simpleText": "The AmpHour Radio Show" - }, - "trackingParams": "CBwQobIHGAoiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRnAk_yQ7EPRR2O8YSDZ2dxHZpw2jM7tVeWXkyrWjjZsD-p7OcxqNNuTKvuIuc0rT97_DrMTvP4x0mu4npuOrlZEJLkffDBAiHYCWdze4lZy3Lu" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBsQobIHGAsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "theamphour.com" + }, + "title": { + "content": "The AmpHour Radio Show" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRnAk_yQ7EPRR2O8YSDZ2dxHZpw2jM7tVeWXkyrWjjZsD-p7OcxqNNuTKvuIuc0rT97_DrMTvP4x0mu4npuOrlZEJLkffDBAiHYCWdze4lZy3Lu", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcS2v39Cz2redomM_MRpcWeiJhMBX_m5LGRTdfDAwCTK4QzDB2BobuJbVoH-8WJEY9HC9AGD_8aAkvtWF1RttXUoKqEM_fP0gN-KW5pZwoxQW_Y6", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTlqgb71UZeqq_dcaeTvAJI5YIycknY-Cg2QA2i4azpKpGC_yJaFSm_Sw2cLo4-RNsJm1LgjdvKc-wWnXLKar92lk4LIghb7gh9ANUMB8lKJ-ei", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcQqi8DUu5hiSn7gVFnqeVX4L3yOaeDkX1nBrm6kVJQpOh0KiXS4JU0cwRNNS69xBLmneEfV3UQY3le42pIybD5NyS379fICaVF4IbMIAyv6Q_rc", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRd9TtySlrjaXAVIsZfXmj0empOjoXNqc2Aps256b0_JsnZ724h6BEonhJTpf_eVw9W6l_Qbt90ItmQ1Jcbxq2E25v3VkK-LqbHHIiGsnE3Aw_Q", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTHTMDAq2Hs4hfxZEXEcwzDZPaj4rfrYVg1fWtOjh8rxuJH9otHFxcdHnkF4b2FgLcevsS5ER9zQ44eGwAvl9acgr4nJ7dzacmBbePrmmsBYp3v", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTeQ_-S2rnvk0BggjC8XrCPyrjO65gOQUbMWEdssWSX9DW7hIOyIDp4doSqAxiL-m8p6fN0Omi5jzFFgRHPJY1hX9QEeNuSkRuJywEx9ShQ36e3", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcTnO-_gki4Z5ygCIP3RMYYrAU6w4lrVxkmDP7swEgbx4u2meFaqAyqNaYpviT67uhMybneJ9PijGCdV3f_1iC-Vsl9FAYUnvR1Umo2fvEmSs0Roaw", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcQxW1XjlEyK8-xt5dKRJdhaRgFk53NvqEku3cqOLWxMjj0haCp62HCa0udaY1MomzUUn1p2ZfJAFyfGO29eQSDqsyI-ZMSk2_bRsT0LJIuJsbvw4Q", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcRj3IM5Qdg3pgYJHsDzBwxBJOBNLJzkqC2Q11A3iSEC-R7a6tNI56AjXmFzmdJqpCmoJlxurdH91pYZl24ofobMK1zWUNoiQ9jnmjOFV6o6082u2Q", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 25, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAgQobIHGAwiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa0dlTkt6c0Y3NXZSTGdhNHZ5TmpQbmNvSW12UXxBQ3Jtc0ttNDBjYjZtdnZpWDRXaXJJelB5bXltOXUwSGNFYTNaeFBHYXpqemZZTk9PajhaNnlEcHRwWE5qNGJRNFhhX2t6a1BmbmE2TW5LX0NuUHNrdFA4dXdySDlqR3ZtUXhaMFNRMkN4RDM0RWxaUVpIUXZLdw&q=http%3A%2F%2Fwww.flickr.com%2Fphotos%2Feevblog", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbFBXOGttUXNPRmdJc3hzT3dfSF9sdTJPUVE3QXxBQ3Jtc0trTG9YeXVnWmp3TnFibEoxeFI5SGdVYWhhOW84ZXBLODA1RlBsNTIzc2dlSUx1ZDVRakZVWk1vbUFrZ0Z3LXJTVEp4bVl5WER1dGVyNnpyNjVFV2dtVDVDdEZVdmxGMGZyLTJUUDZpa1pERU4yLVFOOA&q=http%3A%2F%2Fwww.flickr.com%2Fphotos%2Feevblog", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa0dlTkt6c0Y3NXZSTGdhNHZ5TmpQbmNvSW12UXxBQ3Jtc0ttNDBjYjZtdnZpWDRXaXJJelB5bXltOXUwSGNFYTNaeFBHYXpqemZZTk9PajhaNnlEcHRwWE5qNGJRNFhhX2t6a1BmbmE2TW5LX0NuUHNrdFA4dXdySDlqR3ZtUXhaMFNRMkN4RDM0RWxaUVpIUXZLdw&q=http%3A%2F%2Fwww.flickr.com%2Fphotos%2Feevblog" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbFBXOGttUXNPRmdJc3hzT3dfSF9sdTJPUVE3QXxBQ3Jtc0trTG9YeXVnWmp3TnFibEoxeFI5SGdVYWhhOW84ZXBLODA1RlBsNTIzc2dlSUx1ZDVRakZVWk1vbUFrZ0Z3LXJTVEp4bVl5WER1dGVyNnpyNjVFV2dtVDVDdEZVdmxGMGZyLTJUUDZpa1pERU4yLVFOOA&q=http%3A%2F%2Fwww.flickr.com%2Fphotos%2Feevblog" } - }, - "title": { - "simpleText": "Flickr" - }, - "trackingParams": "CBsQobIHGAsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIK5avaVK_PPYPc2I3QDvcmXC-GidHELAcxYo4dfKL8R-W2_Q-InaaYXGbq1PHHBdA9IYwpBXt9jPhUp85jdINIk0Q8Le1oZwpm_2BTK-aVU8W" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBoQobIHGAwiEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "flickr.com/photos/eevblog" + }, + "title": { + "content": "Flickr" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIK5avaVK_PPYPc2I3QDvcmXC-GidHELAcxYo4dfKL8R-W2_Q-InaaYXGbq1PHHBdA9IYwpBXt9jPhUp85jdINIk0Q8Le1oZwpm_2BTK-aVU8W", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRisXmS5JlxWqB1cLsKXo9Il5Xhhj2ADOIWBnQiBq62-2vbMLZJSfGWdNId2PA9NseGWv3KGQaQscjLM6WcPxiUnqvGOXKN_llQHlcq1nyb7B0T", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcTSy_vOUsDY1ZlvopAubkCsRzAxuoSn2FyRmyAjIoECPWF8pwtFEV0A0MwKFSEHS6jg2RKfXgYLCE5H711o9FEeuVCpvGkmx_G9NK--xW_uHkBb", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSmBeYG6OxzYEA9IOiHncjPDmVEMLrhzKvJx25CZBOokVcA4qik8JSrkH549lP-BkfWf9P0MKS0Jk9EiggFUhochk7TPyqNepiE0t97W7ovNTOO", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSvmdGN1F5Tko_EI9CpOCZ-CiCEdJ2kdnLpUbE4VmZ04VXYrSwJc60GzvPHbIUtTXnSAEhAdVS8LVuuOaARKbPty4jD2b2WztlF7deGtbalbYYU", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSj85gBCl8Cmquf6eisb7T_vSTdsfri1KFlK9j6E8cUIflsRyQQm4Jb3iTUkKqypcK87A6c5sJ6CrGSf9wqjJC_6kQbVmVecEPZri5dVBgjphP-", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcQ-gB2jMcMLJns0XSEF5rzdN35kItedMdWZv5g4D3fGXO9YSxIWlQ1uy1ayhh8IqAG43QfJHKiZIVj69C1oZvEDUqq2dGGtm3ZuGuwUMDU0V_Sa", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcT5pvRbc9NgaiO1j8Yek_2rEQC38uO5uecILIOWjK12x5HnJpQYHl_mxlOQianqBu_zjQBMm2ld9LSLAQ2jNRkfigUr70riVhrC4l12VTob5tykig", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcS-NlsldoBndXre9QOxc1sjxWJ-ptM2rh4WEmMks47DJdWLm5-Fc1gyfsCluxFYmE81rBcTz6Jd4XMHRb35XoRXNXpvkSBzFVNEH3uQjqTL7D4ygA", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcQDKmiwZhX5CAa7Edp7cx02xqj8YteB34PTgNAVVNytBFROEw_9XuVNA1gOLpfJKORRnOpfjqY5MHF9qct0pXl6wEc6GrPNHh9uCk9sidFNUl6tBw", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 118, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAcQobIHGA0iEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa2Ruc0trel90SDR6cDFCdXk3TWRQQ2U2Y3UwQXxBQ3Jtc0tsdFNaUmFwbGF1NktBczd5Q3RIbGdTcDRzOXdWclJYaEp2YmlvNjdOejJfaGk5cktZQ1BiVDNsVHQ0bHFyM213QzRXeUtwZ3NLeTB1WExzZktSTmY1TTBWYnhqNENnY2ZyUTVfS2ZWN0EwRzcyY0xkdw&q=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fredirect.html%3Fie%3DUTF8%26location%3Dhttp%253A%252F%252Fwww.amazon.com%252F%26tag%3Dee04-20%26linkCode%3Dur2%26camp%3D1789%26creative%3D390957", + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbW9Dem5XNVRTeDNYc0JiZXE4OUZDRXU2OEZPQXxBQ3Jtc0trNkR6RWxfYUJUUUU1ZHZaT1NiOVZHaHZRLVRjZmpTdTlzZjhncWtDRWRfNmJJT1RXMS1kQi1aMzNDMHNyQWx0QlpxQk00Mi1YN0h5NE1kZHhsWlZyNFlqTlpkQ3licjB4b0w4RTRDRThBMW9aVkh6Yw&q=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fredirect.html%3Fie%3DUTF8%26location%3Dhttp%253A%252F%252Fwww.amazon.com%252F%26tag%3Dee04-20%26linkCode%3Dur2%26camp%3D1789%26creative%3D390957", "webPageType": "WEB_PAGE_TYPE_UNKNOWN" } }, "urlEndpoint": { "nofollow": true, "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqa2Ruc0trel90SDR6cDFCdXk3TWRQQ2U2Y3UwQXxBQ3Jtc0tsdFNaUmFwbGF1NktBczd5Q3RIbGdTcDRzOXdWclJYaEp2YmlvNjdOejJfaGk5cktZQ1BiVDNsVHQ0bHFyM213QzRXeUtwZ3NLeTB1WExzZktSTmY1TTBWYnhqNENnY2ZyUTVfS2ZWN0EwRzcyY0xkdw&q=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fredirect.html%3Fie%3DUTF8%26location%3Dhttp%253A%252F%252Fwww.amazon.com%252F%26tag%3Dee04-20%26linkCode%3Dur2%26camp%3D1789%26creative%3D390957" + "url": "https://www.youtube.com/redirect?event=channel_description&redir_token=QUFFLUhqbW9Dem5XNVRTeDNYc0JiZXE4OUZDRXU2OEZPQXxBQ3Jtc0trNkR6RWxfYUJUUUU1ZHZaT1NiOVZHaHZRLVRjZmpTdTlzZjhncWtDRWRfNmJJT1RXMS1kQi1aMzNDMHNyQWx0QlpxQk00Mi1YN0h5NE1kZHhsWlZyNFlqTlpkQ3licjB4b0w4RTRDRThBMW9aVkh6Yw&q=http%3A%2F%2Fwww.amazon.com%2Fgp%2Fredirect.html%3Fie%3DUTF8%26location%3Dhttp%253A%252F%252Fwww.amazon.com%252F%26tag%3Dee04-20%26linkCode%3Dur2%26camp%3D1789%26creative%3D390957" } - }, - "title": { - "simpleText": "EEVblog AMAZON Store" - }, - "trackingParams": "CBoQobIHGAwiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + } }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeGSb_XctA25lE585p4Y1gzQGccBu6OcsQiaOYtMv9dElpdpPFW4MYRTO7v8N1BcnPcQxrWkcJ7N6BVSj0k5sUwpGD7MI3S-Aiyghi8eF8Zy2_7Q" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBkQobIHGA0iEwjQl_Lpj676AhXF6FEKHcpNBwM=", + "startIndex": 0 + } + ], + "content": "amazon.com/gp/redirect.html?ie=UTF8&location=http://www.amazon.com/&tag=ee04-20&linkCode=ur2&camp=1789&creative=390957" + }, + "title": { + "content": "EEVblog AMAZON Store" + } + } + }, + { + "channelExternalLinkViewModel": { + "favicon": { + "sources": [ + { + "height": 16, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeGSb_XctA25lE585p4Y1gzQGccBu6OcsQiaOYtMv9dElpdpPFW4MYRTO7v8N1BcnPcQxrWkcJ7N6BVSj0k5sUwpGD7MI3S-Aiyghi8eF8Zy2_7Q", + "width": 16 + }, + { + "height": 24, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcQQLBJqOEi7zWd3visSSBE3evcrUHsXyOsKf4FLg-smeevDxkoJP1dvIzL62wLPJNJ36XjjwClKASh1rqiMqOlQD90yHq2iFE7XHT_dL2_5SVglYQ", + "width": 24 + }, + { + "height": 32, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcTIpDkH-J1bfPjmxtW3L3ILo13ECM9jWfnEYH-wqrdBL-hRWzffwxWgaB6kLb6kxSzZ-CD9t7A66POdDIOsX0DVr6_p6RBADn_1-SJE4A73YM91VA", + "width": 32 + }, + { + "height": 48, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRzc99cQVO6xVjKEdu1y7UE7ht3yMh9XSpPSWUdKDTn-71Lhwv33Q2GrE9Nkacy-1HhbLTE0F5j-E3FV6o-YLUGOVJCdxWxi8A2H31E8M3XCollzQ", + "width": 48 + }, + { + "height": 50, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcQ3A1bUDh4-Rn1SaDBtRVDsNjk91MJdr1-vazJeAQI-GyKaDzuWLm5B5yzey2z1jkDDOHQZlHxa_TRK5EhMffiJQNe_EI3X9oU6DywxpdKm4iVKuw", + "width": 50 + }, + { + "height": 64, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcTcDD9ryu_atYv6cC51QyiLmHXA9skhB2zpqBz_fNfd-er9h-itB-qFqVeM5BpAba7d_l4yKjb5SNm8c9sSSSSaLRhNDnYNmdkze5ALC7A4PqW5ug", + "width": 64 + }, + { + "height": 96, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRKuF-3mWxkjP0YduQskxF7LUnbHZdcExwkoB7dHGXaw7_nIsB-3YaiLdq2yz3o3p5id6dI9KcPXNIh-8w7UGjapkhHSoaWihSJQXKo9NU7Cyxznw", + "width": 96 + }, + { + "height": 128, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcQ3NBhasd9pD3Uieof1sAMQh7_XHmfuSAsDl5Pi1rSmLYq-dgdXdasEU8oMtlv5SBxYsStFlbyFjF2y9ppnvEVBcxmCRFW8hQvaXtq-2JqF7tiTihs", + "width": 128 + }, + { + "height": 180, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSRgk_B4Ct3SFPG6Ch7UuUR_AGpMd9AMNoB5Du6lrOzn7wvkWQODs3WeKul2WnmmXeO8v5u0FvL8p9YMYM1t-U6AJ3S6ObPkhes289sYbuxUMTD0Vk", + "width": 180 + }, + { + "height": 256, + "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcRYr9W0zqO0yJyLRQSk8SGuwnZ_38Mc5EAi4s5BAOJEEexIPuUZYhFoUzwMmaUSyRCKmUX_ZUaM8sTGLZEHx4TWsEtCtdw_jEjNItIGHR8dQRZQhYo", + "width": 256 + } + ] + }, + "link": { + "commandRuns": [ + { + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAYQobIHGA4iEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { "rootVe": 83769, @@ -578,1198 +1179,218 @@ "nofollow": true, "url": "http://www.youtube.com/EEVblog2" } - }, - "title": { - "simpleText": "2nd EEVblog Channel" - }, - "trackingParams": "CBkQobIHGA0iEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - ], - "primaryLinksLabel": { - "runs": [ - { - "text": "Links" } - ] + }, + "startIndex": 0 + } + ], + "content": "youtube.com/EEVblog2" + }, + "title": { + "content": "2nd EEVblog Channel" + } + } + } + ], + "signInForBusinessEmail": { + "commandRuns": [ + { + "length": 7, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CAAQhGciEwis363HrqiCAxWfHwYAHc0nDmw=", + "commandMetadata": { + "webCommandMetadata": { + "rootVe": 83769, + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252F%2540EEVblog&hl=en", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN" + } }, - "showDescription": true, - "signInForBusinessEmail": { - "runs": [ - { - "navigationEndpoint": { - "clickTrackingParams": "CBgQuy8YACITCNCX8umPrvoCFcXoUQodyk0HAw==", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fc%252FEevblogDave%252Fabout&hl=en", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "signInEndpoint": { - "nextEndpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EgVhYm91dA%3D%3D" - }, - "clickTrackingParams": "CBgQuy8YACITCNCX8umPrvoCFcXoUQodyk0HAw==", + "signInEndpoint": { + "nextEndpoint": { + "browseEndpoint": { + "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", + "canonicalBaseUrl": "/@EEVblog", + "params": "8gYECgIyAA%3D%3D" + }, + "clickTrackingParams": "CAAQhGciEwis363HrqiCAxWfHwYAHc0nDmw=", + "commandMetadata": { + "webCommandMetadata": { + "apiUrl": "/youtubei/v1/browse", + "rootVe": 3611, + "url": "/@EEVblog", + "webPageType": "WEB_PAGE_TYPE_CHANNEL" + } + } + } + } + } + }, + "startIndex": 0 + } + ], + "content": "Sign in to see email address", + "styleRuns": [ + { + "length": 28, + "startIndex": 0 + } + ] + }, + "subscriberCountText": "920K subscribers", + "videoCountText": "1,920 videos", + "viewCountText": "199,087,682 views" + } + }, + "shareChannel": { + "buttonRenderer": { + "accessibilityData": { + "accessibilityData": { + "label": "Share" + } + }, + "command": { + "clickTrackingParams": "CAEQ8FsiEwis363HrqiCAxWfHwYAHc0nDmw=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "actions": [ + { + "clickTrackingParams": "CAEQ8FsiEwis363HrqiCAxWfHwYAHc0nDmw=", + "openPopupAction": { + "popup": { + "menuPopupRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "command": { + "clickTrackingParams": "CAQQ0rYLGAEiEwis363HrqiCAxWfHwYAHc0nDmw=", "commandMetadata": { "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/about", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" + "apiUrl": "/youtubei/v1/share/get_share_panel", + "sendPost": true } + }, + "shareEntityServiceEndpoint": { + "commands": [ + { + "clickTrackingParams": "CAQQ0rYLGAEiEwis363HrqiCAxWfHwYAHc0nDmw=", + "openPopupAction": { + "beReused": true, + "popup": { + "unifiedSharePanelRenderer": { + "showLoadingSpinner": true, + "trackingParams": "CAUQjmIiEwis363HrqiCAxWfHwYAHc0nDmw=" + } + }, + "popupType": "DIALOG" + } + } + ], + "serializedShareEntity": "GhhVQzJEakZFN1hmMTFVUlpxV0JpZ2NWT1E%3D" } - } + }, + "text": { + "runs": [ + { + "text": "Share channel" + } + ] + }, + "trackingParams": "CAQQ0rYLGAEiEwis363HrqiCAxWfHwYAHc0nDmw=" } }, - "text": "Sign in" - }, - { - "text": " to see email address" - } - ] + { + "menuServiceItemRenderer": { + "command": { + "clickTrackingParams": "CAIQ07YLGAIiEwis363HrqiCAxWfHwYAHc0nDmw=", + "copyTextEndpoint": { + "successActions": [ + { + "clickTrackingParams": "CAIQ07YLGAIiEwis363HrqiCAxWfHwYAHc0nDmw=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "actions": [ + { + "clickTrackingParams": "CAIQ07YLGAIiEwis363HrqiCAxWfHwYAHc0nDmw=", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "runs": [ + { + "text": "Channel ID copied to clipboard" + } + ] + }, + "trackingParams": "CAMQuWoiEwis363HrqiCAxWfHwYAHc0nDmw=" + } + }, + "popupType": "TOAST" + } + } + ], + "signal": "CLIENT_SIGNAL" + } + } + ], + "text": "UC2DjFE7Xf11URZqWBigcVOQ" + } + }, + "text": { + "runs": [ + { + "text": "Copy channel ID" + } + ] + }, + "trackingParams": "CAIQ07YLGAIiEwis363HrqiCAxWfHwYAHc0nDmw=" + } + } + ] + } }, - "statsLabel": { - "runs": [ - { - "text": "Stats" - } - ] - }, - "title": { - "simpleText": "EEVblog" - }, - "viewCountText": { - "simpleText": "186,854,342 views" - } + "popupType": "RESPONSIVE_DROPDOWN" } } ], - "trackingParams": "CBgQuy8YACITCNCX8umPrvoCFcXoUQodyk0HAw==" - } - } - ], - "disablePullToRefresh": true, - "trackingParams": "CBcQui8iEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EgVhYm91dPIGBAoCEgA%3D" - }, - "clickTrackingParams": "CBYQ8JMBGAsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/about", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "selected": true, - "title": "About", - "trackingParams": "CBYQ8JMBGAsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "expandableTabRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EgZzZWFyY2jyBgQKAloA" - }, - "clickTrackingParams": "CAAQhGciEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/search", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "selected": false, - "title": "Search" - } - } - ] - } - }, - "header": { - "c4TabbedHeaderRenderer": { - "avatar": { - "thumbnails": [ - { - "height": 48, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s48-c-k-c0x00ffffff-no-rj", - "width": 48 - }, - { - "height": 88, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s88-c-k-c0x00ffffff-no-rj", - "width": 88 - }, - { - "height": 176, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s176-c-k-c0x00ffffff-no-rj", - "width": 176 - } - ] - }, - "badges": [ - { - "metadataBadgeRenderer": { - "accessibilityData": { - "label": "Verified" - }, - "icon": { - "iconType": "CHECK_CIRCLE_THICK" - }, - "style": "BADGE_STYLE_TYPE_VERIFIED", - "tooltip": "Verified", - "trackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - } - ], - "banner": { - "thumbnails": [ - { - "height": 175, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - "width": 1060 - }, - { - "height": 188, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - "width": 1138 - }, - { - "height": 283, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1707-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - "width": 1707 - }, - { - "height": 351, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - "width": 2120 - }, - { - "height": 377, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2276-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - "width": 2276 - }, - { - "height": 424, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", - "width": 2560 - } - ] - }, - "channelId": "UC2DjFE7Xf11URZqWBigcVOQ", - "headerLinks": { - "channelHeaderLinksRenderer": { - "primaryLinks": [ - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbUZRdjQ1dHlkMWJjdDRoRHNGcDNBaGpiRTJDZ3xBQ3Jtc0tuSVJrXzlCS2lRRXo0dEozRmx3cXhzY1pKcld5ajBHZmRtNm93TnAwUEs4ZUUtMFE0a3dNQXFHVThGNGwyYW4ycWRGamZXOEstQ0VEUTNReVNuT2hyclVkeXN0WnVBM3RHbzJxaGh2SzhoSzlWUlpDcw&q=http%3A%2F%2Fwww.eevblog.com", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "urlEndpoint": { - "nofollow": true, - "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbUZRdjQ1dHlkMWJjdDRoRHNGcDNBaGpiRTJDZ3xBQ3Jtc0tuSVJrXzlCS2lRRXo0dEozRmx3cXhzY1pKcld5ajBHZmRtNm93TnAwUEs4ZUUtMFE0a3dNQXFHVThGNGwyYW4ycWRGamZXOEstQ0VEUTNReVNuT2hyclVkeXN0WnVBM3RHbzJxaGh2SzhoSzlWUlpDcw&q=http%3A%2F%2Fwww.eevblog.com" - } - }, - "title": { - "simpleText": "EEVblog Web Site" - } - } - ], - "secondaryLinks": [ - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn1.gstatic.com/favicon-tbn?q=tbn:ANd9GcSnyfGgzwnk19b891nCqykpMzr3jlkKm0Z65gNVJbtXsk9-gzW5EiqqEvM02nZyYKmI2x1JQI9OuGsWU69bgq9_rNrHCYrXLP6HqhP9iVwr0bm2IQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbTdwZlF0dFZiNGlBWnRydFNTY2RmaVZRbk9qZ3xBQ3Jtc0trSFRFcnE5bFNTQ0VocEdmNTE5Rks0Yng2WHV1TGR4R01CczM1RndsdjNuTExDUWNDeVc3TXlFMEpEc3ZpYXZTejRaZG1XQUZjd01rN3Q3cWwwcEdCNjNrUE9xc3JZUDZqM1lIUHlBbV9FenhJU1kxUQ&q=http%3A%2F%2Fwww.twitter.com%2Feevblog", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "urlEndpoint": { - "nofollow": true, - "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbTdwZlF0dFZiNGlBWnRydFNTY2RmaVZRbk9qZ3xBQ3Jtc0trSFRFcnE5bFNTQ0VocEdmNTE5Rks0Yng2WHV1TGR4R01CczM1RndsdjNuTExDUWNDeVc3TXlFMEpEc3ZpYXZTejRaZG1XQUZjd01rN3Q3cWwwcEdCNjNrUE9xc3JZUDZqM1lIUHlBbV9FenhJU1kxUQ&q=http%3A%2F%2Fwww.twitter.com%2Feevblog" - } - }, - "title": { - "simpleText": "Twitter" - } - }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn3.gstatic.com/favicon-tbn?q=tbn:ANd9GcRmQS0-yT-68TopCQcxwbvtkTB0rdiUtc7g4WFZBVWFT4tJ8tSTon4n5uCmm9_b69_7bgTNZNmFw3-zyF-kWNXXZJEBTm_-r1qZrKLyDfCYxiEXY50" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbGtDd3d0T2ltbkxFTVRaT3lBOUtKTHRPaEZTQXxBQ3Jtc0tuR0FkTG5ZOUhrLXhUQjdXU0tWeV95WWZyRzZFcEN6TkVGbU9OSFpETGkyNjU2a2xiS1o3Um5UVEVPWFNKYS00WFBFMTN6aHdmNGZQOTg4V1Z3T00tVG03ZWdyR3dsZ0ZHXzlCRlBQZTdTY2hiNGJBRQ&q=http%3A%2F%2Fwww.facebook.com%2FEEVblog", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "urlEndpoint": { - "nofollow": true, - "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqbGtDd3d0T2ltbkxFTVRaT3lBOUtKTHRPaEZTQXxBQ3Jtc0tuR0FkTG5ZOUhrLXhUQjdXU0tWeV95WWZyRzZFcEN6TkVGbU9OSFpETGkyNjU2a2xiS1o3Um5UVEVPWFNKYS00WFBFMTN6aHdmNGZQOTg4V1Z3T00tVG03ZWdyR3dsZ0ZHXzlCRlBQZTdTY2hiNGJBRQ&q=http%3A%2F%2Fwww.facebook.com%2FEEVblog" - } - }, - "title": { - "simpleText": "Facebook" - } - }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn0.gstatic.com/favicon-tbn?q=tbn:ANd9GcRY4no9kYJtEAHXBEY2GDprV__HH1zc94olyS6G6fT5isS71bPyqvIi7-9VE1MMy3_3vsNOQLAerwcSQqGNyADWfxKpd2hLc8HuacZdgEjgZc_WLN8" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "urlEndpoint": { - "nofollow": true, - "url": "https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ" - } - }, - "title": { - "simpleText": "EEVdiscover" - } - }, - { - "icon": { - "thumbnails": [ - { - "url": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn:ANd9GcSeeYHqSanvu-1kS8-j8snFjPciLtknpI1FBXBB6ChDhHFlCRCjevwoP5AOW1u3m9HaeGexWOI4DJeisvRR1YK_jsARgDOrkbO3qWsfWQFxBaEkSQ" - } - ] - }, - "navigationEndpoint": { - "clickTrackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqa3BMOGVzZmd3TzJ0dzdrV0xYdEIyLTZ5a0NXd3xBQ3Jtc0trdHRYRWxaMmxzV0E2Ymw1THp3SDBoRUNhY0ZTeVlCV2t6WWJCckxQc1dwdXlfakRCeFZfa2tLazF0OUtOUmZWemFKYlFjYXV6T0p4VV9xNG1CRFpjcXJnenRneHpMQmhpZHNmRDY4ZExvNWxaQWFWZw&q=http%3A%2F%2Fwww.eevblog.com%2Fforum", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "urlEndpoint": { - "nofollow": true, - "target": "TARGET_NEW_WINDOW", - "url": "https://www.youtube.com/redirect?event=channel_banner&redir_token=QUFFLUhqa3BMOGVzZmd3TzJ0dzdrV0xYdEIyLTZ5a0NXd3xBQ3Jtc0trdHRYRWxaMmxzV0E2Ymw1THp3SDBoRUNhY0ZTeVlCV2t6WWJCckxQc1dwdXlfakRCeFZfa2tLazF0OUtOUmZWemFKYlFjYXV6T0p4VV9xNG1CRFpjcXJnenRneHpMQmhpZHNmRDY4ZExvNWxaQWFWZw&q=http%3A%2F%2Fwww.eevblog.com%2Fforum" - } - }, - "title": { - "simpleText": "The EEVblog Forum" - } - } - ] - } - }, - "mobileBanner": { - "thumbnails": [ - { - "height": 88, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - "width": 320 - }, - { - "height": 175, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w640-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - "width": 640 - }, - { - "height": 263, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w960-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - "width": 960 - }, - { - "height": 351, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - "width": 1280 - }, - { - "height": 395, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1440-fcrop64=1,32b75a57cd48a5a8-k-c0xffffffff-no-nd-rj", - "width": 1440 - } - ] - }, - "navigationEndpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave" - }, - "clickTrackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - }, - "sponsorButton": { - "buttonRenderer": { - "accessibilityData": { - "accessibilityData": { - "label": "Join this channel" - } - }, - "hint": { - "hintRenderer": { - "dwellTimeMs": "60000", - "hintCap": { - "impressionCap": "1" - }, - "hintId": "sponsor-pre-purchase", - "trackingParams": "CBIQpecFIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "isDisabled": false, - "navigationEndpoint": { - "clickTrackingParams": "CBEQqGAiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "ignoreNavigation": true - } - }, - "modalEndpoint": { - "modal": { - "modalWithTitleAndButtonRenderer": { - "button": { - "buttonRenderer": { - "isDisabled": false, - "navigationEndpoint": { - "clickTrackingParams": "CBMQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fbrowse%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "signInEndpoint": { - "hack": true - } - }, - "size": "SIZE_DEFAULT", - "style": "STYLE_BRAND", - "text": { - "simpleText": "Sign in" - }, - "trackingParams": "CBMQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" + "signal": "CLIENT_SIGNAL" } }, - "content": { + "icon": { + "iconType": "SHARE" + }, + "size": "SIZE_DEFAULT", + "style": "STYLE_DEFAULT", + "text": { "runs": [ { - "text": "Sign in to become a member." + "text": "Share channel" } ] }, - "title": { - "runs": [ - { - "text": "Want to join this channel?" - } - ] - } + "trackingParams": "CAEQ8FsiEwis363HrqiCAxWfHwYAHc0nDmw=" } } } - }, - "size": "SIZE_DEFAULT", - "style": "STYLE_SUGGESTIVE", - "targetId": "sponsorships-button", - "text": { - "runs": [ - { - "text": "Join" - } - ] - }, - "trackingParams": "CBEQqGAiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "subscribeButton": { - "buttonRenderer": { - "isDisabled": false, - "navigationEndpoint": { - "clickTrackingParams": "CBQQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "ignoreNavigation": true - } - }, - "modalEndpoint": { - "modal": { - "modalWithTitleAndButtonRenderer": { - "button": { - "buttonRenderer": { - "isDisabled": false, - "navigationEndpoint": { - "clickTrackingParams": "CBUQ_YYEIhMI0Jfy6Y-u-gIVxehRCh3KTQcDMglzdWJzY3JpYmU=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fc%252FEevblogDave%252Fabout%26continue_action%3DQUFFLUhqbXowa0I5U2RLaG1pZTNLakhsbk1mUXRnODAxUXxBQ3Jtc0tuQXVsdjY1RTMybnVMT1lfNEQtMm5ZVWctZ2Y5dWxzc2RqQzlseHVpOXE3dExXUmI2YUZGalJuZVdZV2VHZjNDMFI5eVVwOHg5R09sSDVfRHA4RFg3YjF5YzBkSE83T0ZMUXZLLUV5X2Y1QklIb2k2TlNaRTlVZXRnSHNqRUN2czg2RGtBZWdSNmRUNy1xZnFhTGx5YkdXR294QU9wdmZYQUE0bTBBLU9hQkp1Smh3STdCYnltSS1ONUZjc3pBazVPNkFsZklmdXJBU19YcXJTVFo1SGhpTFQ5TFJB&hl=en&ec=66429", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "signInEndpoint": { - "continueAction": "QUFFLUhqbXowa0I5U2RLaG1pZTNLakhsbk1mUXRnODAxUXxBQ3Jtc0tuQXVsdjY1RTMybnVMT1lfNEQtMm5ZVWctZ2Y5dWxzc2RqQzlseHVpOXE3dExXUmI2YUZGalJuZVdZV2VHZjNDMFI5eVVwOHg5R09sSDVfRHA4RFg3YjF5YzBkSE83T0ZMUXZLLUV5X2Y1QklIb2k2TlNaRTlVZXRnSHNqRUN2czg2RGtBZWdSNmRUNy1xZnFhTGx5YkdXR294QU9wdmZYQUE0bTBBLU9hQkp1Smh3STdCYnltSS1ONUZjc3pBazVPNkFsZklmdXJBU19YcXJTVFo1SGhpTFQ5TFJB", - "idamTag": "66429", - "nextEndpoint": { - "browseEndpoint": { - "browseId": "UC2DjFE7Xf11URZqWBigcVOQ", - "canonicalBaseUrl": "/c/EevblogDave", - "params": "EgVhYm91dA%3D%3D" - }, - "clickTrackingParams": "CBUQ_YYEIhMI0Jfy6Y-u-gIVxehRCh3KTQcD", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3611, - "url": "/c/EevblogDave/about", - "webPageType": "WEB_PAGE_TYPE_CHANNEL" - } - } - } - } - }, - "size": "SIZE_DEFAULT", - "style": "STYLE_BLUE_TEXT", - "text": { - "simpleText": "Sign in" - }, - "trackingParams": "CBUQ_YYEIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "content": { - "simpleText": "Sign in to subscribe to this channel." - }, - "title": { - "simpleText": "Want to subscribe to this channel?" - } - } - } - } - }, - "size": "SIZE_DEFAULT", - "style": "STYLE_DESTRUCTIVE", - "text": { - "runs": [ - { - "text": "Subscribe" - } - ] - }, - "trackingParams": "CBQQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "subscriberCountText": { - "accessibility": { - "accessibilityData": { - "label": "881K subscribers" } - }, - "simpleText": "881K subscribers" + ], + "targetId": "12fccb1f-991a-1fd4-7e2e-a178c39b58d1" }, - "title": "EEVblog", - "trackingParams": "CBAQ8DsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "tvBanner": { - "thumbnails": [ - { - "height": 180, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w320-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - "width": 320 - }, - { - "height": 480, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w854-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - "width": 854 - }, - { - "height": 720, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1280-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - "width": 1280 - }, - { - "height": 1080, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w1920-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - "width": 1920 - }, - { - "height": 1192, - "url": "https://yt3.ggpht.com/yIJ9ad80n49rK-YUcZLe_8bLmR-aGyg5ybDH_XKIc0GDWrC6s1Wzz8lxnq3_hux_5b6NHPZ9=w2120-fcrop64=1,00000000ffffffff-k-c0xffffffff-no-nd-rj", - "width": 2120 - } - ] - }, - "visitTracking": { - "remarketingPing": "https://www.youtube.com/pagead/viewthroughconversion/962985656/?backend=innertube&cname=1&cver=2_20220921_08_00&foc_id=2DjFE7Xf11URZqWBigcVOQ&label=followon_cvisit&ptype=no_rmkt&utuid=2DjFE7Xf11URZqWBigcVOQ" - } + "clickTrackingParams": "CAAQhGciEwis363HrqiCAxWfHwYAHc0nDmw=" } - }, - "metadata": { - "channelMetadataRenderer": { - "androidAppindexingLink": "android-app://com.google.android.youtube/http/www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ", - "androidDeepLink": "android-app://com.google.android.youtube/http/www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ", - "availableCountryCodes": [ - "LV", - "IE", - "OM", - "PF", - "IS", - "RS", - "SB", - "TR", - "ML", - "KY", - "TM", - "DK", - "TJ", - "GS", - "BT", - "AF", - "BA", - "HN", - "LC", - "SK", - "ZA", - "MZ", - "CY", - "MY", - "UY", - "GD", - "NC", - "CI", - "CM", - "GI", - "CC", - "QA", - "TV", - "BD", - "LB", - "SS", - "SY", - "MX", - "NL", - "SV", - "LS", - "GW", - "NI", - "VG", - "NP", - "HT", - "UG", - "AS", - "YE", - "KG", - "NO", - "MK", - "RE", - "BQ", - "ES", - "CO", - "CK", - "VE", - "ID", - "AR", - "FJ", - "IL", - "KE", - "UZ", - "GG", - "SA", - "CH", - "PL", - "AT", - "TW", - "BY", - "PW", - "KM", - "DE", - "VI", - "VN", - "MQ", - "PH", - "PS", - "SZ", - "FR", - "JM", - "PE", - "GR", - "NF", - "SI", - "ER", - "AX", - "EG", - "GY", - "CU", - "CZ", - "MN", - "GU", - "BL", - "LY", - "GH", - "SG", - "MU", - "AI", - "GT", - "TF", - "NA", - "SX", - "DM", - "ZM", - "JP", - "GQ", - "MF", - "PN", - "YT", - "PT", - "KN", - "AO", - "ET", - "SM", - "AL", - "BR", - "KZ", - "IQ", - "ZW", - "VU", - "MH", - "GA", - "AW", - "DZ", - "WS", - "KH", - "RW", - "CX", - "LU", - "MT", - "NZ", - "CF", - "SO", - "EH", - "BF", - "IO", - "ME", - "MO", - "PG", - "FK", - "GE", - "SE", - "ST", - "WF", - "BJ", - "HM", - "KP", - "LI", - "BB", - "UM", - "CN", - "SJ", - "BG", - "CD", - "MP", - "DO", - "GM", - "BO", - "NE", - "VA", - "LR", - "BV", - "BI", - "TD", - "CL", - "MS", - "HR", - "KW", - "MA", - "AU", - "AD", - "SD", - "IN", - "IT", - "DJ", - "NU", - "FO", - "KI", - "GN", - "TL", - "BZ", - "VC", - "MC", - "CG", - "EE", - "BS", - "SL", - "HU", - "LT", - "NR", - "AG", - "CR", - "GL", - "LA", - "PY", - "KR", - "MG", - "BW", - "BH", - "PM", - "US", - "FI", - "FM", - "IM", - "GB", - "MW", - "BE", - "BM", - "MR", - "SC", - "NG", - "CW", - "CA", - "TT", - "AE", - "JO", - "AM", - "TH", - "MD", - "CV", - "TZ", - "PR", - "UA", - "SH", - "AQ", - "EC", - "IR", - "LK", - "TO", - "SR", - "TK", - "BN", - "GP", - "MM", - "PA", - "HK", - "SN", - "TN", - "JE", - "PK", - "TC", - "GF", - "TG", - "RO", - "RU", - "MV", - "AZ" - ], - "avatar": { - "thumbnails": [ - { - "height": 900, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s900-c-k-c0x00ffffff-no-rj", - "width": 900 - } - ] - }, - "channelConversionUrl": "https://www.youtube.com/pagead/viewthroughconversion/962985656/?backend=innertube&cname=1&cver=2_20220921_08_00&foc_id=2DjFE7Xf11URZqWBigcVOQ&label=followon_cvisit&ptype=no_rmkt&utuid=2DjFE7Xf11URZqWBigcVOQ", - "channelUrl": "https://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ", - "description": "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON'T DO PAID VIDEO SPONSORSHIPS, DON'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don't be offended if I don't have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA", - "doubleclickTrackingUsername": "EEVblog", - "externalId": "UC2DjFE7Xf11URZqWBigcVOQ", - "facebookProfileId": "EEVblog", - "iosAppindexingLink": "ios-app://544007664/vnd.youtube/www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ", - "isFamilySafe": true, - "keywords": "electronics engineering maker hacker design circuit hardware pic atmel oscilloscope multimeter diy hobby review teardown microcontroller arduino video blog tutorial how-to interview rant industry news mailbag \"dumpster diving\" debunking", - "ownerUrls": [ - "http://www.youtube.com/c/EevblogDave" - ], - "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UC2DjFE7Xf11URZqWBigcVOQ", - "title": "EEVblog", - "vanityChannelUrl": "http://www.youtube.com/c/EevblogDave" - } - }, - "microformat": { - "microformatDataRenderer": { - "androidPackage": "com.google.android.youtube", - "appName": "YouTube", - "availableCountries": [ - "LV", - "IE", - "OM", - "PF", - "IS", - "RS", - "SB", - "TR", - "ML", - "KY", - "TM", - "DK", - "TJ", - "GS", - "BT", - "AF", - "BA", - "HN", - "LC", - "SK", - "ZA", - "MZ", - "CY", - "MY", - "UY", - "GD", - "NC", - "CI", - "CM", - "GI", - "CC", - "QA", - "TV", - "BD", - "LB", - "SS", - "SY", - "MX", - "NL", - "SV", - "LS", - "GW", - "NI", - "VG", - "NP", - "HT", - "UG", - "AS", - "YE", - "KG", - "NO", - "MK", - "RE", - "BQ", - "ES", - "CO", - "CK", - "VE", - "ID", - "AR", - "FJ", - "IL", - "KE", - "UZ", - "GG", - "SA", - "CH", - "PL", - "AT", - "TW", - "BY", - "PW", - "KM", - "DE", - "VI", - "VN", - "MQ", - "PH", - "PS", - "SZ", - "FR", - "JM", - "PE", - "GR", - "NF", - "SI", - "ER", - "AX", - "EG", - "GY", - "CU", - "CZ", - "MN", - "GU", - "BL", - "LY", - "GH", - "SG", - "MU", - "AI", - "GT", - "TF", - "NA", - "SX", - "DM", - "ZM", - "JP", - "GQ", - "MF", - "PN", - "YT", - "PT", - "KN", - "AO", - "ET", - "SM", - "AL", - "BR", - "KZ", - "IQ", - "ZW", - "VU", - "MH", - "GA", - "AW", - "DZ", - "WS", - "KH", - "RW", - "CX", - "LU", - "MT", - "NZ", - "CF", - "SO", - "EH", - "BF", - "IO", - "ME", - "MO", - "PG", - "FK", - "GE", - "SE", - "ST", - "WF", - "BJ", - "HM", - "KP", - "LI", - "BB", - "UM", - "CN", - "SJ", - "BG", - "CD", - "MP", - "DO", - "GM", - "BO", - "NE", - "VA", - "LR", - "BV", - "BI", - "TD", - "CL", - "MS", - "HR", - "KW", - "MA", - "AU", - "AD", - "SD", - "IN", - "IT", - "DJ", - "NU", - "FO", - "KI", - "GN", - "TL", - "BZ", - "VC", - "MC", - "CG", - "EE", - "BS", - "SL", - "HU", - "LT", - "NR", - "AG", - "CR", - "GL", - "LA", - "PY", - "KR", - "MG", - "BW", - "BH", - "PM", - "US", - "FI", - "FM", - "IM", - "GB", - "MW", - "BE", - "BM", - "MR", - "SC", - "NG", - "CW", - "CA", - "TT", - "AE", - "JO", - "AM", - "TH", - "MD", - "CV", - "TZ", - "PR", - "UA", - "SH", - "AQ", - "EC", - "IR", - "LK", - "TO", - "SR", - "TK", - "BN", - "GP", - "MM", - "PA", - "HK", - "SN", - "TN", - "JE", - "PK", - "TC", - "GF", - "TG", - "RO", - "RU", - "MV", - "AZ" - ], - "description": "NO SCRIPT, NO FEAR, ALL OPINION An off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers Hosted by...", - "familySafe": true, - "iosAppArguments": "https://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ", - "iosAppStoreId": "544007664", - "linkAlternates": [ - { - "hrefUrl": "https://m.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ" - }, - { - "hrefUrl": "android-app://com.google.android.youtube/http/youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ" - }, - { - "hrefUrl": "ios-app://544007664/http/youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ" - } - ], - "noindex": false, - "ogType": "yt-fb-app:channel", - "schemaDotOrgType": "http://schema.org/http://schema.org/YoutubeChannelV2", - "siteName": "YouTube", - "tags": [ - "electronics", - "engineering", - "maker", - "hacker", - "design", - "circuit", - "hardware", - "pic", - "atmel", - "oscilloscope", - "multimeter", - "diy", - "hobby", - "review", - "teardown", - "microcontroller", - "arduino", - "video", - "blog", - "tutorial", - "how-to", - "interview", - "rant", - "industry", - "news", - "mailbag", - "dumpster diving", - "debunking" - ], - "thumbnail": { - "thumbnails": [ - { - "height": 200, - "url": "https://yt3.ggpht.com/ytc/AMLnZu9eKk4Nd16fX4Rn1TF1G7ReluwOl6M5558FTYAM=s200-c-k-c0x00ffffff-no-rj?days_since_epoch=19259", - "width": 200 - } - ] - }, - "title": "EEVblog", - "twitterCardType": "summary", - "twitterSiteHandle": "@YouTube", - "unlisted": false, - "urlApplinksAndroid": "vnd.youtube://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ?feature=applinks", - "urlApplinksIos": "vnd.youtube://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ?feature=applinks", - "urlApplinksWeb": "https://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ?feature=applinks", - "urlCanonical": "https://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ", - "urlTwitterAndroid": "vnd.youtube://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ?feature=twitter-deep-link", - "urlTwitterIos": "vnd.youtube://www.youtube.com/channel/UC2DjFE7Xf11URZqWBigcVOQ?feature=twitter-deep-link" - } - }, + ], "responseContext": { "mainAppWebResponseContext": { - "loggedOut": true + "loggedOut": true, + "trackingParam": "kx_fmPxhoPZRKSsvcOhozrMdnXbEIEQeDWlsbukh8xl6fBwRgkuswmIBwOcCE59TDtslLKPQ-SS" }, "maxAgeSeconds": 300, "serviceTrackingParams": [ @@ -1777,7 +1398,7 @@ "params": [ { "key": "route", - "value": "channel.about" + "value": "channel.featured" }, { "key": "is_casual", @@ -1791,10 +1412,6 @@ "key": "is_monetization_enabled", "value": "true" }, - { - "key": "num_shelves", - "value": "3" - }, { "key": "is_alc_surface", "value": "false" @@ -1803,13 +1420,17 @@ "key": "browse_id", "value": "UC2DjFE7Xf11URZqWBigcVOQ" }, + { + "key": "browse_id_prefix", + "value": "" + }, { "key": "logged_in", "value": "0" }, { "key": "e", - "value": "1714240,23804281,23858057,23882685,23918597,23934970,23946420,23966208,23983296,23986025,23998056,24001373,24002022,24002025,24004644,24007246,24034168,24036947,24077241,24080738,24120820,24135310,24140247,24152442,24160837,24161116,24164186,24166867,24169501,24175559,24181174,24185614,24187043,24187377,24191629,24197275,24199724,24199774,24211178,24211242,24219713,24225483,24226335,24227844,24228637,24229161,24238596,24241378,24243988,24246430,24248385,24249085,24254502,24255165,24255543,24255545,24260441,24260783,24260844,24262346,24263796,24264860,24265820,24267564,24267570,24268142,24268870,24268936,24272785,24275322,24276632,24277923,24277989,24278489,24280256,24280303,24281190,24283093,24283281,24286003,24286010,24286017,24286396,24287795,24288047,24289901,24290131,24290276,24292296,24292715,24293107,39322278,39322357,39322382,39322386,39322399,39322456,45686551" + "value": "23804281,23885487,23943577,23946420,23966208,23983296,23986028,23998056,24004644,24007246,24034168,24036947,24077241,24080738,24120820,24135310,24140247,24166867,24181174,24187377,24241378,24255543,24255545,24288664,24290971,24291857,24363609,24367579,24371398,24371778,24373396,24377598,24377909,24379354,24382552,24385612,24387949,24390675,24428788,24439361,24451319,24453989,24458317,24458324,24458329,24458839,24463872,24468724,24485421,24499532,24506515,24506784,24515423,24517093,24518452,24524098,24526515,24526642,24526774,24526787,24526794,24526801,24526808,24526813,24526827,24528463,24528466,24528473,24528484,24528552,24528555,24528577,24528582,24528644,24528647,24528661,24528668,24531224,24531253,24537200,24539025,24540881,24541326,24541656,24542367,24542452,24543193,24543197,24543200,24543201,24546059,24546074,24547317,24548138,24548627,24548629,24548853,24549786,24550285,24550458,24559327,24559697,24560416,24561140,24561152,24561208,24561384,24563746,24564171,24566293,24566687,24569887,24585907,24586420,24586688,24588590,24589493,24694842,24696752,24697068,24698453,24699899,39324156,39324184,39324567,51000798,51003636,51004018,51006181,51009757,51009781,51009900,51009906,51010235,51010280,51011488,51011905,51012165,51012291,51012659,51014091,51016856,51017346,51017996,51019442,51019626,51020302,51020570,51021953,51022241,51024038,51025415,51025833,51027535,51027643,51027868,51027870,51028271,51030101,51030171,51030311,51030435,51030450,51031341,51031412,51032492,51033399,51033577,51034525,51035525,51035565,51036438,51036511,51036737,51037342,51037351,51037540,51038399,51038805,51040336,51040338,51040349,51040471,51041282,51041340,51041497,51041809,51042251,51043057,51043768,51043940,51044608,51044641,51045016,51045969,51046900,51046954,51047726,51048254,51048488,51049895,51051696,51052749,51053019,51053957,51054569" } ], "service": "GFEEDBACK" @@ -1819,6 +1440,10 @@ { "key": "browse_id", "value": "UC2DjFE7Xf11URZqWBigcVOQ" + }, + { + "key": "browse_id_prefix", + "value": "" } ], "service": "GOOGLE_HELP" @@ -1831,7 +1456,7 @@ }, { "key": "cver", - "value": "2.20220921.08.00" + "value": "2.20231101.05.00" }, { "key": "yt_li", @@ -1839,7 +1464,7 @@ }, { "key": "GetChannelPage_rid", - "value": "0xaada99e22093f27c" + "value": "0x1a5719f152afa89c" } ], "service": "CSI" @@ -1857,7 +1482,7 @@ "params": [ { "key": "client.version", - "value": "2.20220921" + "value": "2.20231101" }, { "key": "client.name", @@ -1865,868 +1490,16 @@ }, { "key": "client.fexp", - "value": "23966208,24140247,24272785,24286010,24161116,24286017,23983296,24267570,39322456,24226335,24268936,24286396,23882685,24243988,24277989,24255543,1714240,39322386,24280303,24185614,24283281,24199724,24036947,24268142,24187377,24260441,24290276,24248385,39322382,24120820,24293107,24211242,23858057,24169501,39322399,24219713,24002022,24080738,39322357,24225483,24249085,24199774,24265820,23918597,45686551,24260844,24254502,24246430,24255545,24077241,24175559,24290131,23946420,23804281,24001373,24152442,24276632,24197275,24181174,24228637,24280256,24034168,24275322,24160837,24238596,24281190,24292715,24002025,24262346,24166867,24283093,24227844,24287795,24278489,24255165,24263796,24267564,24264860,24191629,24292296,24260783,24229161,24241378,24187043,23986025,24164186,39322278,23934970,24007246,24277923,23998056,24135310,24288047,24004644,24211178,24286003,24268870,24289901" + "value": "24549786,51048488,24546074,24517093,51010280,51031412,51040349,24528644,51041809,24564171,51009906,51044641,51040471,24561208,24181174,51025415,24546059,51004018,24547317,24288664,51011488,24566687,24543197,51014091,51034525,24540881,24034168,51027535,51047726,51030311,51011905,24563746,51037351,24559697,24371398,24166867,51027643,51036438,24077241,24291857,24694842,51017996,24560416,24569887,51012659,24382552,24515423,51035525,23804281,24120820,24004644,24528552,24528473,51020570,24390675,51006181,51019442,24379354,24528466,24458839,51009757,51041282,24697068,24241378,24255545,23986028,51035565,24140247,51053019,51030101,24566293,24586688,24550285,24428788,24696752,24526813,24539025,24541326,24528668,24589493,24528661,24290971,24528582,51003636,24550458,51037342,24458329,51024038,24080738,24526827,51038399,51051696,51046900,24377598,24528647,24561152,23966208,51041340,24541656,51009900,51045016,51012165,24561140,24542367,24526794,23943577,24543201,51042251,51027870,24548629,24526801,24506784,24526808,24363609,39324184,24586420,51021953,51043940,51048254,24561384,51022241,51040338,24543193,24526642,23983296,24485421,24463872,24528555,51030171,51016856,24036947,51041497,23998056,24377909,24458317,51033399,24528577,51036737,51043057,24458324,24542452,24543200,24367579,24548853,24559327,39324156,24548627,24373396,24451319,24371778,24528484,24439361,51053957,24548138,51045969,24585907,51000798,24526515,51010235,24526774,51028271,51044608,24698453,24531253,24385612,39324567,51040336,51036511,51017346,51054569,23885487,24531224,24387949,51038805,24187377,51030450,51032492,51037540,51031341,24007246,24528463,51030435,24699899,24524098,51012291,51020302,51009781,51043768,51049895,51019626,24499532,24506515,23946420,51027868,24255543,24135310,24588590,24453989,51025833,51033577,51046954,24468724,24537200,51052749,24518452,24526787" } ], "service": "ECATCHER" } ], - "visitorData": "CgszMUUzZDlGLWxiRSipqr2ZBg%3D%3D", + "visitorData": "CgthaDFMbWFGWHhoUSiI3pSqBjIICgJERRICEgA%3D", "webResponseContextExtensionData": { "hasDecorated": true } }, - "topbar": { - "desktopTopbarRenderer": { - "a11ySkipNavigationButton": { - "buttonRenderer": { - "command": { - "clickTrackingParams": "CAUQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "sendPost": true - } - }, - "signalServiceEndpoint": { - "actions": [ - { - "clickTrackingParams": "CAUQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "signalAction": { - "signal": "SKIP_NAVIGATION" - } - } - ], - "signal": "CLIENT_SIGNAL" - } - }, - "isDisabled": false, - "size": "SIZE_DEFAULT", - "style": "STYLE_DEFAULT", - "text": { - "runs": [ - { - "text": "Skip navigation" - } - ] - }, - "trackingParams": "CAUQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "backButton": { - "buttonRenderer": { - "command": { - "clickTrackingParams": "CAcQvIYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD", - "commandMetadata": { - "webCommandMetadata": { - "sendPost": true - } - }, - "signalServiceEndpoint": { - "actions": [ - { - "clickTrackingParams": "CAcQvIYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD", - "signalAction": { - "signal": "HISTORY_BACK" - } - } - ], - "signal": "CLIENT_SIGNAL" - } - }, - "trackingParams": "CAcQvIYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "forwardButton": { - "buttonRenderer": { - "command": { - "clickTrackingParams": "CAYQvYYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD", - "commandMetadata": { - "webCommandMetadata": { - "sendPost": true - } - }, - "signalServiceEndpoint": { - "actions": [ - { - "clickTrackingParams": "CAYQvYYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD", - "signalAction": { - "signal": "HISTORY_FORWARD" - } - } - ], - "signal": "CLIENT_SIGNAL" - } - }, - "trackingParams": "CAYQvYYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "hotkeyDialog": { - "hotkeyDialogRenderer": { - "dismissButton": { - "buttonRenderer": { - "isDisabled": false, - "size": "SIZE_DEFAULT", - "style": "STYLE_BLUE_TEXT", - "text": { - "runs": [ - { - "text": "Dismiss" - } - ] - }, - "trackingParams": "CAkQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "sections": [ - { - "hotkeyDialogSectionRenderer": { - "options": [ - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "k", - "label": { - "runs": [ - { - "text": "Toggle play/pause" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "j", - "label": { - "runs": [ - { - "text": "Rewind 10 seconds" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "l", - "label": { - "runs": [ - { - "text": "Fast forward 10 seconds" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "P (SHIFT+p)", - "label": { - "runs": [ - { - "text": "Previous video" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "N (SHIFT+n)", - "label": { - "runs": [ - { - "text": "Next video" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": ",", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Comma" - } - }, - "label": { - "runs": [ - { - "text": "Previous frame (while paused)" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": ".", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Period" - } - }, - "label": { - "runs": [ - { - "text": "Next frame (while paused)" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "< (SHIFT+,)", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Less than or SHIFT + comma" - } - }, - "label": { - "runs": [ - { - "text": "Decrease playback rate" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "> (SHIFT+.)", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Greater than or SHIFT + period" - } - }, - "label": { - "runs": [ - { - "text": "Increase playback rate" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "0..9", - "label": { - "runs": [ - { - "text": "Seek to specific point in the video (7 advances to 70% of duration)" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "CONTROL + ←", - "label": { - "runs": [ - { - "text": "Seek to previous chapter" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "CONTROL + →", - "label": { - "runs": [ - { - "text": "Seek to next chapter" - } - ] - } - } - } - ], - "title": { - "runs": [ - { - "text": "Playback" - } - ] - } - } - }, - { - "hotkeyDialogSectionRenderer": { - "options": [ - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "f", - "label": { - "runs": [ - { - "text": "Toggle full screen" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "t", - "label": { - "runs": [ - { - "text": "Toggle theater mode" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "i", - "label": { - "runs": [ - { - "text": "Toggle miniplayer" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "ESCAPE", - "label": { - "runs": [ - { - "text": "Close miniplayer or current dialog" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "m", - "label": { - "runs": [ - { - "text": "Toggle mute" - } - ] - } - } - } - ], - "title": { - "runs": [ - { - "text": "General" - } - ] - } - } - }, - { - "hotkeyDialogSectionRenderer": { - "options": [ - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "c", - "label": { - "runs": [ - { - "text": "If the video supports captions, toggle captions ON/OFF" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "o", - "label": { - "runs": [ - { - "text": "Rotate through different text opacity levels" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "w", - "label": { - "runs": [ - { - "text": "Rotate through different window opacity levels" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "+", - "label": { - "runs": [ - { - "text": "Rotate through font sizes (increasing)" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "-", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Minus" - } - }, - "label": { - "runs": [ - { - "text": "Rotate through font sizes (decreasing)" - } - ] - } - } - } - ], - "title": { - "runs": [ - { - "text": "Subtitles and closed captions" - } - ] - } - } - }, - { - "hotkeyDialogSectionRenderer": { - "options": [ - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "w", - "label": { - "runs": [ - { - "text": "Pan up" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "a", - "label": { - "runs": [ - { - "text": "Pan left" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "s", - "label": { - "runs": [ - { - "text": "Pan down" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "d", - "label": { - "runs": [ - { - "text": "Pan right" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "+ on numpad or ]", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Plus on number pad or right bracket" - } - }, - "label": { - "runs": [ - { - "text": "Zoom in" - } - ] - } - } - }, - { - "hotkeyDialogSectionOptionRenderer": { - "hotkey": "- on numpad or [", - "hotkeyAccessibilityLabel": { - "accessibilityData": { - "label": "Minus on number pad or left bracket" - } - }, - "label": { - "runs": [ - { - "text": "Zoom out" - } - ] - } - } - } - ], - "title": { - "runs": [ - { - "text": "Spherical Videos" - } - ] - } - } - } - ], - "title": { - "runs": [ - { - "text": "Keyboard shortcuts" - } - ] - }, - "trackingParams": "CAgQteYDIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "logo": { - "topbarLogoRenderer": { - "endpoint": { - "browseEndpoint": { - "browseId": "FEwhat_to_watch" - }, - "clickTrackingParams": "CA8QsV4iEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/browse", - "rootVe": 3854, - "url": "/", - "webPageType": "WEB_PAGE_TYPE_BROWSE" - } - } - }, - "iconImage": { - "iconType": "YOUTUBE_LOGO" - }, - "overrideEntityKey": "EgZ0b3BiYXIg9QEoAQ%3D%3D", - "tooltipText": { - "runs": [ - { - "text": "YouTube Home" - } - ] - }, - "trackingParams": "CA8QsV4iEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "searchbox": { - "fusionSearchboxRenderer": { - "clearButton": { - "buttonRenderer": { - "accessibilityData": { - "accessibilityData": { - "label": "Clear search query" - } - }, - "icon": { - "iconType": "CLOSE" - }, - "isDisabled": false, - "size": "SIZE_DEFAULT", - "style": "STYLE_DEFAULT", - "trackingParams": "CA4Q8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "config": { - "webSearchboxConfig": { - "focusSearchbox": true, - "hasOnscreenKeyboard": false, - "requestDomain": "us", - "requestLanguage": "en" - } - }, - "icon": { - "iconType": "SEARCH" - }, - "placeholderText": { - "runs": [ - { - "text": "Search" - } - ] - }, - "searchEndpoint": { - "clickTrackingParams": "CA0Q7VAiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 4724, - "url": "/results?search_query=", - "webPageType": "WEB_PAGE_TYPE_SEARCH" - } - }, - "searchEndpoint": { - "query": "" - } - }, - "trackingParams": "CA0Q7VAiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "topbarButtons": [ - { - "topbarMenuButtonRenderer": { - "accessibility": { - "accessibilityData": { - "label": "Settings" - } - }, - "icon": { - "iconType": "MORE_VERT" - }, - "menuRequest": { - "clickTrackingParams": "CAsQ_qsBGAAiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "apiUrl": "/youtubei/v1/account/account_menu", - "sendPost": true - } - }, - "signalServiceEndpoint": { - "actions": [ - { - "clickTrackingParams": "CAsQ_qsBGAAiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "openPopupAction": { - "beReused": true, - "popup": { - "multiPageMenuRenderer": { - "showLoadingSpinner": true, - "style": "MULTI_PAGE_MENU_STYLE_TYPE_SYSTEM", - "trackingParams": "CAwQ_6sBIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "popupType": "DROPDOWN" - } - } - ], - "signal": "GET_ACCOUNT_MENU" - } - }, - "style": "STYLE_DEFAULT", - "tooltip": "Settings", - "trackingParams": "CAsQ_qsBGAAiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - { - "buttonRenderer": { - "icon": { - "iconType": "AVATAR_LOGGED_OUT" - }, - "navigationEndpoint": { - "clickTrackingParams": "CAoQ1IAEGAEiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "rootVe": 83769, - "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fbrowse%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en&ec=65620", - "webPageType": "WEB_PAGE_TYPE_UNKNOWN" - } - }, - "signInEndpoint": { - "idamTag": "65620" - } - }, - "size": "SIZE_SMALL", - "style": "STYLE_SUGGESTIVE", - "targetId": "topbar-signin", - "text": { - "runs": [ - { - "text": "Sign in" - } - ] - }, - "trackingParams": "CAoQ1IAEGAEiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - } - ], - "trackingParams": "CAEQq6wBIhMI0Jfy6Y-u-gIVxehRCh3KTQcD", - "voiceSearchButton": { - "buttonRenderer": { - "accessibilityData": { - "accessibilityData": { - "label": "Search with your voice" - } - }, - "icon": { - "iconType": "MICROPHONE_ON" - }, - "isDisabled": false, - "serviceEndpoint": { - "clickTrackingParams": "CAIQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "commandMetadata": { - "webCommandMetadata": { - "sendPost": true - } - }, - "signalServiceEndpoint": { - "actions": [ - { - "clickTrackingParams": "CAIQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=", - "openPopupAction": { - "popup": { - "voiceSearchDialogRenderer": { - "connectionErrorHeader": { - "runs": [ - { - "text": "No connection" - } - ] - }, - "connectionErrorMicrophoneLabel": { - "runs": [ - { - "text": "Check your connection and try again" - } - ] - }, - "disabledHeader": { - "runs": [ - { - "text": "Search with your voice" - } - ] - }, - "disabledSubtext": { - "runs": [ - { - "text": "To search by voice, go to your browser settings and allow access to microphone" - } - ] - }, - "exampleQuery1": { - "runs": [ - { - "text": "\"Play Dua Lipa\"" - } - ] - }, - "exampleQuery2": { - "runs": [ - { - "text": "\"Show me my subscriptions\"" - } - ] - }, - "exitButton": { - "buttonRenderer": { - "accessibilityData": { - "accessibilityData": { - "label": "Cancel" - } - }, - "icon": { - "iconType": "CLOSE" - }, - "isDisabled": false, - "size": "SIZE_DEFAULT", - "style": "STYLE_DEFAULT", - "trackingParams": "CAQQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - }, - "loadingHeader": { - "runs": [ - { - "text": "Working..." - } - ] - }, - "microphoneButtonAriaLabel": { - "runs": [ - { - "text": "Cancel" - } - ] - }, - "microphoneOffPromptHeader": { - "runs": [ - { - "text": "Microphone off. Try again." - } - ] - }, - "permissionsHeader": { - "runs": [ - { - "text": "Waiting for permission" - } - ] - }, - "permissionsSubtext": { - "runs": [ - { - "text": "Allow microphone access to search with voice" - } - ] - }, - "placeholderHeader": { - "runs": [ - { - "text": "Listening..." - } - ] - }, - "promptHeader": { - "runs": [ - { - "text": "Didn't hear that. Try again." - } - ] - }, - "promptMicrophoneLabel": { - "runs": [ - { - "text": "Tap microphone to try again" - } - ] - }, - "trackingParams": "CAMQ7q8FIhMI0Jfy6Y-u-gIVxehRCh3KTQcD" - } - }, - "popupType": "TOP_ALIGNED_DIALOG" - } - } - ], - "signal": "CLIENT_SIGNAL" - } - }, - "size": "SIZE_DEFAULT", - "style": "STYLE_DEFAULT", - "tooltip": "Search with your voice", - "trackingParams": "CAIQ8FsiEwjQl_Lpj676AhXF6FEKHcpNBwM=" - } - } - } - }, - "trackingParams": "CAAQhGciEwjQl_Lpj676AhXF6FEKHcpNBwM=" + "trackingParams": "CAAQhGciEwis363HrqiCAxWfHwYAHc0nDmw=" } diff --git a/tests/youtube.rs b/tests/youtube.rs index 4307278..687c010 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -39,7 +39,10 @@ fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { // dbg!(&player_data); assert_eq!(player_data.details.id, "n4tK7LYFxI0"); - assert_eq!(player_data.details.name, "Spektrem - Shine [NCS Release]"); + assert_eq!( + player_data.details.name, + "Spektrem - Shine | Progressive House | NCS - Copyright Free Music" + ); if client_type == ClientType::DesktopMusic { assert!(player_data.details.description.is_none()); } else { @@ -68,9 +71,9 @@ fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { .unwrap(); // Bitrates may change between requests - assert_approx(f64::from(video.bitrate), 1_507_068.0); - assert_eq!(video.average_bitrate, 1_345_149); - assert_eq!(video.size.unwrap(), 43_553_412); + assert_approx(f64::from(video.bitrate), 1_851_854.0); + assert_eq!(video.average_bitrate, 923_766); + assert_eq!(video.size.unwrap(), 29_909_835); assert_eq!(video.width, 1280); assert_eq!(video.height, 720); assert_eq!(video.fps, 30); @@ -102,8 +105,8 @@ fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { .expect("audio stream not found"); assert_approx(f64::from(video.bitrate), 1_340_829.0); - assert_approx(f64::from(video.average_bitrate), 1_233_444.0); - assert_approx(video.size.unwrap() as f64, 39_936_630.0); + assert_approx(f64::from(video.average_bitrate), 1_046_557.0); + assert_approx(video.size.unwrap() as f64, 33_885_572.0); assert_eq!(video.width, 1280); assert_eq!(video.height, 720); assert_eq!(video.fps, 30); @@ -856,22 +859,15 @@ fn channel_playlists(rp: RustyPipe) { #[rstest] fn channel_info(rp: RustyPipe) { - let channel = - tokio_test::block_on(rp.query().channel_info("UC2DjFE7Xf11URZqWBigcVOQ")).unwrap(); + let info = tokio_test::block_on(rp.query().channel_info("UC2DjFE7Xf11URZqWBigcVOQ")).unwrap(); - // dbg!(&channel); - assert_channel_eevblog(&channel); + assert_eq!(info.create_date.unwrap(), date!(2009 - 4 - 4)); + assert_gte(info.view_count.unwrap(), 186_854_340, "channel views"); + assert_gte(info.video_count.unwrap(), 1920, "channel videos"); + assert_gte(info.subscriber_count.unwrap(), 920_000, "subscribers"); + assert_eq!(info.country.unwrap(), Country::Au); - let created = channel.content.create_date.unwrap(); - assert_eq!(created, date!(2009 - 4 - 4)); - - assert_gte( - channel.content.view_count.unwrap(), - 186_854_340, - "channel views", - ); - - insta::assert_ron_snapshot!(channel.content.links, @r###" + insta::assert_ron_snapshot!(info.links, @r###" [ ("EEVblog Web Site", "http://www.eevblog.com/"), ("Twitter", "http://www.twitter.com/eevblog"), @@ -967,8 +963,8 @@ fn channel_more( ); } - let channel_info = tokio_test::block_on(rp.query().channel_info(&id)).unwrap(); - assert_channel(&channel_info, id, name, unlocalized || name_unlocalized); + let info = tokio_test::block_on(rp.query().channel_info(&id)).unwrap(); + assert_eq!(info.id, id); } #[rstest] @@ -2447,8 +2443,8 @@ fn assert_frameset(frameset: &Frameset) { assert_gte(frameset.frame_height, 20, "frame width"); assert_gte(frameset.page_count, 1, "page count"); assert_gte(frameset.total_count, 50, "total count"); - assert_gte(frameset.frames_per_page_x, 5, "frames per page x"); - assert_gte(frameset.frames_per_page_y, 5, "frames per page y"); + assert_gte(frameset.frames_per_page_x, 3, "frames per page x"); + assert_gte(frameset.frames_per_page_y, 3, "frames per page y"); let n = frameset.urls().count() as u32; assert_eq!(n, frameset.page_count); From 452f765ffd4e4d9a5ad95829fff57d0bced9b280 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 4 Nov 2023 01:14:54 +0100 Subject: [PATCH 056/459] fix: handling new podcast links --- src/client/music_artist.rs | 2 - src/client/music_charts.rs | 5 +- src/client/music_details.rs | 3 - src/client/music_new.rs | 1 - src/client/music_playlist.rs | 1 - src/client/music_search.rs | 3 - src/client/response/music_item.rs | 121 +++++++++------------------- src/client/response/url_endpoint.rs | 63 ++++++++++++--- src/serializer/text.rs | 21 ++++- src/util/mod.rs | 7 ++ tests/youtube.rs | 36 +++++++-- 11 files changed, 147 insertions(+), 116 deletions(-) diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index dcb7c77..bd1ca76 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -235,7 +235,6 @@ fn map_artist_page( } } - mapper.check_unknown()?; let mut mapped = mapper.group_items(); static WIKIPEDIA_REGEX: Lazy = @@ -332,7 +331,6 @@ impl MapResponse> for response::MusicArtistAlbums { mapper.map_response(grid.grid_renderer.items); } - mapper.check_unknown()?; let mapped = mapper.group_items(); Ok(MapResult { diff --git a/src/client/music_charts.rs b/src/client/music_charts.rs index 7fc5b5a..27ac005 100644 --- a/src/client/music_charts.rs +++ b/src/client/music_charts.rs @@ -98,6 +98,7 @@ impl MapResponse for response::MusicCharts { h.music_carousel_shelf_basic_header_renderer .more_content_button .and_then(|btn| btn.button_renderer.navigation_endpoint.music_page()) + .map(|mp| (mp.typ, mp.id)) }) { Some((MusicPageType::Playlist, id)) => { // Top music videos (first shelf with associated playlist) @@ -120,10 +121,6 @@ impl MapResponse for response::MusicCharts { response::music_charts::ItemSection::None => {} }); - mapper_top.check_unknown()?; - mapper_trending.check_unknown()?; - mapper_other.check_unknown()?; - let mapped_top = mapper_top.conv_items::(); let mut mapped_trending = mapper_trending.conv_items::(); let mut mapped_other = mapper_other.group_items(); diff --git a/src/client/music_details.rs b/src/client/music_details.rs index b6d9361..36d5ddd 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -387,9 +387,6 @@ impl MapResponse for response::MusicRelated { _ => {} }); - mapper.check_unknown()?; - mapper_tracks.check_unknown()?; - let mapped_tracks = mapper_tracks.conv_items(); let mut mapped = mapper.group_items(); diff --git a/src/client/music_new.rs b/src/client/music_new.rs index dde4d2c..39914bb 100644 --- a/src/client/music_new.rs +++ b/src/client/music_new.rs @@ -75,7 +75,6 @@ impl MapResponse> for response::MusicNew { let mut mapper = MusicListMapper::new(lang); mapper.map_response(items); - mapper.check_unknown()?; Ok(mapper.conv_items()) } diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index ecf76dc..49350fb 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -174,7 +174,6 @@ impl MapResponse for response::MusicPlaylist { let mut mapper = MusicListMapper::new(lang); mapper.map_response(shelf.contents); - mapper.check_unknown()?; let map_res = mapper.conv_items(); let ctoken = shelf diff --git a/src/client/music_search.rs b/src/client/music_search.rs index 309bc1e..7d42842 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -266,7 +266,6 @@ impl MapResponse for response::MusicSearch { response::music_search::ItemSection::None => {} }); - mapper.check_unknown()?; let map_res = mapper.group_items(); Ok(MapResult { @@ -325,7 +324,6 @@ impl MapResponse> for response::MusicSearc response::music_search::ItemSection::None => {} }); - mapper.check_unknown()?; let map_res = mapper.conv_items(); Ok(MapResult { @@ -371,7 +369,6 @@ impl MapResponse for response::MusicSearchSuggestion { } } - mapper.check_unknown()?; let map_res = mapper.conv_items(); Ok(MapResult { diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 62dc45a..95ab12e 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -2,14 +2,13 @@ use serde::Deserialize; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError}; use crate::{ - error::ExtractionError, model::{ self, traits::FromYtItem, AlbumId, AlbumItem, AlbumType, ArtistId, ArtistItem, ChannelId, MusicItem, MusicItemType, MusicPlaylistItem, TrackItem, }, param::Language, serializer::{ - text::{Text, TextComponents}, + text::{Text, TextComponent, TextComponents}, MapResult, }, util::{self, dictionary}, @@ -17,7 +16,7 @@ use crate::{ use super::{ url_endpoint::{ - BrowseEndpointWrap, MusicPageType, MusicVideoType, NavigationEndpoint, PageType, + BrowseEndpointWrap, MusicPage, MusicPageType, MusicVideoType, NavigationEndpoint, PageType, }, ContentsRenderer, MusicContinuationData, Thumbnails, ThumbnailsWrap, }; @@ -434,8 +433,6 @@ pub(crate) struct MusicListMapper { search_suggestion: bool, items: Vec, warnings: Vec, - /// True if unknown items were mapped - has_unknown: bool, } #[derive(Debug)] @@ -456,7 +453,6 @@ impl MusicListMapper { search_suggestion: false, items: Vec::new(), warnings: Vec::new(), - has_unknown: false, } } @@ -469,7 +465,6 @@ impl MusicListMapper { search_suggestion: true, items: Vec::new(), warnings: Vec::new(), - has_unknown: false, } } @@ -483,7 +478,6 @@ impl MusicListMapper { search_suggestion: false, items: Vec::new(), warnings: Vec::new(), - has_unknown: false, } } @@ -497,7 +491,6 @@ impl MusicListMapper { search_suggestion: false, items: Vec::new(), warnings: Vec::new(), - has_unknown: false, } } @@ -545,55 +538,44 @@ impl MusicListMapper { .thumbnails .first(); - let pt_id = item + let music_page = item .navigation_endpoint .and_then(NavigationEndpoint::music_page) .or_else(|| { c1.and_then(|c1| { - c1.renderer.text.0.into_iter().next().and_then(|t| match t { - crate::serializer::text::TextComponent::Video { - video_id, vtype, .. - } => Some((MusicPageType::Track { vtype }, video_id)), - crate::serializer::text::TextComponent::Browse { - page_type, - browse_id, - .. - } => Some((page_type.into(), browse_id)), - _ => None, - }) + c1.renderer + .text + .0 + .into_iter() + .next() + .and_then(TextComponent::music_page) }) }) .or_else(|| { - item.playlist_item_data.map(|d| { - ( - MusicPageType::Track { - vtype: MusicVideoType::from_is_video( - self.album.is_none() - && !first_tn - .map(|tn| tn.height == tn.width) - .unwrap_or_default(), - ), - }, - d.video_id, - ) + item.playlist_item_data.map(|d| MusicPage { + id: d.video_id, + typ: MusicPageType::Track { + vtype: MusicVideoType::from_is_video( + self.album.is_none() + && !first_tn.map(|tn| tn.height == tn.width).unwrap_or_default(), + ), + }, }) }) .or_else(|| { first_tn.and_then(|tn| { - util::video_id_from_thumbnail_url(&tn.url).map(|id| { - ( - MusicPageType::Track { - vtype: MusicVideoType::from_is_video( - self.album.is_none() && tn.width != tn.height, - ), - }, - id, - ) + util::video_id_from_thumbnail_url(&tn.url).map(|id| MusicPage { + id, + typ: MusicPageType::Track { + vtype: MusicVideoType::from_is_video( + self.album.is_none() && tn.width != tn.height, + ), + }, }) }) }); - match pt_id { + match music_page.map(|mp| (mp.typ, mp.id)) { // Track Some((MusicPageType::Track { vtype }, id)) => { let title = title.ok_or_else(|| format!("track {id}: could not get title"))?; @@ -852,10 +834,6 @@ impl MusicListMapper { } // Tracks were already handled above MusicPageType::Track { .. } => unreachable!(), - MusicPageType::Unknown => { - self.has_unknown = true; - Ok(None) - } } } None => { @@ -875,12 +853,12 @@ impl MusicListMapper { let subtitle_p2 = subtitle_parts.next(); match item.navigation_endpoint.music_page() { - Some((page_type, id)) => match page_type { + Some(music_page) => match music_page.typ { MusicPageType::Track { vtype } => { let (artists, by_va) = map_artists(subtitle_p1); self.items.push(MusicItem::Track(TrackItem { - id, + id: music_page.id, name: item.title, duration: None, cover: item.thumbnail_renderer.into(), @@ -910,7 +888,7 @@ impl MusicListMapper { }); self.items.push(MusicItem::Artist(ArtistItem { - id, + id: music_page.id, name: item.title, avatar: item.thumbnail_renderer.into(), subscriber_count, @@ -947,12 +925,15 @@ impl MusicListMapper { (Vec::new(), true) } _ => { - return Err(format!("could not parse subtitle of album {id}")); + return Err(format!( + "could not parse subtitle of album {}", + music_page.id + )); } }; self.items.push(MusicItem::Album(AlbumItem { - id, + id: music_page.id, name: item.title, cover: item.thumbnail_renderer.into(), artist_id: artists.first().and_then(|a| a.id.clone()), @@ -974,7 +955,7 @@ impl MusicListMapper { .and_then(|p| p.0.into_iter().find_map(|c| ChannelId::try_from(c).ok())); self.items.push(MusicItem::Playlist(MusicPlaylistItem { - id, + id: music_page.id, name: item.title, thumbnail: item.thumbnail_renderer.into(), channel, @@ -984,10 +965,6 @@ impl MusicListMapper { Ok(Some(MusicItemType::Playlist)) } MusicPageType::None => Ok(None), - MusicPageType::Unknown => { - self.has_unknown = true; - Ok(None) - } }, None => Err("could not determine item type".to_owned()), } @@ -1009,7 +986,7 @@ impl MusicListMapper { let subtitle_p4 = subtitle_parts.next(); let item_type = match card.on_tap.music_page() { - Some((page_type, id)) => match page_type { + Some(music_page) => match music_page.typ { MusicPageType::Artist => { let subscriber_count = subtitle_p2.and_then(|p| { util::parse_large_numstr_or_warn( @@ -1020,7 +997,7 @@ impl MusicListMapper { }); self.items.push(MusicItem::Artist(ArtistItem { - id, + id: music_page.id, name: card.title, avatar: card.thumbnail.into(), subscriber_count, @@ -1034,7 +1011,7 @@ impl MusicListMapper { .unwrap_or_default(); self.items.push(MusicItem::Album(AlbumItem { - id, + id: music_page.id, name: card.title, cover: card.thumbnail.into(), artist_id: artists.first().and_then(|a| a.id.clone()), @@ -1050,7 +1027,7 @@ impl MusicListMapper { let (artists, by_va) = map_artists(subtitle_p3); self.items.push(MusicItem::Track(TrackItem { - id, + id: music_page.id, name: card.title, duration: None, cover: card.thumbnail.into(), @@ -1087,7 +1064,7 @@ impl MusicListMapper { }; self.items.push(MusicItem::Track(TrackItem { - id, + id: music_page.id, name: card.title, duration, cover: card.thumbnail.into(), @@ -1113,7 +1090,7 @@ impl MusicListMapper { subtitle_p3.and_then(|p| util::parse_numeric(p.first_str()).ok()); self.items.push(MusicItem::Playlist(MusicPlaylistItem { - id, + id: music_page.id, name: card.title, thumbnail: card.thumbnail.into(), channel, @@ -1123,10 +1100,6 @@ impl MusicListMapper { Some(MusicItemType::Playlist) } MusicPageType::None => None, - MusicPageType::Unknown => { - self.has_unknown = true; - None - } }, None => { self.warnings @@ -1201,20 +1174,6 @@ impl MusicListMapper { warnings: self.warnings, } } - - /// Sometimes the YT Music API returns responses containing unknown items. - /// - /// In this case, the response data is likely missing some fields, which leads to - /// parsing errors and wrong data being extracted. - /// - /// Therefore it is safest to discard such responses and retry the request. - pub fn check_unknown(&self) -> Result<(), ExtractionError> { - if self.has_unknown { - Err(ExtractionError::InvalidData("unknown YTM items".into())) - } else { - Ok(()) - } - } } /// Map TextComponents containing artist names to a list of artists and a 'Various Artists' flag diff --git a/src/client/response/url_endpoint.rs b/src/client/response/url_endpoint.rs index fb629fb..3bfbc35 100644 --- a/src/client/response/url_endpoint.rs +++ b/src/client/response/url_endpoint.rs @@ -1,7 +1,7 @@ use serde::Deserialize; use serde_with::{serde_as, DefaultOnError}; -use crate::model::UrlTarget; +use crate::{model::UrlTarget, util}; /// navigation/resolve_url response model #[derive(Debug, Deserialize)] @@ -185,6 +185,10 @@ pub(crate) enum PageType { Channel, #[serde(rename = "MUSIC_PAGE_TYPE_PLAYLIST", alias = "WEB_PAGE_TYPE_PLAYLIST")] Playlist, + #[serde(rename = "MUSIC_PAGE_TYPE_PODCAST_SHOW_DETAIL_PAGE")] + Podcast, + #[serde(rename = "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE")] + Episode, #[default] Unknown, } @@ -195,6 +199,13 @@ impl PageType { PageType::Artist | PageType::Channel => Some(UrlTarget::Channel { id }), PageType::Album => Some(UrlTarget::Album { id }), PageType::Playlist => Some(UrlTarget::Playlist { id }), + PageType::Podcast => Some(UrlTarget::Playlist { + id: util::strip_prefix(&id, util::PODCAST_PLAYLIST_PREFIX), + }), + PageType::Episode => Some(UrlTarget::Video { + id: util::strip_prefix(&id, util::PODCAST_EPISODE_PREFIX), + start_time: 0, + }), PageType::Unknown => None, } } @@ -206,7 +217,6 @@ pub(crate) enum MusicPageType { Album, Playlist, Track { vtype: MusicVideoType }, - Unknown, None, } @@ -215,16 +225,40 @@ impl From for MusicPageType { match t { PageType::Artist => MusicPageType::Artist, PageType::Album => MusicPageType::Album, - PageType::Playlist => MusicPageType::Playlist, - PageType::Channel => MusicPageType::None, - PageType::Unknown => MusicPageType::Unknown, + PageType::Playlist | PageType::Podcast => MusicPageType::Playlist, + PageType::Channel | PageType::Unknown => MusicPageType::None, + PageType::Episode => MusicPageType::Track { + vtype: MusicVideoType::Episode, + }, + } + } +} + +pub(crate) struct MusicPage { + pub id: String, + pub typ: MusicPageType, +} + +impl MusicPage { + /// Create a new MusicPage object, applying the required ID fixes when + /// mapping a browse link + pub fn from_browse(mut id: String, typ: PageType) -> Self { + if typ == PageType::Podcast { + id = util::strip_prefix(&id, util::PODCAST_PLAYLIST_PREFIX); + } else if typ == PageType::Episode && id.len() == 15 { + id = util::strip_prefix(&id, util::PODCAST_EPISODE_PREFIX); + } + + Self { + id, + typ: typ.into(), } } } impl NavigationEndpoint { /// Get the YouTube Music page and id from a browse/watch endpoint - pub(crate) fn music_page(self) -> Option<(MusicPageType, String)> { + pub(crate) fn music_page(self) -> Option { match self { NavigationEndpoint::Watch { watch_endpoint } => { if watch_endpoint @@ -233,17 +267,20 @@ impl NavigationEndpoint { .unwrap_or_default() { // Genre radios (e.g. "pop radio") will be skipped - Some((MusicPageType::None, watch_endpoint.video_id)) + Some(MusicPage { + id: watch_endpoint.video_id, + typ: MusicPageType::None, + }) } else { - Some(( - MusicPageType::Track { + Some(MusicPage { + id: watch_endpoint.video_id, + typ: MusicPageType::Track { vtype: watch_endpoint .watch_endpoint_music_supported_configs .watch_endpoint_music_config .music_video_type, }, - watch_endpoint.video_id, - )) + }) } } NavigationEndpoint::Browse { @@ -251,9 +288,9 @@ impl NavigationEndpoint { } => browse_endpoint .browse_endpoint_context_supported_configs .map(|config| { - ( - config.browse_endpoint_context_music_config.page_type.into(), + MusicPage::from_browse( browse_endpoint.browse_id, + config.browse_endpoint_context_music_config.page_type, ) }), NavigationEndpoint::Url { .. } => None, diff --git a/src/serializer/text.rs b/src/serializer/text.rs index 4d628af..90ad772 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -6,7 +6,9 @@ use serde::{Deserialize, Deserializer}; use serde_with::{serde_as, DeserializeAs, VecSkipError}; use crate::{ - client::response::url_endpoint::{MusicVideoType, NavigationEndpoint, PageType}, + client::response::url_endpoint::{ + MusicPage, MusicPageType, MusicVideoType, NavigationEndpoint, PageType, + }, model::UrlTarget, util, }; @@ -419,6 +421,23 @@ impl TextComponent { | TextComponent::Text { text } => text, } } + + pub fn music_page(self) -> Option { + match self { + TextComponent::Video { + video_id, vtype, .. + } => Some(MusicPage { + id: video_id, + typ: MusicPageType::Track { vtype }, + }), + TextComponent::Browse { + page_type, + browse_id, + .. + } => Some(MusicPage::from_browse(browse_id, page_type)), + _ => None, + } + } } impl From for String { diff --git a/src/util/mod.rs b/src/util/mod.rs index be7c50c..9de438d 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -41,6 +41,8 @@ pub const DOT_SEPARATOR: &str = " • "; pub const VARIOUS_ARTISTS: &str = "Various Artists"; pub const PLAYLIST_ID_ALBUM_PREFIX: &str = "OLAK"; pub const ARTIST_DISCOGRAPHY_PREFIX: &str = "MPAD"; +pub const PODCAST_PLAYLIST_PREFIX: &str = "MPSP"; +pub const PODCAST_EPISODE_PREFIX: &str = "MPED"; const CONTENT_PLAYBACK_NONCE_ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; @@ -474,6 +476,11 @@ pub fn country_from_name(name: &str) -> Option { .map(|i| COUNTRIES[i]) } +/// Strip prefix from string if presend +pub fn strip_prefix(s: &str, prefix: &str) -> String { + s.strip_prefix(prefix).unwrap_or(s).to_string() +} + /// An iterator over the chars in a string (in str format) pub struct SplitChar<'a> { txt: &'a str, diff --git a/tests/youtube.rs b/tests/youtube.rs index 687c010..6a34b15 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1664,7 +1664,9 @@ fn music_search_tracks(rp: RustyPipe, unlocalized: bool) { .items .iter() .find(|a| a.id == "BL-aIpCLWnU") - .unwrap(); + .unwrap_or_else(|| { + panic!("could not find track, got {:#?}", &res.items.items); + }); assert_eq!(track.name, "Black Mamba"); assert!(!track.cover.is_empty(), "got no cover"); @@ -1699,7 +1701,9 @@ fn music_search_videos(rp: RustyPipe, unlocalized: bool) { .items .iter() .find(|a| a.id == "ZeerrnuLi5E") - .unwrap(); + .unwrap_or_else(|| { + panic!("could not find video, got {:#?}", &res.items.items); + }); assert_eq!(track.name, "Black Mamba"); assert!(!track.cover.is_empty(), "got no cover"); @@ -1739,7 +1743,12 @@ fn music_search_episode(rp: RustyPipe, #[case] videos: bool) { .tracks }; - let track = &tracks.iter().find(|a| a.id == "Zq_-LDy7AgE").unwrap(); + let track = &tracks + .iter() + .find(|a| a.id == "Zq_-LDy7AgE") + .unwrap_or_else(|| { + panic!("could not find episode, got {:#?}", &tracks); + }); assert_eq!(track.artists.len(), 1); let track_artist = &track.artists[0]; @@ -1805,7 +1814,14 @@ fn music_search_albums( ) { let res = tokio_test::block_on(rp.query().music_search_albums(query)).unwrap(); - let album = &res.items.items.iter().find(|a| a.id == id).unwrap(); + let album = &res + .items + .items + .iter() + .find(|a| a.id == id) + .unwrap_or_else(|| { + panic!("could not find album, got {:#?}", &res.items.items); + }); assert_eq!(album.name, name); assert_eq!(album.artists.len(), 1); @@ -1836,7 +1852,9 @@ fn music_search_artists(rp: RustyPipe, unlocalized: bool) { .items .iter() .find(|a| a.id == "UCIh4j8fXWf2U0ro0qnGU8Mg") - .unwrap(); + .unwrap_or_else(|| { + panic!("could not find artist, got {:#?}", &res.items.items); + }); if unlocalized { assert_eq!(artist.name, "Namika"); } @@ -1871,7 +1889,9 @@ fn music_search_playlists(rp: RustyPipe, unlocalized: bool) { .items .iter() .find(|p| p.id == "RDCLAK5uy_nLtxizvEMkzYQUrA-bFf6MnBeR4bGYWUQ") - .expect("no playlist"); + .unwrap_or_else(|| { + panic!("could not find playlist, got {:#?}", &res.items.items); + }); if unlocalized { assert_eq!(playlist.name, "Today's Rock Hits"); @@ -1901,7 +1921,9 @@ fn music_search_playlists_community(rp: RustyPipe) { .items .iter() .find(|p| p.id == "PLMC9KNkIncKtGvr2kFRuXBVmBev6cAJ2u") - .expect("no playlist"); + .unwrap_or_else(|| { + panic!("could not find playlist, got {:#?}", &res.items.items); + }); assert_eq!( playlist.name, From a1ac25fda56c3668329e0b71c6f885783e36536a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 4 Nov 2023 01:36:49 +0100 Subject: [PATCH 057/459] fix: fetching channel info with different language --- src/client/channel.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/client/channel.rs b/src/client/channel.rs index 4af14ee..fa4d0ac 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -291,10 +291,14 @@ impl MapResponse for response::ChannelAbout { fn map_response( self, _id: &str, - lang: Language, + _lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, _visitor_data: Option<&str>, ) -> Result, ExtractionError> { + // Channel info is always fetched in English. There is no localized data there + // and it allows parsing the country name. + let lang = Language::En; + let ep = self .on_response_received_endpoints .into_iter() From 53cc9f1a27a5d4493da11d5ba4b37f8d7c685701 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 4 Nov 2023 02:03:17 +0100 Subject: [PATCH 058/459] fix: parsing Singhalese numbers --- src/util/mod.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/util/mod.rs b/src/util/mod.rs index 9de438d..c1c4f17 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -362,6 +362,7 @@ where let mut filtered = String::new(); let mut exp = 0; let mut after_point = false; + let mut last_number = false; for c in string.chars() { if c.is_ascii_digit() { @@ -370,6 +371,10 @@ where if after_point { exp -= 1; } + if !last_number { + filtered.push(' '); + last_number = true; + } } else if c == decimal_point && !digits.is_empty() { after_point = true; } else if !matches!( @@ -377,6 +382,7 @@ where '\u{200b}' | '\u{202b}' | '\u{202c}' | '\u{202e}' | '\u{200e}' | '\u{200f}' | '.' | ',' ) { c.to_lowercase().for_each(|c| filtered.push(c)); + last_number = false; } } @@ -636,6 +642,7 @@ pub(crate) mod tests { )] #[case(Language::As, "১ জন গ্ৰাহক", 1)] #[case(Language::Ru, "Зрителей, ожидающих начала трансляции: 6", 6)] + #[case(Language::Si, "වාදන මි4.6ක්", 4_600_000)] fn t_parse_large_numstr(#[case] lang: Language, #[case] string: &str, #[case] expect: u64) { let res = parse_large_numstr::(string, lang).unwrap(); assert_eq!(res, expect); From 4d124c6d981ca3bd68a78361cf728ec41d637400 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 4 Nov 2023 02:46:17 +0100 Subject: [PATCH 059/459] fix: a/b test 11: parsing like count with new data model --- codegen/src/abtest.rs | 18 +++++++++++++ notes/AB_Tests.md | 32 ++++++++++++++++++++++ src/client/response/video_details.rs | 40 ++++++++++++++++++++++++++++ src/client/video_details.rs | 17 +++++++----- 4 files changed, 100 insertions(+), 7 deletions(-) diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index a87873f..23dd8ea 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -27,6 +27,7 @@ pub enum ABTest { TrackViewcount = 8, PlaylistsForShorts = 9, ChannelAboutModal = 10, + LikeButtonViewmodel = 11, } const TESTS_TO_RUN: [ABTest; 3] = [ @@ -100,6 +101,7 @@ pub async fn run_test( ABTest::PlaylistsForShorts => playlists_for_shorts(&query).await, ABTest::TrackViewcount => track_viewcount(&query).await, ABTest::ChannelAboutModal => channel_about_modal(&query).await, + ABTest::LikeButtonViewmodel => like_button_viewmodel(&query).await, } .unwrap(); pb.inc(1); @@ -301,3 +303,19 @@ pub async fn channel_about_modal(rp: &RustyPipeQuery) -> Result { .unwrap(); Ok(!res.contains("\"EgVhYm91dPIGBAoCEgA%3D\"")) } + +pub async fn like_button_viewmodel(rp: &RustyPipeQuery) -> Result { + let res = rp + .raw( + ClientType::Desktop, + "next", + &QVideo { + context: rp.get_context(ClientType::Desktop, true, None).await, + video_id: "ZeerrnuLi5E", + content_check_ok: true, + racy_check_ok: true, + }, + ) + .await?; + Ok(res.contains("\"segmentedLikeDislikeButtonViewModel\"")) +} diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index 20efb3b..a6108e8 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -432,3 +432,35 @@ channel metadata has to be fetched. The new modal uses a continuation request with a token which can be easily generated. Attempts to fetch the old about tab with the A/B test enabled will lead to a redirect to the main tab. + +## [11] Like-Button viewmodel + +- **Encountered on:** 03.11.2023 +- **Impact:** 🟢 Low +- **Endpoint:** next + +YouTube introduced an updated date model for the like/dislike buttons. The new model +looks needlessly complex but contains the same parsing-relevant data as the old model +(accessibility text to get like count). + +```json +{ + "segmentedLikeDislikeButtonViewModel": { + "likeButtonViewModel": { + "likeButtonViewModel": { + "toggleButtonViewModel": { + "toggleButtonViewModel": { + "defaultButtonViewModel": { + "buttonViewModel": { + "iconName": "LIKE", + "title": "4.2M", + "accessibilityText": "like this video along with 4,209,059 other people" + } + } + } + } + } + } + } +} +``` diff --git a/src/client/response/video_details.rs b/src/client/response/video_details.rs index c9b4d2e..50373d7 100644 --- a/src/client/response/video_details.rs +++ b/src/client/response/video_details.rs @@ -147,6 +147,46 @@ pub(crate) enum TopLevelButton { SegmentedLikeDislikeButtonRenderer { like_button: ToggleButtonWrap, }, + #[serde(rename_all = "camelCase")] + SegmentedLikeDislikeButtonViewModel { + like_button_view_model: LikeButtonViewModelWrap, + }, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct LikeButtonViewModelWrap { + pub like_button_view_model: LikeButtonViewModel, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct LikeButtonViewModel { + pub toggle_button_view_model: ToggleButtonViewModelWrap, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ToggleButtonViewModelWrap { + pub toggle_button_view_model: ToggleButtonViewModel, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ToggleButtonViewModel { + pub default_button_view_model: ButtonViewModelWrap, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ButtonViewModelWrap { + pub button_view_model: ButtonViewModel, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ButtonViewModel { + pub accessibility_text: String, } /// Like/Dislike button diff --git a/src/client/video_details.rs b/src/client/video_details.rs index 32b63f4..14949be 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -159,17 +159,20 @@ impl MapResponse for response::VideoDetails { video_actions, date_text, }) => { - let like_btn = video_actions + let like_text = video_actions .menu_renderer .top_level_buttons .into_iter() .find_map(|button| { - let btn = match button { - response::video_details::TopLevelButton::ToggleButtonRenderer(btn) => btn, - response::video_details::TopLevelButton::SegmentedLikeDislikeButtonRenderer { like_button } => like_button.toggle_button_renderer, + let (icon, text) = match button { + response::video_details::TopLevelButton::ToggleButtonRenderer(btn) => (btn.default_icon.icon_type, btn.accessibility_data), + response::video_details::TopLevelButton::SegmentedLikeDislikeButtonRenderer { like_button } => (like_button.toggle_button_renderer.default_icon.icon_type, like_button.toggle_button_renderer.accessibility_data), + response::video_details::TopLevelButton::SegmentedLikeDislikeButtonViewModel { like_button_view_model } => { + (IconType::Like, like_button_view_model.like_button_view_model.toggle_button_view_model.toggle_button_view_model.default_button_view_model.button_view_model.accessibility_text) + }, }; - match btn.default_icon.icon_type { - IconType::Like => Some(btn), + match icon { + IconType::Like => Some(text), _ => None } }); @@ -184,7 +187,7 @@ impl MapResponse for response::VideoDetails { .unwrap_or_default(), // accessibility_data contains no digits if the like count is hidden, // so we ignore parse errors here for now - like_btn.and_then(|btn| util::parse_numeric(&btn.accessibility_data).ok()), + like_text.and_then(|txt| util::parse_numeric(&txt).ok()), date_text.as_deref().and_then(|txt| { timeago::parse_textual_date_or_warn(lang, txt, &mut warnings) }), From b14508063179dc94b375769ff5f4cfb2e75d5db0 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 5 Nov 2023 16:55:27 +0100 Subject: [PATCH 060/459] add test for a/b11 --- ...sts__map_video_details_20231103_likes.snap | 906 + src/client/video_details.rs | 9 +- .../video_details_20231103_likes.json | 20913 ++++++++++++++++ 3 files changed, 21824 insertions(+), 4 deletions(-) create mode 100644 src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20231103_likes.snap create mode 100644 testfiles/video_details/video_details_20231103_likes.json diff --git a/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20231103_likes.snap b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20231103_likes.snap new file mode 100644 index 0000000..2ef29b3 --- /dev/null +++ b/src/client/snapshots/rustypipe__client__video_details__tests__map_video_details_20231103_likes.snap @@ -0,0 +1,906 @@ +--- +source: src/client/video_details.rs +expression: map_res.c +--- +VideoDetails( + id: "ZeerrnuLi5E", + name: "aespa 에스파 \'Black Mamba\' MV", + description: RichText([ + Text( + text: "🎧Listen and download aespa\'s debut single \"Black Mamba\": ", + ), + Web( + text: "https://smarturl.it/aespa_BlackMamba", + url: "https://smarturl.it/aespa_BlackMamba", + ), + Text( + text: "\n🐍The Debut Stage ", + ), + YouTube( + text: "aespa 에스파 \'Black Mamba\' The Debut Stage", + target: Video( + id: "Ky5RT5oGg0w", + start_time: 0, + ), + ), + Text( + text: "\n\n🎟\u{fe0f} aespa Showcase SYNK in LA! Tickets now on sale: ", + ), + Web( + text: "https://www.ticketmaster.com/event/0A...", + url: "https://www.ticketmaster.com/event/0A005CCD9E871F6E", + ), + Text( + text: "\n\nSubscribe to aespa Official YouTube Channel!\n", + ), + Web( + text: "https://www.youtube.com/aespa?sub_con...", + url: "https://www.youtube.com/aespa?sub_confirmation=1", + ), + Text( + text: "\n\naespa official\n", + ), + Web( + text: "aespa", + url: "https://www.youtube.com/c/aespa", + ), + Text( + text: "\n", + ), + Web( + text: "aespa_official", + url: "https://www.instagram.com/aespa_official", + ), + Text( + text: "\n", + ), + Web( + text: "aespa_official", + url: "https://www.tiktok.com/@aespa_official", + ), + Text( + text: "\n", + ), + Web( + text: "aespa_official", + url: "https://twitter.com/aespa_Official", + ), + Text( + text: "\n", + ), + Web( + text: "aespa.official", + url: "https://www.facebook.com/aespa.official", + ), + Text( + text: "\n", + ), + Web( + text: "https://weibo.com/aespa", + url: "https://weibo.com/aespa", + ), + Text( + text: "\n\n", + ), + Text( + text: "#aespa", + ), + Text( + text: " ", + ), + Text( + text: "#æspa", + ), + Text( + text: " ", + ), + Text( + text: "#BlackMamba", + ), + Text( + text: " ", + ), + Text( + text: "#블랙맘바", + ), + Text( + text: " ", + ), + Text( + text: "#에스파", + ), + Text( + text: "\naespa 에스파 \'Black Mamba\' MV ℗ SM Entertainment", + ), + ]), + channel: ChannelTag( + id: "UCEf_Bc-KVd7onSeifS3py9g", + name: "SMTOWN", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s48-c-k-c0x00ffffff-no-rj", + width: 48, + height: 48, + ), + Thumbnail( + url: "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s88-c-k-c0x00ffffff-no-rj", + width: 88, + height: 88, + ), + Thumbnail( + url: "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s176-c-k-c0x00ffffff-no-rj", + width: 176, + height: 176, + ), + ], + verification: Verified, + subscriber_count: Some(32100000), + ), + view_count: 255522287, + like_count: Some(4209059), + publish_date: "[date]", + publish_date_txt: Some("Nov 17, 2020"), + is_live: false, + is_ccommons: false, + chapters: [], + recommended: Paginator( + count: None, + items: [ + VideoItem( + id: "4TWR90KJl84", + name: "aespa 에스파 \'Next Level\' MV", + length: Some(236), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBYCGc-AKsDC6UpJgIZw2_VsqjVWA", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDh-eDxZBmrNsHcb6pYX0Gyx6gJ8Q", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCEf_Bc-KVd7onSeifS3py9g", + name: "SMTOWN", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("2 years ago"), + view_count: Some(277189882), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "yQUU29NwNF4", + name: "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122", + length: Some(213), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA4pIWwOFmVuVU-jZ-j7S4GvgxjKw", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC4B3H-paMDpjdf_V6NsymGNvVicQ", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCS_hnpJLQTvBkqALgapi_4g", + name: "스브스케이팝 X INKIGAYO", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/Uxpz5J0EcsFJRbqh4Ip7i3TTNsxTh5jVUxfZmV1DTrCQM_ihfzBGMmkfSRGWoFK9M0anhIie=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: None, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("2 years ago"), + view_count: Some(10870401), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "mTmm0y73ZtM", + name: "Secret Missions: 7 Thrilling Spy and Secret Agent Stories", + length: Some(6811), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDz3aKv3IbWrI5GmtWjWl2br6h7jw", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCNnJtMt14Dn6iNSSHZtZL5MsYDtQ", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCSVngVJ_0s0ZX4oiN_4ZkaQ", + name: "My Story Shared", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/ytc/APkrFKbfZM35CSjtdsk3QIcEvalm3yoAzCkgZptcgSfNHw=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: None, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("9 days ago"), + view_count: Some(888941), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "xBnSq8JKlZw", + name: "16 Eylül 2023", + length: Some(7971), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGUgUChFMA8=&rs=AOn4CLDBvW0PORHHExpND8qbAa0OCr5MMw", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhlIFAoRTAP&rs=AOn4CLASNCymIttQ1GwgbWvtxD_KeG5yGw", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCcyqrKg5jlvVJy1nc-0igRQ", + name: "Buğlem TV", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/_kbdhEVJB2pzgy-qLRGQQ5sCPPZnEVeljgVrk0KZxPe8UxT8mm5ZZp7Zn6TGMcBMcpCG-zPi1YI=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: None, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("1 month ago"), + view_count: Some(8407), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "fE2h3lGlOsk", + name: "ITZY \"WANNABE\" M/V @ITZY", + length: Some(219), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC44Q0lpu5a8rltgTMxi0X2QA6jnQ", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC6F85UnQjP3_9U0gehdYbbF6NTxw", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCaO6TYtlC8U5ttz62hTrZgg", + name: "JYP Entertainment", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/kcV7NQkBm-UvvzVTJvrg1Yf1eHSqi-DLXuZPt_ECa3cHEPefujS951Dxj6KUEQ5i9Z7_fyMUjw=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("3 years ago"), + view_count: Some(523737389), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "NU611fxGyPU", + name: "aespa 에스파 \'Black Mamba\' Dance Practice", + length: Some(175), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAgKORzcy6WKosI1_PAVWDgcjJ9jA", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDqWWIfLCdtyqy5aIUA_PGcEW2r2g", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC9GtSLeksfK4yuJ_g1lgQbg", + name: "aespa", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/rLxODcRttuDvITkAJruNIDlDkVMEsPVuHJyMQDjeYqoFh80JyGwfXXMOZgZXd6-iKuf9rifqYQ=s88-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Artist, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("2 years ago"), + view_count: Some(40486850), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "dYRITmpFbJ4", + name: "aespa 에스파 \'Girls\' MV", + length: Some(269), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBOxN6ukbZNOPwUBhRZYgG9r23lng", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBLmRDhzBtNHCuokfKRQufiNKKfZg", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCEf_Bc-KVd7onSeifS3py9g", + name: "SMTOWN", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("1 year ago"), + view_count: Some(135870843), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "jiFBY6gk3Lk", + name: "BLACKPINK x AESPA – Pink Venom / Black Mamba MASHUP (feat. Next Level)", + length: Some(240), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLARhXJ8KOxiWpj430QpyKF2m3LJFQ", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDGOkNsfHOpy9GLXoHn1rnIOn0CcA", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC5XWNylwy4efFufjMYqcglw", + name: "Miggy Smallz", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/ytc/APkrFKYR2j9afW3H0lgdKwD8qPiIZvZBfCSLxAZQRiUB=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: None, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("1 year ago"), + view_count: Some(4218059), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "CM4CkVFmTds", + name: "TWICE \"I CAN\'T STOP ME\" M/V", + length: Some(221), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBfd7QADIduQSR2ESLIp1k5gxxNDg", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDRn7hTXV_Ls30E6BQNZQtQjbuEpA", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCaO6TYtlC8U5ttz62hTrZgg", + name: "JYP Entertainment", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/kcV7NQkBm-UvvzVTJvrg1Yf1eHSqi-DLXuZPt_ECa3cHEPefujS951Dxj6KUEQ5i9Z7_fyMUjw=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("3 years ago"), + view_count: Some(509192107), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "WPdWvnAAurg", + name: "aespa 에스파 \'Savage\' MV", + length: Some(259), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDQGxlnDkAdMYRm2cdkDmiDbBDpYw", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAIHFE0eH_r-HP7DRPv1QJJnRDzWw", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCEf_Bc-KVd7onSeifS3py9g", + name: "SMTOWN", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("2 years ago"), + view_count: Some(245301963), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "OgabtEgG_kg", + name: "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP \' I\'VE MINE TRACKLIST", + length: Some(1034), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGkgaShpMA8=&rs=AOn4CLBF1lxbztXMyXmem4owNAWZRqvnBA", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhpIGkoaTAP&rs=AOn4CLAqM-WuOQCGTABX_NmzvOUOhx3rLA", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCo7jZg0Q5jBWs0WSq_SdDoA", + name: "x i a o s h i z i", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/ErguVbkzrIKe0hezWviLvuCCGLaQYlrSWQ7Dw6beAwNJnR1ed7NV3pokG_z_I7GQvxfUybB4tg=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: None, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("7 days ago"), + view_count: Some(1719), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "cSqOY5nktfg", + name: "BLACKPINK THE GAME - ‘THE GIRLS’ MV", + length: Some(164), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDkx-bmEWvYbs8ju1cETIRE1AczFQ", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAYPPC91mec_MPvRxjRBzTpwFDBUQ", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCOmHUn--16B90oW2L6FRR3A", + name: "BLACKPINK", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/hZDUwjoeQqigphL4A1tkg9c6hVp5yXmbboBR7PYFUSFj5PIJSA483NB5v7b0XVoTN9GCku3tqQ=s88-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Artist, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("2 months ago"), + view_count: Some(61284005), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "i8fRCkq5tbw", + name: "aespa 에스파 ‘ep.2 Next Level’ – SM Culture Universe", + length: Some(1040), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/i8fRCkq5tbw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBGcGKSQOqvI_5ZONNturhZZmkysQ", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/i8fRCkq5tbw/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBQsyuNIuuztFQo2FdweYiROIJY3A", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC9GtSLeksfK4yuJ_g1lgQbg", + name: "aespa", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/rLxODcRttuDvITkAJruNIDlDkVMEsPVuHJyMQDjeYqoFh80JyGwfXXMOZgZXd6-iKuf9rifqYQ=s88-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Artist, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("1 year ago"), + view_count: Some(5419659), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "erCzl8x9Zuo", + name: "에스파(AESPA) 2023 lotte family concert Full Ver. (Black Mamba +thirsty + Illusion+next level+ Spicy)", + length: Some(1192), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/erCzl8x9Zuo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBF18qnuz8guk309k2UUh4xnLuazg", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/erCzl8x9Zuo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB36E2CQnz-l8QtgUEYQfGADaZJdA", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC8yPhlmo-4MY5ZfF-cw3JRg", + name: "Rock Music", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/ytc/APkrFKYogJDjV-mjqi-JeTWKU7PwH_gKL2x9Thq04YuANQ=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("4 months ago"), + view_count: Some(392124), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "7HDeem-JaSY", + name: "(여자)아이들((G)I-DLE) - \'퀸카 (Queencard)\' Official Music Video", + length: Some(211), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/7HDeem-JaSY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC_jASE2yooEXAN64rj8-1_AJZl6A", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/7HDeem-JaSY/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDq-8lmFENHZeVvK5bQBvpnqEDFIQ", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCritGVo7pLJLUS8wEu32vow", + name: "(G)I-DLE (여자)아이들 (Official YouTube Channel)", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/ytc/APkrFKbGrI182ZniS64zKXUGr2CeJ9tMxoa9w90e6SaZkA=s88-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Artist, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("5 months ago"), + view_count: Some(259400824), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "9JFi7MmjtGA", + name: "VIVIZ (비비지) - \'MANIAC\' MV", + length: Some(197), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/9JFi7MmjtGA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLALaqiHHm-fnm1TQHpD9PG-zGd-hg", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/9JFi7MmjtGA/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD1uM6lf5nCYUj8ZbzAtNYfwb4Z4Q", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC6YMr57knEIYXOOKMmYAFXQ", + name: "BPM Entertainment", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/jltaW4jLrF76MrBe-HKcIQoop67mOF3QLdGzFiYwB-Pt7qKv4X7VECkCzfvkn037abuy6zV0bg=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: None, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("1 day ago"), + view_count: Some(2807502), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "NoYKBAajoyo", + name: "EVERGLOW (에버글로우) - DUN DUN MV", + length: Some(209), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/NoYKBAajoyo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC3OhCUbjpIclmjfV8W8T98nVI5pA", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/NoYKBAajoyo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA-CdJunWg1z_pnrT55qagTHnxkdQ", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC_pwIXKXNm5KGhdEVzmY60A", + name: "Stone Music Entertainment", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/XIxEtKkvUSLHiDBazM8kYyKpyESz5LM--vG0F7aMsiqOC2o_IZaKztsqDMj2mcn4ciQzFbvu=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("3 years ago"), + view_count: Some(286088204), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "pyf8cbqyfPs", + name: "LE SSERAFIM (르세라핌) \'ANTIFRAGILE\' OFFICIAL M/V", + length: Some(232), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/pyf8cbqyfPs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAu-V-1EWwbHjZTNTO-vuP_O_WB3Q", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/pyf8cbqyfPs/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCxVrNDDgEYMZWgOukne2kgOV2Vhg", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UC3IZKseVpdzPSBaWxBxundA", + name: "HYBE LABELS", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/ytc/APkrFKaWqx5IfcKbi5z8FgPsM_kA6NQ2zTAx8gr27yQcdQ=s68-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Verified, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("1 year ago"), + view_count: Some(196956308), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "32si5cfrCNc", + name: "BLACKPINK - \'How You Like That\' DANCE PERFORMANCE VIDEO", + length: Some(181), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/32si5cfrCNc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBjimPvMxDwTmPBlKX8Buo9EjMeOg", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/32si5cfrCNc/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDCsJMBcdZaForwAnhjYy3L1JT1hQ", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCOmHUn--16B90oW2L6FRR3A", + name: "BLACKPINK", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/hZDUwjoeQqigphL4A1tkg9c6hVp5yXmbboBR7PYFUSFj5PIJSA483NB5v7b0XVoTN9GCku3tqQ=s88-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Artist, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("3 years ago"), + view_count: Some(1522365959), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "bwmSjveL3Lc", + name: "BLACKPINK - \'붐바야 (BOOMBAYAH)\' M/V", + length: Some(244), + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/bwmSjveL3Lc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDRzdujtL9QM0RZ8elD00oS2fXMhg", + width: 168, + height: 94, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/bwmSjveL3Lc/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBOprayVWEKYsgHjpoCw6GFcV3Hng", + width: 336, + height: 188, + ), + ], + channel: Some(ChannelTag( + id: "UCOmHUn--16B90oW2L6FRR3A", + name: "BLACKPINK", + avatar: [ + Thumbnail( + url: "https://yt3.ggpht.com/hZDUwjoeQqigphL4A1tkg9c6hVp5yXmbboBR7PYFUSFj5PIJSA483NB5v7b0XVoTN9GCku3tqQ=s88-c-k-c0x00ffffff-no-rj", + width: 68, + height: 68, + ), + ], + verification: Artist, + subscriber_count: None, + )), + publish_date: "[date]", + publish_date_txt: Some("7 years ago"), + view_count: Some(1646522795), + is_live: false, + is_short: false, + is_upcoming: false, + short_description: None, + ), + ], + ctoken: Some("CBQSExILWmVlcnJudUxpNUXAAQHIAQEYACqjDjJzNkw2d3pUQ2dyUUNnb0Q4ajRBQ2c3Q1Bnc0l6cS1tbFBTLTVKcmhBUW9EOGo0QUNnM0NQZ29JM3I3Z2pfdVl2b2QwQ2c3Q1Bnc0lfZUNBXzQyNl9OV1pBUW9Pd2o0TENQWHE1Y3Z0Z3VlZDVRRUtEc0ktQ3dqazRNencwS19abUpJQkNnM0NQZ29JNHItUm91ZVkxTXBRQ2czQ1Bnb0k4OVRQNGNXMzBJd1JDZzNDUGdvSTRxYmZ6TS11b2ZFRENnN0NQZ3NJX2RIeWs5el9tS0t4QVFvT3dqNExDT24yeE1ycDdKS3JpQUVLRGNJLUNnaVpvcUNKbGFDZ2lVNEtBX0ktQUFvT3dqNExDTjdvd0p1OW04V0N5UUVLQV9JLUFBb093ajRMQ05QTjNmZXkydW1jbVFFS0FfSS1BQW9Pd2o0TENKeXJxcEs4MWZTTXhBRUtBX0ktQUFvTndqNEtDTW4xbEkzbHUtaW1mQW9EOGo0QUNnM0NQZ29JOVpHYjR0LTZyYWMxQ2dQeVBnQUtEY0ktQ2dpZTJaWFM1b21Td25VS0FfSS1BQW9Pd2o0TENMbTVrOEc2ck5DUWpnRUtBX0ktQUFvTndqNEtDTnVibVl1VjBvRG5DQW9EOGo0QUNnM0NQZ29JdVBXQ2dPZlgxZnRZQ2dQeVBnQUtEY0ktQ2dqSV9KdkF4UGFtZ3pvS0FfSS1BQW9Od2o0S0NQanJrcy01ektPVmNRb0Q4ajRBQ2c3Q1Bnc0l2T3ZtMWFTaDlPT0xBUW9EOGo0QUNnM0NQZ29JNnMzMTRfenlyTmg2Q2dQeVBnQUtEc0ktQ3dpbTBxWDhwcy0zdU93QkNnUHlQZ0FLRHNJLUN3amc2STdOek4zWXlQUUJDZ1B5UGdBS0RjSS1DZ2lxeG82MXdNQ0N3ellLQV9JLUFBb093ajRMQ1B2NXlkV2Jqdi1UcHdFS0FfSS1BQW9Pd2o0TENOZVJyTF9jM01pMTN3RUtBX0ktQUFvTndqNEtDTGU1cjd6djBlU0Vid29EOGo0QUNnM0NQZ29JLXNXX3I1ZWI4c01XQ2czQ1Bnb0lpLUdvNjlYMnlfc3JDZzNDUGdvSWlObnc4SmowcHZGbENnM0NQZ29Jczl1ODM4Xzdrc0ZGQ2c3Q1Bnc0k5cnZkNFpqNjlNX2VBUW9Pd2o0TENPQ1VrNG5zbXVMTV9nRUtEc0ktQ3dpMHFySEkzc0R0cGJjQkNnN0NQZ3NJazlxdjZNV2FwY2JhQVFvT3dqNExDTVN6djQyOHhxcUstUUVLRHNJLUN3allfNm5FNXAzVjdMc0JDZzdDUGdzSXNQNjV1ZjdpcEtyV0FRb093ajRMQ05hdWlJWDJwX2VyOFFFS0RzSS1Dd2pvcTlEUG11Nmx6ZEFCQ2c3Q1Bnc0lwNnZFaWNuQ3A1ZUxBUW9Pd2o0TENJQ244cG1vejhuLWlnRUtEY0ktQ2dpSG91emdoS18xdlQwS0RzSS1Dd2pXNE9qcV8tUGFpcHdCQ2c3Q1Bnc0k4ZV9Hbi16bTN2U2pBUW9Od2o0S0NLMjh0WTZJaUtETkd3b093ajRMQ0tfdHlOZXF3T3VCMUFFS0RzSS1Dd2pja3BPWnR0S1AtNDhCQ2c3Q1Bnc0kxSldKNjgyU21lN3dBUW9Od2o0S0NMWE52ZUNUN1pfLVpnb093ajRMQ0pMSHM0eTFrX3FJcXdFU0ZnQUNEUThSRXhVWEdSc2RIeUVqSlNjcEt5MHZNVE1hQkFnQUVBRWFCQWdDRUFNYUJBZ0NFQVFhQkFnQ0VBVWFCQWdDRUFZYUJBZ0NFQWNhQkFnQ0VBZ2FCQWdDRUFrYUJBZ0NFQW9hQkFnQ0VBc2FCQWdDRUF3YUJBZ05FQTRhQkFnUEVCQWFCQWdSRUJJYUJBZ1RFQlFhQkFnVkVCWWFCQWdYRUJnYUJBZ1pFQm9hQkFnYkVCd2FCQWdkRUI0YUJBZ2ZFQ0FhQkFnaEVDSWFCQWdqRUNRYUJBZ2xFQ1lhQkFnbkVDZ2FCQWdwRUNvYUJBZ3JFQ3dhQkFndEVDNGFCQWd2RURBYUJBZ3hFRElhQkFnekVBY2FCQWd6RURRYUJBZ3pFRFVhQkFnekVEWWFCQWd6RURjYUJBZ3pFRGdhQkFnekVEa2FCQWd6RURvYUJBZ3pFRHNhQkFnekVEd2FCQWd6RUQwYUJBZ3pFRDRhQkFnekVBd2FCQWd6RUFVYUJBZ3pFRDhhQkFnekVFQWFCQWd6RUVFYUJBZ3pFRUlhQkFnekVFTWFCQWd6RUVRYUJBZ3pFRVVhQkFnekVBTWFCQWd6RUVZYUJBZ3pFRWNhQkFnekVFZ2FCQWd6RUVrYUJBZ3pFQVlhQkFnekVBUWFCQWd6RUVvYUJBZ3pFRXNxRmdBQ0RROFJFeFVYR1JzZEh5RWpKU2NwS3kwdk1UTWoPd2F0Y2gtbmV4dC1mZWVk"), + endpoint: next, + ), + top_comments: Paginator( + count: Some(703000), + items: [], + ctoken: Some("Eg0SC1plZXJybnVMaTVFGAYyJSIRIgtaZWVycm51TGk1RTAAeAJCEGNvbW1lbnRzLXNlY3Rpb24%3D"), + endpoint: next, + ), + latest_comments: Paginator( + count: Some(703000), + items: [], + ctoken: Some("Eg0SC1plZXJybnVMaTVFGAYyOCIRIgtaZWVycm51TGk1RTABeAIwAUIhZW5nYWdlbWVudC1wYW5lbC1jb21tZW50cy1zZWN0aW9u"), + endpoint: next, + ), + visitor_data: None, +) diff --git a/src/client/video_details.rs b/src/client/video_details.rs index 14949be..107843e 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -110,7 +110,7 @@ impl MapResponse for response::VideoDetails { let video_id = current_video_endpoint.watch_endpoint.video_id; if id != video_id { return Err(ExtractionError::WrongResult(format!( - "got wrong playlist id {video_id}, expected {id}" + "got wrong video id {video_id}, expected {id}" ))); } @@ -572,9 +572,10 @@ mod tests { #[case::chapters("chapters", "nFDBxBUfE74")] #[case::live("live", "86YLFOog4GM")] #[case::agegate("agegate", "HRKu0cvrr_o")] - #[case::newdesc("20220924_newdesc", "ZeerrnuLi5E")] - #[case::new_cont("20221011_new_continuation", "ZeerrnuLi5E")] - #[case::no_recommends("20221011_rec_isr", "nFDBxBUfE74")] + #[case::ab_newdesc("20220924_newdesc", "ZeerrnuLi5E")] + #[case::ab_new_cont("20221011_new_continuation", "ZeerrnuLi5E")] + #[case::ab_no_recommends("20221011_rec_isr", "nFDBxBUfE74")] + #[case::ab_new_likes("20231103_likes", "ZeerrnuLi5E")] fn map_video_details(#[case] name: &str, #[case] id: &str) { let json_path = path!(*TESTFILES / "video_details" / format!("video_details_{name}.json")); let json_file = File::open(json_path).unwrap(); diff --git a/testfiles/video_details/video_details_20231103_likes.json b/testfiles/video_details/video_details_20231103_likes.json new file mode 100644 index 0000000..088c632 --- /dev/null +++ b/testfiles/video_details/video_details_20231103_likes.json @@ -0,0 +1,20913 @@ +{ + "responseContext": { + "serviceTrackingParams": [ + { + "service": "CSI", + "params": [ + { + "key": "c", + "value": "WEB" + }, + { + "key": "cver", + "value": "2.20231101.05.00" + }, + { + "key": "yt_li", + "value": "0" + }, + { + "key": "GetWatchNext_rid", + "value": "0x6f87674ee78dc6b2" + } + ] + }, + { + "service": "GFEEDBACK", + "params": [ + { + "key": "logged_in", + "value": "0" + }, + { + "key": "e", + "value": "23804281,23946420,23966208,23983296,23986026,23998056,24004644,24007246,24034168,24036948,24077241,24080738,24120820,24135310,24140247,24166867,24181174,24187377,24241378,24255543,24255545,24288664,24290971,24291857,24363607,24367580,24367821,24371398,24371778,24373396,24377322,24377598,24377909,24379354,24382552,24385612,24385727,24387949,24389605,24390675,24428788,24439361,24451319,24453989,24458317,24458324,24458329,24458839,24468724,24485421,24499532,24506515,24506784,24515423,24517093,24518452,24524098,24526515,24526644,24526772,24526783,24526794,24526801,24526808,24526815,24526827,24528463,24528470,24528473,24528484,24528550,24528559,24528573,24528584,24528640,24528651,24528657,24528666,24535859,24537200,24539025,24540881,24541326,24541656,24542367,24542452,24543193,24543197,24543201,24546059,24546075,24547317,24548138,24548627,24548629,24548853,24549786,24549918,24550285,24550458,24559328,24560416,24561138,24561158,24561208,24563746,24566293,24566687,24569887,24585907,24586420,24586687,24588590,24589119,24589492,24650809,24694842,24696752,24697067,24698452,24699899,39324156,51000798,51003636,51004018,51006075,51006181,51006338,51007406,51009392,51009757,51009781,51009900,51010235,51011488,51012165,51012291,51012659,51014091,51014630,51016856,51017346,51018315,51019442,51019626,51020302,51020570,51021953,51022241,51024036,51025415,51025487,51025833,51026266,51026805,51027535,51027870,51028271,51030103,51030311,51030435,51031412,51032410,51032492,51033399,51033577,51034526,51035883,51036438,51036511,51036735,51037342,51037351,51037540,51038227,51038399,51038805,51039492,51040337,51040339,51040349,51040473,51041266,51041292,51041331,51041497,51041809,51041957,51043059,51043409,51043763,51043940,51044158,51044608,51045016,51045969,51046273,51046900,51047726,51048240,51048254,51048489,51049613,51051962,51052749,51053017,51053610,51053957,51054500" + } + ] + }, + { + "service": "GUIDED_HELP", + "params": [ + { + "key": "logged_in", + "value": "0" + } + ] + }, + { + "service": "ECATCHER", + "params": [ + { + "key": "client.version", + "value": "2.20231101" + }, + { + "key": "client.name", + "value": "WEB" + }, + { + "key": "client.fexp", + "value": "51041809,24290971,24379354,24697067,24550458,24458329,24515423,23966208,51009900,24377909,51006075,51032410,51038227,51022241,51040349,51004018,51046900,51053610,24561138,51045016,24528640,51035883,24140247,24566293,24255545,51009757,24539025,24526827,24385612,24385727,23983296,24080738,24549918,24541326,51019442,24698452,51054500,24387949,24696752,51048489,24541656,24428788,51012165,24550285,51041292,51037342,51051962,51038399,51007406,51039492,24694842,24528559,51027535,51036438,24526783,24377598,24034168,51006181,24077241,24004644,51044158,24528573,24540881,24371398,24546059,24537200,24390675,24589492,24528473,51034526,24382552,24367580,51031412,24036948,24561158,24585907,24561208,51014091,51011488,51000798,24650809,51043763,24528666,51030103,51014630,24563746,24543197,51046273,23804281,51053017,51030311,51003636,51047726,24589119,24181174,51025487,24547317,51037351,51043059,51020302,24288664,23946420,24566687,51012659,24528550,23998056,24560416,51037540,24499532,24389605,51041266,24569887,24120820,51025415,24291857,51041331,24371778,24549786,24528651,51036735,51032492,24007246,24135310,24526515,51043409,51028271,51045969,24255543,51025833,51017346,24528470,24363607,24528657,24548627,24453989,51041497,24373396,24548138,24377322,51010235,24546075,24439361,51030435,24526644,51036511,51033577,24187377,24524098,51012291,51020570,51024036,24528463,24506515,51041957,51026805,51006338,51040339,24526801,24241378,24166867,51026266,51040337,24468724,51019626,24588590,24367821,24485421,24526794,24517093,51016856,24518452,24458839,51052749,51048240,51040473,24528484,24458324,39324156,24526815,24543201,51053957,24526808,23986026,24586687,24548853,24458317,51027870,51044608,51048254,24526772,24542367,51043940,51049613,24506784,51038805,24528584,51021953,51009392,24699899,51018315,24559328,24548629,51033399,24535859,24543193,24586420,51009781,24451319,24542452" + } + ] + } + ], + "mainAppWebResponseContext": { + "loggedOut": true, + "trackingParam": "kx_fmPxhoPZRDTMjLTt07RR6I1jTfxsLgIBCALj8ol1MYiHRgkussh7BwOcCE59TDtslLKPQ-SS" + }, + "webResponseContextExtensionData": { + "webPrefetchData": { + "navigationEndpoints": [ + { + "clickTrackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfcyDHJlbGF0ZWQtYXV0b0iRl67c5_Xq82WaAQUIAxD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg&pp=QAFIAQ%3D%3D", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "params": "EAEYAdoBBAgBKgA%3D", + "playerParams": "QAFIAQ%3D%3D", + "watchEndpointSupportedPrefetchConfig": { + "prefetchHintConfig": { + "prefetchPriority": 0, + "countdownUiRelativeSecondsPrefetchCondition": -3 + } + } + } + }, + { + "clickTrackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfcyDHJlbGF0ZWQtYXV0b0iRl67c5_Xq82WaAQUIAxD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg&pp=QAFIAQ%3D%3D", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "params": "EAEYAdoBBAgBKgA%3D", + "playerParams": "QAFIAQ%3D%3D", + "watchEndpointSupportedPrefetchConfig": { + "prefetchHintConfig": { + "prefetchPriority": 0, + "countdownUiRelativeSecondsPrefetchCondition": -3 + } + } + } + }, + { + "clickTrackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfcyDHJlbGF0ZWQtYXV0b0iRl67c5_Xq82WaAQUIAxD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg&pp=QAFIAQ%3D%3D", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "params": "EAEYAdoBBAgBKgA%3D", + "playerParams": "QAFIAQ%3D%3D", + "watchEndpointSupportedPrefetchConfig": { + "prefetchHintConfig": { + "prefetchPriority": 0, + "countdownUiRelativeSecondsPrefetchCondition": -3 + } + } + } + } + ] + }, + "hasDecorated": true + } + }, + "contents": { + "twoColumnWatchNextResults": { + "results": { + "results": { + "contents": [ + { + "videoPrimaryInfoRenderer": { + "title": { + "runs": [ + { + "text": "aespa 에스파 'Black Mamba' MV" + } + ] + }, + "viewCount": { + "videoViewCountRenderer": { + "viewCount": { + "simpleText": "255,522,287 views" + }, + "shortViewCount": { + "simpleText": "255M views" + }, + "originalViewCount": "0" + } + }, + "videoActions": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Report" + } + ] + }, + "icon": { + "iconType": "FLAG" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Need to report the video?" + } + ] + }, + "content": { + "runs": [ + { + "text": "Sign in to report content that breaks our rules.\n\nYou can also file a " + }, + { + "text": "legal complaint", + "navigationEndpoint": { + "clickTrackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://support.google.com/youtube/?p=report_illegal_content&hl=en", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://support.google.com/youtube/?p=report_illegal_content&hl=en" + } + } + }, + { + "text": " without signing in." + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8CEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fnext%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CK8CEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33", + "command": { + "clickTrackingParams": "CK8CEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fnext%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "hack": true + } + } + } + } + } + } + } + }, + "trackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + } + ], + "trackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "topLevelButtons": [ + { + "segmentedLikeDislikeButtonViewModel": { + "likeButtonViewModel": { + "likeButtonViewModel": { + "toggleButtonViewModel": { + "toggleButtonViewModel": { + "defaultButtonViewModel": { + "buttonViewModel": { + "iconName": "LIKE", + "title": "4.2M", + "onTap": { + "serialCommand": { + "commands": [ + { + "logGestureCommand": { + "gestureType": "GESTURE_EVENT_TYPE_LOG_GENERIC_CLICK", + "trackingParams": "CK4CEKVBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "innertubeCommand": { + "clickTrackingParams": "CKwCEKVBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "simpleText": "Like this video?" + }, + "content": { + "simpleText": "Sign in to make your opinion count." + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Sign in" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0CEPqGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den&hl=en&ec=66426", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "nextEndpoint": { + "clickTrackingParams": "CK0CEPqGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/like/like" + } + }, + "likeEndpoint": { + "status": "LIKE", + "target": { + "videoId": "ZeerrnuLi5E" + }, + "likeParams": "Cg0KC1plZXJybnVMaTVFIAAyDAivtZaqBhDY4v65AQ%3D%3D" + } + }, + "idamTag": "66426" + } + }, + "trackingParams": "CK0CEPqGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + } + } + } + } + } + ] + } + }, + "accessibilityText": "like this video along with 4,209,059 other people", + "style": "BUTTON_VIEW_MODEL_STYLE_MONO", + "trackingParams": "CKwCEKVBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "isFullWidth": false, + "type": "BUTTON_VIEW_MODEL_TYPE_TONAL", + "buttonSize": "BUTTON_VIEW_MODEL_SIZE_DEFAULT", + "accessibilityId": "id.video.like.button", + "tooltip": "I like this" + } + }, + "toggledButtonViewModel": { + "buttonViewModel": { + "iconName": "LIKE", + "title": "4.2M", + "onTap": { + "serialCommand": { + "commands": [ + { + "logGestureCommand": { + "gestureType": "GESTURE_EVENT_TYPE_LOG_GENERIC_CLICK", + "trackingParams": "CKsCEKVBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "innertubeCommand": { + "clickTrackingParams": "CKoCEKVBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/like/removelike" + } + }, + "likeEndpoint": { + "status": "INDIFFERENT", + "target": { + "videoId": "ZeerrnuLi5E" + }, + "removeLikeParams": "Cg0KC1plZXJybnVMaTVFGAAqDAivtZaqBhDV3f-5AQ%3D%3D" + } + } + } + ] + } + }, + "accessibilityText": "like this video along with 4,209,059 other people", + "style": "BUTTON_VIEW_MODEL_STYLE_MONO", + "trackingParams": "CKoCEKVBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "isFullWidth": false, + "type": "BUTTON_VIEW_MODEL_TYPE_TONAL", + "buttonSize": "BUTTON_VIEW_MODEL_SIZE_DEFAULT", + "accessibilityId": "id.video.like.button", + "tooltip": "Unlike" + } + }, + "identifier": "watch-like", + "trackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "isTogglingDisabled": true + } + }, + "likeStatusEntityKey": "EgtaZWVycm51TGk1RSA-KAE%3D", + "likeStatusEntity": { + "key": "EgtaZWVycm51TGk1RSA-KAE%3D", + "likeStatus": "INDIFFERENT" + } + } + }, + "dislikeButtonViewModel": { + "dislikeButtonViewModel": { + "toggleButtonViewModel": { + "toggleButtonViewModel": { + "defaultButtonViewModel": { + "buttonViewModel": { + "iconName": "DISLIKE", + "title": "Dislike", + "onTap": { + "serialCommand": { + "commands": [ + { + "logGestureCommand": { + "gestureType": "GESTURE_EVENT_TYPE_LOG_GENERIC_CLICK", + "trackingParams": "CKkCEKiPCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + }, + { + "innertubeCommand": { + "clickTrackingParams": "CKcCEKiPCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "simpleText": "Don't like this video?" + }, + "content": { + "simpleText": "Sign in to make your opinion count." + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Sign in" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgCEPmGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den&hl=en&ec=66425", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "nextEndpoint": { + "clickTrackingParams": "CKgCEPmGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/like/dislike" + } + }, + "likeEndpoint": { + "status": "DISLIKE", + "target": { + "videoId": "ZeerrnuLi5E" + }, + "dislikeParams": "Cg0KC1plZXJybnVMaTVFEAAiDAivtZaqBhDb4YG6AQ%3D%3D" + } + }, + "idamTag": "66425" + } + }, + "trackingParams": "CKgCEPmGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + } + } + } + } + } + ] + } + }, + "accessibilityText": "Dislike this video", + "style": "BUTTON_VIEW_MODEL_STYLE_MONO", + "trackingParams": "CKcCEKiPCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "isFullWidth": false, + "type": "BUTTON_VIEW_MODEL_TYPE_TONAL", + "buttonSize": "BUTTON_VIEW_MODEL_SIZE_DEFAULT", + "accessibilityId": "id.video.dislike.button", + "tooltip": "I dislike this" + } + }, + "toggledButtonViewModel": { + "buttonViewModel": { + "iconName": "DISLIKE", + "title": "Dislike", + "onTap": { + "serialCommand": { + "commands": [ + { + "logGestureCommand": { + "gestureType": "GESTURE_EVENT_TYPE_LOG_GENERIC_CLICK", + "trackingParams": "CKYCEKiPCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + }, + { + "innertubeCommand": { + "clickTrackingParams": "CKUCEKiPCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/like/removelike" + } + }, + "likeEndpoint": { + "status": "INDIFFERENT", + "target": { + "videoId": "ZeerrnuLi5E" + }, + "removeLikeParams": "Cg0KC1plZXJybnVMaTVFGAAqDAivtZaqBhDziIK6AQ%3D%3D" + } + } + } + ] + } + }, + "accessibilityText": "Dislike this video", + "style": "BUTTON_VIEW_MODEL_STYLE_MONO", + "trackingParams": "CKUCEKiPCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "isFullWidth": false, + "type": "BUTTON_VIEW_MODEL_TYPE_TONAL", + "buttonSize": "BUTTON_VIEW_MODEL_SIZE_DEFAULT", + "accessibilityId": "id.video.dislike.button", + "tooltip": "I dislike this" + } + }, + "trackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "isTogglingDisabled": true + } + }, + "dislikeEntityKey": "EgtaZWVycm51TGk1RSA-KAE%3D" + } + }, + "iconType": "LIKE_ICON_TYPE_UNKNOWN", + "likeCountEntity": { + "key": "unset_like_count_entity_key" + }, + "dynamicLikeCountUpdateData": { + "updateStatusKey": "like_count_update_status_key", + "placeholderLikeCountValuesKey": "like_count_placeholder_values_key", + "updateDelayLoopId": "like_count_update_delay_loop_id", + "updateDelaySec": 5 + } + } + }, + { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "serviceEndpoint": { + "clickTrackingParams": "CKMCEOWWARgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtaZWVycm51TGk1RaABAQ%3D%3D", + "commands": [ + { + "clickTrackingParams": "CKMCEOWWARgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CKQCEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "icon": { + "iconType": "SHARE" + }, + "tooltip": "Share", + "trackingParams": "CKMCEOWWARgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "accessibilityData": { + "accessibilityData": { + "label": "Share" + } + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + }, + "flexibleItems": [ + { + "menuFlexibleItemRenderer": { + "menuItem": { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Save" + } + ] + }, + "icon": { + "iconType": "PLAYLIST_ADD" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKECEOuQCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Want to watch this again later?" + } + ] + }, + "content": { + "runs": [ + { + "text": "Sign in to add this video to a playlist." + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Sign in" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKICEPuGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fwatch%253Fv%253DZeerrnuLi5E&hl=en&ec=66427", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "nextEndpoint": { + "clickTrackingParams": "CKICEPuGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "ZeerrnuLi5E", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=65e7abae7b8b8b91&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "idamTag": "66427" + } + }, + "trackingParams": "CKICEPuGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + } + } + } + }, + "trackingParams": "CKECEOuQCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + }, + "topLevelButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Save" + } + ] + }, + "icon": { + "iconType": "PLAYLIST_ADD" + }, + "accessibility": { + "label": "Save to" + }, + "tooltip": "Save", + "trackingParams": "CJ8CEOuQCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "accessibilityData": { + "accessibilityData": { + "label": "Save to playlist" + } + }, + "command": { + "clickTrackingParams": "CJ8CEOuQCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Want to watch this again later?" + } + ] + }, + "content": { + "runs": [ + { + "text": "Sign in to add this video to a playlist." + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Sign in" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKACEPuGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fwatch%253Fv%253DZeerrnuLi5E&hl=en&ec=66427", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "nextEndpoint": { + "clickTrackingParams": "CKACEPuGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "ZeerrnuLi5E", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=65e7abae7b8b8b91&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "idamTag": "66427" + } + }, + "trackingParams": "CKACEPuGBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + } + } + } + } + } + } + } + } + ] + } + }, + "trackingParams": "CJsCEMyrARgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "superTitleLink": { + "runs": [ + { + "text": "#aespa", + "navigationEndpoint": { + "clickTrackingParams": "CJ4CEKW3AxgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/aespa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgVhZXNwYRgB" + } + }, + "loggingDirectives": { + "trackingParams": "CJ4CEKW3AxgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + }, + { + "text": " " + }, + { + "text": "#BlackMamba", + "navigationEndpoint": { + "clickTrackingParams": "CJ0CEKW3AxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/blackmamba", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUOCgpibGFja21hbWJhGAE%3D" + } + }, + "loggingDirectives": { + "trackingParams": "CJ0CEKW3AxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + }, + { + "text": " " + }, + { + "text": "#æspa", + "navigationEndpoint": { + "clickTrackingParams": "CJwCEKW3AxgEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%C3%A6spa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgXDpnNwYRgB" + } + }, + "loggingDirectives": { + "trackingParams": "CJwCEKW3AxgEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + ] + }, + "dateText": { + "simpleText": "Nov 17, 2020" + }, + "relativeDateText": { + "accessibility": { + "accessibilityData": { + "label": "2 years ago" + } + }, + "simpleText": "2 years ago" + } + } + }, + { + "videoSecondaryInfoRenderer": { + "owner": { + "videoOwnerRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s48-c-k-c0x00ffffff-no-rj", + "width": 48, + "height": 48 + }, + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s88-c-k-c0x00ffffff-no-rj", + "width": 88, + "height": 88 + }, + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s176-c-k-c0x00ffffff-no-rj", + "width": 176, + "height": 176 + } + ] + }, + "title": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CJoCEOE5IhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "subscriptionButton": { + "type": "FREE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJoCEOE5IhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + }, + "subscriberCountText": { + "accessibility": { + "accessibilityData": { + "label": "32.1 million subscribers" + } + }, + "simpleText": "32.1M subscribers" + }, + "trackingParams": "CJoCEOE5IhMI_7ijnJWpggMVt-JJBx2zDg33", + "badges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CJoCEOE5IhMI_7ijnJWpggMVt-JJBx2zDg33", + "accessibilityData": { + "label": "Verified" + } + } + } + ] + } + }, + "subscribeButton": { + "subscribeButtonRenderer": { + "buttonText": { + "runs": [ + { + "text": "Subscribe" + } + ] + }, + "subscribed": false, + "enabled": true, + "type": "FREE", + "channelId": "UCEf_Bc-KVd7onSeifS3py9g", + "showPreferences": false, + "subscribedButtonText": { + "runs": [ + { + "text": "Subscribed" + } + ] + }, + "unsubscribedButtonText": { + "runs": [ + { + "text": "Subscribe" + } + ] + }, + "trackingParams": "CIwCEJsrIhMI_7ijnJWpggMVt-JJBx2zDg33MgV3YXRjaA==", + "unsubscribeButtonText": { + "runs": [ + { + "text": "Unsubscribe" + } + ] + }, + "subscribeAccessibility": { + "accessibilityData": { + "label": "Subscribe to SMTOWN." + } + }, + "unsubscribeAccessibility": { + "accessibilityData": { + "label": "Unsubscribe from SMTOWN." + } + }, + "notificationPreferenceButton": { + "subscriptionNotificationToggleButtonRenderer": { + "states": [ + { + "stateId": 3, + "nextStateId": 3, + "state": { + "buttonRenderer": { + "style": "STYLE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "NOTIFICATIONS_NONE" + }, + "accessibility": { + "label": "Current setting is personalized notifications. Tap to change your notification setting for SMTOWN" + }, + "trackingParams": "CJkCEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33", + "accessibilityData": { + "accessibilityData": { + "label": "Current setting is personalized notifications. Tap to change your notification setting for SMTOWN" + } + } + } + } + }, + { + "stateId": 0, + "nextStateId": 0, + "state": { + "buttonRenderer": { + "style": "STYLE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "NOTIFICATIONS_OFF" + }, + "accessibility": { + "label": "Current setting is receive no notifications. Tap to change your notification setting for SMTOWN" + }, + "trackingParams": "CJgCEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33", + "accessibilityData": { + "accessibilityData": { + "label": "Current setting is receive no notifications. Tap to change your notification setting for SMTOWN" + } + } + } + } + } + ], + "currentStateId": 3, + "trackingParams": "CJECEJf5ASITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "command": { + "clickTrackingParams": "CJECEJf5ASITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CJECEJf5ASITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "openPopupAction": { + "popup": { + "menuPopupRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "simpleText": "Personalized" + }, + "icon": { + "iconType": "NOTIFICATIONS_NONE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJcCEOy1BBgDIhMI_7ijnJWpggMVt-JJBx2zDg33MhJQUkVGRVJFTkNFX0RFRkFVTFQ=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/notification/modify_channel_preference" + } + }, + "modifyChannelNotificationPreferenceEndpoint": { + "params": "ChhVQ0VmX0JjLUtWZDdvblNlaWZTM3B5OWcSAggBGAAgBFITCgIIAxILWmVlcnJudUxpNUUYAA%3D%3D" + } + }, + "trackingParams": "CJcCEOy1BBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "isSelected": true + } + }, + { + "menuServiceItemRenderer": { + "text": { + "simpleText": "None" + }, + "icon": { + "iconType": "NOTIFICATIONS_OFF" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJYCEO21BBgEIhMI_7ijnJWpggMVt-JJBx2zDg33MhtQUkVGRVJFTkNFX05PX05PVElGSUNBVElPTlM=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/notification/modify_channel_preference" + } + }, + "modifyChannelNotificationPreferenceEndpoint": { + "params": "ChhVQ0VmX0JjLUtWZDdvblNlaWZTM3B5OWcSAggDGAAgBFITCgIIAxILWmVlcnJudUxpNUUYAA%3D%3D" + } + }, + "trackingParams": "CJYCEO21BBgEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "isSelected": false + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Unsubscribe" + } + ] + }, + "icon": { + "iconType": "PERSON_MINUS" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJICENuLChgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJICENuLChgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "confirmDialogRenderer": { + "trackingParams": "CJMCEMY4IhMI_7ijnJWpggMVt-JJBx2zDg33", + "dialogMessages": [ + { + "runs": [ + { + "text": "Unsubscribe from " + }, + { + "text": "SMTOWN" + }, + { + "text": "?" + } + ] + } + ], + "confirmButton": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Unsubscribe" + } + ] + }, + "serviceEndpoint": { + "clickTrackingParams": "CJUCEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33MgV3YXRjaA==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/subscription/unsubscribe" + } + }, + "unsubscribeEndpoint": { + "channelIds": [ + "UCEf_Bc-KVd7onSeifS3py9g" + ], + "params": "CgIIAxILWmVlcnJudUxpNUUYAA%3D%3D" + } + }, + "accessibility": { + "label": "Unsubscribe" + }, + "trackingParams": "CJUCEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "cancelButton": { + "buttonRenderer": { + "style": "STYLE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Cancel" + } + ] + }, + "accessibility": { + "label": "Cancel" + }, + "trackingParams": "CJQCEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "primaryIsCancel": false + } + }, + "popupType": "DIALOG" + } + } + ] + } + }, + "trackingParams": "CJICENuLChgFIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + } + ] + } + }, + "popupType": "DROPDOWN" + } + } + ] + } + }, + "targetId": "notification-bell", + "secondaryIcon": { + "iconType": "EXPAND_MORE" + } + } + }, + "targetId": "watch-subscribe", + "signInEndpoint": { + "clickTrackingParams": "CIwCEJsrIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "simpleText": "Want to subscribe to this channel?" + }, + "content": { + "simpleText": "Sign in to subscribe to this channel." + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Sign in" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJACEP2GBCITCP-4o5yVqYIDFbfiSQcdsw4N9zIJc3Vic2NyaWJl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fwatch%253Fv%253DZeerrnuLi5E%26continue_action%3DQUFFLUhqbUJaVUVGYm5ObjJtb2djQ3lSd0owaG9mTElOQXxBQ3Jtc0trbmtEVHl1VzA1dnhENUhGVFlvTkNNdDBoXzY2SW1OV3lRY0JoeWtlLW1YYkhUbV9OLW1IRk9fQVNGY1hZWXJyLUtOYVU0SmkwdF9tOEZjY2RJcWgtVEd6SlR3RjhPMFp2cUo1MXlodWRFb1BIc1F0QWg5Si1XUXV0VlIzQWhVTnBZSDQ4UUdFY3RmMTZwVEJxRmxWVWlUTUlKazNwZ0lxTC1sTW4zSlAwQXVyYl9kY3E2ajhEZkQ5dFdxTGtId0cwNS12MEU&hl=en&ec=66429", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "nextEndpoint": { + "clickTrackingParams": "CJACEP2GBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "ZeerrnuLi5E", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=65e7abae7b8b8b91&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "continueAction": "QUFFLUhqbUJaVUVGYm5ObjJtb2djQ3lSd0owaG9mTElOQXxBQ3Jtc0trbmtEVHl1VzA1dnhENUhGVFlvTkNNdDBoXzY2SW1OV3lRY0JoeWtlLW1YYkhUbV9OLW1IRk9fQVNGY1hZWXJyLUtOYVU0SmkwdF9tOEZjY2RJcWgtVEd6SlR3RjhPMFp2cUo1MXlodWRFb1BIc1F0QWg5Si1XUXV0VlIzQWhVTnBZSDQ4UUdFY3RmMTZwVEJxRmxWVWlUTUlKazNwZ0lxTC1sTW4zSlAwQXVyYl9kY3E2ajhEZkQ5dFdxTGtId0cwNS12MEU", + "idamTag": "66429" + } + }, + "trackingParams": "CJACEP2GBCITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + } + } + } + }, + "subscribedEntityKey": "EhhVQ0VmX0JjLUtWZDdvblNlaWZTM3B5OWcgMygB", + "onSubscribeEndpoints": [ + { + "clickTrackingParams": "CIwCEJsrIhMI_7ijnJWpggMVt-JJBx2zDg33MgV3YXRjaA==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/subscription/subscribe" + } + }, + "subscribeEndpoint": { + "channelIds": [ + "UCEf_Bc-KVd7onSeifS3py9g" + ], + "params": "EgIIAxgAIgtaZWVycm51TGk1RQ%3D%3D" + } + } + ], + "onUnsubscribeEndpoints": [ + { + "clickTrackingParams": "CIwCEJsrIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CIwCEJsrIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "confirmDialogRenderer": { + "trackingParams": "CI0CEMY4IhMI_7ijnJWpggMVt-JJBx2zDg33", + "dialogMessages": [ + { + "runs": [ + { + "text": "Unsubscribe from " + }, + { + "text": "SMTOWN" + }, + { + "text": "?" + } + ] + } + ], + "confirmButton": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Unsubscribe" + } + ] + }, + "serviceEndpoint": { + "clickTrackingParams": "CI8CEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33MgV3YXRjaA==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/subscription/unsubscribe" + } + }, + "unsubscribeEndpoint": { + "channelIds": [ + "UCEf_Bc-KVd7onSeifS3py9g" + ], + "params": "CgIIAxILWmVlcnJudUxpNUUYAA%3D%3D" + } + }, + "accessibility": { + "label": "Unsubscribe" + }, + "trackingParams": "CI8CEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "cancelButton": { + "buttonRenderer": { + "style": "STYLE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Cancel" + } + ] + }, + "accessibility": { + "label": "Cancel" + }, + "trackingParams": "CI4CEPBbIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "primaryIsCancel": false + } + }, + "popupType": "DIALOG" + } + } + ] + } + } + ] + } + }, + "metadataRowContainer": { + "metadataRowContainerRenderer": { + "collapsedItemCount": 2, + "trackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "showMoreText": { + "simpleText": "...more" + }, + "showLessText": { + "simpleText": "Show less" + }, + "trackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "defaultExpanded": false, + "descriptionCollapsedLines": 3, + "showMoreCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "changeEngagementPanelVisibilityAction": { + "targetId": "engagement-panel-structured-description", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_EXPANDED" + } + }, + { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "scrollToEngagementPanelCommand": { + "targetId": "engagement-panel-structured-description" + } + } + ] + } + }, + "showLessCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "changeEngagementPanelVisibilityAction": { + "targetId": "engagement-panel-structured-description", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN" + } + }, + "attributedDescription": { + "content": "🎧Listen and download aespa's debut single \"Black Mamba\": https://smarturl.it/aespa_BlackMamba\n🐍The Debut Stage    • aespa 에스파 'Black Mamba' The Debut Stage  \n\n🎟️ aespa Showcase SYNK in LA! Tickets now on sale: https://www.ticketmaster.com/event/0A...\n\nSubscribe to aespa Official YouTube Channel!\nhttps://www.youtube.com/aespa?sub_con...\n\naespa official\n   / aespa  \n  / aespa_official  \n  / aespa_official  \n  / aespa_official  \n  / aespa.official  \nhttps://weibo.com/aespa\n\n#aespa #æspa #BlackMamba #블랙맘바 #에스파\naespa 에스파 'Black Mamba' MV ℗ SM Entertainment", + "commandRuns": [ + { + "startIndex": 58, + "length": 36, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbDhEWU1QeVpvVU91MldZMHozU1ozbm53WG1Fd3xBQ3Jtc0tuaWx2dnNWVmhVSk5YTFFvWDVmZlR2cFZGLVpNXzFQY1BhYjRWdEM2dk5KWm9JeGwzOEtRM1JqRW9Ld25MWjdyQTlPT0E5QlU3YzE4d1NWaDdkMklpWmctUlN3eVVTU3A0dmhqUEFIX3d6TWY3YjB2TQ&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbDhEWU1QeVpvVU91MldZMHozU1ozbm53WG1Fd3xBQ3Jtc0tuaWx2dnNWVmhVSk5YTFFvWDVmZlR2cFZGLVpNXzFQY1BhYjRWdEM2dk5KWm9JeGwzOEtRM1JqRW9Ld25MWjdyQTlPT0E5QlU3YzE4d1NWaDdkMklpWmctUlN3eVVTU3A0dmhqUEFIX3d6TWY3YjB2TQ&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 113, + "length": 46, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=Ky5RT5oGg0w&t=0s", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "Ky5RT5oGg0w", + "startTimeSeconds": 0, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jeener.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=2b2e514f9a06834c&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + } + } + }, + { + "startIndex": 213, + "length": 40, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbXp0b1AycVYydEk1NWZMVVg5NzByRXM3bXZUQXxBQ3Jtc0tsVEQwYXo2UEs3Y3ZPYmNLTFNNMVQxbTM1Q1d3X3BnU0czbDI5WFp2QmFIWVJlT0lZYm5Fam53NEFjSFc2LVlIbFZJVk92YTJ2TlEzbWUwYklwQXI0OC1lX2tUMnVuNGxHS2hSOEtVSXpBb0dNQllDQQ&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbXp0b1AycVYydEk1NWZMVVg5NzByRXM3bXZUQXxBQ3Jtc0tsVEQwYXo2UEs3Y3ZPYmNLTFNNMVQxbTM1Q1d3X3BnU0czbDI5WFp2QmFIWVJlT0lZYm5Fam53NEFjSFc2LVlIbFZJVk92YTJ2TlEzbWUwYklwQXI0OC1lX2tUMnVuNGxHS2hSOEtVSXpBb0dNQllDQQ&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 300, + "length": 40, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/aespa?sub_confirmation=1", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/aespa?sub_confirmation=1", + "nofollow": true + } + } + } + }, + { + "startIndex": 357, + "length": 12, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/c/aespa", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/c/aespa", + "nofollow": true + } + } + } + }, + { + "startIndex": 370, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbnBlV2wwa3B6cWJ4OGFvZENrQWJKY0oxbEJrUXxBQ3Jtc0trcTBvcU0tQll6SDRGRzluOXo5ZWJiQzMxWmo1WnVFQ1FOSG1GMkttOE9mNzVvRkp6OWVrcGo1bnN4bWROV0hmMmxhdElvVkpOTExydDl5VjNpNDdtOGZzc3RNNHY5aURhZWNFZHRWUUJUekdZRWZNOA&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbnBlV2wwa3B6cWJ4OGFvZENrQWJKY0oxbEJrUXxBQ3Jtc0trcTBvcU0tQll6SDRGRzluOXo5ZWJiQzMxWmo1WnVFQ1FOSG1GMkttOE9mNzVvRkp6OWVrcGo1bnN4bWROV0hmMmxhdElvVkpOTExydDl5VjNpNDdtOGZzc3RNNHY5aURhZWNFZHRWUUJUekdZRWZNOA&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 391, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3NLaExPZ1BDWWVpbDlpdjNBTTk1NzhOb3U2d3xBQ3Jtc0treVFWYkdDSVN6VV81aDBpWWFOYnlsRXZxenhSUWo4cDNpZEJhcXJQbUNEOUh5LUtFT2hwNzhhc1lmd0ZvVlpRLUhubTUwaF95dm92YndtY2JJM1FzT0ZUNjJsVVBqLWRUc1FoQ0xuVWlOb1dqNExUOA&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3NLaExPZ1BDWWVpbDlpdjNBTTk1NzhOb3U2d3xBQ3Jtc0treVFWYkdDSVN6VV81aDBpWWFOYnlsRXZxenhSUWo4cDNpZEJhcXJQbUNEOUh5LUtFT2hwNzhhc1lmd0ZvVlpRLUhubTUwaF95dm92YndtY2JJM1FzT0ZUNjJsVVBqLWRUc1FoQ0xuVWlOb1dqNExUOA&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 412, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWVPblh2NVBXQjAzZVdMVG9fRW80alp4OHBSUXxBQ3Jtc0ttamZyWkpxUmI4TU1YWGxOWlV1TjRvYWtFTHZFUEVId3VPU3U3OTRlUXRmSFdFOWhZWUp5Nktnck0yVzM1R3RNUFlvc3ZOMUFOVTAwT0R6R3JsdUNJbWYzQTRlQy04Wks1M3ZDS3N1SkZHRkJZRWI0dw&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWVPblh2NVBXQjAzZVdMVG9fRW80alp4OHBSUXxBQ3Jtc0ttamZyWkpxUmI4TU1YWGxOWlV1TjRvYWtFTHZFUEVId3VPU3U3OTRlUXRmSFdFOWhZWUp5Nktnck0yVzM1R3RNUFlvc3ZOMUFOVTAwT0R6R3JsdUNJbWYzQTRlQy04Wks1M3ZDS3N1SkZHRkJZRWI0dw&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 433, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbjZGNWNQWkx5ekU3Z1E4QVBkQmhaOUk1cnRmUXxBQ3Jtc0tuanhTRDhZY0lfZnhFMGdvVk9TM1M0YlMzckstVmdIUnhkUzVyTE41a3JYazVxbWtoM2UxQzZTU29ETFVUVEx1dVJsc3pabFRCc05PN3dldlltR2haU2V1MlBydTJSVGcwUDdXRGZtQk41OUhSZVJOdw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbjZGNWNQWkx5ekU3Z1E4QVBkQmhaOUk1cnRmUXxBQ3Jtc0tuanhTRDhZY0lfZnhFMGdvVk9TM1M0YlMzckstVmdIUnhkUzVyTE41a3JYazVxbWtoM2UxQzZTU29ETFVUVEx1dVJsc3pabFRCc05PN3dldlltR2haU2V1MlBydTJSVGcwUDdXRGZtQk41OUhSZVJOdw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 454, + "length": 23, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIYCEM2rARgBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3FiSHZ3dVN2ZlJNd2ozNnJFNkJIZkJGaUZ2UXxBQ3Jtc0ttQUlSdjZBdmFnd2M1SHM1T01Sb0hrckxYT3hpOE1aeUVnR0toTV82MWxfenFWRHp2bjFBbUY3RnBzdFlLSG1nanRxZ09PRGEwdTVKRmlFTDh5YXhobHNKWUYzMGJIbkk0Sm90Qkl6c1ZDVU4za3ljdw&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3FiSHZ3dVN2ZlJNd2ozNnJFNkJIZkJGaUZ2UXxBQ3Jtc0ttQUlSdjZBdmFnd2M1SHM1T01Sb0hrckxYT3hpOE1aeUVnR0toTV82MWxfenFWRHp2bjFBbUY3RnBzdFlLSG1nanRxZ09PRGEwdTVKRmlFTDh5YXhobHNKWUYzMGJIbkk0Sm90Qkl6c1ZDVU4za3ljdw&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 479, + "length": 6, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIsCENzXBBgKIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/aespa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgVhZXNwYRgB" + } + } + }, + "loggingDirectives": { + "trackingParams": "CIsCENzXBBgKIhMI_7ijnJWpggMVt-JJBx2zDg33", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 486, + "length": 5, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIoCENzXBBgLIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%C3%A6spa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgXDpnNwYRgB" + } + } + }, + "loggingDirectives": { + "trackingParams": "CIoCENzXBBgLIhMI_7ijnJWpggMVt-JJBx2zDg33", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 492, + "length": 11, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIkCENzXBBgMIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/blackmamba", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUOCgpibGFja21hbWJhGAE%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CIkCENzXBBgMIhMI_7ijnJWpggMVt-JJBx2zDg33", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 504, + "length": 5, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIgCENzXBBgNIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%EB%B8%94%EB%9E%99%EB%A7%98%EB%B0%94", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUQCgzruJTrnpnrp5jrsJQYAQ%3D%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CIgCENzXBBgNIhMI_7ijnJWpggMVt-JJBx2zDg33", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 510, + "length": 4, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CIcCENzXBBgOIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%EC%97%90%EC%8A%A4%ED%8C%8C", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUNCgnsl5DsiqTtjIwYAQ%3D%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CIcCENzXBBgOIhMI_7ijnJWpggMVt-JJBx2zDg33", + "enableDisplayloggerExperiment": true + } + } + ], + "styleRuns": [ + { + "startIndex": 0, + "length": 58, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 58, + "length": 36, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 94, + "length": 19, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 113, + "length": 46, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 159, + "length": 54, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 213, + "length": 40, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 253, + "length": 47, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 300, + "length": 40, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 340, + "length": 17, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 357, + "length": 12, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 369, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 370, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 390, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 391, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 411, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 412, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 432, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 433, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 453, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 454, + "length": 23, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 477, + "length": 2, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 479, + "length": 6, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 485, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 486, + "length": 5, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 491, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 492, + "length": 11, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 503, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 504, + "length": 5, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 509, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 510, + "length": 4, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 514, + "length": 46, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + } + ], + "attachmentRuns": [ + { + "startIndex": 115, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/yt_favicon.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 10, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 359, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/yt_favicon.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 10, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 371, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/instagram_1x.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 392, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/tiktok_1x.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 413, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/twitter_1x_v2.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 434, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/facebook_1x.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + } + ], + "decorationRuns": [ + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 113, + "length": 46, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 357, + "length": 12, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 370, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 391, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 412, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 433, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + } + ] + } + } + }, + { + "itemSectionRenderer": { + "contents": [ + { + "commentsEntryPointHeaderRenderer": { + "headerText": { + "runs": [ + { + "text": "Comments" + } + ] + }, + "onTap": { + "clickTrackingParams": "CIQCEMaJBRgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CIQCEMaJBRgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "changeEngagementPanelVisibilityAction": { + "targetId": "engagement-panel-comments-section", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_EXPANDED" + } + }, + { + "clickTrackingParams": "CIQCEMaJBRgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "scrollToEngagementPanelCommand": { + "targetId": "engagement-panel-comments-section" + } + } + ] + } + }, + "trackingParams": "CIQCEMaJBRgAIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commentCount": { + "simpleText": "703K" + }, + "contentRenderer": { + "commentsEntryPointTeaserRenderer": { + "teaserAvatar": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/sP1nZBVpzqCR9DLbA3agMyMxjZcnSTZybvydjIj8DYhdWDdnD54lT69ie9emjmY8fH92GiznxA=s48-c-k-c0x00ffffff-no-rj", + "width": 48, + "height": 48 + }, + { + "url": "https://yt3.ggpht.com/sP1nZBVpzqCR9DLbA3agMyMxjZcnSTZybvydjIj8DYhdWDdnD54lT69ie9emjmY8fH92GiznxA=s88-c-k-c0x00ffffff-no-rj", + "width": 88, + "height": 88 + }, + { + "url": "https://yt3.ggpht.com/sP1nZBVpzqCR9DLbA3agMyMxjZcnSTZybvydjIj8DYhdWDdnD54lT69ie9emjmY8fH92GiznxA=s176-c-k-c0x00ffffff-no-rj", + "width": 176, + "height": 176 + } + ], + "accessibility": { + "accessibilityData": { + "label": "Aissa" + } + } + }, + "teaserContent": { + "simpleText": "하루빨리 2억 5300만으로 만들자 ❤" + }, + "trackingParams": "CIUCENn-BCITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + }, + "targetId": "comments-entry-point-header-identifier" + } + } + ], + "trackingParams": "CIMCELsvGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "sectionIdentifier": "comments-entry-point" + } + }, + { + "itemSectionRenderer": { + "contents": [ + { + "continuationItemRenderer": { + "trigger": "CONTINUATION_TRIGGER_ON_ITEM_SHOWN", + "continuationEndpoint": { + "clickTrackingParams": "CIICELsvGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/next" + } + }, + "continuationCommand": { + "token": "Eg0SC1plZXJybnVMaTVFGAYyJSIRIgtaZWVycm51TGk1RTAAeAJCEGNvbW1lbnRzLXNlY3Rpb24%3D", + "request": "CONTINUATION_REQUEST_TYPE_WATCH_NEXT" + } + } + } + } + ], + "trackingParams": "CIICELsvGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "sectionIdentifier": "comment-item-section", + "targetId": "comments-section" + } + } + ], + "trackingParams": "CIECELovIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "secondaryResults": { + "secondaryResults": { + "results": [ + { + "compactVideoRenderer": { + "videoId": "4TWR90KJl84", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBYCGc-AKsDC6UpJgIZw2_VsqjVWA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDh-eDxZBmrNsHcb6pYX0Gyx6gJ8Q", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Next Level' MV by SMTOWN 277,189,882 views 2 years ago 3 minutes, 56 seconds" + } + }, + "simpleText": "aespa 에스파 'Next Level' MV" + }, + "longBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "viewCountText": { + "simpleText": "277,189,882 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 56 seconds" + } + }, + "simpleText": "3:56" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=4TWR90KJl84", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "4TWR90KJl84", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr2---sn-h0jelnes.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=e13591f7428997ce&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfdAzq-mlPS-5JrhAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "277 million views" + } + }, + "simpleText": "277M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CP8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CP8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "4TWR90KJl84", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CP8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "4TWR90KJl84" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "4TWR90KJl84" + ] + } + }, + { + "clickTrackingParams": "CP8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CIACELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CP8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "Cgs0VFdSOTBLSmw4NA%3D%3D", + "commands": [ + { + "clickTrackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CP4BEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CPsBEKQwGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + }, + "targetId": "watch-related-menu-button" + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 56 seconds" + } + }, + "simpleText": "3:56" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CP0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "4TWR90KJl84", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CP0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "4TWR90KJl84" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CP0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CPwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CPwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "4TWR90KJl84", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CPwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "4TWR90KJl84" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "4TWR90KJl84" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CPwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Next Level' MV - 3 minutes, 56 seconds - Go to channel - SMTOWN - 277M views - 2 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "yQUU29NwNF4", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA4pIWwOFmVuVU-jZ-j7S4GvgxjKw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC4B3H-paMDpjdf_V6NsymGNvVicQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122 by 스브스케이팝 X INKIGAYO 10,870,401 views 2 years ago 3 minutes, 33 seconds" + } + }, + "simpleText": "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122" + }, + "longBylineText": { + "runs": [ + { + "text": "스브스케이팝 X INKIGAYO", + "navigationEndpoint": { + "clickTrackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SBSKPOP", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCS_hnpJLQTvBkqALgapi_4g", + "canonicalBaseUrl": "/@SBSKPOP" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "viewCountText": { + "simpleText": "10,870,401 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 33 seconds" + } + }, + "simpleText": "3:33" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=yQUU29NwNF4", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "yQUU29NwNF4", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jelne7.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=c90514dbd370345e&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "스브스케이팝 X INKIGAYO", + "navigationEndpoint": { + "clickTrackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SBSKPOP", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCS_hnpJLQTvBkqALgapi_4g", + "canonicalBaseUrl": "/@SBSKPOP" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/Uxpz5J0EcsFJRbqh4Ip7i3TTNsxTh5jVUxfZmV1DTrCQM_ihfzBGMmkfSRGWoFK9M0anhIie=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "trackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfdA3ujAm72bxYLJAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "10 million views" + } + }, + "simpleText": "10M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPkBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CPkBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "yQUU29NwNF4", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CPkBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "yQUU29NwNF4" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "yQUU29NwNF4" + ] + } + }, + { + "clickTrackingParams": "CPkBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CPoBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CPkBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "Cgt5UVVVMjlOd05GNA%3D%3D", + "commands": [ + { + "clickTrackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CPgBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CPUBEKQwGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 33 seconds" + } + }, + "simpleText": "3:33" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CPcBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "yQUU29NwNF4", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CPcBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "yQUU29NwNF4" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CPcBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CPYBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CPYBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "yQUU29NwNF4", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CPYBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "yQUU29NwNF4" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "yQUU29NwNF4" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CPYBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122 - 3 minutes, 33 seconds - Go to channel - 스브스케이팝 X INKIGAYO - 10M views - 2 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "mTmm0y73ZtM", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDz3aKv3IbWrI5GmtWjWl2br6h7jw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCNnJtMt14Dn6iNSSHZtZL5MsYDtQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "Secret Missions: 7 Thrilling Spy and Secret Agent Stories by My Story Shared 888,941 views 9 days ago 1 hour, 53 minutes" + } + }, + "simpleText": "Secret Missions: 7 Thrilling Spy and Secret Agent Stories" + }, + "longBylineText": { + "runs": [ + { + "text": "My Story Shared", + "navigationEndpoint": { + "clickTrackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@mystoryshared495", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCSVngVJ_0s0ZX4oiN_4ZkaQ", + "canonicalBaseUrl": "/@mystoryshared495" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "9 days ago" + }, + "viewCountText": { + "simpleText": "888,941 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "1 hour, 53 minutes, 31 seconds" + } + }, + "simpleText": "1:53:31" + }, + "navigationEndpoint": { + "clickTrackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=mTmm0y73ZtM", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "mTmm0y73ZtM", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jeened.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=9939a6d32ef766d3&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "My Story Shared", + "navigationEndpoint": { + "clickTrackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@mystoryshared495", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCSVngVJ_0s0ZX4oiN_4ZkaQ", + "canonicalBaseUrl": "/@mystoryshared495" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/ytc/APkrFKbfZM35CSjtdsk3QIcEvalm3yoAzCkgZptcgSfNHw=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "trackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfdA083d97La6ZyZAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "888K views" + } + }, + "simpleText": "888K views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CPMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "mTmm0y73ZtM", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CPMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "mTmm0y73ZtM" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "mTmm0y73ZtM" + ] + } + }, + { + "clickTrackingParams": "CPMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CPQBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CPMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgttVG1tMHk3M1p0TQ%3D%3D", + "commands": [ + { + "clickTrackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CPIBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CO8BEKQwGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "1 hour, 53 minutes, 31 seconds" + } + }, + "simpleText": "1:53:31" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CPEBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "mTmm0y73ZtM", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CPEBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "mTmm0y73ZtM" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CPEBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CPABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CPABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "mTmm0y73ZtM", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CPABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "mTmm0y73ZtM" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "mTmm0y73ZtM" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CPABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "Secret Missions: 7 Thrilling Spy and Secret Agent Stories - 1 hour, 53 minutes - Go to channel - My Story Shared - 888K views - 9 days ago - play video" + } + }, + "richThumbnail": { + "movingThumbnailRenderer": { + "movingThumbnailDetails": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/an_webp/mTmm0y73ZtM/mqdefault_6s.webp?du=3000&sqp=CIiYlqoG&rs=AOn4CLCzFa3wdzTyhjQ3FudowsHRheVvdA", + "width": 320, + "height": 180 + } + ], + "logAsMovingThumbnail": true + }, + "enableHoveredLogging": true, + "enableOverlay": true + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "xBnSq8JKlZw", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGUgUChFMA8=&rs=AOn4CLDBvW0PORHHExpND8qbAa0OCr5MMw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhlIFAoRTAP&rs=AOn4CLASNCymIttQ1GwgbWvtxD_KeG5yGw", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "16 Eylül 2023 by Buğlem TV 8,407 views 1 month ago 2 hours, 12 minutes" + } + }, + "simpleText": "16 Eylül 2023" + }, + "longBylineText": { + "runs": [ + { + "text": "Buğlem TV", + "navigationEndpoint": { + "clickTrackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@bedriyekascal7309", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCcyqrKg5jlvVJy1nc-0igRQ", + "canonicalBaseUrl": "/@bedriyekascal7309" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "1 month ago" + }, + "viewCountText": { + "simpleText": "8,407 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "2 hours, 12 minutes, 51 seconds" + } + }, + "simpleText": "2:12:51" + }, + "navigationEndpoint": { + "clickTrackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=xBnSq8JKlZw", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "xBnSq8JKlZw", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jeenld.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=c419d2abc24a959c&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "Buğlem TV", + "navigationEndpoint": { + "clickTrackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@bedriyekascal7309", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCcyqrKg5jlvVJy1nc-0igRQ", + "canonicalBaseUrl": "/@bedriyekascal7309" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_kbdhEVJB2pzgy-qLRGQQ5sCPPZnEVeljgVrk0KZxPe8UxT8mm5ZZp7Zn6TGMcBMcpCG-zPi1YI=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "trackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfdAnKuqkrzV9IzEAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "8.4K views" + } + }, + "simpleText": "8.4K views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CO0BEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CO0BEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "xBnSq8JKlZw", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CO0BEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "xBnSq8JKlZw" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "xBnSq8JKlZw" + ] + } + }, + { + "clickTrackingParams": "CO0BEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CO4BELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CO0BEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "Cgt4Qm5TcThKS2xadw%3D%3D", + "commands": [ + { + "clickTrackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "COwBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "COkBEKQwGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 hours, 12 minutes, 51 seconds" + } + }, + "simpleText": "2:12:51" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "COsBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "xBnSq8JKlZw", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "COsBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "xBnSq8JKlZw" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "COsBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "COoBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "COoBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "xBnSq8JKlZw", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "COoBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "xBnSq8JKlZw" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "xBnSq8JKlZw" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "COoBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "16 Eylül 2023 - 2 hours, 12 minutes - Go to channel - Buğlem TV - 8.4K views - 1 month ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "fE2h3lGlOsk", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC44Q0lpu5a8rltgTMxi0X2QA6jnQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC6F85UnQjP3_9U0gehdYbbF6NTxw", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "ITZY \"WANNABE\" M/V @ITZY by JYP Entertainment 523,737,389 views 3 years ago 3 minutes, 39 seconds" + } + }, + "simpleText": "ITZY \"WANNABE\" M/V @ITZY" + }, + "longBylineText": { + "runs": [ + { + "text": "JYP Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@JYPEntertainment", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCaO6TYtlC8U5ttz62hTrZgg", + "canonicalBaseUrl": "/@JYPEntertainment" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "3 years ago" + }, + "viewCountText": { + "simpleText": "523,737,389 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 39 seconds" + } + }, + "simpleText": "3:39" + }, + "navigationEndpoint": { + "clickTrackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=fE2h3lGlOsk", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "fE2h3lGlOsk", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=7c4da1de51a53ac9&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "JYP Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@JYPEntertainment", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCaO6TYtlC8U5ttz62hTrZgg", + "canonicalBaseUrl": "/@JYPEntertainment" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/kcV7NQkBm-UvvzVTJvrg1Yf1eHSqi-DLXuZPt_ECa3cHEPefujS951Dxj6KUEQ5i9Z7_fyMUjw=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfdAyfWUjeW76KZ8", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "523 million views" + } + }, + "simpleText": "523M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "COcBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "COcBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "fE2h3lGlOsk", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "COcBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "fE2h3lGlOsk" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "fE2h3lGlOsk" + ] + } + }, + { + "clickTrackingParams": "COcBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "COgBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "COcBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtmRTJoM2xHbE9zaw%3D%3D", + "commands": [ + { + "clickTrackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "COYBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "COMBEKQwGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 39 seconds" + } + }, + "simpleText": "3:39" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "COUBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "fE2h3lGlOsk", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "COUBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "fE2h3lGlOsk" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "COUBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "COQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "COQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "fE2h3lGlOsk", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "COQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "fE2h3lGlOsk" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "fE2h3lGlOsk" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "COQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "ITZY \"WANNABE\" M/V @ITZY - 3 minutes, 39 seconds - Go to channel - JYP Entertainment - 523M views - 3 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "NU611fxGyPU", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAgKORzcy6WKosI1_PAVWDgcjJ9jA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDqWWIfLCdtyqy5aIUA_PGcEW2r2g", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Black Mamba' Dance Practice by aespa 40,486,850 views 2 years ago 2 minutes, 55 seconds" + } + }, + "simpleText": "aespa 에스파 'Black Mamba' Dance Practice" + }, + "longBylineText": { + "runs": [ + { + "text": "aespa", + "navigationEndpoint": { + "clickTrackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC9GtSLeksfK4yuJ_g1lgQbg", + "canonicalBaseUrl": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "viewCountText": { + "simpleText": "40,486,850 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 55 seconds" + } + }, + "simpleText": "2:55" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=NU611fxGyPU", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "NU611fxGyPU", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jeener.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=354eb5d5fc46c8f5&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "aespa", + "navigationEndpoint": { + "clickTrackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC9GtSLeksfK4yuJ_g1lgQbg", + "canonicalBaseUrl": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/rLxODcRttuDvITkAJruNIDlDkVMEsPVuHJyMQDjeYqoFh80JyGwfXXMOZgZXd6-iKuf9rifqYQ=s88-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "OFFICIAL_ARTIST_BADGE" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED_ARTIST", + "tooltip": "Official Artist Channel", + "trackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Official Artist Channel" + } + } + } + ], + "trackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfdA9ZGb4t-6rac1", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "40 million views" + } + }, + "simpleText": "40M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "COEBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "COEBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "NU611fxGyPU", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "COEBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "NU611fxGyPU" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "NU611fxGyPU" + ] + } + }, + { + "clickTrackingParams": "COEBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "COIBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "COEBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtOVTYxMWZ4R3lQVQ%3D%3D", + "commands": [ + { + "clickTrackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "COABEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CN0BEKQwGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 55 seconds" + } + }, + "simpleText": "2:55" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CN8BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "NU611fxGyPU", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CN8BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "NU611fxGyPU" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CN8BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CN4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CN4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "NU611fxGyPU", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CN4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "NU611fxGyPU" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "NU611fxGyPU" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CN4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Black Mamba' Dance Practice - 2 minutes, 55 seconds - Go to channel - aespa - 40M views - 2 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "dYRITmpFbJ4", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBOxN6ukbZNOPwUBhRZYgG9r23lng", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBLmRDhzBtNHCuokfKRQufiNKKfZg", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Girls' MV by SMTOWN 135,870,843 views 1 year ago 4 minutes, 29 seconds" + } + }, + "simpleText": "aespa 에스파 'Girls' MV" + }, + "longBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "1 year ago" + }, + "viewCountText": { + "simpleText": "135,870,843 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 29 seconds" + } + }, + "simpleText": "4:29" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=dYRITmpFbJ4", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "dYRITmpFbJ4", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=7584484e6a456c9e&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfdAntmV0uaJksJ1", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "135 million views" + } + }, + "simpleText": "135M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CNsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "dYRITmpFbJ4", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CNsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "dYRITmpFbJ4" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "dYRITmpFbJ4" + ] + } + }, + { + "clickTrackingParams": "CNsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CNwBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CNsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtkWVJJVG1wRmJKNA%3D%3D", + "commands": [ + { + "clickTrackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CNoBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CNcBEKQwGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 29 seconds" + } + }, + "simpleText": "4:29" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CNkBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "dYRITmpFbJ4", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CNkBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "dYRITmpFbJ4" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CNkBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CNgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CNgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "dYRITmpFbJ4", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CNgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "dYRITmpFbJ4" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "dYRITmpFbJ4" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CNgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Girls' MV - 4 minutes, 29 seconds - Go to channel - SMTOWN - 135M views - 1 year ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "jiFBY6gk3Lk", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLARhXJ8KOxiWpj430QpyKF2m3LJFQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDGOkNsfHOpy9GLXoHn1rnIOn0CcA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK x AESPA – Pink Venom / Black Mamba MASHUP (feat. Next Level) by Miggy Smallz 4,218,059 views 1 year ago 4 minutes" + } + }, + "simpleText": "BLACKPINK x AESPA – Pink Venom / Black Mamba MASHUP (feat. Next Level)" + }, + "longBylineText": { + "runs": [ + { + "text": "Miggy Smallz", + "navigationEndpoint": { + "clickTrackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@MiggySmallzYT", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC5XWNylwy4efFufjMYqcglw", + "canonicalBaseUrl": "/@MiggySmallzYT" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "1 year ago" + }, + "viewCountText": { + "simpleText": "4,218,059 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes" + } + }, + "simpleText": "4:00" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=jiFBY6gk3Lk", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "jiFBY6gk3Lk", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=8e214163a824dcb9&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "Miggy Smallz", + "navigationEndpoint": { + "clickTrackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@MiggySmallzYT", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC5XWNylwy4efFufjMYqcglw", + "canonicalBaseUrl": "/@MiggySmallzYT" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/ytc/APkrFKYR2j9afW3H0lgdKwD8qPiIZvZBfCSLxAZQRiUB=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "trackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfdAubmTwbqs0JCOAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.2 million views" + } + }, + "simpleText": "4.2M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNUBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CNUBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "jiFBY6gk3Lk", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CNUBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "jiFBY6gk3Lk" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "jiFBY6gk3Lk" + ] + } + }, + { + "clickTrackingParams": "CNUBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CNYBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CNUBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtqaUZCWTZnazNMaw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CNQBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CNEBEKQwGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes" + } + }, + "simpleText": "4:00" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CNMBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "jiFBY6gk3Lk", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CNMBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "jiFBY6gk3Lk" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CNMBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CNIBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CNIBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "jiFBY6gk3Lk", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CNIBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "jiFBY6gk3Lk" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "jiFBY6gk3Lk" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CNIBEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK x AESPA – Pink Venom / Black Mamba MASHUP (feat. Next Level) - 4 minutes - Go to channel - Miggy Smallz - 4.2M views - 1 year ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "CM4CkVFmTds", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBfd7QADIduQSR2ESLIp1k5gxxNDg", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDRn7hTXV_Ls30E6BQNZQtQjbuEpA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "TWICE \"I CAN'T STOP ME\" M/V by JYP Entertainment 509,192,107 views 3 years ago 3 minutes, 41 seconds" + } + }, + "simpleText": "TWICE \"I CAN'T STOP ME\" M/V" + }, + "longBylineText": { + "runs": [ + { + "text": "JYP Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@JYPEntertainment", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCaO6TYtlC8U5ttz62hTrZgg", + "canonicalBaseUrl": "/@JYPEntertainment" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "3 years ago" + }, + "viewCountText": { + "simpleText": "509,192,107 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 41 seconds" + } + }, + "simpleText": "3:41" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=CM4CkVFmTds", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "CM4CkVFmTds", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jeenle.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=08ce029151664ddb&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "JYP Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@JYPEntertainment", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCaO6TYtlC8U5ttz62hTrZgg", + "canonicalBaseUrl": "/@JYPEntertainment" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/kcV7NQkBm-UvvzVTJvrg1Yf1eHSqi-DLXuZPt_ECa3cHEPefujS951Dxj6KUEQ5i9Z7_fyMUjw=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfdA25uZi5XSgOcI", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "509 million views" + } + }, + "simpleText": "509M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CM8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CM8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "CM4CkVFmTds", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CM8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "CM4CkVFmTds" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "CM4CkVFmTds" + ] + } + }, + { + "clickTrackingParams": "CM8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CNABELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CM8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtDTTRDa1ZGbVRkcw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CM4BEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CMsBEKQwGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 41 seconds" + } + }, + "simpleText": "3:41" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CM0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "CM4CkVFmTds", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CM0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "CM4CkVFmTds" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CM0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CMwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CMwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "CM4CkVFmTds", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CMwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "CM4CkVFmTds" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "CM4CkVFmTds" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CMwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "TWICE \"I CAN'T STOP ME\" M/V - 3 minutes, 41 seconds - Go to channel - JYP Entertainment - 509M views - 3 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "WPdWvnAAurg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDQGxlnDkAdMYRm2cdkDmiDbBDpYw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAIHFE0eH_r-HP7DRPv1QJJnRDzWw", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Savage' MV by SMTOWN 245,301,963 views 2 years ago 4 minutes, 19 seconds" + } + }, + "simpleText": "aespa 에스파 'Savage' MV" + }, + "longBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "viewCountText": { + "simpleText": "245,301,963 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 19 seconds" + } + }, + "simpleText": "4:19" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=WPdWvnAAurg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "WPdWvnAAurg", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelnes.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=58f756be7000bab8&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfdAuPWCgOfX1ftY", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "245 million views" + } + }, + "simpleText": "245M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CMkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "WPdWvnAAurg", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CMkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "WPdWvnAAurg" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "WPdWvnAAurg" + ] + } + }, + { + "clickTrackingParams": "CMkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CMoBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CMkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtXUGRXdm5BQXVyZw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CMgBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CMUBEKQwGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 19 seconds" + } + }, + "simpleText": "4:19" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CMcBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "WPdWvnAAurg", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CMcBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "WPdWvnAAurg" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CMcBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CMYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CMYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "WPdWvnAAurg", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CMYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "WPdWvnAAurg" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "WPdWvnAAurg" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CMYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Savage' MV - 4 minutes, 19 seconds - Go to channel - SMTOWN - 245M views - 2 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "OgabtEgG_kg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGkgaShpMA8=&rs=AOn4CLBF1lxbztXMyXmem4owNAWZRqvnBA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhpIGkoaTAP&rs=AOn4CLAqM-WuOQCGTABX_NmzvOUOhx3rLA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST by x i a o s h i z i 1,719 views 7 days ago 17 minutes" + } + }, + "simpleText": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST" + }, + "longBylineText": { + "runs": [ + { + "text": "x i a o s h i z i", + "navigationEndpoint": { + "clickTrackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@khzcl_", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCo7jZg0Q5jBWs0WSq_SdDoA", + "canonicalBaseUrl": "/@khzcl_" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "7 days ago" + }, + "viewCountText": { + "simpleText": "1,719 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 14 seconds" + } + }, + "simpleText": "17:14" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jeenl6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=3a069bb44806fe48&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "x i a o s h i z i", + "navigationEndpoint": { + "clickTrackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@khzcl_", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCo7jZg0Q5jBWs0WSq_SdDoA", + "canonicalBaseUrl": "/@khzcl_" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/ErguVbkzrIKe0hezWviLvuCCGLaQYlrSWQ7Dw6beAwNJnR1ed7NV3pokG_z_I7GQvxfUybB4tg=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "trackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfdAyPybwMT2poM6", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.7K views" + } + }, + "simpleText": "1.7K views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMMBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CMMBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "OgabtEgG_kg", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CMMBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "OgabtEgG_kg" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "OgabtEgG_kg" + ] + } + }, + { + "clickTrackingParams": "CMMBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CMQBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CMMBEP6YBBgFIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtPZ2FidEVnR19rZw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CMIBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CL8BEKQwGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 14 seconds" + } + }, + "simpleText": "17:14" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CMEBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "OgabtEgG_kg", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CMEBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "OgabtEgG_kg" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CMEBEPnnAxgBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CMABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CMABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "OgabtEgG_kg", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CMABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "OgabtEgG_kg" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "OgabtEgG_kg" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CMABEMfsBBgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST - 17 minutes - Go to channel - x i a o s h i z i - 1.7K views - 7 days ago - play video" + } + }, + "richThumbnail": { + "movingThumbnailRenderer": { + "enableHoveredLogging": true, + "enableOverlay": true + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "cSqOY5nktfg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDkx-bmEWvYbs8ju1cETIRE1AczFQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAYPPC91mec_MPvRxjRBzTpwFDBUQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK THE GAME - ‘THE GIRLS’ MV by BLACKPINK 61,284,005 views 2 months ago 2 minutes, 44 seconds" + } + }, + "simpleText": "BLACKPINK THE GAME - ‘THE GIRLS’ MV" + }, + "longBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "2 months ago" + }, + "viewCountText": { + "simpleText": "61,284,005 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 44 seconds" + } + }, + "simpleText": "2:44" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=cSqOY5nktfg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "cSqOY5nktfg", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=712a8e6399e4b5f8&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/hZDUwjoeQqigphL4A1tkg9c6hVp5yXmbboBR7PYFUSFj5PIJSA483NB5v7b0XVoTN9GCku3tqQ=s88-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "OFFICIAL_ARTIST_BADGE" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED_ARTIST", + "tooltip": "Official Artist Channel", + "trackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Official Artist Channel" + } + } + } + ], + "trackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfdA-OuSz7nMo5Vx", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "61 million views" + } + }, + "simpleText": "61M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CL0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CL0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "cSqOY5nktfg", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CL0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "cSqOY5nktfg" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "cSqOY5nktfg" + ] + } + }, + { + "clickTrackingParams": "CL0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CL4BELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CL0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtjU3FPWTVua3RmZw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CLwBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CLkBEKQwGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 44 seconds" + } + }, + "simpleText": "2:44" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CLsBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "cSqOY5nktfg", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CLsBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "cSqOY5nktfg" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CLsBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CLoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CLoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "cSqOY5nktfg", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CLoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "cSqOY5nktfg" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "cSqOY5nktfg" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CLoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK THE GAME - ‘THE GIRLS’ MV - 2 minutes, 44 seconds - Go to channel - BLACKPINK - 61M views - 2 months ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "i8fRCkq5tbw", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/i8fRCkq5tbw/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBGcGKSQOqvI_5ZONNturhZZmkysQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/i8fRCkq5tbw/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBQsyuNIuuztFQo2FdweYiROIJY3A", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 ‘ep.2 Next Level’ – SM Culture Universe by aespa 5,419,659 views 1 year ago 17 minutes" + } + }, + "simpleText": "aespa 에스파 ‘ep.2 Next Level’ – SM Culture Universe" + }, + "longBylineText": { + "runs": [ + { + "text": "aespa", + "navigationEndpoint": { + "clickTrackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC9GtSLeksfK4yuJ_g1lgQbg", + "canonicalBaseUrl": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "1 year ago" + }, + "viewCountText": { + "simpleText": "5,419,659 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 20 seconds" + } + }, + "simpleText": "17:20" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=i8fRCkq5tbw", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "i8fRCkq5tbw", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=8bc7d10a4ab9b5bc&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "aespa", + "navigationEndpoint": { + "clickTrackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC9GtSLeksfK4yuJ_g1lgQbg", + "canonicalBaseUrl": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/rLxODcRttuDvITkAJruNIDlDkVMEsPVuHJyMQDjeYqoFh80JyGwfXXMOZgZXd6-iKuf9rifqYQ=s88-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "OFFICIAL_ARTIST_BADGE" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED_ARTIST", + "tooltip": "Official Artist Channel", + "trackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Official Artist Channel" + } + } + } + ], + "trackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfdAvOvm1aSh9OOLAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "5.4 million views" + } + }, + "simpleText": "5.4M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLcBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CLcBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "i8fRCkq5tbw", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CLcBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "i8fRCkq5tbw" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "i8fRCkq5tbw" + ] + } + }, + { + "clickTrackingParams": "CLcBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CLgBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CLcBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtpOGZSQ2txNXRidw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CLYBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CLMBEKQwGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 20 seconds" + } + }, + "simpleText": "17:20" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CLUBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "i8fRCkq5tbw", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CLUBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "i8fRCkq5tbw" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CLUBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CLQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CLQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "i8fRCkq5tbw", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CLQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "i8fRCkq5tbw" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "i8fRCkq5tbw" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CLQBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 ‘ep.2 Next Level’ – SM Culture Universe - 17 minutes - Go to channel - aespa - 5.4M views - 1 year ago - play video" + } + }, + "richThumbnail": { + "movingThumbnailRenderer": { + "movingThumbnailDetails": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/an_webp/i8fRCkq5tbw/mqdefault_6s.webp?du=3000&sqp=CNj3laoG&rs=AOn4CLDqRHTLJWd_2aTy_Dho5fpDWwIy4Q", + "width": 320, + "height": 180 + } + ], + "logAsMovingThumbnail": true + }, + "enableHoveredLogging": true, + "enableOverlay": true + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "erCzl8x9Zuo", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/erCzl8x9Zuo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBF18qnuz8guk309k2UUh4xnLuazg", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/erCzl8x9Zuo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB36E2CQnz-l8QtgUEYQfGADaZJdA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "에스파(AESPA) 2023 lotte family concert Full Ver. (Black Mamba +thirsty + Illusion+next level+ Spicy) by Rock Music 392,124 views 4 months ago 19 minutes" + } + }, + "simpleText": "에스파(AESPA) 2023 lotte family concert Full Ver. (Black Mamba +thirsty + Illusion+next level+ Spicy)" + }, + "longBylineText": { + "runs": [ + { + "text": "Rock Music", + "navigationEndpoint": { + "clickTrackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@RockMusic2015", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC8yPhlmo-4MY5ZfF-cw3JRg", + "canonicalBaseUrl": "/@RockMusic2015" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "4 months ago" + }, + "viewCountText": { + "simpleText": "392,124 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "19 minutes, 52 seconds" + } + }, + "simpleText": "19:52" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=erCzl8x9Zuo", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "erCzl8x9Zuo", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jeenld.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=7ab0b397cc7d66ea&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "Rock Music", + "navigationEndpoint": { + "clickTrackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@RockMusic2015", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC8yPhlmo-4MY5ZfF-cw3JRg", + "canonicalBaseUrl": "/@RockMusic2015" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/ytc/APkrFKYogJDjV-mjqi-JeTWKU7PwH_gKL2x9Thq04YuANQ=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfdA6s314_zyrNh6", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "392K views" + } + }, + "simpleText": "392K views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLEBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CLEBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "erCzl8x9Zuo", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CLEBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "erCzl8x9Zuo" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "erCzl8x9Zuo" + ] + } + }, + { + "clickTrackingParams": "CLEBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CLIBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CLEBEP6YBBgHIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtlckN6bDh4OVp1bw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CLABEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CK0BEKQwGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "19 minutes, 52 seconds" + } + }, + "simpleText": "19:52" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CK8BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "erCzl8x9Zuo", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CK8BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "erCzl8x9Zuo" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CK8BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CK4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CK4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "erCzl8x9Zuo", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CK4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "erCzl8x9Zuo" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "erCzl8x9Zuo" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CK4BEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "에스파(AESPA) 2023 lotte family concert Full Ver. (Black Mamba +thirsty + Illusion+next level+ Spicy) - 19 minutes - Go to channel - Rock Music - 392K views - 4 months ago - play video" + } + }, + "richThumbnail": { + "movingThumbnailRenderer": { + "movingThumbnailDetails": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/an_webp/erCzl8x9Zuo/mqdefault_6s.webp?du=3000&sqp=CLiflqoG&rs=AOn4CLAqIAwz9yjGT35VEaa_D0cD4-385g", + "width": 320, + "height": 180 + } + ], + "logAsMovingThumbnail": true + }, + "enableHoveredLogging": true, + "enableOverlay": true + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "7HDeem-JaSY", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/7HDeem-JaSY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC_jASE2yooEXAN64rj8-1_AJZl6A", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/7HDeem-JaSY/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDq-8lmFENHZeVvK5bQBvpnqEDFIQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "(여자)아이들((G)I-DLE) - '퀸카 (Queencard)' Official Music Video by (G)I-DLE (여자)아이들 (Official YouTube Channel) 259,400,824 views 5 months ago 3 minutes, 31 seconds" + } + }, + "simpleText": "(여자)아이들((G)I-DLE) - '퀸카 (Queencard)' Official Music Video" + }, + "longBylineText": { + "runs": [ + { + "text": "(G)I-DLE (여자)아이들 (Official YouTube Channel)", + "navigationEndpoint": { + "clickTrackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCritGVo7pLJLUS8wEu32vow", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCritGVo7pLJLUS8wEu32vow", + "canonicalBaseUrl": "/channel/UCritGVo7pLJLUS8wEu32vow" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "5 months ago" + }, + "viewCountText": { + "simpleText": "259,400,824 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 31 seconds" + } + }, + "simpleText": "3:31" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=7HDeem-JaSY", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "7HDeem-JaSY", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=ec70de7a6f896926&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "(G)I-DLE (여자)아이들 (Official YouTube Channel)", + "navigationEndpoint": { + "clickTrackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCritGVo7pLJLUS8wEu32vow", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCritGVo7pLJLUS8wEu32vow", + "canonicalBaseUrl": "/channel/UCritGVo7pLJLUS8wEu32vow" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/ytc/APkrFKbGrI182ZniS64zKXUGr2CeJ9tMxoa9w90e6SaZkA=s88-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "OFFICIAL_ARTIST_BADGE" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED_ARTIST", + "tooltip": "Official Artist Channel", + "trackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Official Artist Channel" + } + } + } + ], + "trackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfdAptKl_KbPt7jsAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "259 million views" + } + }, + "simpleText": "259M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CKsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "7HDeem-JaSY", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CKsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "7HDeem-JaSY" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "7HDeem-JaSY" + ] + } + }, + { + "clickTrackingParams": "CKsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CKwBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CKsBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "Cgs3SERlZW0tSmFTWQ%3D%3D", + "commands": [ + { + "clickTrackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CKoBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CKcBEKQwGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 31 seconds" + } + }, + "simpleText": "3:31" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CKkBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "7HDeem-JaSY", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CKkBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "7HDeem-JaSY" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CKkBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CKgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CKgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "7HDeem-JaSY", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CKgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "7HDeem-JaSY" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "7HDeem-JaSY" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CKgBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "(여자)아이들((G)I-DLE) - '퀸카 (Queencard)' Official Music Video - 3 minutes, 31 seconds - Go to channel - (G)I-DLE (여자)아이들 (Official YouTube Channel) - 259M views - 5 months ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "9JFi7MmjtGA", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/9JFi7MmjtGA/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLALaqiHHm-fnm1TQHpD9PG-zGd-hg", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/9JFi7MmjtGA/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLD1uM6lf5nCYUj8ZbzAtNYfwb4Z4Q", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "VIVIZ (비비지) - 'MANIAC' MV by BPM Entertainment 2,807,502 views 1 day ago 3 minutes, 17 seconds" + } + }, + "simpleText": "VIVIZ (비비지) - 'MANIAC' MV" + }, + "longBylineText": { + "runs": [ + { + "text": "BPM Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@BPMEntertainment-official", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC6YMr57knEIYXOOKMmYAFXQ", + "canonicalBaseUrl": "/@BPMEntertainment-official" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "1 day ago" + }, + "viewCountText": { + "simpleText": "2,807,502 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 17 seconds" + } + }, + "simpleText": "3:17" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=9JFi7MmjtGA", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "9JFi7MmjtGA", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=f49162ecc9a3b460&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "BPM Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@BPMEntertainment-official", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC6YMr57knEIYXOOKMmYAFXQ", + "canonicalBaseUrl": "/@BPMEntertainment-official" + } + } + } + ] + }, + "badges": [ + { + "metadataBadgeRenderer": { + "style": "BADGE_STYLE_TYPE_SIMPLE", + "label": "New", + "trackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfc=" + } + } + ], + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/jltaW4jLrF76MrBe-HKcIQoop67mOF3QLdGzFiYwB-Pt7qKv4X7VECkCzfvkn037abuy6zV0bg=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "trackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfdA4OiOzczd2Mj0AQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.8 million views" + } + }, + "simpleText": "2.8M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKUBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CKUBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "9JFi7MmjtGA", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CKUBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "9JFi7MmjtGA" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "9JFi7MmjtGA" + ] + } + }, + { + "clickTrackingParams": "CKUBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CKYBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CKUBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "Cgs5SkZpN01tanRHQQ%3D%3D", + "commands": [ + { + "clickTrackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CKQBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CKEBEKQwGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 17 seconds" + } + }, + "simpleText": "3:17" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CKMBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "9JFi7MmjtGA", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CKMBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "9JFi7MmjtGA" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CKMBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CKIBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CKIBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "9JFi7MmjtGA", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CKIBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "9JFi7MmjtGA" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "9JFi7MmjtGA" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CKIBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "VIVIZ (비비지) - 'MANIAC' MV - 3 minutes, 17 seconds - Go to channel - BPM Entertainment - 2.8M views - 1 day ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "NoYKBAajoyo", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/NoYKBAajoyo/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC3OhCUbjpIclmjfV8W8T98nVI5pA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/NoYKBAajoyo/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLA-CdJunWg1z_pnrT55qagTHnxkdQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "EVERGLOW (에버글로우) - DUN DUN MV by Stone Music Entertainment 286,088,204 views 3 years ago 3 minutes, 29 seconds" + } + }, + "simpleText": "EVERGLOW (에버글로우) - DUN DUN MV" + }, + "longBylineText": { + "runs": [ + { + "text": "Stone Music Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@stonemusicent", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC_pwIXKXNm5KGhdEVzmY60A", + "canonicalBaseUrl": "/@stonemusicent" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "3 years ago" + }, + "viewCountText": { + "simpleText": "286,088,204 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 29 seconds" + } + }, + "simpleText": "3:29" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=NoYKBAajoyo", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "NoYKBAajoyo", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jeenl6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=36860a0406a3a32a&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "Stone Music Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@stonemusicent", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC_pwIXKXNm5KGhdEVzmY60A", + "canonicalBaseUrl": "/@stonemusicent" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/XIxEtKkvUSLHiDBazM8kYyKpyESz5LM--vG0F7aMsiqOC2o_IZaKztsqDMj2mcn4ciQzFbvu=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfdAqsaOtcDAgsM2", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "286 million views" + } + }, + "simpleText": "286M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJ8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJ8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "NoYKBAajoyo", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CJ8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "NoYKBAajoyo" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "NoYKBAajoyo" + ] + } + }, + { + "clickTrackingParams": "CJ8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CKABELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CJ8BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtOb1lLQkFham95bw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CJ4BEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CJsBEKQwGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 29 seconds" + } + }, + "simpleText": "3:29" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CJ0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "NoYKBAajoyo", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CJ0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "NoYKBAajoyo" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CJ0BEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CJwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "NoYKBAajoyo", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CJwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "NoYKBAajoyo" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "NoYKBAajoyo" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CJwBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "EVERGLOW (에버글로우) - DUN DUN MV - 3 minutes, 29 seconds - Go to channel - Stone Music Entertainment - 286M views - 3 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "pyf8cbqyfPs", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/pyf8cbqyfPs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAu-V-1EWwbHjZTNTO-vuP_O_WB3Q", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/pyf8cbqyfPs/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCxVrNDDgEYMZWgOukne2kgOV2Vhg", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "LE SSERAFIM (르세라핌) 'ANTIFRAGILE' OFFICIAL M/V by HYBE LABELS 196,956,308 views 1 year ago 3 minutes, 52 seconds" + } + }, + "simpleText": "LE SSERAFIM (르세라핌) 'ANTIFRAGILE' OFFICIAL M/V" + }, + "longBylineText": { + "runs": [ + { + "text": "HYBE LABELS", + "navigationEndpoint": { + "clickTrackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@HYBELABELS", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC3IZKseVpdzPSBaWxBxundA", + "canonicalBaseUrl": "/@HYBELABELS" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "1 year ago" + }, + "viewCountText": { + "simpleText": "196,956,308 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 52 seconds" + } + }, + "simpleText": "3:52" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=pyf8cbqyfPs", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "pyf8cbqyfPs", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=a727fc71bab27cfb&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "HYBE LABELS", + "navigationEndpoint": { + "clickTrackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWQ=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@HYBELABELS", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC3IZKseVpdzPSBaWxBxundA", + "canonicalBaseUrl": "/@HYBELABELS" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/ytc/APkrFKaWqx5IfcKbi5z8FgPsM_kA6NQ2zTAx8gr27yQcdQ=s68-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "CHECK_CIRCLE_THICK" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED", + "tooltip": "Verified", + "trackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Verified" + } + } + } + ], + "trackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfdA-_nJ1ZuO_5OnAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "196 million views" + } + }, + "simpleText": "196M views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "pyf8cbqyfPs", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CJkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "pyf8cbqyfPs" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "pyf8cbqyfPs" + ] + } + }, + { + "clickTrackingParams": "CJkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CJoBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CJkBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtweWY4Y2JxeWZQcw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CJgBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CJUBEKQwGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 52 seconds" + } + }, + "simpleText": "3:52" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CJcBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "pyf8cbqyfPs", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CJcBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "pyf8cbqyfPs" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CJcBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CJYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "pyf8cbqyfPs", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CJYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "pyf8cbqyfPs" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "pyf8cbqyfPs" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CJYBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "LE SSERAFIM (르세라핌) 'ANTIFRAGILE' OFFICIAL M/V - 3 minutes, 52 seconds - Go to channel - HYBE LABELS - 196M views - 1 year ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "32si5cfrCNc", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/32si5cfrCNc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBjimPvMxDwTmPBlKX8Buo9EjMeOg", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/32si5cfrCNc/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDCsJMBcdZaForwAnhjYy3L1JT1hQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK - 'How You Like That' DANCE PERFORMANCE VIDEO by BLACKPINK 1,522,365,959 views 3 years ago 3 minutes, 1 second" + } + }, + "simpleText": "BLACKPINK - 'How You Like That' DANCE PERFORMANCE VIDEO" + }, + "longBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "3 years ago" + }, + "viewCountText": { + "simpleText": "1,522,365,959 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 1 second" + } + }, + "simpleText": "3:01" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=32si5cfrCNc", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "32si5cfrCNc", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jeenl6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=df6b22e5c7eb08d7&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/hZDUwjoeQqigphL4A1tkg9c6hVp5yXmbboBR7PYFUSFj5PIJSA483NB5v7b0XVoTN9GCku3tqQ=s88-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "OFFICIAL_ARTIST_BADGE" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED_ARTIST", + "tooltip": "Official Artist Channel", + "trackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Official Artist Channel" + } + } + } + ], + "trackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfdA15Gsv9zcyLXfAQ==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.5 billion views" + } + }, + "simpleText": "1.5B views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "32si5cfrCNc", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CJMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "32si5cfrCNc" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "32si5cfrCNc" + ] + } + }, + { + "clickTrackingParams": "CJMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CJQBELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CJMBEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgszMnNpNWNmckNOYw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CJIBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CI8BEKQwGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 1 second" + } + }, + "simpleText": "3:01" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CJEBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "32si5cfrCNc", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CJEBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "32si5cfrCNc" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CJEBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CJABEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CJABEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "32si5cfrCNc", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CJABEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "32si5cfrCNc" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "32si5cfrCNc" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CJABEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK - 'How You Like That' DANCE PERFORMANCE VIDEO - 3 minutes, 1 second - Go to channel - BLACKPINK - 1.5B views - 3 years ago - play video" + } + } + } + }, + { + "compactVideoRenderer": { + "videoId": "bwmSjveL3Lc", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/bwmSjveL3Lc/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDRzdujtL9QM0RZ8elD00oS2fXMhg", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/bwmSjveL3Lc/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBOprayVWEKYsgHjpoCw6GFcV3Hng", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK - '붐바야 (BOOMBAYAH)' M/V by BLACKPINK 1,646,522,795 views 7 years ago 4 minutes, 4 seconds" + } + }, + "simpleText": "BLACKPINK - '붐바야 (BOOMBAYAH)' M/V" + }, + "longBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "publishedTimeText": { + "simpleText": "7 years ago" + }, + "viewCountText": { + "simpleText": "1,646,522,795 views" + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 4 seconds" + } + }, + "simpleText": "4:04" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfcyB3JlbGF0ZWRIkZeu3Of16vNlmgEFCAEQ-B0=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=bwmSjveL3Lc", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "bwmSjveL3Lc", + "nofollow": true, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jeenle.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=6f09928ef78bdcb7&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "shortBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/hZDUwjoeQqigphL4A1tkg9c6hVp5yXmbboBR7PYFUSFj5PIJSA483NB5v7b0XVoTN9GCku3tqQ=s88-c-k-c0x00ffffff-no-rj", + "width": 68, + "height": 68 + } + ] + }, + "ownerBadges": [ + { + "metadataBadgeRenderer": { + "icon": { + "iconType": "OFFICIAL_ARTIST_BADGE" + }, + "style": "BADGE_STYLE_TYPE_VERIFIED_ARTIST", + "tooltip": "Official Artist Channel", + "trackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "label": "Official Artist Channel" + } + } + } + ], + "trackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfdAt7mvvO_R5IRv", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.6 billion views" + } + }, + "simpleText": "1.6B views" + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "serviceEndpoint": { + "clickTrackingParams": "CI0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CI0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "bwmSjveL3Lc", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CI0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "bwmSjveL3Lc" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "bwmSjveL3Lc" + ] + } + }, + { + "clickTrackingParams": "CI0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "notificationActionRenderer": { + "responseText": { + "simpleText": "Added to queue" + }, + "trackingParams": "CI4BELlqIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "popupType": "TOAST" + } + } + ] + } + }, + "trackingParams": "CI0BEP6YBBgGIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "Cgtid21TanZlTDNMYw%3D%3D", + "commands": [ + { + "clickTrackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CIwBEI5iIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "hasSeparator": true + } + } + ], + "trackingParams": "CIkBEKQwGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 4 seconds" + } + }, + "simpleText": "4:04" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "isToggled": false, + "untoggledIcon": { + "iconType": "WATCH_LATER" + }, + "toggledIcon": { + "iconType": "CHECK" + }, + "untoggledTooltip": "Watch later", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CIsBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "addedVideoId": "bwmSjveL3Lc", + "action": "ACTION_ADD_VIDEO" + } + ] + } + }, + "toggledServiceEndpoint": { + "clickTrackingParams": "CIsBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse/edit_playlist" + } + }, + "playlistEditEndpoint": { + "playlistId": "WL", + "actions": [ + { + "action": "ACTION_REMOVE_VIDEO_BY_VIDEO_ID", + "removedVideoId": "bwmSjveL3Lc" + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Watch later" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CIsBEPnnAxgCIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayToggleButtonRenderer": { + "untoggledIcon": { + "iconType": "ADD_TO_QUEUE_TAIL" + }, + "toggledIcon": { + "iconType": "PLAYLIST_ADD_CHECK" + }, + "untoggledTooltip": "Add to queue", + "toggledTooltip": "Added", + "untoggledServiceEndpoint": { + "clickTrackingParams": "CIoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CIoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "addToPlaylistCommand": { + "openMiniplayer": false, + "openListPanel": true, + "videoId": "bwmSjveL3Lc", + "listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE", + "onCreateListCommand": { + "clickTrackingParams": "CIoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/playlist/create" + } + }, + "createPlaylistServiceEndpoint": { + "videoIds": [ + "bwmSjveL3Lc" + ], + "params": "CAQ%3D" + } + }, + "videoIds": [ + "bwmSjveL3Lc" + ] + } + } + ] + } + }, + "untoggledAccessibility": { + "accessibilityData": { + "label": "Add to queue" + } + }, + "toggledAccessibility": { + "accessibilityData": { + "label": "Added" + } + }, + "trackingParams": "CIoBEMfsBBgDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ], + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK - '붐바야 (BOOMBAYAH)' M/V - 4 minutes, 4 seconds - Go to channel - BLACKPINK - 1.6B views - 7 years ago - play video" + } + } + } + } + ], + "continuations": [ + { + "nextContinuationData": { + "continuation": "CBQSExILWmVlcnJudUxpNUXAAQHIAQEYACqjDjJzNkw2d3pUQ2dyUUNnb0Q4ajRBQ2c3Q1Bnc0l6cS1tbFBTLTVKcmhBUW9EOGo0QUNnM0NQZ29JM3I3Z2pfdVl2b2QwQ2c3Q1Bnc0lfZUNBXzQyNl9OV1pBUW9Pd2o0TENQWHE1Y3Z0Z3VlZDVRRUtEc0ktQ3dqazRNencwS19abUpJQkNnM0NQZ29JNHItUm91ZVkxTXBRQ2czQ1Bnb0k4OVRQNGNXMzBJd1JDZzNDUGdvSTRxYmZ6TS11b2ZFRENnN0NQZ3NJX2RIeWs5el9tS0t4QVFvT3dqNExDT24yeE1ycDdKS3JpQUVLRGNJLUNnaVpvcUNKbGFDZ2lVNEtBX0ktQUFvT3dqNExDTjdvd0p1OW04V0N5UUVLQV9JLUFBb093ajRMQ05QTjNmZXkydW1jbVFFS0FfSS1BQW9Pd2o0TENKeXJxcEs4MWZTTXhBRUtBX0ktQUFvTndqNEtDTW4xbEkzbHUtaW1mQW9EOGo0QUNnM0NQZ29JOVpHYjR0LTZyYWMxQ2dQeVBnQUtEY0ktQ2dpZTJaWFM1b21Td25VS0FfSS1BQW9Pd2o0TENMbTVrOEc2ck5DUWpnRUtBX0ktQUFvTndqNEtDTnVibVl1VjBvRG5DQW9EOGo0QUNnM0NQZ29JdVBXQ2dPZlgxZnRZQ2dQeVBnQUtEY0ktQ2dqSV9KdkF4UGFtZ3pvS0FfSS1BQW9Od2o0S0NQanJrcy01ektPVmNRb0Q4ajRBQ2c3Q1Bnc0l2T3ZtMWFTaDlPT0xBUW9EOGo0QUNnM0NQZ29JNnMzMTRfenlyTmg2Q2dQeVBnQUtEc0ktQ3dpbTBxWDhwcy0zdU93QkNnUHlQZ0FLRHNJLUN3amc2STdOek4zWXlQUUJDZ1B5UGdBS0RjSS1DZ2lxeG82MXdNQ0N3ellLQV9JLUFBb093ajRMQ1B2NXlkV2Jqdi1UcHdFS0FfSS1BQW9Pd2o0TENOZVJyTF9jM01pMTN3RUtBX0ktQUFvTndqNEtDTGU1cjd6djBlU0Vid29EOGo0QUNnM0NQZ29JLXNXX3I1ZWI4c01XQ2czQ1Bnb0lpLUdvNjlYMnlfc3JDZzNDUGdvSWlObnc4SmowcHZGbENnM0NQZ29Jczl1ODM4Xzdrc0ZGQ2c3Q1Bnc0k5cnZkNFpqNjlNX2VBUW9Pd2o0TENPQ1VrNG5zbXVMTV9nRUtEc0ktQ3dpMHFySEkzc0R0cGJjQkNnN0NQZ3NJazlxdjZNV2FwY2JhQVFvT3dqNExDTVN6djQyOHhxcUstUUVLRHNJLUN3allfNm5FNXAzVjdMc0JDZzdDUGdzSXNQNjV1ZjdpcEtyV0FRb093ajRMQ05hdWlJWDJwX2VyOFFFS0RzSS1Dd2pvcTlEUG11Nmx6ZEFCQ2c3Q1Bnc0lwNnZFaWNuQ3A1ZUxBUW9Pd2o0TENJQ244cG1vejhuLWlnRUtEY0ktQ2dpSG91emdoS18xdlQwS0RzSS1Dd2pXNE9qcV8tUGFpcHdCQ2c3Q1Bnc0k4ZV9Hbi16bTN2U2pBUW9Od2o0S0NLMjh0WTZJaUtETkd3b093ajRMQ0tfdHlOZXF3T3VCMUFFS0RzSS1Dd2pja3BPWnR0S1AtNDhCQ2c3Q1Bnc0kxSldKNjgyU21lN3dBUW9Od2o0S0NMWE52ZUNUN1pfLVpnb093ajRMQ0pMSHM0eTFrX3FJcXdFU0ZnQUNEUThSRXhVWEdSc2RIeUVqSlNjcEt5MHZNVE1hQkFnQUVBRWFCQWdDRUFNYUJBZ0NFQVFhQkFnQ0VBVWFCQWdDRUFZYUJBZ0NFQWNhQkFnQ0VBZ2FCQWdDRUFrYUJBZ0NFQW9hQkFnQ0VBc2FCQWdDRUF3YUJBZ05FQTRhQkFnUEVCQWFCQWdSRUJJYUJBZ1RFQlFhQkFnVkVCWWFCQWdYRUJnYUJBZ1pFQm9hQkFnYkVCd2FCQWdkRUI0YUJBZ2ZFQ0FhQkFnaEVDSWFCQWdqRUNRYUJBZ2xFQ1lhQkFnbkVDZ2FCQWdwRUNvYUJBZ3JFQ3dhQkFndEVDNGFCQWd2RURBYUJBZ3hFRElhQkFnekVBY2FCQWd6RURRYUJBZ3pFRFVhQkFnekVEWWFCQWd6RURjYUJBZ3pFRGdhQkFnekVEa2FCQWd6RURvYUJBZ3pFRHNhQkFnekVEd2FCQWd6RUQwYUJBZ3pFRDRhQkFnekVBd2FCQWd6RUFVYUJBZ3pFRDhhQkFnekVFQWFCQWd6RUVFYUJBZ3pFRUlhQkFnekVFTWFCQWd6RUVRYUJBZ3pFRVVhQkFnekVBTWFCQWd6RUVZYUJBZ3pFRWNhQkFnekVFZ2FCQWd6RUVrYUJBZ3pFQVlhQkFnekVBUWFCQWd6RUVvYUJBZ3pFRXNxRmdBQ0RROFJFeFVYR1JzZEh5RWpKU2NwS3kwdk1UTWoPd2F0Y2gtbmV4dC1mZWVk", + "clickTrackingParams": "CIgBEMm3AiITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "label": { + "runs": [ + { + "text": "Show more" + } + ] + } + } + } + ], + "trackingParams": "CIcBEKkwIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "autoplay": { + "autoplay": { + "sets": [ + { + "mode": "NORMAL", + "autoplayVideo": { + "clickTrackingParams": "CIYBEOGSASITCP-4o5yVqYIDFbfiSQcdsw4N9zIMcmVsYXRlZC1hdXRvSJGXrtzn9erzZZoBBQgDEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg&pp=QAFIAQ%3D%3D", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "params": "EAEYAdoBBAgBKgA%3D", + "playerParams": "QAFIAQ%3D%3D", + "watchEndpointSupportedPrefetchConfig": { + "prefetchHintConfig": { + "prefetchPriority": 0, + "countdownUiRelativeSecondsPrefetchCondition": -3 + } + } + } + } + } + ], + "countDownSecs": 5, + "trackingParams": "CIYBEOGSASITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + } + }, + "currentVideoEndpoint": { + "clickTrackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "ZeerrnuLi5E", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=65e7abae7b8b8b91&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfc=", + "playerOverlays": { + "playerOverlayRenderer": { + "endScreen": { + "watchNextEndScreenRenderer": { + "results": [ + { + "endScreenVideoRenderer": { + "videoId": "4TWR90KJl84", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBYCGc-AKsDC6UpJgIZw2_VsqjVWA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAOThIIKJ4XdGZeaUHjudOSzT0ctQ", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLASTMJlvBEfgwx3xtXvpDRBV1Y43g", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/4TWR90KJl84/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDh-eDxZBmrNsHcb6pYX0Gyx6gJ8Q", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Next Level' MV by SMTOWN 277,189,882 views 2 years ago 3 minutes, 56 seconds" + } + }, + "simpleText": "aespa 에스파 'Next Level' MV" + }, + "shortBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CIUBEL1OGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 56 seconds" + } + }, + "simpleText": "3:56" + }, + "lengthInSeconds": 236, + "navigationEndpoint": { + "clickTrackingParams": "CIUBEL1OGAAiEwj_uKOclamCAxW34kkHHbMODfcyCWVuZHNjcmVlbkiRl67c5_Xq82WaAQUIAhD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=4TWR90KJl84", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "4TWR90KJl84", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr2---sn-h0jelnes.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=e13591f7428997ce&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CIUBEL1OGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "277 million views" + } + }, + "simpleText": "277M views" + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 56 seconds" + } + }, + "simpleText": "3:56" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "yQUU29NwNF4", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLA4pIWwOFmVuVU-jZ-j7S4GvgxjKw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBrVn4L6TBcm1q49EWHbihMihO3yw", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCKh0og7bVvyztseGdyedZJPk3Qvw", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/yQUU29NwNF4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC4B3H-paMDpjdf_V6NsymGNvVicQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122 by 스브스케이팝 X INKIGAYO 10,870,401 views 2 years ago 3 minutes, 33 seconds" + } + }, + "simpleText": "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122" + }, + "shortBylineText": { + "runs": [ + { + "text": "스브스케이팝 X INKIGAYO", + "navigationEndpoint": { + "clickTrackingParams": "CIQBEL1OGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SBSKPOP", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCS_hnpJLQTvBkqALgapi_4g", + "canonicalBaseUrl": "/@SBSKPOP" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 33 seconds" + } + }, + "simpleText": "3:33" + }, + "lengthInSeconds": 213, + "navigationEndpoint": { + "clickTrackingParams": "CIQBEL1OGAEiEwj_uKOclamCAxW34kkHHbMODfcyCWVuZHNjcmVlbkiRl67c5_Xq82WaAQUIAhD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=yQUU29NwNF4", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "yQUU29NwNF4", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jelne7.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=c90514dbd370345e&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CIQBEL1OGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "10 million views" + } + }, + "simpleText": "10M views" + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 33 seconds" + } + }, + "simpleText": "3:33" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "mTmm0y73ZtM", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDz3aKv3IbWrI5GmtWjWl2br6h7jw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCrpS4lT-eA6kDbvSmsniIkfV2Jyw", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLABvMkOY0M6JnkUmSf1RcISLhDRQQ", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/mTmm0y73ZtM/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCNnJtMt14Dn6iNSSHZtZL5MsYDtQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "Secret Missions: 7 Thrilling Spy and Secret Agent Stories by My Story Shared 888,941 views 9 days ago 1 hour, 53 minutes" + } + }, + "simpleText": "Secret Missions: 7 Thrilling Spy and Secret Agent Stories" + }, + "shortBylineText": { + "runs": [ + { + "text": "My Story Shared", + "navigationEndpoint": { + "clickTrackingParams": "CIMBEL1OGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@mystoryshared495", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCSVngVJ_0s0ZX4oiN_4ZkaQ", + "canonicalBaseUrl": "/@mystoryshared495" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "1 hour, 53 minutes, 31 seconds" + } + }, + "simpleText": "1:53:31" + }, + "lengthInSeconds": 6811, + "navigationEndpoint": { + "clickTrackingParams": "CIMBEL1OGAIiEwj_uKOclamCAxW34kkHHbMODfcyCWVuZHNjcmVlbkiRl67c5_Xq82WaAQUIAhD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=mTmm0y73ZtM", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "mTmm0y73ZtM", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jeened.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=9939a6d32ef766d3&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CIMBEL1OGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "888K views" + } + }, + "simpleText": "888K views" + }, + "publishedTimeText": { + "simpleText": "9 days ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "1 hour, 53 minutes, 31 seconds" + } + }, + "simpleText": "1:53:31" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "xBnSq8JKlZw", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGUgUChFMA8=&rs=AOn4CLDBvW0PORHHExpND8qbAa0OCr5MMw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE1CMQBEG5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGUgUChFMA8=&rs=AOn4CLDQUPzYCn7OSBPPXCsJjUx2KXM1pA", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE2CPYBEIoBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhlIFAoRTAP&rs=AOn4CLB7ECc4GRbq2nzDidnoLJLNR9Owtw", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/xBnSq8JKlZw/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhlIFAoRTAP&rs=AOn4CLASNCymIttQ1GwgbWvtxD_KeG5yGw", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "16 Eylül 2023 by Buğlem TV 8,407 views 1 month ago 2 hours, 12 minutes" + } + }, + "simpleText": "16 Eylül 2023" + }, + "shortBylineText": { + "runs": [ + { + "text": "Buğlem TV", + "navigationEndpoint": { + "clickTrackingParams": "CIIBEL1OGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@bedriyekascal7309", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCcyqrKg5jlvVJy1nc-0igRQ", + "canonicalBaseUrl": "/@bedriyekascal7309" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "2 hours, 12 minutes, 51 seconds" + } + }, + "simpleText": "2:12:51" + }, + "lengthInSeconds": 7971, + "navigationEndpoint": { + "clickTrackingParams": "CIIBEL1OGAMiEwj_uKOclamCAxW34kkHHbMODfcyCWVuZHNjcmVlbkiRl67c5_Xq82WaAQUIAhD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=xBnSq8JKlZw", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "xBnSq8JKlZw", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jeenld.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=c419d2abc24a959c&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CIIBEL1OGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "8.4K views" + } + }, + "simpleText": "8.4K views" + }, + "publishedTimeText": { + "simpleText": "1 month ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 hours, 12 minutes, 51 seconds" + } + }, + "simpleText": "2:12:51" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "fE2h3lGlOsk", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLC44Q0lpu5a8rltgTMxi0X2QA6jnQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAd8AgCBNrmOtWliOlseJiDUHbWTQ", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCNVg_1E4pyQQTSa9gqiqCgdDQf4g", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/fE2h3lGlOsk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC6F85UnQjP3_9U0gehdYbbF6NTxw", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "ITZY \"WANNABE\" M/V @ITZY by JYP Entertainment 523,737,389 views 3 years ago 3 minutes, 39 seconds" + } + }, + "simpleText": "ITZY \"WANNABE\" M/V @ITZY" + }, + "shortBylineText": { + "runs": [ + { + "text": "JYP Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CIEBEL1OGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@JYPEntertainment", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCaO6TYtlC8U5ttz62hTrZgg", + "canonicalBaseUrl": "/@JYPEntertainment" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 39 seconds" + } + }, + "simpleText": "3:39" + }, + "lengthInSeconds": 219, + "navigationEndpoint": { + "clickTrackingParams": "CIEBEL1OGAQiEwj_uKOclamCAxW34kkHHbMODfcyCWVuZHNjcmVlbkiRl67c5_Xq82WaAQUIAhD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=fE2h3lGlOsk", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "fE2h3lGlOsk", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr4---sn-h0jelnez.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=7c4da1de51a53ac9&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CIEBEL1OGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "523 million views" + } + }, + "simpleText": "523M views" + }, + "publishedTimeText": { + "simpleText": "3 years ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 39 seconds" + } + }, + "simpleText": "3:39" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "NU611fxGyPU", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAgKORzcy6WKosI1_PAVWDgcjJ9jA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAoLEv5XDah2Cl__LI0NGIj4tYTYA", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDABsPiCwkIQ5Fohx6-NEPWTOt-4g", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/NU611fxGyPU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDqWWIfLCdtyqy5aIUA_PGcEW2r2g", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Black Mamba' Dance Practice by aespa 40,486,850 views 2 years ago 2 minutes, 55 seconds" + } + }, + "simpleText": "aespa 에스파 'Black Mamba' Dance Practice" + }, + "shortBylineText": { + "runs": [ + { + "text": "aespa", + "navigationEndpoint": { + "clickTrackingParams": "CIABEL1OGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC9GtSLeksfK4yuJ_g1lgQbg", + "canonicalBaseUrl": "/channel/UC9GtSLeksfK4yuJ_g1lgQbg" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 55 seconds" + } + }, + "simpleText": "2:55" + }, + "lengthInSeconds": 175, + "navigationEndpoint": { + "clickTrackingParams": "CIABEL1OGAUiEwj_uKOclamCAxW34kkHHbMODfcyCWVuZHNjcmVlbkiRl67c5_Xq82WaAQUIAhD4HQ==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=NU611fxGyPU", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "NU611fxGyPU", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jeener.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=354eb5d5fc46c8f5&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CIABEL1OGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "40 million views" + } + }, + "simpleText": "40M views" + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 55 seconds" + } + }, + "simpleText": "2:55" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "dYRITmpFbJ4", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBOxN6ukbZNOPwUBhRZYgG9r23lng", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDf77RiKqQQPLjgTwf7KerRco0zEw", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBIVW9OsXO9C-94_KcXg7yBw2RiGA", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/dYRITmpFbJ4/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBLmRDhzBtNHCuokfKRQufiNKKfZg", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Girls' MV by SMTOWN 135,870,843 views 1 year ago 4 minutes, 29 seconds" + } + }, + "simpleText": "aespa 에스파 'Girls' MV" + }, + "shortBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CH8QvU4YBiITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 29 seconds" + } + }, + "simpleText": "4:29" + }, + "lengthInSeconds": 269, + "navigationEndpoint": { + "clickTrackingParams": "CH8QvU4YBiITCP-4o5yVqYIDFbfiSQcdsw4N9zIJZW5kc2NyZWVuSJGXrtzn9erzZZoBBQgCEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=dYRITmpFbJ4", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "dYRITmpFbJ4", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=7584484e6a456c9e&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CH8QvU4YBiITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "135 million views" + } + }, + "simpleText": "135M views" + }, + "publishedTimeText": { + "simpleText": "1 year ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 29 seconds" + } + }, + "simpleText": "4:29" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "jiFBY6gk3Lk", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLARhXJ8KOxiWpj430QpyKF2m3LJFQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCvZ_95qkzSbHUMNMYeglUKHB96zA", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLC1Jj1L7E3HkzVjLS5diB1P32tqLg", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/jiFBY6gk3Lk/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDGOkNsfHOpy9GLXoHn1rnIOn0CcA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK x AESPA – Pink Venom / Black Mamba MASHUP (feat. Next Level) by Miggy Smallz 4,218,059 views 1 year ago 4 minutes" + } + }, + "simpleText": "BLACKPINK x AESPA – Pink Venom / Black Mamba MASHUP (feat. Next Level)" + }, + "shortBylineText": { + "runs": [ + { + "text": "Miggy Smallz", + "navigationEndpoint": { + "clickTrackingParams": "CH4QvU4YByITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@MiggySmallzYT", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC5XWNylwy4efFufjMYqcglw", + "canonicalBaseUrl": "/@MiggySmallzYT" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes" + } + }, + "simpleText": "4:00" + }, + "lengthInSeconds": 240, + "navigationEndpoint": { + "clickTrackingParams": "CH4QvU4YByITCP-4o5yVqYIDFbfiSQcdsw4N9zIJZW5kc2NyZWVuSJGXrtzn9erzZZoBBQgCEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=jiFBY6gk3Lk", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "jiFBY6gk3Lk", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=8e214163a824dcb9&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CH4QvU4YByITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.2 million views" + } + }, + "simpleText": "4.2M views" + }, + "publishedTimeText": { + "simpleText": "1 year ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes" + } + }, + "simpleText": "4:00" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "CM4CkVFmTds", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBfd7QADIduQSR2ESLIp1k5gxxNDg", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBZosJ-4cStVgnrjiAN2LhS7-XNNg", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCqJIUjdaenAGPf0FnLv5G2QgrKCQ", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/CM4CkVFmTds/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDRn7hTXV_Ls30E6BQNZQtQjbuEpA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "TWICE \"I CAN'T STOP ME\" M/V by JYP Entertainment 509,192,107 views 3 years ago 3 minutes, 41 seconds" + } + }, + "simpleText": "TWICE \"I CAN'T STOP ME\" M/V" + }, + "shortBylineText": { + "runs": [ + { + "text": "JYP Entertainment", + "navigationEndpoint": { + "clickTrackingParams": "CH0QvU4YCCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@JYPEntertainment", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCaO6TYtlC8U5ttz62hTrZgg", + "canonicalBaseUrl": "/@JYPEntertainment" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 41 seconds" + } + }, + "simpleText": "3:41" + }, + "lengthInSeconds": 221, + "navigationEndpoint": { + "clickTrackingParams": "CH0QvU4YCCITCP-4o5yVqYIDFbfiSQcdsw4N9zIJZW5kc2NyZWVuSJGXrtzn9erzZZoBBQgCEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=CM4CkVFmTds", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "CM4CkVFmTds", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jeenle.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=08ce029151664ddb&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CH0QvU4YCCITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "509 million views" + } + }, + "simpleText": "509M views" + }, + "publishedTimeText": { + "simpleText": "3 years ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "3 minutes, 41 seconds" + } + }, + "simpleText": "3:41" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "WPdWvnAAurg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDQGxlnDkAdMYRm2cdkDmiDbBDpYw", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLAMezJD5V7CM2iAYVcV4xAj0jaVBQ", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAa4oCIG6IwAuDRZyH7pb4KNk52yg", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/WPdWvnAAurg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAIHFE0eH_r-HP7DRPv1QJJnRDzWw", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Savage' MV by SMTOWN 245,301,963 views 2 years ago 4 minutes, 19 seconds" + } + }, + "simpleText": "aespa 에스파 'Savage' MV" + }, + "shortBylineText": { + "runs": [ + { + "text": "SMTOWN", + "navigationEndpoint": { + "clickTrackingParams": "CHwQvU4YCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 19 seconds" + } + }, + "simpleText": "4:19" + }, + "lengthInSeconds": 259, + "navigationEndpoint": { + "clickTrackingParams": "CHwQvU4YCSITCP-4o5yVqYIDFbfiSQcdsw4N9zIJZW5kc2NyZWVuSJGXrtzn9erzZZoBBQgCEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=WPdWvnAAurg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "WPdWvnAAurg", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelnes.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=58f756be7000bab8&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CHwQvU4YCSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "245 million views" + } + }, + "simpleText": "245M views" + }, + "publishedTimeText": { + "simpleText": "2 years ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "4 minutes, 19 seconds" + } + }, + "simpleText": "4:19" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "OgabtEgG_kg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGkgaShpMA8=&rs=AOn4CLBF1lxbztXMyXmem4owNAWZRqvnBA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE1CMQBEG5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGkgaShpMA8=&rs=AOn4CLBAbAccS1gDwcVn7pNePJqmLIQNbg", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE2CPYBEIoBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhpIGkoaTAP&rs=AOn4CLC1kbzAH-A8sCd83ZeYQr3Gx9RmRw", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhpIGkoaTAP&rs=AOn4CLAqM-WuOQCGTABX_NmzvOUOhx3rLA", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST by x i a o s h i z i 1,719 views 7 days ago 17 minutes" + } + }, + "simpleText": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST" + }, + "shortBylineText": { + "runs": [ + { + "text": "x i a o s h i z i", + "navigationEndpoint": { + "clickTrackingParams": "CHsQvU4YCiITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@khzcl_", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCo7jZg0Q5jBWs0WSq_SdDoA", + "canonicalBaseUrl": "/@khzcl_" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 14 seconds" + } + }, + "simpleText": "17:14" + }, + "lengthInSeconds": 1034, + "navigationEndpoint": { + "clickTrackingParams": "CHsQvU4YCiITCP-4o5yVqYIDFbfiSQcdsw4N9zIJZW5kc2NyZWVuSJGXrtzn9erzZZoBBQgCEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jeenl6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=3a069bb44806fe48&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CHsQvU4YCiITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.7K views" + } + }, + "simpleText": "1.7K views" + }, + "publishedTimeText": { + "simpleText": "7 days ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 14 seconds" + } + }, + "simpleText": "17:14" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + }, + { + "endScreenVideoRenderer": { + "videoId": "cSqOY5nktfg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDkx-bmEWvYbs8ju1cETIRE1AczFQ", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCalzP5L_zatpKz_7mbyt9COaTJ7Q", + "width": 196, + "height": 110 + }, + { + "url": "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBijqZVGJmuYxgB5c0Ic_S8NN_bXg", + "width": 246, + "height": 138 + }, + { + "url": "https://i.ytimg.com/vi/cSqOY5nktfg/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLAYPPC91mec_MPvRxjRBzTpwFDBUQ", + "width": 336, + "height": 188 + } + ] + }, + "title": { + "accessibility": { + "accessibilityData": { + "label": "BLACKPINK THE GAME - ‘THE GIRLS’ MV by BLACKPINK 61,284,005 views 2 months ago 2 minutes, 44 seconds" + } + }, + "simpleText": "BLACKPINK THE GAME - ‘THE GIRLS’ MV" + }, + "shortBylineText": { + "runs": [ + { + "text": "BLACKPINK", + "navigationEndpoint": { + "clickTrackingParams": "CHoQvU4YCyITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCOmHUn--16B90oW2L6FRR3A", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCOmHUn--16B90oW2L6FRR3A", + "canonicalBaseUrl": "/channel/UCOmHUn--16B90oW2L6FRR3A" + } + } + } + ] + }, + "lengthText": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 44 seconds" + } + }, + "simpleText": "2:44" + }, + "lengthInSeconds": 164, + "navigationEndpoint": { + "clickTrackingParams": "CHoQvU4YCyITCP-4o5yVqYIDFbfiSQcdsw4N9zIJZW5kc2NyZWVuSJGXrtzn9erzZZoBBQgCEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=cSqOY5nktfg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "cSqOY5nktfg", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr1---sn-h0jelne6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=712a8e6399e4b5f8&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "trackingParams": "CHoQvU4YCyITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "61 million views" + } + }, + "simpleText": "61M views" + }, + "publishedTimeText": { + "simpleText": "2 months ago" + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "2 minutes, 44 seconds" + } + }, + "simpleText": "2:44" + }, + "style": "DEFAULT" + } + }, + { + "thumbnailOverlayNowPlayingRenderer": { + "text": { + "runs": [ + { + "text": "Now playing" + } + ] + } + } + } + ] + } + } + ], + "title": { + "simpleText": "You may also like..." + }, + "trackingParams": "CHkQ-lwiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "autoplay": { + "playerOverlayAutoplayRenderer": { + "title": { + "simpleText": "Up next" + }, + "videoTitle": { + "accessibility": { + "accessibilityData": { + "label": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST by x i a o s h i z i 1,719 views 7 days ago 17 minutes" + } + }, + "simpleText": "[ FULL ALBUM ] IVE (아이브) — IVE The 1st EP ' I'VE MINE TRACKLIST" + }, + "byline": { + "runs": [ + { + "text": "x i a o s h i z i", + "navigationEndpoint": { + "clickTrackingParams": "CHUQ5JIBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@khzcl_", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCo7jZg0Q5jBWs0WSq_SdDoA", + "canonicalBaseUrl": "/@khzcl_" + } + } + } + ] + }, + "pauseText": { + "simpleText": "Autoplay is paused" + }, + "background": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE1CKgBEF5IVfKriqkDKAgBFQAAiEIYAXABwAEG8AEB-AH-BIAC6AKKAgwIABABGGkgaShpMA8=&rs=AOn4CLBF1lxbztXMyXmem4owNAWZRqvnBA", + "width": 168, + "height": 94 + }, + { + "url": "https://i.ytimg.com/vi/OgabtEgG_kg/hqdefault.jpg?sqp=-oaymwE2CNACELwBSFXyq4qpAygIARUAAIhCGAFwAcABBvABAfgB_gSAAugCigIMCAAQARhpIGkoaTAP&rs=AOn4CLAqM-WuOQCGTABX_NmzvOUOhx3rLA", + "width": 336, + "height": 188 + } + ] + }, + "countDownSecs": 3, + "cancelButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Cancel" + }, + "accessibility": { + "label": "Cancel autoplay for this video" + }, + "trackingParams": "CHgQ4JIBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "accessibilityData": { + "accessibilityData": { + "label": "Cancel autoplay for this video" + } + }, + "command": { + "clickTrackingParams": "CHgQ4JIBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/get_survey" + } + }, + "getSurveyCommand": { + "endpoint": { + "watch": { + "hack": true + } + }, + "action": "SURVEY_TRIGGER_ACTION_AUTOPLAY_CANCEL" + } + } + } + }, + "nextButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "navigationEndpoint": { + "clickTrackingParams": "CHcQ4pIBIhMI_7ijnJWpggMVt-JJBx2zDg33SJGXrtzn9erzZZoBBQgGEPgd", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=OgabtEgG_kg", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "OgabtEgG_kg", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr3---sn-h0jeenl6.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=3a069bb44806fe48&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1785000&mt=1699060144&oweuc=" + } + } + } + } + }, + "accessibility": { + "label": "Play next video" + }, + "trackingParams": "CHcQ4pIBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "accessibilityData": { + "accessibilityData": { + "label": "Play next video" + } + } + } + }, + "trackingParams": "CHUQ5JIBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "closeButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "REMOVE" + }, + "accessibility": { + "label": "Cancel autoplay for this video" + }, + "trackingParams": "CHYQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "accessibility": { + "accessibilityData": { + "label": "17 minutes, 14 seconds" + } + }, + "simpleText": "17:14" + }, + "style": "DEFAULT" + } + } + ], + "preferImmediateRedirect": false, + "videoId": "OgabtEgG_kg", + "publishedTimeText": { + "simpleText": "7 days ago" + }, + "webShowNewAutonavCountdown": true, + "webShowBigThumbnailEndscreen": false, + "shortViewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.7K views" + } + }, + "simpleText": "1.7K views" + }, + "countDownSecsForFullscreen": 3 + } + }, + "shareButton": { + "buttonRenderer": { + "style": "STYLE_OPACITY", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHMQ5ZYBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/share/get_share_panel" + } + }, + "shareEntityServiceEndpoint": { + "serializedShareEntity": "CgtaZWVycm51TGk1RaABAg%3D%3D", + "commands": [ + { + "clickTrackingParams": "CHMQ5ZYBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "openPopupAction": { + "popup": { + "unifiedSharePanelRenderer": { + "trackingParams": "CHQQjmIiEwj_uKOclamCAxW34kkHHbMODfc=", + "showLoadingSpinner": true + } + }, + "popupType": "DIALOG", + "beReused": true + } + } + ] + } + }, + "tooltip": "Share", + "trackingParams": "CHMQ5ZYBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "addToMenu": { + "menuRenderer": { + "trackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "videoDetails": { + "playerOverlayVideoDetailsRenderer": { + "title": { + "simpleText": "aespa 에스파 'Black Mamba' MV" + }, + "subtitle": { + "runs": [ + { + "text": "SMTOWN" + }, + { + "text": " • " + }, + { + "text": "255,522,287 views" + } + ] + } + } + }, + "autonavToggle": { + "autoplaySwitchButtonRenderer": { + "onEnabledCommand": { + "clickTrackingParams": "CHIQ9bUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/account/set_setting" + } + }, + "setSettingEndpoint": { + "settingItemId": "406", + "boolValue": true, + "settingItemIdForClient": "AUTONAV_FOR_SIGN_OUT" + } + }, + "onDisabledCommand": { + "clickTrackingParams": "CHIQ9bUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/account/set_setting" + } + }, + "setSettingEndpoint": { + "settingItemId": "406", + "boolValue": false, + "settingItemIdForClient": "AUTONAV_FOR_SIGN_OUT" + } + }, + "enabledAccessibilityData": { + "accessibilityData": { + "label": "Autoplay is on" + } + }, + "disabledAccessibilityData": { + "accessibilityData": { + "label": "Autoplay is off" + } + }, + "trackingParams": "CHIQ9bUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "enabled": true + } + }, + "decoratedPlayerBarRenderer": { + "decoratedPlayerBarRenderer": { + "playerBar": { + "multiMarkersPlayerBarRenderer": { + "visibleOnLoad": { + "key": "" + }, + "trackingParams": "CHEQocALIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + } + } + }, + "speedmasterUserEdu": { + "speedmasterEduViewModel": { + "bodyText": { + "content": "Playing at 2x speed" + } + } + } + } + }, + "onResponseReceivedEndpoints": [ + { + "clickTrackingParams": "CAAQg2ciEwj_uKOclamCAxW34kkHHbMODfc=", + "loadMarkersCommand": { + "visibleOnLoadKeys": [ + "EgpIRUFUU0VFS0VSIJICKAE%3D" + ], + "entityKeys": [ + "EgpIRUFUU0VFS0VSIJICKAE%3D" + ] + } + } + ], + "engagementPanels": [ + { + "engagementPanelSectionListRenderer": { + "content": { + "adsEngagementPanelContentRenderer": { + "hack": true + } + }, + "targetId": "engagement-panel-ads", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN", + "loggingDirectives": { + "trackingParams": "CG8Q040EGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "engagementPanelSectionListRenderer": { + "panelIdentifier": "engagement-panel-structured-description", + "header": { + "engagementPanelTitleHeaderRenderer": { + "title": { + "simpleText": "Description" + }, + "visibilityButton": { + "buttonRenderer": { + "icon": { + "iconType": "CLOSE" + }, + "trackingParams": "CG4Q8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "accessibilityData": { + "label": "Close" + } + }, + "command": { + "clickTrackingParams": "CG4Q8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CG4Q8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "changeEngagementPanelVisibilityAction": { + "targetId": "engagement-panel-structured-description", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN" + } + }, + { + "clickTrackingParams": "CG4Q8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "updateToggleButtonStateCommand": { + "toggled": false, + "buttonId": "TOGGLE_BUTTON_ID_TYPE_STRUCTURED_DESCRIPTION" + } + } + ] + } + } + } + }, + "trackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "content": { + "structuredDescriptionContentRenderer": { + "items": [ + { + "videoDescriptionHeaderRenderer": { + "title": { + "runs": [ + { + "text": "aespa 에스파 'Black Mamba' MV" + } + ] + }, + "channel": { + "simpleText": "SMTOWN" + }, + "views": { + "simpleText": "255,522,287 views" + }, + "publishDate": { + "simpleText": "Nov 17, 2020" + }, + "factoid": [ + { + "factoidRenderer": { + "value": { + "simpleText": "4.2M" + }, + "label": { + "simpleText": "Likes" + }, + "accessibilityText": "4.2 million likes" + } + }, + { + "viewCountFactoidRenderer": { + "viewCountEntityKey": "EgtaZWVycm51TGk1RSDCASgB", + "factoid": { + "factoidRenderer": { + "value": { + "simpleText": "255,522,287" + }, + "label": { + "simpleText": "Views" + }, + "accessibilityText": "255,522,287 views" + } + }, + "viewCountType": "VIEW_COUNT_FACTOID_TYPE_TOTAL_VIEWS" + } + }, + { + "factoidRenderer": { + "value": { + "simpleText": "2020" + }, + "label": { + "simpleText": "Nov 17" + }, + "accessibilityText": "Nov 17, 2020" + } + } + ], + "channelNavigationEndpoint": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + }, + "channelThumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s88-c-k-c0x00ffffff-no-rj" + } + ] + } + } + }, + { + "expandableVideoDescriptionBodyRenderer": { + "showMoreText": { + "simpleText": "Show more" + }, + "showLessText": { + "simpleText": "Show less" + }, + "attributedDescriptionBodyText": { + "content": "🎧Listen and download aespa's debut single \"Black Mamba\": https://smarturl.it/aespa_BlackMamba\n🐍The Debut Stage    • aespa 에스파 'Black Mamba' The Debut Stage  \n\n🎟️ aespa Showcase SYNK in LA! Tickets now on sale: https://www.ticketmaster.com/event/0A...\n\nSubscribe to aespa Official YouTube Channel!\nhttps://www.youtube.com/aespa?sub_con...\n\naespa official\n   / aespa  \n  / aespa_official  \n  / aespa_official  \n  / aespa_official  \n  / aespa.official  \nhttps://weibo.com/aespa\n\n#aespa #æspa #BlackMamba #블랙맘바 #에스파\naespa 에스파 'Black Mamba' MV ℗ SM Entertainment", + "commandRuns": [ + { + "startIndex": 58, + "length": 36, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa1RGcGljS1ZKM1ZVNmVmQlFOUWxWdHNSb2wzQXxBQ3Jtc0tsZ1hmNU5xQVBNUVUtTFlud0tfT1F0ZVZiSFBLdkdmSkxYSGdSOEtJOHUyVTZkTkJsclRKUEUxeXFoeWlJSmUtZVV2OUV6c3ozbHpBSXRWdjdNS19kMGtWRHcxaGJiQWdfcjV4YlUxcHVMb0ptU21raw&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa1RGcGljS1ZKM1ZVNmVmQlFOUWxWdHNSb2wzQXxBQ3Jtc0tsZ1hmNU5xQVBNUVUtTFlud0tfT1F0ZVZiSFBLdkdmSkxYSGdSOEtJOHUyVTZkTkJsclRKUEUxeXFoeWlJSmUtZVV2OUV6c3ozbHpBSXRWdjdNS19kMGtWRHcxaGJiQWdfcjV4YlUxcHVMb0ptU21raw&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 113, + "length": 46, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=Ky5RT5oGg0w&t=0s", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "Ky5RT5oGg0w", + "startTimeSeconds": 0, + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jeener.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=2b2e514f9a06834c&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + } + } + }, + { + "startIndex": 213, + "length": 40, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3FLSG9UaEpUcEYwSWFlMUpTcWdWTEM1ZzlLd3xBQ3Jtc0trWjBqUHFBR1Y0blNDeFdIa0cxZjV4eFZ2czdMVnZqZnF0Zy1qUWp6ZzJ2U3p4X1ZnWlM2ZU1vTGMtdWNoSFVWQmJnY00zaUd3TGtTQlNuTDc0dnRfM0xNRzlJRXdhLThGUHlSRXhlcEZhOTAza25iOA&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3FLSG9UaEpUcEYwSWFlMUpTcWdWTEM1ZzlLd3xBQ3Jtc0trWjBqUHFBR1Y0blNDeFdIa0cxZjV4eFZ2czdMVnZqZnF0Zy1qUWp6ZzJ2U3p4X1ZnWlM2ZU1vTGMtdWNoSFVWQmJnY00zaUd3TGtTQlNuTDc0dnRfM0xNRzlJRXdhLThGUHlSRXhlcEZhOTAza25iOA&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 300, + "length": 40, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/aespa?sub_confirmation=1", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/aespa?sub_confirmation=1", + "nofollow": true + } + } + } + }, + { + "startIndex": 357, + "length": 12, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/c/aespa", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/c/aespa", + "nofollow": true + } + } + } + }, + { + "startIndex": 370, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbk4yVkJUQWxzd2M0dUJhM1FlSGpaNjQ3d0ctZ3xBQ3Jtc0tuTnVydEhESFRIdmt1SVE4SDUxLTY5NkFLNklZUGwzbmEyNkotbmdaR0pic2FHT0JOcXRxMU01c1BhakRucWptQTZGRFRGV1ZIa0tMX1ZKbTc0SG5zSUdjVUhjMGs3MkZMZWNGbGNBcXJfc29lWmJ6bw&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbk4yVkJUQWxzd2M0dUJhM1FlSGpaNjQ3d0ctZ3xBQ3Jtc0tuTnVydEhESFRIdmt1SVE4SDUxLTY5NkFLNklZUGwzbmEyNkotbmdaR0pic2FHT0JOcXRxMU01c1BhakRucWptQTZGRFRGV1ZIa0tMX1ZKbTc0SG5zSUdjVUhjMGs3MkZMZWNGbGNBcXJfc29lWmJ6bw&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 391, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbmc3a1NrV1ltS0VIOHo3TVR3M3BIdDlWY2Mtd3xBQ3Jtc0tubWRFWjdyQzk1bFBnVmZUc1N6RzNKRUtqSkdPc2JnZDMtWUdHY3U2RUx3YXd5WDZQY1JaV0RYOHRVbXdvVklMaEVpOE5HYW42Zld0UTlMVkk1REZ2T21zOVQ4Nkp2QVhFN0Vhc05XZmU5WVF6ek1YZw&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbmc3a1NrV1ltS0VIOHo3TVR3M3BIdDlWY2Mtd3xBQ3Jtc0tubWRFWjdyQzk1bFBnVmZUc1N6RzNKRUtqSkdPc2JnZDMtWUdHY3U2RUx3YXd5WDZQY1JaV0RYOHRVbXdvVklMaEVpOE5HYW42Zld0UTlMVkk1REZ2T21zOVQ4Nkp2QVhFN0Vhc05XZmU5WVF6ek1YZw&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 412, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbnpTeUwwTkI4OXU3XzdfMWl6emlQNzZjSHFWUXxBQ3Jtc0trYUpadG9qTkVqQnpHTWNWcU1zZVBGcGlDRG5hNnZydVNXTVVIZXR3R3l6QlhDUDB3Y0tsU3BpTlRCUU1ZcnlNUU1zRktScmU0V0k3RjZaZXlfZTBEQlphVzBMM25iMURILXVNM2EzU2dHZ3M2cC1HVQ&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbnpTeUwwTkI4OXU3XzdfMWl6emlQNzZjSHFWUXxBQ3Jtc0trYUpadG9qTkVqQnpHTWNWcU1zZVBGcGlDRG5hNnZydVNXTVVIZXR3R3l6QlhDUDB3Y0tsU3BpTlRCUU1ZcnlNUU1zRktScmU0V0k3RjZaZXlfZTBEQlphVzBMM25iMURILXVNM2EzU2dHZ3M2cC1HVQ&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 433, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWFLQUdRbm9vMGdRdE5GRF9rbHJ3YlhTTUt3Z3xBQ3Jtc0ttTjE5NjRXYjRyRElrb09STWg2MnFOTE1CclBKSFhjQmRMWEZ1YXJGY0xyeVNhRld5U3lCczVLbWNsOFdLMEpVWTZVb2YtTkRYNC1SRHdwYmlBOEdxcE5UVTZwLUo0Z0xrdjVrZVdEWnMwTlFITXAzaw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbWFLQUdRbm9vMGdRdE5GRF9rbHJ3YlhTTUt3Z3xBQ3Jtc0ttTjE5NjRXYjRyRElrb09STWg2MnFOTE1CclBKSFhjQmRMWEZ1YXJGY0xyeVNhRld5U3lCczVLbWNsOFdLMEpVWTZVb2YtTkRYNC1SRHdwYmlBOEdxcE5UVTZwLUo0Z0xrdjVrZVdEWnMwTlFITXAzaw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 454, + "length": 23, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfdIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbnNmdmlhUUQ3NTRzU2x5NWVvbEFIMDR5M2hXUXxBQ3Jtc0tsRlFCM3lVeGVrZ2taYTc4c0xTc0RSR2gwcXJQWC1vbGlQMDNmSkNfY2ZYZmtDNjRMUTN3Y0g1RU5jZGlUWTU1RjJnYUREU2lvNzhoUjFMNGpic2s0c2F4amJuenJPQWdwVFFUVklleWN5Q0VWQ0QtZw&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbnNmdmlhUUQ3NTRzU2x5NWVvbEFIMDR5M2hXUXxBQ3Jtc0tsRlFCM3lVeGVrZ2taYTc4c0xTc0RSR2gwcXJQWC1vbGlQMDNmSkNfY2ZYZmtDNjRMUTN3Y0g1RU5jZGlUWTU1RjJnYUREU2lvNzhoUjFMNGpic2s0c2F4amJuenJPQWdwVFFUVklleWN5Q0VWQ0QtZw&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 479, + "length": 6, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CG0Q3NcEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/aespa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgVhZXNwYRgB" + } + } + }, + "loggingDirectives": { + "trackingParams": "CG0Q3NcEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 486, + "length": 5, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CGwQ3NcEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%C3%A6spa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgXDpnNwYRgB" + } + } + }, + "loggingDirectives": { + "trackingParams": "CGwQ3NcEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 492, + "length": 11, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CGsQ3NcEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/blackmamba", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUOCgpibGFja21hbWJhGAE%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CGsQ3NcEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 504, + "length": 5, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CGoQ3NcEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%EB%B8%94%EB%9E%99%EB%A7%98%EB%B0%94", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUQCgzruJTrnpnrp5jrsJQYAQ%3D%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CGoQ3NcEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 510, + "length": 4, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CGkQ3NcEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%EC%97%90%EC%8A%A4%ED%8C%8C", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUNCgnsl5DsiqTtjIwYAQ%3D%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CGkQ3NcEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "enableDisplayloggerExperiment": true + } + } + ], + "styleRuns": [ + { + "startIndex": 0, + "length": 58, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 58, + "length": 36, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 94, + "length": 19, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 113, + "length": 46, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 159, + "length": 54, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 213, + "length": 40, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 253, + "length": 47, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 300, + "length": 40, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 340, + "length": 17, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 357, + "length": 12, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 369, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 370, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 390, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 391, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 411, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 412, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 432, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 433, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 453, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 454, + "length": 23, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 477, + "length": 2, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 479, + "length": 6, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 485, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 486, + "length": 5, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + }, + { + "startIndex": 491, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 492, + "length": 11, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 503, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 504, + "length": 5, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 509, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + } + }, + { + "startIndex": 510, + "length": 4, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + } + }, + { + "startIndex": 514, + "length": 46, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + } + ], + "attachmentRuns": [ + { + "startIndex": 115, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/yt_favicon.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 10, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 359, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/yt_favicon.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 10, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 371, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/instagram_1x.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 392, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/tiktok_1x.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 413, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/twitter_1x_v2.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + }, + { + "startIndex": 434, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "url": "https://www.gstatic.com/youtube/img/watch/social_media/facebook_1x.png" + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "padding": { + "top": { + "value": 0.5, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + } + ], + "decorationRuns": [ + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 113, + "length": 46, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 357, + "length": 12, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 370, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 391, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 412, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + }, + { + "textDecorator": { + "highlightTextDecorator": { + "startIndex": 433, + "length": 20, + "backgroundCornerRadius": 8, + "bottomPadding": 1, + "highlightTextDecoratorExtensions": { + "highlightTextDecoratorColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 218103808 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 452984831 + } + ] + } + } + } + } + } + ] + } + } + }, + { + "horizontalCardListRenderer": { + "cards": [ + { + "videoAttributeViewModel": { + "image": { + "sources": [ + { + "url": "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw" + } + ] + }, + "imageStyle": "VIDEO_ATTRIBUTE_IMAGE_STYLE_SQUARE", + "title": "Black Mamba", + "subtitle": "aespa", + "secondarySubtitle": { + "content": "" + }, + "orientation": "VIDEO_ATTRIBUTE_ORIENTATION_HORIZONTAL", + "sizingRule": "VIDEO_ATTRIBUTE_SIZING_RULE_RESPONSIVE", + "overflowMenuOnTap": { + "innertubeCommand": { + "clickTrackingParams": "CGYQyMoHGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "confirmDialogEndpoint": { + "content": { + "confirmDialogRenderer": { + "title": { + "runs": [ + { + "text": "Song credits" + } + ] + }, + "trackingParams": "CGcQxjgiEwj_uKOclamCAxW34kkHHbMODfc=", + "dialogMessages": [ + { + "runs": [ + { + "text": "Song", + "bold": true + }, + { + "text": ": ", + "bold": true + }, + { + "text": "Black Mamba" + }, + { + "text": "\n\n" + }, + { + "text": "Artist", + "bold": true + }, + { + "text": ": ", + "bold": true + }, + { + "text": "aespa, 에스파" + }, + { + "text": "\n\n" + } + ] + } + ], + "confirmButton": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "OK" + } + ] + }, + "trackingParams": "CGgQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "accessibilityData": { + "label": "OK" + } + } + } + }, + "primaryIsCancel": false + } + } + } + } + }, + "overflowMenuA11yLabel": "More actions", + "loggingDirectives": { + "trackingParams": "CGYQyMoHGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + } + ], + "trackingParams": "CGMQkVoYAiITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "header": { + "richListHeaderRenderer": { + "title": { + "simpleText": "Music" + }, + "subtitle": { + "simpleText": "1 songs" + }, + "trackingParams": "CGUQraoBIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "style": { + "type": "HORIZONTAL_CARD_LIST_STYLE_TYPE_ENGAGEMENT_PANEL_SECTION" + }, + "footerButton": { + "buttonViewModel": { + "iconName": "YOUTUBE_MUSIC_MONOCHROME", + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CGQQycoHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UC-9-kyTW8ZkZNDHQJ6FgpwQ" + } + } + }, + "style": "BUTTON_VIEW_MODEL_STYLE_MONO", + "trackingParams": "CGQQycoHIhMI_7ijnJWpggMVt-JJBx2zDg33", + "type": "BUTTON_VIEW_MODEL_TYPE_OUTLINE", + "buttonSize": "BUTTON_VIEW_MODEL_SIZE_DEFAULT", + "titleFormatted": { + "content": "Music" + } + } + } + } + }, + { + "reelShelfRenderer": { + "title": { + "runs": [ + { + "text": "Shorts remixing this video" + } + ] + }, + "items": [ + { + "reelItemRenderer": { + "videoId": "UJVQxnREX-I", + "headline": { + "simpleText": "Kpop idols that were given national titles in Korea" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/UJVQxnREX-I/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLADwRIvbtHUeseJC0UvSHSRK9H2Xw", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.1 million views" + } + }, + "simpleText": "4.1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGEQh_YEGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/UJVQxnREX-I", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "UJVQxnREX-I", + "playerParams": "8AEByANFuAQfogYVAdXZ-js58rtZeah_joWWUeyQVIc9", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/UJVQxnREX-I/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CGIQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAAYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGEQh_YEGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "UJVQxnREX-I" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CGEQh_YEGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CGEQh_YEGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CGEQh_YEGAAiEwj_uKOclamCAxW34kkHHbMODfdA4r-RoueY1MpQ", + "accessibility": { + "accessibilityData": { + "label": "Kpop idols that were given national titles in Korea - 56 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CGEQh_YEGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "FofI2XXv4vo", + "headline": { + "simpleText": "괴물신인 에스파 닝닝이의 미처버린 라이브" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/FofI2XXv4vo/oar2.jpg", + "width": 576, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.2 million views" + } + }, + "simpleText": "3.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF8Qh_YEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/FofI2XXv4vo", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "FofI2XXv4vo", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtgQsha8o28jowhFPnw9awB", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/FofI2XXv4vo/frame0.jpg", + "width": 576, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CGAQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAEYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF8Qh_YEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "FofI2XXv4vo" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CF8Qh_YEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CF8Qh_YEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CF8Qh_YEGAEiEwj_uKOclamCAxW34kkHHbMODfdA-sW_r5eb8sMW", + "accessibility": { + "accessibilityData": { + "label": "괴물신인 에스파 닝닝이의 미처버린 라이브 - 15 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CF8Qh_YEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "K_cvtV1qMIs", + "headline": { + "simpleText": "난 카리나 같은 몸매가 정말 좋아 진짜 예쁘다" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/K_cvtV1qMIs/oar2.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.6 million views" + } + }, + "simpleText": "2.6M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF0Qh_YEGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/K_cvtV1qMIs", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "K_cvtV1qMIs", + "playerParams": "8AEByANFuAQfogYVAdXZ-juYaFHVJWDZLkRuzVqxz1tx", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/K_cvtV1qMIs/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CF4QsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAIYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF0Qh_YEGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "K_cvtV1qMIs" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CF0Qh_YEGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CF0Qh_YEGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CF0Qh_YEGAIiEwj_uKOclamCAxW34kkHHbMODfdAi-Go69X2y_sr", + "accessibility": { + "accessibilityData": { + "label": "난 카리나 같은 몸매가 정말 좋아 진짜 예쁘다 - 12 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CF0Qh_YEGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "ZeKboY4cLIg", + "headline": { + "simpleText": "난 카리나 같은 몸매가 정말 좋아 진짜 예쁘다" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ZeKboY4cLIg/hq720_2.jpg?sqp=-oaymwEdCJYDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCIii5ph3xHtrEwXEUquhwj0sr4OA", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.5 million views" + } + }, + "simpleText": "1.5M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFsQh_YEGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/ZeKboY4cLIg", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "ZeKboY4cLIg", + "playerParams": "8AEByANFuAQfogYVAdXZ-jum2oxdDqHgWRbjNvfmxHrD", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ZeKboY4cLIg/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFwQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAMYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFsQh_YEGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "ZeKboY4cLIg" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFsQh_YEGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFsQh_YEGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFsQh_YEGAMiEwj_uKOclamCAxW34kkHHbMODfdAiNnw8Jj0pvFl", + "accessibility": { + "accessibilityData": { + "label": "난 카리나 같은 몸매가 정말 좋아 진짜 예쁘다 - 24 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFsQh_YEGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "RYJL3PvvLbM", + "headline": { + "simpleText": "에스파의 리더 카리나" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/RYJL3PvvLbM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDGtNXOBTDnhdpD9tkiGViP2V_2Vg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.2 million views" + } + }, + "simpleText": "1.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFkQh_YEGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/RYJL3PvvLbM", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "RYJL3PvvLbM", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsEwZpElpLjIXSqLRuWWBcX", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/RYJL3PvvLbM/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFoQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAQYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFkQh_YEGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "RYJL3PvvLbM" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFkQh_YEGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFkQh_YEGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFkQh_YEGAQiEwj_uKOclamCAxW34kkHHbMODfdAs9u838_7ksFF", + "accessibility": { + "accessibilityData": { + "label": "에스파의 리더 카리나 - 9 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFkQh_YEGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "3p_T0Yw3XfY", + "headline": { + "simpleText": "카리나 커버 메이크업" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/3p_T0Yw3XfY/hq720_2.jpg?sqp=-oaymwEdCJYDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLDQkmfLclgNYgen3MvM-jyC0MOV-Q", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.2 million views" + } + }, + "simpleText": "1.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFcQh_YEGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/3p_T0Yw3XfY", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "3p_T0Yw3XfY", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsfTERi4Ig8DiLcgotCPIfO", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/3p_T0Yw3XfY/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFgQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAUYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFcQh_YEGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "3p_T0Yw3XfY" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFcQh_YEGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFcQh_YEGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFcQh_YEGAUiEwj_uKOclamCAxW34kkHHbMODfdA9rvd4Zj69M_eAQ==", + "accessibility": { + "accessibilityData": { + "label": "카리나 커버 메이크업 - 16 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFcQh_YEGAUiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "_pmI1sEkymA", + "headline": { + "simpleText": "Aespa’s NINGNING HIGH NOTE AT COACHELLA! #coachella #aespa" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_pmI1sEkymA/oar2.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1 million views" + } + }, + "simpleText": "1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFUQh_YEGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/_pmI1sEkymA", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "_pmI1sEkymA", + "playerParams": "8AEByANFuAQfogYVAdXZ-jurbM8IpxjDprtG1sT9y9Bg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_pmI1sEkymA/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFYQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAYYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFUQh_YEGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "_pmI1sEkymA" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFUQh_YEGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFUQh_YEGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFUQh_YEGAYiEwj_uKOclamCAxW34kkHHbMODfdA4JSTieya4sz-AQ==", + "accessibility": { + "accessibilityData": { + "label": "Aespa’s NINGNING HIGH NOTE AT COACHELLA! #coachella #aespa - 17 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFUQh_YEGAYiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "t0u2BekMVTQ", + "headline": { + "simpleText": "에스파(aespa) - 블랙맘바(Black Mamba) 커버댄스cover dance / Chorus ver. #Shorts" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/t0u2BekMVTQ/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBkOTfYge-KT4Oaxm2PZ5M31LK1TQ", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "769K views" + } + }, + "simpleText": "769K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFMQh_YEGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/t0u2BekMVTQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "t0u2BekMVTQ", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvurcejcPRgEd61_HgWhEPn", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/t0u2BekMVTQ/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFQQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAcYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFMQh_YEGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "t0u2BekMVTQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFMQh_YEGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFMQh_YEGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFMQh_YEGAciEwj_uKOclamCAxW34kkHHbMODfdAtKqxyN7A7aW3AQ==", + "accessibility": { + "accessibilityData": { + "label": "에스파(aespa) - 블랙맘바(Black Mamba) 커버댄스cover dance / Chorus ver. #Shorts - 33 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFMQh_YEGAciEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "2oyU1F0L7RM", + "headline": { + "simpleText": "에스파 ‘윈터’를 그려보았다" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/2oyU1F0L7RM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAFS_1kp4j2MIM8KUIi9vBsKoqDUw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "717K views" + } + }, + "simpleText": "717K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFEQh_YEGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/2oyU1F0L7RM", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "2oyU1F0L7RM", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvYpeP5HCU43mRDm_5iPRzz", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/2oyU1F0L7RM/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFIQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAgYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFEQh_YEGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "2oyU1F0L7RM" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFEQh_YEGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFEQh_YEGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFEQh_YEGAgiEwj_uKOclamCAxW34kkHHbMODfdAk9qv6MWapcbaAQ==", + "accessibility": { + "accessibilityData": { + "label": "에스파 ‘윈터’를 그려보았다 - 47 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFEQh_YEGAgiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "-RSqM8Gv2cQ", + "headline": { + "simpleText": "🇮🇳 AESPA BLACK MAMBA DANCE COVER (CHORUS+DANCEBREAK) by moonkovers | Kpop in India" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/-RSqM8Gv2cQ/hq720_2.jpg?sqp=-oaymwEdCOADEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLC5Z0jrQ-LCS0JlDLI14Q4qkuRbxw", + "width": 480, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "685K views" + } + }, + "simpleText": "685K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE8Qh_YEGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/-RSqM8Gv2cQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "-RSqM8Gv2cQ", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsbDKlGoCjZ34Ldue1SYdDR", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/-RSqM8Gv2cQ/frame0.jpg", + "width": 480, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFAQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAkYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE8Qh_YEGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "-RSqM8Gv2cQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CE8Qh_YEGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CE8Qh_YEGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CE8Qh_YEGAkiEwj_uKOclamCAxW34kkHHbMODfdAxLO_jbzGqor5AQ==", + "accessibility": { + "accessibilityData": { + "label": "🇮🇳 AESPA BLACK MAMBA DANCE COVER (CHORUS+DANCEBREAK) by moonkovers | Kpop in India - 48 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CE8Qh_YEGAkiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "u9lU7miKf9g", + "headline": { + "simpleText": "[𝒌𝒂𝒓𝒊𝒏𝒂] 블랙맘바 고유명사 유지민" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/u9lU7miKf9g/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBnMKazOuMjKZN-3JXmN36F1WZ9YQ", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "658K views" + } + }, + "simpleText": "658K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE0Qh_YEGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/u9lU7miKf9g", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "u9lU7miKf9g", + "playerParams": "8AEByANFuAQfogYVAdXZ-juB9GIqIpaVD_EvaCDHJwOY", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/u9lU7miKf9g/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CE4QsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAoYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE0Qh_YEGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "u9lU7miKf9g" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CE0Qh_YEGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CE0Qh_YEGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CE0Qh_YEGAoiEwj_uKOclamCAxW34kkHHbMODfdA2P-pxOad1ey7AQ==", + "accessibility": { + "accessibilityData": { + "label": "[𝒌𝒂𝒓𝒊𝒏𝒂] 블랙맘바 고유명사 유지민 - 59 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CE0Qh_YEGAoiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "1lSTF-cufzA", + "headline": { + "simpleText": "블랙맘바 ae-블랙맘바 버전" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1lSTF-cufzA/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBYzyjgtTjoTCjYNYtxZMBEItaBzA", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "620K views" + } + }, + "simpleText": "620K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEsQh_YEGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/1lSTF-cufzA", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "1lSTF-cufzA", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvr0cDnBwwY6quX41Sk9233", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1lSTF-cufzA/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEwQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAsYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEsQh_YEGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "1lSTF-cufzA" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEsQh_YEGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEsQh_YEGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEsQh_YEGAsiEwj_uKOclamCAxW34kkHHbMODfdAsP65uf7ipKrWAQ==", + "accessibility": { + "accessibilityData": { + "label": "블랙맘바 ae-블랙맘바 버전 - 27 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEsQh_YEGAsiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "ThKBAVEoERk", + "headline": { + "simpleText": "에스파 카리나 블랙맘바 교차편집 🔮" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ThKBAVEoERk/oar2.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "613K views" + } + }, + "simpleText": "613K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEkQh_YEGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/ThKBAVEoERk", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "ThKBAVEoERk", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtpbLJa57R-CethnVoKHb1U", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ThKBAVEoERk/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEoQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEAwYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEkQh_YEGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "ThKBAVEoERk" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEkQh_YEGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEkQh_YEGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEkQh_YEGAwiEwj_uKOclamCAxW34kkHHbMODfdAmaKgiZWgoIlO", + "accessibility": { + "accessibilityData": { + "label": "에스파 카리나 블랙맘바 교차편집 🔮 - 30 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEkQh_YEGAwiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "5TucFtl5dXU", + "headline": { + "simpleText": "aespa 에스파 - ‘black mamba’ (dance break) dance cover | karina balcerzak" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/5TucFtl5dXU/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBZSXa--SbzgzZbA1IQTSGIcx1kPg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "601K views" + } + }, + "simpleText": "601K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEcQh_YEGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/5TucFtl5dXU", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "5TucFtl5dXU", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsYz-v1OvXRCkZoNd7m_XwE", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/5TucFtl5dXU/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEgQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEA0YH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEcQh_YEGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "5TucFtl5dXU" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEcQh_YEGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEcQh_YEGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEcQh_YEGA0iEwj_uKOclamCAxW34kkHHbMODfdA9erly-2C553lAQ==", + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 - ‘black mamba’ (dance break) dance cover | karina balcerzak - 40 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEcQh_YEGA0iEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "8VfdP2CiF1Y", + "headline": { + "simpleText": "Rating Giselle's Black Mamba outfits" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8VfdP2CiF1Y/hq720_2.jpg?sqp=-oaymwEdCJYDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCDfBzdIMxqmstvRYkRgUJeriAVBQ", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "559K views" + } + }, + "simpleText": "559K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEUQh_YEGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/8VfdP2CiF1Y", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "8VfdP2CiF1Y", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsQHR-bDzhd_95WEdHVG5Ef", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8VfdP2CiF1Y/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEYQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEA4YH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEUQh_YEGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "8VfdP2CiF1Y" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEUQh_YEGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEUQh_YEGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEUQh_YEGA4iEwj_uKOclamCAxW34kkHHbMODfdA1q6Ihfan96vxAQ==", + "accessibility": { + "accessibilityData": { + "label": "Rating Giselle's Black Mamba outfits - 46 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEUQh_YEGA4iEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "0JqXcan0Feg", + "headline": { + "simpleText": "윈터 혼자 부르는 블랙맘바" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0JqXcan0Feg/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCj9UW--ixnf19t-3K8_3pHB-b1Yg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "519K views" + } + }, + "simpleText": "519K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEMQh_YEGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/0JqXcan0Feg", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "0JqXcan0Feg", + "playerParams": "8AEByANFuAQfogYVAdXZ-js-_-h1lfAPe8plSe9DPx_b", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0JqXcan0Feg/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEQQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEA8YH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEMQh_YEGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "0JqXcan0Feg" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEMQh_YEGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEMQh_YEGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEMQh_YEGA8iEwj_uKOclamCAxW34kkHHbMODfdA6KvQz5rupc3QAQ==", + "accessibility": { + "accessibilityData": { + "label": "윈터 혼자 부르는 블랙맘바 - 57 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEMQh_YEGA8iEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "iy6eFJExFac", + "headline": { + "simpleText": "aespa 에스파 'Black Mamba' Short Dance Cover in Public | @catherine_yao" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/iy6eFJExFac/hq720_2.jpg?sqp=-oaymwEdCNAFENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBGJFQblOHVAOz43ZHFKFQEuuH_4Q", + "width": 720, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "473K views" + } + }, + "simpleText": "473K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEEQh_YEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/iy6eFJExFac", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "iy6eFJExFac", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtV36SIDK5H4FPPOaH2N1af", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/iy6eFJExFac/frame0.jpg", + "width": 720, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEIQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBAYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEEQh_YEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "iy6eFJExFac" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEEQh_YEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEEQh_YEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEEQh_YEGBAiEwj_uKOclamCAxW34kkHHbMODfdAp6vEicnCp5eLAQ==", + "accessibility": { + "accessibilityData": { + "label": "aespa 에스파 'Black Mamba' Short Dance Cover in Public | @catherine_yao - 55 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEEQh_YEGBAiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "iv0meoM8k4A", + "headline": { + "simpleText": "✨똥손이라면? 꼭 보고 저장 ! (한국인이 좋아하는 속도) Easy quick eye makeup #shorts" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/iv0meoM8k4A/hq720_2.jpg?sqp=-oaymwEdCJQDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLC15Ry2c56JYpmuJUBkOGG_xhsLIA", + "width": 404, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "454K views" + } + }, + "simpleText": "454K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD8Qh_YEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/iv0meoM8k4A", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "iv0meoM8k4A", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvYOnyXXjgqHcS0h0KZHFwc", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/iv0meoM8k4A/frame0.jpg", + "width": 576, + "height": 1026 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEAQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBEYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD8Qh_YEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "iv0meoM8k4A" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CD8Qh_YEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CD8Qh_YEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CD8Qh_YEGBEiEwj_uKOclamCAxW34kkHHbMODfdAgKfymajPyf6KAQ==", + "accessibility": { + "accessibilityData": { + "label": "✨똥손이라면? 꼭 보고 저장 ! (한국인이 좋아하는 속도) Easy quick eye makeup #shorts - 15 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CD8Qh_YEGBEiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "PXvVeEwbEQc", + "headline": { + "simpleText": "[에스파 닝닝] 스타일링 찰떡닝닝" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/PXvVeEwbEQc/hq720_2.jpg?sqp=-oaymwEdCJYDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLC4hzvYXoRV0nWv2qM2A_RDYijhDg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "417K views" + } + }, + "simpleText": "417K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD0Qh_YEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/PXvVeEwbEQc", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "PXvVeEwbEQc", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvWucJCQ9gUl6BP69Z2pf1d", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/PXvVeEwbEQc/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CD4QsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBIYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD0Qh_YEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "PXvVeEwbEQc" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CD0Qh_YEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CD0Qh_YEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CD0Qh_YEGBIiEwj_uKOclamCAxW34kkHHbMODfdAh6Ls4ISv9b09", + "accessibility": { + "accessibilityData": { + "label": "[에스파 닝닝] 스타일링 찰떡닝닝 - 11 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CD0Qh_YEGBIiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "nBVrH_1aMFY", + "headline": { + "simpleText": "에스파 카리나 무릎에 앉아" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/nBVrH_1aMFY/hq720.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCa9ymSrHfDZ2MtaFxjwNYKZHaq4A", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "375K views" + } + }, + "simpleText": "375K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDsQh_YEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/nBVrH_1aMFY", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "nBVrH_1aMFY", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsjgBQPW9wDOCJSSWSdnoEV", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/nBVrH_1aMFY/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDwQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBMYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDsQh_YEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "nBVrH_1aMFY" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDsQh_YEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDsQh_YEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDsQh_YEGBMiEwj_uKOclamCAxW34kkHHbMODfdA1uDo6v_j2oqcAQ==", + "accessibility": { + "accessibilityData": { + "label": "에스파 카리나 무릎에 앉아 - 4 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDsQh_YEGBMiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "o-l7NsPxt_E", + "headline": { + "simpleText": "Rating Winter's Black Mamba outfits" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/o-l7NsPxt_E/hq720_2.jpg?sqp=-oaymwEdCJYDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLDt6V97Q1GONh6nBCnl40O83bdmzA", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "326K views" + } + }, + "simpleText": "326K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDkQh_YEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/o-l7NsPxt_E", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "o-l7NsPxt_E", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtBwMbRdH6EN7Ir9Qv3-oQ4", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/o-l7NsPxt_E/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDoQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBQYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDkQh_YEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "o-l7NsPxt_E" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDkQh_YEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDkQh_YEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDkQh_YEGBQiEwj_uKOclamCAxW34kkHHbMODfdA8e_Gn-zm3vSjAQ==", + "accessibility": { + "accessibilityData": { + "label": "Rating Winter's Black Mamba outfits - 53 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDkQh_YEGBQiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "dA74x7H4H14", + "headline": { + "simpleText": "AESPA Tiktok Black Mamba Challenge 🔥 #shorts #aespa #kpop #dance" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/dA74x7H4H14/hq720_2.jpg?sqp=-oaymwEdCI4CEOADSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLD0gb8Mfe_OkhwdERpfi34PtBDfsQ", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "312K views" + } + }, + "simpleText": "312K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDcQh_YEGBUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/dA74x7H4H14", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "dA74x7H4H14", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtse9poY8J6QlXm69pVJ33y", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/dA74x7H4H14/frame0.jpg", + "width": 270, + "height": 480 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDgQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBUYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDcQh_YEGBUiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "dA74x7H4H14" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDcQh_YEGBUiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDcQh_YEGBUiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDcQh_YEGBUiEwj_uKOclamCAxW34kkHHbMODfdA3r7gj_uYvod0", + "accessibility": { + "accessibilityData": { + "label": "AESPA Tiktok Black Mamba Challenge 🔥 #shorts #aespa #kpop #dance - 13 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDcQh_YEGBUiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "G5qAQIHNXi0", + "headline": { + "simpleText": "за что хейтят участников стрей кидс./нужна 2 часть?. #itzy #айдолы #bts #blackpink #straykids" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/G5qAQIHNXi0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAkRKfWTjdQBVPcb1uq_a4wz4zm7g", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "312K views" + } + }, + "simpleText": "312K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDUQh_YEGBYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/G5qAQIHNXi0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "G5qAQIHNXi0", + "playerParams": "8AEByANFuAQfogYVAdXZ-juV9tlkg0aLL3loarJsZrse", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/G5qAQIHNXi0/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDYQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBYYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDUQh_YEGBYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "G5qAQIHNXi0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDUQh_YEGBYiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDUQh_YEGBYiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDUQh_YEGBYiEwj_uKOclamCAxW34kkHHbMODfdArby1joiIoM0b", + "accessibility": { + "accessibilityData": { + "label": "за что хейтят участников стрей кидс./нужна 2 часть?. #itzy #айдолы #bts #blackpink #straykids - 30 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDUQh_YEGBYiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "1AOuAqryNq8", + "headline": { + "simpleText": "Black Mamba × WINTER🖤" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1AOuAqryNq8/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAhBkglEyqqxKA6RwwfpSbH7i-JiA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "304K views" + } + }, + "simpleText": "304K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDMQh_YEGBciEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/1AOuAqryNq8", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "1AOuAqryNq8", + "playerParams": "8AEByANFuAQfogYVAdXZ-jsrTe8x-quvOfKFZcMURSZR", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1AOuAqryNq8/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDQQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBcYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDMQh_YEGBciEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "1AOuAqryNq8" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDMQh_YEGBciEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDMQh_YEGBciEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDMQh_YEGBciEwj_uKOclamCAxW34kkHHbMODfdAr-3I16rA64HUAQ==", + "accessibility": { + "accessibilityData": { + "label": "Black Mamba × WINTER🖤 - 16 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDMQh_YEGBciEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "j_Y-k2MkyVw", + "headline": { + "simpleText": "라이브로 미국 찢고 온 에스파🎵" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/j_Y-k2MkyVw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC7xb7RXp-CCBk7Qu_-OU6quQUAXw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "299K views" + } + }, + "simpleText": "299K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDEQh_YEGBgiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/j_Y-k2MkyVw", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "j_Y-k2MkyVw", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtn5nUij-YHDh1PD4qfhm9B", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/j_Y-k2MkyVw/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDIQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBgYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDEQh_YEGBgiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "j_Y-k2MkyVw" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDEQh_YEGBgiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDEQh_YEGBgiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDEQh_YEGBgiEwj_uKOclamCAxW34kkHHbMODfdA3JKTmbbSj_uPAQ==", + "accessibility": { + "accessibilityData": { + "label": "라이브로 미국 찢고 온 에스파🎵 - 59 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDEQh_YEGBgiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "8NxklN1iStQ", + "headline": { + "simpleText": "どのメイクが好きかコメントで教えてね🫶段々メイクが薄くなるカリナ❣️#カリナ #aespa #karina #メイク #shorts" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8NxklN1iStQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBlriggE-fJLXPh4539nHimTQVohQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "286K views" + } + }, + "simpleText": "286K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CC8Qh_YEGBkiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/8NxklN1iStQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "8NxklN1iStQ", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvgp3AhPbz_lY6rAY8flGAE", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8NxklN1iStQ/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDAQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBkYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CC8Qh_YEGBkiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "8NxklN1iStQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CC8Qh_YEGBkiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CC8Qh_YEGBkiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CC8Qh_YEGBkiEwj_uKOclamCAxW34kkHHbMODfdA1JWJ682Sme7wAQ==", + "accessibility": { + "accessibilityData": { + "label": "どのメイクが好きかコメントで教えてね🫶段々メイクが薄くなるカリナ❣️#カリナ #aespa #karina #メイク #shorts - 16 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CC8Qh_YEGBkiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "kjFlfQ4TMGQ", + "headline": { + "simpleText": "230812 대전 0시축제 - Black Mamba | 아이키 직캠 AIKI FOCUS" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kjFlfQ4TMGQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDTPYtGTkEYNeQGiI9zLLt6nN3D3A", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "277K views" + } + }, + "simpleText": "277K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CC0Qh_YEGBoiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/kjFlfQ4TMGQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "kjFlfQ4TMGQ", + "playerParams": "8AEByANFuAQfogYVAdXZ-juurZT2m2a3eqMMzl_lZKo1", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kjFlfQ4TMGQ/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CC4QsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBoYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CC0Qh_YEGBoiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "kjFlfQ4TMGQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CC0Qh_YEGBoiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CC0Qh_YEGBoiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CC0Qh_YEGBoiEwj_uKOclamCAxW34kkHHbMODfdA5ODM8NCv2ZiSAQ==", + "accessibility": { + "accessibilityData": { + "label": "230812 대전 0시축제 - Black Mamba | 아이키 직캠 AIKI FOCUS - 27 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CC0Qh_YEGBoiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "mavx0N_gMH0", + "headline": { + "simpleText": "Aespa-Black Mamba 🖤🐍 #Aespa #BlackMamba #kpop #shorts" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/mavx0N_gMH0/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLCF81OiNuzKrbt8RAb5T742Stjc2w", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "272K views" + } + }, + "simpleText": "272K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCsQh_YEGBsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/mavx0N_gMH0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "mavx0N_gMH0", + "playerParams": "8AEByANFuAQfogYVAdXZ-jvEijqU7rB9IakF0BVCS_eQ", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/mavx0N_gMH0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CCwQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBsYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCsQh_YEGBsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "mavx0N_gMH0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CCsQh_YEGBsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CCsQh_YEGBsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CCsQh_YEGBsiEwj_uKOclamCAxW34kkHHbMODfdA_eCA_426_NWZAQ==", + "accessibility": { + "accessibilityData": { + "label": "Aespa-Black Mamba 🖤🐍 #Aespa #BlackMamba #kpop #shorts - 33 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CCsQh_YEGBsiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "Zvx_aTwPZrU", + "headline": { + "simpleText": "결국 꽃이 된 카리나" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Zvx_aTwPZrU/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD4Hc0R1ts54mn-L51Gvhy1Kq1dnA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "257K views" + } + }, + "simpleText": "257K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCkQh_YEGBwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/Zvx_aTwPZrU", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "Zvx_aTwPZrU", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtByK8D4W5kqLisJdT9p7f0", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Zvx_aTwPZrU/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CCoQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEBwYH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCkQh_YEGBwiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "Zvx_aTwPZrU" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CCkQh_YEGBwiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CCkQh_YEGBwiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CCkQh_YEGBwiEwj_uKOclamCAxW34kkHHbMODfdAtc294JPtn_5m", + "accessibility": { + "accessibilityData": { + "label": "결국 꽃이 된 카리나 - 17 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CCkQh_YEGBwiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "reelItemRenderer": { + "videoId": "qxHom1GM45I", + "headline": { + "simpleText": "When you wanna try a Kpop dance. (It couldn’t be that hard?) 🤔😬🫣 #kpop #short #aespa #blackmamba" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/qxHom1GM45I/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC6sTNUXlnEdFi8taGDLfyFuxBFbg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "252K views" + } + }, + "simpleText": "252K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCcQh_YEGB0iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/qxHom1GM45I", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "qxHom1GM45I", + "playerParams": "8AEByANFuAQfogYVAdXZ-jtdas26OsDV2v85FInaxrUv", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/qxHom1GM45I/frame0.jpg", + "width": 406, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CCgQsLUEIhMI_7ijnJWpggMVt-JJBx2zDg33", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CB8wAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "KsYDCg0KC1VKVlF4blJFWC1JCg0KC0ZvZkkyWFh2NHZvCg0KC0tfY3Z0VjFxTUlzCg0KC1plS2JvWTRjTElnCg0KC1JZSkwzUHZ2TGJNCg0KCzNwX1QwWXczWGZZCg0KC19wbUkxc0VreW1BCg0KC3QwdTJCZWtNVlRRCg0KCzJveVUxRjBMN1JNCg0KCy1SU3FNOEd2MmNRCg0KC3U5bFU3bWlLZjlnCg0KCzFsU1RGLWN1ZnpBCg0KC1RoS0JBVkVvRVJrCg0KCzVUdWNGdGw1ZFhVCg0KCzhWZmRQMkNpRjFZCg0KCzBKcVhjYW4wRmVnCg0KC2l5NmVGSkV4RmFjCg0KC2l2MG1lb004azRBCg0KC1BYdlZlRXdiRVFjCg0KC25CVnJIXzFhTUZZCg0KC28tbDdOc1B4dF9FCg0KC2RBNzR4N0g0SDE0Cg0KC0c1cUFRSUhOWGkwCg0KCzFBT3VBcXJ5TnE4Cg0KC2pfWS1rMk1reVZ3Cg0KCzhOeGtsTjFpU3RRCg0KC2tqRmxmUTRUTUdRCg0KC21hdngwTl9nTUgwCg0KC1p2eF9hVHdQWnJVCg0KC3F4SG9tMUdNNDVJEB0YH1AZaAGKAREaDwoNCgtCTC1hSXBDTFduVZABBQ%3D%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCcQh_YEGB0iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "qxHom1GM45I" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CCcQh_YEGB0iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CCcQh_YEGB0iEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CCcQh_YEGB0iEwj_uKOclamCAxW34kkHHbMODfdAksezjLWT-oirAQ==", + "accessibility": { + "accessibilityData": { + "label": "When you wanna try a Kpop dance. (It couldn’t be that hard?) 🤔😬🫣 #kpop #short #aespa #blackmamba - 11 seconds - play video" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CCcQh_YEGB0iEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + } + ], + "trackingParams": "CCYQudQIGAMiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + { + "videoDescriptionTranscriptSectionRenderer": { + "sectionTitle": { + "runs": [ + { + "text": "Transcript" + } + ] + }, + "subHeaderText": { + "runs": [ + { + "text": "Follow along using the transcript." + } + ] + }, + "primaryButton": { + "buttonRenderer": { + "style": "STYLE_SUGGESTIVE", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Show transcript" + } + ] + }, + "trackingParams": "CCUQtooIIhMI_7ijnJWpggMVt-JJBx2zDg33", + "command": { + "clickTrackingParams": "CCUQtooIIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandExecutorCommand": { + "commands": [ + { + "clickTrackingParams": "CCUQtooIIhMI_7ijnJWpggMVt-JJBx2zDg33", + "showEngagementPanelEndpoint": { + "panelIdentifier": "engagement-panel-searchable-transcript", + "sourcePanelIdentifier": "video-description-ep-identifier" + } + }, + { + "clickTrackingParams": "CCUQtooIIhMI_7ijnJWpggMVt-JJBx2zDg33", + "scrollToEngagementPanelCommand": { + "targetId": "engagement-panel-searchable-transcript" + } + } + ] + } + } + } + }, + "trackingParams": "CCQQ0YQIGAQiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + { + "videoDescriptionInfocardsSectionRenderer": { + "sectionTitle": { + "simpleText": "SMTOWN" + }, + "creatorVideosButton": { + "buttonRenderer": { + "style": "STYLE_INACTIVE_OUTLINE", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Videos" + }, + "icon": { + "iconType": "MY_VIDEOS" + }, + "trackingParams": "CCMQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "command": { + "clickTrackingParams": "CCMQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCEf_Bc-KVd7onSeifS3py9g/videos", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "params": "EgZ2aWRlb3PyBgkKBzoAogECCAE%3D" + } + } + } + }, + "creatorAboutButton": { + "buttonRenderer": { + "style": "STYLE_INACTIVE_OUTLINE", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "About" + }, + "icon": { + "iconType": "ACCOUNT_BOX" + }, + "trackingParams": "CCIQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "command": { + "clickTrackingParams": "CCIQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/channel/UCEf_Bc-KVd7onSeifS3py9g/about", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "params": "EgVhYm91dPIGCQoHEgCiAQIIAQ%3D%3D" + } + } + } + }, + "infocards": [ + { + "compactInfocardRenderer": { + "content": { + "mediaLockupRenderer": { + "title": { + "simpleText": "Black Mamba - Single" + }, + "subtitle": { + "simpleText": "Listen&download 'Black Mamba'" + }, + "thumbnailDetails": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/an/ZeerrnuLi5E/5326689562927634060_mq.jpg?v=5ff06f6a", + "width": 64, + "height": 64 + }, + { + "url": "https://i.ytimg.com/an/ZeerrnuLi5E/5326689562927634060_mq.jpg?v=5ff06f6a", + "width": 128, + "height": 128 + } + ] + }, + "endpoint": { + "clickTrackingParams": "CCEQ1TYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=infocard&redir_token=QUFFLUhqa18wUVZLdVRVbFpCQWlTRk12b3lnRmZtUmRwUXxBQ3Jtc0tsV2FrTGRKcGRDcVRVSDJ6ZW9WdGc5TkZzSWU1Yk9VSGM3MUFYMTlfakRwaVJhYTVRdWdOVF9qVVFqcExYX0tzTG1fdnFNNmgwQWhYZDlxTGRVX2xHUHRCQ3FqSzZOTnNUWmZldHpPaERVQTZkRnYwWQ&q=https%3A%2F%2Fmusic.apple.com%2Fkr%2Falbum%2Fblack-mamba-single%2F1540251303%3Fuo%3D4%26ls%3D1%26app%3Ditunes%26at%3D1l3v3cP%26ct%3D11mjcm%257Cyoutube.com", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=infocard&redir_token=QUFFLUhqa18wUVZLdVRVbFpCQWlTRk12b3lnRmZtUmRwUXxBQ3Jtc0tsV2FrTGRKcGRDcVRVSDJ6ZW9WdGc5TkZzSWU1Yk9VSGM3MUFYMTlfakRwaVJhYTVRdWdOVF9qVVFqcExYX0tzTG1fdnFNNmgwQWhYZDlxTGRVX2xHUHRCQ3FqSzZOTnNUWmZldHpPaERVQTZkRnYwWQ&q=https%3A%2F%2Fmusic.apple.com%2Fkr%2Falbum%2Fblack-mamba-single%2F1540251303%3Fuo%3D4%26ls%3D1%26app%3Ditunes%26at%3D1l3v3cP%26ct%3D11mjcm%257Cyoutube.com", + "target": "TARGET_NEW_WINDOW" + } + }, + "trackingParams": "CCEQ1TYiEwj_uKOclamCAxW34kkHHbMODfc=", + "enableSubtitleLaunchIcon": true, + "uiTweaks": { + "useZeroPadding": true, + "thumbnailWidth": 112, + "thumbnailHeight": 62.99567 + }, + "maxLinesTitle": 2, + "maxLinesSubtitle": 1, + "disableEndpoint": true + } + }, + "trackingParams": "CCAQuJcBGAAiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + { + "compactInfocardRenderer": { + "content": { + "structuredDescriptionVideoLockupRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/proxy/LiRWQ5v0rimXvb7cuq8m46ZGvPpbNEMYynK9DRUKiTwsn-yq8czpaLiPcVUQSQouuPFCqjcVPkcLW_xV=s112-w112-h64-nd", + "width": 112, + "height": 64 + }, + { + "url": "https://yt3.ggpht.com/proxy/LiRWQ5v0rimXvb7cuq8m46ZGvPpbNEMYynK9DRUKiTwsn-yq8czpaLiPcVUQSQouuPFCqjcVPkcLW_xV=s224-w224-h128-nd", + "width": 224, + "height": 128 + } + ] + }, + "title": { + "simpleText": "aespa 에스파 'Black Mamba' The Debut Stage" + }, + "shortBylineText": { + "simpleText": "by aespa" + }, + "metadataDetails": { + "simpleText": "19M views · 2 years ago" + }, + "navigationEndpoint": { + "clickTrackingParams": "CB8Q1TYiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/watch?v=Ky5RT5oGg0w", + "webPageType": "WEB_PAGE_TYPE_WATCH", + "rootVe": 3832 + } + }, + "watchEndpoint": { + "videoId": "Ky5RT5oGg0w", + "watchEndpointSupportedOnesieConfig": { + "html5PlaybackOnesieConfig": { + "commonConfig": { + "url": "https://rr5---sn-h0jeener.googlevideo.com/initplayback?source=youtube&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&beids=24350018&msp=1&odepv=1&id=2b2e514f9a06834c&ip=2003%3Ade%3Aaf0d%3A500%3Afe41%3A617f%3A1d05%3A4424&initcwndbps=1835000&mt=1699060144&oweuc=" + } + } + } + } + }, + "lengthText": { + "simpleText": "4:47" + }, + "trackingParams": "CB8Q1TYiEwj_uKOclamCAxW34kkHHbMODfc=", + "isLiveVideo": false, + "disableNavigationEndpoint": true, + "maxLinesTitle": 2, + "maxLinesShortBylineText": 1, + "maxLinesMetadataDetails": 1, + "thumbnailWidth": 112, + "aspectRatio": 1.7779, + "thumbnailOverlays": [ + { + "thumbnailOverlayTimeStatusRenderer": { + "text": { + "simpleText": "4:47" + }, + "style": "DEFAULT" + } + } + ] + } + }, + "trackingParams": "CB4QwJcBGAEiEwj_uKOclamCAxW34kkHHbMODfc=" + } + } + ], + "sectionSubtitle": { + "accessibility": { + "accessibilityData": { + "label": "32.1 million subscribers" + } + }, + "simpleText": "32.1M subscribers" + }, + "channelAvatar": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s88-c-k-c0x00ffffff-no-rj" + } + ] + }, + "channelEndpoint": { + "clickTrackingParams": "CB0QwjcYBSITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@SMTOWN", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCEf_Bc-KVd7onSeifS3py9g", + "canonicalBaseUrl": "/@SMTOWN" + } + }, + "trackingParams": "CB0QwjcYBSITCP-4o5yVqYIDFbfiSQcdsw4N9w==" + } + } + ] + } + }, + "veType": 124975, + "targetId": "engagement-panel-structured-description", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN", + "loggingDirectives": { + "trackingParams": "CBwQ040EGAIiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "engagementPanelSectionListRenderer": { + "panelIdentifier": "comment-item-section", + "header": { + "engagementPanelTitleHeaderRenderer": { + "title": { + "runs": [ + { + "text": "Comments" + } + ] + }, + "contextualInfo": { + "runs": [ + { + "text": "703K" + } + ] + }, + "menu": { + "sortFilterSubMenuRenderer": { + "subMenuItems": [ + { + "title": "Top comments", + "selected": true, + "serviceEndpoint": { + "clickTrackingParams": "CBsQ48AHGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/next" + } + }, + "continuationCommand": { + "token": "Eg0SC1plZXJybnVMaTVFGAYyVSIuIgtaZWVycm51TGk1RTAAeAKqAhpVZ3dXUnlhVnI0MmRVd0hnVHBCNEFhQUJBZzABQiFlbmdhZ2VtZW50LXBhbmVsLWNvbW1lbnRzLXNlY3Rpb24%3D", + "request": "CONTINUATION_REQUEST_TYPE_WATCH_NEXT", + "command": { + "clickTrackingParams": "CBsQ48AHGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "showReloadUiCommand": { + "targetId": "engagement-panel-comments-section" + } + } + } + }, + "trackingParams": "CBsQ48AHGAAiEwj_uKOclamCAxW34kkHHbMODfc=" + }, + { + "title": "Newest first", + "selected": false, + "serviceEndpoint": { + "clickTrackingParams": "CBoQ48AHGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/next" + } + }, + "continuationCommand": { + "token": "Eg0SC1plZXJybnVMaTVFGAYyOCIRIgtaZWVycm51TGk1RTABeAIwAUIhZW5nYWdlbWVudC1wYW5lbC1jb21tZW50cy1zZWN0aW9u", + "request": "CONTINUATION_REQUEST_TYPE_WATCH_NEXT", + "command": { + "clickTrackingParams": "CBoQ48AHGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "showReloadUiCommand": { + "targetId": "engagement-panel-comments-section" + } + } + } + }, + "trackingParams": "CBoQ48AHGAEiEwj_uKOclamCAxW34kkHHbMODfc=" + } + ], + "icon": { + "iconType": "SORT" + }, + "accessibility": { + "accessibilityData": { + "label": "Sort comments" + } + }, + "trackingParams": "CBkQgdoEIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "visibilityButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "icon": { + "iconType": "CLOSE" + }, + "trackingParams": "CBgQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "accessibilityData": { + "label": "Close" + } + }, + "command": { + "clickTrackingParams": "CBgQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "changeEngagementPanelVisibilityAction": { + "targetId": "engagement-panel-comments-section", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN" + } + } + } + }, + "trackingParams": "CBUQ040EGAMiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "content": { + "sectionListRenderer": { + "contents": [ + { + "itemSectionRenderer": { + "contents": [ + { + "continuationItemRenderer": { + "trigger": "CONTINUATION_TRIGGER_ON_ITEM_SHOWN", + "continuationEndpoint": { + "clickTrackingParams": "CBcQuy8YACITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/next" + } + }, + "continuationCommand": { + "token": "Eg0SC1plZXJybnVMaTVFGAYyVSIuIgtaZWVycm51TGk1RTAAeAKqAhpVZ3dXUnlhVnI0MmRVd0hnVHBCNEFhQUJBZzABQiFlbmdhZ2VtZW50LXBhbmVsLWNvbW1lbnRzLXNlY3Rpb24%3D", + "request": "CONTINUATION_REQUEST_TYPE_WATCH_NEXT" + } + } + } + } + ], + "trackingParams": "CBcQuy8YACITCP-4o5yVqYIDFbfiSQcdsw4N9w==", + "sectionIdentifier": "comment-item-section", + "targetId": "engagement-panel-comments-section" + } + } + ], + "trackingParams": "CBYQui8iEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "veType": 76278, + "targetId": "engagement-panel-comments-section", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN", + "loggingDirectives": { + "trackingParams": "CBUQ040EGAMiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + { + "engagementPanelSectionListRenderer": { + "panelIdentifier": "engagement-panel-searchable-transcript", + "header": { + "engagementPanelTitleHeaderRenderer": { + "title": { + "runs": [ + { + "text": "Transcript" + } + ] + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Toggle timestamps" + } + ] + }, + "serviceEndpoint": { + "clickTrackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "signalAction": { + "signal": "TOGGLE_TRANSCRIPT_TIMESTAMPS" + } + } + ] + } + }, + "trackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=" + } + } + ], + "trackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "visibilityButton": { + "buttonRenderer": { + "icon": { + "iconType": "CLOSE" + }, + "accessibility": { + "label": "Close transcript" + }, + "trackingParams": "CBQQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "accessibilityData": { + "label": "Close transcript" + } + }, + "command": { + "clickTrackingParams": "CBQQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "changeEngagementPanelVisibilityAction": { + "targetId": "engagement-panel-searchable-transcript", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN" + } + } + } + }, + "trackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "content": { + "continuationItemRenderer": { + "trigger": "CONTINUATION_TRIGGER_ON_ITEM_SHOWN", + "continuationEndpoint": { + "clickTrackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/get_transcript" + } + }, + "getTranscriptEndpoint": { + "params": "CgtaZWVycm51TGk1RRIOQ2dBU0FtVnVHZ0ElM0QYASozZW5nYWdlbWVudC1wYW5lbC1zZWFyY2hhYmxlLXRyYW5zY3JpcHQtc2VhcmNoLXBhbmVsMAE4AUAB" + } + } + } + }, + "veType": 126250, + "targetId": "engagement-panel-searchable-transcript", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN", + "onShowCommands": [ + { + "clickTrackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "scrollToEngagementPanelCommand": { + "targetId": "engagement-panel-searchable-transcript" + } + } + ], + "loggingDirectives": { + "trackingParams": "CBMQ040EGAQiEwj_uKOclamCAxW34kkHHbMODfc=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + } + ], + "topbar": { + "desktopTopbarRenderer": { + "logo": { + "topbarLogoRenderer": { + "iconImage": { + "iconType": "YOUTUBE_LOGO" + }, + "tooltipText": { + "runs": [ + { + "text": "YouTube Home" + } + ] + }, + "endpoint": { + "clickTrackingParams": "CBIQsV4iEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 3854, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEwhat_to_watch" + } + }, + "trackingParams": "CBIQsV4iEwj_uKOclamCAxW34kkHHbMODfc=", + "overrideEntityKey": "EgZ0b3BiYXIg9QEoAQ%3D%3D" + } + }, + "searchbox": { + "fusionSearchboxRenderer": { + "icon": { + "iconType": "SEARCH" + }, + "placeholderText": { + "runs": [ + { + "text": "Search" + } + ] + }, + "config": { + "webSearchboxConfig": { + "requestLanguage": "en", + "requestDomain": "us", + "hasOnscreenKeyboard": false, + "focusSearchbox": true + } + }, + "trackingParams": "CBAQ7VAiEwj_uKOclamCAxW34kkHHbMODfc=", + "searchEndpoint": { + "clickTrackingParams": "CBAQ7VAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/results?search_query=", + "webPageType": "WEB_PAGE_TYPE_SEARCH", + "rootVe": 4724 + } + }, + "searchEndpoint": { + "query": "" + } + }, + "clearButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CLOSE" + }, + "trackingParams": "CBEQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibilityData": { + "accessibilityData": { + "label": "Clear search query" + } + } + } + } + } + }, + "trackingParams": "CAcQq6wBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "topbarButtons": [ + { + "topbarMenuButtonRenderer": { + "icon": { + "iconType": "MORE_VERT" + }, + "menuRequest": { + "clickTrackingParams": "CA4Q_qsBGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/account/account_menu" + } + }, + "signalServiceEndpoint": { + "signal": "GET_ACCOUNT_MENU", + "actions": [ + { + "clickTrackingParams": "CA4Q_qsBGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "openPopupAction": { + "popup": { + "multiPageMenuRenderer": { + "trackingParams": "CA8Q_6sBIhMI_7ijnJWpggMVt-JJBx2zDg33", + "style": "MULTI_PAGE_MENU_STYLE_TYPE_SYSTEM", + "showLoadingSpinner": true + } + }, + "popupType": "DROPDOWN", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CA4Q_qsBGAAiEwj_uKOclamCAxW34kkHHbMODfc=", + "accessibility": { + "accessibilityData": { + "label": "Settings" + } + }, + "tooltip": "Settings", + "style": "STYLE_DEFAULT" + } + }, + { + "buttonRenderer": { + "style": "STYLE_SUGGESTIVE", + "size": "SIZE_SMALL", + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "icon": { + "iconType": "AVATAR_LOGGED_OUT" + }, + "navigationEndpoint": { + "clickTrackingParams": "CA0Q1IAEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fnext%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en&ec=65620", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "idamTag": "65620" + } + }, + "trackingParams": "CA0Q1IAEGAEiEwj_uKOclamCAxW34kkHHbMODfc=", + "targetId": "topbar-signin" + } + } + ], + "hotkeyDialog": { + "hotkeyDialogRenderer": { + "title": { + "runs": [ + { + "text": "Keyboard shortcuts" + } + ] + }, + "sections": [ + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Playback" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle play/pause" + } + ] + }, + "hotkey": "k" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rewind 10 seconds" + } + ] + }, + "hotkey": "j" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Fast forward 10 seconds" + } + ] + }, + "hotkey": "l" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Previous video" + } + ] + }, + "hotkey": "P (SHIFT+p)" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Next video" + } + ] + }, + "hotkey": "N (SHIFT+n)" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Previous frame (while paused)" + } + ] + }, + "hotkey": ",", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Comma" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Next frame (while paused)" + } + ] + }, + "hotkey": ".", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Period" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Decrease playback rate" + } + ] + }, + "hotkey": "< (SHIFT+,)", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Less than or SHIFT + comma" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Increase playback rate" + } + ] + }, + "hotkey": "> (SHIFT+.)", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Greater than or SHIFT + period" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to specific point in the video (7 advances to 70% of duration)" + } + ] + }, + "hotkey": "0..9" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to previous chapter" + } + ] + }, + "hotkey": "CONTROL + ←" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to next chapter" + } + ] + }, + "hotkey": "CONTROL + →" + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "General" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle full screen" + } + ] + }, + "hotkey": "f" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle theater mode" + } + ] + }, + "hotkey": "t" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle miniplayer" + } + ] + }, + "hotkey": "i" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Close miniplayer or current dialog" + } + ] + }, + "hotkey": "ESCAPE" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle mute" + } + ] + }, + "hotkey": "m" + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Subtitles and closed captions" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "If the video supports captions, toggle captions ON/OFF" + } + ] + }, + "hotkey": "c" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through different text opacity levels" + } + ] + }, + "hotkey": "o" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through different window opacity levels" + } + ] + }, + "hotkey": "w" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through font sizes (increasing)" + } + ] + }, + "hotkey": "+" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through font sizes (decreasing)" + } + ] + }, + "hotkey": "-", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Minus" + } + } + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Spherical Videos" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan up" + } + ] + }, + "hotkey": "w" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan left" + } + ] + }, + "hotkey": "a" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan down" + } + ] + }, + "hotkey": "s" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan right" + } + ] + }, + "hotkey": "d" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Zoom in" + } + ] + }, + "hotkey": "+ on numpad or ]", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Plus on number pad or right bracket" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Zoom out" + } + ] + }, + "hotkey": "- on numpad or [", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Minus on number pad or left bracket" + } + } + } + } + ] + } + } + ], + "dismissButton": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Dismiss" + } + ] + }, + "trackingParams": "CAwQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + "trackingParams": "CAsQteYDIhMI_7ijnJWpggMVt-JJBx2zDg33" + } + }, + "backButton": { + "buttonRenderer": { + "trackingParams": "CAoQvIYDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "command": { + "clickTrackingParams": "CAoQvIYDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAoQvIYDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "signalAction": { + "signal": "HISTORY_BACK" + } + } + ] + } + } + } + }, + "forwardButton": { + "buttonRenderer": { + "trackingParams": "CAkQvYYDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "command": { + "clickTrackingParams": "CAkQvYYDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAkQvYYDIhMI_7ijnJWpggMVt-JJBx2zDg33", + "signalAction": { + "signal": "HISTORY_FORWARD" + } + } + ] + } + } + } + }, + "a11ySkipNavigationButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Skip navigation" + } + ] + }, + "trackingParams": "CAgQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "command": { + "clickTrackingParams": "CAgQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAgQ8FsiEwj_uKOclamCAxW34kkHHbMODfc=", + "signalAction": { + "signal": "SKIP_NAVIGATION" + } + } + ] + } + } + } + } + } + }, + "cards": { + "cardCollectionRenderer": { + "cards": [ + { + "cardRenderer": { + "teaser": { + "simpleCardTeaserRenderer": { + "message": { + "simpleText": "Listen&download 'Black Mamba'" + }, + "trackingParams": "CAYQ0DYiEwj_uKOclamCAxW34kkHHbMODfc=", + "onTapCommand": { + "clickTrackingParams": "CAYQ0DYiEwj_uKOclamCAxW34kkHHbMODfc=", + "showEngagementPanelEndpoint": { + "panelIdentifier": "engagement-panel-structured-description", + "forcePortrait": false, + "engagementPanelExtras": { + "sectionListEngagementPanelExtras": { + "scrollToItemSectionIdentifier": "infocards-item-section", + "scrollToItemSectionOffsetDistance": 88 + } + } + } + }, + "channelAvatar": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s48-c-k-c0x00ffffff-no-rj", + "width": 48, + "height": 48 + } + ] + } + } + }, + "cueRanges": [ + { + "startCardActiveMs": "18295", + "endCardActiveMs": "0", + "teaserDurationMs": "6000" + } + ], + "trackingParams": "CAUQuJcBGAAiEwj_uKOclamCAxW34kkHHbMODfc=" + } + }, + { + "cardRenderer": { + "teaser": { + "simpleCardTeaserRenderer": { + "message": { + "simpleText": "aespa 에스파 'Black Mamba' The Debut Stage" + }, + "trackingParams": "CAQQ0DYiEwj_uKOclamCAxW34kkHHbMODfc=", + "onTapCommand": { + "clickTrackingParams": "CAQQ0DYiEwj_uKOclamCAxW34kkHHbMODfc=", + "showEngagementPanelEndpoint": { + "panelIdentifier": "engagement-panel-structured-description", + "forcePortrait": false, + "engagementPanelExtras": { + "sectionListEngagementPanelExtras": { + "scrollToItemSectionIdentifier": "infocards-item-section", + "scrollToItemSectionOffsetDistance": 190 + } + } + } + }, + "channelAvatar": { + "thumbnails": [ + { + "url": "https://yt3.ggpht.com/_1Z4I2qpWaCN9g3BcDd3cVA9MDHOG43lE1YNWDNkKro49haGxkjwuFK-I8faWTKM6Jle9qb4ag=s48-c-k-c0x00ffffff-no-rj", + "width": 48, + "height": 48 + } + ] + } + } + }, + "cueRanges": [ + { + "startCardActiveMs": "189731", + "endCardActiveMs": "0", + "teaserDurationMs": "6000" + } + ], + "trackingParams": "CAMQwJcBGAEiEwj_uKOclamCAxW34kkHHbMODfc=" + } + } + ], + "headerText": { + "simpleText": "More from SMTOWN" + }, + "trackingParams": "CAIQwjciEwj_uKOclamCAxW34kkHHbMODfc=", + "onIconTapCommand": { + "clickTrackingParams": "CAIQwjciEwj_uKOclamCAxW34kkHHbMODfc=", + "showEngagementPanelEndpoint": { + "panelIdentifier": "engagement-panel-structured-description", + "forcePortrait": false, + "engagementPanelExtras": { + "sectionListEngagementPanelExtras": { + "scrollToItemSectionIdentifier": "infocards-item-section" + } + } + } + } + } + }, + "pageVisualEffects": [ + { + "cinematicContainerRenderer": { + "gradientColorConfig": [ + { + "darkThemeColor": 2566914048, + "startLocation": 0 + }, + { + "darkThemeColor": 2130706432 + }, + { + "darkThemeColor": 4278190080, + "startLocation": 1 + } + ], + "presentationStyle": "CINEMATIC_CONTAINER_PRESENTATION_STYLE_DYNAMIC_BLURRED", + "config": { + "lightThemeBackgroundColor": 4278190080, + "darkThemeBackgroundColor": 4278190080, + "animationConfig": { + "minImageUpdateIntervalMs": 5000, + "crossfadeDurationMs": 5000, + "crossfadeStartOffset": 1, + "maxFrameRate": 30 + }, + "colorSourceSizeMultiplier": 2.5, + "applyClientImageBlur": true, + "bottomColorSourceHeightMultiplier": 0.67, + "maxBottomColorSourceHeight": 260, + "colorSourceWidthMultiplier": 1.5, + "colorSourceHeightMultiplier": 2, + "blurStrength": 5 + } + } + } + ], + "frameworkUpdates": { + "entityBatchUpdate": { + "mutations": [ + { + "entityKey": "EgZ0b3BiYXIg9QEoAQ%3D%3D", + "type": "ENTITY_MUTATION_TYPE_DELETE", + "options": { + "persistenceOption": "ENTITY_PERSISTENCE_OPTION_INMEMORY_AND_PERSIST" + } + }, + { + "entityKey": "EgpIRUFUU0VFS0VSIJICKAE%3D", + "type": "ENTITY_MUTATION_TYPE_REPLACE", + "payload": { + "macroMarkersListEntity": { + "key": "EgpIRUFUU0VFS0VSIJICKAE%3D", + "externalVideoId": "ZeerrnuLi5E", + "markersList": { + "markerType": "MARKER_TYPE_HEATMAP", + "markers": [ + { + "startMillis": "0", + "durationMillis": "2300", + "intensityScoreNormalized": 0.7353492513621119 + }, + { + "startMillis": "2300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.48846386431306577 + }, + { + "startMillis": "4600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.48979164775397555 + }, + { + "startMillis": "6900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.44250282227554594 + }, + { + "startMillis": "9200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4604461449305228 + }, + { + "startMillis": "11500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.44040488981613296 + }, + { + "startMillis": "13800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.45138896534751816 + }, + { + "startMillis": "16100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4341527782596114 + }, + { + "startMillis": "18400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.454949433090136 + }, + { + "startMillis": "20700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4408407213142861 + }, + { + "startMillis": "23000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.43783449496207455 + }, + { + "startMillis": "25300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4436904527211805 + }, + { + "startMillis": "27600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4740565657211948 + }, + { + "startMillis": "29900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4951172538377789 + }, + { + "startMillis": "32200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5042087099685411 + }, + { + "startMillis": "34500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6022439990247457 + }, + { + "startMillis": "36800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.658760140405049 + }, + { + "startMillis": "39100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.8474827268704106 + }, + { + "startMillis": "41400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.9050108227333975 + }, + { + "startMillis": "43700", + "durationMillis": "2300", + "intensityScoreNormalized": 1 + }, + { + "startMillis": "46000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.9794267313170829 + }, + { + "startMillis": "48300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.8665758026546113 + }, + { + "startMillis": "50600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.7400330204334619 + }, + { + "startMillis": "52900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6178570703966199 + }, + { + "startMillis": "55200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5518445941487093 + }, + { + "startMillis": "57500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5081020410749375 + }, + { + "startMillis": "59800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4763353675598858 + }, + { + "startMillis": "62100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.44151219542257825 + }, + { + "startMillis": "64400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4198904106060364 + }, + { + "startMillis": "66700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.40721792080400177 + }, + { + "startMillis": "69000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.38231008836355523 + }, + { + "startMillis": "71300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3674999191558192 + }, + { + "startMillis": "73600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3633996130974082 + }, + { + "startMillis": "75900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3623533128214162 + }, + { + "startMillis": "78200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3721058562278168 + }, + { + "startMillis": "80500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.38619504075827754 + }, + { + "startMillis": "82800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4070173856882326 + }, + { + "startMillis": "85100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.40377274690384096 + }, + { + "startMillis": "87400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4271857756343048 + }, + { + "startMillis": "89700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.43724417663958404 + }, + { + "startMillis": "92000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4889859757677964 + }, + { + "startMillis": "94300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.534034084460599 + }, + { + "startMillis": "96600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6097996580793181 + }, + { + "startMillis": "98900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6834875881850748 + }, + { + "startMillis": "101200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.7220526514086865 + }, + { + "startMillis": "103500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.7347092839795363 + }, + { + "startMillis": "105800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6351707432561239 + }, + { + "startMillis": "108100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5240821831127966 + }, + { + "startMillis": "110400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.44026051284224527 + }, + { + "startMillis": "112700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4057395975351631 + }, + { + "startMillis": "115000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.38793725882207364 + }, + { + "startMillis": "117300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4144918197114524 + }, + { + "startMillis": "119600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.43603321044325394 + }, + { + "startMillis": "121900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.48901727475685985 + }, + { + "startMillis": "124200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5222392820178098 + }, + { + "startMillis": "126500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4836942307584444 + }, + { + "startMillis": "128800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4468506811788723 + }, + { + "startMillis": "131100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4029129941423111 + }, + { + "startMillis": "133400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.40677488776854204 + }, + { + "startMillis": "135700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3876540445183802 + }, + { + "startMillis": "138000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3966959208346083 + }, + { + "startMillis": "140300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.40016636936089334 + }, + { + "startMillis": "142600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.42411341978086414 + }, + { + "startMillis": "144900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4341368517828756 + }, + { + "startMillis": "147200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4388069794806736 + }, + { + "startMillis": "149500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4722851952804171 + }, + { + "startMillis": "151800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4837636840461228 + }, + { + "startMillis": "154100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5191851377442888 + }, + { + "startMillis": "156400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5419546675690747 + }, + { + "startMillis": "158700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.63316324548635 + }, + { + "startMillis": "161000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6904890058492409 + }, + { + "startMillis": "163300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.7571019795156426 + }, + { + "startMillis": "165600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.817063918006066 + }, + { + "startMillis": "167900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.847549341090497 + }, + { + "startMillis": "170200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.815486158125955 + }, + { + "startMillis": "172500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.6836324498778197 + }, + { + "startMillis": "174800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5844014978920615 + }, + { + "startMillis": "177100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.5275923093398192 + }, + { + "startMillis": "179400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.49678724879185554 + }, + { + "startMillis": "181700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4603856935644777 + }, + { + "startMillis": "184000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.4154695668919294 + }, + { + "startMillis": "186300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.3776236187157152 + }, + { + "startMillis": "188600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.334704672225838 + }, + { + "startMillis": "190900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.2825130193753899 + }, + { + "startMillis": "193200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.18408535040430055 + }, + { + "startMillis": "195500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.11436338998796582 + }, + { + "startMillis": "197800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.08710380552082314 + }, + { + "startMillis": "200100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.0686391677349524 + }, + { + "startMillis": "202400", + "durationMillis": "2300", + "intensityScoreNormalized": 0.06494322107175356 + }, + { + "startMillis": "204700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.060029902998754756 + }, + { + "startMillis": "207000", + "durationMillis": "2300", + "intensityScoreNormalized": 0.05729189928843964 + }, + { + "startMillis": "209300", + "durationMillis": "2300", + "intensityScoreNormalized": 0.04702295718526806 + }, + { + "startMillis": "211600", + "durationMillis": "2300", + "intensityScoreNormalized": 0.046516633716171214 + }, + { + "startMillis": "213900", + "durationMillis": "2300", + "intensityScoreNormalized": 0.04612124161981686 + }, + { + "startMillis": "216200", + "durationMillis": "2300", + "intensityScoreNormalized": 0.05293517695458205 + }, + { + "startMillis": "218500", + "durationMillis": "2300", + "intensityScoreNormalized": 0.06766889907398617 + }, + { + "startMillis": "220800", + "durationMillis": "2300", + "intensityScoreNormalized": 0.05891324924292108 + }, + { + "startMillis": "223100", + "durationMillis": "2300", + "intensityScoreNormalized": 0.02276141078392819 + }, + { + "startMillis": "225400", + "durationMillis": "2300", + "intensityScoreNormalized": 0 + }, + { + "startMillis": "227700", + "durationMillis": "2300", + "intensityScoreNormalized": 0.03851496406744489 + } + ], + "markersMetadata": { + "heatmapMetadata": { + "maxHeightDp": 40, + "minHeightDp": 4, + "showHideAnimationDurationMillis": 200 + } + }, + "markersDecoration": { + "timedMarkerDecorations": [ + { + "visibleTimeRangeStartMillis": 36800, + "visibleTimeRangeEndMillis": 50600, + "decorationTimeMillis": 39100, + "label": { + "runs": [ + { + "text": "Most replayed" + } + ] + }, + "icon": "UNKNOWN" + }, + { + "visibleTimeRangeStartMillis": 163300, + "visibleTimeRangeEndMillis": 172500, + "decorationTimeMillis": 165600, + "label": { + "runs": [ + { + "text": "Most replayed" + } + ] + }, + "icon": "UNKNOWN" + } + ] + } + } + } + } + }, + { + "entityKey": "EgtaZWVycm51TGk1RSA-KAE%3D", + "type": "ENTITY_MUTATION_TYPE_REPLACE", + "payload": { + "likeStatusEntity": { + "key": "EgtaZWVycm51TGk1RSA-KAE%3D", + "likeStatus": "INDIFFERENT" + } + } + }, + { + "entityKey": "EhhVQ0VmX0JjLUtWZDdvblNlaWZTM3B5OWcgMygB", + "type": "ENTITY_MUTATION_TYPE_REPLACE", + "payload": { + "subscriptionStateEntity": { + "key": "EhhVQ0VmX0JjLUtWZDdvblNlaWZTM3B5OWcgMygB", + "subscribed": false + } + } + } + ], + "timestamp": { + "seconds": "1699060399", + "nanos": 409685265 + } + } + } +} From 1a22dc835ac896cd208eafcfee4bfcd67630c9f1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sun, 5 Nov 2023 22:43:04 +0100 Subject: [PATCH 061/459] fix: handle age restricted channels refactor! rename ExtractionError::VideoUnavailable to ExtractionError::Unavailable --- src/client/channel.rs | 109 ++- src/client/player.rs | 10 +- src/client/response/channel.rs | 16 +- src/client/response/video_item.rs | 10 +- src/error.rs | 15 +- testfiles/channel/channel_agegate.json | 1068 ++++++++++++++++++++++++ tests/youtube.rs | 23 +- 7 files changed, 1200 insertions(+), 51 deletions(-) create mode 100644 testfiles/channel/channel_agegate.json diff --git a/src/client/channel.rs b/src/client/channel.rs index fa4d0ac..c02d8fb 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -5,6 +5,7 @@ use time::OffsetDateTime; use url::Url; use crate::{ + client::response::YouTubeListItem, error::{Error, ExtractionError}, model::{ paginator::{ContinuationEndpoint, Paginator}, @@ -290,7 +291,7 @@ impl MapResponse>> for response::Channel { impl MapResponse for response::ChannelAbout { fn map_response( self, - _id: &str, + id: &str, _lang: Language, _deobf: Option<&crate::deobfuscate::DeobfData>, _visitor_data: Option<&str>, @@ -299,11 +300,21 @@ impl MapResponse for response::ChannelAbout { // and it allows parsing the country name. let lang = Language::En; - let ep = self - .on_response_received_endpoints - .into_iter() - .next() - .ok_or(ExtractionError::InvalidData("no received endpoint".into()))?; + let ep = match self { + response::ChannelAbout::ReceivedEndpoints { + on_response_received_endpoints, + } => on_response_received_endpoints + .into_iter() + .next() + .ok_or(ExtractionError::InvalidData("no received endpoint".into()))?, + response::ChannelAbout::Content { contents } => { + // Handle errors (e.g. age restriction) when regular channel content was returned + map_channel_content(id, contents, None)?; + return Err(ExtractionError::InvalidData( + "could not extract aboutData".into(), + )); + } + }; let continuations = ep.append_continuation_items_action.continuation_items; let about = continuations .c @@ -483,13 +494,6 @@ fn map_channel_content( match contents { Some(contents) => { let tabs = contents.two_column_browse_results_renderer.contents; - if tabs.is_empty() { - return Err(ExtractionError::NotFound { - id: id.to_owned(), - msg: "no tabs".into(), - }); - } - let cmp_url_suffix = |endpoint: &response::channel::ChannelTabEndpoint, expect: &str| { endpoint @@ -504,24 +508,46 @@ fn map_channel_content( let mut featured_tab = false; for tab in &tabs { - if cmp_url_suffix(&tab.tab_renderer.endpoint, "/featured") - && (tab.tab_renderer.content.section_list_renderer.is_some() - || tab.tab_renderer.content.rich_grid_renderer.is_some()) - { - featured_tab = true; - } else if cmp_url_suffix(&tab.tab_renderer.endpoint, "/shorts") { - has_shorts = true; - } else if cmp_url_suffix(&tab.tab_renderer.endpoint, "/streams") { - has_live = true; + if let Some(endpoint) = &tab.tab_renderer.endpoint { + if cmp_url_suffix(endpoint, "/featured") + && (tab.tab_renderer.content.section_list_renderer.is_some() + || tab.tab_renderer.content.rich_grid_renderer.is_some()) + { + featured_tab = true; + } else if cmp_url_suffix(endpoint, "/shorts") { + has_shorts = true; + } else if cmp_url_suffix(endpoint, "/streams") { + has_live = true; + } + } else { + // Check for age gate + if let Some(YouTubeListItem::ChannelAgeGateRenderer { + channel_title, + main_text, + }) = &tab + .tab_renderer + .content + .section_list_renderer + .as_ref() + .and_then(|c| c.contents.c.get(0)) + { + return Err(ExtractionError::Unavailable { + reason: crate::error::UnavailabilityReason::AgeRestricted, + msg: format!("{channel_title}: {main_text}"), + }); + } } } - let channel_content = tabs.into_iter().find_map(|tab| { - tab.tab_renderer - .content - .rich_grid_renderer - .or(tab.tab_renderer.content.section_list_renderer) - }); + let channel_content = tabs + .into_iter() + .filter(|t| t.tab_renderer.endpoint.is_some()) + .find_map(|tab| { + tab.tab_renderer + .content + .rich_grid_renderer + .or(tab.tab_renderer.content.section_list_renderer) + }); // YouTube may show the "Featured" tab if the requested tab is empty/does not exist let content = if featured_tab { @@ -530,9 +556,10 @@ fn map_channel_content( match channel_content { Some(list) => list.contents, None => { - return Err(ExtractionError::InvalidData( - "could not extract content".into(), - )) + return Err(ExtractionError::NotFound { + id: id.to_owned(), + msg: "no tabs".into(), + }); } } }; @@ -632,6 +659,7 @@ mod tests { use crate::{ client::{response, MapResponse}, + error::{ExtractionError, UnavailabilityReason}, model::{paginator::Paginator, Channel, ChannelInfo, PlaylistItem, VideoItem}, param::{ChannelOrder, ChannelVideoTab, Language}, serializer::MapResult, @@ -649,7 +677,7 @@ mod tests { #[case::upcoming("videos_upcoming", "UCcvfHa-GHSOHFAjU0-Ie57A")] #[case::richgrid("videos_20221011_richgrid", "UCh8gHdtzO2tXd593_bjErWg")] #[case::richgrid2("videos_20221011_richgrid2", "UC2DjFE7Xf11URZqWBigcVOQ")] - #[case::richgrid2("videos_20230415_coachella", "UCHF66aWLOxBW4l6VkSrS3cQ")] + #[case::coachella("videos_20230415_coachella", "UCHF66aWLOxBW4l6VkSrS3cQ")] #[case::shorts("shorts", "UCh8gHdtzO2tXd593_bjErWg")] #[case::livestreams("livestreams", "UC2DjFE7Xf11URZqWBigcVOQ")] fn map_channel_videos(#[case] name: &str, #[case] id: &str) { @@ -678,6 +706,23 @@ mod tests { } } + #[test] + fn channel_agegate() { + let json_path = path!(*TESTFILES / "channel" / format!("channel_agegate.json")); + let json_file = File::open(json_path).unwrap(); + + let channel: response::Channel = + serde_json::from_reader(BufReader::new(json_file)).unwrap(); + let res: Result>>, ExtractionError> = + channel.map_response("UCbfnHqxXs_K3kvaH-WlNlig", Language::En, None, None); + if let Err(ExtractionError::Unavailable { reason, msg }) = res { + assert_eq!(reason, UnavailabilityReason::AgeRestricted); + assert!(msg.starts_with("Laphroaig Whisky: ")); + } else { + panic!("invalid res: {res:?}") + } + } + #[rstest] fn map_channel_playlists() { let json_path = path!(*TESTFILES / "channel" / "channel_playlists.json"); diff --git a/src/client/player.rs b/src/client/player.rs index b948eda..1dceb7d 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -77,7 +77,7 @@ impl RustyPipeQuery { match tv_res { // Output desktop client error if the tv client is unsupported - Err(Error::Extraction(ExtractionError::VideoUnavailable { + Err(Error::Extraction(ExtractionError::Unavailable { reason: UnavailabilityReason::UnsupportedClient, .. })) => Err(Error::Extraction(e)), @@ -183,7 +183,7 @@ impl MapResponse for response::Player { _ => None, }) .unwrap_or_default(); - return Err(ExtractionError::VideoUnavailable { reason, msg }); + return Err(ExtractionError::Unavailable { reason, msg }); } response::player::PlayabilityStatus::LoginRequired { reason, messages } => { let mut msg = reason; @@ -205,10 +205,10 @@ impl MapResponse for response::Player { _ => None, }) .unwrap_or_default(); - return Err(ExtractionError::VideoUnavailable { reason, msg }); + return Err(ExtractionError::Unavailable { reason, msg }); } response::player::PlayabilityStatus::LiveStreamOffline { reason } => { - return Err(ExtractionError::VideoUnavailable { + return Err(ExtractionError::Unavailable { reason: UnavailabilityReason::OfflineLivestream, msg: reason, }); @@ -216,7 +216,7 @@ impl MapResponse for response::Player { response::player::PlayabilityStatus::Error { reason } => { // reason (censored): "This video has been removed for violating YouTube's policy on hate speech. Learn more about combating hate speech in your country." // reason: "This video is unavailable" - return Err(ExtractionError::VideoUnavailable { + return Err(ExtractionError::Unavailable { reason: UnavailabilityReason::Deleted, msg: reason, }); diff --git a/src/client/response/channel.rs b/src/client/response/channel.rs index b6a9259..a7d91b7 100644 --- a/src/client/response/channel.rs +++ b/src/client/response/channel.rs @@ -36,7 +36,7 @@ pub(crate) struct TabRendererWrap { pub(crate) struct TabRenderer { #[serde(default)] pub content: TabContent, - pub endpoint: ChannelTabEndpoint, + pub endpoint: Option, } #[serde_as] @@ -148,10 +148,16 @@ pub(crate) struct MicroformatDataRenderer { #[serde_as] #[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub(crate) struct ChannelAbout { - #[serde_as(as = "VecSkipError<_>")] - pub on_response_received_endpoints: Vec>, +#[serde(untagged)] +pub(crate) enum ChannelAbout { + #[serde(rename_all = "camelCase")] + ReceivedEndpoints { + #[serde_as(as = "VecSkipError<_>")] + on_response_received_endpoints: Vec>, + }, + Content { + contents: Option, + }, } #[derive(Debug, Deserialize)] diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index d25fe40..60d6141 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -69,6 +69,14 @@ pub(crate) enum YouTubeListItem { contents: MapResult>, }, + /// Age-restricted channel + #[serde(rename_all = "camelCase")] + ChannelAgeGateRenderer { + channel_title: String, + #[serde_as(as = "Text")] + main_text: String, + }, + /// No video list item (e.g. ad) or unimplemented item /// /// Unimplemented: @@ -704,7 +712,7 @@ impl YouTubeListMapper { self.warnings.append(&mut contents.warnings); contents.c.into_iter().for_each(|it| self.map_item(it)); } - YouTubeListItem::None => {} + YouTubeListItem::None | YouTubeListItem::ChannelAgeGateRenderer { .. } => {} } } diff --git a/src/error.rs b/src/error.rs index 0b29cc0..104387f 100644 --- a/src/error.rs +++ b/src/error.rs @@ -24,14 +24,15 @@ pub enum Error { /// Error extracting content from YouTube #[derive(thiserror::Error, Debug)] pub enum ExtractionError { - /// Video cannot be extracted with RustyPipe + /// Content cannot be extracted with RustyPipe /// /// Reasons include: /// - Deletion/Censorship - /// - Private video that requires a Google account + /// - Age restriction + /// - Private video /// - DRM (Movies and TV shows) - #[error("video cant be played because it is {reason}. Reason (from YT): {msg}")] - VideoUnavailable { + #[error("content unavailable because it is {reason}. Reason (from YT): {msg}")] + Unavailable { /// Reason why the video could not be extracted reason: UnavailabilityReason, /// The error message as returned from YouTube @@ -77,9 +78,9 @@ pub enum ExtractionError { #[derive(Default, Debug, Copy, Clone, PartialEq, Eq)] #[non_exhaustive] pub enum UnavailabilityReason { - /// Video is age restricted. + /// Video/Channel is age restricted. /// - /// Age restriction may be circumvented with the + /// Video age restriction may be circumvented with the /// [`ClientType::TvHtml5Embed`](crate::client::ClientType::TvHtml5Embed) client. AgeRestricted, /// Video was deleted or censored @@ -208,7 +209,7 @@ impl ExtractionError { pub(crate) fn switch_client(&self) -> bool { matches!( self, - ExtractionError::VideoUnavailable { + ExtractionError::Unavailable { reason: UnavailabilityReason::AgeRestricted | UnavailabilityReason::UnsupportedClient, .. diff --git a/testfiles/channel/channel_agegate.json b/testfiles/channel/channel_agegate.json new file mode 100644 index 0000000..b3b8495 --- /dev/null +++ b/testfiles/channel/channel_agegate.json @@ -0,0 +1,1068 @@ +{ + "responseContext": { + "visitorData": "CgtrYzRnNm1YS2g5cyiU9J6qBjIICgJERRICEgA%3D", + "serviceTrackingParams": [ + { + "service": "GFEEDBACK", + "params": [ + { + "key": "browse_id", + "value": "UCbfnHqxXs_K3kvaH-WlNlig" + }, + { + "key": "browse_id_prefix", + "value": "" + }, + { + "key": "logged_in", + "value": "0" + }, + { + "key": "e", + "value": "23804281,23858057,23946420,23966208,23983296,23986019,23998056,24004644,24007246,24034168,24036947,24077241,24080738,24120819,24135310,24140247,24166867,24181174,24187377,24241378,24255543,24255545,24288664,24290971,24291857,24299875,24367580,24368942,24371398,24371778,24373396,24377598,24377909,24379352,24382552,24385612,24385727,24387949,24390675,24428788,24439361,24451319,24453989,24457856,24458317,24458324,24458329,24458839,24468724,24485421,24499534,24506515,24506784,24515423,24517093,24518452,24524098,24526515,24526642,24526772,24526783,24526794,24526801,24526804,24526815,24526823,24528461,24528470,24528473,24528484,24528548,24528559,24528575,24528580,24528642,24528649,24528657,24528668,24531222,24531225,24531254,24537200,24539025,24540881,24541326,24541656,24542367,24542452,24543193,24543197,24543201,24546059,24546074,24547316,24548138,24548627,24548629,24548854,24549786,24550285,24550458,24559328,24560416,24561140,24561156,24561206,24561383,24563746,24566293,24566687,24569887,24585907,24586420,24586688,24588590,24589493,24694842,24696752,24697069,24698453,24699899,39324156,39324184,39324567,51000798,51003636,51004018,51006181,51009757,51009781,51009900,51010235,51011488,51012165,51012291,51012659,51013170,51014091,51016856,51017346,51018888,51019442,51019626,51020302,51020570,51021953,51022241,51023274,51025415,51025833,51027535,51027869,51027870,51028271,51030072,51030101,51030311,51030435,51031230,51031412,51032492,51033399,51033577,51033905,51034526,51036440,51036511,51036735,51037344,51037349,51037540,51038213,51038399,51038805,51040336,51040339,51040350,51040388,51040473,51040538,51041331,51041497,51041809,51042415,51043057,51043505,51043950,51044000,51044153,51044159,51044608,51044722,51045016,51045928,51045969,51046900,51047537,51047726,51048254,51048488,51051089,51051661,51052608,51052750,51053018,51055016" + } + ] + }, + { + "service": "GOOGLE_HELP", + "params": [ + { + "key": "browse_id", + "value": "UCbfnHqxXs_K3kvaH-WlNlig" + }, + { + "key": "browse_id_prefix", + "value": "" + } + ] + }, + { + "service": "CSI", + "params": [ + { + "key": "c", + "value": "WEB" + }, + { + "key": "cver", + "value": "2.20231101.05.00" + }, + { + "key": "yt_li", + "value": "0" + }, + { + "key": "GetChannelPage_rid", + "value": "0x8556774d05e2f72e" + } + ] + }, + { + "service": "GUIDED_HELP", + "params": [ + { + "key": "logged_in", + "value": "0" + } + ] + }, + { + "service": "ECATCHER", + "params": [ + { + "key": "client.version", + "value": "2.20231101" + }, + { + "key": "client.name", + "value": "WEB" + }, + { + "key": "client.fexp", + "value": "24560416,24694842,24034168,24698453,51033577,51036511,24526823,51017346,51043057,51041331,51040339,51038805,24371778,24036947,51027869,24528484,51034526,51047537,24499534,24548627,39324567,24506515,24007246,24453989,24528470,24385612,24385727,51041497,24166867,24373396,24439361,24528657,24255543,24585907,24135310,51010235,51032492,24549786,51036440,24561206,24531225,51023274,51028271,24524098,51012291,51036735,51030435,24531254,24187377,24526515,51052750,24468724,51051089,24699899,51009781,24120819,51037540,51019626,24588590,51020302,51025833,51042415,24548138,51000798,24561156,24377909,51045969,51033399,39324184,24517093,24561140,24586420,24451319,24559328,24518452,24542367,24543193,51027870,24528473,24528461,51040388,51048254,24548629,24526642,24531222,23986019,24528548,24458317,51016856,39324156,51040336,24458324,51040473,24526815,24526772,51044608,24542452,24528642,24457856,24526801,24543201,23998056,24241378,24528649,24506784,24485421,51040538,24526794,24377598,24561383,24550285,24428788,24566293,51037349,24539025,24696752,24458839,24367580,24548854,24586688,24541326,51018888,23983296,51040350,24528668,51030101,24299875,24368942,23858057,24255545,51044722,51019442,51009900,24080738,51030072,51031230,51009757,24528575,51021953,51033905,24541656,51046900,51004018,51022241,51045016,51051661,24697069,51012165,24458329,24550458,51041809,24290971,23966208,51038399,24140247,51044153,51044159,24547316,51012659,51047726,24537200,51048488,24566687,24181174,24589493,24528580,51013170,51003636,51045928,24563746,51043505,24288664,51038213,51055016,23946420,24077241,24387949,24382552,24526804,51011488,23804281,51053018,51044000,24004644,24371398,51014091,51052608,51030311,24546059,24543197,51025415,24546074,51006181,51031412,24540881,51043950,24390675,24379352,51020570,24528559,24526783,24569887,24291857,51027535,24515423,51037344" + } + ] + } + ], + "mainAppWebResponseContext": { + "loggedOut": true, + "trackingParam": "kx_fmPxhoPZRXlUAXXL4PLT4_RyVqRucDArHzojND1DMYnwRgkuswmIBwOcCE59TDtslLKPQ-SS" + }, + "webResponseContextExtensionData": { + "hasDecorated": true + } + }, + "contents": { + "twoColumnBrowseResultsRenderer": { + "tabs": [ + { + "tabRenderer": { + "selected": true, + "content": { + "sectionListRenderer": { + "contents": [ + { + "channelAgeGateRenderer": { + "channelTitle": "Laphroaig Whisky", + "avatar": { + "thumbnails": [ + { + "url": "https://yt3.googleusercontent.com/ytc/APkrFKb88ujZ0617ttM3aLjdPYtIw43926XXUoLP0QmQ5Q=s144-c-k-c0x00ffffff-no-rj", + "width": 144, + "height": 144 + } + ] + }, + "header": { + "runs": [ + { + "text": "Sign in to view this channel" + } + ] + }, + "mainText": { + "runs": [ + { + "text": "This channel contains content that may be inappropriate for some users, " + }, + { + "text": "as determined by the YouTube account owner", + "navigationEndpoint": { + "clickTrackingParams": "CBIQ75gBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "url": "http://www.google.com/support/youtube/bin/answer.py?answer=186529", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "http://www.google.com/support/youtube/bin/answer.py?answer=186529" + } + } + }, + { + "text": ". To view this channel, please confirm you are old enough by signing in." + } + ] + }, + "signInButton": { + "buttonRenderer": { + "style": "STYLE_BRAND", + "size": "SIZE_DEFAULT", + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CBMQ8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fbrowse%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CBMQ8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=" + } + }, + "secondaryText": { + "runs": [ + { + "text": "If you would instead prefer to avoid potentially inappropriate content, consider activating YouTube's " + }, + { + "text": "Restricted Mode", + "navigationEndpoint": { + "clickTrackingParams": "CBIQ75gBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "url": "http://www.google.com/support/youtube/bin/answer.py?answer=174084", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "http://www.google.com/support/youtube/bin/answer.py?answer=174084" + } + } + }, + { + "text": "." + } + ] + }, + "trackingParams": "CBIQ75gBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIEyEGNoYW5uZWxfYWdlX2dhdGU=" + } + } + ], + "trackingParams": "CBEQui8iEwjQuNu4m62CAxXxHgYAHVTVCIE=" + } + }, + "trackingParams": "CBAQ8JMBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIE=" + } + } + ] + } + }, + "trackingParams": "CAAQhGciEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "topbar": { + "desktopTopbarRenderer": { + "logo": { + "topbarLogoRenderer": { + "iconImage": { + "iconType": "YOUTUBE_LOGO" + }, + "tooltipText": { + "runs": [ + { + "text": "YouTube Home" + } + ] + }, + "endpoint": { + "clickTrackingParams": "CA8QsV4iEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 3854, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEwhat_to_watch" + } + }, + "trackingParams": "CA8QsV4iEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "overrideEntityKey": "EgZ0b3BiYXIg9QEoAQ%3D%3D" + } + }, + "searchbox": { + "fusionSearchboxRenderer": { + "icon": { + "iconType": "SEARCH" + }, + "placeholderText": { + "runs": [ + { + "text": "Search" + } + ] + }, + "config": { + "webSearchboxConfig": { + "requestLanguage": "en", + "requestDomain": "us", + "hasOnscreenKeyboard": false, + "focusSearchbox": true + } + }, + "trackingParams": "CA0Q7VAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "searchEndpoint": { + "clickTrackingParams": "CA0Q7VAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/results?search_query=", + "webPageType": "WEB_PAGE_TYPE_SEARCH", + "rootVe": 4724 + } + }, + "searchEndpoint": { + "query": "" + } + }, + "clearButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CLOSE" + }, + "trackingParams": "CA4Q8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "accessibilityData": { + "accessibilityData": { + "label": "Clear search query" + } + } + } + } + } + }, + "trackingParams": "CAEQq6wBIhMI0LjbuJutggMV8R4GAB1U1QiB", + "topbarButtons": [ + { + "topbarMenuButtonRenderer": { + "icon": { + "iconType": "MORE_VERT" + }, + "menuRequest": { + "clickTrackingParams": "CAsQ_qsBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/account/account_menu" + } + }, + "signalServiceEndpoint": { + "signal": "GET_ACCOUNT_MENU", + "actions": [ + { + "clickTrackingParams": "CAsQ_qsBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "openPopupAction": { + "popup": { + "multiPageMenuRenderer": { + "trackingParams": "CAwQ_6sBIhMI0LjbuJutggMV8R4GAB1U1QiB", + "style": "MULTI_PAGE_MENU_STYLE_TYPE_SYSTEM", + "showLoadingSpinner": true + } + }, + "popupType": "DROPDOWN", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CAsQ_qsBGAAiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "accessibility": { + "accessibilityData": { + "label": "Settings" + } + }, + "tooltip": "Settings", + "style": "STYLE_DEFAULT" + } + }, + { + "buttonRenderer": { + "style": "STYLE_SUGGESTIVE", + "size": "SIZE_SMALL", + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "icon": { + "iconType": "AVATAR_LOGGED_OUT" + }, + "navigationEndpoint": { + "clickTrackingParams": "CAoQ1IAEGAEiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fbrowse%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en&ec=65620", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "idamTag": "65620" + } + }, + "trackingParams": "CAoQ1IAEGAEiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "targetId": "topbar-signin" + } + } + ], + "hotkeyDialog": { + "hotkeyDialogRenderer": { + "title": { + "runs": [ + { + "text": "Keyboard shortcuts" + } + ] + }, + "sections": [ + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Playback" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle play/pause" + } + ] + }, + "hotkey": "k" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rewind 10 seconds" + } + ] + }, + "hotkey": "j" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Fast forward 10 seconds" + } + ] + }, + "hotkey": "l" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Previous video" + } + ] + }, + "hotkey": "P (SHIFT+p)" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Next video" + } + ] + }, + "hotkey": "N (SHIFT+n)" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Previous frame (while paused)" + } + ] + }, + "hotkey": ",", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Comma" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Next frame (while paused)" + } + ] + }, + "hotkey": ".", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Period" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Decrease playback rate" + } + ] + }, + "hotkey": "< (SHIFT+,)", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Less than or SHIFT + comma" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Increase playback rate" + } + ] + }, + "hotkey": "> (SHIFT+.)", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Greater than or SHIFT + period" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to specific point in the video (7 advances to 70% of duration)" + } + ] + }, + "hotkey": "0..9" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to previous chapter" + } + ] + }, + "hotkey": "CONTROL + ←" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to next chapter" + } + ] + }, + "hotkey": "CONTROL + →" + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "General" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle full screen" + } + ] + }, + "hotkey": "f" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle theater mode" + } + ] + }, + "hotkey": "t" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle miniplayer" + } + ] + }, + "hotkey": "i" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Close miniplayer or current dialog" + } + ] + }, + "hotkey": "ESCAPE" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle mute" + } + ] + }, + "hotkey": "m" + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Subtitles and closed captions" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "If the video supports captions, toggle captions ON/OFF" + } + ] + }, + "hotkey": "c" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through different text opacity levels" + } + ] + }, + "hotkey": "o" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through different window opacity levels" + } + ] + }, + "hotkey": "w" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through font sizes (increasing)" + } + ] + }, + "hotkey": "+" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through font sizes (decreasing)" + } + ] + }, + "hotkey": "-", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Minus" + } + } + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Spherical Videos" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan up" + } + ] + }, + "hotkey": "w" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan left" + } + ] + }, + "hotkey": "a" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan down" + } + ] + }, + "hotkey": "s" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan right" + } + ] + }, + "hotkey": "d" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Zoom in" + } + ] + }, + "hotkey": "+ on numpad or ]", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Plus on number pad or right bracket" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Zoom out" + } + ] + }, + "hotkey": "- on numpad or [", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Minus on number pad or left bracket" + } + } + } + } + ] + } + } + ], + "dismissButton": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Dismiss" + } + ] + }, + "trackingParams": "CAkQ8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=" + } + }, + "trackingParams": "CAgQteYDIhMI0LjbuJutggMV8R4GAB1U1QiB" + } + }, + "backButton": { + "buttonRenderer": { + "trackingParams": "CAcQvIYDIhMI0LjbuJutggMV8R4GAB1U1QiB", + "command": { + "clickTrackingParams": "CAcQvIYDIhMI0LjbuJutggMV8R4GAB1U1QiB", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAcQvIYDIhMI0LjbuJutggMV8R4GAB1U1QiB", + "signalAction": { + "signal": "HISTORY_BACK" + } + } + ] + } + } + } + }, + "forwardButton": { + "buttonRenderer": { + "trackingParams": "CAYQvYYDIhMI0LjbuJutggMV8R4GAB1U1QiB", + "command": { + "clickTrackingParams": "CAYQvYYDIhMI0LjbuJutggMV8R4GAB1U1QiB", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAYQvYYDIhMI0LjbuJutggMV8R4GAB1U1QiB", + "signalAction": { + "signal": "HISTORY_FORWARD" + } + } + ] + } + } + } + }, + "a11ySkipNavigationButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Skip navigation" + } + ] + }, + "trackingParams": "CAUQ8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "command": { + "clickTrackingParams": "CAUQ8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAUQ8FsiEwjQuNu4m62CAxXxHgYAHVTVCIE=", + "signalAction": { + "signal": "SKIP_NAVIGATION" + } + } + ] + } + } + } + }, + "voiceSearchButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "serviceEndpoint": { + "clickTrackingParams": "CAIQ7a8FIhMI0LjbuJutggMV8R4GAB1U1QiB", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAIQ7a8FIhMI0LjbuJutggMV8R4GAB1U1QiB", + "openPopupAction": { + "popup": { + "voiceSearchDialogRenderer": { + "placeholderHeader": { + "runs": [ + { + "text": "Listening..." + } + ] + }, + "promptHeader": { + "runs": [ + { + "text": "Didn't hear that. Try again." + } + ] + }, + "exampleQuery1": { + "runs": [ + { + "text": "\"Play Dua Lipa\"" + } + ] + }, + "exampleQuery2": { + "runs": [ + { + "text": "\"Show me my subscriptions\"" + } + ] + }, + "promptMicrophoneLabel": { + "runs": [ + { + "text": "Tap microphone to try again" + } + ] + }, + "loadingHeader": { + "runs": [ + { + "text": "Working..." + } + ] + }, + "connectionErrorHeader": { + "runs": [ + { + "text": "No connection" + } + ] + }, + "connectionErrorMicrophoneLabel": { + "runs": [ + { + "text": "Check your connection and try again" + } + ] + }, + "permissionsHeader": { + "runs": [ + { + "text": "Waiting for permission" + } + ] + }, + "permissionsSubtext": { + "runs": [ + { + "text": "Allow microphone access to search with voice" + } + ] + }, + "disabledHeader": { + "runs": [ + { + "text": "Search with your voice" + } + ] + }, + "disabledSubtext": { + "runs": [ + { + "text": "To search by voice, go to your browser settings and allow access to microphone" + } + ] + }, + "microphoneButtonAriaLabel": { + "runs": [ + { + "text": "Cancel" + } + ] + }, + "exitButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CLOSE" + }, + "trackingParams": "CAQQ0LEFIhMI0LjbuJutggMV8R4GAB1U1QiB", + "accessibilityData": { + "accessibilityData": { + "label": "Cancel" + } + } + } + }, + "trackingParams": "CAMQ7q8FIhMI0LjbuJutggMV8R4GAB1U1QiB", + "microphoneOffPromptHeader": { + "runs": [ + { + "text": "Microphone off. Try again." + } + ] + } + } + }, + "popupType": "TOP_ALIGNED_DIALOG" + } + } + ] + } + }, + "icon": { + "iconType": "MICROPHONE_ON" + }, + "tooltip": "Search with your voice", + "trackingParams": "CAIQ7a8FIhMI0LjbuJutggMV8R4GAB1U1QiB", + "accessibilityData": { + "accessibilityData": { + "label": "Search with your voice" + } + } + } + } + } + } +} diff --git a/tests/youtube.rs b/tests/youtube.rs index 6a34b15..2af69b7 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -312,7 +312,7 @@ fn get_player_error(#[case] id: &str, #[case] expect: UnavailabilityReason, rp: let err = tokio_test::block_on(rp.query().player(id)).unwrap_err(); match err { - Error::Extraction(ExtractionError::VideoUnavailable { reason, .. }) => { + Error::Extraction(ExtractionError::Unavailable { reason, .. }) => { assert_eq!(reason, expect, "got {err}") } _ => panic!("got {err}"), @@ -1094,6 +1094,27 @@ fn channel_tab_not_found(#[case] tab: ChannelVideoTab, rp: RustyPipe) { assert!(channel.content.is_empty(), "got: {:?}", channel.content); } +#[rstest] +fn channel_age_restriction(rp: RustyPipe) { + let id = "UCbfnHqxXs_K3kvaH-WlNlig"; + + let res = tokio_test::block_on(rp.query().channel_videos(&id)); + if let Err(Error::Extraction(ExtractionError::Unavailable { reason, msg })) = res { + assert_eq!(reason, UnavailabilityReason::AgeRestricted); + assert!(msg.starts_with("Laphroaig Whisky: ")); + } else { + panic!("invalid res: {res:?}") + } + + let res = tokio_test::block_on(rp.query().channel_info(&id)); + if let Err(Error::Extraction(ExtractionError::Unavailable { reason, msg })) = res { + assert_eq!(reason, UnavailabilityReason::AgeRestricted); + assert!(msg.starts_with("Laphroaig Whisky: ")); + } else { + panic!("invalid res: {res:?}") + } +} + //#CHANNEL_RSS #[cfg(feature = "rss")] From 596b9c4d4a02238a7421414b8a8647149c88cb86 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 13 Nov 2023 13:04:46 +0100 Subject: [PATCH 062/459] fix: remove serde_with json feature --- Cargo.toml | 2 +- src/client/response/mod.rs | 4 ++-- src/client/response/player.rs | 14 +++++++------- src/client/response/search.rs | 4 ++-- src/client/response/video_item.rs | 8 ++++---- src/serializer/range.rs | 6 +++--- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8e04bb7..a1122fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,8 +44,8 @@ tokio = { version = "1.20.0", features = ["macros", "time"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.82" serde_with = { version = "3.0.0", default-features = false, features = [ + "alloc", "macros", - "json", ] } serde_plain = "1.0.1" rand = "0.8.5" diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index e914998..237c930 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -54,7 +54,7 @@ use serde::{ de::{IgnoredAny, Visitor}, Deserialize, }; -use serde_with::{json::JsonString, serde_as, VecSkipError}; +use serde_with::{serde_as, DisplayFromStr, VecSkipError}; use crate::error::ExtractionError; use crate::serializer::{text::Text, MapResult, VecSkipErrorWrap}; @@ -202,7 +202,7 @@ pub(crate) struct ResponseContext { #[serde(rename_all = "camelCase")] pub(crate) struct Continuation { /// Number of search results - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub estimated_results: Option, #[serde( alias = "onResponseReceivedCommands", diff --git a/src/client/response/player.rs b/src/client/response/player.rs index 0de004d..f3ae15e 100644 --- a/src/client/response/player.rs +++ b/src/client/response/player.rs @@ -2,7 +2,7 @@ use std::ops::Range; use serde::Deserialize; use serde_with::serde_as; -use serde_with::{json::JsonString, DefaultOnError}; +use serde_with::{DefaultOnError, DisplayFromStr}; use super::{ResponseContext, Thumbnails}; use crate::serializer::{text::Text, MapResult}; @@ -78,7 +78,7 @@ pub(crate) struct ErrorMessage { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct StreamingData { - #[serde_as(as = "JsonString")] + #[serde_as(as = "DisplayFromStr")] pub expires_in_seconds: u32, #[serde(default)] pub formats: MapResult>, @@ -106,7 +106,7 @@ pub(crate) struct Format { pub width: Option, pub height: Option, - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub approx_duration_ms: Option, #[serde_as(as = "Option")] @@ -114,7 +114,7 @@ pub(crate) struct Format { #[serde_as(as = "Option")] pub init_range: Option>, - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub content_length: Option, #[serde(default)] @@ -129,7 +129,7 @@ pub(crate) struct Format { #[serde(default)] #[serde_as(deserialize_as = "DefaultOnError")] pub audio_quality: Option, - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub audio_sample_rate: Option, pub audio_channels: Option, pub loudness_db: Option, @@ -237,7 +237,7 @@ pub(crate) struct CaptionTrack { pub(crate) struct VideoDetails { pub video_id: String, pub title: String, - #[serde_as(as = "JsonString")] + #[serde_as(as = "DisplayFromStr")] pub length_seconds: u32, #[serde(default)] pub keywords: Vec, @@ -245,7 +245,7 @@ pub(crate) struct VideoDetails { pub short_description: Option, #[serde(default)] pub thumbnail: Thumbnails, - #[serde_as(as = "JsonString")] + #[serde_as(as = "DisplayFromStr")] pub view_count: u64, pub author: String, pub is_live_content: bool, diff --git a/src/client/response/search.rs b/src/client/response/search.rs index 1eb1e80..8a10080 100644 --- a/src/client/response/search.rs +++ b/src/client/response/search.rs @@ -2,7 +2,7 @@ use serde::{ de::{IgnoredAny, Visitor}, Deserialize, }; -use serde_with::{json::JsonString, serde_as}; +use serde_with::{serde_as, DisplayFromStr}; use super::{video_item::YouTubeListRendererWrap, ResponseContext}; @@ -10,7 +10,7 @@ use super::{video_item::YouTubeListRendererWrap, ResponseContext}; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Search { - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub estimated_results: Option, pub contents: Contents, pub response_context: ResponseContext, diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index 60d6141..a46b0a0 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -2,7 +2,7 @@ use once_cell::sync::Lazy; use regex::Regex; use serde::Deserialize; use serde_with::{ - json::JsonString, rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError, + rust::deserialize_ignore_any, serde_as, DefaultOnError, DisplayFromStr, VecSkipError, }; use time::OffsetDateTime; @@ -162,7 +162,7 @@ pub(crate) struct PlaylistVideoRenderer { pub title: String, #[serde(rename = "shortBylineText")] pub channel: TextComponent, - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub length_seconds: Option, /// Regular video: `["29K views", " • ", "13 years ago"]` /// Livestream: `["66K", " watching"]` @@ -192,7 +192,7 @@ pub(crate) struct PlaylistRenderer { /// The first item of this list contains the playlist thumbnail, /// subsequent items contain very small thumbnails of the next playlist videos pub thumbnails: Option>, - #[serde_as(as = "Option")] + #[serde_as(as = "Option")] pub video_count: Option, #[serde_as(as = "Option")] pub video_count_short_text: Option, @@ -248,7 +248,7 @@ pub(crate) struct YouTubeListRenderer { #[serde(rename_all = "camelCase")] pub(crate) struct UpcomingEventData { /// Unixtime in seconds - #[serde_as(as = "JsonString")] + #[serde_as(as = "DisplayFromStr")] pub start_time: i64, } diff --git a/src/serializer/range.rs b/src/serializer/range.rs index d05adbd..b61908d 100644 --- a/src/serializer/range.rs +++ b/src/serializer/range.rs @@ -1,12 +1,12 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use serde_with::{json::JsonString, serde_as, DeserializeAs, SerializeAs}; +use serde_with::{serde_as, DeserializeAs, DisplayFromStr, SerializeAs}; #[serde_as] #[derive(Deserialize, Serialize)] pub struct Range { - #[serde_as(as = "JsonString")] + #[serde_as(as = "DisplayFromStr")] start: u32, - #[serde_as(as = "JsonString")] + #[serde_as(as = "DisplayFromStr")] end: u32, } From a5ec111af43ef7be8f4cce0bb13467d1431e286e Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 13 Nov 2023 13:06:07 +0100 Subject: [PATCH 063/459] chore: update dependencies --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a1122fa..f6b75ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ quick-js-dtp = { version = "0.4.1", default-features = false, features = [ ] } once_cell = "1.12.0" regex = "1.6.0" -fancy-regex = "0.11.0" +fancy-regex = "0.12.0" thiserror = "1.0.36" url = "2.2.2" reqwest = { version = "0.11.11", default-features = false, features = [ @@ -59,7 +59,7 @@ ress = "0.11.4" phf = "0.11.1" base64 = "0.21.0" urlencoding = "2.1.2" -quick-xml = { version = "0.30.0", features = ["serialize"], optional = true } +quick-xml = { version = "0.31.0", features = ["serialize"], optional = true } tracing = { version = "0.1.37", features = ["log"] } [dev-dependencies] From 53a8ec680a3965a71b50ccbc7786fdf426c5fcdc Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 13 Nov 2023 13:53:29 +0100 Subject: [PATCH 064/459] fix: support podcast episodes in new videos --- src/client/music_new.rs | 5 +- src/client/response/music_item.rs | 52 +- ...ests__map_music_new_videos_w_podcasts.snap | 2948 ++ testfiles/music_new/videos_w_podcasts.json | 44183 ++++++++++++++++ tests/youtube.rs | 12 +- 5 files changed, 47180 insertions(+), 20 deletions(-) create mode 100644 src/client/snapshots/rustypipe__client__music_new__tests__map_music_new_videos_w_podcasts.snap create mode 100644 testfiles/music_new/videos_w_podcasts.json diff --git a/src/client/music_new.rs b/src/client/music_new.rs index 39914bb..c5cfc5f 100644 --- a/src/client/music_new.rs +++ b/src/client/music_new.rs @@ -112,13 +112,14 @@ mod tests { #[rstest] #[case::default("default")] + #[case::default("w_podcasts")] fn map_music_new_videos(#[case] name: &str) { let json_path = path!(*TESTFILES / "music_new" / format!("videos_{name}.json")); let json_file = File::open(json_path).unwrap(); - let new_albums: response::MusicNew = + let new_videos: response::MusicNew = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = new_albums + let map_res: MapResult> = new_videos .map_response("", Language::En, None, None) .unwrap(); diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index 95ab12e..4aa0b50 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -11,7 +11,7 @@ use crate::{ text::{Text, TextComponent, TextComponents}, MapResult, }, - util::{self, dictionary}, + util::{self, dictionary, timeago}, }; use super::{ @@ -780,10 +780,17 @@ impl MusicListMapper { .map(|st| map_album_type(st.first_str(), self.lang)) .unwrap_or_default(); - let (artists, by_va) = map_artists(subtitle_p2); - + let (mut artists, by_va) = map_artists(subtitle_p2); let artist_id = map_artist_id_fallback(item.menu, artists.first()); + // Album artist links may be invisible on the search page, so + // fall back to menu data + if let Some(a1) = artists.first_mut() { + if a1.id.is_none() { + a1.id = artist_id.clone(); + } + } + let year = subtitle_p3.and_then(|st| util::parse_numeric(st.first_str()).ok()); @@ -855,23 +862,38 @@ impl MusicListMapper { match item.navigation_endpoint.music_page() { Some(music_page) => match music_page.typ { MusicPageType::Track { vtype } => { - let (artists, by_va) = map_artists(subtitle_p1); - - self.items.push(MusicItem::Track(TrackItem { - id: music_page.id, - name: item.title, - duration: None, - cover: item.thumbnail_renderer.into(), - artist_id: artists.first().and_then(|a| a.id.clone()), - artists, - album: None, - view_count: subtitle_p2.and_then(|c| { + let (artists, by_va, view_count, duration) = if vtype == MusicVideoType::Episode + { + let (artists, by_va) = map_artists(subtitle_p2); + let duration = subtitle_p1.and_then(|s| { + timeago::parse_video_duration_or_warn( + self.lang, + s.first_str(), + &mut self.warnings, + ) + }); + (artists, by_va, None, duration) + } else { + let (artists, by_va) = map_artists(subtitle_p1); + let view_count = subtitle_p2.and_then(|c| { util::parse_large_numstr_or_warn( c.first_str(), self.lang, &mut self.warnings, ) - }), + }); + (artists, by_va, view_count, None) + }; + + self.items.push(MusicItem::Track(TrackItem { + id: music_page.id, + name: item.title, + duration, + cover: item.thumbnail_renderer.into(), + artist_id: artists.first().and_then(|a| a.id.clone()), + artists, + album: None, + view_count, is_video: vtype.is_video(), track_nr: None, by_va, diff --git a/src/client/snapshots/rustypipe__client__music_new__tests__map_music_new_videos_w_podcasts.snap b/src/client/snapshots/rustypipe__client__music_new__tests__map_music_new_videos_w_podcasts.snap new file mode 100644 index 0000000..0b7b665 --- /dev/null +++ b/src/client/snapshots/rustypipe__client__music_new__tests__map_music_new_videos_w_podcasts.snap @@ -0,0 +1,2948 @@ +--- +source: src/client/music_new.rs +expression: map_res.c +--- +[ + TrackItem( + id: "lbDo8whgkFQ", + name: "Solstitiu", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/lbDo8whgkFQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nLW1yMYgYCF3CJdxUCTNVkNrAnKQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/lbDo8whgkFQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kTk54K9_F5dhL9Uu8KlMcnyn79KQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCl7jsog9v_M5SgdWeSEXpRA"), + name: "Andia", + ), + ], + artist_id: Some("UCl7jsog9v_M5SgdWeSEXpRA"), + album: None, + view_count: Some(428000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "_UN2gwabRBI", + name: "Me Atraiu (Reimagined)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/_UN2gwabRBI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3miYl4FHFvgpoNn_JFqLukAbM_hnA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/_UN2gwabRBI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kxCu0yjEJa_9v0xjCfXKFwM7aNlQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCtilVkO8eHizeFSs5s5vvCA"), + name: "Gabriela Rocha", + ), + ], + artist_id: Some("UCtilVkO8eHizeFSs5s5vvCA"), + album: None, + view_count: Some(377000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "aY72b4ZGPbo", + name: "Lonkotina", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/aY72b4ZGPbo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mfas-_L3rAKmpbkaEdHGmRNzFlkQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/aY72b4ZGPbo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kU4o9o5oEqX130QmjSvP6CqdqxAw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC3i0iDG8jrpTvxgoeDoskbg"), + name: "Mia Guisse", + ), + ], + artist_id: Some("UC3i0iDG8jrpTvxgoeDoskbg"), + album: None, + view_count: Some(2200000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Cu82AvG87_g", + name: "Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Cu82AvG87_g/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k9cAzknavOHHqEdPHcsQNMmG5idA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Cu82AvG87_g/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nYzeB3MPHTBwZue8VhUTy2pEiUFA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCtNte05ndJf0BEN3hSmVEYQ"), + name: "Anaskhan0064", + ), + ], + artist_id: Some("UCtNte05ndJf0BEN3hSmVEYQ"), + album: None, + view_count: Some(123000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "p9R94XSYjwI", + name: "Mbesa Ime", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/p9R94XSYjwI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kwyALdMVf5R9F3VHJHtjXUfsYTkw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/p9R94XSYjwI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l55JeeVE2Gbrnlv7pkTlczQiwKug", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCLLh_wXspYOzRoOUWUCyu8A"), + name: "Greta Koci", + ), + ], + artist_id: Some("UCLLh_wXspYOzRoOUWUCyu8A"), + album: None, + view_count: Some(1700000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Tlg574e9fuU", + name: "BÈO DẠT MÂY TRÔI | MV OST NGƯỜI VỢ CUỐI CÙNG | THÙY CHI", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Tlg574e9fuU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lTsMQ1ptpxCT6t5vXATLLepaDamg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Tlg574e9fuU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lJqmmSqDQP3J_zV7lOXi50W-SXnA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCR5Q898Ou0J9eR5gQFFbExw"), + name: "Thùy Chi", + ), + ], + artist_id: Some("UCR5Q898Ou0J9eR5gQFFbExw"), + album: None, + view_count: Some(1000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "1L-RpSmlWp0", + name: "Mamma Che Paura", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1L-RpSmlWp0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nVUjyjKlr44bpX9giddaz357B1ow", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/1L-RpSmlWp0/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kNkqtjw3buOCtXJp3mMhREvpvYag", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCAravTV5JMlA34hSiFeLphQ"), + name: "Me contro Te", + ), + ], + artist_id: Some("UCAravTV5JMlA34hSiFeLphQ"), + album: None, + view_count: Some(1100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "EI28gmgBMfw", + name: "Oameni", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/EI28gmgBMfw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kBJaHIDbrj4KWhDnJ9Znn0_AjLaA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/EI28gmgBMfw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mrhJ_-BHvsjB-etrXsd-dCJ3-Z3g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCqfnM1n2W4KwqeLZjm70_5w"), + name: "Smiley", + ), + ], + artist_id: Some("UCqfnM1n2W4KwqeLZjm70_5w"), + album: None, + view_count: Some(574000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Z1DEwM1E7ho", + name: "Stinge luminile (From \"Miami Bici 2\" The Movie)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Z1DEwM1E7ho/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lj5T_2NDsYETT7_ffONwoosMnTmg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Z1DEwM1E7ho/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l21X7ai3j8qLBJLfXx3aFl2pnktg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC2ssqTYToKpthovpsXR_V9A"), + name: "Irina Rimes", + ), + ArtistId( + id: Some("UC4X0f6_0a77pL0ZtjpCo7sw"), + name: "Theo Rose", + ), + ], + artist_id: Some("UC2ssqTYToKpthovpsXR_V9A"), + album: None, + view_count: Some(531000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "hqnDi07CsJU", + name: "Yakofi Khar", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/hqnDi07CsJU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kf9M7hLltl8IgjBn3k7lmRVE2XgQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/hqnDi07CsJU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kR3QvyhUtWQTOgVNvN8srWYxzD2w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC7eTn3T3sbweHz9TJJYxoqQ"), + name: "Jahman X-press", + ), + ], + artist_id: Some("UC7eTn3T3sbweHz9TJJYxoqQ"), + album: None, + view_count: Some(888000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "_T2tvIwOMfc", + name: "Wild n Rich (Official Music Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/_T2tvIwOMfc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mM8xuUolB0lEyzaS1L0GaCgPCcoA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/_T2tvIwOMfc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mtJsunpizD44kNDZSKMEZnh8029Q", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCzt2dORSFzAiwRNUOpg1Gng"), + name: "450VEVO", + ), + ], + artist_id: Some("UCzt2dORSFzAiwRNUOpg1Gng"), + album: None, + view_count: Some(1100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "seDc-M7aSOI", + name: "Fifi - Nale (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/seDc-M7aSOI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nguts_d0_WMTK0uE70ibOTX0hzHw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/seDc-M7aSOI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3ljvEzyLUZmy7TP55pB0AkkDNXKYg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCS-F4K78yXD6b53lypQXVmA"), + name: "FIFI", + ), + ], + artist_id: Some("UCS-F4K78yXD6b53lypQXVmA"), + album: None, + view_count: Some(625000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "APJAQoSCwuA", + name: "Now And Then - The Last Beatles Song (Short Film)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/APJAQoSCwuA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nSfCW4utM6udXbAhygK9Y47lCPMQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/APJAQoSCwuA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n_xbuQtF0_vimsxEBR27RZ6FK_UA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC4dqLAF7yT-_DqeYisQ001w"), + name: "TheBeatlesVEVO", + ), + ], + artist_id: Some("UC4dqLAF7yT-_DqeYisQ001w"), + album: None, + view_count: Some(6400000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "965Lv2AwODM", + name: "Cục Vợ ơi, lấy anh nha!- Bài hát đón cô dâu Puka ở lễ cưới biển của chú rể Gin Tuấn Kiệt [Official]", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/965Lv2AwODM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lxe-n4PCN52XnQ7bQ7cvpLWCXodw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/965Lv2AwODM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nQGscZcu-k8Px1SIvrKIsuE_cOEA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCICfl8cwTSkZ_kUZ7tLnfBw"), + name: "Gin Tuan Kiet", + ), + ], + artist_id: Some("UCICfl8cwTSkZ_kUZ7tLnfBw"), + album: None, + view_count: Some(1700000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Yl7NAOn0YJw", + name: "Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Yl7NAOn0YJw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lu_0rue-4cMAhH23-TsvhxGzjDgw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Yl7NAOn0YJw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kMOokskbXhCSRkOH46Ziq_3ZGT7Q", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCg-EvXRjoIqX6IjDB1F09XA"), + name: "Mctp", + ), + ], + artist_id: Some("UCg-EvXRjoIqX6IjDB1F09XA"), + album: None, + view_count: Some(115000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "TVhoS5qhVi4", + name: "Alban Skenderaj - SIKUR TA DIJA", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/TVhoS5qhVi4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mg7lGS1erM7Fv0FbhJ1gMuNEYdgw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/TVhoS5qhVi4/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muIK7IGn5r59EkdqQc2tdNyF8Oow", + width: 426, + height: 240, + ), + ], + artists: [ + ArtistId( + id: Some("UCb18v2rxFjfofBw68qhdJOg"), + name: "Alban Skënderaj", + ), + ], + artist_id: Some("UCb18v2rxFjfofBw68qhdJOg"), + album: None, + view_count: Some(609000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "dZdaP7DGze4", + name: "O INEVITÁVEL!", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/dZdaP7DGze4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3liDO2D1Ht_CZUEHjWW9oY4aWL8PA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/dZdaP7DGze4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m-9uB_CGEqo2jeHayHnR6FZCgj7w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCkBzk1A-RnBs_1OArpSeAFw"), + name: "FutParódias", + ), + ], + artist_id: Some("UCkBzk1A-RnBs_1OArpSeAFw"), + album: None, + view_count: Some(1600000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "SsizZ2VZe6c", + name: "How Do You Choose", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/SsizZ2VZe6c/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lbINaiOC-KaayggAfHhNmfNTT7TA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/SsizZ2VZe6c/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kQMRdjkXfgA4Oip26nTMGSlF1B_A", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC8DMv_5z36X8mpS-VPATVKA"), + name: "Scotty Hasting", + ), + ], + artist_id: Some("UC8DMv_5z36X8mpS-VPATVKA"), + album: None, + view_count: Some(13000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "xFRIddDw8bw", + name: "Vinicius", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/xFRIddDw8bw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nOCzqlgkxpOzBWvm5sOPm6f_-q-g", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/xFRIddDw8bw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mrTxU5aG0DopMkRLf4Lxq17a9gCQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCBNTNHPngOpC-yeC8VpAPJQ"), + name: "Ninho", + ), + ], + artist_id: Some("UCBNTNHPngOpC-yeC8VpAPJQ"), + album: None, + view_count: Some(2000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Rbhky_2qIUo", + name: "Sijalewa", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Rbhky_2qIUo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lWPJ0fGGUPCSNJh1oOOygYE0v1BQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Rbhky_2qIUo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lmFEYI7Uo4i_88reUl00ChJfS10Q", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCX8lsVmQtu9m1l5n3KDniMw"), + name: "Harmonize", + ), + ], + artist_id: Some("UCX8lsVmQtu9m1l5n3KDniMw"), + album: None, + view_count: Some(1000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "ECovqS_ItUo", + name: "Culita Sterp & Jador - Fosta mea iubire 🫢 [oficial video] 2023", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ECovqS_ItUo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kdQBoviap8Xb0L5D9m-q5IeSUV3Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/ECovqS_ItUo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kGniy4Gd-brp8pZ8r9ov6w-VoaYQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC8RdjfDbLzA8CYRjsi6gvgw"), + name: "Culita Sterp", + ), + ], + artist_id: Some("UC8RdjfDbLzA8CYRjsi6gvgw"), + album: None, + view_count: Some(865000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "uxP0y-m6ysA", + name: "Govi Reka & Sara Pik me rrema FlowMusic 1", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/uxP0y-m6ysA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nEpu8aS91RPKhEGtHqGKNI_EwTRw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/uxP0y-m6ysA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kK3UJmRVhsj9R7q58oeCVhpu_lEA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCdKSviUrXNT9SjC8e-jEJQQ"), + name: "Govi Reka", + ), + ], + artist_id: Some("UCdKSviUrXNT9SjC8e-jEJQQ"), + album: None, + view_count: Some(14000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "simC880SUGk", + name: "MOZZIK - ZANI", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/simC880SUGk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mftRuSLp2E9nLlbdH7opRo0v7-Gw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/simC880SUGk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n7MsQ14VzbqgXGcWqrZAkOOEy0VA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCBI6li04V1aWOFrs9jjPomQ"), + name: "Mozzik", + ), + ], + artist_id: Some("UCBI6li04V1aWOFrs9jjPomQ"), + album: None, + view_count: Some(1600000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "dGLVJ35_gnA", + name: "Odín", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/dGLVJ35_gnA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nKxyxWr6wEQKx8yBTyhs9dSdT8kw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/dGLVJ35_gnA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nl7lLGqCT1xkkuqOKK0S18namvZw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCCQBpFm05uyBgLNDMFgoBYQ"), + name: "Rodrigo Septién", + ), + ], + artist_id: Some("UCCQBpFm05uyBgLNDMFgoBYQ"), + album: None, + view_count: Some(133000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "vY6UiUDPuMk", + name: "เล\u{e35}\u{e49}ยงไข\u{e49} (fever) (feat. The TOYS)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/vY6UiUDPuMk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nvjfX_qIGdsFY-gj7_OgBJOPy5xw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/vY6UiUDPuMk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3ndNjxbFJF2zuyoPaghK3lCWQhzCw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCH37fMa51kuvqaHjQyPUbQw"), + name: "BOWKYLION", + ), + ], + artist_id: Some("UCH37fMa51kuvqaHjQyPUbQw"), + album: None, + view_count: Some(2000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "QMQw_waEPi0", + name: "STARBOYS", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/QMQw_waEPi0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lfsi1LZ0PBTczrdhyxA7NGilfvmg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/QMQw_waEPi0/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nifikciv2zBU2HwOkmojeTw_AEag", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCame-clC-0couNMsqr_U21w"), + name: "FANTASTICS from EXILE TRIBE", + ), + ], + artist_id: Some("UCame-clC-0couNMsqr_U21w"), + album: None, + view_count: Some(1100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Sc2-3BK2mzM", + name: "Palpita (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Sc2-3BK2mzM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3ldKdcDYSpL3N106EblH4gCff7AUQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Sc2-3BK2mzM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kxW2WOcsldGAoUkG3Zo2fB7xefqQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCJ2m-WpROlZCiZZID9r7NSQ"), + name: "Diljit Dosanjh", + ), + ArtistId( + id: Some("UC0l2FUrxXnO8XwR0eqb-Nsg"), + name: "Camilo", + ), + ], + artist_id: Some("UCJ2m-WpROlZCiZZID9r7NSQ"), + album: None, + view_count: Some(875000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "bprHBlahnmM", + name: "Feel Good", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/bprHBlahnmM/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3lZGW8TEUMVw2BE3dX5qkAitEFXxg", + width: 320, + height: 180, + ), + ], + artists: [ + ArtistId( + id: Some("UCUApRKc5Uc-rDP2QET6eieg"), + name: "Jaime Wyatt", + ), + ], + artist_id: Some("UCUApRKc5Uc-rDP2QET6eieg"), + album: None, + view_count: Some(44000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "FMhHc5x2DzE", + name: "KOJO – Amsterdam (feat. Calin)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/FMhHc5x2DzE/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mH3siFh5e2JHEQSvEOJvncGLZQDA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/FMhHc5x2DzE/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3luDDLWUFEtW7InFw9tPTYFCdmoOg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCwiGKkQcOlzMpXOc1xHFoeg"), + name: "Calin", + ), + ], + artist_id: Some("UCwiGKkQcOlzMpXOc1xHFoeg"), + album: None, + view_count: Some(119000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "nOjbJdw2dPs", + name: "Man To Man (Official Visualizer)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/nOjbJdw2dPs/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kHhuH5SLAn-vTuNpBtKdgWmLX39w", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/nOjbJdw2dPs/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l8g_q8EQQWC2t_kGnkjcy20y8wgQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCSZUc2vHq3Z54Lcw7UgydYQ"), + name: "Freeman HKD", + ), + ], + artist_id: Some("UCSZUc2vHq3Z54Lcw7UgydYQ"), + album: None, + view_count: Some(298000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "1G1zcTV5yX4", + name: "Those Eyes", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1G1zcTV5yX4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l7LlyEgeyZZfCB_xMQO-5O0QJVgA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/1G1zcTV5yX4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nRKV6MFk1bLD4eW3KaIX3r6iPU4g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCVS6hZxkuygm-EzXHxWKbJQ"), + name: "Amrit Maan", + ), + ], + artist_id: Some("UCVS6hZxkuygm-EzXHxWKbJQ"), + album: None, + view_count: Some(2600000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "BcbKoY7XpJE", + name: "Trio Mandili - Psalm 50", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/BcbKoY7XpJE/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muuMAdW1t_ndO9ORJt7zQf_nwITg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/BcbKoY7XpJE/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kQbsQ9MecuO6-rfmeABL28L-Jfmg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCuxZXXFOL3K3kEFGiAnp-Kw"), + name: "Trio Mandili", + ), + ], + artist_id: Some("UCuxZXXFOL3K3kEFGiAnp-Kw"), + album: None, + view_count: Some(120000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "mq6zggKZTFU", + name: "Main Phir Bhi Tumko Chaahunga ((Jhankar)) Arijit Singh | Arjun Kapoor, Shraddha K | Half Girlfriend", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/mq6zggKZTFU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mobGQ50xATxZxQ7OfFIYjV3ssqWQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/mq6zggKZTFU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lLrGBJmTv20ji9EGR6cEmDKu_JCA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCtNte05ndJf0BEN3hSmVEYQ"), + name: "Anaskhan0064", + ), + ], + artist_id: Some("UCtNte05ndJf0BEN3hSmVEYQ"), + album: None, + view_count: Some(100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "aQFl1xhloVo", + name: "Dil Ne Yeh Kaha (Love Song) Alka Y, Kumar S, Udit N | Dhadkan | Akshay Kumar, Sunil Shetty, Shilpa S", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/aQFl1xhloVo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kCYB8WC29f4CTJFwhSK5Z1lXqy-Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/aQFl1xhloVo/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lEuckq-NzuNMGv8j6tOOjBktMdnA", + width: 426, + height: 240, + ), + ], + artists: [ + ArtistId( + id: Some("UC0wV8tkoYYHxuEXgcQEQ7zA"), + name: "Md Amir Hamja", + ), + ], + artist_id: Some("UC0wV8tkoYYHxuEXgcQEQ7zA"), + album: None, + view_count: Some(1000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "A3IhjA2aMUg", + name: "Masithokoze (Official Music Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/A3IhjA2aMUg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l-X1WHCQiDFLN8TIyOr3Ln_9aNpA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/A3IhjA2aMUg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mKUdo8MP0YBjm2h5lqURO1_z6dXw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCEvEiysS7crVEnNAXIx77tw"), + name: "DJ Stokie", + ), + ArtistId( + id: Some("UC01dDw3dxoeaZGVL2HiNBvA"), + name: "Eemoh", + ), + ], + artist_id: Some("UCEvEiysS7crVEnNAXIx77tw"), + album: None, + view_count: Some(587000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "cxIOWM0xLc4", + name: "Kivumbi King - Wine (Official Music Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/cxIOWM0xLc4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l6JZ8sLRXsC9L6Ws_58lb0RllZFg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/cxIOWM0xLc4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3netHLf6Y7ATJJpE-fvA-Sd36YekA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCXHklVWUoqHEKrcaJ5JixKw"), + name: "Kivumbi king", + ), + ], + artist_id: Some("UCXHklVWUoqHEKrcaJ5JixKw"), + album: None, + view_count: Some(137000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "IFKAgKgVaSI", + name: "Mombasa Nairobi", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/IFKAgKgVaSI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mUaaFNpI0Us5y7LI28dncTZR7OXg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/IFKAgKgVaSI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kohd7W_OhB8vibDrsvbZapQKYiSQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCn30hmDp52npfCIHHgULM7A"), + name: "Baba Harare", + ), + ], + artist_id: Some("UCn30hmDp52npfCIHHgULM7A"), + album: None, + view_count: Some(154000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "iGUN99hW3nU", + name: "LILA - ANASAINO KAI ZALIZOMAI (Official Music Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/iGUN99hW3nU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n_u9BAV02NAgdgwnBEhFIyEuHAvg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/iGUN99hW3nU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lbk5MlwB-PZeKpKSc9BVO02xfdIw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Barcode Entertainment", + ), + ], + artist_id: None, + album: None, + view_count: Some(1000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "_alKEACsIds", + name: "ฮ\u{e49}อยฮ\u{e31}ก", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/_alKEACsIds/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l9YO5aHTy7bzIiv0uRJugVuEl_Nw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/_alKEACsIds/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nfBJFMzBWveP1LxumubgWtOmPR8g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Tai Orathai & TOEY APIWAT", + ), + ], + artist_id: None, + album: None, + view_count: Some(913000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "WGNJIF7OoAc", + name: "No han cambiado", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/WGNJIF7OoAc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n5GERxK8v5L1zNOLOn8Vbnpy34Mw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/WGNJIF7OoAc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nNht-elEFxY2EFSOn78o4gcLex6g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCoHMUugeU6PWB9ePTOV7WJw"), + name: "Morad", + ), + ], + artist_id: Some("UCoHMUugeU6PWB9ePTOV7WJw"), + album: None, + view_count: Some(1900000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "a_TotMZ5hxc", + name: "Zero cukru", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/a_TotMZ5hxc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3m-Vb1g7oHUMgtw4tjpgl_lIO8trg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/a_TotMZ5hxc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nm2Tin71UyK0ULtLuEacBu2ORBYQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCLCR-FbVVq1GsETOtdGG-mw"), + name: "Gibbs", + ), + ArtistId( + id: Some("UC1IrhHynbHqZneNyNnTQMxA"), + name: "Jonatan", + ), + ], + artist_id: Some("UCLCR-FbVVq1GsETOtdGG-mw"), + album: None, + view_count: Some(681000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "0eoeyKkWBRs", + name: "Alma Viajera (En Vivo)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/0eoeyKkWBRs/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nlXPwget3zjP8wadYENJwNulJqVQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/0eoeyKkWBRs/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k8vSx9iCTBRi02u0XGr4-7afWYDg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Mancel Cardenas & Chico Soto", + ), + ], + artist_id: None, + album: None, + view_count: Some(19000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "DU4NtqyTnuM", + name: "Akatsuki", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/DU4NtqyTnuM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3knlRDwvOAtLfNJ8Ox6vSBbqcvR3Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/DU4NtqyTnuM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mqFBMjr2H-0Ubq-haBSzimxiDGwA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCu3WJjXqlYozV9s8sGYPySA"), + name: "Maes", + ), + ], + artist_id: Some("UCu3WJjXqlYozV9s8sGYPySA"), + album: None, + view_count: Some(1700000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "kLbn61Z4LDI", + name: "Feather (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/kLbn61Z4LDI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kUOqHNcZM6tkhMM6mIM20FG5aiNA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/kLbn61Z4LDI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k4qo7l1DucPx0nezG9FSiPEwpOsQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCz51ZodJbYUNfkdPHOjJKKw"), + name: "Sabrina Carpenter", + ), + ], + artist_id: Some("UCz51ZodJbYUNfkdPHOjJKKw"), + album: None, + view_count: Some(7000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "vMFNI5lOLwU", + name: "Pata Dedunu", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/vMFNI5lOLwU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n30tE3s7nJpt_Hli18N_iCkk3cfg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/vMFNI5lOLwU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nzpYgdzUaPIJ952Re0Mrc-Woq2EA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCSRPntvq2xLXQtZwE2fA__w"), + name: "Sunil Edirisinghe", + ), + ArtistId( + id: Some("UCTDvPJSG1cge8b_MTMidh7w"), + name: "Kumaradasa Saputhanthri", + ), + ArtistId( + id: Some("UCbuvpPfaAmLHZw5sFaj4Rog"), + name: "Rohana Weerasinghe", + ), + ], + artist_id: Some("UCSRPntvq2xLXQtZwE2fA__w"), + album: None, + view_count: Some(43000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "AZoZbtI67Yk", + name: "가시", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/AZoZbtI67Yk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mrr__dZksyNjsPPlAs-Fe97odpTw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/AZoZbtI67Yk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n5QsNlPqqQfhxkL_Z7ZkblTisJpA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCjikjZ91JLx_e-2i9nrhhSg"), + name: "ZEROBASEONE", + ), + ], + artist_id: Some("UCjikjZ91JLx_e-2i9nrhhSg"), + album: None, + view_count: Some(21000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Ah4Dn3VAnMk", + name: "Badman Love", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Ah4Dn3VAnMk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3luhVL6JPpgDDCW4bYMVxF5YZP_wA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Ah4Dn3VAnMk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kaIyaa4MsdhRYqb1D8KWVGN98q0Q", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCIHQbC5CEmgPkBKO9gOXyBQ"), + name: "Jayboogz", + ), + ], + artist_id: Some("UCIHQbC5CEmgPkBKO9gOXyBQ"), + album: None, + view_count: Some(138000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "sLklEvxhmAQ", + name: "Vado Más Ki Ás ft Rafa G & Estraca - Todo o Terreno", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/sLklEvxhmAQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k0CCEn6m4H_y99ALl5BJEKICRX9g", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/sLklEvxhmAQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lbkAv4Ty7v-Rb3_t55ZxJginh22A", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCC_ZUtrLVilXKVbOJB3wDVA"), + name: "Vado Más Ki Ás", + ), + ], + artist_id: Some("UCC_ZUtrLVilXKVbOJB3wDVA"), + album: None, + view_count: Some(134000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "2Lbp1P4pP6c", + name: "Likkle Law Boss (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/2Lbp1P4pP6c/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lDYgmtahVVsARdXFf8NX6eyvS8fQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/2Lbp1P4pP6c/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3npIS4xF3MyqCwDDkLJo-7KLwAWJg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCksBsDumncwulY5-MC6xWDA"), + name: "Chronic Law", + ), + ], + artist_id: Some("UCksBsDumncwulY5-MC6xWDA"), + album: None, + view_count: Some(612000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "2TYIa09PXyo", + name: "BAARISH KE AANE SE", + duration: Some(244), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/2TYIa09PXyo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lQs5iJK1V7G2sNLxtNd41o2-oArw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/2TYIa09PXyo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nwWkjKJLrm-feMF4ULJfE6krmHXQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCrC-7fsdTCYeaRBpwA6j-Eg"), + name: "Shreya Ghoshal", + ), + ], + artist_id: Some("UCrC-7fsdTCYeaRBpwA6j-Eg"), + album: None, + view_count: None, + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Hdy7l8fkREo", + name: "J\'Fais Que Danser", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Hdy7l8fkREo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mRnmv82uJ0CCdY0tO2vM_sD9ym8A", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Hdy7l8fkREo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mnn5HYwbUeo0rKF91lxjeax7Z8OQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCYO-8CIkoBoUG2nOWz57Q9g"), + name: "JUL", + ), + ], + artist_id: Some("UCYO-8CIkoBoUG2nOWz57Q9g"), + album: None, + view_count: Some(1700000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "A-sjPe3xvqY", + name: "INCUBI (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/A-sjPe3xvqY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lZpIuCnNWxuYrgJaJhnwEN8sUJ8g", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/A-sjPe3xvqY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kH3KkyGD7gBb4S_ywJo7d4DXvHCw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC5-_N4l38iyasppZ5MPILXg"), + name: "Noyz Narcos", + ), + ArtistId( + id: Some("UCeUme4ODz03aMX72dZWXsFw"), + name: "Salmo", + ), + ], + artist_id: Some("UC5-_N4l38iyasppZ5MPILXg"), + album: None, + view_count: Some(988000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "jFVX_v2yAas", + name: "Josephine - Μοίρα - Official Music Video", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/jFVX_v2yAas/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nnVsARIfXeRQ2OKz2-BWm11LwNoA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/jFVX_v2yAas/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lSUM_eVsGCb_SreMHHWXLnLdsllA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCLpm6-66iqUlOG28abww73w"), + name: "Josephine", + ), + ], + artist_id: Some("UCLpm6-66iqUlOG28abww73w"), + album: None, + view_count: Some(454000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "YDfL2Ns8wz4", + name: "Jivashe Nahi Tamara Vagar", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/YDfL2Ns8wz4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mrnSBrtgC0pPiWEVbMYpen3N3WJQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/YDfL2Ns8wz4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l1sxjBJiFUQAejLIiuyv3OImx_wQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC1rqUUukLEcgGBMChrH3y_w"), + name: "Kajal Maheriya", + ), + ], + artist_id: Some("UC1rqUUukLEcgGBMChrH3y_w"), + album: None, + view_count: Some(738000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "du4hVdxqyr8", + name: "OLHA PRA NÓS (feat. Carolina Deslandes)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/du4hVdxqyr8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nZaM1No81FXY3L2I6_Ap8tuAm1ZA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/du4hVdxqyr8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mr2ifLAwnCgQxjgFcDCLj7HuFsqA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCMXADr_MS_MdbOouS7ZMc8w"), + name: "Soraia Ramos", + ), + ], + artist_id: Some("UCMXADr_MS_MdbOouS7ZMc8w"), + album: None, + view_count: Some(234000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "G5vlW0PZ878", + name: "Emproblemao", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/G5vlW0PZ878/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lNTj6RlQkHbdUmzHd8bs9F5tv1Yw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/G5vlW0PZ878/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k2ZGt7Wv_hnIexrCIUeUyn1mV8rQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCN3lpPbZIK3CgTWTtriwWMQ"), + name: "Under Side 821", + ), + ], + artist_id: Some("UCN3lpPbZIK3CgTWTtriwWMQ"), + album: None, + view_count: Some(113000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Gtg2TSR19Mg", + name: "Daily Duppy (feat. GRM Daily)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Gtg2TSR19Mg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3m2vu6Vxtl9aze-eWFtiMJLA-Imwg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Gtg2TSR19Mg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lx9IaizBzDsjvR1srf6EvEEey4Zw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCiDD2aSYdgxSPE2YUm5lEjg"), + name: "Central Cee", + ), + ], + artist_id: Some("UCiDD2aSYdgxSPE2YUm5lEjg"), + album: None, + view_count: Some(702000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "vJ3wwezOV_8", + name: "Denis - Książę z Bajki (Official Video) Ambitne Disco Polo", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/vJ3wwezOV_8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k8IgehDTrUcFpjeWe0GUQnxQckFA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/vJ3wwezOV_8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mnyjXea09G0xWsPxc1Pap_c_Th0w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCMg_DZ4fMJGCohPYnBTLtpA"), + name: "Denis Impulsywni", + ), + ], + artist_id: Some("UCMg_DZ4fMJGCohPYnBTLtpA"), + album: None, + view_count: Some(72000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "76q5EiRyYks", + name: "Anonimus ရ\u{1032}\u{1037} သ\u{102e}ချင\u{103a}းသစ\u{103a} (မြ\u{102d}\u{102f}\u{1037}မအနောက\u{103a}ဘက\u{103a}) Official Music Vdo", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/76q5EiRyYks/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lzRPJr2yeWK-DBsbCYURjXo18FwQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/76q5EiRyYks/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k_nHonbwyRftbbxSVe5Rkj1f02yg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCn5SLnGaBcsusekOkSndmWg"), + name: "Ko Feel", + ), + ], + artist_id: Some("UCn5SLnGaBcsusekOkSndmWg"), + album: None, + view_count: Some(265000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "nEjntI9GMVM", + name: "TE AMO 2", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/nEjntI9GMVM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lb4YnUouthUbU5VOfpkR5YMHZFrA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/nEjntI9GMVM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k7LqTCFv-FIZhPd5Weq-ezEcS3OQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCiC_vxasVKRDBvZBaMIEGdg"), + name: "Berechet", + ), + ], + artist_id: Some("UCiC_vxasVKRDBvZBaMIEGdg"), + album: None, + view_count: Some(49000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Gtct_ipIQmo", + name: "Es geht vorbei", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Gtct_ipIQmo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lQ9zUeOzWrXEGPIYSK9oNf7XJHZA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Gtct_ipIQmo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nFgPtLbXhg9h9OJnS7K6fdZv4Cbg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCCXCwvd49sm9x_gp1nuv7uA"), + name: "Finder", + ), + ], + artist_id: Some("UCCXCwvd49sm9x_gp1nuv7uA"), + album: None, + view_count: Some(15000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "aw4kqTyZshk", + name: "No Man Bigger Than Coffin", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/aw4kqTyZshk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lcKyd_wB2ArahWpc_4iPWTrdpaYg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/aw4kqTyZshk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m0QSq7rNpN2I6H-IcH14tpGpePBQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC1pc0VjTVizL2FferDukw"), + name: "น\u{e49}ำ กชพร", + ), + ], + artist_id: Some("UCPC1pc0VjTVizL2FferDukw"), + album: None, + view_count: Some(332000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "xjoCNfK3vxo", + name: "Temps kônô", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/xjoCNfK3vxo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l6zWauyEH0IrXSlUJuEsRHTQOhTQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/xjoCNfK3vxo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lVyEygxTZTbZLiO6xoEm-AkH7C4Q", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCylwv7H2IUI_JWiA_2Mt5oA"), + name: "Yacou B Og", + ), + ], + artist_id: Some("UCylwv7H2IUI_JWiA_2Mt5oA"), + album: None, + view_count: Some(177000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "DN1gYO3bu-k", + name: "Kisi Din Banoongi Main | Raja (1995) | Madhuri Dixit | Sanjay Kapoor | Udit Narayan | Hindi Songs", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/DN1gYO3bu-k/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3mX2_1-rh9FtGhi-hNmI7WaV8FB4Q", + width: 320, + height: 180, + ), + ], + artists: [ + ArtistId( + id: Some("UCBvTykFO8_qxF0VtPm0ZjmA"), + name: "Mohammad Tanbiruzzaman Koushal", + ), + ], + artist_id: Some("UCBvTykFO8_qxF0VtPm0ZjmA"), + album: None, + view_count: Some(362000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "X_cqTeG7v98", + name: "ZOMBIE", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/X_cqTeG7v98/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3km0zoCTHO0YvtUG_wJPPAiW8bZMg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/X_cqTeG7v98/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kFwygtyf9AJCQrYlKjk6aiWYZGMg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Haval & Yasin", + ), + ], + artist_id: None, + album: None, + view_count: Some(103000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "b_B4ebhKvQ4", + name: "Built To Be Bad (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/b_B4ebhKvQ4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lqTjZN6SM7kO8z2r1kdUSnhJ3neg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/b_B4ebhKvQ4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nnVtHIjjga6AYc4zrvHarswqaPSg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC7aCpfjAUTxRWslugOpsjUg"), + name: "Grace Gachot", + ), + ], + artist_id: Some("UC7aCpfjAUTxRWslugOpsjUg"), + album: None, + view_count: Some(92000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "VQp1QmwOzxw", + name: "Jabse Dekha Hai Tumhe", + duration: Some(244), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/VQp1QmwOzxw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nG_T-YpvsRvbynRCucW8C5elvPXw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/VQp1QmwOzxw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n_ym4Te9g6Y59E7nfhvQDSFUqerw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC2-fS2PfXjiYYOhpmnCfDIw"), + name: "Suresh Wadkar", + ), + ], + artist_id: Some("UC2-fS2PfXjiYYOhpmnCfDIw"), + album: None, + view_count: None, + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "suAR1PYFNYA", + name: "Houdini", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/suAR1PYFNYA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kn4zno58Kuyyghco7sCi99yRIZ9Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/suAR1PYFNYA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kI2AhPcItcUX3Fi_r6D9J97UckpA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCzVb0SIXp9q9PeKCcFjsBtA"), + name: "Dua Lipa", + ), + ], + artist_id: Some("UCzVb0SIXp9q9PeKCcFjsBtA"), + album: None, + view_count: Some(25000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "No3Cr6ph-9U", + name: "CODE BARRE", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/No3Cr6ph-9U/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nyvA5jOWZY8i3chZOQP2eZ4RWArw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/No3Cr6ph-9U/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nQtBqGXm4bPxu9NjIYqHDqTctvzw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCkFIRlbak2lK--nCQXau_6g"), + name: "Lacrim", + ), + ], + artist_id: Some("UCkFIRlbak2lK--nCQXau_6g"), + album: None, + view_count: Some(1200000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "ORJEgiVY08U", + name: "Partyson", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ORJEgiVY08U/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kUbzYGxELaN7M2kfdNRU6xOGuZjw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/ORJEgiVY08U/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nD__VjYZyianIMOOLAEKOAN4mL1w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCOykHV9q0qb0vrBsxO_5fkQ"), + name: "Cris Mj", + ), + ], + artist_id: Some("UCOykHV9q0qb0vrBsxO_5fkQ"), + album: None, + view_count: Some(1100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "2px4-y1Y0PI", + name: "Still Believe In Love", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/2px4-y1Y0PI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n_Gi9InEt3bhEy1hBocbPypgqq0A", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/2px4-y1Y0PI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kybRz93boUe0G1wA-9i7IQ3mpScw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Vado & Mary J. Blige", + ), + ], + artist_id: None, + album: None, + view_count: Some(2000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "kchzKOizhGg", + name: "Tocao (feat. Zion & Lennox)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/kchzKOizhGg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nYXcBLe4W0j7lccFLKmS6vPPJN-w", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/kchzKOizhGg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nJFj99WuSUyfVR5Vh7wgUSX1yBjg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCofCirUtHXO7IL8AjWHytZQ"), + name: "Danny Romero", + ), + ], + artist_id: Some("UCofCirUtHXO7IL8AjWHytZQ"), + album: None, + view_count: Some(24000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "V6eAGSz4JI8", + name: "Dj Trap Atouna El Toufoule ( Atunatufuli ) Ful Bass Nguk Nguk Clarity Zainul 99", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/V6eAGSz4JI8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n8WA3hkVl2pySR7NZjT2bJnWFhDg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/V6eAGSz4JI8/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mrm-9s43zPPy2Ro7kNnQKKnYnamQ", + width: 426, + height: 240, + ), + ], + artists: [ + ArtistId( + id: Some("UClWLQP-lNGvEV5qJpy7DLhw"), + name: "zainul 99", + ), + ], + artist_id: Some("UClWLQP-lNGvEV5qJpy7DLhw"), + album: None, + view_count: Some(669000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "1A5hWzS00Nc", + name: "Srungara (From \"Aakasam Dhaati Vasthaava\")", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1A5hWzS00Nc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mOgQd32i2bXnWbSyfoRB4Vz3FBuQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/1A5hWzS00Nc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kK85ZAkCSWuEjICnpgb0jjJzccfQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Sanjith Hegde, Karthik, & Malavika Shankar", + ), + ], + artist_id: None, + album: None, + view_count: Some(590000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "bzsSkarE4zw", + name: "Ngozi", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/bzsSkarE4zw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muyW3dG_HZcykwYtJrjLiYPiPGHg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/bzsSkarE4zw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kENygW5EQb2c25-PhUqXhT0EpC6g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC97hKW1a1rzrMnzkKwaNx_g"), + name: "Crayon", + ), + ArtistId( + id: Some("UCO4TFKYiSDo7vOQC04mr7Fg"), + name: "Ayra Starr", + ), + ], + artist_id: Some("UC97hKW1a1rzrMnzkKwaNx_g"), + album: None, + view_count: Some(2600000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "59HJZIMVxAg", + name: "Slime Examination", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/59HJZIMVxAg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k4rpWuVlRwOfQByZHwUPWQv_dS0A", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/59HJZIMVxAg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lpmEtAyfsAKxZSQz2IBpS6H1V06Q", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCR28YDxjDE3ogQROaNdnRbQ"), + name: "YoungBoy Never Broke Again", + ), + ], + artist_id: Some("UCR28YDxjDE3ogQROaNdnRbQ"), + album: None, + view_count: Some(1300000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "8XQYz7JKjWI", + name: "VALENTINE", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/8XQYz7JKjWI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n_xoUNrTiegTMJK2RY6-W3Kya-jg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/8XQYz7JKjWI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3msIfwByUybxnVWLPAxhroBNFitbg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCqgwdYBhoUHmjrVxNhEUv4g"), + name: "Måneskin", + ), + ], + artist_id: Some("UCqgwdYBhoUHmjrVxNhEUv4g"), + album: None, + view_count: Some(1400000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "5FkJkpTWSWk", + name: "Apsara", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/5FkJkpTWSWk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nlXmZZlE68G8qOdinF1r6YBTml6g", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/5FkJkpTWSWk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lzQAmCUfL57T4DOQqKQn9UVG9g3w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCrmhl-Xsb9LW5WYtC2iHe6A"), + name: "Jus Keys", + ), + ArtistId( + id: Some("UC9jWrVmoHGRk9qQ-d7c6IHw"), + name: "Raman Romana", + ), + ArtistId( + id: Some("UC4oVRdVXvQMfYvYhNypXGqw"), + name: "Shiv Nevergive Up", + ), + ], + artist_id: Some("UCrmhl-Xsb9LW5WYtC2iHe6A"), + album: None, + view_count: Some(12000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "1m51ncAU4uA", + name: "LA CHAMBA", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1m51ncAU4uA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mhf22d42eWk1SCBkq0rbcaDKTWvw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/1m51ncAU4uA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lgnAgrDUvdLRi_7o9yfIVoq070Gw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCzmabbKsmXlWnI9N2kKQ4lA"), + name: "Peso Pluma", + ), + ArtistId( + id: Some("UCVcAt8IIKIeubRSigcYXgtA"), + name: "Arcangel", + ), + ], + artist_id: Some("UCzmabbKsmXlWnI9N2kKQ4lA"), + album: None, + view_count: Some(10000000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "Ycff6mFkoPY", + name: "မြ\u{102d}\u{102f}\u{1037}မအနောက\u{103a}ဘက\u{103a} - Anonimus (Official Music Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Ycff6mFkoPY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mTLIjp4RSGtftfnnWsEwMvXvCaSQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/Ycff6mFkoPY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kIFGor9RkVTb26j9Jsm4v06g7rxw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC4yEk8HA1s1-OmMOJSCyg0A"), + name: "Tommy Kyaw", + ), + ], + artist_id: Some("UC4yEk8HA1s1-OmMOJSCyg0A"), + album: None, + view_count: Some(488000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "g0ghPuWqYR0", + name: "Ney Veyrey", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/g0ghPuWqYR0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k1b4jYKFY1QxUvWbmmXlPtNvHEgA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/g0ghPuWqYR0/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nvK2WV2lztXwoPOSZftLf9WURQVQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Karthik", + ), + ], + artist_id: None, + album: None, + view_count: Some(6800000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "1YiTQJcKajE", + name: "HUMANS AND MONSTERS", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1YiTQJcKajE/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n0fx0CFRGOdPYV-OA6UOZPKVdFHg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/1YiTQJcKajE/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3liCJgUvwBoop7apl8kyGPryIkDQA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCf4l_B9IhzstPp8elVeHnTQ"), + name: "Lil Darkie", + ), + ], + artist_id: Some("UCf4l_B9IhzstPp8elVeHnTQ"), + album: None, + view_count: Some(637000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "TuyisGsNr4g", + name: "To Be A Man (Remix) (feat. Darius Rucker)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/TuyisGsNr4g/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kvU7S3OY2VXbFHilINd7aOO625-g", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/TuyisGsNr4g/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lPAECXmw98w3iw9u0GTMYX0Z76Xw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCC0ydtpsVWZNHLvKSf4MnYw"), + name: "Dax", + ), + ], + artist_id: Some("UCC0ydtpsVWZNHLvKSf4MnYw"), + album: None, + view_count: Some(3900000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "ClU3aqamHGQ", + name: "Semi Auto (feat. Wazir Patar)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ClU3aqamHGQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kWQTX51J0RIBcnIItKor0J1trv-Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/ClU3aqamHGQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lN-CQOdUqDEXGIidKTFHnkpwL73g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC7a1tClTvIIttpI-r2PwiQA"), + name: "Jordan Sandhu", + ), + ], + artist_id: Some("UC7a1tClTvIIttpI-r2PwiQA"), + album: None, + view_count: Some(1200000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "bYyB3FzPRfg", + name: "New Rajasthani Song 2023 | Dhima Dhima Muskave Bansa | Bablu Ankiya | Happy Singh | New Marwadi Song", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/bYyB3FzPRfg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mViyjZgUnkVXvzSb-BGIO6Q_KR2g", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/bYyB3FzPRfg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lNShVtYBgPdDL9dICyiwW7lJzKsw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCBvOwJ62CE_EdXLhrFceElg"), + name: "Happy Singh", + ), + ArtistId( + id: Some("UCcNa2qB8K2wrK7RDqyEMGrA"), + name: "Bablu Ankiya", + ), + ], + artist_id: Some("UCBvOwJ62CE_EdXLhrFceElg"), + album: None, + view_count: Some(272000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "I5eu4XMWZR8", + name: "suretigai", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/I5eu4XMWZR8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mPl2BxY_r3qrBfT5ktCavQsjjVzQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/I5eu4XMWZR8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m2_ruHKye6BP3nv6OvW1aytyofXQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC3PFoXZPFJGy9F4PG84nNQQ"), + name: "Soala", + ), + ], + artist_id: Some("UC3PFoXZPFJGy9F4PG84nNQQ"), + album: None, + view_count: Some(371000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "ziNtA-mcXTY", + name: "ข\u{e49}ามเวลา Ost.พรหมล\u{e34}ข\u{e34}ต | Violette Wautier | Official MV", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ziNtA-mcXTY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nVs_L5lSXhqwwOJxOyBM8FWmqGyg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/ziNtA-mcXTY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kbhnT8euOjgI9RekNf6Z4Xt07agg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Violette Wautier", + ), + ], + artist_id: None, + album: None, + view_count: Some(3200000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "CDEikOST7ZQ", + name: "Pehli Dafaa Is Dil Mein (From \"Hulchul\")", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/CDEikOST7ZQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lMv4ENusToeIDsZy39kTfqzNSfaQ", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/CDEikOST7ZQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mXKEDpxAVtRHVSvjX9wh5Fwxp2lA", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCQd9dydn5gaib_uuVVkYZTQ"), + name: "Kumar Sanu", + ), + ArtistId( + id: Some("UCptBkLZ6XRxoyn8SkUMc_Iw"), + name: "Alka Yagnik", + ), + ], + artist_id: Some("UCQd9dydn5gaib_uuVVkYZTQ"), + album: None, + view_count: Some(42000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "YQzvJSR5jy8", + name: "ธรรมดา", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/YQzvJSR5jy8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mzfmV4FgVgTW84VrbTtY9Jcv793Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/YQzvJSR5jy8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nJkWSEojdmb6xJCL5Vx8p65kZZIg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UC1snMKQQ0kl280XfQmg9tpQ"), + name: "DIAMOND MQT", + ), + ], + artist_id: Some("UC1snMKQQ0kl280XfQmg9tpQ"), + album: None, + view_count: Some(657000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "lPaplIqUXJc", + name: "XOTÃO PESADA AO VIVO NO BOTECO NETINHO BRITO O Judiador Dos Corações Apaixonados", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/lPaplIqUXJc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l3XGpagM9oDWS8oP7AG1uTpOATRg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/lPaplIqUXJc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nYUmlFAwpZGMU5pBn3W92wzW5wcQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCsIkF_bbTB9jjGIkT4j82rQ"), + name: "Netinho Brito", + ), + ], + artist_id: Some("UCsIkF_bbTB9jjGIkT4j82rQ"), + album: None, + view_count: Some(49000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "78Y0SxVVxP4", + name: "Wirang", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/78Y0SxVVxP4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nQmzJBAxFKNFLrfCe5WoXikLI2Hg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/78Y0SxVVxP4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mPY4O4IXS0EoZSiIhgBdOMOa4fcw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCrXRY_7SVVmc6TykwhRGUNQ"), + name: "Denny Caknan", + ), + ], + artist_id: Some("UCrXRY_7SVVmc6TykwhRGUNQ"), + album: None, + view_count: Some(6900000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "2e-xqMWT9GY", + name: "SORRY", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/2e-xqMWT9GY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3khSnNe6_HXvAkEO_jgvLj02D_S4Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/2e-xqMWT9GY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kBibi02sZ_q_dwXbdNZ7qf0t3EuQ", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCof4hiuvv9BPhVCh90QHErw"), + name: "The Kid Laroi", + ), + ], + artist_id: Some("UCof4hiuvv9BPhVCh90QHErw"), + album: None, + view_count: Some(489000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "81RRIPE404o", + name: "DAWAI | Cover by Nabila Maharani", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/81RRIPE404o/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3ky8CReF3q3AbpI4Q8HX40jEdCI6A", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/81RRIPE404o/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nhyJSlcnNXGZzndxiFdqSCEgvxDg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCtfmGsduggb9uGGsC9lhfKQ"), + name: "Nabila Maharani", + ), + ], + artist_id: Some("UCtfmGsduggb9uGGsC9lhfKQ"), + album: None, + view_count: Some(931000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "uxR8VhGG9Pc", + name: "ไปล\u{e49}อเล\u{e48}นไกลๆ (Not kidding)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/uxR8VhGG9Pc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lNX-M3-4M6p8USoKnDU7xiRexaTw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/uxR8VhGG9Pc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mr41oN1Mvo2jojb4nZEx9vjB3VTw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCdmScpl5nFGLy3xCnfHjDsw"), + name: "4EVE", + ), + ], + artist_id: Some("UCdmScpl5nFGLy3xCnfHjDsw"), + album: None, + view_count: Some(2100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "JSNwR0MzGZQ", + name: "Heartbeat", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/JSNwR0MzGZQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nxVEtvlDst0LNHDkyLhke5DtAxVg", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/JSNwR0MzGZQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lCv-xQk_IVZw17WPMrLzx1iZ1SEw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCTfTV3COQIaxnvZPjNbXApw"), + name: "Jay Cinco", + ), + ], + artist_id: Some("UCTfTV3COQIaxnvZPjNbXApw"), + album: None, + view_count: Some(476000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "DS8dvzDXpjQ", + name: "Springtrap Sings A Song (SPOILERS!)(William Afton Five Nights At Freddy\'s Scary Movie Parody FNAF)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/DS8dvzDXpjQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mxmwi6QFdivD138rry1yXeOO20Yw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/DS8dvzDXpjQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mk0b9Auzeo7FgH6oyfA8rPrh6QTg", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCHN9HRrB-BeOtSVKhVT7t_w"), + name: "Aaron Fraser-Nash", + ), + ], + artist_id: Some("UCHN9HRrB-BeOtSVKhVT7t_w"), + album: None, + view_count: Some(328000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "j10zAWP5KsM", + name: "ત\u{ac1}\u{a82} મન\u{ac7} પસ\u{a82}દ છ\u{ac7} (Tu Mane Pasand Chhe)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/j10zAWP5KsM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kajyPGgQ0FXDnSP-ytdfTXNz9hQA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/j10zAWP5KsM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n1Wdg6drmUlUCwVnAIviP9uN7J9g", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UChZSUPxvkA2ATGLY9zZrxnQ"), + name: "Naresh Thakor", + ), + ], + artist_id: Some("UChZSUPxvkA2ATGLY9zZrxnQ"), + album: None, + view_count: Some(483000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "ugFKFWhsoZA", + name: "That\'s You (Official Video)", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ugFKFWhsoZA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kjXPfQjwzYdpmrO6Y5uU1ayCtd1Q", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/ugFKFWhsoZA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kKwfyxShWb6CJ2wSxqZVem53c-_w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCzj_b294hukUPPkbwgiMmLQ"), + name: "Lucky Daye", + ), + ], + artist_id: Some("UCzj_b294hukUPPkbwgiMmLQ"), + album: None, + view_count: Some(1100000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "xXO1h6Kthcw", + name: "Hu Tara Dil Ma Tu Mara Dil Ma", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/xXO1h6Kthcw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lHI0grhacXctkl5CnXgFz9ez9whA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/xXO1h6Kthcw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kaw1Y4CinAbFneHIxv2fzVzpgf2w", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: Some("UCoS1Y8yS22Z1r3wVmHllaLA"), + name: "Rakesh Barot", + ), + ], + artist_id: Some("UCoS1Y8yS22Z1r3wVmHllaLA"), + album: None, + view_count: Some(683000), + is_video: true, + track_nr: None, + by_va: false, + ), + TrackItem( + id: "VOUqmbeilXA", + name: "Khatu Wala", + duration: None, + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/VOUqmbeilXA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mhm35jPt3pgdbj_Fn-gjG0X-t2vw", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/VOUqmbeilXA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m43BfTWfu3gYHxNnG95q8gH1neuw", + width: 800, + height: 450, + ), + ], + artists: [ + ArtistId( + id: None, + name: "Ravi Bishnoi & B Siyol", + ), + ], + artist_id: None, + album: None, + view_count: Some(11000), + is_video: true, + track_nr: None, + by_va: false, + ), +] diff --git a/testfiles/music_new/videos_w_podcasts.json b/testfiles/music_new/videos_w_podcasts.json new file mode 100644 index 0000000..27df72c --- /dev/null +++ b/testfiles/music_new/videos_w_podcasts.json @@ -0,0 +1,44183 @@ +{ + "responseContext": { + "visitorData": "CgtuSHpqbDRPSW9TUSjDnciqBjIICgJERRICEgA%3D", + "serviceTrackingParams": [ + { + "service": "GFEEDBACK", + "params": [ + { + "key": "browse_id", + "value": "FEmusic_new_releases_videos" + }, + { + "key": "browse_id_prefix", + "value": "" + }, + { + "key": "logged_in", + "value": "0" + }, + { + "key": "e", + "value": "23804281,23858057,23946420,23966208,23983296,23998056,24004644,24007246,24034168,24036948,24077241,24080738,24120819,24135310,24140247,24181174,24187377,24241378,24255543,24255545,24288664,24290971,24362602,24367579,24367821,24371779,24377598,24377910,24382552,24385728,24386592,24390675,24428788,24428940,24428944,24439361,24451319,24458317,24458324,24458329,24458839,24468724,24485421,24506784,24515423,24517093,24518452,24524098,24525812,24526515,24526642,24526772,24526783,24526792,24526797,24526806,24526815,24526827,24528550,24528555,24528575,24528582,24528644,24528649,24528659,24528668,24535857,24537200,24540881,24541326,24542367,24542452,24546060,24546075,24548138,24548627,24548629,24549786,24550285,24559327,24560416,24560686,24561140,24561150,24561210,24561384,24561412,24563746,24566293,24566687,24568642,24569887,24585907,24588590,24589492,24650811,24694842,24696752,24697068,24698453,39324156,51003636,51004018,51006181,51007475,51009757,51009781,51009900,51010235,51011488,51011905,51012165,51012291,51014091,51016856,51017346,51018888,51019442,51019626,51020570,51021953,51024416,51025415,51025833,51026715,51027426,51027535,51027870,51028271,51030101,51030311,51030737,51032492,51033399,51033577,51035523,51036440,51036511,51036737,51036761,51037322,51037344,51037353,51037540,51038399,51038520,51039493,51040471,51040924,51041333,51041340,51041497,51041809,51043061,51043621,51043942,51045016,51045889,51045969,51047383,51047537,51047579,51048240,51048255,51049132,51049613,51051694,51052601,51053019,51054669,51055017,51055048,51055107,51055917,51055919,51057809,51057822,51057844,51057855,51057951,51061017,51061427" + } + ] + }, + { + "service": "CSI", + "params": [ + { + "key": "c", + "value": "WEB_REMIX" + }, + { + "key": "cver", + "value": "1.20231106.01.02" + }, + { + "key": "yt_li", + "value": "0" + }, + { + "key": "GetBrowseNewReleasesVideosPage_rid", + "value": "0x59ba99e6df0c153d" + } + ] + }, + { + "service": "ECATCHER", + "params": [ + { + "key": "client.version", + "value": "1.20000101" + }, + { + "key": "client.name", + "value": "WEB_REMIX" + }, + { + "key": "client.fexp", + "value": "24526772,51045889,24428940,51016856,24526815,24561384,24528555,24542367,51055919,51048240,24561140,51061017,51047579,51009781,51061427,51048255,23998056,24506784,51049132,24362602,24548629,51045969,51027426,24255543,51012291,51057809,51055048,24524098,51010235,24120819,51037540,51030101,51021953,24549786,24528575,24371779,51036440,24526515,24550285,24458839,24077241,51038399,24528582,24187377,51057844,24036948,24007246,24528668,51043942,24458329,24241378,51019442,24589492,51006181,24696752,51041340,24560416,51047537,24542452,51053019,51041333,51033399,24566293,51055917,24428944,51036737,51027870,51051694,51057951,24561150,24367579,51041497,51018888,51020570,24255545,24697068,24382552,24563746,51007475,51011488,51011905,51055017,51057822,51038520,51014091,24526797,24004644,24181174,24525812,51052601,24386592,24566687,51037344,24526783,24528659,51004018,24535857,24377598,24468724,24288664,51041809,51025415,24515423,24569887,51037322,51036761,24546060,24135310,24568642,51033577,51030737,24528644,23946420,24526827,24650811,51003636,51028271,51043621,51012165,51025833,51009900,24528550,51040924,51040471,23966208,24290971,24546075,51035523,51032492,51045016,24526806,51024416,24080738,51039493,51057855,24698453,24140247,24526792,51019626,24367821,51037353,51027535,51026715,24561210,51047383,24561412,24439361,51009757,24385728,24518452,24588590,24541326,51017346,24517093,24428788,51036511,24585907,51030311,23858057,24458317,51054669,24548627,24537200,24451319,24548138,24560686,51043061,24390675,24540881,23983296,51055107,24528649,24526642,24485421,51049613,24377910,24559327,24034168,23804281,39324156,24458324,24694842" + } + ] + } + ] + }, + "contents": { + "singleColumnBrowseResultsRenderer": { + "tabs": [ + { + "tabRenderer": { + "content": { + "sectionListRenderer": { + "contents": [ + { + "gridRenderer": { + "items": [ + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/lbDo8whgkFQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nLW1yMYgYCF3CJdxUCTNVkNrAnKQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/lbDo8whgkFQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kTk54K9_F5dhL9Uu8KlMcnyn79KQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNQLEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Solstitiu" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Andia", + "navigationEndpoint": { + "clickTrackingParams": "CMYLEKCzAhgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCl7jsog9v_M5SgdWeSEXpRA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "428K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMYLEKCzAhgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lbDo8whgkFQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMYLEKCzAhgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNMLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lbDo8whgkFQ", + "playlistId": "RDAMVMlbDo8whgkFQ", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1sYkRvOHdoZ2tGUQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNMLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNELEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "lbDo8whgkFQ", + "onEmptyQueue": { + "clickTrackingParams": "CNELEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lbDo8whgkFQ" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNELEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNILEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNELEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CM8LEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "lbDo8whgkFQ", + "onEmptyQueue": { + "clickTrackingParams": "CM8LEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lbDo8whgkFQ" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CM8LEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNALEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CM8LEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CM0LEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM4LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM4LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CM0LEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsLEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMwLEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMwLEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMsLEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMoLEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCl7jsog9v_M5SgdWeSEXpRA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMoLEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtsYkRvOHdoZ2tGUQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMkLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMgLEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMcLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "lbDo8whgkFQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMcLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Solstitiu - Andia" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Solstitiu - Andia" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_UN2gwabRBI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3miYl4FHFvgpoNn_JFqLukAbM_hnA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/_UN2gwabRBI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kxCu0yjEJa_9v0xjCfXKFwM7aNlQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMULEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Me Atraiu (Reimagined)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Gabriela Rocha", + "navigationEndpoint": { + "clickTrackingParams": "CLcLEKCzAhgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCtilVkO8eHizeFSs5s5vvCA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "377K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLcLEKCzAhgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_UN2gwabRBI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLcLEKCzAhgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMQLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_UN2gwabRBI", + "playlistId": "RDAMVM_UN2gwabRBI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1fVU4yZ3dhYlJCSQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMQLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMILEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "_UN2gwabRBI", + "onEmptyQueue": { + "clickTrackingParams": "CMILEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_UN2gwabRBI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMILEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMMLEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMILEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMALEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "_UN2gwabRBI", + "onEmptyQueue": { + "clickTrackingParams": "CMALEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_UN2gwabRBI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMALEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMELEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMALEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CL4LEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CL8LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CL4LEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLwLEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL0LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CL0LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLwLEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLsLEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCtilVkO8eHizeFSs5s5vvCA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLsLEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtfVU4yZ3dhYlJCSQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLoLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLkLEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLgLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "_UN2gwabRBI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLgLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Me Atraiu (Reimagined) - Gabriela Rocha" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Me Atraiu (Reimagined) - Gabriela Rocha" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aY72b4ZGPbo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mfas-_L3rAKmpbkaEdHGmRNzFlkQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/aY72b4ZGPbo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kU4o9o5oEqX130QmjSvP6CqdqxAw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLYLEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Lonkotina" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Mia Guisse", + "navigationEndpoint": { + "clickTrackingParams": "CKgLEKCzAhgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC3i0iDG8jrpTvxgoeDoskbg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "2.2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgLEKCzAhgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aY72b4ZGPbo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKgLEKCzAhgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLULEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aY72b4ZGPbo", + "playlistId": "RDAMVMaY72b4ZGPbo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1hWTcyYjRaR1Bibw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLULEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLMLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "aY72b4ZGPbo", + "onEmptyQueue": { + "clickTrackingParams": "CLMLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aY72b4ZGPbo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLMLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLQLEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLMLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLELEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "aY72b4ZGPbo", + "onEmptyQueue": { + "clickTrackingParams": "CLELEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aY72b4ZGPbo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLELEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLILEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLELEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CK8LEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLALEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLALEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CK8LEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0LEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK4LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CK4LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CK0LEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKwLEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC3i0iDG8jrpTvxgoeDoskbg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKwLEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgthWTcyYjRaR1Bibw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKsLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKoLEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKkLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "aY72b4ZGPbo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKkLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Lonkotina - Mia Guisse" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Lonkotina - Mia Guisse" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Cu82AvG87_g/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k9cAzknavOHHqEdPHcsQNMmG5idA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Cu82AvG87_g/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nYzeB3MPHTBwZue8VhUTy2pEiUFA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKcLEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Anaskhan0064", + "navigationEndpoint": { + "clickTrackingParams": "CJkLEKCzAhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCtNte05ndJf0BEN3hSmVEYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "123K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkLEKCzAhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Cu82AvG87_g", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJkLEKCzAhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKYLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Cu82AvG87_g", + "playlistId": "RDAMVMCu82AvG87_g", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1DdTgyQXZHODdfZw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKYLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKQLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Cu82AvG87_g", + "onEmptyQueue": { + "clickTrackingParams": "CKQLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Cu82AvG87_g" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKQLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKULEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKQLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKILEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Cu82AvG87_g", + "onEmptyQueue": { + "clickTrackingParams": "CKILEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Cu82AvG87_g" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKILEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKMLEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKILEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKALEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKELEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKELEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKALEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ4LEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJ8LEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJ4LEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ0LEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCtNte05ndJf0BEN3hSmVEYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJ0LEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtDdTgyQXZHODdfZw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJwLEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJsLEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJoLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Cu82AvG87_g", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJoLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar - Anaskhan0064" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar - Anaskhan0064" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/p9R94XSYjwI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kwyALdMVf5R9F3VHJHtjXUfsYTkw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/p9R94XSYjwI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l55JeeVE2Gbrnlv7pkTlczQiwKug", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJgLEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Mbesa Ime" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Greta Koci", + "navigationEndpoint": { + "clickTrackingParams": "CIoLEKCzAhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCLLh_wXspYOzRoOUWUCyu8A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.7M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoLEKCzAhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "p9R94XSYjwI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIoLEKCzAhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJcLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "p9R94XSYjwI", + "playlistId": "RDAMVMp9R94XSYjwI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1wOVI5NFhTWWp3SQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJcLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJULEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "p9R94XSYjwI", + "onEmptyQueue": { + "clickTrackingParams": "CJULEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "p9R94XSYjwI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJULEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJYLEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJULEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJMLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "p9R94XSYjwI", + "onEmptyQueue": { + "clickTrackingParams": "CJMLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "p9R94XSYjwI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJMLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJQLEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJMLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJELEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJILEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJILEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJELEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI8LEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJALEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJALEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CI8LEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI4LEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCLLh_wXspYOzRoOUWUCyu8A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CI4LEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0LEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtwOVI5NFhTWWp3SQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CI0LEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIwLEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIsLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "p9R94XSYjwI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIsLEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Mbesa Ime - Greta Koci" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Mbesa Ime - Greta Koci" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Tlg574e9fuU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lTsMQ1ptpxCT6t5vXATLLepaDamg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Tlg574e9fuU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lJqmmSqDQP3J_zV7lOXi50W-SXnA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIkLEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "BÈO DẠT MÂY TRÔI | MV OST NGƯỜI VỢ CUỐI CÙNG | THÙY CHI" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Thùy Chi", + "navigationEndpoint": { + "clickTrackingParams": "CPsKEKCzAhgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCR5Q898Ou0J9eR5gQFFbExw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPsKEKCzAhgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Tlg574e9fuU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPsKEKCzAhgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIgLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Tlg574e9fuU", + "playlistId": "RDAMVMTlg574e9fuU", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1UbGc1NzRlOWZ1VQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIgLEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIYLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Tlg574e9fuU", + "onEmptyQueue": { + "clickTrackingParams": "CIYLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Tlg574e9fuU" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIYLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIcLEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIYLEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIQLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Tlg574e9fuU", + "onEmptyQueue": { + "clickTrackingParams": "CIQLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Tlg574e9fuU" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIQLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIULEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIQLEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIILEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMLEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIMLEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIILEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIALEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIELEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIELEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIALEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP8KEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCR5Q898Ou0J9eR5gQFFbExw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CP8KEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4KEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtUbGc1NzRlOWZ1VQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CP4KEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CP0KEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPwKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Tlg574e9fuU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPwKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play BÈO DẠT MÂY TRÔI | MV OST NGƯỜI VỢ CUỐI CÙNG | THÙY CHI - Thùy Chi" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause BÈO DẠT MÂY TRÔI | MV OST NGƯỜI VỢ CUỐI CÙNG | THÙY CHI - Thùy Chi" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1L-RpSmlWp0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nVUjyjKlr44bpX9giddaz357B1ow", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/1L-RpSmlWp0/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kNkqtjw3buOCtXJp3mMhREvpvYag", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPoKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Mamma Che Paura" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Me contro Te", + "navigationEndpoint": { + "clickTrackingParams": "COwKEKCzAhgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCAravTV5JMlA34hSiFeLphQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COwKEKCzAhgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1L-RpSmlWp0", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COwKEKCzAhgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPkKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1L-RpSmlWp0", + "playlistId": "RDAMVM1L-RpSmlWp0", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0xTC1ScFNtbFdwMA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPkKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPcKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1L-RpSmlWp0", + "onEmptyQueue": { + "clickTrackingParams": "CPcKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1L-RpSmlWp0" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPcKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPgKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPcKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPUKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1L-RpSmlWp0", + "onEmptyQueue": { + "clickTrackingParams": "CPUKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1L-RpSmlWp0" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPUKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPYKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPUKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CPMKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPQKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPQKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CPMKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPEKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPIKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPIKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPEKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPAKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCAravTV5JMlA34hSiFeLphQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPAKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CO8KEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsxTC1ScFNtbFdwMA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CO8KEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CO4KEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CO0KEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "1L-RpSmlWp0", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CO0KEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Mamma Che Paura - Me contro Te" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Mamma Che Paura - Me contro Te" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/EI28gmgBMfw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kBJaHIDbrj4KWhDnJ9Znn0_AjLaA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/EI28gmgBMfw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mrhJ_-BHvsjB-etrXsd-dCJ3-Z3g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COsKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Oameni" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Smiley", + "navigationEndpoint": { + "clickTrackingParams": "CN0KEKCzAhgHIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCqfnM1n2W4KwqeLZjm70_5w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "574K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CN0KEKCzAhgHIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "EI28gmgBMfw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CN0KEKCzAhgHIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COoKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "EI28gmgBMfw", + "playlistId": "RDAMVMEI28gmgBMfw", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1FSTI4Z21nQk1mdw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COoKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COgKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "EI28gmgBMfw", + "onEmptyQueue": { + "clickTrackingParams": "COgKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "EI28gmgBMfw" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COgKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COkKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COgKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COYKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "EI28gmgBMfw", + "onEmptyQueue": { + "clickTrackingParams": "COYKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "EI28gmgBMfw" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COYKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COcKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COYKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COQKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COUKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COUKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COQKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COIKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COMKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COMKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COIKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COEKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCqfnM1n2W4KwqeLZjm70_5w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COEKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COAKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtFSTI4Z21nQk1mdw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COAKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CN8KEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CN4KEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "EI28gmgBMfw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CN4KEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Oameni - Smiley" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Oameni - Smiley" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Z1DEwM1E7ho/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lj5T_2NDsYETT7_ffONwoosMnTmg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Z1DEwM1E7ho/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l21X7ai3j8qLBJLfXx3aFl2pnktg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNwKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Stinge luminile (From \"Miami Bici 2\" The Movie)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Irina Rimes", + "navigationEndpoint": { + "clickTrackingParams": "CM4KEKCzAhgIIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC2ssqTYToKpthovpsXR_V9A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Theo Rose", + "navigationEndpoint": { + "clickTrackingParams": "CM4KEKCzAhgIIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC4X0f6_0a77pL0ZtjpCo7sw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "531K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM4KEKCzAhgIIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Z1DEwM1E7ho", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CM4KEKCzAhgIIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNsKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Z1DEwM1E7ho", + "playlistId": "RDAMVMZ1DEwM1E7ho", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1aMURFd00xRTdobw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNsKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNkKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Z1DEwM1E7ho", + "onEmptyQueue": { + "clickTrackingParams": "CNkKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Z1DEwM1E7ho" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNkKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNoKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNkKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNcKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Z1DEwM1E7ho", + "onEmptyQueue": { + "clickTrackingParams": "CNcKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Z1DEwM1E7ho" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNcKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNgKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNcKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNUKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNYKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNYKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNUKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNMKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNQKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNQKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNMKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNIKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC2ssqTYToKpthovpsXR_V9A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNIKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNEKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtaMURFd00xRTdobw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNEKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNAKEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CM8KEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Z1DEwM1E7ho", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CM8KEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Stinge luminile (From \"Miami Bici 2\" The Movie) - Irina Rimes" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Stinge luminile (From \"Miami Bici 2\" The Movie) - Irina Rimes" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/hqnDi07CsJU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kf9M7hLltl8IgjBn3k7lmRVE2XgQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/hqnDi07CsJU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kR3QvyhUtWQTOgVNvN8srWYxzD2w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CM0KEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Yakofi Khar" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Jahman X-press", + "navigationEndpoint": { + "clickTrackingParams": "CL8KEKCzAhgJIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC7eTn3T3sbweHz9TJJYxoqQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "888K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8KEKCzAhgJIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "hqnDi07CsJU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CL8KEKCzAhgJIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMwKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "hqnDi07CsJU", + "playlistId": "RDAMVMhqnDi07CsJU", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ocW5EaTA3Q3NKVQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMwKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMoKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "hqnDi07CsJU", + "onEmptyQueue": { + "clickTrackingParams": "CMoKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "hqnDi07CsJU" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMoKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMsKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMoKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMgKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "hqnDi07CsJU", + "onEmptyQueue": { + "clickTrackingParams": "CMgKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "hqnDi07CsJU" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMgKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMkKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMgKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMYKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMcKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMcKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMYKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMQKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMUKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMUKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMQKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMMKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC7eTn3T3sbweHz9TJJYxoqQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMMKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMIKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtocW5EaTA3Q3NKVQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMIKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMEKEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMAKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "hqnDi07CsJU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMAKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Yakofi Khar - Jahman X-press" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Yakofi Khar - Jahman X-press" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_T2tvIwOMfc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mM8xuUolB0lEyzaS1L0GaCgPCcoA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/_T2tvIwOMfc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mtJsunpizD44kNDZSKMEZnh8029Q", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CL4KEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Wild n Rich (Official Music Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "450VEVO", + "navigationEndpoint": { + "clickTrackingParams": "CLEKEKCzAhgKIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCzt2dORSFzAiwRNUOpg1Gng", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_USER_CHANNEL" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEKEKCzAhgKIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_T2tvIwOMfc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLEKEKCzAhgKIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL0KEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_T2tvIwOMfc", + "playlistId": "RDAMVM_T2tvIwOMfc", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1fVDJ0dkl3T01mYw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CL0KEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLsKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "_T2tvIwOMfc", + "onEmptyQueue": { + "clickTrackingParams": "CLsKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_T2tvIwOMfc" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLsKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLwKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLsKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLkKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "_T2tvIwOMfc", + "onEmptyQueue": { + "clickTrackingParams": "CLkKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_T2tvIwOMfc" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLkKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLoKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLkKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLcKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLgKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLgKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLcKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLUKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLYKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLYKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLUKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLQKEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtfVDJ0dkl3T01mYw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLQKEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLMKEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLIKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "_T2tvIwOMfc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLIKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Wild n Rich (Official Music Video) - 450VEVO" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Wild n Rich (Official Music Video) - 450VEVO" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/seDc-M7aSOI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nguts_d0_WMTK0uE70ibOTX0hzHw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/seDc-M7aSOI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3ljvEzyLUZmy7TP55pB0AkkDNXKYg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLAKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Fifi - Nale (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "FIFI", + "navigationEndpoint": { + "clickTrackingParams": "CKIKEKCzAhgLIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCS-F4K78yXD6b53lypQXVmA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "625K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIKEKCzAhgLIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "seDc-M7aSOI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKIKEKCzAhgLIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8KEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "seDc-M7aSOI", + "playlistId": "RDAMVMseDc-M7aSOI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1zZURjLU03YVNPSQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CK8KEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CK0KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "seDc-M7aSOI", + "onEmptyQueue": { + "clickTrackingParams": "CK0KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "seDc-M7aSOI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CK0KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CK4KEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CK0KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKsKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "seDc-M7aSOI", + "onEmptyQueue": { + "clickTrackingParams": "CKsKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "seDc-M7aSOI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKsKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKwKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKsKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKkKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKoKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKoKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKkKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKcKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKgKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKcKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKYKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCS-F4K78yXD6b53lypQXVmA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKYKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKUKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtzZURjLU03YVNPSQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKUKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKQKEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKMKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "seDc-M7aSOI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKMKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Fifi - Nale (Official Video) - FIFI" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Fifi - Nale (Official Video) - FIFI" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/APJAQoSCwuA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nSfCW4utM6udXbAhygK9Y47lCPMQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/APJAQoSCwuA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n_xbuQtF0_vimsxEBR27RZ6FK_UA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKEKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Now And Then - The Last Beatles Song (Short Film)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "TheBeatlesVEVO", + "navigationEndpoint": { + "clickTrackingParams": "CJQKEKCzAhgMIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC4dqLAF7yT-_DqeYisQ001w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_USER_CHANNEL" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "6.4M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJQKEKCzAhgMIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "APJAQoSCwuA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJQKEKCzAhgMIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKAKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "APJAQoSCwuA", + "playlistId": "RDAMVMAPJAQoSCwuA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1BUEpBUW9TQ3d1QQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKAKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJ4KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "APJAQoSCwuA", + "onEmptyQueue": { + "clickTrackingParams": "CJ4KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "APJAQoSCwuA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJ4KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJ8KEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJ4KEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJwKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "APJAQoSCwuA", + "onEmptyQueue": { + "clickTrackingParams": "CJwKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "APJAQoSCwuA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJwKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJ0KEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJwKEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJoKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJsKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJoKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJkKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJgKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJcKEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtBUEpBUW9TQ3d1QQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJcKEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJYKEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJUKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "APJAQoSCwuA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJUKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Now And Then - The Last Beatles Song (Short Film) - TheBeatlesVEVO" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Now And Then - The Last Beatles Song (Short Film) - TheBeatlesVEVO" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/965Lv2AwODM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lxe-n4PCN52XnQ7bQ7cvpLWCXodw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/965Lv2AwODM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nQGscZcu-k8Px1SIvrKIsuE_cOEA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJMKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Cục Vợ ơi, lấy anh nha!- Bài hát đón cô dâu Puka ở lễ cưới biển của chú rể Gin Tuấn Kiệt [Official]" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Gin Tuan Kiet", + "navigationEndpoint": { + "clickTrackingParams": "CIUKEKCzAhgNIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCICfl8cwTSkZ_kUZ7tLnfBw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.7M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIUKEKCzAhgNIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "965Lv2AwODM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIUKEKCzAhgNIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJIKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "965Lv2AwODM", + "playlistId": "RDAMVM965Lv2AwODM", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk05NjVMdjJBd09ETQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJIKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJAKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "965Lv2AwODM", + "onEmptyQueue": { + "clickTrackingParams": "CJAKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "965Lv2AwODM" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJAKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJEKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJAKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CI4KEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "965Lv2AwODM", + "onEmptyQueue": { + "clickTrackingParams": "CI4KEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "965Lv2AwODM" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CI4KEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CI8KEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CI4KEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIwKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0KEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CI0KEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIwKEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIsKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIsKEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIoKEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCICfl8cwTSkZ_kUZ7tLnfBw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIkKEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIgKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs5NjVMdjJBd09ETQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIgKEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIcKEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIYKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "965Lv2AwODM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIYKEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Cục Vợ ơi, lấy anh nha!- Bài hát đón cô dâu Puka ở lễ cưới biển của chú rể Gin Tuấn Kiệt [Official] - Gin Tuan Kiet" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Cục Vợ ơi, lấy anh nha!- Bài hát đón cô dâu Puka ở lễ cưới biển của chú rể Gin Tuấn Kiệt [Official] - Gin Tuan Kiet" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Yl7NAOn0YJw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lu_0rue-4cMAhH23-TsvhxGzjDgw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Yl7NAOn0YJw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kMOokskbXhCSRkOH46Ziq_3ZGT7Q", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIQKEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Mctp", + "navigationEndpoint": { + "clickTrackingParams": "CPYJEKCzAhgOIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCg-EvXRjoIqX6IjDB1F09XA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "115K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPYJEKCzAhgOIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Yl7NAOn0YJw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPYJEKCzAhgOIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Yl7NAOn0YJw", + "playlistId": "RDAMVMYl7NAOn0YJw", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ZbDdOQU9uMFlKdw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIMKEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIEKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Yl7NAOn0YJw", + "onEmptyQueue": { + "clickTrackingParams": "CIEKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Yl7NAOn0YJw" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIEKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIIKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIEKEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CP8JEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Yl7NAOn0YJw", + "onEmptyQueue": { + "clickTrackingParams": "CP8JEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Yl7NAOn0YJw" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CP8JEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIAKEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CP8JEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CP0JEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CP4JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CP0JEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPsJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPwJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPwJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPsJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCg-EvXRjoIqX6IjDB1F09XA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPoJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPkJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtZbDdOQU9uMFlKdw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPkJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPgJEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPcJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Yl7NAOn0YJw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPcJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar - Mctp" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Tere Yaar Ne Kholya Tuition Badmashi Kaa | Boys Attitude Hit Song | Masoom Sharma | Hemant Faujdar - Mctp" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/TVhoS5qhVi4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mg7lGS1erM7Fv0FbhJ1gMuNEYdgw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/TVhoS5qhVi4/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muIK7IGn5r59EkdqQc2tdNyF8Oow", + "width": 426, + "height": 240 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPUJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Alban Skenderaj - SIKUR TA DIJA" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Alban Skënderaj", + "navigationEndpoint": { + "clickTrackingParams": "COcJEKCzAhgPIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCb18v2rxFjfofBw68qhdJOg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "609K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COcJEKCzAhgPIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TVhoS5qhVi4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COcJEKCzAhgPIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPQJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TVhoS5qhVi4", + "playlistId": "RDAMVMTVhoS5qhVi4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1UVmhvUzVxaFZpNA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPQJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPIJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "TVhoS5qhVi4", + "onEmptyQueue": { + "clickTrackingParams": "CPIJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TVhoS5qhVi4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPIJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPMJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPIJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPAJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "TVhoS5qhVi4", + "onEmptyQueue": { + "clickTrackingParams": "CPAJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TVhoS5qhVi4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPAJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPEJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPAJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CO4JEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO8JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CO8JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CO4JEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COwJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO0JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CO0JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COwJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COsJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCb18v2rxFjfofBw68qhdJOg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COsJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COoJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtUVmhvUzVxaFZpNA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COoJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COkJEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COgJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "TVhoS5qhVi4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COgJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Alban Skenderaj - SIKUR TA DIJA - Alban Skënderaj" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Alban Skenderaj - SIKUR TA DIJA - Alban Skënderaj" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/dZdaP7DGze4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3liDO2D1Ht_CZUEHjWW9oY4aWL8PA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/dZdaP7DGze4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m-9uB_CGEqo2jeHayHnR6FZCgj7w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COYJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "O INEVITÁVEL!" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "FutParódias", + "navigationEndpoint": { + "clickTrackingParams": "CNgJEKCzAhgQIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCkBzk1A-RnBs_1OArpSeAFw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.6M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNgJEKCzAhgQIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dZdaP7DGze4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNgJEKCzAhgQIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COUJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dZdaP7DGze4", + "playlistId": "RDAMVMdZdaP7DGze4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1kWmRhUDdER3plNA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COUJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COMJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "dZdaP7DGze4", + "onEmptyQueue": { + "clickTrackingParams": "COMJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dZdaP7DGze4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COMJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COQJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COMJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COEJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "dZdaP7DGze4", + "onEmptyQueue": { + "clickTrackingParams": "COEJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dZdaP7DGze4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COEJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COIJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COEJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CN8JEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COAJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COAJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CN8JEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN0JEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CN4JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CN4JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CN0JEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNwJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCkBzk1A-RnBs_1OArpSeAFw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNwJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNsJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtkWmRhUDdER3plNA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNsJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNoJEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNkJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "dZdaP7DGze4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNkJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play O INEVITÁVEL! - FutParódias" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause O INEVITÁVEL! - FutParódias" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/SsizZ2VZe6c/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lbINaiOC-KaayggAfHhNmfNTT7TA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/SsizZ2VZe6c/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kQMRdjkXfgA4Oip26nTMGSlF1B_A", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNcJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "How Do You Choose" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Scotty Hasting", + "navigationEndpoint": { + "clickTrackingParams": "CMkJEKCzAhgRIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC8DMv_5z36X8mpS-VPATVKA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "13K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkJEKCzAhgRIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "SsizZ2VZe6c", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMkJEKCzAhgRIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNYJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "SsizZ2VZe6c", + "playlistId": "RDAMVMSsizZ2VZe6c", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1Tc2l6WjJWWmU2Yw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNYJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNQJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "SsizZ2VZe6c", + "onEmptyQueue": { + "clickTrackingParams": "CNQJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "SsizZ2VZe6c" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNQJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNUJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNQJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNIJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "SsizZ2VZe6c", + "onEmptyQueue": { + "clickTrackingParams": "CNIJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "SsizZ2VZe6c" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNIJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNMJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNIJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNAJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNEJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNEJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNAJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM4JEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM8JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM8JEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CM4JEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM0JEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC8DMv_5z36X8mpS-VPATVKA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CM0JEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMwJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtTc2l6WjJWWmU2Yw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMwJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMsJEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMoJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "SsizZ2VZe6c", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMoJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play How Do You Choose - Scotty Hasting" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause How Do You Choose - Scotty Hasting" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xFRIddDw8bw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nOCzqlgkxpOzBWvm5sOPm6f_-q-g", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/xFRIddDw8bw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mrTxU5aG0DopMkRLf4Lxq17a9gCQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMgJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Vinicius" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Ninho", + "navigationEndpoint": { + "clickTrackingParams": "CLoJEKCzAhgSIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBNTNHPngOpC-yeC8VpAPJQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoJEKCzAhgSIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xFRIddDw8bw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLoJEKCzAhgSIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMcJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xFRIddDw8bw", + "playlistId": "RDAMVMxFRIddDw8bw", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk14RlJJZGREdzhidw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMcJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMUJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "xFRIddDw8bw", + "onEmptyQueue": { + "clickTrackingParams": "CMUJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xFRIddDw8bw" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMUJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMYJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMUJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMMJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "xFRIddDw8bw", + "onEmptyQueue": { + "clickTrackingParams": "CMMJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xFRIddDw8bw" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMMJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMQJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMMJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMEJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMIJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMIJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMEJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8JEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMAJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMAJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CL8JEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL4JEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBNTNHPngOpC-yeC8VpAPJQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CL4JEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL0JEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt4RlJJZGREdzhidw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CL0JEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLwJEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLsJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "xFRIddDw8bw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLsJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Vinicius - Ninho" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Vinicius - Ninho" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Rbhky_2qIUo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lWPJ0fGGUPCSNJh1oOOygYE0v1BQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Rbhky_2qIUo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lmFEYI7Uo4i_88reUl00ChJfS10Q", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLkJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Sijalewa" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Harmonize", + "navigationEndpoint": { + "clickTrackingParams": "CKsJEKCzAhgTIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCX8lsVmQtu9m1l5n3KDniMw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsJEKCzAhgTIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Rbhky_2qIUo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKsJEKCzAhgTIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLgJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Rbhky_2qIUo", + "playlistId": "RDAMVMRbhky_2qIUo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1SYmhreV8ycUlVbw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLgJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLYJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Rbhky_2qIUo", + "onEmptyQueue": { + "clickTrackingParams": "CLYJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Rbhky_2qIUo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLYJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLcJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLYJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLQJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Rbhky_2qIUo", + "onEmptyQueue": { + "clickTrackingParams": "CLQJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Rbhky_2qIUo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLQJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLUJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLQJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLIJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLMJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLMJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLIJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLAJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLEJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLAJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8JEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCX8lsVmQtu9m1l5n3KDniMw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CK8JEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK4JEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtSYmhreV8ycUlVbw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CK4JEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CK0JEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKwJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Rbhky_2qIUo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKwJEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Sijalewa - Harmonize" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Sijalewa - Harmonize" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ECovqS_ItUo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kdQBoviap8Xb0L5D9m-q5IeSUV3Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/ECovqS_ItUo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kGniy4Gd-brp8pZ8r9ov6w-VoaYQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKoJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Culita Sterp & Jador - Fosta mea iubire 🫢 [oficial video] 2023" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Culita Sterp", + "navigationEndpoint": { + "clickTrackingParams": "CJwJEKCzAhgUIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC8RdjfDbLzA8CYRjsi6gvgw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "865K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwJEKCzAhgUIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ECovqS_ItUo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJwJEKCzAhgUIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKkJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ECovqS_ItUo", + "playlistId": "RDAMVMECovqS_ItUo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1FQ292cVNfSXRVbw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKkJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKcJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ECovqS_ItUo", + "onEmptyQueue": { + "clickTrackingParams": "CKcJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ECovqS_ItUo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKcJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKgJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKcJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKUJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ECovqS_ItUo", + "onEmptyQueue": { + "clickTrackingParams": "CKUJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ECovqS_ItUo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKUJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKYJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKUJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKMJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKQJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKQJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKMJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKEJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKIJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKEJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKAJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC8RdjfDbLzA8CYRjsi6gvgw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKAJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8JEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtFQ292cVNfSXRVbw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJ8JEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJ4JEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJ0JEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "ECovqS_ItUo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJ0JEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Culita Sterp & Jador - Fosta mea iubire 🫢 [oficial video] 2023 - Culita Sterp" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Culita Sterp & Jador - Fosta mea iubire 🫢 [oficial video] 2023 - Culita Sterp" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/uxP0y-m6ysA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nEpu8aS91RPKhEGtHqGKNI_EwTRw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/uxP0y-m6ysA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kK3UJmRVhsj9R7q58oeCVhpu_lEA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJsJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Govi Reka & Sara Pik me rrema FlowMusic 1" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Govi Reka", + "navigationEndpoint": { + "clickTrackingParams": "CI0JEKCzAhgVIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCdKSviUrXNT9SjC8e-jEJQQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "14K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0JEKCzAhgVIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "uxP0y-m6ysA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CI0JEKCzAhgVIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJoJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "uxP0y-m6ysA", + "playlistId": "RDAMVMuxP0y-m6ysA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk11eFAweS1tNnlzQQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJoJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJgJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "uxP0y-m6ysA", + "onEmptyQueue": { + "clickTrackingParams": "CJgJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "uxP0y-m6ysA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJgJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJkJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJgJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJYJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "uxP0y-m6ysA", + "onEmptyQueue": { + "clickTrackingParams": "CJYJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "uxP0y-m6ysA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJYJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJcJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJYJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJQJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJUJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJUJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJQJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJIJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJMJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJMJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJIJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJEJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCdKSviUrXNT9SjC8e-jEJQQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJEJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJAJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt1eFAweS1tNnlzQQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJAJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CI8JEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CI4JEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "uxP0y-m6ysA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CI4JEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Govi Reka & Sara Pik me rrema FlowMusic 1 - Govi Reka" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Govi Reka & Sara Pik me rrema FlowMusic 1 - Govi Reka" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/simC880SUGk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mftRuSLp2E9nLlbdH7opRo0v7-Gw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/simC880SUGk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n7MsQ14VzbqgXGcWqrZAkOOEy0VA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIwJEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "MOZZIK - ZANI" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Mozzik", + "navigationEndpoint": { + "clickTrackingParams": "CP4IEKCzAhgWIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBI6li04V1aWOFrs9jjPomQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.6M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4IEKCzAhgWIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "simC880SUGk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CP4IEKCzAhgWIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIsJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "simC880SUGk", + "playlistId": "RDAMVMsimC880SUGk", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1zaW1DODgwU1VHaw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIsJEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIkJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "simC880SUGk", + "onEmptyQueue": { + "clickTrackingParams": "CIkJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "simC880SUGk" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIkJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIoJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIkJEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIcJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "simC880SUGk", + "onEmptyQueue": { + "clickTrackingParams": "CIcJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "simC880SUGk" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIcJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIgJEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIcJEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIUJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIYJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIYJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIUJEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIQJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIQJEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIMJEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIIJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBI6li04V1aWOFrs9jjPomQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIIJEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIEJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtzaW1DODgwU1VHaw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIEJEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIAJEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CP8IEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "simC880SUGk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CP8IEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play MOZZIK - ZANI - Mozzik" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause MOZZIK - ZANI - Mozzik" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/dGLVJ35_gnA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nKxyxWr6wEQKx8yBTyhs9dSdT8kw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/dGLVJ35_gnA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nl7lLGqCT1xkkuqOKK0S18namvZw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CP0IEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Odín" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Rodrigo Septién", + "navigationEndpoint": { + "clickTrackingParams": "CO8IEKCzAhgXIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCCQBpFm05uyBgLNDMFgoBYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "133K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO8IEKCzAhgXIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dGLVJ35_gnA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CO8IEKCzAhgXIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPwIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dGLVJ35_gnA", + "playlistId": "RDAMVMdGLVJ35_gnA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1kR0xWSjM1X2duQQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPwIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPoIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "dGLVJ35_gnA", + "onEmptyQueue": { + "clickTrackingParams": "CPoIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dGLVJ35_gnA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPoIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPsIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPoIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPgIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "dGLVJ35_gnA", + "onEmptyQueue": { + "clickTrackingParams": "CPgIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "dGLVJ35_gnA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPgIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPkIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPgIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CPYIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPcIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPcIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CPYIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPQIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPUIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPUIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPQIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPMIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCCQBpFm05uyBgLNDMFgoBYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPMIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPIIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtkR0xWSjM1X2duQQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPIIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPEIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPAIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "dGLVJ35_gnA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPAIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Odín - Rodrigo Septién" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Odín - Rodrigo Septién" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/vY6UiUDPuMk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nvjfX_qIGdsFY-gj7_OgBJOPy5xw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/vY6UiUDPuMk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3ndNjxbFJF2zuyoPaghK3lCWQhzCw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CO4IEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "เลี้ยงไข้ (fever) (feat. The TOYS)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "BOWKYLION", + "navigationEndpoint": { + "clickTrackingParams": "COAIEKCzAhgYIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCH37fMa51kuvqaHjQyPUbQw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COAIEKCzAhgYIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vY6UiUDPuMk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COAIEKCzAhgYIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CO0IEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vY6UiUDPuMk", + "playlistId": "RDAMVMvY6UiUDPuMk", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk12WTZVaVVEUHVNaw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CO0IEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COsIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "vY6UiUDPuMk", + "onEmptyQueue": { + "clickTrackingParams": "COsIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vY6UiUDPuMk" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COsIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COwIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COsIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COkIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "vY6UiUDPuMk", + "onEmptyQueue": { + "clickTrackingParams": "COkIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vY6UiUDPuMk" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COkIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COoIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COkIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COcIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COgIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COgIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COcIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COUIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COYIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COYIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COUIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COQIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCH37fMa51kuvqaHjQyPUbQw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COQIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COMIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt2WTZVaVVEUHVNaw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COMIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COIIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COEIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "vY6UiUDPuMk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COEIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play เลี้ยงไข้ (fever) - BOWKYLION" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause เลี้ยงไข้ (fever) - BOWKYLION" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/QMQw_waEPi0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lfsi1LZ0PBTczrdhyxA7NGilfvmg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/QMQw_waEPi0/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nifikciv2zBU2HwOkmojeTw_AEag", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CN8IEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "STARBOYS" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "FANTASTICS from EXILE TRIBE", + "navigationEndpoint": { + "clickTrackingParams": "CNEIEKCzAhgZIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCame-clC-0couNMsqr_U21w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNEIEKCzAhgZIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "QMQw_waEPi0", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNEIEKCzAhgZIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN4IEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "QMQw_waEPi0", + "playlistId": "RDAMVMQMQw_waEPi0", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1RTVF3X3dhRVBpMA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CN4IEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNwIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "QMQw_waEPi0", + "onEmptyQueue": { + "clickTrackingParams": "CNwIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "QMQw_waEPi0" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNwIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CN0IEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNwIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNoIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "QMQw_waEPi0", + "onEmptyQueue": { + "clickTrackingParams": "CNoIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "QMQw_waEPi0" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNoIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNsIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNoIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNgIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNkIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNkIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNgIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNYIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNcIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNcIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNYIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNUIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCame-clC-0couNMsqr_U21w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNUIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNQIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtRTVF3X3dhRVBpMA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNQIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNMIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNIIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "QMQw_waEPi0", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNIIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play STARBOYS - FANTASTICS from EXILE TRIBE" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause STARBOYS - FANTASTICS from EXILE TRIBE" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Sc2-3BK2mzM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3ldKdcDYSpL3N106EblH4gCff7AUQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Sc2-3BK2mzM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kxW2WOcsldGAoUkG3Zo2fB7xefqQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNAIEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Palpita (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Diljit Dosanjh", + "navigationEndpoint": { + "clickTrackingParams": "CMIIEKCzAhgaIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCJ2m-WpROlZCiZZID9r7NSQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Camilo", + "navigationEndpoint": { + "clickTrackingParams": "CMIIEKCzAhgaIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC0l2FUrxXnO8XwR0eqb-Nsg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "875K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMIIEKCzAhgaIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Sc2-3BK2mzM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMIIEKCzAhgaIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM8IEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Sc2-3BK2mzM", + "playlistId": "RDAMVMSc2-3BK2mzM", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1TYzItM0JLMm16TQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CM8IEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CM0IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Sc2-3BK2mzM", + "onEmptyQueue": { + "clickTrackingParams": "CM0IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Sc2-3BK2mzM" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CM0IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CM4IEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CM0IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMsIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Sc2-3BK2mzM", + "onEmptyQueue": { + "clickTrackingParams": "CMsIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Sc2-3BK2mzM" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMsIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMwIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMsIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMkIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMoIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMoIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMkIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMcIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMgIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMgIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMcIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMYIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCJ2m-WpROlZCiZZID9r7NSQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMYIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMUIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtTYzItM0JLMm16TQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMUIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMQIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMMIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Sc2-3BK2mzM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMMIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Palpita (Official Video) - Diljit Dosanjh" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Palpita (Official Video) - Diljit Dosanjh" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/bprHBlahnmM/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3lZGW8TEUMVw2BE3dX5qkAitEFXxg", + "width": 320, + "height": 180 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMEIEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Feel Good" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Jaime Wyatt", + "navigationEndpoint": { + "clickTrackingParams": "CLMIEKCzAhgbIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCUApRKc5Uc-rDP2QET6eieg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "44K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLMIEKCzAhgbIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bprHBlahnmM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLMIEKCzAhgbIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMAIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bprHBlahnmM", + "playlistId": "RDAMVMbprHBlahnmM", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1icHJIQmxhaG5tTQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMAIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CL4IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "bprHBlahnmM", + "onEmptyQueue": { + "clickTrackingParams": "CL4IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bprHBlahnmM" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CL4IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CL8IEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CL4IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLwIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "bprHBlahnmM", + "onEmptyQueue": { + "clickTrackingParams": "CLwIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bprHBlahnmM" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLwIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CL0IEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLwIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLoIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLsIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLsIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLoIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLgIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLkIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLkIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLgIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLcIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCUApRKc5Uc-rDP2QET6eieg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLcIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLYIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgticHJIQmxhaG5tTQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLYIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLUIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLQIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "bprHBlahnmM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLQIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Feel Good - Jaime Wyatt" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Feel Good - Jaime Wyatt" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/FMhHc5x2DzE/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mH3siFh5e2JHEQSvEOJvncGLZQDA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/FMhHc5x2DzE/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3luDDLWUFEtW7InFw9tPTYFCdmoOg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLIIEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "KOJO – Amsterdam (feat. Calin)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Calin", + "navigationEndpoint": { + "clickTrackingParams": "CKQIEKCzAhgcIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCwiGKkQcOlzMpXOc1xHFoeg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "119K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKQIEKCzAhgcIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "FMhHc5x2DzE", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKQIEKCzAhgcIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "FMhHc5x2DzE", + "playlistId": "RDAMVMFMhHc5x2DzE", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1GTWhIYzV4MkR6RQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLEIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CK8IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "FMhHc5x2DzE", + "onEmptyQueue": { + "clickTrackingParams": "CK8IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "FMhHc5x2DzE" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CK8IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLAIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CK8IEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CK0IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "FMhHc5x2DzE", + "onEmptyQueue": { + "clickTrackingParams": "CK0IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "FMhHc5x2DzE" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CK0IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CK4IEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CK0IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKsIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKwIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKwIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKsIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKkIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKoIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKoIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKkIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCwiGKkQcOlzMpXOc1xHFoeg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKgIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKcIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtGTWhIYzV4MkR6RQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKcIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKYIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKUIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "FMhHc5x2DzE", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKUIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play KOJO – Amsterdam (feat. Calin) - Calin" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause KOJO – Amsterdam (feat. Calin) - Calin" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/nOjbJdw2dPs/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kHhuH5SLAn-vTuNpBtKdgWmLX39w", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/nOjbJdw2dPs/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l8g_q8EQQWC2t_kGnkjcy20y8wgQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKMIEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Man To Man (Official Visualizer)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Freeman HKD", + "navigationEndpoint": { + "clickTrackingParams": "CJUIEKCzAhgdIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCSZUc2vHq3Z54Lcw7UgydYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "298K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJUIEKCzAhgdIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nOjbJdw2dPs", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJUIEKCzAhgdIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nOjbJdw2dPs", + "playlistId": "RDAMVMnOjbJdw2dPs", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1uT2piSmR3MmRQcw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKIIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKAIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "nOjbJdw2dPs", + "onEmptyQueue": { + "clickTrackingParams": "CKAIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nOjbJdw2dPs" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKAIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKEIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKAIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJ4IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "nOjbJdw2dPs", + "onEmptyQueue": { + "clickTrackingParams": "CJ4IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nOjbJdw2dPs" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJ4IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJ8IEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJ4IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJwIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ0IEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJ0IEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJwIEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJoIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJsIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJoIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCSZUc2vHq3Z54Lcw7UgydYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJkIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtuT2piSmR3MmRQcw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJgIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJcIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJYIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "nOjbJdw2dPs", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJYIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Man To Man (Official Visualizer) - Freeman HKD" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Man To Man (Official Visualizer) - Freeman HKD" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1G1zcTV5yX4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l7LlyEgeyZZfCB_xMQO-5O0QJVgA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/1G1zcTV5yX4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nRKV6MFk1bLD4eW3KaIX3r6iPU4g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJQIEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Those Eyes" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Amrit Maan", + "navigationEndpoint": { + "clickTrackingParams": "CIYIEKCzAhgeIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCVS6hZxkuygm-EzXHxWKbJQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "2.6M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIYIEKCzAhgeIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1G1zcTV5yX4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIYIEKCzAhgeIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJMIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1G1zcTV5yX4", + "playlistId": "RDAMVM1G1zcTV5yX4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0xRzF6Y1RWNXlYNA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJMIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJEIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1G1zcTV5yX4", + "onEmptyQueue": { + "clickTrackingParams": "CJEIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1G1zcTV5yX4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJEIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJIIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJEIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CI8IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1G1zcTV5yX4", + "onEmptyQueue": { + "clickTrackingParams": "CI8IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1G1zcTV5yX4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CI8IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJAIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CI8IEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CI0IEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI4IEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CI4IEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CI0IEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIsIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIwIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIwIEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIsIEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCVS6hZxkuygm-EzXHxWKbJQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIoIEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsxRzF6Y1RWNXlYNA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIkIEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIgIEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIcIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "1G1zcTV5yX4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIcIEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Those Eyes - Amrit Maan" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Those Eyes - Amrit Maan" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/BcbKoY7XpJE/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muuMAdW1t_ndO9ORJt7zQf_nwITg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/BcbKoY7XpJE/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kQbsQ9MecuO6-rfmeABL28L-Jfmg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIUIEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Trio Mandili - Psalm 50" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Trio Mandili", + "navigationEndpoint": { + "clickTrackingParams": "CPcHEKCzAhgfIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCuxZXXFOL3K3kEFGiAnp-Kw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "120K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPcHEKCzAhgfIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "BcbKoY7XpJE", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPcHEKCzAhgfIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIQIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "BcbKoY7XpJE", + "playlistId": "RDAMVMBcbKoY7XpJE", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1CY2JLb1k3WHBKRQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIQIEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIIIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "BcbKoY7XpJE", + "onEmptyQueue": { + "clickTrackingParams": "CIIIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "BcbKoY7XpJE" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIIIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIMIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIIIEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIAIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "BcbKoY7XpJE", + "onEmptyQueue": { + "clickTrackingParams": "CIAIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "BcbKoY7XpJE" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIAIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIEIEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIAIEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CP4HEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CP8HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CP8HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CP4HEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPwHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CP0HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CP0HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPwHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPsHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCuxZXXFOL3K3kEFGiAnp-Kw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPsHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtCY2JLb1k3WHBKRQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPoHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPkHEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPgHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "BcbKoY7XpJE", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPgHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Trio Mandili - Psalm 50 - Trio Mandili" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Trio Mandili - Psalm 50 - Trio Mandili" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/mq6zggKZTFU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mobGQ50xATxZxQ7OfFIYjV3ssqWQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/mq6zggKZTFU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lLrGBJmTv20ji9EGR6cEmDKu_JCA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPYHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Main Phir Bhi Tumko Chaahunga ((Jhankar)) Arijit Singh | Arjun Kapoor, Shraddha K | Half Girlfriend" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Anaskhan0064", + "navigationEndpoint": { + "clickTrackingParams": "COgHEKCzAhggIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCtNte05ndJf0BEN3hSmVEYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "100K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COgHEKCzAhggIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "mq6zggKZTFU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COgHEKCzAhggIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPUHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "mq6zggKZTFU", + "playlistId": "RDAMVMmq6zggKZTFU", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1tcTZ6Z2dLWlRGVQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPUHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPMHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "mq6zggKZTFU", + "onEmptyQueue": { + "clickTrackingParams": "CPMHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "mq6zggKZTFU" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPMHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPQHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPMHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPEHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "mq6zggKZTFU", + "onEmptyQueue": { + "clickTrackingParams": "CPEHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "mq6zggKZTFU" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPEHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPIHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPEHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CO8HEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPAHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPAHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CO8HEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CO0HEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO4HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CO4HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CO0HEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COwHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCtNte05ndJf0BEN3hSmVEYQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COwHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COsHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgttcTZ6Z2dLWlRGVQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COsHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COoHEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COkHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "mq6zggKZTFU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COkHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Main Phir Bhi Tumko Chaahunga ((Jhankar)) Arijit Singh | Arjun Kapoor, Shraddha K | Half Girlfriend - Anaskhan0064" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Main Phir Bhi Tumko Chaahunga ((Jhankar)) Arijit Singh | Arjun Kapoor, Shraddha K | Half Girlfriend - Anaskhan0064" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aQFl1xhloVo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kCYB8WC29f4CTJFwhSK5Z1lXqy-Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/aQFl1xhloVo/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lEuckq-NzuNMGv8j6tOOjBktMdnA", + "width": 426, + "height": 240 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COcHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Dil Ne Yeh Kaha (Love Song) Alka Y, Kumar S, Udit N | Dhadkan | Akshay Kumar, Sunil Shetty, Shilpa S" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Md Amir Hamja", + "navigationEndpoint": { + "clickTrackingParams": "CNoHEKCzAhghIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC0wV8tkoYYHxuEXgcQEQ7zA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_USER_CHANNEL" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNoHEKCzAhghIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aQFl1xhloVo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_UGC" + } + } + } + }, + "trackingParams": "CNoHEKCzAhghIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COYHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aQFl1xhloVo", + "playlistId": "RDAMVMaQFl1xhloVo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1hUUZsMXhobG9Wbw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_UGC" + } + } + } + }, + "trackingParams": "COYHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COQHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "aQFl1xhloVo", + "onEmptyQueue": { + "clickTrackingParams": "COQHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aQFl1xhloVo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COQHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COUHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COQHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COIHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "aQFl1xhloVo", + "onEmptyQueue": { + "clickTrackingParams": "COIHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aQFl1xhloVo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COIHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COMHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COIHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COAHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COEHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COEHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COAHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN4HEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CN8HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CN8HEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CN4HEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN0HEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgthUUZsMXhobG9Wbw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CN0HEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNwHEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNsHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "aQFl1xhloVo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_UGC" + } + } + } + }, + "trackingParams": "CNsHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Dil Ne Yeh Kaha (Love Song) Alka Y, Kumar S, Udit N | Dhadkan | Akshay Kumar, Sunil Shetty, Shilpa S - Md Amir Hamja" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Dil Ne Yeh Kaha (Love Song) Alka Y, Kumar S, Udit N | Dhadkan | Akshay Kumar, Sunil Shetty, Shilpa S - Md Amir Hamja" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/A3IhjA2aMUg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l-X1WHCQiDFLN8TIyOr3Ln_9aNpA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/A3IhjA2aMUg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mKUdo8MP0YBjm2h5lqURO1_z6dXw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNkHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Masithokoze (Official Music Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "DJ Stokie", + "navigationEndpoint": { + "clickTrackingParams": "CMsHEKCzAhgiIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCEvEiysS7crVEnNAXIx77tw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Eemoh", + "navigationEndpoint": { + "clickTrackingParams": "CMsHEKCzAhgiIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC01dDw3dxoeaZGVL2HiNBvA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "587K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsHEKCzAhgiIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A3IhjA2aMUg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMsHEKCzAhgiIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNgHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A3IhjA2aMUg", + "playlistId": "RDAMVMA3IhjA2aMUg", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1BM0loakEyYU1VZw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNgHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNYHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "A3IhjA2aMUg", + "onEmptyQueue": { + "clickTrackingParams": "CNYHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A3IhjA2aMUg" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNYHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNcHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNYHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNQHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "A3IhjA2aMUg", + "onEmptyQueue": { + "clickTrackingParams": "CNQHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A3IhjA2aMUg" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNQHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNUHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNQHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNIHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNMHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNMHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNIHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNAHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNEHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNEHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNAHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM8HEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCEvEiysS7crVEnNAXIx77tw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CM8HEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM4HEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtBM0loakEyYU1VZw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CM4HEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CM0HEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMwHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "A3IhjA2aMUg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMwHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Masithokoze (Official Music Video) - DJ Stokie" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Masithokoze (Official Music Video) - DJ Stokie" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/cxIOWM0xLc4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l6JZ8sLRXsC9L6Ws_58lb0RllZFg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/cxIOWM0xLc4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3netHLf6Y7ATJJpE-fvA-Sd36YekA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMoHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Kivumbi King - Wine (Official Music Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Kivumbi king", + "navigationEndpoint": { + "clickTrackingParams": "CLwHEKCzAhgjIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCXHklVWUoqHEKrcaJ5JixKw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "137K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLwHEKCzAhgjIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "cxIOWM0xLc4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLwHEKCzAhgjIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "cxIOWM0xLc4", + "playlistId": "RDAMVMcxIOWM0xLc4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1jeElPV00weExjNA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMkHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMcHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "cxIOWM0xLc4", + "onEmptyQueue": { + "clickTrackingParams": "CMcHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "cxIOWM0xLc4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMcHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMgHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMcHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMUHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "cxIOWM0xLc4", + "onEmptyQueue": { + "clickTrackingParams": "CMUHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "cxIOWM0xLc4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMUHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMYHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMUHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMMHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMQHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMQHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMMHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMEHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMIHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMIHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMEHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMAHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCXHklVWUoqHEKrcaJ5JixKw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMAHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8HEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtjeElPV00weExjNA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CL8HEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CL4HEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CL0HEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "cxIOWM0xLc4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CL0HEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Kivumbi King - Wine (Official Music Video) - Kivumbi king" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Kivumbi King - Wine (Official Music Video) - Kivumbi king" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/IFKAgKgVaSI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mUaaFNpI0Us5y7LI28dncTZR7OXg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/IFKAgKgVaSI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kohd7W_OhB8vibDrsvbZapQKYiSQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLsHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Mombasa Nairobi" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Baba Harare", + "navigationEndpoint": { + "clickTrackingParams": "CK0HEKCzAhgkIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCn30hmDp52npfCIHHgULM7A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "154K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0HEKCzAhgkIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "IFKAgKgVaSI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CK0HEKCzAhgkIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "IFKAgKgVaSI", + "playlistId": "RDAMVMIFKAgKgVaSI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1JRktBZ0tnVmFTSQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLoHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLgHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "IFKAgKgVaSI", + "onEmptyQueue": { + "clickTrackingParams": "CLgHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "IFKAgKgVaSI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLgHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLkHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLgHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLYHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "IFKAgKgVaSI", + "onEmptyQueue": { + "clickTrackingParams": "CLYHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "IFKAgKgVaSI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLYHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLcHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLYHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLQHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLUHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLUHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLQHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLIHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLMHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLMHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLIHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCn30hmDp52npfCIHHgULM7A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLEHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLAHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtJRktBZ0tnVmFTSQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLAHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CK8HEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CK4HEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "IFKAgKgVaSI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CK4HEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Mombasa Nairobi - Baba Harare" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Mombasa Nairobi - Baba Harare" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/iGUN99hW3nU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n_u9BAV02NAgdgwnBEhFIyEuHAvg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/iGUN99hW3nU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lbk5MlwB-PZeKpKSc9BVO02xfdIw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKwHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "LILA - ANASAINO KAI ZALIZOMAI (Official Music Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Barcode Entertainment" + }, + { + "text": " • " + }, + { + "text": "1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8HEKCzAhglIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "iGUN99hW3nU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJ8HEKCzAhglIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "iGUN99hW3nU", + "playlistId": "RDAMVMiGUN99hW3nU", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1pR1VOOTloVzNuVQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKsHEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKkHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "iGUN99hW3nU", + "onEmptyQueue": { + "clickTrackingParams": "CKkHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "iGUN99hW3nU" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKkHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKoHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKkHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKcHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "iGUN99hW3nU", + "onEmptyQueue": { + "clickTrackingParams": "CKcHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "iGUN99hW3nU" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKcHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKgHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKcHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKUHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKYHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKYHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKUHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKMHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKQHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKQHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKMHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIHEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtpR1VOOTloVzNuVQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKIHEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKEHEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKAHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "iGUN99hW3nU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKAHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play LILA - ANASAINO KAI ZALIZOMAI (Official Music Video) - Barcode Entertainment" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause LILA - ANASAINO KAI ZALIZOMAI (Official Music Video) - Barcode Entertainment" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_alKEACsIds/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l9YO5aHTy7bzIiv0uRJugVuEl_Nw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/_alKEACsIds/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nfBJFMzBWveP1LxumubgWtOmPR8g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJ4HEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "ฮ้อยฮัก" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Tai Orathai & TOEY APIWAT" + }, + { + "text": " • " + }, + { + "text": "913K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJAHEKCzAhgmIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_alKEACsIds", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJAHEKCzAhgmIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ0HEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_alKEACsIds", + "playlistId": "RDAMVM_alKEACsIds", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1fYWxLRUFDc0lkcw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJ0HEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJsHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "_alKEACsIds", + "onEmptyQueue": { + "clickTrackingParams": "CJsHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_alKEACsIds" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJsHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJwHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJsHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJkHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "_alKEACsIds", + "onEmptyQueue": { + "clickTrackingParams": "CJkHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "_alKEACsIds" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJkHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJoHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJkHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJcHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJgHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJcHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJUHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJYHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJYHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJUHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJQHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCSOoEp94wW2Ja455Byawrtg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJQHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJMHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtfYWxLRUFDc0lkcw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJMHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJIHEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJEHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "_alKEACsIds", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJEHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play ฮ้อยฮัก - Tai Orathai" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause ฮ้อยฮัก - Tai Orathai" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/WGNJIF7OoAc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n5GERxK8v5L1zNOLOn8Vbnpy34Mw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/WGNJIF7OoAc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nNht-elEFxY2EFSOn78o4gcLex6g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CI8HEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "No han cambiado" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Morad", + "navigationEndpoint": { + "clickTrackingParams": "CIEHEKCzAhgnIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCoHMUugeU6PWB9ePTOV7WJw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.9M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIEHEKCzAhgnIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "WGNJIF7OoAc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIEHEKCzAhgnIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI4HEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "WGNJIF7OoAc", + "playlistId": "RDAMVMWGNJIF7OoAc", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1XR05KSUY3T29BYw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CI4HEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIwHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "WGNJIF7OoAc", + "onEmptyQueue": { + "clickTrackingParams": "CIwHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "WGNJIF7OoAc" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIwHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CI0HEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIwHEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIoHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "WGNJIF7OoAc", + "onEmptyQueue": { + "clickTrackingParams": "CIoHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "WGNJIF7OoAc" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIoHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIsHEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIoHEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIgHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIkHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIgHEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIYHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIcHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIcHEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIYHEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIUHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCoHMUugeU6PWB9ePTOV7WJw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIUHEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIQHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtXR05KSUY3T29BYw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIQHEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIMHEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIIHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "WGNJIF7OoAc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIIHEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play No han cambiado - Morad" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause No han cambiado - Morad" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/a_TotMZ5hxc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3m-Vb1g7oHUMgtw4tjpgl_lIO8trg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/a_TotMZ5hxc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nm2Tin71UyK0ULtLuEacBu2ORBYQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIAHEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Zero cukru" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Gibbs", + "navigationEndpoint": { + "clickTrackingParams": "CPIGEKCzAhgoIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCLCR-FbVVq1GsETOtdGG-mw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Jonatan", + "navigationEndpoint": { + "clickTrackingParams": "CPIGEKCzAhgoIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC1IrhHynbHqZneNyNnTQMxA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "681K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPIGEKCzAhgoIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "a_TotMZ5hxc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPIGEKCzAhgoIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP8GEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "a_TotMZ5hxc", + "playlistId": "RDAMVMa_TotMZ5hxc", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1hX1RvdE1aNWh4Yw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CP8GEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CP0GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "a_TotMZ5hxc", + "onEmptyQueue": { + "clickTrackingParams": "CP0GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "a_TotMZ5hxc" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CP0GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CP4GEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CP0GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPsGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "a_TotMZ5hxc", + "onEmptyQueue": { + "clickTrackingParams": "CPsGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "a_TotMZ5hxc" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPsGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPwGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPsGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CPkGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPoGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CPkGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPcGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPgGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPgGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPcGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPYGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCLCR-FbVVq1GsETOtdGG-mw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPYGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPUGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgthX1RvdE1aNWh4Yw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPUGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPQGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPMGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "a_TotMZ5hxc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPMGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Zero cukru - Gibbs" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Zero cukru - Gibbs" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0eoeyKkWBRs/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nlXPwget3zjP8wadYENJwNulJqVQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/0eoeyKkWBRs/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k8vSx9iCTBRi02u0XGr4-7afWYDg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPEGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Alma Viajera (En Vivo)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Mancel Cardenas & Chico Soto" + }, + { + "text": " • " + }, + { + "text": "19K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COMGEKCzAhgpIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "0eoeyKkWBRs", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COMGEKCzAhgpIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPAGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "0eoeyKkWBRs", + "playlistId": "RDAMVM0eoeyKkWBRs", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0wZW9leUtrV0JScw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPAGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CO4GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "0eoeyKkWBRs", + "onEmptyQueue": { + "clickTrackingParams": "CO4GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "0eoeyKkWBRs" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CO4GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CO8GEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CO4GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COwGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "0eoeyKkWBRs", + "onEmptyQueue": { + "clickTrackingParams": "COwGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "0eoeyKkWBRs" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COwGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CO0GEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COwGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COoGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COsGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COsGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COoGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COgGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COkGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COkGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COgGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COcGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC0OuIG0OwrtzLt50pn79f1Q", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COcGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COYGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgswZW9leUtrV0JScw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COYGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COUGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COQGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "0eoeyKkWBRs", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COQGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Alma Viajera (En Vivo) - Mancel Cardenas" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Alma Viajera (En Vivo) - Mancel Cardenas" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DU4NtqyTnuM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3knlRDwvOAtLfNJ8Ox6vSBbqcvR3Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/DU4NtqyTnuM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mqFBMjr2H-0Ubq-haBSzimxiDGwA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COIGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Akatsuki" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Maes", + "navigationEndpoint": { + "clickTrackingParams": "CNQGEKCzAhgqIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCu3WJjXqlYozV9s8sGYPySA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.7M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNQGEKCzAhgqIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DU4NtqyTnuM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNQGEKCzAhgqIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COEGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DU4NtqyTnuM", + "playlistId": "RDAMVMDU4NtqyTnuM", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1EVTROdHF5VG51TQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COEGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CN8GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "DU4NtqyTnuM", + "onEmptyQueue": { + "clickTrackingParams": "CN8GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DU4NtqyTnuM" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CN8GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COAGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CN8GEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CN0GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "DU4NtqyTnuM", + "onEmptyQueue": { + "clickTrackingParams": "CN0GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DU4NtqyTnuM" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CN0GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CN4GEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CN0GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNsGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNwGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNwGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNsGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNkGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNoGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNoGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNkGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNgGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCu3WJjXqlYozV9s8sGYPySA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNgGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNcGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtEVTROdHF5VG51TQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNcGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNYGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNUGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "DU4NtqyTnuM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNUGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Akatsuki - Maes" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Akatsuki - Maes" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kLbn61Z4LDI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kUOqHNcZM6tkhMM6mIM20FG5aiNA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/kLbn61Z4LDI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k4qo7l1DucPx0nezG9FSiPEwpOsQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNMGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Feather (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Sabrina Carpenter", + "navigationEndpoint": { + "clickTrackingParams": "CMUGEKCzAhgrIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCz51ZodJbYUNfkdPHOjJKKw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "7M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMUGEKCzAhgrIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kLbn61Z4LDI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMUGEKCzAhgrIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNIGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kLbn61Z4LDI", + "playlistId": "RDAMVMkLbn61Z4LDI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1rTGJuNjFaNExESQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNIGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNAGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "kLbn61Z4LDI", + "onEmptyQueue": { + "clickTrackingParams": "CNAGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kLbn61Z4LDI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNAGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNEGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNAGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CM4GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "kLbn61Z4LDI", + "onEmptyQueue": { + "clickTrackingParams": "CM4GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kLbn61Z4LDI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CM4GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CM8GEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CM4GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMwGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM0GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM0GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMwGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMoGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMsGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMoGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCz51ZodJbYUNfkdPHOjJKKw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMkGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMgGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtrTGJuNjFaNExESQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMgGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMcGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMYGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "kLbn61Z4LDI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMYGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Feather (Official Video) - Sabrina Carpenter" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Feather (Official Video) - Sabrina Carpenter" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/vMFNI5lOLwU/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n30tE3s7nJpt_Hli18N_iCkk3cfg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/vMFNI5lOLwU/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nzpYgdzUaPIJ952Re0Mrc-Woq2EA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMQGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Pata Dedunu" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Sunil Edirisinghe", + "navigationEndpoint": { + "clickTrackingParams": "CLYGEKCzAhgsIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCSRPntvq2xLXQtZwE2fA__w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": ", " + }, + { + "text": "Kumaradasa Saputhanthri", + "navigationEndpoint": { + "clickTrackingParams": "CLYGEKCzAhgsIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCTDvPJSG1cge8b_MTMidh7w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Rohana Weerasinghe", + "navigationEndpoint": { + "clickTrackingParams": "CLYGEKCzAhgsIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCbuvpPfaAmLHZw5sFaj4Rog", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "43K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLYGEKCzAhgsIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vMFNI5lOLwU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLYGEKCzAhgsIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMMGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vMFNI5lOLwU", + "playlistId": "RDAMVMvMFNI5lOLwU", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk12TUZOSTVsT0x3VQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMMGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMEGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "vMFNI5lOLwU", + "onEmptyQueue": { + "clickTrackingParams": "CMEGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vMFNI5lOLwU" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMEGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMIGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMEGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CL8GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "vMFNI5lOLwU", + "onEmptyQueue": { + "clickTrackingParams": "CL8GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vMFNI5lOLwU" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CL8GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMAGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CL8GEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CL0GEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL4GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CL4GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CL0GEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLsGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLwGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLwGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLsGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCSRPntvq2xLXQtZwE2fA__w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLoGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLkGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt2TUZOSTVsT0x3VQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLkGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLgGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLcGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "vMFNI5lOLwU", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLcGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Pata Dedunu - Sunil Edirisinghe" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Pata Dedunu - Sunil Edirisinghe" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/AZoZbtI67Yk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mrr__dZksyNjsPPlAs-Fe97odpTw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/AZoZbtI67Yk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n5QsNlPqqQfhxkL_Z7ZkblTisJpA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLUGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "가시" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "ZEROBASEONE", + "navigationEndpoint": { + "clickTrackingParams": "CKcGEKCzAhgtIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCjikjZ91JLx_e-2i9nrhhSg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "21M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKcGEKCzAhgtIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "AZoZbtI67Yk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKcGEKCzAhgtIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLQGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "AZoZbtI67Yk", + "playlistId": "RDAMVMAZoZbtI67Yk", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1BWm9aYnRJNjdZaw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLQGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLIGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "AZoZbtI67Yk", + "onEmptyQueue": { + "clickTrackingParams": "CLIGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "AZoZbtI67Yk" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLIGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLMGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLIGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLAGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "AZoZbtI67Yk", + "onEmptyQueue": { + "clickTrackingParams": "CLAGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "AZoZbtI67Yk" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLAGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLEGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLAGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CK4GEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CK8GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CK4GEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKwGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CK0GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKwGEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCjikjZ91JLx_e-2i9nrhhSg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKsGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKoGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtBWm9aYnRJNjdZaw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKoGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKkGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKgGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "AZoZbtI67Yk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKgGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play 가시 - ZEROBASEONE" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause 가시 - ZEROBASEONE" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Ah4Dn3VAnMk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3luhVL6JPpgDDCW4bYMVxF5YZP_wA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Ah4Dn3VAnMk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kaIyaa4MsdhRYqb1D8KWVGN98q0Q", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKYGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Badman Love" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Jayboogz", + "navigationEndpoint": { + "clickTrackingParams": "CJgGEKCzAhguIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCIHQbC5CEmgPkBKO9gOXyBQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "138K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgGEKCzAhguIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ah4Dn3VAnMk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJgGEKCzAhguIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKUGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ah4Dn3VAnMk", + "playlistId": "RDAMVMAh4Dn3VAnMk", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1BaDREbjNWQW5Naw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKUGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKMGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Ah4Dn3VAnMk", + "onEmptyQueue": { + "clickTrackingParams": "CKMGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ah4Dn3VAnMk" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKMGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKQGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKMGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKEGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Ah4Dn3VAnMk", + "onEmptyQueue": { + "clickTrackingParams": "CKEGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ah4Dn3VAnMk" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKEGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKIGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKEGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJ8GEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKAGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKAGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJ8GEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ0GEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ4GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJ4GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJ0GEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCIHQbC5CEmgPkBKO9gOXyBQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJwGEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtBaDREbjNWQW5Naw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJsGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJoGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJkGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Ah4Dn3VAnMk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJkGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Badman Love - Jayboogz" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Badman Love - Jayboogz" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/sLklEvxhmAQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k0CCEn6m4H_y99ALl5BJEKICRX9g", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/sLklEvxhmAQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lbkAv4Ty7v-Rb3_t55ZxJginh22A", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJcGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Vado Más Ki Ás ft Rafa G & Estraca - Todo o Terreno" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Vado Más Ki Ás", + "navigationEndpoint": { + "clickTrackingParams": "CIkGEKCzAhgvIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCC_ZUtrLVilXKVbOJB3wDVA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "134K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkGEKCzAhgvIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "sLklEvxhmAQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIkGEKCzAhgvIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJYGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "sLklEvxhmAQ", + "playlistId": "RDAMVMsLklEvxhmAQ", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1zTGtsRXZ4aG1BUQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJYGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJQGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "sLklEvxhmAQ", + "onEmptyQueue": { + "clickTrackingParams": "CJQGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "sLklEvxhmAQ" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJQGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJUGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJQGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJIGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "sLklEvxhmAQ", + "onEmptyQueue": { + "clickTrackingParams": "CJIGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "sLklEvxhmAQ" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJIGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJMGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJIGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJAGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJEGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJEGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJAGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI4GEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI8GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CI8GEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CI4GEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0GEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCC_ZUtrLVilXKVbOJB3wDVA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CI0GEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIwGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtzTGtsRXZ4aG1BUQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIwGEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIsGEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIoGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "sLklEvxhmAQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIoGEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Vado Más Ki Ás ft Rafa G & Estraca - Todo o Terreno - Vado Más Ki Ás" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Vado Más Ki Ás ft Rafa G & Estraca - Todo o Terreno - Vado Más Ki Ás" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/2Lbp1P4pP6c/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lDYgmtahVVsARdXFf8NX6eyvS8fQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/2Lbp1P4pP6c/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3npIS4xF3MyqCwDDkLJo-7KLwAWJg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIgGEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Likkle Law Boss (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Chronic Law", + "navigationEndpoint": { + "clickTrackingParams": "CPoFEKCzAhgwIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCksBsDumncwulY5-MC6xWDA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "612K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoFEKCzAhgwIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2Lbp1P4pP6c", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPoFEKCzAhgwIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIcGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2Lbp1P4pP6c", + "playlistId": "RDAMVM2Lbp1P4pP6c", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0yTGJwMVA0cFA2Yw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIcGEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIUGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2Lbp1P4pP6c", + "onEmptyQueue": { + "clickTrackingParams": "CIUGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2Lbp1P4pP6c" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIUGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIYGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIUGEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIMGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2Lbp1P4pP6c", + "onEmptyQueue": { + "clickTrackingParams": "CIMGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2Lbp1P4pP6c" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIMGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIQGEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIMGEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIEGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIIGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIIGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIEGEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP8FEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIAGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIAGEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CP8FEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4FEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCksBsDumncwulY5-MC6xWDA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CP4FEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP0FEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsyTGJwMVA0cFA2Yw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CP0FEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPwFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPsFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "2Lbp1P4pP6c", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPsFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Likkle Law Boss (Official Video) - Chronic Law" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Likkle Law Boss (Official Video) - Chronic Law" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/2TYIa09PXyo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lQs5iJK1V7G2sNLxtNd41o2-oArw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/2TYIa09PXyo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nwWkjKJLrm-feMF4ULJfE6krmHXQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPkFEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "BAARISH KE AANE SE", + "navigationEndpoint": { + "clickTrackingParams": "CO4FEKCzAhgxIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "MPED2TYIa09PXyo", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" + } + } + } + } + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "4 min 4 sec" + }, + { + "text": " • " + }, + { + "text": "Shreya Ghoshal", + "navigationEndpoint": { + "clickTrackingParams": "CO4FEKCzAhgxIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCrC-7fsdTCYeaRBpwA6j-Eg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO4FEKCzAhgxIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "MPED2TYIa09PXyo", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" + } + } + } + }, + "trackingParams": "CO4FEKCzAhgxIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPcFEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2TYIa09PXyo", + "onEmptyQueue": { + "clickTrackingParams": "CPcFEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2TYIa09PXyo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPcFEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Episode will play next" + } + ] + }, + "trackingParams": "CPgFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPcFEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPUFEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2TYIa09PXyo", + "onEmptyQueue": { + "clickTrackingParams": "CPUFEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2TYIa09PXyo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPUFEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Episode added to queue" + } + ] + }, + "trackingParams": "CPYFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPUFEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPMFEMOUBhgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPQFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPQFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPMFEMOUBhgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPIFEJD7BRgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCrC-7fsdTCYeaRBpwA6j-Eg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPIFEJD7BRgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPEFEJH7BRgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsyVFlJYTA5UFh5bw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPEFEJH7BRgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPAFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CO8FEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "2TYIa09PXyo", + "params": "8gEDmAEI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_PODCAST_EPISODE" + } + } + } + }, + "trackingParams": "CO8FEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play BAARISH KE AANE SE - Shreya Ghoshal" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause BAARISH KE AANE SE - Shreya Ghoshal" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Hdy7l8fkREo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mRnmv82uJ0CCdY0tO2vM_sD9ym8A", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Hdy7l8fkREo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mnn5HYwbUeo0rKF91lxjeax7Z8OQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CO0FEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "J'Fais Que Danser" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "JUL", + "navigationEndpoint": { + "clickTrackingParams": "CN8FEKCzAhgyIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCYO-8CIkoBoUG2nOWz57Q9g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.7M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CN8FEKCzAhgyIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Hdy7l8fkREo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CN8FEKCzAhgyIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COwFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Hdy7l8fkREo", + "playlistId": "RDAMVMHdy7l8fkREo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1IZHk3bDhma1JFbw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COwFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COoFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Hdy7l8fkREo", + "onEmptyQueue": { + "clickTrackingParams": "COoFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Hdy7l8fkREo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COoFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COsFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COoFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COgFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Hdy7l8fkREo", + "onEmptyQueue": { + "clickTrackingParams": "COgFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Hdy7l8fkREo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COgFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COkFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COgFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COYFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COcFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COcFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COYFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COQFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COUFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COUFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COQFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COMFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCYO-8CIkoBoUG2nOWz57Q9g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COMFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COIFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtIZHk3bDhma1JFbw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COIFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COEFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COAFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Hdy7l8fkREo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COAFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play J'Fais Que Danser - JUL" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause J'Fais Que Danser - JUL" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/A-sjPe3xvqY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lZpIuCnNWxuYrgJaJhnwEN8sUJ8g", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/A-sjPe3xvqY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kH3KkyGD7gBb4S_ywJo7d4DXvHCw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CN4FEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "INCUBI (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Noyz Narcos", + "navigationEndpoint": { + "clickTrackingParams": "CNAFEKCzAhgzIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC5-_N4l38iyasppZ5MPILXg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Salmo", + "navigationEndpoint": { + "clickTrackingParams": "CNAFEKCzAhgzIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCeUme4ODz03aMX72dZWXsFw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "988K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNAFEKCzAhgzIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A-sjPe3xvqY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNAFEKCzAhgzIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN0FEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A-sjPe3xvqY", + "playlistId": "RDAMVMA-sjPe3xvqY", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1BLXNqUGUzeHZxWQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CN0FEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNsFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "A-sjPe3xvqY", + "onEmptyQueue": { + "clickTrackingParams": "CNsFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A-sjPe3xvqY" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNsFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNwFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNsFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNkFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "A-sjPe3xvqY", + "onEmptyQueue": { + "clickTrackingParams": "CNkFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "A-sjPe3xvqY" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNkFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNoFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNkFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNcFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNgFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNgFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNcFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNUFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNYFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNYFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNUFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNQFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC5-_N4l38iyasppZ5MPILXg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNQFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNMFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtBLXNqUGUzeHZxWQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNMFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNIFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNEFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "A-sjPe3xvqY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNEFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play INCUBI (Official Video) - Noyz Narcos" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause INCUBI (Official Video) - Noyz Narcos" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/jFVX_v2yAas/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nnVsARIfXeRQ2OKz2-BWm11LwNoA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/jFVX_v2yAas/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lSUM_eVsGCb_SreMHHWXLnLdsllA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CM8FEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Josephine - Μοίρα - Official Music Video" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Josephine", + "navigationEndpoint": { + "clickTrackingParams": "CMEFEKCzAhg0IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCLpm6-66iqUlOG28abww73w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "454K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMEFEKCzAhg0IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "jFVX_v2yAas", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMEFEKCzAhg0IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM4FEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "jFVX_v2yAas", + "playlistId": "RDAMVMjFVX_v2yAas", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1qRlZYX3YyeUFhcw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CM4FEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMwFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "jFVX_v2yAas", + "onEmptyQueue": { + "clickTrackingParams": "CMwFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "jFVX_v2yAas" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMwFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CM0FEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMwFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMoFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "jFVX_v2yAas", + "onEmptyQueue": { + "clickTrackingParams": "CMoFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "jFVX_v2yAas" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMoFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMsFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMoFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMgFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMkFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMgFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMYFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMcFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMcFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMYFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMUFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCLpm6-66iqUlOG28abww73w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMUFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMQFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtqRlZYX3YyeUFhcw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMQFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMMFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMIFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "jFVX_v2yAas", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMIFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Josephine - Μοίρα - Official Music Video - Josephine" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Josephine - Μοίρα - Official Music Video - Josephine" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/YDfL2Ns8wz4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mrnSBrtgC0pPiWEVbMYpen3N3WJQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/YDfL2Ns8wz4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3l1sxjBJiFUQAejLIiuyv3OImx_wQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMAFEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Jivashe Nahi Tamara Vagar" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Kajal Maheriya", + "navigationEndpoint": { + "clickTrackingParams": "CLIFEKCzAhg1IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC1rqUUukLEcgGBMChrH3y_w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "738K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLIFEKCzAhg1IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YDfL2Ns8wz4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLIFEKCzAhg1IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8FEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YDfL2Ns8wz4", + "playlistId": "RDAMVMYDfL2Ns8wz4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ZRGZMMk5zOHd6NA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CL8FEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CL0FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "YDfL2Ns8wz4", + "onEmptyQueue": { + "clickTrackingParams": "CL0FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YDfL2Ns8wz4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CL0FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CL4FEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CL0FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLsFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "YDfL2Ns8wz4", + "onEmptyQueue": { + "clickTrackingParams": "CLsFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YDfL2Ns8wz4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLsFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLwFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLsFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLkFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLoFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLkFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLcFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLgFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLgFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLcFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLYFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC1rqUUukLEcgGBMChrH3y_w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLYFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLUFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtZRGZMMk5zOHd6NA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLUFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLQFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLMFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "YDfL2Ns8wz4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLMFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Jivashe Nahi Tamara Vagar - Kajal Maheriya" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Jivashe Nahi Tamara Vagar - Kajal Maheriya" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/du4hVdxqyr8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nZaM1No81FXY3L2I6_Ap8tuAm1ZA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/du4hVdxqyr8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mr2ifLAwnCgQxjgFcDCLj7HuFsqA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLEFEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "OLHA PRA NÓS (feat. Carolina Deslandes)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Soraia Ramos", + "navigationEndpoint": { + "clickTrackingParams": "CKMFEKCzAhg2IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCMXADr_MS_MdbOouS7ZMc8w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "234K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKMFEKCzAhg2IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "du4hVdxqyr8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKMFEKCzAhg2IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLAFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "du4hVdxqyr8", + "playlistId": "RDAMVMdu4hVdxqyr8", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1kdTRoVmR4cXlyOA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLAFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CK4FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "du4hVdxqyr8", + "onEmptyQueue": { + "clickTrackingParams": "CK4FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "du4hVdxqyr8" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CK4FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CK8FEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CK4FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKwFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "du4hVdxqyr8", + "onEmptyQueue": { + "clickTrackingParams": "CKwFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "du4hVdxqyr8" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKwFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CK0FEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKwFEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKoFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKsFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKoFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKkFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKkFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKgFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKcFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCMXADr_MS_MdbOouS7ZMc8w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKcFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKYFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtkdTRoVmR4cXlyOA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKYFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKUFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKQFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "du4hVdxqyr8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKQFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play OLHA PRA NÓS - Soraia Ramos" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause OLHA PRA NÓS - Soraia Ramos" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/G5vlW0PZ878/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lNTj6RlQkHbdUmzHd8bs9F5tv1Yw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/G5vlW0PZ878/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k2ZGt7Wv_hnIexrCIUeUyn1mV8rQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKIFEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Emproblemao" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Under Side 821", + "navigationEndpoint": { + "clickTrackingParams": "CJQFEKCzAhg3IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCN3lpPbZIK3CgTWTtriwWMQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "113K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJQFEKCzAhg3IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "G5vlW0PZ878", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJQFEKCzAhg3IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKEFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "G5vlW0PZ878", + "playlistId": "RDAMVMG5vlW0PZ878", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1HNXZsVzBQWjg3OA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKEFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJ8FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "G5vlW0PZ878", + "onEmptyQueue": { + "clickTrackingParams": "CJ8FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "G5vlW0PZ878" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJ8FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKAFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJ8FEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJ0FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "G5vlW0PZ878", + "onEmptyQueue": { + "clickTrackingParams": "CJ0FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "G5vlW0PZ878" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJ0FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJ4FEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJ0FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJsFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJwFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJsFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJoFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJoFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJkFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCN3lpPbZIK3CgTWTtriwWMQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJgFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJcFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtHNXZsVzBQWjg3OA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJcFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJYFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJUFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "G5vlW0PZ878", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJUFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Emproblemao - Under Side 821" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Emproblemao - Under Side 821" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Gtg2TSR19Mg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3m2vu6Vxtl9aze-eWFtiMJLA-Imwg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Gtg2TSR19Mg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lx9IaizBzDsjvR1srf6EvEEey4Zw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJMFEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Daily Duppy (feat. GRM Daily)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Central Cee", + "navigationEndpoint": { + "clickTrackingParams": "CIUFEKCzAhg4IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCiDD2aSYdgxSPE2YUm5lEjg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "702K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIUFEKCzAhg4IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtg2TSR19Mg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIUFEKCzAhg4IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJIFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtg2TSR19Mg", + "playlistId": "RDAMVMGtg2TSR19Mg", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1HdGcyVFNSMTlNZw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJIFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJAFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Gtg2TSR19Mg", + "onEmptyQueue": { + "clickTrackingParams": "CJAFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtg2TSR19Mg" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJAFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJEFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJAFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CI4FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Gtg2TSR19Mg", + "onEmptyQueue": { + "clickTrackingParams": "CI4FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtg2TSR19Mg" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CI4FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CI8FEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CI4FEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIwFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0FEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CI0FEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIwFEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIsFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIsFEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIoFEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCiDD2aSYdgxSPE2YUm5lEjg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIkFEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIgFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtHdGcyVFNSMTlNZw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIgFEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIcFEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIYFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Gtg2TSR19Mg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIYFEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Daily Duppy - Central Cee" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Daily Duppy - Central Cee" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/vJ3wwezOV_8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k8IgehDTrUcFpjeWe0GUQnxQckFA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/vJ3wwezOV_8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mnyjXea09G0xWsPxc1Pap_c_Th0w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIQFEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Denis - Książę z Bajki (Official Video) Ambitne Disco Polo" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Denis Impulsywni", + "navigationEndpoint": { + "clickTrackingParams": "CPYEEKCzAhg5IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCMg_DZ4fMJGCohPYnBTLtpA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "72K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPYEEKCzAhg5IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vJ3wwezOV_8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPYEEKCzAhg5IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vJ3wwezOV_8", + "playlistId": "RDAMVMvJ3wwezOV_8", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk12SjN3d2V6T1ZfOA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIMFEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIEFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "vJ3wwezOV_8", + "onEmptyQueue": { + "clickTrackingParams": "CIEFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vJ3wwezOV_8" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIEFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIIFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIEFEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CP8EEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "vJ3wwezOV_8", + "onEmptyQueue": { + "clickTrackingParams": "CP8EEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "vJ3wwezOV_8" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CP8EEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIAFEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CP8EEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CP0EEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CP4EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CP0EEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPsEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPwEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPwEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPsEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCMg_DZ4fMJGCohPYnBTLtpA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPoEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPkEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt2SjN3d2V6T1ZfOA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPkEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPgEEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPcEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "vJ3wwezOV_8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPcEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Denis - Książę z Bajki (Official Video) Ambitne Disco Polo - Denis Impulsywni" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Denis - Książę z Bajki (Official Video) Ambitne Disco Polo - Denis Impulsywni" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/76q5EiRyYks/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lzRPJr2yeWK-DBsbCYURjXo18FwQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/76q5EiRyYks/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k_nHonbwyRftbbxSVe5Rkj1f02yg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPUEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Anonimus ရဲ့ သီချင်းသစ် (မြို့မအနောက်ဘက်) Official Music Vdo" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Ko Feel", + "navigationEndpoint": { + "clickTrackingParams": "COcEEKCzAhg6IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCn5SLnGaBcsusekOkSndmWg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "265K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COcEEKCzAhg6IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "76q5EiRyYks", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COcEEKCzAhg6IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPQEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "76q5EiRyYks", + "playlistId": "RDAMVM76q5EiRyYks", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk03NnE1RWlSeVlrcw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPQEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPIEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "76q5EiRyYks", + "onEmptyQueue": { + "clickTrackingParams": "CPIEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "76q5EiRyYks" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPIEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPMEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPIEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPAEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "76q5EiRyYks", + "onEmptyQueue": { + "clickTrackingParams": "CPAEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "76q5EiRyYks" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPAEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPEEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPAEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CO4EEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO8EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CO8EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CO4EEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COwEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO0EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CO0EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COwEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COsEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCn5SLnGaBcsusekOkSndmWg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COsEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COoEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs3NnE1RWlSeVlrcw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COoEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COkEEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COgEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "76q5EiRyYks", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COgEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Anonimus ရဲ့ သီချင်းသစ် (မြို့မအနောက်ဘက်) Official Music Vdo - Ko Feel" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Anonimus ရဲ့ သီချင်းသစ် (မြို့မအနောက်ဘက်) Official Music Vdo - Ko Feel" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/nEjntI9GMVM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lb4YnUouthUbU5VOfpkR5YMHZFrA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/nEjntI9GMVM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3k7LqTCFv-FIZhPd5Weq-ezEcS3OQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COYEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "TE AMO 2" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Berechet", + "navigationEndpoint": { + "clickTrackingParams": "CNgEEKCzAhg7IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCiC_vxasVKRDBvZBaMIEGdg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "49K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNgEEKCzAhg7IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nEjntI9GMVM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNgEEKCzAhg7IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COUEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nEjntI9GMVM", + "playlistId": "RDAMVMnEjntI9GMVM", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1uRWpudEk5R01WTQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COUEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COMEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "nEjntI9GMVM", + "onEmptyQueue": { + "clickTrackingParams": "COMEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nEjntI9GMVM" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COMEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COQEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COMEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COEEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "nEjntI9GMVM", + "onEmptyQueue": { + "clickTrackingParams": "COEEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "nEjntI9GMVM" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COEEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COIEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COEEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CN8EEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COAEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COAEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CN8EEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN0EEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CN4EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CN4EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CN0EEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNwEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCiC_vxasVKRDBvZBaMIEGdg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNwEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNsEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtuRWpudEk5R01WTQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNsEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNoEEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNkEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "nEjntI9GMVM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNkEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play TE AMO 2 - Berechet" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause TE AMO 2 - Berechet" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Gtct_ipIQmo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lQ9zUeOzWrXEGPIYSK9oNf7XJHZA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Gtct_ipIQmo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nFgPtLbXhg9h9OJnS7K6fdZv4Cbg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNcEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Es geht vorbei" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Finder", + "navigationEndpoint": { + "clickTrackingParams": "CMkEEKCzAhg8IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCCXCwvd49sm9x_gp1nuv7uA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "15K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkEEKCzAhg8IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtct_ipIQmo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMkEEKCzAhg8IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNYEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtct_ipIQmo", + "playlistId": "RDAMVMGtct_ipIQmo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1HdGN0X2lwSVFtbw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNYEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNQEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Gtct_ipIQmo", + "onEmptyQueue": { + "clickTrackingParams": "CNQEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtct_ipIQmo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNQEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNUEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNQEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNIEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Gtct_ipIQmo", + "onEmptyQueue": { + "clickTrackingParams": "CNIEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Gtct_ipIQmo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNIEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNMEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNIEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNAEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNEEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNEEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNAEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM4EEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM8EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM8EEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CM4EEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CM0EEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCCXCwvd49sm9x_gp1nuv7uA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CM0EEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMwEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtHdGN0X2lwSVFtbw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMwEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMsEEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMoEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Gtct_ipIQmo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMoEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Es geht vorbei - Finder" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Es geht vorbei - Finder" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aw4kqTyZshk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lcKyd_wB2ArahWpc_4iPWTrdpaYg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/aw4kqTyZshk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m0QSq7rNpN2I6H-IcH14tpGpePBQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMgEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "No Man Bigger Than Coffin" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "น้ำ กชพร", + "navigationEndpoint": { + "clickTrackingParams": "CLoEEKCzAhg9IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCPC1pc0VjTVizL2FferDukw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "332K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoEEKCzAhg9IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aw4kqTyZshk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLoEEKCzAhg9IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMcEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aw4kqTyZshk", + "playlistId": "RDAMVMaw4kqTyZshk", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1hdzRrcVR5WnNoaw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMcEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMUEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "aw4kqTyZshk", + "onEmptyQueue": { + "clickTrackingParams": "CMUEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aw4kqTyZshk" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMUEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMYEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMUEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMMEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "aw4kqTyZshk", + "onEmptyQueue": { + "clickTrackingParams": "CMMEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "aw4kqTyZshk" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMMEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMQEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMMEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMEEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMIEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMIEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMEEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8EEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMAEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMAEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CL8EEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL4EEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCPC1pc0VjTVizL2FferDukw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CL4EEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL0EEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgthdzRrcVR5WnNoaw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CL0EEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLwEEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLsEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "aw4kqTyZshk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLsEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play No Man Bigger Than Coffin - น้ำ กชพร" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause No Man Bigger Than Coffin - น้ำ กชพร" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xjoCNfK3vxo/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l6zWauyEH0IrXSlUJuEsRHTQOhTQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/xjoCNfK3vxo/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lVyEygxTZTbZLiO6xoEm-AkH7C4Q", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLkEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Temps kônô" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Yacou B Og", + "navigationEndpoint": { + "clickTrackingParams": "CKsEEKCzAhg-IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCylwv7H2IUI_JWiA_2Mt5oA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "177K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsEEKCzAhg-IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xjoCNfK3vxo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKsEEKCzAhg-IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLgEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xjoCNfK3vxo", + "playlistId": "RDAMVMxjoCNfK3vxo", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk14am9DTmZLM3Z4bw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLgEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLYEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "xjoCNfK3vxo", + "onEmptyQueue": { + "clickTrackingParams": "CLYEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xjoCNfK3vxo" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLYEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLcEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLYEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLQEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "xjoCNfK3vxo", + "onEmptyQueue": { + "clickTrackingParams": "CLQEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xjoCNfK3vxo" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLQEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLUEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLQEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLIEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLMEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLMEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLIEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLAEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLEEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLAEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8EEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCylwv7H2IUI_JWiA_2Mt5oA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CK8EEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK4EEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt4am9DTmZLM3Z4bw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CK4EEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CK0EEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKwEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "xjoCNfK3vxo", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKwEEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Temps kônô - Yacou B Og" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Temps kônô - Yacou B Og" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DN1gYO3bu-k/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3mX2_1-rh9FtGhi-hNmI7WaV8FB4Q", + "width": 320, + "height": 180 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKoEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Kisi Din Banoongi Main | Raja (1995) | Madhuri Dixit | Sanjay Kapoor | Udit Narayan | Hindi Songs" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Mohammad Tanbiruzzaman Koushal", + "navigationEndpoint": { + "clickTrackingParams": "CJwEEKCzAhg_IhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBvTykFO8_qxF0VtPm0ZjmA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "362K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwEEKCzAhg_IhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DN1gYO3bu-k", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJwEEKCzAhg_IhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKkEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DN1gYO3bu-k", + "playlistId": "RDAMVMDN1gYO3bu-k", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ETjFnWU8zYnUtaw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKkEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKcEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "DN1gYO3bu-k", + "onEmptyQueue": { + "clickTrackingParams": "CKcEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DN1gYO3bu-k" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKcEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKgEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKcEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKUEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "DN1gYO3bu-k", + "onEmptyQueue": { + "clickTrackingParams": "CKUEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DN1gYO3bu-k" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKUEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKYEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKUEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKMEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKQEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKQEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKMEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKEEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKIEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKEEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKAEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBvTykFO8_qxF0VtPm0ZjmA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKAEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8EEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtETjFnWU8zYnUtaw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJ8EEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJ4EEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJ0EEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "DN1gYO3bu-k", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJ0EEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Kisi Din Banoongi Main | Raja (1995) | Madhuri Dixit | Sanjay Kapoor | Udit Narayan | Hindi Songs - Mohammad Tanbiruzzaman Koushal" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Kisi Din Banoongi Main | Raja (1995) | Madhuri Dixit | Sanjay Kapoor | Udit Narayan | Hindi Songs - Mohammad Tanbiruzzaman Koushal" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/X_cqTeG7v98/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3km0zoCTHO0YvtUG_wJPPAiW8bZMg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/X_cqTeG7v98/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kFwygtyf9AJCQrYlKjk6aiWYZGMg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJsEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "ZOMBIE" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Haval & Yasin" + }, + { + "text": " • " + }, + { + "text": "103K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0EEKCzAhhAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "X_cqTeG7v98", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CI0EEKCzAhhAIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJoEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "X_cqTeG7v98", + "playlistId": "RDAMVMX_cqTeG7v98", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1YX2NxVGVHN3Y5OA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJoEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJgEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "X_cqTeG7v98", + "onEmptyQueue": { + "clickTrackingParams": "CJgEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "X_cqTeG7v98" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJgEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJkEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJgEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJYEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "X_cqTeG7v98", + "onEmptyQueue": { + "clickTrackingParams": "CJYEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "X_cqTeG7v98" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJYEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJcEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJYEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJQEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJUEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJUEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJQEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJIEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJMEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJMEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJIEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJEEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCPdVokcPTyrrsRhHnlvnoSQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJEEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJAEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtYX2NxVGVHN3Y5OA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJAEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CI8EEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CI4EEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "X_cqTeG7v98", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CI4EEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play ZOMBIE - Haval" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause ZOMBIE - Haval" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/b_B4ebhKvQ4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lqTjZN6SM7kO8z2r1kdUSnhJ3neg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/b_B4ebhKvQ4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nnVtHIjjga6AYc4zrvHarswqaPSg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIwEEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Built To Be Bad (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Grace Gachot", + "navigationEndpoint": { + "clickTrackingParams": "CP4DEKCzAhhBIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC7aCpfjAUTxRWslugOpsjUg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "92K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4DEKCzAhhBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "b_B4ebhKvQ4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CP4DEKCzAhhBIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIsEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "b_B4ebhKvQ4", + "playlistId": "RDAMVMb_B4ebhKvQ4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1iX0I0ZWJoS3ZRNA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIsEEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIkEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "b_B4ebhKvQ4", + "onEmptyQueue": { + "clickTrackingParams": "CIkEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "b_B4ebhKvQ4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIkEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIoEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIkEEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIcEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "b_B4ebhKvQ4", + "onEmptyQueue": { + "clickTrackingParams": "CIcEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "b_B4ebhKvQ4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIcEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIgEEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIcEEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIUEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIYEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIYEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIUEEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIQEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIQEEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIMEEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIIEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC7aCpfjAUTxRWslugOpsjUg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIIEEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIEEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtiX0I0ZWJoS3ZRNA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIEEEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIAEEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CP8DEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "b_B4ebhKvQ4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CP8DEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Built To Be Bad (Official Video) - Grace Gachot" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Built To Be Bad (Official Video) - Grace Gachot" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VQp1QmwOzxw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nG_T-YpvsRvbynRCucW8C5elvPXw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/VQp1QmwOzxw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n_ym4Te9g6Y59E7nfhvQDSFUqerw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CP0DEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Jabse Dekha Hai Tumhe", + "navigationEndpoint": { + "clickTrackingParams": "CPIDEKCzAhhCIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "MPEDVQp1QmwOzxw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" + } + } + } + } + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "4 min 4 sec" + }, + { + "text": " • " + }, + { + "text": "Suresh Wadkar", + "navigationEndpoint": { + "clickTrackingParams": "CPIDEKCzAhhCIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC2-fS2PfXjiYYOhpmnCfDIw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPIDEKCzAhhCIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "MPEDVQp1QmwOzxw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE" + } + } + } + }, + "trackingParams": "CPIDEKCzAhhCIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPsDEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "VQp1QmwOzxw", + "onEmptyQueue": { + "clickTrackingParams": "CPsDEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "VQp1QmwOzxw" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPsDEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Episode will play next" + } + ] + }, + "trackingParams": "CPwDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPsDEL7uBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPkDEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "VQp1QmwOzxw", + "onEmptyQueue": { + "clickTrackingParams": "CPkDEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "VQp1QmwOzxw" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPkDEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Episode added to queue" + } + ] + }, + "trackingParams": "CPoDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPkDEPvvBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPcDEMOUBhgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPgDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPgDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPcDEMOUBhgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPYDEJD7BRgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC2-fS2PfXjiYYOhpmnCfDIw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPYDEJD7BRgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPUDEJH7BRgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtWUXAxUW13T3p4dw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPUDEJH7BRgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPQDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPMDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "VQp1QmwOzxw", + "params": "8gEDmAEI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_PODCAST_EPISODE" + } + } + } + }, + "trackingParams": "CPMDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Jabse Dekha Hai Tumhe - Suresh Wadkar" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Jabse Dekha Hai Tumhe - Suresh Wadkar" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/suAR1PYFNYA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kn4zno58Kuyyghco7sCi99yRIZ9Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/suAR1PYFNYA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kI2AhPcItcUX3Fi_r6D9J97UckpA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPEDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Houdini" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Dua Lipa", + "navigationEndpoint": { + "clickTrackingParams": "COMDEKCzAhhDIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCzVb0SIXp9q9PeKCcFjsBtA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "25M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COMDEKCzAhhDIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "suAR1PYFNYA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COMDEKCzAhhDIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPADEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "suAR1PYFNYA", + "playlistId": "RDAMVMsuAR1PYFNYA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1zdUFSMVBZRk5ZQQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPADEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CO4DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "suAR1PYFNYA", + "onEmptyQueue": { + "clickTrackingParams": "CO4DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "suAR1PYFNYA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CO4DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CO8DEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CO4DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COwDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "suAR1PYFNYA", + "onEmptyQueue": { + "clickTrackingParams": "COwDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "suAR1PYFNYA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COwDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CO0DEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COwDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COoDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COsDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COsDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COoDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COgDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COkDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COkDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COgDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COcDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCzVb0SIXp9q9PeKCcFjsBtA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COcDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COYDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtzdUFSMVBZRk5ZQQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COYDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COUDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COQDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "suAR1PYFNYA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COQDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Houdini - Dua Lipa" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Houdini - Dua Lipa" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/No3Cr6ph-9U/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nyvA5jOWZY8i3chZOQP2eZ4RWArw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/No3Cr6ph-9U/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nQtBqGXm4bPxu9NjIYqHDqTctvzw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COIDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "CODE BARRE" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Lacrim", + "navigationEndpoint": { + "clickTrackingParams": "CNQDEKCzAhhEIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCkFIRlbak2lK--nCQXau_6g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNQDEKCzAhhEIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "No3Cr6ph-9U", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNQDEKCzAhhEIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COEDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "No3Cr6ph-9U", + "playlistId": "RDAMVMNo3Cr6ph-9U", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ObzNDcjZwaC05VQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COEDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CN8DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "No3Cr6ph-9U", + "onEmptyQueue": { + "clickTrackingParams": "CN8DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "No3Cr6ph-9U" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CN8DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COADEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CN8DEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CN0DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "No3Cr6ph-9U", + "onEmptyQueue": { + "clickTrackingParams": "CN0DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "No3Cr6ph-9U" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CN0DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CN4DEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CN0DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNsDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNwDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNwDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNsDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNkDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNoDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNoDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNkDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNgDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCkFIRlbak2lK--nCQXau_6g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNgDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNcDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtObzNDcjZwaC05VQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNcDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNYDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNUDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "No3Cr6ph-9U", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNUDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play CODE BARRE - Lacrim" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause CODE BARRE - Lacrim" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ORJEgiVY08U/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kUbzYGxELaN7M2kfdNRU6xOGuZjw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/ORJEgiVY08U/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nD__VjYZyianIMOOLAEKOAN4mL1w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNMDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Partyson" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Cris Mj", + "navigationEndpoint": { + "clickTrackingParams": "CMUDEKCzAhhFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCOykHV9q0qb0vrBsxO_5fkQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMUDEKCzAhhFIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ORJEgiVY08U", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMUDEKCzAhhFIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNIDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ORJEgiVY08U", + "playlistId": "RDAMVMORJEgiVY08U", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1PUkpFZ2lWWTA4VQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNIDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNADEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ORJEgiVY08U", + "onEmptyQueue": { + "clickTrackingParams": "CNADEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ORJEgiVY08U" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNADEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNEDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNADEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CM4DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ORJEgiVY08U", + "onEmptyQueue": { + "clickTrackingParams": "CM4DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ORJEgiVY08U" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CM4DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CM8DEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CM4DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMwDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM0DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM0DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMwDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMoDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMsDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMoDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMkDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCOykHV9q0qb0vrBsxO_5fkQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMkDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMgDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtPUkpFZ2lWWTA4VQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMgDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMcDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMYDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "ORJEgiVY08U", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMYDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Partyson - Cris Mj" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Partyson - Cris Mj" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/2px4-y1Y0PI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n_Gi9InEt3bhEy1hBocbPypgqq0A", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/2px4-y1Y0PI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kybRz93boUe0G1wA-9i7IQ3mpScw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMQDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Still Believe In Love" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Vado & Mary J. Blige" + }, + { + "text": " • " + }, + { + "text": "2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLYDEKCzAhhGIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2px4-y1Y0PI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLYDEKCzAhhGIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMMDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2px4-y1Y0PI", + "playlistId": "RDAMVM2px4-y1Y0PI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0ycHg0LXkxWTBQSQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMMDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMEDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2px4-y1Y0PI", + "onEmptyQueue": { + "clickTrackingParams": "CMEDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2px4-y1Y0PI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMEDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMIDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMEDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CL8DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2px4-y1Y0PI", + "onEmptyQueue": { + "clickTrackingParams": "CL8DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2px4-y1Y0PI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CL8DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMADEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CL8DEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CL0DEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL4DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CL4DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CL0DEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLsDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLwDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLwDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLsDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLoDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC4qgfoPLnM-5V3aVckCLtKg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLoDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLkDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsycHg0LXkxWTBQSQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLkDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLgDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLcDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "2px4-y1Y0PI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLcDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Still Believe In Love - Vado" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Still Believe In Love - Vado" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kchzKOizhGg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nYXcBLe4W0j7lccFLKmS6vPPJN-w", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/kchzKOizhGg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nJFj99WuSUyfVR5Vh7wgUSX1yBjg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLUDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Tocao (feat. Zion & Lennox)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Danny Romero", + "navigationEndpoint": { + "clickTrackingParams": "CKcDEKCzAhhHIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCofCirUtHXO7IL8AjWHytZQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "24K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKcDEKCzAhhHIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kchzKOizhGg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKcDEKCzAhhHIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLQDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kchzKOizhGg", + "playlistId": "RDAMVMkchzKOizhGg", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1rY2h6S09pemhHZw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLQDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLIDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "kchzKOizhGg", + "onEmptyQueue": { + "clickTrackingParams": "CLIDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kchzKOizhGg" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLIDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLMDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLIDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLADEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "kchzKOizhGg", + "onEmptyQueue": { + "clickTrackingParams": "CLADEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "kchzKOizhGg" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLADEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLEDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLADEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CK4DEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CK8DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CK4DEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKwDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CK0DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKwDEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCofCirUtHXO7IL8AjWHytZQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CKsDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKoDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtrY2h6S09pemhHZw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKoDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKkDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKgDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "kchzKOizhGg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKgDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Tocao - Danny Romero" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Tocao - Danny Romero" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/V6eAGSz4JI8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n8WA3hkVl2pySR7NZjT2bJnWFhDg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/V6eAGSz4JI8/sddefault.jpg?sqp=-oaymwEWCKoDEPABIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mrm-9s43zPPy2Ro7kNnQKKnYnamQ", + "width": 426, + "height": 240 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKYDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Dj Trap Atouna El Toufoule ( Atunatufuli ) Ful Bass Nguk Nguk Clarity Zainul 99" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "zainul 99", + "navigationEndpoint": { + "clickTrackingParams": "CJgDEKCzAhhIIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UClWLQP-lNGvEV5qJpy7DLhw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "669K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgDEKCzAhhIIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "V6eAGSz4JI8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJgDEKCzAhhIIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKUDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "V6eAGSz4JI8", + "playlistId": "RDAMVMV6eAGSz4JI8", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1WNmVBR1N6NEpJOA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKUDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKMDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "V6eAGSz4JI8", + "onEmptyQueue": { + "clickTrackingParams": "CKMDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "V6eAGSz4JI8" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKMDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKQDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKMDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKEDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "V6eAGSz4JI8", + "onEmptyQueue": { + "clickTrackingParams": "CKEDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "V6eAGSz4JI8" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKEDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKIDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKEDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJ8DEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKADEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKADEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJ8DEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ0DEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ4DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJ4DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJ0DEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UClWLQP-lNGvEV5qJpy7DLhw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJwDEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtWNmVBR1N6NEpJOA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJsDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJoDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJkDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "V6eAGSz4JI8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJkDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Dj Trap Atouna El Toufoule ( Atunatufuli ) Ful Bass Nguk Nguk Clarity Zainul 99 - zainul 99" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Dj Trap Atouna El Toufoule ( Atunatufuli ) Ful Bass Nguk Nguk Clarity Zainul 99 - zainul 99" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1A5hWzS00Nc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mOgQd32i2bXnWbSyfoRB4Vz3FBuQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/1A5hWzS00Nc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kK85ZAkCSWuEjICnpgb0jjJzccfQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJcDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Srungara (From \"Aakasam Dhaati Vasthaava\")" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Sanjith Hegde, Karthik, & Malavika Shankar" + }, + { + "text": " • " + }, + { + "text": "590K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkDEKCzAhhJIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1A5hWzS00Nc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIkDEKCzAhhJIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJYDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1A5hWzS00Nc", + "playlistId": "RDAMVM1A5hWzS00Nc", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0xQTVoV3pTMDBOYw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJYDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJQDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1A5hWzS00Nc", + "onEmptyQueue": { + "clickTrackingParams": "CJQDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1A5hWzS00Nc" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJQDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJUDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJQDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJIDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1A5hWzS00Nc", + "onEmptyQueue": { + "clickTrackingParams": "CJIDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1A5hWzS00Nc" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJIDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJMDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJIDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJADEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJEDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJEDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJADEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI4DEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CI8DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CI8DEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CI4DEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0DEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCGCzMLhz0ucUUACQAHw-rmg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CI0DEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIwDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsxQTVoV3pTMDBOYw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIwDEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIsDEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIoDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "1A5hWzS00Nc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIoDEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Srungara (From \"Aakasam Dhaati Vasthaava\") - Sanjith Hegde" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Srungara (From \"Aakasam Dhaati Vasthaava\") - Sanjith Hegde" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/bzsSkarE4zw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3muyW3dG_HZcykwYtJrjLiYPiPGHg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/bzsSkarE4zw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kENygW5EQb2c25-PhUqXhT0EpC6g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIgDEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Ngozi" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Crayon", + "navigationEndpoint": { + "clickTrackingParams": "CPoCEKCzAhhKIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC97hKW1a1rzrMnzkKwaNx_g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Ayra Starr", + "navigationEndpoint": { + "clickTrackingParams": "CPoCEKCzAhhKIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCO4TFKYiSDo7vOQC04mr7Fg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "2.6M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoCEKCzAhhKIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bzsSkarE4zw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPoCEKCzAhhKIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIcDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bzsSkarE4zw", + "playlistId": "RDAMVMbzsSkarE4zw", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ienNTa2FyRTR6dw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIcDEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIUDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "bzsSkarE4zw", + "onEmptyQueue": { + "clickTrackingParams": "CIUDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bzsSkarE4zw" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIUDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIYDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIUDEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIMDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "bzsSkarE4zw", + "onEmptyQueue": { + "clickTrackingParams": "CIMDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bzsSkarE4zw" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIMDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIQDEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIMDEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIEDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIIDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIIDEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIEDEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP8CEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIADEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIADEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CP8CEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP4CEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC97hKW1a1rzrMnzkKwaNx_g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CP4CEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CP0CEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtienNTa2FyRTR6dw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CP0CEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPwCEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPsCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "bzsSkarE4zw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPsCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Ngozi - Crayon" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Ngozi - Crayon" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/59HJZIMVxAg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k4rpWuVlRwOfQByZHwUPWQv_dS0A", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/59HJZIMVxAg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lpmEtAyfsAKxZSQz2IBpS6H1V06Q", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPkCEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Slime Examination" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "YoungBoy Never Broke Again", + "navigationEndpoint": { + "clickTrackingParams": "COsCEKCzAhhLIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCR28YDxjDE3ogQROaNdnRbQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.3M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COsCEKCzAhhLIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "59HJZIMVxAg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COsCEKCzAhhLIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPgCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "59HJZIMVxAg", + "playlistId": "RDAMVM59HJZIMVxAg", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk01OUhKWklNVnhBZw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPgCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPYCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "59HJZIMVxAg", + "onEmptyQueue": { + "clickTrackingParams": "CPYCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "59HJZIMVxAg" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPYCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPcCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPYCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPQCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "59HJZIMVxAg", + "onEmptyQueue": { + "clickTrackingParams": "CPQCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "59HJZIMVxAg" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CPQCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CPUCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPQCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CPICEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPMCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPMCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CPICEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPACEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPECEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPECEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPACEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CO8CEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCR28YDxjDE3ogQROaNdnRbQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CO8CEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CO4CEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs1OUhKWklNVnhBZw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CO4CEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CO0CEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COwCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "59HJZIMVxAg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COwCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Slime Examination - YoungBoy Never Broke Again" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Slime Examination - YoungBoy Never Broke Again" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8XQYz7JKjWI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n_xoUNrTiegTMJK2RY6-W3Kya-jg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/8XQYz7JKjWI/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3msIfwByUybxnVWLPAxhroBNFitbg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COoCEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "VALENTINE" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Måneskin", + "navigationEndpoint": { + "clickTrackingParams": "CNwCEKCzAhhMIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCqgwdYBhoUHmjrVxNhEUv4g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.4M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNwCEKCzAhhMIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "8XQYz7JKjWI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNwCEKCzAhhMIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COkCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "8XQYz7JKjWI", + "playlistId": "RDAMVM8XQYz7JKjWI", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk04WFFZejdKS2pXSQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COkCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COcCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "8XQYz7JKjWI", + "onEmptyQueue": { + "clickTrackingParams": "COcCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "8XQYz7JKjWI" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COcCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COgCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COcCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "COUCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "8XQYz7JKjWI", + "onEmptyQueue": { + "clickTrackingParams": "COUCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "8XQYz7JKjWI" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "COUCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COYCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COUCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COMCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COQCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COQCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COMCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COECEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COICEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COICEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COECEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COACEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCqgwdYBhoUHmjrVxNhEUv4g", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COACEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CN8CEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs4WFFZejdKS2pXSQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CN8CEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CN4CEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CN0CEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "8XQYz7JKjWI", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CN0CEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play VALENTINE - Måneskin" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause VALENTINE - Måneskin" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/5FkJkpTWSWk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nlXmZZlE68G8qOdinF1r6YBTml6g", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/5FkJkpTWSWk/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lzQAmCUfL57T4DOQqKQn9UVG9g3w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNsCEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Apsara" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Jus Keys", + "navigationEndpoint": { + "clickTrackingParams": "CM0CEKCzAhhNIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCrmhl-Xsb9LW5WYtC2iHe6A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": ", " + }, + { + "text": "Raman Romana", + "navigationEndpoint": { + "clickTrackingParams": "CM0CEKCzAhhNIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC9jWrVmoHGRk9qQ-d7c6IHw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Shiv Nevergive Up", + "navigationEndpoint": { + "clickTrackingParams": "CM0CEKCzAhhNIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC4oVRdVXvQMfYvYhNypXGqw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "12K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM0CEKCzAhhNIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "5FkJkpTWSWk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CM0CEKCzAhhNIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNoCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "5FkJkpTWSWk", + "playlistId": "RDAMVM5FkJkpTWSWk", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk01RmtKa3BUV1NXaw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNoCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNgCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "5FkJkpTWSWk", + "onEmptyQueue": { + "clickTrackingParams": "CNgCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "5FkJkpTWSWk" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNgCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNkCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNgCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNYCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "5FkJkpTWSWk", + "onEmptyQueue": { + "clickTrackingParams": "CNYCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "5FkJkpTWSWk" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNYCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNcCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNYCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CNQCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNUCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNUCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CNQCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNICEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNMCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNMCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNICEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNECEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCrmhl-Xsb9LW5WYtC2iHe6A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNECEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNACEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs1RmtKa3BUV1NXaw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNACEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CM8CEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CM4CEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "5FkJkpTWSWk", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CM4CEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Apsara - Jus Keys" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Apsara - Jus Keys" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1m51ncAU4uA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mhf22d42eWk1SCBkq0rbcaDKTWvw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/1m51ncAU4uA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lgnAgrDUvdLRi_7o9yfIVoq070Gw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMwCEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "LA CHAMBA" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Peso Pluma", + "navigationEndpoint": { + "clickTrackingParams": "CL4CEKCzAhhOIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCzmabbKsmXlWnI9N2kKQ4lA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Arcangel", + "navigationEndpoint": { + "clickTrackingParams": "CL4CEKCzAhhOIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCVcAt8IIKIeubRSigcYXgtA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "10M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL4CEKCzAhhOIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1m51ncAU4uA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CL4CEKCzAhhOIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1m51ncAU4uA", + "playlistId": "RDAMVM1m51ncAU4uA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0xbTUxbmNBVTR1QQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMsCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMkCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1m51ncAU4uA", + "onEmptyQueue": { + "clickTrackingParams": "CMkCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1m51ncAU4uA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMkCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMoCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMkCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMcCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1m51ncAU4uA", + "onEmptyQueue": { + "clickTrackingParams": "CMcCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1m51ncAU4uA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMcCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMgCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMcCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMUCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMYCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMYCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMUCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMMCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMQCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMQCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMMCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMICEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCzmabbKsmXlWnI9N2kKQ4lA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CMICEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMECEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsxbTUxbmNBVTR1QQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMECEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMACEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CL8CEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "1m51ncAU4uA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CL8CEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play LA CHAMBA - Peso Pluma" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause LA CHAMBA - Peso Pluma" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Ycff6mFkoPY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mTLIjp4RSGtftfnnWsEwMvXvCaSQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/Ycff6mFkoPY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kIFGor9RkVTb26j9Jsm4v06g7rxw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CL0CEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "မြို့မအနောက်ဘက် - Anonimus (Official Music Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Tommy Kyaw", + "navigationEndpoint": { + "clickTrackingParams": "CK8CEKCzAhhPIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC4yEk8HA1s1-OmMOJSCyg0A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "488K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8CEKCzAhhPIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ycff6mFkoPY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CK8CEKCzAhhPIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLwCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ycff6mFkoPY", + "playlistId": "RDAMVMYcff6mFkoPY", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ZY2ZmNm1Ga29QWQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLwCEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLoCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Ycff6mFkoPY", + "onEmptyQueue": { + "clickTrackingParams": "CLoCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ycff6mFkoPY" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLoCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLsCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLoCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLgCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "Ycff6mFkoPY", + "onEmptyQueue": { + "clickTrackingParams": "CLgCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "Ycff6mFkoPY" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLgCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLkCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLgCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLYCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLcCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLcCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLYCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLQCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLUCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLUCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CLQCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLMCEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC4yEk8HA1s1-OmMOJSCyg0A", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CLMCEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLICEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtZY2ZmNm1Ga29QWQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLICEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLECEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLACEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "Ycff6mFkoPY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLACEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play မြို့မအနောက်ဘက် - Anonimus (Official Music Video) - Tommy Kyaw" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause မြို့မအနောက်ဘက် - Anonimus (Official Music Video) - Tommy Kyaw" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/g0ghPuWqYR0/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k1b4jYKFY1QxUvWbmmXlPtNvHEgA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/g0ghPuWqYR0/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nvK2WV2lztXwoPOSZftLf9WURQVQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CK4CEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Ney Veyrey" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Karthik" + }, + { + "text": " • " + }, + { + "text": "6.8M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKECEKCzAhhQIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "g0ghPuWqYR0", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKECEKCzAhhQIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0CEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "g0ghPuWqYR0", + "playlistId": "RDAMVMg0ghPuWqYR0", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1nMGdoUHVXcVlSMA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CK0CEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKsCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "g0ghPuWqYR0", + "onEmptyQueue": { + "clickTrackingParams": "CKsCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "g0ghPuWqYR0" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKsCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKwCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKsCEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKkCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "g0ghPuWqYR0", + "onEmptyQueue": { + "clickTrackingParams": "CKkCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "g0ghPuWqYR0" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKkCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKoCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKkCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKcCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKgCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKcCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKUCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKYCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKYCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKUCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKQCEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtnMGdoUHVXcVlSMA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CKQCEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKMCEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKICEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "g0ghPuWqYR0", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKICEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Ney Veyrey - Karthik" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Ney Veyrey - Karthik" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1YiTQJcKajE/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n0fx0CFRGOdPYV-OA6UOZPKVdFHg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/1YiTQJcKajE/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3liCJgUvwBoop7apl8kyGPryIkDQA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKACEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "HUMANS AND MONSTERS" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Lil Darkie", + "navigationEndpoint": { + "clickTrackingParams": "CJICEKCzAhhRIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCf4l_B9IhzstPp8elVeHnTQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "637K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJICEKCzAhhRIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1YiTQJcKajE", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJICEKCzAhhRIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8CEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1YiTQJcKajE", + "playlistId": "RDAMVM1YiTQJcKajE", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0xWWlUUUpjS2FqRQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJ8CEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJ0CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1YiTQJcKajE", + "onEmptyQueue": { + "clickTrackingParams": "CJ0CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1YiTQJcKajE" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJ0CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJ4CEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJ0CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJsCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "1YiTQJcKajE", + "onEmptyQueue": { + "clickTrackingParams": "CJsCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "1YiTQJcKajE" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJsCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJwCEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJsCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJkCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJoCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJoCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJkCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJcCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJgCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJgCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJcCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJYCEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCf4l_B9IhzstPp8elVeHnTQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJYCEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJUCEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsxWWlUUUpjS2FqRQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJUCEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJQCEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJMCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "1YiTQJcKajE", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJMCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play HUMANS AND MONSTERS - Lil Darkie" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause HUMANS AND MONSTERS - Lil Darkie" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/TuyisGsNr4g/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kvU7S3OY2VXbFHilINd7aOO625-g", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/TuyisGsNr4g/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lPAECXmw98w3iw9u0GTMYX0Z76Xw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJECEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "To Be A Man (Remix) (feat. Darius Rucker)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Dax", + "navigationEndpoint": { + "clickTrackingParams": "CIMCEKCzAhhSIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCC0ydtpsVWZNHLvKSf4MnYw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "3.9M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMCEKCzAhhSIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TuyisGsNr4g", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIMCEKCzAhhSIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJACEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TuyisGsNr4g", + "playlistId": "RDAMVMTuyisGsNr4g", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1UdXlpc0dzTnI0Zw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJACEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CI4CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "TuyisGsNr4g", + "onEmptyQueue": { + "clickTrackingParams": "CI4CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TuyisGsNr4g" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CI4CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CI8CEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CI4CEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIwCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "TuyisGsNr4g", + "onEmptyQueue": { + "clickTrackingParams": "CIwCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "TuyisGsNr4g" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIwCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CI0CEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIwCEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIoCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIsCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIsCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIoCEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIgCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIkCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIkCEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIgCEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIcCEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCC0ydtpsVWZNHLvKSf4MnYw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIcCEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIYCEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtUdXlpc0dzTnI0Zw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIYCEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CIUCEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CIQCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "TuyisGsNr4g", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIQCEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play To Be A Man (Remix) - Dax" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause To Be A Man (Remix) - Dax" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ClU3aqamHGQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kWQTX51J0RIBcnIItKor0J1trv-Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/ClU3aqamHGQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lN-CQOdUqDEXGIidKTFHnkpwL73g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIICEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Semi Auto (feat. Wazir Patar)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Jordan Sandhu", + "navigationEndpoint": { + "clickTrackingParams": "CPQBEKCzAhhTIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC7a1tClTvIIttpI-r2PwiQA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPQBEKCzAhhTIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ClU3aqamHGQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPQBEKCzAhhTIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIECEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ClU3aqamHGQ", + "playlistId": "RDAMVMClU3aqamHGQ", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1DbFUzYXFhbUhHUQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIECEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CP8BEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ClU3aqamHGQ", + "onEmptyQueue": { + "clickTrackingParams": "CP8BEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ClU3aqamHGQ" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CP8BEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIACEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CP8BEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CP0BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ClU3aqamHGQ", + "onEmptyQueue": { + "clickTrackingParams": "CP0BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ClU3aqamHGQ" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CP0BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CP4BEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CP0BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CPsBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPwBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPwBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CPsBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPkBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CPoBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CPoBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CPkBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPgBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC7a1tClTvIIttpI-r2PwiQA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CPgBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPcBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtDbFUzYXFhbUhHUQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CPcBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CPYBEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CPUBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "ClU3aqamHGQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPUBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Semi Auto - Jordan Sandhu" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Semi Auto - Jordan Sandhu" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/bYyB3FzPRfg/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mViyjZgUnkVXvzSb-BGIO6Q_KR2g", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/bYyB3FzPRfg/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lNShVtYBgPdDL9dICyiwW7lJzKsw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CPMBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "New Rajasthani Song 2023 | Dhima Dhima Muskave Bansa | Bablu Ankiya | Happy Singh | New Marwadi Song" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Happy Singh", + "navigationEndpoint": { + "clickTrackingParams": "COUBEKCzAhhUIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBvOwJ62CE_EdXLhrFceElg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Bablu Ankiya", + "navigationEndpoint": { + "clickTrackingParams": "COUBEKCzAhhUIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCcNa2qB8K2wrK7RDqyEMGrA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "272K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COUBEKCzAhhUIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bYyB3FzPRfg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COUBEKCzAhhUIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CPIBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bYyB3FzPRfg", + "playlistId": "RDAMVMbYyB3FzPRfg", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1iWXlCM0Z6UFJmZw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CPIBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CPABEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "bYyB3FzPRfg", + "onEmptyQueue": { + "clickTrackingParams": "CPABEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bYyB3FzPRfg" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CPABEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CPEBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CPABEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CO4BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "bYyB3FzPRfg", + "onEmptyQueue": { + "clickTrackingParams": "CO4BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "bYyB3FzPRfg" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CO4BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CO8BEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CO4BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "COwBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CO0BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CO0BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "COwBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COoBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "COsBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "COsBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "COoBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "COkBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCBvOwJ62CE_EdXLhrFceElg", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "COkBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "COgBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtiWXlCM0Z6UFJmZw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "COgBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "COcBEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "COYBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "bYyB3FzPRfg", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COYBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play New Rajasthani Song 2023 | Dhima Dhima Muskave Bansa | Bablu Ankiya | Happy Singh | New Marwadi Song - Happy Singh" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause New Rajasthani Song 2023 | Dhima Dhima Muskave Bansa | Bablu Ankiya | Happy Singh | New Marwadi Song - Happy Singh" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/I5eu4XMWZR8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mPl2BxY_r3qrBfT5ktCavQsjjVzQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/I5eu4XMWZR8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m2_ruHKye6BP3nv6OvW1aytyofXQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "COQBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "suretigai" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Soala", + "navigationEndpoint": { + "clickTrackingParams": "CNYBEKCzAhhVIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC3PFoXZPFJGy9F4PG84nNQQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "371K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNYBEKCzAhhVIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "I5eu4XMWZR8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNYBEKCzAhhVIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "COMBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "I5eu4XMWZR8", + "playlistId": "RDAMVMI5eu4XMWZR8", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1JNWV1NFhNV1pSOA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "COMBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "COEBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "I5eu4XMWZR8", + "onEmptyQueue": { + "clickTrackingParams": "COEBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "I5eu4XMWZR8" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "COEBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "COIBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "COEBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CN8BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "I5eu4XMWZR8", + "onEmptyQueue": { + "clickTrackingParams": "CN8BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "I5eu4XMWZR8" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CN8BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "COABEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CN8BEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CN0BEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CN4BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CN4BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CN0BEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNsBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CNwBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CNwBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CNsBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNoBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC3PFoXZPFJGy9F4PG84nNQQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CNoBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNkBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtJNWV1NFhNV1pSOA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CNkBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CNgBEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CNcBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "I5eu4XMWZR8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNcBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play suretigai - Soala" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause suretigai - Soala" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ziNtA-mcXTY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nVs_L5lSXhqwwOJxOyBM8FWmqGyg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/ziNtA-mcXTY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kbhnT8euOjgI9RekNf6Z4Xt07agg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CNUBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "ข้ามเวลา Ost.พรหมลิขิต | Violette Wautier | Official MV" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Violette Wautier" + }, + { + "text": " • " + }, + { + "text": "3.2M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMgBEKCzAhhWIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ziNtA-mcXTY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMgBEKCzAhhWIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CNQBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ziNtA-mcXTY", + "playlistId": "RDAMVMziNtA-mcXTY", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk16aU50QS1tY1hUWQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CNQBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNIBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ziNtA-mcXTY", + "onEmptyQueue": { + "clickTrackingParams": "CNIBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ziNtA-mcXTY" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CNIBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CNMBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNIBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CNABEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ziNtA-mcXTY", + "onEmptyQueue": { + "clickTrackingParams": "CNABEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ziNtA-mcXTY" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CNABEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CNEBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CNABEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CM4BEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM8BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM8BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CM4BEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMwBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CM0BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CM0BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CMwBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMsBEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt6aU50QS1tY1hUWQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CMsBEJH7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CMoBEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CMkBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "ziNtA-mcXTY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMkBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play ข้ามเวลา Ost.พรหมลิขิต | Violette Wautier | Official MV - Violette Wautier" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause ข้ามเวลา Ost.พรหมลิขิต | Violette Wautier | Official MV - Violette Wautier" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CDEikOST7ZQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lMv4ENusToeIDsZy39kTfqzNSfaQ", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/CDEikOST7ZQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mXKEDpxAVtRHVSvjX9wh5Fwxp2lA", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CMcBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Pehli Dafaa Is Dil Mein (From \"Hulchul\")" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Kumar Sanu", + "navigationEndpoint": { + "clickTrackingParams": "CLkBEKCzAhhXIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCQd9dydn5gaib_uuVVkYZTQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " & " + }, + { + "text": "Alka Yagnik", + "navigationEndpoint": { + "clickTrackingParams": "CLkBEKCzAhhXIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCptBkLZ6XRxoyn8SkUMc_Iw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "42K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLkBEKCzAhhXIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "CDEikOST7ZQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLkBEKCzAhhXIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CMYBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "CDEikOST7ZQ", + "playlistId": "RDAMVMCDEikOST7ZQ", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1DREVpa09TVDdaUQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CMYBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMQBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "CDEikOST7ZQ", + "onEmptyQueue": { + "clickTrackingParams": "CMQBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "CDEikOST7ZQ" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CMQBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CMUBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMQBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CMIBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "CDEikOST7ZQ", + "onEmptyQueue": { + "clickTrackingParams": "CMIBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "CDEikOST7ZQ" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CMIBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CMMBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CMIBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CMABEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CMEBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CMEBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CMABEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL4BEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CL8BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CL8BEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CL4BEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CL0BEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCQd9dydn5gaib_uuVVkYZTQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CL0BEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLwBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtDREVpa09TVDdaUQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CLwBEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CLsBEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CLoBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "CDEikOST7ZQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLoBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Pehli Dafaa Is Dil Mein (From \"Hulchul\") - Kumar Sanu" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Pehli Dafaa Is Dil Mein (From \"Hulchul\") - Kumar Sanu" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/YQzvJSR5jy8/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mzfmV4FgVgTW84VrbTtY9Jcv793Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/YQzvJSR5jy8/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nJkWSEojdmb6xJCL5Vx8p65kZZIg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CLgBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "ธรรมดา" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "DIAMOND MQT", + "navigationEndpoint": { + "clickTrackingParams": "CKoBEKCzAhhYIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC1snMKQQ0kl280XfQmg9tpQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "657K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKoBEKCzAhhYIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YQzvJSR5jy8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKoBEKCzAhhYIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLcBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YQzvJSR5jy8", + "playlistId": "RDAMVMYQzvJSR5jy8", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1ZUXp2SlNSNWp5OA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CLcBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLUBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "YQzvJSR5jy8", + "onEmptyQueue": { + "clickTrackingParams": "CLUBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YQzvJSR5jy8" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CLUBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CLYBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLUBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CLMBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "YQzvJSR5jy8", + "onEmptyQueue": { + "clickTrackingParams": "CLMBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "YQzvJSR5jy8" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CLMBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CLQBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CLMBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CLEBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLIBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLIBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CLEBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK8BEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CLABEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CLABEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CK8BEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK4BEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UC1snMKQQ0kl280XfQmg9tpQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CK4BEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK0BEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtZUXp2SlNSNWp5OA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CK0BEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CKwBEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CKsBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "YQzvJSR5jy8", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKsBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play ธรรมดา - DIAMOND MQT" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause ธรรมดา - DIAMOND MQT" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/lPaplIqUXJc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3l3XGpagM9oDWS8oP7AG1uTpOATRg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/lPaplIqUXJc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nYUmlFAwpZGMU5pBn3W92wzW5wcQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CKkBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "XOTÃO PESADA AO VIVO NO BOTECO NETINHO BRITO O Judiador Dos Corações Apaixonados" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Netinho Brito", + "navigationEndpoint": { + "clickTrackingParams": "CJsBEKCzAhhZIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCsIkF_bbTB9jjGIkT4j82rQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "49K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJsBEKCzAhhZIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lPaplIqUXJc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJsBEKCzAhhZIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lPaplIqUXJc", + "playlistId": "RDAMVMlPaplIqUXJc", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1sUGFwbElxVVhKYw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CKgBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKYBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "lPaplIqUXJc", + "onEmptyQueue": { + "clickTrackingParams": "CKYBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lPaplIqUXJc" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CKYBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CKcBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKYBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CKQBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "lPaplIqUXJc", + "onEmptyQueue": { + "clickTrackingParams": "CKQBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "lPaplIqUXJc" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CKQBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CKUBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CKQBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CKIBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKMBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKMBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CKIBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKABEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CKEBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CKEBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CKABEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8BEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCsIkF_bbTB9jjGIkT4j82rQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJ8BEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ4BEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtsUGFwbElxVVhKYw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CJ4BEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CJ0BEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CJwBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "lPaplIqUXJc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJwBEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play XOTÃO PESADA AO VIVO NO BOTECO NETINHO BRITO O Judiador Dos Corações Apaixonados - Netinho Brito" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause XOTÃO PESADA AO VIVO NO BOTECO NETINHO BRITO O Judiador Dos Corações Apaixonados - Netinho Brito" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/78Y0SxVVxP4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nQmzJBAxFKNFLrfCe5WoXikLI2Hg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/78Y0SxVVxP4/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mPY4O4IXS0EoZSiIhgBdOMOa4fcw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CJoBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Wirang" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Denny Caknan", + "navigationEndpoint": { + "clickTrackingParams": "CIwBEKCzAhhaIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCrXRY_7SVVmc6TykwhRGUNQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "6.9M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIwBEKCzAhhaIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "78Y0SxVVxP4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIwBEKCzAhhaIhMImOSwzvXAggMVrUBBAh23Dglm", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "78Y0SxVVxP4", + "playlistId": "RDAMVM78Y0SxVVxP4", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk03OFkwU3hWVnhQNA%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CJkBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJcBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "78Y0SxVVxP4", + "onEmptyQueue": { + "clickTrackingParams": "CJcBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "78Y0SxVVxP4" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CJcBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CJgBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJcBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CJUBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "78Y0SxVVxP4", + "onEmptyQueue": { + "clickTrackingParams": "CJUBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "78Y0SxVVxP4" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CJUBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CJYBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CJUBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CJMBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJQBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJQBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CJMBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJEBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CJIBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CJIBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CJEBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJABEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCrXRY_7SVVmc6TykwhRGUNQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CJABEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI8BEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs3OFkwU3hWVnhQNA%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CI8BEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CI4BEKc7IhMImOSwzvXAggMVrUBBAh23Dglm", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CI0BEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "watchEndpoint": { + "videoId": "78Y0SxVVxP4", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CI0BEMjeAiITCJjksM71wIIDFa1AQQIdtw4JZg==", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Wirang - Denny Caknan" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Wirang - Denny Caknan" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/2e-xqMWT9GY/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3khSnNe6_HXvAkEO_jgvLj02D_S4Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/2e-xqMWT9GY/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kBibi02sZ_q_dwXbdNZ7qf0t3EuQ", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CIsBEIS_AiITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "SORRY" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "The Kid Laroi", + "navigationEndpoint": { + "clickTrackingParams": "CH0QoLMCGFsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCof4hiuvv9BPhVCh90QHErw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "489K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CH0QoLMCGFsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "2e-xqMWT9GY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CH0QoLMCGFsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2e-xqMWT9GY", + "playlistId": "RDAMVM2e-xqMWT9GY", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk0yZS14cU1XVDlHWQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CIoBEJvzBRgAIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIgBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2e-xqMWT9GY", + "onEmptyQueue": { + "clickTrackingParams": "CIgBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2e-xqMWT9GY" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CIgBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CIkBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIgBEL7uBRgBIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CIYBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "2e-xqMWT9GY", + "onEmptyQueue": { + "clickTrackingParams": "CIYBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2e-xqMWT9GY" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CIYBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CIcBEMrHAyITCJjksM71wIIDFa1AQQIdtw4JZg==" + } + } + } + } + ] + } + }, + "trackingParams": "CIYBEPvvBRgCIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CIQBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIUBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIUBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CIQBEIyfBhgDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIIBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CIMBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CIMBEPBbIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + } + }, + "trackingParams": "CIIBEMOUBhgEIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIEBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm", + "browseEndpoint": { + "browseId": "UCof4hiuvv9BPhVCh90QHErw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CIEBEJD7BRgFIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIABEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm", + "shareEntityEndpoint": { + "serializedShareEntity": "CgsyZS14cU1XVDlHWQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CIABEJH7BRgGIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + ], + "trackingParams": "CH8QpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CH4QyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "2e-xqMWT9GY", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CH4QyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play SORRY - The Kid Laroi" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause SORRY - The Kid Laroi" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/81RRIPE404o/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3ky8CReF3q3AbpI4Q8HX40jEdCI6A", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/81RRIPE404o/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nhyJSlcnNXGZzndxiFdqSCEgvxDg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CHwQhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "DAWAI | Cover by Nabila Maharani" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Nabila Maharani", + "navigationEndpoint": { + "clickTrackingParams": "CG4QoLMCGFwiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCtfmGsduggb9uGGsC9lhfKQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "931K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CG4QoLMCGFwiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "81RRIPE404o", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CG4QoLMCGFwiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHsQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "81RRIPE404o", + "playlistId": "RDAMVM81RRIPE404o", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk04MVJSSVBFNDA0bw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CHsQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CHkQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "81RRIPE404o", + "onEmptyQueue": { + "clickTrackingParams": "CHkQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "81RRIPE404o" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CHkQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CHoQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CHkQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CHcQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "81RRIPE404o", + "onEmptyQueue": { + "clickTrackingParams": "CHcQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "81RRIPE404o" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CHcQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CHgQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CHcQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CHUQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CHYQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CHYQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CHUQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHMQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CHQQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CHQQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CHMQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHIQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCtfmGsduggb9uGGsC9lhfKQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CHIQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHEQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgs4MVJSSVBFNDA0bw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CHEQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CHAQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CG8QyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "81RRIPE404o", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CG8QyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play DAWAI | Cover by Nabila Maharani - Nabila Maharani" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause DAWAI | Cover by Nabila Maharani - Nabila Maharani" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/uxR8VhGG9Pc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lNX-M3-4M6p8USoKnDU7xiRexaTw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/uxR8VhGG9Pc/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mr41oN1Mvo2jojb4nZEx9vjB3VTw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CG0QhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "ไปล้อเล่นไกลๆ (Not kidding)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "4EVE", + "navigationEndpoint": { + "clickTrackingParams": "CF8QoLMCGF0iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCdmScpl5nFGLy3xCnfHjDsw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "2.1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CF8QoLMCGF0iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "uxR8VhGG9Pc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CF8QoLMCGF0iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGwQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "uxR8VhGG9Pc", + "playlistId": "RDAMVMuxR8VhGG9Pc", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk11eFI4VmhHRzlQYw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CGwQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CGoQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "uxR8VhGG9Pc", + "onEmptyQueue": { + "clickTrackingParams": "CGoQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "uxR8VhGG9Pc" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CGoQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CGsQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CGoQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CGgQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "uxR8VhGG9Pc", + "onEmptyQueue": { + "clickTrackingParams": "CGgQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "uxR8VhGG9Pc" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CGgQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CGkQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CGgQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CGYQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CGcQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CGcQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CGYQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGQQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CGUQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CGUQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CGQQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGMQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCdmScpl5nFGLy3xCnfHjDsw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CGMQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGIQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt1eFI4VmhHRzlQYw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CGIQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CGEQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CGAQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "uxR8VhGG9Pc", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CGAQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play ไปล้อเล่นไกลๆ (Not kidding) - 4EVE" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause ไปล้อเล่นไกลๆ (Not kidding) - 4EVE" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/JSNwR0MzGZQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nxVEtvlDst0LNHDkyLhke5DtAxVg", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/JSNwR0MzGZQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lCv-xQk_IVZw17WPMrLzx1iZ1SEw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CF4QhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Heartbeat" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Jay Cinco", + "navigationEndpoint": { + "clickTrackingParams": "CFAQoLMCGF4iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCTfTV3COQIaxnvZPjNbXApw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "476K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CFAQoLMCGF4iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "JSNwR0MzGZQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CFAQoLMCGF4iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF0Qm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "JSNwR0MzGZQ", + "playlistId": "RDAMVMJSNwR0MzGZQ", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1KU053UjBNekdaUQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CF0Qm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CFsQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "JSNwR0MzGZQ", + "onEmptyQueue": { + "clickTrackingParams": "CFsQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "JSNwR0MzGZQ" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CFsQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CFwQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CFsQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CFkQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "JSNwR0MzGZQ", + "onEmptyQueue": { + "clickTrackingParams": "CFkQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "JSNwR0MzGZQ" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CFkQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CFoQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CFkQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CFcQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CFgQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CFgQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CFcQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFUQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CFYQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CFYQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CFUQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFQQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCTfTV3COQIaxnvZPjNbXApw", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CFQQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFMQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtKU053UjBNekdaUQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CFMQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CFIQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CFEQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "JSNwR0MzGZQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CFEQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Heartbeat - Jay Cinco" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Heartbeat - Jay Cinco" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DS8dvzDXpjQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mxmwi6QFdivD138rry1yXeOO20Yw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/DS8dvzDXpjQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mk0b9Auzeo7FgH6oyfA8rPrh6QTg", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CE8QhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Springtrap Sings A Song (SPOILERS!)(William Afton Five Nights At Freddy's Scary Movie Parody FNAF)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Aaron Fraser-Nash", + "navigationEndpoint": { + "clickTrackingParams": "CEEQoLMCGF8iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCHN9HRrB-BeOtSVKhVT7t_w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "328K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CEEQoLMCGF8iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "DS8dvzDXpjQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CEEQoLMCGF8iEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE4Qm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "DS8dvzDXpjQ", + "playlistId": "RDAMVMDS8dvzDXpjQ", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1EUzhkdnpEWHBqUQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CE4Qm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CEwQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "DS8dvzDXpjQ", + "onEmptyQueue": { + "clickTrackingParams": "CEwQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "DS8dvzDXpjQ" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CEwQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CE0QyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CEwQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CEoQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "DS8dvzDXpjQ", + "onEmptyQueue": { + "clickTrackingParams": "CEoQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "DS8dvzDXpjQ" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CEoQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CEsQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CEoQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CEgQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CEkQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CEkQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CEgQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEYQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CEcQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CEcQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CEYQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEUQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCHN9HRrB-BeOtSVKhVT7t_w", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CEUQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEQQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtEUzhkdnpEWHBqUQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CEQQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CEMQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CEIQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "DS8dvzDXpjQ", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CEIQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Springtrap Sings A Song (SPOILERS!)(William Afton Five Nights At Freddy's Scary Movie Parody FNAF) - Aaron Fraser-Nash" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Springtrap Sings A Song (SPOILERS!)(William Afton Five Nights At Freddy's Scary Movie Parody FNAF) - Aaron Fraser-Nash" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/j10zAWP5KsM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kajyPGgQ0FXDnSP-ytdfTXNz9hQA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/j10zAWP5KsM/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3n1Wdg6drmUlUCwVnAIviP9uN7J9g", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CEAQhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "તું મને પસંદ છે (Tu Mane Pasand Chhe)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Naresh Thakor", + "navigationEndpoint": { + "clickTrackingParams": "CDIQoLMCGGAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UChZSUPxvkA2ATGLY9zZrxnQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "483K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CDIQoLMCGGAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "j10zAWP5KsM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CDIQoLMCGGAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD8Qm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "j10zAWP5KsM", + "playlistId": "RDAMVMj10zAWP5KsM", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1qMTB6QVdQNUtzTQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CD8Qm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CD0Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "j10zAWP5KsM", + "onEmptyQueue": { + "clickTrackingParams": "CD0Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "j10zAWP5KsM" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CD0Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CD4QyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CD0Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CDsQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "j10zAWP5KsM", + "onEmptyQueue": { + "clickTrackingParams": "CDsQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "j10zAWP5KsM" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CDsQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CDwQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CDsQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CDkQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CDoQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CDoQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CDkQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDcQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CDgQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CDgQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CDcQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDYQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UChZSUPxvkA2ATGLY9zZrxnQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CDYQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDUQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtqMTB6QVdQNUtzTQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CDUQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CDQQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CDMQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "j10zAWP5KsM", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CDMQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play તું મને પસંદ છે (Tu Mane Pasand Chhe) - Naresh Thakor" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause તું મને પસંદ છે (Tu Mane Pasand Chhe) - Naresh Thakor" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ugFKFWhsoZA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kjXPfQjwzYdpmrO6Y5uU1ayCtd1Q", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/ugFKFWhsoZA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kKwfyxShWb6CJ2wSxqZVem53c-_w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CDEQhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "That's You (Official Video)" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Lucky Daye", + "navigationEndpoint": { + "clickTrackingParams": "CCMQoLMCGGEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCzj_b294hukUPPkbwgiMmLQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "1.1M views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CCMQoLMCGGEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "ugFKFWhsoZA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CCMQoLMCGGEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDAQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "ugFKFWhsoZA", + "playlistId": "RDAMVMugFKFWhsoZA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk11Z0ZLRldoc29aQQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CDAQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CC4Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ugFKFWhsoZA", + "onEmptyQueue": { + "clickTrackingParams": "CC4Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "ugFKFWhsoZA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CC4Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CC8QyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CC4Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CCwQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "ugFKFWhsoZA", + "onEmptyQueue": { + "clickTrackingParams": "CCwQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "ugFKFWhsoZA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CCwQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CC0QyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CCwQ--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CCoQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CCsQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CCsQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CCoQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCgQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CCkQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CCkQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CCgQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCcQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCzj_b294hukUPPkbwgiMmLQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CCcQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCYQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt1Z0ZLRldoc29aQQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CCYQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CCUQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CCQQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "ugFKFWhsoZA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CCQQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play That's You (Official Video) - Lucky Daye" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause That's You (Official Video) - Lucky Daye" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xXO1h6Kthcw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lHI0grhacXctkl5CnXgFz9ez9whA", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/xXO1h6Kthcw/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3kaw1Y4CinAbFneHIxv2fzVzpgf2w", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CCIQhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Hu Tara Dil Ma Tu Mara Dil Ma" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Rakesh Barot", + "navigationEndpoint": { + "clickTrackingParams": "CBQQoLMCGGIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCoS1Y8yS22Z1r3wVmHllaLA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + } + }, + { + "text": " • " + }, + { + "text": "683K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CBQQoLMCGGIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "xXO1h6Kthcw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CBQQoLMCGGIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCEQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "xXO1h6Kthcw", + "playlistId": "RDAMVMxXO1h6Kthcw", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk14WE8xaDZLdGhjdw%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CCEQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CB8Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "xXO1h6Kthcw", + "onEmptyQueue": { + "clickTrackingParams": "CB8Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "xXO1h6Kthcw" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CB8Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CCAQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CB8Qvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CB0Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "xXO1h6Kthcw", + "onEmptyQueue": { + "clickTrackingParams": "CB0Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "xXO1h6Kthcw" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CB0Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CB4QyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CB0Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CBsQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CBwQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CBwQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CBsQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CBkQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CBoQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CBoQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CBkQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CBgQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCoS1Y8yS22Z1r3wVmHllaLA", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CBgQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CBcQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "Cgt4WE8xaDZLdGhjdw%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CBcQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CBYQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CBUQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "xXO1h6Kthcw", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CBUQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Hu Tara Dil Ma Tu Mara Dil Ma - Rakesh Barot" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Hu Tara Dil Ma Tu Mara Dil Ma - Rakesh Barot" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + }, + { + "musicTwoRowItemRenderer": { + "thumbnailRenderer": { + "musicThumbnailRenderer": { + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VOUqmbeilXA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mhm35jPt3pgdbj_Fn-gjG0X-t2vw", + "width": 400, + "height": 225 + }, + { + "url": "https://i.ytimg.com/vi/VOUqmbeilXA/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3m43BfTWfu3gYHxNnG95q8gH1neuw", + "width": 800, + "height": 450 + } + ] + }, + "thumbnailCrop": "MUSIC_THUMBNAIL_CROP_UNSPECIFIED", + "thumbnailScale": "MUSIC_THUMBNAIL_SCALE_ASPECT_FILL", + "trackingParams": "CBMQhL8CIhMImOSwzvXAggMVrUBBAh23Dglm" + } + }, + "aspectRatio": "MUSIC_TWO_ROW_ITEM_THUMBNAIL_ASPECT_RATIO_RECTANGLE_16_9", + "title": { + "runs": [ + { + "text": "Khatu Wala" + } + ] + }, + "subtitle": { + "runs": [ + { + "text": "Ravi Bishnoi & B Siyol" + }, + { + "text": " • " + }, + { + "text": "11K views" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CAUQoLMCGGMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "VOUqmbeilXA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CAUQoLMCGGMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Start radio" + } + ] + }, + "icon": { + "iconType": "MIX" + }, + "navigationEndpoint": { + "clickTrackingParams": "CBIQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "VOUqmbeilXA", + "playlistId": "RDAMVMVOUqmbeilXA", + "params": "wAEB", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "GhFSREFNVk1WT1VxbWJlaWxYQQ%3D%3D" + } + }, + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CBIQm_MFGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Play next" + } + ] + }, + "icon": { + "iconType": "QUEUE_PLAY_NEXT" + }, + "serviceEndpoint": { + "clickTrackingParams": "CBAQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "VOUqmbeilXA", + "onEmptyQueue": { + "clickTrackingParams": "CBAQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "VOUqmbeilXA" + } + } + }, + "queueInsertPosition": "INSERT_AFTER_CURRENT_VIDEO", + "commands": [ + { + "clickTrackingParams": "CBAQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song will play next" + } + ] + }, + "trackingParams": "CBEQyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CBAQvu4FGAEiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuServiceItemRenderer": { + "text": { + "runs": [ + { + "text": "Add to queue" + } + ] + }, + "icon": { + "iconType": "ADD_TO_REMOTE_QUEUE" + }, + "serviceEndpoint": { + "clickTrackingParams": "CA4Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "queueAddEndpoint": { + "queueTarget": { + "videoId": "VOUqmbeilXA", + "onEmptyQueue": { + "clickTrackingParams": "CA4Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "watchEndpoint": { + "videoId": "VOUqmbeilXA" + } + } + }, + "queueInsertPosition": "INSERT_AT_END", + "commands": [ + { + "clickTrackingParams": "CA4Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "addToToastAction": { + "item": { + "notificationTextRenderer": { + "successResponseText": { + "runs": [ + { + "text": "Song added to queue" + } + ] + }, + "trackingParams": "CA8QyscDIhMImOSwzvXAggMVrUBBAh23Dglm" + } + } + } + } + ] + } + }, + "trackingParams": "CA4Q--8FGAIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "toggleMenuServiceItemRenderer": { + "defaultText": { + "runs": [ + { + "text": "Add to liked songs" + } + ] + }, + "defaultIcon": { + "iconType": "FAVORITE" + }, + "defaultServiceEndpoint": { + "clickTrackingParams": "CAwQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Like this song" + } + ] + }, + "content": { + "runs": [ + { + "text": "Improve recommendations and save music after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CA0Q8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CA0Q8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "toggledText": { + "runs": [ + { + "text": "Remove from liked songs" + } + ] + }, + "toggledIcon": { + "iconType": "UNFAVORITE" + }, + "trackingParams": "CAwQjJ8GGAMiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Save to playlist" + } + ] + }, + "icon": { + "iconType": "ADD_TO_PLAYLIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CAoQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "runs": [ + { + "text": "Save this for later" + } + ] + }, + "content": { + "runs": [ + { + "text": "Make playlists and share them after signing in" + } + ] + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "navigationEndpoint": { + "clickTrackingParams": "CAsQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "signInEndpoint": { + "hack": true + } + }, + "trackingParams": "CAsQ8FsiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + } + } + } + }, + "trackingParams": "CAoQw5QGGAQiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Go to artist" + } + ] + }, + "icon": { + "iconType": "ARTIST" + }, + "navigationEndpoint": { + "clickTrackingParams": "CAkQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "browseEndpoint": { + "browseId": "UCVfzVLAQKFxm8wdP0OijFHQ", + "browseEndpointContextSupportedConfigs": { + "browseEndpointContextMusicConfig": { + "pageType": "MUSIC_PAGE_TYPE_ARTIST" + } + } + } + }, + "trackingParams": "CAkQkPsFGAUiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Share" + } + ] + }, + "icon": { + "iconType": "SHARE" + }, + "navigationEndpoint": { + "clickTrackingParams": "CAgQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "shareEntityEndpoint": { + "serializedShareEntity": "CgtWT1VxbWJlaWxYQQ%3D%3D", + "sharePanelType": "SHARE_PANEL_TYPE_UNIFIED_SHARE_PANEL" + } + }, + "trackingParams": "CAgQkfsFGAYiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CAcQpzsiEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "accessibility": { + "accessibilityData": { + "label": "Action menu" + } + } + } + }, + "thumbnailOverlay": { + "musicItemThumbnailOverlayRenderer": { + "background": { + "verticalGradient": { + "gradientLayerColors": [ + "2147483648", + "2147483648" + ] + } + }, + "content": { + "musicPlayButtonRenderer": { + "playNavigationEndpoint": { + "clickTrackingParams": "CAYQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "watchEndpoint": { + "videoId": "VOUqmbeilXA", + "watchEndpointMusicSupportedConfigs": { + "watchEndpointMusicConfig": { + "musicVideoType": "MUSIC_VIDEO_TYPE_OMV" + } + } + } + }, + "trackingParams": "CAYQyN4CIhMImOSwzvXAggMVrUBBAh23Dglm", + "playIcon": { + "iconType": "PLAY_ARROW" + }, + "pauseIcon": { + "iconType": "PAUSE" + }, + "iconColor": 4294967295, + "backgroundColor": 0, + "activeBackgroundColor": 0, + "loadingIndicatorColor": 4294901760, + "playingIcon": { + "iconType": "VOLUME_UP" + }, + "iconLoadingColor": 0, + "activeScaleFactor": 1, + "buttonSize": "MUSIC_PLAY_BUTTON_SIZE_HUGE", + "rippleTarget": "MUSIC_PLAY_BUTTON_RIPPLE_TARGET_ANCESTOR", + "accessibilityPlayData": { + "accessibilityData": { + "label": "Play Khatu Wala - Ravi Bishnoi" + } + }, + "accessibilityPauseData": { + "accessibilityData": { + "label": "Pause Khatu Wala - Ravi Bishnoi" + } + } + } + }, + "contentPosition": "MUSIC_ITEM_THUMBNAIL_OVERLAY_CONTENT_POSITION_CENTERED", + "displayStyle": "MUSIC_ITEM_THUMBNAIL_OVERLAY_DISPLAY_STYLE_PERSISTENT" + } + } + } + } + ], + "trackingParams": "CAQQ6IsCGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ], + "trackingParams": "CAMQui8iEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + "trackingParams": "CAIQ8JMBGAAiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + } + ] + } + }, + "header": { + "musicHeaderRenderer": { + "title": { + "runs": [ + { + "text": "Music videos" + } + ] + }, + "trackingParams": "CAEQ4HIiEwiY5LDO9cCCAxWtQEECHbcOCWY=" + } + }, + "trackingParams": "CAAQhGciEwiY5LDO9cCCAxWtQEECHbcOCWY=", + "maxAgeStoreSeconds": 300 +} diff --git a/tests/youtube.rs b/tests/youtube.rs index 2af69b7..118ad28 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1389,9 +1389,10 @@ fn music_playlist_cont(#[case] id: &str, rp: RustyPipe) { assert_gte(track_count, 100, "tracks"); assert_eq!(track_count, playlist.tracks.count.unwrap()); - assert_eq!( + assert_gte( usize::try_from(track_count).unwrap(), - playlist.tracks.items.len() + playlist.tracks.items.len(), + "tracks", ); } @@ -2263,7 +2264,12 @@ fn music_new_videos(rp: RustyPipe) { validate::video_id(&video.id).unwrap(); assert!(!video.name.is_empty()); assert!(!video.cover.is_empty(), "got no cover"); - assert_gte(video.view_count.unwrap(), 1000, "views"); + if let Some(view_count) = video.view_count { + assert_gte(view_count, 1000, "views"); + } else { + // Podcast episode: shows duration instead of view count + assert!(video.duration.is_some(), "no view count or duration"); + } assert!(video.is_video); } } From 26fc5a069305c863bd4a0f002bd9ae6b4d00fc2a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 15 Nov 2023 00:49:13 +0100 Subject: [PATCH 065/459] chore: sort dictionary --- testfiles/dict/dictionary.json | 2577 ++++++++++++++++---------------- testfiles/dict/format_dict.js | 60 + 2 files changed, 1352 insertions(+), 1285 deletions(-) create mode 100644 testfiles/dict/format_dict.js diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index 9f71cb2..0138944 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -3,39 +3,39 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s.": "s", "sekonde": "s", "sekondes": "s", - "s.": "s", - "minuut": "m", - "minute": "m", "min.": "m", - "uur": "h", + "minute": "m", + "minuut": "m", "u.": "h", - "dag": "D", + "uur": "h", "dae": "D", + "dag": "D", + "w.": "W", "week": "W", "weke": "W", - "w.": "W", "maand": "M", "maande": "M", "md.": "M", - "jaar": "Y", - "j.": "Y" + "j.": "Y", + "jaar": "Y" }, "date_order": "DY", "months": { - "apr.": 4, - "aug.": 8, - "des.": 12, - "feb.": 2, "jan.": 1, - "jul.": 7, - "jun.": 6, - "mei": 5, + "feb.": 2, "mrt.": 3, - "nov.": 11, + "apr.": 4, + "mei": 5, + "jun.": 6, + "jul.": 7, + "aug.": 8, + "sep.": 9, "okt.": 10, - "sep.": 9 + "nov.": 11, + "des.": 12 }, "timeago_nd_tokens": { "vandag": "0D", @@ -51,10 +51,10 @@ }, "album_types": { "album": "Album", - "drama": "Show", - "enkelsnit": "Single", + "oudioboek": "Audiobook", "ep": "Ep", - "oudioboek": "Audiobook" + "drama": "Show", + "enkelsnit": "Single" } }, "am": { @@ -69,30 +69,30 @@ "ደቂቃዎች፣": "m", "ሰዓት": "h", "ሰዓቶች": "h", - "ቀን": "D", "ቀናት": "D", + "ቀን": "D", "ቀኖች": "D", - "ሳምንት": "W", "ሳምንታት": "W", - "ወር": "M", + "ሳምንት": "W", "ወራት": "M", - "ዓመት": "Y", - "ዓመታት": "Y" + "ወር": "M", + "ዓመታት": "Y", + "ዓመት": "Y" }, "date_order": "DY", "months": { - "ማርች": 3, - "ሜይ": 5, - "ሴፕቴ": 9, - "ኖቬም": 11, - "ኤፕሪ": 4, - "ኦክቶ": 10, - "ኦገስ": 8, - "ዲሴም": 12, - "ጁላይ": 7, - "ጁን": 6, "ጃንዩ": 1, - "ፌብሩ": 2 + "ፌብሩ": 2, + "ማርች": 3, + "ኤፕሪ": 4, + "ሜይ": 5, + "ጁን": 6, + "ጁላይ": 7, + "ኦገስ": 8, + "ሴፕቴ": 9, + "ኦክቶ": 10, + "ኖቬም": 11, + "ዲሴም": 12 }, "timeago_nd_tokens": { "ዛሬ": "0D", @@ -100,19 +100,19 @@ }, "comma_decimal": false, "number_tokens": { - "ሚ": 6, "ሺ": 3, + "ሚ": 6, "ቢ": 9 }, "number_nd_tokens": { "የለዉም": 0 }, "album_types": { - "ትዕይንት": "Show", - "ነጠላ": "Single", "አልበም": "Album", "ኦዲዮ መጽሐፍ": "Audiobook", - "የተራዘመ አልበም": "Ep" + "የተራዘመ አልበም": "Ep", + "ትዕይንት": "Show", + "ነጠላ": "Single" } }, "ar": { @@ -120,35 +120,35 @@ "by_char": false, "timeago_tokens": { "ثانية": "s", - "ثوانِ": "s", - "ثوانٍ": "s", "ثوان": "s", + "ثوانٍ": "s", + "ثوانِ": "s", + "وثانية": "s", "ثانيتين": "2s", "وثانيتان": "2s", "دقائق": "m", "دقيقة": "m", "دقيقتان": "2m", "دقيقتين": "2m", - "ساعتين": "2h", "ساعات": "h", "ساعة": "h", - "يومين": "2D", + "ساعتين": "2h", "أيام": "D", - "يومًا": "D", "يوم": "D", - "أسبوعين": "2W", + "يومًا": "D", + "يومين": "2D", "أسابيع": "W", - "أسبوعًا": "W", "أسبوع": "W", - "شهرين": "2M", + "أسبوعًا": "W", + "أسبوعين": "2W", "أشهر": "M", - "شهرًا": "M", "خلال": "M", "شهر": "M", - "سنتين": "2Y", - "سنوات": "Y", + "شهرًا": "M", + "شهرين": "2M", "سنة": "Y", - "وثانية": "s" + "سنوات": "Y", + "سنتين": "2Y" }, "date_order": "DMY", "months": {}, @@ -160,19 +160,19 @@ "number_tokens": { "آلاف": 3, "ألف": 3, - "مليار": 9, - "مليون": 6 + "مليون": 6, + "مليار": 9 }, "number_nd_tokens": { "لا": 0, "واحد": 1 }, "album_types": { - "أغنية منفردة": "Single", "ألبوم": "Album", - "ألبوم قصير": "Ep", "الكتب المسموعة": "Audiobook", - "عرض": "Show" + "ألبوم قصير": "Ep", + "عرض": "Show", + "أغنية منفردة": "Single" } }, "as": { @@ -195,17 +195,17 @@ }, "comma_decimal": false, "number_tokens": { - "কোঃটা": 9, + "হা": 3, + "হাজাৰ": 3, + "হাজাৰটা": 3, + "লা": 5, + "লাখ": 5, + "লাখটা": 5, "নিঃ": 6, "নিঃটা": 6, "নিযুত": 6, "নিযুতটা": 6, - "লা": 5, - "লাখ": 5, - "লাখটা": 5, - "হা": 3, - "হাজাৰ": 3, - "হাজাৰটা": 3 + "কোঃটা": 9 }, "number_nd_tokens": { "নাই": 0, @@ -213,11 +213,11 @@ "১টা": 1 }, "album_types": { - "ep": "Ep", - "অডিঅ’বুক": "Audiobook", - "একক": "Single", "এলবাম": "Album", - "শ্ব’": "Show" + "অডিঅ’বুক": "Audiobook", + "ep": "Ep", + "শ্ব’": "Show", + "একক": "Single" } }, "az": { @@ -234,18 +234,18 @@ }, "date_order": "DY", "months": { - "apr": 4, - "avq": 8, - "dek": 12, + "yan": 1, "fev": 2, - "iyl": 7, - "iyn": 6, "mar": 3, + "apr": 4, "may": 5, - "noy": 11, - "okt": 10, + "iyn": 6, + "iyl": 7, + "avq": 8, "sen": 9, - "yan": 1 + "okt": 10, + "noy": 11, + "dek": 12 }, "timeago_nd_tokens": { "bugün": "0D", @@ -263,62 +263,62 @@ "albom": "Album", "audio kitab": "Audiobook", "ep": "Ep", - "tək": "Single", - "şou": "Show" + "şou": "Show", + "tək": "Single" } }, "be": { "equivalent": [], "by_char": false, "timeago_tokens": { - "секунду": "s", - "секунды": "s", + "с": "s", "секунд": "s", "секунда": "s", - "с": "s", - "хвіліну": "m", - "хвіліны": "m", + "секунду": "s", + "секунды": "s", + "хв": "m", "хвілін": "m", "хвіліна": "m", - "хв": "m", + "хвіліну": "m", + "хвіліны": "m", + "гадз": "h", + "гадзін": "h", "гадзіну": "h", "гадзіны": "h", - "гадзін": "h", - "гадз": "h", + "дзён": "D", "дзень": "D", "дні": "D", - "дзён": "D", "дня": "D", + "тыд": "W", "тыдзень": "W", "тыдні": "W", - "тыдняў": "W", "тыдня": "W", - "тыд": "W", - "месяц": "M", - "месяцы": "M", - "месяцаў": "M", - "месяца": "M", + "тыдняў": "W", "мес.": "M", - "год": "Y", - "гады": "Y", + "месяц": "M", + "месяца": "M", + "месяцаў": "M", + "месяцы": "M", + "г.": "Y", "гадоў": "Y", - "года": "Y", - "г.": "Y" + "гады": "Y", + "год": "Y", + "года": "Y" }, "date_order": "DY", "months": { - "вер": 9, - "жні": 8, - "кас": 10, - "кра": 4, - "лют": 2, - "ліп": 7, - "ліс": 11, - "мая": 5, - "сак": 3, - "сне": 12, "сту": 1, - "чэр": 6 + "лют": 2, + "сак": 3, + "кра": 4, + "мая": 5, + "чэр": 6, + "ліп": 7, + "жні": 8, + "вер": 9, + "кас": 10, + "ліс": 11, + "сне": 12 }, "timeago_nd_tokens": { "сёння": "0D", @@ -326,9 +326,9 @@ }, "comma_decimal": true, "number_tokens": { + "тыс": 3, "млн": 6, - "млрд": 9, - "тыс": 3 + "млрд": 9 }, "number_nd_tokens": { "няма": 0 @@ -337,34 +337,34 @@ "альбом": "Album", "аўдыякніга": "Audiobook", "міні-альбом": "Ep", - "сінгл": "Single", - "шоу": "Show" + "шоу": "Show", + "сінгл": "Single" } }, "bg": { "equivalent": [], "by_char": false, "timeago_tokens": { + "сек": "s", "секунда": "s", "секунди": "s", - "сек": "s", + "мин": "m", "минута": "m", "минути": "m", - "мин": "m", + "ч": "h", "час": "h", "часа": "h", - "ч": "h", "ден": "D", "дни": "D", + "седм.": "W", "седмица": "W", "седмици": "W", - "седм.": "W", + "м.": "M", "месец": "M", "месеца": "M", - "м.": "M", + "г.": "Y", "година": "Y", - "години": "Y", - "г.": "Y" + "години": "Y" }, "date_order": "DMY", "months": {}, @@ -374,9 +374,9 @@ }, "comma_decimal": true, "number_tokens": { + "хил": 3, "млн": 6, - "млрд": 9, - "хил": 3 + "млрд": 9 }, "number_nd_tokens": { "няма": 0 @@ -403,18 +403,18 @@ }, "date_order": "DY", "months": { - "অক্টো,": 10, - "আগ,": 8, - "এপ্রি,": 4, "জানু,": 1, - "জুন,": 6, - "জুল,": 7, - "ডিসে,": 12, - "নভে,": 11, "ফেব,": 2, "মার্চ,": 3, + "এপ্রি,": 4, "মে,": 5, - "সেপ,": 9 + "জুন,": 6, + "জুল,": 7, + "আগ,": 8, + "সেপ,": 9, + "অক্টো,": 10, + "নভে,": 11, + "ডিসে,": 12 }, "timeago_nd_tokens": { "আজ": "0D", @@ -422,21 +422,21 @@ }, "comma_decimal": false, "number_tokens": { - "কো": 7, - "কোটি": 7, - "লা": 5, - "লাটি": 5, "শত": 2, "হা": 3, - "হাটি": 3 + "হাটি": 3, + "লা": 5, + "লাটি": 5, + "কো": 7, + "কোটি": 7 }, "number_nd_tokens": { "০": 0, "১": 1 }, "album_types": { - "অডিওবুক": "Audiobook", "অ্যালবাম": "Album", + "অডিওবুক": "Audiobook", "ইপি": "Ep", "শো": "Show", "সিঙ্গেল": "Single" @@ -446,48 +446,48 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sekundu": "s", + "sek.": "s", + "sekunda": "s", "sekunde": "s", "sekundi": "s", - "sekunda": "s", - "sek.": "s", - "minutu": "m", - "minute": "m", - "minuta": "m", + "sekundu": "s", "min.": "m", + "minuta": "m", + "minute": "m", + "minutu": "m", "sat": "h", "sata": "h", "sati": "h", + "d.": "D", "dan": "D", "dana": "D", - "d.": "D", - "sedmicu": "W", - "sedmice": "W", - "sedmica": "W", "sed.": "W", + "sedmica": "W", + "sedmice": "W", + "sedmicu": "W", + "mj.": "M", "mjesec": "M", "mjeseca": "M", "mjeseci": "M", - "mj.": "M", - "godinu": "Y", - "godine": "Y", + "god.": "Y", "godina": "Y", - "god.": "Y" + "godine": "Y", + "godinu": "Y" }, "date_order": "DY", "months": { - "apr": 4, - "aug": 8, - "dec": 12, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, - "maj": 5, + "feb": 2, "mar": 3, - "nov": 11, + "apr": 4, + "maj": 5, + "jun": 6, + "jul": 7, + "aug": 8, + "sep": 9, "okt": 10, - "sep": 9 + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "danas": "0D", @@ -514,20 +514,20 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "segon": "s", "segons": "s", - "s": "s", + "min": "m", "minut": "m", "minuts": "m", - "min": "m", + "h": "h", "hora": "h", "hores": "h", - "h": "h", "dia": "D", "dies": "D", + "setm.": "W", "setmana": "W", "setmanes": "W", - "setm.": "W", "mes": "M", "mesos": "M", "any": "Y", @@ -535,18 +535,18 @@ }, "date_order": "DY", "months": { - "des.": 12, - "d’abr.": 4, - "d’ag.": 8, - "d’oct.": 10, - "febr.": 2, "gen.": 1, - "jul.": 7, - "juny": 6, - "maig": 5, + "febr.": 2, "març": 3, + "d’abr.": 4, + "maig": 5, + "juny": 6, + "jul.": 7, + "d’ag.": 8, + "set.": 9, + "d’oct.": 10, "nov.": 11, - "set.": 9 + "des.": 12 }, "timeago_nd_tokens": { "avui": "0D", @@ -554,57 +554,57 @@ }, "comma_decimal": true, "number_tokens": { - "km": 9, - "m": 6 + "m": 6, + "km": 9 }, "number_nd_tokens": { "sense": 0 }, "album_types": { + "àlbum": "Album", "audiollibre": "Audiobook", "ep": "Ep", "programa": "Show", - "single": "Single", - "àlbum": "Album" + "single": "Single" } }, "cs": { "equivalent": [], "by_char": false, "timeago_tokens": { - "sekundou": "s", - "sekundami": "s", - "sekundy": "s", + "s": "s", "sekund": "s", "sekunda": "s", - "s": "s", - "minutou": "m", - "minutami": "m", - "minuty": "m", + "sekundami": "s", + "sekundou": "s", + "sekundy": "s", + "min": "m", "minut": "m", "minuta": "m", - "min": "m", - "hodinou": "h", - "hodinami": "h", - "hodiny": "h", + "minutami": "m", + "minutou": "m", + "minuty": "m", "h": "h", + "hodinami": "h", + "hodinou": "h", + "hodiny": "h", + "dne": "D", "dnem": "D", "dny": "D", - "dne": "D", + "týd.": "W", + "týdne": "W", "týdnem": "W", "týdny": "W", - "týdne": "W", - "týd.": "W", + "měs.": "M", + "měsíce": "M", "měsícem": "M", "měsíci": "M", - "měsíce": "M", - "měs.": "M", - "rokem": "Y", + "l.": "Y", "lety": "Y", - "roku": "Y", - "roky": "Y", "r.": "Y", - "l.": "Y" + "rokem": "Y", + "roku": "Y", + "roky": "Y" }, "date_order": "DMY", "months": {}, @@ -614,29 +614,29 @@ }, "comma_decimal": true, "number_tokens": { + "tis": 3, "mil": 6, - "mld": 9, - "tis": 3 + "mld": 9 }, "number_nd_tokens": {}, "album_types": { "album": "Album", "audiokniha": "Audiobook", "ep": "Ep", - "singl": "Single", - "zobrazit": "Show" + "zobrazit": "Show", + "singl": "Single" } }, "da": { "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", "sekund": "s", "sekunder": "s", - "sek.": "s", + "min.": "m", "minut": "m", "minutter": "m", - "min.": "m", "time": "h", "timer": "h", "dag": "D", @@ -651,18 +651,18 @@ }, "date_order": "DY", "months": { - "apr.": 4, - "aug.": 8, - "dec.": 12, - "feb.": 2, "jan.": 1, - "jul.": 7, - "jun.": 6, - "maj": 5, + "feb.": 2, "mar.": 3, - "nov.": 11, + "apr.": 4, + "maj": 5, + "jun.": 6, + "jul.": 7, + "aug.": 8, + "sep.": 9, "okt.": 10, - "sep.": 9 + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -670,16 +670,16 @@ }, "comma_decimal": true, "number_tokens": { - "mia": 9, - "mio": 6 + "mio": 6, + "mia": 9 }, "number_nd_tokens": { "ingen": 0 }, "album_types": { "album": "Album", - "ep": "Ep", "lydbog": "Audiobook", + "ep": "Ep", "lyddrama": "Show", "single": "Single" } @@ -688,15 +688,15 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", "sekunde": "s", "sekunden": "s", - "sek.": "s", + "min.": "m", "minute": "m", "minuten": "m", - "min.": "m", + "std.": "h", "stunde": "h", "stunden": "h", - "std.": "h", "tag": "D", "tagen": "D", "woche": "W", @@ -722,8 +722,8 @@ }, "album_types": { "album": "Album", - "ep": "Ep", "hörbuch": "Audiobook", + "ep": "Ep", "hörspiel": "Show", "single": "Single" } @@ -732,40 +732,40 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "δευτερόλεπτο": "s", - "δευτερόλεπτα": "s", "δευτ.": "s", - "λεπτό": "m", - "λεπτά": "m", + "δευτερόλεπτα": "s", + "δευτερόλεπτο": "s", "λεπ.": "m", + "λεπτά": "m", + "λεπτό": "m", + "ώ.": "h", "ώρα": "h", "ώρες": "h", - "ώ.": "h", + "ημ.": "D", "ημέρα": "D", "ημέρες": "D", - "ημ.": "D", + "εβδ.": "W", "εβδομάδα": "W", "εβδομάδες": "W", - "εβδ.": "W", "μήνα": "M", "μήνες": "M", - "έτος": "Y", - "έτη": "Y" + "έτη": "Y", + "έτος": "Y" }, "date_order": "DY", "months": { - "απρ": 4, - "αυγ": 8, - "δεκ": 12, "ιαν": 1, - "ιουλ": 7, - "ιουν": 6, - "μαΐ": 5, + "φεβ": 2, "μαρ": 3, - "νοε": 11, - "οκτ": 10, + "απρ": 4, + "μαΐ": 5, + "ιουν": 6, + "ιουλ": 7, + "αυγ": 8, "σεπ": 9, - "φεβ": 2 + "οκτ": 10, + "νοε": 11, + "δεκ": 12 }, "timeago_nd_tokens": { "σήμερα": "0D", @@ -773,67 +773,70 @@ }, "comma_decimal": true, "number_tokens": { - "δισ": 9, + "χιλ": 3, "εκ": 6, - "χιλ": 3 + "δισ": 9 }, "number_nd_tokens": { "καμία": 0 }, "album_types": { - "ep": "Ep", - "single": "Single", "άλμπουμ": "Album", + "ηχητικό βιβλίο": "Audiobook", + "ep": "Ep", "εκπομπή": "Show", - "ηχητικό βιβλίο": "Audiobook" + "single": "Single" } }, "en": { - "equivalent": ["en-GB", "en-IN"], + "equivalent": [ + "en-GB", + "en-IN" + ], "by_char": false, "timeago_tokens": { + "s": "s", + "sec": "s", "second": "s", "seconds": "s", - "sec": "s", - "s": "s", + "m": "m", + "min": "m", "minute": "m", "minutes": "m", - "min": "m", - "m": "m", + "h": "h", "hour": "h", "hours": "h", "hr": "h", - "h": "h", + "d": "D", "day": "D", "days": "D", - "d": "D", + "w": "W", "week": "W", "weeks": "W", "wk": "W", - "w": "W", + "mo": "M", "month": "M", "months": "M", - "mo": "M", + "y": "Y", "year": "Y", "years": "Y", - "yr": "Y", - "y": "Y" + "yr": "Y" }, "date_order": "DY", "months": { - "apr": 4, - "aug": 8, - "dec": 12, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, + "feb": 2, "mar": 3, + "apr": 4, "may": 5, - "nov": 11, - "oct": 10, + "jun": 6, + "jul": 7, + "aug": 8, "sep": 9, - "sept": 9 + "sept": 9, + "oct": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "today": "0D", @@ -841,10 +844,10 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, - "crore": 7, "lakh": 5, - "m": 6 + "m": 6, + "crore": 7, + "b": 9 }, "number_nd_tokens": { "no": 0 @@ -861,41 +864,41 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "segundo": "s", "segundos": "s", - "s": "s", + "min": "m", "minuto": "m", "minutos": "m", - "min": "m", + "h": "h", "hora": "h", "horas": "h", - "h": "h", + "d": "D", "día": "D", "días": "D", - "d": "D", + "sem.": "W", "semana": "W", "semanas": "W", - "sem.": "W", + "m": "M", "mes": "M", "meses": "M", - "m": "M", "año": "Y", "años": "Y" }, "date_order": "DY", "months": { - "abr": 4, - "ago": 8, - "dic": 12, "ene": 1, "feb": 2, - "jul": 7, - "jun": 6, "mar": 3, + "abr": 4, "may": 5, - "nov": 11, + "jun": 6, + "jul": 7, + "ago": 8, + "sept": 9, "oct": 10, - "sept": 9 + "nov": 11, + "dic": 12 }, "timeago_nd_tokens": { "hoy": "0D", @@ -903,56 +906,58 @@ }, "comma_decimal": true, "number_tokens": { - "m": 6, - "mil": 3 + "mil": 3, + "m": 6 }, "number_nd_tokens": {}, "album_types": { - "audiodrama": "Show", + "álbum": "Album", "audiolibro": "Audiobook", "ep": "Ep", - "single": "Single", - "álbum": "Album" + "audiodrama": "Show", + "single": "Single" } }, "es-US": { - "equivalent": ["es-419"], + "equivalent": [ + "es-419" + ], "by_char": false, "timeago_tokens": { + "s": "s", "segundo": "s", "segundos": "s", - "s": "s", + "min": "m", "minuto": "m", "minutos": "m", - "min": "m", + "h": "h", "hora": "h", "horas": "h", - "h": "h", "día": "D", "días": "D", + "sem.": "W", "semana": "W", "semanas": "W", - "sem.": "W", + "m": "M", "mes": "M", "meses": "M", - "m": "M", "año": "Y", "años": "Y" }, "date_order": "DY", "months": { - "abr": 4, - "ago": 8, - "dic": 12, "ene": 1, "feb": 2, - "jul": 7, - "jun": 6, "mar": 3, + "abr": 4, "may": 5, - "nov": 11, + "jun": 6, + "jul": 7, + "ago": 8, + "sept": 9, "oct": 10, - "sept": 9 + "nov": 11, + "dic": 12 }, "timeago_nd_tokens": { "hoy": "0D", @@ -960,59 +965,59 @@ }, "comma_decimal": false, "number_tokens": { - "m": 6, - "mil": 3 + "mil": 3, + "m": 6 }, "number_nd_tokens": { "sin": 0 }, "album_types": { + "álbum": "Album", "audiolibro": "Audiobook", "ep": "Ep", "programa": "Show", - "sencillo": "Single", - "álbum": "Album" + "sencillo": "Single" } }, "et": { "equivalent": [], "by_char": false, "timeago_tokens": { - "sekundi": "s", - "sekund": "s", - "sekundit": "s", "sek": "s", - "minuti": "m", - "minut": "m", - "minutit": "m", + "sekund": "s", + "sekundi": "s", + "sekundit": "s", "min": "m", - "tunni": "h", + "minut": "m", + "minuti": "m", + "minutit": "m", "t": "h", + "tunni": "h", + "p": "D", "päev": "D", "päeva": "D", - "p": "D", - "nädala": "W", - "nädal": "W", "näd": "W", + "nädal": "W", + "nädala": "W", "kuu": "M", "kuud": "M", - "aasta": "Y", - "a": "Y" + "a": "Y", + "aasta": "Y" }, "date_order": "DY", "months": { - "apr": 4, - "aug": 8, - "dets": 12, "jaan": 1, - "juuli": 7, - "juuni": 6, - "mai": 5, + "veebr": 2, "märts": 3, - "nov": 11, - "okt": 10, + "apr": 4, + "mai": 5, + "juuni": 6, + "juuli": 7, + "aug": 8, "sept": 9, - "veebr": 2 + "okt": 10, + "nov": 11, + "dets": 12 }, "timeago_nd_tokens": { "täna": "0D", @@ -1020,9 +1025,9 @@ }, "comma_decimal": true, "number_tokens": { - "mld": 9, + "tuh": 3, "mln": 6, - "tuh": 3 + "mld": 9 }, "number_nd_tokens": { "pole": 0 @@ -1049,18 +1054,18 @@ }, "date_order": "YD", "months": { - "abe.": 12, - "abu.": 8, - "api.": 4, - "aza.": 11, - "eka.": 6, - "ira.": 9, - "mai.": 5, - "mar.": 3, - "ots.": 2, - "urr.": 10, "urt.": 1, - "uzt.": 7 + "ots.": 2, + "mar.": 3, + "api.": 4, + "mai.": 5, + "eka.": 6, + "uzt.": 7, + "abu.": 8, + "ira.": 9, + "urr.": 10, + "aza.": 11, + "abe.": 12 }, "timeago_nd_tokens": { "gaur": "0D", @@ -1095,18 +1100,18 @@ }, "date_order": "DY", "months": { - "آوریل": 4, - "اوت": 8, - "اکتبر": 10, - "دسامبر": 12, - "سپتامبر": 9, + "ژانویه": 1, "فوریه": 2, "مارس": 3, + "آوریل": 4, "مه": 5, - "نوامبر": 11, - "ژانویه": 1, "ژوئن": 6, - "ژوئیه": 7 + "ژوئیه": 7, + "اوت": 8, + "سپتامبر": 9, + "اکتبر": 10, + "نوامبر": 11, + "دسامبر": 12 }, "timeago_nd_tokens": { "امروز": "0D", @@ -1114,9 +1119,9 @@ }, "comma_decimal": false, "number_tokens": { - "میلیارد": 9, + "هزار": 3, "میلیون": 6, - "هزار": 3 + "میلیارد": 9 }, "number_nd_tokens": { "بدون": 0, @@ -1124,37 +1129,37 @@ }, "album_types": { "آلبوم": "Album", - "تک آهنگ": "Single", - "نمایش": "Show", + "کتاب صوتی": "Audiobook", "پخش فوق‌العاده": "Ep", - "کتاب صوتی": "Audiobook" + "نمایش": "Show", + "تک آهنگ": "Single" } }, "fi": { "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "sekunti": "s", "sekuntia": "s", - "s": "s", + "min": "m", "minuutti": "m", "minuuttia": "m", - "min": "m", + "t": "h", "tunti": "h", "tuntia": "h", - "t": "h", "päivä": "D", "päivää": "D", "pv": "D", "viikko": "W", "viikkoa": "W", "vk": "W", + "kk": "M", "kuukausi": "M", "kuukautta": "M", - "kk": "M", + "v": "Y", "vuosi": "Y", - "vuotta": "Y", - "v": "Y" + "vuotta": "Y" }, "date_order": "DMY", "months": {}, @@ -1164,9 +1169,9 @@ }, "comma_decimal": true, "number_tokens": { + "t": 3, "milj": 6, - "mrd": 9, - "t": 3 + "mrd": 9 }, "number_nd_tokens": { "ei": 0, @@ -1174,20 +1179,20 @@ }, "album_types": { "albumi": "Album", + "äänikirja": "Audiobook", "ep": "Ep", "näytä": "Show", - "single": "Single", - "äänikirja": "Audiobook" + "single": "Single" } }, "fil": { "equivalent": [], "by_char": false, "timeago_tokens": { - "segundo": "s", "seg.": "s", - "minuto": "m", + "segundo": "s", "min.": "m", + "minuto": "m", "oras": "h", "araw": "D", "linggo": "W", @@ -1196,18 +1201,18 @@ }, "date_order": "DY", "months": { - "abr": 4, - "ago": 8, - "dis": 12, "ene": 1, - "hul": 7, - "hun": 6, - "mar": 3, - "may": 5, - "nob": 11, - "okt": 10, "peb": 2, - "set": 9 + "mar": 3, + "abr": 4, + "may": 5, + "hun": 6, + "hul": 7, + "ago": 8, + "set": 9, + "okt": 10, + "nob": 11, + "dis": 12 }, "timeago_nd_tokens": { "ngayong": "0D", @@ -1215,8 +1220,8 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, - "m": 6 + "m": 6, + "b": 9 }, "number_nd_tokens": { "walang": 0 @@ -1230,44 +1235,46 @@ } }, "fr": { - "equivalent": ["fr-CA"], + "equivalent": [ + "fr-CA" + ], "by_char": false, "timeago_tokens": { + "s": "s", "seconde": "s", "secondes": "s", - "s": "s", + "min": "m", "minute": "m", "minutes": "m", - "min": "m", + "h": "h", "heure": "h", "heures": "h", - "h": "h", + "j": "D", "jour": "D", "jours": "D", - "j": "D", + "sem.": "W", "semaine": "W", "semaines": "W", - "sem.": "W", - "mois": "M", "m.": "M", + "mois": "M", "an": "Y", "ans": "Y" }, "date_order": "DY", "months": { - "août": 8, - "avr.": 4, - "déc.": 12, - "févr.": 2, "janv.": 1, + "févr.": 2, + "mars": 3, + "avr.": 4, + "mai": 5, + "juin": 6, "juil.": 7, "juill.": 7, - "juin": 6, - "mai": 5, - "mars": 3, - "nov.": 11, + "août": 8, + "sept.": 9, "oct.": 10, - "sept.": 9 + "nov.": 11, + "déc.": 12 }, "timeago_nd_tokens": { "aujourd'hui": "0D", @@ -1275,8 +1282,8 @@ }, "comma_decimal": true, "number_tokens": { - "g": 9, "m": 6, + "g": 9, "md": 9 }, "number_nd_tokens": { @@ -1285,32 +1292,32 @@ }, "album_types": { "album": "Album", - "ep": "Ep", "livre audio": "Audiobook", + "ep": "Ep", "microalbum": "Ep", + "émission": "Show", "simple": "Single", - "single": "Single", - "émission": "Show" + "single": "Single" } }, "gl": { "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "segundo": "s", "segundos": "s", - "s": "s", + "min": "m", "minuto": "m", "minutos": "m", - "min": "m", + "h": "h", "hora": "h", "horas": "h", - "h": "h", "día": "D", "días": "D", + "sem.": "W", "semana": "W", "semanas": "W", - "sem.": "W", "mes": "M", "meses": "M", "ano": "Y", @@ -1318,18 +1325,18 @@ }, "date_order": "DY", "months": { - "abr.": 4, - "ago.": 8, - "dec.": 12, - "feb.": 2, - "maio": 5, - "mar.": 3, - "nov.": 11, - "out.": 10, - "set.": 9, "xan.": 1, + "feb.": 2, + "mar.": 3, + "abr.": 4, + "maio": 5, + "xuño": 6, "xul.": 7, - "xuño": 6 + "ago.": 8, + "set.": 9, + "out.": 10, + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "hoxe": "0D", @@ -1343,11 +1350,11 @@ "ningunha": 0 }, "album_types": { + "álbum": "Album", "audiolibro": "Audiobook", "ep": "Ep", "programa": "Show", - "single": "Single", - "álbum": "Album" + "single": "Single" } }, "gu": { @@ -1358,25 +1365,25 @@ "મિનિટ": "m", "કલાક": "h", "દિવસ": "D", - "અઠવાડિયા": "W", "અઠ.": "W", + "અઠવાડિયા": "W", "મહિના": "M", "વર્ષ": "Y" }, "date_order": "DY", "months": { - "એપ્રિલ,": 4, - "ઑક્ટો,": 10, - "ઑગસ્ટ,": 8, "જાન્યુ,": 1, - "જુલાઈ,": 7, - "જૂન,": 6, - "ડિસે,": 12, - "નવે,": 11, "ફેબ્રુ,": 2, "માર્ચ,": 3, + "એપ્રિલ,": 4, "મે,": 5, - "સપ્ટે,": 9 + "જૂન,": 6, + "જુલાઈ,": 7, + "ઑગસ્ટ,": 8, + "સપ્ટે,": 9, + "ઑક્ટો,": 10, + "નવે,": 11, + "ડિસે,": 12 }, "timeago_nd_tokens": { "આજે": "0D", @@ -1384,16 +1391,16 @@ }, "comma_decimal": false, "number_tokens": { - "અબજ": 9, - "કરોડ": 7, + "હજાર": 3, "લાખ": 5, - "હજાર": 3 + "કરોડ": 7, + "અબજ": 9 }, "number_nd_tokens": {}, "album_types": { - "ep": "Ep", "આલ્બમ": "Album", "ઑડિયોબુક": "Audiobook", + "ep": "Ep", "શો": "Show", "સિંગલ": "Single" } @@ -1402,12 +1409,12 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "सेकंड": "s", "से॰": "s", - "मिनट": "m", + "सेकंड": "s", "मि॰": "m", - "घंटे": "h", + "मिनट": "m", "घं॰": "h", + "घंटे": "h", "दिन": "D", "सप्ताह": "W", "माह": "M", @@ -1415,18 +1422,18 @@ }, "date_order": "DY", "months": { - "अक्तू॰": 10, - "अग॰": 8, - "अप्रैल": 4, "जन॰": 1, - "जुल॰": 7, - "जून": 6, - "दिस॰": 12, - "नव॰": 11, "फ़र॰": 2, - "मई": 5, "मार्च": 3, - "सित॰": 9 + "अप्रैल": 4, + "मई": 5, + "जून": 6, + "जुल॰": 7, + "अग॰": 8, + "सित॰": 9, + "अक्तू॰": 10, + "नव॰": 11, + "दिस॰": 12 }, "timeago_nd_tokens": { "आज": "0D", @@ -1434,18 +1441,18 @@ }, "comma_decimal": false, "number_tokens": { - "अ॰": 9, - "क॰": 7, + "हज़ार": 3, "लाख": 5, - "हज़ार": 3 + "क॰": 7, + "अ॰": 9 }, "number_nd_tokens": { "नहीं": 0 }, "album_types": { - "ईपी": "Ep", "एल्‍बम": "Album", "ऑडियो बुक": "Audiobook", + "ईपी": "Ep", "शो": "Show", "सिंगल": "Single" } @@ -1454,48 +1461,48 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sekundu": "s", + "s": "s", + "sekunda": "s", "sekunde": "s", "sekundi": "s", - "sekunda": "s", - "s": "s", - "minutu": "m", - "minute": "m", - "minuta": "m", + "sekundu": "s", "min": "m", + "minuta": "m", + "minute": "m", + "minutu": "m", + "h": "h", "sat": "h", "sata": "h", "sati": "h", - "h": "h", "dan": "D", "dana": "D", - "tjedan": "W", - "tjedna": "W", - "tjedana": "W", "tj.": "W", + "tjedan": "W", + "tjedana": "W", + "tjedna": "W", + "mj.": "M", "mjesec": "M", "mjeseca": "M", "mjeseci": "M", - "mj.": "M", - "godinu": "Y", - "godine": "Y", + "g.": "Y", "godina": "Y", - "g.": "Y" + "godine": "Y", + "godinu": "Y" }, "date_order": "DY", "months": { - "kol": 8, - "lip": 6, - "lis": 10, - "ožu": 3, - "pro": 12, - "ruj": 9, "sij": 1, - "srp": 7, - "stu": 11, - "svi": 5, + "velj": 2, + "ožu": 3, "tra": 4, - "velj": 2 + "svi": 5, + "lip": 6, + "srp": 7, + "kol": 8, + "ruj": 9, + "lis": 10, + "stu": 11, + "pro": 12 }, "timeago_nd_tokens": { "danas": "0D", @@ -1503,9 +1510,9 @@ }, "comma_decimal": true, "number_tokens": { + "tis": 3, "mil": 6, - "mlr": 9, - "tis": 3 + "mlr": 9 }, "number_nd_tokens": { "nema": 0 @@ -1541,18 +1548,18 @@ }, "date_order": "YD", "months": { - "aug.": 8, - "dec.": 12, - "febr.": 2, "jan.": 1, - "júl.": 7, - "jún.": 6, - "máj.": 5, + "febr.": 2, "márc.": 3, - "nov.": 11, - "okt.": 10, + "ápr.": 4, + "máj.": 5, + "jún.": 6, + "júl.": 7, + "aug.": 8, "szept.": 9, - "ápr.": 4 + "okt.": 10, + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "ma": "0D", @@ -1569,10 +1576,10 @@ }, "album_types": { "album": "Album", - "ep": "Ep", "hangoskönyv": "Audiobook", - "kislemez": "Single", - "műsor": "Show" + "ep": "Ep", + "műsor": "Show", + "kislemez": "Single" } }, "hy": { @@ -1581,31 +1588,31 @@ "timeago_tokens": { "վայրկյան": "s", "վրկ": "s", - "րոպե": "m", "ր": "m", - "ժամ": "h", + "րոպե": "m", "ժ": "h", + "ժամ": "h", "օր": "D", - "շաբաթ": "W", "շաբ": "W", + "շաբաթ": "W", "ամիս": "M", - "տարի": "Y", - "տ": "Y" + "տ": "Y", + "տարի": "Y" }, "date_order": "DY", "months": { - "ապր,": 4, - "դեկ,": 12, - "հլս,": 7, - "հնս,": 6, "հնվ,": 1, - "հոկ,": 10, - "մյս,": 5, - "մրտ,": 3, - "նոյ,": 11, - "սեպ,": 9, "փտվ,": 2, - "օգս,": 8 + "մրտ,": 3, + "ապր,": 4, + "մյս,": 5, + "հնս,": 6, + "հլս,": 7, + "օգս,": 8, + "սեպ,": 9, + "հոկ,": 10, + "նոյ,": 11, + "դեկ,": 12 }, "timeago_nd_tokens": { "այսօր": "0D", @@ -1622,9 +1629,9 @@ "չկան": 0 }, "album_types": { - "ep": "Ep", "ալբոմ": "Album", "աուդիոգիրք": "Audiobook", + "ep": "Ep", "աուդիոդրամա": "Show", "սինգլ": "Single" } @@ -1638,29 +1645,29 @@ "menit": "m", "mnt": "m", "jam": "h", - "hari": "D", "h": "D", - "minggu": "W", + "hari": "D", "mgg": "W", - "bulan": "M", + "minggu": "W", "bln": "M", + "bulan": "M", "tahun": "Y", "thn": "Y" }, "date_order": "DY", "months": { - "agu": 8, - "apr": 4, - "des": 12, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, + "feb": 2, "mar": 3, + "apr": 4, "mei": 5, - "nov": 11, + "jun": 6, + "jul": 7, + "agu": 8, + "sep": 9, "okt": 10, - "sep": 9 + "nov": 11, + "des": 12 }, "timeago_nd_tokens": { "ini": "0D", @@ -1668,18 +1675,18 @@ }, "comma_decimal": true, "number_tokens": { + "rb": 3, "jt": 6, - "m": 9, - "rb": 3 + "m": 9 }, "number_nd_tokens": { "belum": 0 }, "album_types": { - "acara": "Show", "album": "Album", "buku audio": "Audiobook", "ep": "Ep", + "acara": "Show", "single": "Single" } }, @@ -1687,43 +1694,43 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", + "sekúnda": "s", "sekúndu": "s", "sekúndum": "s", - "sekúnda": "s", "sekúndur": "s", - "sek.": "s", + "mín.": "m", + "mínúta": "m", "mínútu": "m", "mínútum": "m", - "mínúta": "m", "mínútur": "m", - "mín.": "m", + "klst.": "h", "klukkustund": "h", "klukkustundum": "h", - "klst.": "h", "degi": "D", "dögum": "D", "viku": "W", "vikum": "W", + "mán.": "M", "mánuði": "M", "mánuðum": "M", - "mán.": "M", "ári": "Y", "árum": "Y" }, "date_order": "DY", "months": { - "apr.": 4, - "des.": 12, - "feb.": 2, "jan.": 1, - "júl.": 7, - "jún.": 6, + "feb.": 2, "mar.": 3, + "apr.": 4, "maí": 5, - "nóv.": 11, - "okt.": 10, + "jún.": 6, + "júl.": 7, + "ágú.": 8, "sep.": 9, - "ágú.": 8 + "okt.": 10, + "nóv.": 11, + "des.": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -1731,62 +1738,62 @@ }, "comma_decimal": true, "number_tokens": { + "þ": 3, "m": 6, - "ma": 9, - "þ": 3 + "ma": 9 }, "number_nd_tokens": { + "ekkert": 0, "einn": 1, - "eitt": 1, - "ekkert": 0 + "eitt": 1 }, "album_types": { - "ep": "Ep", - "hljóðbók": "Audiobook", "plata": "Album", - "smáskífa": "Single", - "þáttur": "Show" + "hljóðbók": "Audiobook", + "ep": "Ep", + "þáttur": "Show", + "smáskífa": "Single" } }, "it": { "equivalent": [], "by_char": false, "timeago_tokens": { - "secondo": "s", - "secondi": "s", "sec.": "s", - "minuto": "m", - "minuti": "m", + "secondi": "s", + "secondo": "s", "min": "m", + "minuti": "m", + "minuto": "m", + "h": "h", "ora": "h", "ore": "h", - "h": "h", - "giorno": "D", - "giorni": "D", "g": "D", "gg": "D", + "giorni": "D", + "giorno": "D", + "sett.": "W", "settimana": "W", "settimane": "W", - "sett.": "W", "mese": "M", "mesi": "M", - "anno": "Y", - "anni": "Y" + "anni": "Y", + "anno": "Y" }, "date_order": "DY", "months": { - "ago": 8, - "apr": 4, - "dic": 12, - "feb": 2, "gen": 1, + "feb": 2, + "mar": 3, + "apr": 4, + "mag": 5, "giu": 6, "lug": 7, - "mag": 5, - "mar": 3, - "nov": 11, + "ago": 8, + "set": 9, "ott": 10, - "set": 9 + "nov": 11, + "dic": 12 }, "timeago_nd_tokens": { "oggi": "0D", @@ -1815,43 +1822,43 @@ "שניה": "s", "שניות": "s", "שנייה": "1s", - "דקה": "1m", "דק׳": "m", "דקות": "m", + "דקה": "1m", + "שע׳": "h", + "שעות": "h", "שעה": "1h", "שעתיים": "2h", - "שעות": "h", - "שע׳": "h", "יום": "D", - "יומיים": "2D", "ימים": "D", "אתמול": "1D", + "שתי": "2", + "יומיים": "2D", + "שב׳": "W", + "שבועות": "W", "שבוע": "1W", "שבועיים": "2W", - "שבועות": "W", - "שב׳": "W", + "חודשים": "M", "חודש": "1M", "חודשיים": "2M", - "חודשים": "M", - "שנתיים": "2Y", - "שנים": "Y", "שנה": "Y", - "שתי": "2" + "שנים": "Y", + "שנתיים": "2Y" }, "date_order": "DY", "months": { - "באוג׳": 8, - "באוק׳": 10, - "באפר׳": 4, - "בדצמ׳": 12, - "ביולי": 7, - "ביוני": 6, "בינו׳": 1, - "במאי": 5, + "בפבר׳": 2, "במרץ": 3, - "בנוב׳": 11, + "באפר׳": 4, + "במאי": 5, + "ביוני": 6, + "ביולי": 7, + "באוג׳": 8, "בספט׳": 9, - "בפבר׳": 2 + "באוק׳": 10, + "בנוב׳": 11, + "בדצמ׳": 12 }, "timeago_nd_tokens": { "היום": "0D", @@ -1859,19 +1866,19 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, - "m": 6 + "m": 6, + "b": 9 }, "number_nd_tokens": { - "אחד": 1, - "אין": 0 + "אין": 0, + "אחד": 1 }, "album_types": { "אלבום": "Album", - "מיני-אלבום": "Ep", - "סינגל": "Single", "ספר אודיו": "Audiobook", - "תסכית": "Show" + "מיני-אלבום": "Ep", + "תסכית": "Show", + "סינגל": "Single" } }, "ja": { @@ -1899,11 +1906,11 @@ }, "number_nd_tokens": {}, "album_types": { - "ep": "Ep", "アルバム": "Album", "オーディオブック": "Audiobook", - "シングル": "Single", - "表示": "Show" + "ep": "Ep", + "表示": "Show", + "シングル": "Single" } }, "ka": { @@ -1913,31 +1920,31 @@ "წამი": "s", "წამის": "s", "წმ": "s", + "წთ": "m", "წუთი": "m", "წუთის": "m", - "წთ": "m", "საათის": "h", "სთ": "h", "დღის": "D", - "თვის": "M", - "კვირის": "W", "კვ.": "W", + "კვირის": "W", + "თვის": "M", "წლის": "Y" }, "date_order": "DY", "months": { - "აგვ.": 8, - "აპრ.": 4, - "დეკ.": 12, - "თებ.": 2, "იან.": 1, - "ივლ.": 7, - "ივნ.": 6, - "მაი.": 5, + "თებ.": 2, "მარ.": 3, - "ნოე.": 11, + "აპრ.": 4, + "მაი.": 5, + "ივნ.": 6, + "ივლ.": 7, + "აგვ.": 8, + "სექ.": 9, "ოქტ.": 10, - "სექ.": 9 + "ნოე.": 11, + "დეკ.": 12 }, "timeago_nd_tokens": { "დღეს": "0D", @@ -1956,41 +1963,41 @@ "ალბომი": "Album", "აუდიოწიგნი": "Audiobook", "მინი-ალბომი": "Ep", - "სინგლი": "Single", - "ჩვენება": "Show" + "ჩვენება": "Show", + "სინგლი": "Single" } }, "kk": { "equivalent": [], "by_char": false, "timeago_tokens": { - "секунд": "s", "сек.": "s", - "минут": "m", + "секунд": "s", "мин.": "m", - "сағат": "h", + "минут": "m", "сағ.": "h", + "сағат": "h", "күн": "D", - "апта": "W", "ап.": "W", + "апта": "W", "ай": "M", - "жыл": "Y", - "ж.": "Y" + "ж.": "Y", + "жыл": "Y" }, "date_order": "YD", "months": { + "қаң.": 1, "ақп.": 2, - "жел.": 12, - "мам.": 5, - "мау.": 6, "нау.": 3, "сәу.": 4, - "там.": 8, + "мам.": 5, + "мау.": 6, "шіл.": 7, + "там.": 8, + "қыр.": 9, "қаз.": 10, "қар.": 11, - "қаң.": 1, - "қыр.": 9 + "жел.": 12 }, "timeago_nd_tokens": { "бүгін": "0D", @@ -1999,49 +2006,49 @@ "comma_decimal": true, "number_tokens": { "м": 3, + "мың": 3, "млн": 6, - "млрд": 9, - "мың": 3 + "млрд": 9 }, "number_nd_tokens": { "ешкім": 0 }, "album_types": { - "ep": "Ep", "альбом": "Album", "аудиокітап": "Audiobook", - "сингл": "Single", - "шоу": "Show" + "ep": "Ep", + "шоу": "Show", + "сингл": "Single" } }, "km": { "equivalent": [], "by_char": false, "timeago_tokens": { - "ខែមុន": "M", - "ឆ្នាំមុន": "Y", - "ថ្ងៃមុន": "D", + "វិនាទី": "s", + "វិនាទីមុន": "s", "នាទី": "m", "នាទីមុន": "m", "ម៉ោងមុន": "h", - "វិនាទី": "s", - "វិនាទីមុន": "s", - "សប្ដាហ៍មុន": "W" + "ថ្ងៃមុន": "D", + "សប្ដាហ៍មុន": "W", + "ខែមុន": "M", + "ឆ្នាំមុន": "Y" }, "date_order": "DY", "months": { - "កក្កដា": 7, - "កញ្ញា": 9, - "កុម្ភៈ": 2, - "តុលា": 10, - "ធ្នូ": 12, "មករា": 1, - "មិថុនា": 6, + "កុម្ភៈ": 2, "មីនា": 3, "មេសា": 4, - "វិច្ឆិកា": 11, + "ឧសភា": 5, + "មិថុនា": 6, + "កក្កដា": 7, "សីហា": 8, - "ឧសភា": 5 + "កញ្ញា": 9, + "តុលា": 10, + "វិច្ឆិកា": 11, + "ធ្នូ": 12 }, "timeago_nd_tokens": { "បានធ្វើបច្ចុប្បន្នភាពនៅថ្ងៃនេះ": "0D", @@ -2049,56 +2056,56 @@ }, "comma_decimal": true, "number_tokens": { - "ប៊ីលាន": 9, "ពាន់": 3, - "លាន": 6 + "លាន": 6, + "ប៊ីលាន": 9 }, "number_nd_tokens": {}, "album_types": { + "អាល់ប៊ុម": "Album", + "សៀវភៅ​ជា​សំឡេង": "Audiobook", "ep": "Ep", "កម្មវិធីទូរទស្សន៍": "Show", - "ចម្រៀងទោល": "Single", - "សៀវភៅ​ជា​សំឡេង": "Audiobook", - "អាល់ប៊ុម": "Album" + "ចម្រៀងទោល": "Single" } }, "kn": { "equivalent": [], "by_char": false, "timeago_tokens": { - "ಸೆಕೆಂಡ್": "s", "ಸೆಕೆಂಡುಗಳ": "s", "ಸೆಕೆಂಡುಗಳು": "s", - "ನಿಮಿಷದ": "m", + "ಸೆಕೆಂಡ್": "s", "ನಿಮಿಷಗಳ": "m", "ನಿಮಿಷಗಳು": "m", + "ನಿಮಿಷದ": "m", "ನಿಮಿಷವು": "m", "ಗಂಟೆ": "h", "ಗಂಟೆಗಳ": "h", - "ದಿನದ": "D", "ದಿನಗಳ": "D", - "ವಾರದ": "W", + "ದಿನದ": "D", "ವಾರಗಳ": "W", + "ವಾರದ": "W", "ತಿಂಗಳ": "M", - "ತಿಂಗಳುಗಳ": "M", "ತಿಂಗಳು": "M", - "ವರ್ಷದ": "Y", - "ವರ್ಷಗಳ": "Y" + "ತಿಂಗಳುಗಳ": "M", + "ವರ್ಷಗಳ": "Y", + "ವರ್ಷದ": "Y" }, "date_order": "DY", "months": { - "ಅಕ್ಟೋ": 10, - "ಆಗಸ್ಟ್": 8, - "ಏಪ್ರಿ": 4, "ಜನವರಿ": 1, - "ಜುಲೈ": 7, - "ಜೂನ್": 6, - "ಡಿಸೆಂ": 12, - "ನವೆಂ": 11, "ಫೆಬ್ರವರಿ": 2, "ಮಾರ್ಚ್": 3, + "ಏಪ್ರಿ": 4, "ಮೇ": 5, - "ಸೆಪ್ಟೆಂ": 9 + "ಜೂನ್": 6, + "ಜುಲೈ": 7, + "ಆಗಸ್ಟ್": 8, + "ಸೆಪ್ಟೆಂ": 9, + "ಅಕ್ಟೋ": 10, + "ನವೆಂ": 11, + "ಡಿಸೆಂ": 12 }, "timeago_nd_tokens": { "ಇಂದು": "0D", @@ -2106,18 +2113,18 @@ }, "comma_decimal": false, "number_tokens": { - "ಕೋಟಿ": 7, - "ಲಕ್ಷ": 5 + "ಲಕ್ಷ": 5, + "ಕೋಟಿ": 7 }, "number_nd_tokens": { "ವೀಕ್ಷಣೆಗಳಿಲ್ಲ": 0 }, "album_types": { - "ep": "Ep", - "ಆಡಿಯೋಬುಕ್": "Audiobook", "ಆಲ್ಬಮ್": "Album", - "ಒಂದೇ": "Single", - "ಶೋ": "Show" + "ಆಡಿಯೋಬುಕ್": "Audiobook", + "ep": "Ep", + "ಶೋ": "Show", + "ಒಂದೇ": "Single" } }, "ko": { @@ -2140,51 +2147,51 @@ }, "comma_decimal": false, "number_tokens": { + "천": 3, "만": 4, - "억": 8, - "천": 3 + "억": 8 }, "number_nd_tokens": { "없": 0 }, "album_types": { - "ep": "Ep", - "싱글": "Single", "앨범": "Album", "오디오북": "Audiobook", - "표시": "Show" + "ep": "Ep", + "표시": "Show", + "싱글": "Single" } }, "ky": { "equivalent": [], "by_char": false, "timeago_tokens": { - "секунд": "s", "сек.": "s", - "мүнөт": "m", + "секунд": "s", "мүн.": "m", + "мүнөт": "m", "саат": "h", "саат.": "h", "күн": "D", - "апта": "W", "апт.": "W", + "апта": "W", "ай": "M", "жыл": "Y" }, "date_order": "YD", "months": { - "авг.": 8, - "апр.": 4, - "дек.": 12, - "июл.": 7, - "июн.": 6, - "май": 5, - "мар.": 3, - "ноя.": 11, - "окт.": 10, - "сен.": 9, + "янв.": 1, "фев.": 2, - "янв.": 1 + "мар.": 3, + "апр.": 4, + "май": 5, + "июн.": 6, + "июл.": 7, + "авг.": 8, + "сен.": 9, + "окт.": 10, + "ноя.": 11, + "дек.": 12 }, "timeago_nd_tokens": { "бүгүн": "0D", @@ -2193,8 +2200,8 @@ "comma_decimal": true, "number_tokens": { "миң": 3, - "млд": 9, - "млн": 6 + "млн": 6, + "млд": 9 }, "number_nd_tokens": { "эч": 0 @@ -2202,44 +2209,44 @@ "album_types": { "альбом": "Album", "аудиокитеп": "Audiobook", - "сингл": "Single", "чакан альбом": "Ep", - "шоу": "Show" + "шоу": "Show", + "сингл": "Single" } }, "lo": { "equivalent": [], "by_char": false, "timeago_tokens": { - "ວິນາທີກ່ອນ": "s", - "ວິນາທີ": "s", "ວິ.": "s", - "ນາທີກ່ອນ": "m", - "ນາທີ": "m", + "ວິນາທີ": "s", + "ວິນາທີກ່ອນ": "s", "ນທ.": "m", - "ຊົ່ວໂມງກ່ອນ": "h", + "ນາທີ": "m", + "ນາທີກ່ອນ": "m", "ຊມ.": "h", + "ຊົ່ວໂມງກ່ອນ": "h", "ມື້ກ່ອນ": "D", - "ອາທິດກ່ອນ": "W", "ອທ.": "W", - "ເດືອນກ່ອນ": "M", + "ອາທິດກ່ອນ": "W", "ດ.": "M", + "ເດືອນກ່ອນ": "M", "ປີກ່ອນ": "Y" }, "date_order": "DY", "months": { - "ກ.ຍ.": 9, - "ກ.ພ.": 2, - "ກ.ລ.": 7, - "ຕ.ລ.": 10, - "ທ.ວ.": 12, - "ພ.ຈ.": 11, - "ພ.ພ.": 5, "ມ.ກ.": 1, + "ກ.ພ.": 2, "ມ.ນ.": 3, "ມ.ສ.": 4, + "ພ.ພ.": 5, "ມິ.ຖ.": 6, - "ສ.ຫ.": 8 + "ກ.ລ.": 7, + "ສ.ຫ.": 8, + "ກ.ຍ.": 9, + "ຕ.ລ.": 10, + "ພ.ຈ.": 11, + "ທ.ວ.": 12 }, "timeago_nd_tokens": { "ອັບເດດມື້ນີ້": "0D", @@ -2248,60 +2255,60 @@ "comma_decimal": true, "number_tokens": { "ກີບ": 3, - "ຕື້": 9, "ພັນ": 3, - "ລ້ານ": 6 + "ລ້ານ": 6, + "ຕື້": 9 }, "number_nd_tokens": { "ຍັງບໍ່ມີຄົນເບິ່ງເທື່ອ": 0 }, "album_types": { - "ep": "Ep", - "ຊິງເກິນ": "Single", + "ອະລະບໍ້າ": "Album", "ປຶ້ມສຽງ": "Audiobook", + "ep": "Ep", "ສະແດງ": "Show", - "ອະລະບໍ້າ": "Album" + "ຊິງເກິນ": "Single" } }, "lt": { "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", + "sekundė": "s", "sekundę": "s", "sekundes": "s", "sekundės": "s", - "sekundė": "s", "sekundžių": "s", - "sek.": "s", + "min.": "m", + "minučių": "m", + "minutė": "m", "minutę": "m", "minutes": "m", "minutės": "m", - "minutė": "m", - "minučių": "m", - "min.": "m", + "val.": "h", "valandą": "h", "valandas": "h", "valandos": "h", "valandų": "h", - "val.": "h", + "d.": "D", "dieną": "D", "dienas": "D", "dienos": "D", "dienų": "D", - "d.": "D", + "sav.": "W", + "savaičių": "W", "savaitę": "W", "savaites": "W", "savaitės": "W", - "savaičių": "W", - "sav.": "W", + "mėn.": "M", "mėnesį": "M", - "mėnesius": "M", "mėnesio": "M", "mėnesių": "M", - "mėn.": "M", - "metus": "Y", + "mėnesius": "M", + "m.": "Y", "metų": "Y", - "m.": "Y" + "metus": "Y" }, "date_order": "YMD", "months": {}, @@ -2311,9 +2318,9 @@ }, "comma_decimal": true, "number_tokens": { + "tūkst": 3, "mln": 6, - "mlrd": 9, - "tūkst": 3 + "mlrd": 9 }, "number_nd_tokens": { "nėra": 0 @@ -2330,46 +2337,46 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", + "sekunde": "s", "sekundēm": "s", "sekundes": "s", - "sekunde": "s", "sekunžu": "s", - "sek.": "s", + "min.": "m", + "minūšu": "m", + "minūte": "m", "minūtēm": "m", "minūtes": "m", - "minūte": "m", - "minūšu": "m", - "min.": "m", + "st.": "h", "stundām": "h", "stundas": "h", - "st.": "h", + "d.": "D", "dienām": "D", "dienas": "D", - "d.": "D", + "ned.": "W", "nedēļām": "W", "nedēļas": "W", - "ned.": "W", - "mēnešiem": "M", - "mēneša": "M", "mēn.": "M", - "gadiem": "Y", + "mēneša": "M", + "mēnešiem": "M", + "g.": "Y", "gada": "Y", - "g.": "Y" + "gadiem": "Y" }, "date_order": "YD", "months": { - "apr.": 4, - "aug.": 8, - "dec.": 12, - "febr.": 2, "janv.": 1, - "jūl.": 7, - "jūn.": 6, - "maijs": 5, + "febr.": 2, "marts": 3, - "nov.": 11, + "apr.": 4, + "maijs": 5, + "jūn.": 6, + "jūl.": 7, + "aug.": 8, + "sept.": 9, "okt.": 10, - "sept.": 9 + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "šodien": "0D", @@ -2377,9 +2384,9 @@ }, "comma_decimal": true, "number_tokens": { + "tūkst": 3, "milj": 6, - "mljrd": 9, - "tūkst": 3 + "mljrd": 9 }, "number_nd_tokens": { "nav": 0 @@ -2396,12 +2403,12 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "сек.": "s", "секунда": "s", "секунди": "s", - "сек.": "s", + "мин.": "m", "минута": "m", "минути": "m", - "мин.": "m", "час": "h", "часа": "h", "ден": "D", @@ -2410,9 +2417,9 @@ "седмици": "W", "месец": "M", "месеци": "M", + "год.": "Y", "година": "Y", - "години": "Y", - "год.": "Y" + "години": "Y" }, "date_order": "DMY", "months": {}, @@ -2431,9 +2438,9 @@ "нема": 0 }, "album_types": { - "ep": "Ep", "албум": "Album", "аудиокнига": "Audiobook", + "ep": "Ep", "серија": "Show", "сингл": "Single" } @@ -2452,18 +2459,18 @@ }, "date_order": "YD", "months": { - "ഏപ്രി": 4, - "ഒക്ടോ": 10, - "ഓഗ": 8, "ജനു": 1, - "ജൂലൈ": 7, - "ജൂൺ": 6, - "ഡിസം": 12, - "നവം": 11, "ഫെബ്രു": 2, "മാർ": 3, + "ഏപ്രി": 4, "മേയ്": 5, - "സെപ്റ്റം": 9 + "ജൂൺ": 6, + "ജൂലൈ": 7, + "ഓഗ": 8, + "സെപ്റ്റം": 9, + "ഒക്ടോ": 10, + "നവം": 11, + "ഡിസം": 12 }, "timeago_nd_tokens": { "ഇന്ന്": "0D", @@ -2471,16 +2478,16 @@ }, "comma_decimal": false, "number_tokens": { - "കോടി": 7, - "ലക്ഷം": 5 + "ലക്ഷം": 5, + "കോടി": 7 }, "number_nd_tokens": { "ഇല്ല": 0 }, "album_types": { - "ep": "Ep", "ആല്‍‌ബം": "Album", "ഓഡിയോ ബുക്ക്": "Audiobook", + "ep": "Ep", "ഷോ": "Show", "സിംഗിൾ": "Single" } @@ -2489,14 +2496,14 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "секундын": "s", - "секунд": "s", "сек": "s", - "минутын": "m", - "минут": "m", + "секунд": "s", + "секундын": "s", "мин": "m", - "цагийн": "h", + "минут": "m", + "минутын": "m", "ц": "h", + "цагийн": "h", "өдрийн": "D", "хоногийн": "D", "долоо": "W", @@ -2519,26 +2526,26 @@ "үзэлтгүй": 0 }, "album_types": { - "ep": "Ep", + "цомог": "Album", "аудио ном": "Audiobook", + "ep": "Ep", "жүжиг": "Show", - "сингл": "Single", - "цомог": "Album" + "сингл": "Single" } }, "mr": { "equivalent": [], "by_char": false, "timeago_tokens": { + "से.": "s", + "सेकंद": "s", "सेकंदापूर्वी": "s", "सेकंदांपूर्वी": "s", - "सेकंद": "s", - "से.": "s", + "मिनि.": "m", + "मिनिट": "m", "मिनिटापूर्वी": "m", "मिनिटांपूर्वी": "m", - "मिनिट": "m", "मिनिटे": "m", - "मिनि.": "m", "तासापूर्वी": "h", "तासांपूर्वी": "h", "दिवसापूर्वी": "D", @@ -2552,18 +2559,18 @@ }, "date_order": "DY", "months": { - "एप्रि,": 4, - "ऑक्टो,": 10, - "ऑग,": 8, "जाने,": 1, - "जुलै,": 7, - "जून,": 6, - "डिसें,": 12, - "नोव्हें,": 11, "फेब्रु,": 2, "मार्च,": 3, + "एप्रि,": 4, "मे,": 5, - "सप्टें,": 9 + "जून,": 6, + "जुलै,": 7, + "ऑग,": 8, + "सप्टें,": 9, + "ऑक्टो,": 10, + "नोव्हें,": 11, + "डिसें,": 12 }, "timeago_nd_tokens": { "today": "0D", @@ -2572,10 +2579,10 @@ }, "comma_decimal": false, "number_tokens": { - "अब्ज": 9, - "कोटी": 7, + "ह": 3, "लाख": 5, - "ह": 3 + "कोटी": 7, + "अब्ज": 9 }, "number_nd_tokens": { "नाहीत": 0 @@ -2593,31 +2600,31 @@ "by_char": false, "timeago_tokens": { "saat": "s", - "minit": "m", "min": "m", + "minit": "m", "jam": "h", "hari": "D", - "minggu": "W", "mgu": "W", - "bulan": "M", + "minggu": "W", "bln": "M", + "bulan": "M", "tahun": "Y", "thn": "Y" }, "date_order": "DY", "months": { - "apr": 4, - "dis": 12, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, + "feb": 2, "mac": 3, + "apr": 4, "mei": 5, - "nov": 11, + "jun": 6, + "jul": 7, "ogo": 8, + "sep": 9, "okt": 10, - "sep": 9 + "nov": 11, + "dis": 12 }, "timeago_nd_tokens": { "ini": "0D", @@ -2625,8 +2632,8 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, - "j": 6 + "j": 6, + "b": 9 }, "number_nd_tokens": { "tiada": 0 @@ -2644,29 +2651,29 @@ "by_char": false, "timeago_tokens": { "စက္ကန့်": "s", - "နာရီ": "h", - "နှစ်": "Y", - "ပတ်": "W", "မိနစ်": "m", "မိနစ်နှင့်": "m", + "နာရီ": "h", "ရက်": "D", "ရက်က": "D", - "လ": "M" + "ပတ်": "W", + "လ": "M", + "နှစ်": "Y" }, "date_order": "YD", "months": { - "စက်": 9, "ဇန်": 1, - "ဇူ": 7, - "ဇွန်": 6, - "ဒီ": 12, - "နို": 11, "ဖေ": 2, "မတ်": 3, - "မေ": 5, - "အောက်": 10, "ဧ": 4, - "ဩ": 8 + "မေ": 5, + "ဇွန်": 6, + "ဇူ": 7, + "ဩ": 8, + "စက်": 9, + "အောက်": 10, + "နို": 11, + "ဒီ": 12 }, "timeago_nd_tokens": { "ယနေ့": "0D", @@ -2674,52 +2681,52 @@ }, "comma_decimal": false, "number_tokens": { - "ကုဋေ": 7, "ထ": 3, "ထောင်": 3, - "သန်း": 6, + "သောင်း": 4, "သိန်း": 5, - "သောင်း": 4 + "သန်း": 6, + "ကုဋေ": 7 }, "number_nd_tokens": { "မရှိ": 0, "၁": 1 }, "album_types": { - "ep": "Ep", - "တစ်ကိုယ်တော်": "Single", - "ရှိုး": "Show", "အယ်လ်ဘမ်": "Album", - "အော်ဒီယိုစာအုပ်": "Audiobook" + "အော်ဒီယိုစာအုပ်": "Audiobook", + "ep": "Ep", + "ရှိုး": "Show", + "တစ်ကိုယ်တော်": "Single" } }, "ne": { "equivalent": [], "by_char": false, "timeago_tokens": { + "सेकेन्ड": "s", + "मिनेट": "m", "घण्टा": "h", "दिन": "D", "दिनअघि": "D", + "हप्ता": "W", "महिना": "M", - "मिनेट": "m", - "वर्ष": "Y", - "सेकेन्ड": "s", - "हप्ता": "W" + "वर्ष": "Y" }, "date_order": "YD", "months": { - "अक्टोबर": 10, - "अगस्ट": 8, - "अप्रिल": 4, "जनवरी": 1, - "जुन": 6, - "जुलाई": 7, - "डिसेम्बर": 12, - "नोभेम्बर": 11, "फेब्रुअरी": 2, "मार्च": 3, + "अप्रिल": 4, "मे": 5, - "सेप्टेम्बर": 9 + "जुन": 6, + "जुलाई": 7, + "अगस्ट": 8, + "सेप्टेम्बर": 9, + "अक्टोबर": 10, + "नोभेम्बर": 11, + "डिसेम्बर": 12 }, "timeago_nd_tokens": { "आज": "0D", @@ -2727,32 +2734,32 @@ }, "comma_decimal": false, "number_tokens": { - "अरब": 9, - "करोड": 7, + "हजार": 3, "लाख": 5, - "हजार": 3 + "करोड": 7, + "अरब": 9 }, "number_nd_tokens": { "छैन": 0 }, "album_types": { - "ep": "Ep", - "अडियोबुक": "Audiobook", - "एकल एल्बम": "Single", "एल्बम": "Album", - "टिभी सो": "Show" + "अडियोबुक": "Audiobook", + "ep": "Ep", + "टिभी सो": "Show", + "एकल एल्बम": "Single" } }, "nl": { "equivalent": [], "by_char": false, "timeago_tokens": { + "sec.": "s", "seconde": "s", "seconden": "s", - "sec.": "s", - "minuut": "m", - "minuten": "m", "min.": "m", + "minuten": "m", + "minuut": "m", "uur": "h", "dag": "D", "dagen": "D", @@ -2765,18 +2772,18 @@ }, "date_order": "DY", "months": { - "apr": 4, - "aug": 8, - "dec": 12, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, - "mei": 5, + "feb": 2, "mrt": 3, - "nov": 11, + "apr": 4, + "mei": 5, + "jun": 6, + "jul": 7, + "aug": 8, + "sep": 9, "okt": 10, - "sep": 9 + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "vandaag": "0D", @@ -2784,17 +2791,17 @@ }, "comma_decimal": true, "number_tokens": { - "mld": 9, - "mln": 6 + "mln": 6, + "mld": 9 }, "number_nd_tokens": { "geen": 0 }, "album_types": { - "aflevering": "Show", "album": "Album", "audioboek": "Audiobook", "ep": "Ep", + "aflevering": "Show", "single": "Single" } }, @@ -2802,22 +2809,22 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sek": "s", "sekund": "s", "sekunder": "s", - "sek": "s", + "min": "m", "minutt": "m", "minutter": "m", - "min": "m", + "t": "h", "time": "h", "timer": "h", - "t": "h", + "d.": "D", "dag": "D", "dager": "D", "døgn": "D", - "d.": "D", + "u.": "W", "uke": "W", "uker": "W", - "u.": "W", "måned": "M", "måneder": "M", "md.": "M", @@ -2825,20 +2832,20 @@ }, "date_order": "DY", "months": { - "apr.": 4, - "aug.": 8, - "des.": 12, - "feb.": 2, "jan.": 1, - "jul.": 7, - "juli": 7, + "feb.": 2, + "mar.": 3, + "apr.": 4, + "mai": 5, "jun.": 6, "juni": 6, - "mai": 5, - "mar.": 3, - "nov.": 11, + "jul.": 7, + "juli": 7, + "aug.": 8, + "sep.": 9, "okt.": 10, - "sep.": 9 + "nov.": 11, + "des.": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -2855,9 +2862,9 @@ }, "album_types": { "album": "Album", + "lydbok": "Audiobook", "ep": "Ep", "hørespill": "Show", - "lydbok": "Audiobook", "singel": "Single" } }, @@ -2865,35 +2872,35 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ସେକେଣ୍ଡ": "s", "ସେ.": "s", + "ସେକେଣ୍ଡ": "s", + "ମି.": "m", "ମିନିଟ୍": "m", "ମିନିଟ୍‌": "m", - "ମି.": "m", - "ଘଣ୍ଟା": "h", "ଘ.": "h", + "ଘଣ୍ଟା": "h", "ଦିନ": "D", - "ସପ୍ତାହ": "W", "ସପ୍ତା.": "W", - "ମାସ": "M", + "ସପ୍ତାହ": "W", "ମା.": "M", - "ବର୍ଷ": "Y", - "ବ.": "Y" + "ମାସ": "M", + "ବ.": "Y", + "ବର୍ଷ": "Y" }, "date_order": "DY", "months": { - "ଅକ୍ଟୋବର": 10, - "ଅଗଷ୍ଟ": 8, - "ଅପ୍ରେଲ": 4, "ଜାନୁଆରୀ": 1, + "ଫେବୃଆରୀ": 2, + "ମାର୍ଚ୍ଚ": 3, + "ଅପ୍ରେଲ": 4, + "ମଇ": 5, "ଜୁନ": 6, "ଜୁଲାଇ": 7, - "ଡିସେମ୍ବର": 12, + "ଅଗଷ୍ଟ": 8, + "ସେପ୍ଟେମ୍ବର": 9, + "ଅକ୍ଟୋବର": 10, "ନଭେମ୍ବର": 11, - "ଫେବୃଆରୀ": 2, - "ମଇ": 5, - "ମାର୍ଚ୍ଚ": 3, - "ସେପ୍ଟେମ୍ବର": 9 + "ଡିସେମ୍ବର": 12 }, "timeago_nd_tokens": { "ଆଜି": "0D", @@ -2901,23 +2908,23 @@ }, "comma_decimal": false, "number_tokens": { + "ହ": 3, + "ହଜଣ": 3, + "ହଟି": 3, "ନି": 6, "ନିଜଣ": 6, "ନିଟି": 6, "ବି": 9, "ବିଜଣ": 9, - "ବିଟି": 9, - "ହ": 3, - "ହଜଣ": 3, - "ହଟି": 3 + "ବିଟି": 9 }, "number_nd_tokens": { "ନାହିଁ": 0 }, "album_types": { - "ep": "Ep", - "ଅଡିଓବୁକ୍": "Audiobook", "ଆଲବମ୍": "Album", + "ଅଡିଓବୁକ୍": "Audiobook", + "ep": "Ep", "ଶୋ": "Show", "ସିଙ୍ଗଲ୍": "Single" } @@ -2939,18 +2946,18 @@ }, "date_order": "DY", "months": { - "ਅਕਤੂ": 10, - "ਅਗ": 8, - "ਅਪ੍ਰੈ": 4, "ਜਨ": 1, - "ਜੁਲਾ": 7, - "ਜੂਨ": 6, - "ਦਸੰ": 12, - "ਨਵੰ": 11, "ਫ਼ਰ": 2, - "ਮਈ": 5, "ਮਾਰਚ": 3, - "ਸਤੰ": 9 + "ਅਪ੍ਰੈ": 4, + "ਮਈ": 5, + "ਜੂਨ": 6, + "ਜੁਲਾ": 7, + "ਅਗ": 8, + "ਸਤੰ": 9, + "ਅਕਤੂ": 10, + "ਨਵੰ": 11, + "ਦਸੰ": 12 }, "timeago_nd_tokens": { "ਅੱਜ": "0D", @@ -2958,18 +2965,18 @@ }, "comma_decimal": false, "number_tokens": { - "ਅਰਬ": 9, - "ਕਰੋੜ": 7, + "ਹਜ਼ਾਰ": 3, "ਲੱਖ": 5, - "ਹਜ਼ਾਰ": 3 + "ਕਰੋੜ": 7, + "ਅਰਬ": 9 }, "number_nd_tokens": { "ਨਹੀਂ": 0 }, "album_types": { - "ep": "Ep", - "ਆਡੀਓ-ਕਿਤਾਬ": "Audiobook", "ਐਲਬਮ": "Album", + "ਆਡੀਓ-ਕਿਤਾਬ": "Audiobook", + "ep": "Ep", "ਸ਼ੋਅ": "Show", "ਸਿੰਗਲ": "Single" } @@ -2978,53 +2985,53 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", + "sekund": "s", + "sekunda": "s", "sekundę": "s", "sekundy": "s", - "sekunda": "s", - "sekund": "s", - "sek.": "s", - "minutę": "m", - "minuty": "m", + "min": "m", "minut": "m", "minuta": "m", - "min": "m", + "minutę": "m", + "minuty": "m", + "godz.": "h", + "godzin": "h", "godzinę": "h", "godziny": "h", - "godzin": "h", - "godz.": "h", - "dzień": "D", "dni": "D", "dnia": "D", + "dzień": "D", + "tydz.": "W", "tydzień": "W", - "tygodnie": "W", + "tyg.": "W", "tygodni": "W", "tygodnia": "W", - "tydz.": "W", - "tyg.": "W", + "tygodnie": "W", + "mies.": "M", "miesiąc": "M", + "miesiąca": "M", "miesiące": "M", "miesięcy": "M", - "miesiąca": "M", - "mies.": "M", - "rok": "Y", - "lata": "Y", "lat": "Y", + "lata": "Y", + "rok": "Y", "roku": "Y" }, "date_order": "DY", "months": { - "cze": 6, - "gru": 12, - "kwi": 4, - "lip": 7, - "lis": 11, - "lut": 2, - "maj": 5, - "mar": 3, - "paź": 10, - "sie": 8, "sty": 1, - "wrz": 9 + "lut": 2, + "mar": 3, + "kwi": 4, + "maj": 5, + "cze": 6, + "lip": 7, + "sie": 8, + "wrz": 9, + "paź": 10, + "lis": 11, + "gru": 12 }, "timeago_nd_tokens": { "dzisiaj": "0D", @@ -3032,9 +3039,9 @@ }, "comma_decimal": true, "number_tokens": { - "mld": 9, + "tys": 3, "mln": 6, - "tys": 3 + "mld": 9 }, "number_nd_tokens": { "brak": 0 @@ -3043,28 +3050,28 @@ "album": "Album", "audiobook": "Audiobook", "ep": "Ep", - "singiel": "Single", - "słuchowisko": "Show" + "słuchowisko": "Show", + "singiel": "Single" } }, "pt": { "equivalent": [], "by_char": false, "timeago_tokens": { + "seg.": "s", "segundo": "s", "segundos": "s", - "seg.": "s", + "min.": "m", "minuto": "m", "minutos": "m", - "min.": "m", + "h": "h", "hora": "h", "horas": "h", - "h": "h", "dia": "D", "dias": "D", + "sem.": "W", "semana": "W", "semanas": "W", - "sem.": "W", "mês": "M", "meses": "M", "ano": "Y", @@ -3072,18 +3079,18 @@ }, "date_order": "DY", "months": { - "abr.": 4, - "ago.": 8, - "dez.": 12, - "fev.": 2, "jan.": 1, - "jul.": 7, - "jun.": 6, - "mai.": 5, + "fev.": 2, "mar.": 3, - "nov.": 11, + "abr.": 4, + "mai.": 5, + "jun.": 6, + "jul.": 7, + "ago.": 8, + "set.": 9, "out.": 10, - "set.": 9 + "nov.": 11, + "dez.": 12 }, "timeago_nd_tokens": { "hoje": "0D", @@ -3091,39 +3098,39 @@ }, "comma_decimal": true, "number_tokens": { - "bi": 9, + "mil": 3, "mi": 6, - "mil": 3 + "bi": 9 }, "number_nd_tokens": { "um": 1 }, "album_types": { + "álbum": "Album", "audiolivro": "Audiobook", "ep": "Ep", "programa": "Show", - "single": "Single", - "álbum": "Album" + "single": "Single" } }, "pt-PT": { "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "segundo": "s", "segundos": "s", - "s": "s", + "min": "m", "minuto": "m", "minutos": "m", - "min": "m", + "h": "h", "hora": "h", "horas": "h", - "h": "h", "dia": "D", "dias": "D", + "sem.": "W", "semana": "W", "semanas": "W", - "sem.": "W", "mês": "M", "meses": "M", "ano": "Y", @@ -3137,37 +3144,37 @@ }, "comma_decimal": true, "number_tokens": { - "m": 6, "mil": 3, + "m": 6, "mm": 9 }, "number_nd_tokens": {}, "album_types": { - "ep": "Ep", + "álbum": "Album", "livro áudio": "Audiobook", + "ep": "Ep", "programa": "Show", - "single": "Single", - "álbum": "Album" + "single": "Single" } }, "ro": { "equivalent": [], "by_char": false, "timeago_tokens": { + "sec.": "s", "secundă": "s", "secunde": "s", - "sec.": "s", + "min.": "m", "minut": "m", "minute": "m", - "min.": "m", + "h": "h", "oră": "h", "ore": "h", - "h": "h", "zi": "D", "zile": "D", + "săpt.": "W", "săptămână": "W", "săptămâni": "W", - "săpt.": "W", "lună": "M", "luni": "M", "an": "Y", @@ -3175,18 +3182,18 @@ }, "date_order": "DY", "months": { - "apr.": 4, - "aug.": 8, - "dec.": 12, - "feb.": 2, "ian.": 1, - "iul.": 7, - "iun.": 6, - "mai": 5, + "feb.": 2, "mar.": 3, - "nov.": 11, + "apr.": 4, + "mai": 5, + "iun.": 6, + "iul.": 7, + "aug.": 8, + "sept.": 9, "oct.": 10, - "sept.": 9 + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "astăzi": "0D", @@ -3204,8 +3211,8 @@ "album_types": { "album": "Album", "carte audio": "Audiobook", - "emisiune": "Show", "ep": "Ep", + "emisiune": "Show", "single": "Single" } }, @@ -3213,52 +3220,52 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "секунду": "s", - "секунды": "s", + "сек.": "s", "секунд": "s", "секунда": "s", - "сек.": "s", - "минуту": "m", - "минуты": "m", + "секунду": "s", + "секунды": "s", + "мин.": "m", "минут": "m", "минута": "m", - "мин.": "m", + "минуту": "m", + "минуты": "m", + "ч": "h", "час": "h", "часа": "h", "часов": "h", - "ч": "h", "день": "D", - "дня": "D", - "дней": "D", "дн.": "D", - "неделю": "W", + "дней": "D", + "дня": "D", + "нед.": "W", "недели": "W", "недель": "W", - "нед.": "W", + "неделю": "W", + "мес.": "M", "месяц": "M", "месяца": "M", "месяцев": "M", - "мес.": "M", + "г.": "Y", "год": "Y", "года": "Y", - "лет": "Y", - "г.": "Y", - "л.": "Y" + "л.": "Y", + "лет": "Y" }, "date_order": "DY", "months": { - "авг.": 8, - "апр.": 4, - "дек.": 12, - "июл.": 7, - "июн.": 6, - "мар.": 3, - "мая": 5, - "нояб.": 11, - "окт.": 10, - "сент.": 9, + "янв.": 1, "февр.": 2, - "янв.": 1 + "мар.": 3, + "апр.": 4, + "мая": 5, + "июн.": 6, + "июл.": 7, + "авг.": 8, + "сент.": 9, + "окт.": 10, + "нояб.": 11, + "дек.": 12 }, "timeago_nd_tokens": { "сегодня": "0D", @@ -3266,15 +3273,15 @@ }, "comma_decimal": true, "number_tokens": { + "тыс": 3, "млн": 6, - "млрд": 9, - "тыс": 3 + "млрд": 9 }, "number_nd_tokens": {}, "album_types": { - "ep": "Ep", "альбом": "Album", "аудиокнига": "Audiobook", + "ep": "Ep", "аудиошоу": "Show", "сингл": "Single" } @@ -3293,18 +3300,18 @@ }, "date_order": "YD", "months": { - "අගෝ": 8, - "අප්‍රේල්": 4, - "ඔක්": 10, "ජන": 1, - "ජූනි": 6, - "ජූලි": 7, - "දෙසැ": 12, - "නොවැ": 11, "පෙබ": 2, "මාර්තු": 3, + "අප්‍රේල්": 4, "මැයි": 5, - "සැප්": 9 + "ජූනි": 6, + "ජූලි": 7, + "අගෝ": 8, + "සැප්": 9, + "ඔක්": 10, + "නොවැ": 11, + "දෙසැ": 12 }, "timeago_nd_tokens": { "අද": "0D", @@ -3313,55 +3320,55 @@ "comma_decimal": false, "number_tokens": { "ද": 3, - "බි": 9, - "මි": 6 + "මි": 6, + "බි": 9 }, "number_nd_tokens": { "නැත": 0 }, "album_types": { "ඇල්බමය": "Album", - "තනි": "Single", - "දීවා": "Ep", "ශ්‍රව්‍යපොත": "Audiobook", - "සංදර්ශනය": "Show" + "දීවා": "Ep", + "සංදර්ශනය": "Show", + "තනි": "Single" } }, "sk": { "equivalent": [], "by_char": false, "timeago_tokens": { - "sekundou": "s", - "sekundami": "s", - "sekundy": "s", - "sekunda": "s", - "sekúnd": "s", "s": "s", - "minútou": "m", - "minútami": "m", - "minúty": "m", + "sekúnd": "s", + "sekunda": "s", + "sekundami": "s", + "sekundou": "s", + "sekundy": "s", + "min": "m", "minút": "m", "minúta": "m", - "min": "m", - "hodinou": "h", - "hodinami": "h", + "minútami": "m", + "minútou": "m", + "minúty": "m", "h": "h", - "dňom": "D", - "dňami": "D", - "dňa": "D", + "hodinami": "h", + "hodinou": "h", "d.": "D", - "týždňom": "W", - "týždňami": "W", - "týždňa": "W", + "dňa": "D", + "dňami": "D", + "dňom": "D", "týž.": "W", - "mesiacom": "M", - "mesiacmi": "M", - "mesiaca": "M", + "týždňa": "W", + "týždňami": "W", + "týždňom": "W", "mes.": "M", - "rokom": "Y", - "rokmi": "Y", + "mesiaca": "M", + "mesiacmi": "M", + "mesiacom": "M", + "r.": "Y", "roka": "Y", - "r.": "Y" + "rokmi": "Y", + "rokom": "Y" }, "date_order": "DMY", "months": {}, @@ -3371,9 +3378,9 @@ }, "comma_decimal": true, "number_tokens": { + "tis": 3, "mil": 6, - "mld": 9, - "tis": 3 + "mld": 9 }, "number_nd_tokens": { "žiadne": 0 @@ -3390,55 +3397,55 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "sekund": "s", "sekunda": "s", + "sekundama": "s", + "sekundami": "s", "sekunde": "s", "sekundi": "s", "sekundo": "s", - "sekundama": "s", - "sekundami": "s", - "s": "s", + "min.": "m", "minut": "m", "minuta": "m", + "minutama": "m", + "minutami": "m", "minute": "m", "minuti": "m", "minuto": "m", - "minutama": "m", - "minutami": "m", - "min.": "m", - "uro": "h", "urama": "h", "urami": "h", + "uro": "h", + "dnem": "D", + "dnevi": "D", "dnevom": "D", "dnevoma": "D", - "dnevi": "D", - "dnem": "D", + "ted.": "W", + "tedni": "W", "tednom": "W", "tednoma": "W", - "tedni": "W", - "ted.": "W", + "mes.": "M", "mesecem": "M", "mesecema": "M", "meseci": "M", - "mes.": "M", + "leti": "Y", "letom": "Y", - "letoma": "Y", - "leti": "Y" + "letoma": "Y" }, "date_order": "DY", "months": { - "apr.": 4, - "avg.": 8, - "dec.": 12, - "feb.": 2, "jan.": 1, - "jul.": 7, - "jun.": 6, - "maj": 5, + "feb.": 2, "mar.": 3, - "nov.": 11, + "apr.": 4, + "maj": 5, + "jun.": 6, + "jul.": 7, + "avg.": 8, + "sep.": 9, "okt.": 10, - "sep.": 9 + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "danes": "0D", @@ -3446,31 +3453,31 @@ }, "comma_decimal": true, "number_tokens": { + "tis": 3, "mio": 6, - "mrd": 9, - "tis": 3 + "mrd": 9 }, "number_nd_tokens": { "brez": 0 }, "album_types": { "album": "Album", + "zvočna knjiga": "Audiobook", "ep": "Ep", "oddaja": "Show", - "singel": "Single", - "zvočna knjiga": "Audiobook" + "singel": "Single" } }, "sq": { "equivalent": [], "by_char": false, "timeago_tokens": { - "sekondë": "s", - "sekonda": "s", "sek": "s", - "minutë": "m", - "minuta": "m", + "sekonda": "s", + "sekondë": "s", "min": "m", + "minuta": "m", + "minutë": "m", "orë": "h", "ditë": "D", "javë": "W", @@ -3480,18 +3487,18 @@ }, "date_order": "DY", "months": { - "dhj": 12, - "gush": 8, "jan": 1, - "korr": 7, - "maj": 5, - "mar": 3, - "nën": 11, - "pri": 4, - "qer": 6, "shk": 2, + "mar": 3, + "pri": 4, + "maj": 5, + "qer": 6, + "korr": 7, + "gush": 8, "sht": 9, - "tet": 10 + "tet": 10, + "nën": 11, + "dhj": 12 }, "timeago_nd_tokens": { "sot": "0D", @@ -3500,16 +3507,16 @@ "comma_decimal": true, "number_tokens": { "mijë": 3, - "mld": 9, - "mln": 6 + "mln": 6, + "mld": 9 }, "number_nd_tokens": { "nuk": 0 }, "album_types": { "album": "Album", - "ep": "Ep", "libër me audio": "Audiobook", + "ep": "Ep", "shfaq": "Show", "single": "Single" } @@ -3518,27 +3525,27 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "сек.": "s", + "секунда": "s", "секунде": "s", "секунди": "s", - "секунда": "s", - "сек.": "s", - "минута": "m", - "минут": "m", "мин.": "m", + "минут": "m", + "минута": "m", "сата": "h", "сати": "h", "ч.": "h", - "дана": "D", "д.": "D", - "недеље": "W", - "недеља": "W", + "дана": "D", "нед.": "W", + "недеља": "W", + "недеље": "W", + "мес.": "M", "месеца": "M", "месеци": "M", - "мес.": "M", - "године": "Y", + "год.": "Y", "година": "Y", - "год.": "Y" + "године": "Y" }, "date_order": "DMY", "months": {}, @@ -3548,17 +3555,17 @@ }, "comma_decimal": true, "number_tokens": { + "хиљ": 3, "мил": 6, - "млрд": 9, - "хиљ": 3 + "млрд": 9 }, "number_nd_tokens": { "нема": 0 }, "album_types": { - "ep": "Ep", "албум": "Album", "аудио-књига": "Audiobook", + "ep": "Ep", "серија": "Show", "сингл": "Single" } @@ -3567,27 +3574,27 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sek.": "s", + "sekunda": "s", "sekunde": "s", "sekundi": "s", - "sekunda": "s", - "sek.": "s", - "minuta": "m", - "minut": "m", "min.": "m", + "minut": "m", + "minuta": "m", + "č.": "h", "sata": "h", "sati": "h", - "č.": "h", - "dana": "D", "d.": "D", - "nedelje": "W", - "nedelja": "W", + "dana": "D", "ned.": "W", + "nedelja": "W", + "nedelje": "W", + "mes.": "M", "meseca": "M", "meseci": "M", - "mes.": "M", - "godine": "Y", + "god.": "Y", "godina": "Y", - "god.": "Y" + "godine": "Y" }, "date_order": "DMY", "months": {}, @@ -3616,40 +3623,40 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "sekund": "s", "sekunder": "s", - "s": "s", + "min": "m", "minut": "m", "minuter": "m", - "min": "m", - "timme": "h", - "timmar": "h", "tim": "h", + "timmar": "h", + "timme": "h", + "d": "D", "dag": "D", "dagar": "D", - "d": "D", + "v.": "W", "vecka": "W", "veckor": "W", - "v.": "W", + "mån.": "M", "månad": "M", "månader": "M", - "mån.": "M", "år": "Y" }, "date_order": "DY", "months": { - "apr.": 4, - "aug.": 8, - "dec.": 12, - "feb.": 2, "jan.": 1, - "juli": 7, - "juni": 6, - "maj": 5, + "feb.": 2, "mars": 3, - "nov.": 11, + "apr.": 4, + "maj": 5, + "juni": 6, + "juli": 7, + "aug.": 8, + "sep.": 9, "okt.": 10, - "sep.": 9 + "nov.": 11, + "dec.": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -3657,16 +3664,16 @@ }, "comma_decimal": true, "number_tokens": { - "md": 9, - "mn": 6 + "mn": 6, + "md": 9 }, "number_nd_tokens": { "inga": 0 }, "album_types": { "album": "Album", - "ep": "Ep", "ljudbok": "Audiobook", + "ep": "Ep", "ljuddrama": "Show", "singel": "Single" } @@ -3680,25 +3687,25 @@ "saa": "h", "siku": "D", "wiki": "W", - "mwezi": "M", "miezi": "M", - "mwaka": "Y", - "miaka": "Y" + "mwezi": "M", + "miaka": "Y", + "mwaka": "Y" }, "date_order": "DY", "months": { - "ago": 8, - "apr": 4, - "des": 12, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, + "feb": 2, "mac": 3, + "apr": 4, "mei": 5, - "nov": 11, + "jun": 6, + "jul": 7, + "ago": 8, + "sep": 9, "okt": 10, - "sep": 9 + "nov": 11, + "des": 12 }, "timeago_nd_tokens": { "leo": "0D", @@ -3706,18 +3713,18 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, "elfu": 3, - "m": 6 + "m": 6, + "b": 9 }, "number_nd_tokens": { "haijatazamwa": 0 }, "album_types": { "albamu": "Album", + "kitabu cha kusikiliza": "Audiobook", "ep": "Ep", "kipindi": "Show", - "kitabu cha kusikiliza": "Audiobook", "singo": "Single" } }, @@ -3725,43 +3732,43 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "விநாடிக்கு": "s", - "விநாடிகளுக்கு": "s", "விநா.": "s", "விநாடி": "s", + "விநாடிகளுக்கு": "s", "விநாடிகள்": "s", - "நிமிடத்திற்கு": "m", - "நிமிடங்களுக்கு": "m", + "விநாடிக்கு": "s", "நிமி.": "m", + "நிமிடங்களுக்கு": "m", "நிமிடங்கள்": "m", + "நிமிடத்திற்கு": "m", "நிமிடம்": "m", - "மணிநேரம்": "h", "மணி.": "h", - "நாளுக்கு": "D", + "மணிநேரம்": "h", "நாட்களுக்கு": "D", - "வாரத்திற்கு": "W", - "வாரங்களுக்கு": "W", + "நாளுக்கு": "D", "வார.": "W", - "மாதத்துக்கு": "M", - "மாதங்களுக்கு": "M", + "வாரங்களுக்கு": "W", + "வாரத்திற்கு": "W", "மாத.": "M", + "மாதங்களுக்கு": "M", + "மாதத்துக்கு": "M", "ஆண்டிற்கு": "Y", "ஆண்டுகளுக்கு": "Y" }, "date_order": "DY", "months": { - "அக்.,": 10, - "ஆக.,": 8, - "ஏப்.,": 4, - "செப்.,": 9, "ஜன.,": 1, - "ஜூன்,": 6, - "ஜூலை,": 7, - "டிச.,": 12, - "நவ.,": 11, "பிப்.,": 2, "மார்.,": 3, - "மே,": 5 + "ஏப்.,": 4, + "மே,": 5, + "ஜூன்,": 6, + "ஜூலை,": 7, + "ஆக.,": 8, + "செப்.,": 9, + "அக்.,": 10, + "நவ.,": 11, + "டிச.,": 12 }, "timeago_nd_tokens": { "இன்று": "0D", @@ -3769,17 +3776,17 @@ }, "comma_decimal": false, "number_tokens": { - "கோடி": 7, - "லட்சம்": 5 + "லட்சம்": 5, + "கோடி": 7 }, "number_nd_tokens": { "இல்லை": 0 }, "album_types": { - "ep": "Ep", - "ஆடியோ புத்தகம்": "Audiobook", - "ஆடியோ ஷோ": "Show", "ஆல்பம்": "Album", + "ஆடியோ புத்தகம்": "Audiobook", + "ep": "Ep", + "ஆடியோ ஷோ": "Show", "சிங்கிள்": "Single" } }, @@ -3787,41 +3794,41 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "సెక.": "s", "సెకను": "s", "సెకన్ల": "s", "సెకన్లు": "s", - "సెక.": "s", + "నిమి.": "m", "నిమిషం": "m", "నిమిషాల": "m", "నిమిషాలు": "m", - "నిమి.": "m", + "గం.": "h", "గంట": "h", "గంటల": "h", - "గం.": "h", "రోజు": "D", "రోజుల": "D", "వారం": "W", "వారాల": "W", "నెల": "M", "నెలల": "M", + "సం.": "Y", "సంవత్సరం": "Y", - "సంవత్సరాల": "Y", - "సం.": "Y" + "సంవత్సరాల": "Y" }, "date_order": "DY", "months": { - "అక్టో,": 10, - "ఆగ,": 8, - "ఏప్రి,": 4, "జన,": 1, - "జులై,": 7, - "జూన్,": 6, - "డిసెం,": 12, - "నవం,": 11, "ఫిబ్ర,": 2, "మార్చి,": 3, + "ఏప్రి,": 4, "మే,": 5, - "సెప్టెం,": 9 + "జూన్,": 6, + "జులై,": 7, + "ఆగ,": 8, + "సెప్టెం,": 9, + "అక్టో,": 10, + "నవం,": 11, + "డిసెం,": 12 }, "timeago_nd_tokens": { "ఈ": "0D", @@ -3829,17 +3836,17 @@ }, "comma_decimal": false, "number_tokens": { - "కోట్లు": 7, "లక్ష": 5, - "లక్షలు": 5 + "లక్షలు": 5, + "కోట్లు": 7 }, "number_nd_tokens": { "లేవు": 0 }, "album_types": { - "ep": "Ep", - "ఆడియోబుక్": "Audiobook", "ఆల్బమ్": "Album", + "ఆడియోబుక్": "Audiobook", + "ep": "Ep", "చూపించు": "Show", "సింగిల్": "Single" } @@ -3848,14 +3855,14 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "วินาที": "s", "วินาทีที่ผ่านมา": "s", "วินาทีที่แล้ว": "s", - "วินาที": "s", + "นาที": "m", "นาทีที่ผ่านมา": "m", "นาทีที่แล้ว": "m", - "นาที": "m", - "ชั่วโมงที่ผ่านมา": "h", "ชม.": "h", + "ชั่วโมงที่ผ่านมา": "h", "ที่แล้ว": "h", "วันที่ผ่านมา": "D", "วันที่แล้ว": "D", @@ -3867,18 +3874,18 @@ }, "date_order": "DY", "months": { - "ก.ค.": 7, + "ม.ค.": 1, "ก.พ.": 2, + "มี.ค.": 3, + "เม.ย.": 4, + "พ.ค.": 5, + "มิ.ย.": 6, + "ก.ค.": 7, + "ส.ค.": 8, "ก.ย.": 9, "ต.ค.": 10, - "ธ.ค.": 12, - "พ.ค.": 5, "พ.ย.": 11, - "ม.ค.": 1, - "มิ.ย.": 6, - "มี.ค.": 3, - "ส.ค.": 8, - "เม.ย.": 4 + "ธ.ค.": 12 }, "timeago_nd_tokens": { "อัปเดตแล้ววันนี้": "0D", @@ -3887,21 +3894,21 @@ "comma_decimal": false, "number_tokens": { "พัน": 3, - "พันล้าน": 9, - "ล้าน": 6, "หมื่น": 4, - "หมื่นล้าน": 10, - "แสน": 5 + "แสน": 5, + "ล้าน": 6, + "พันล้าน": 9, + "หมื่นล้าน": 10 }, "number_nd_tokens": { "ไม่มีการดู": 0 }, "album_types": { - "ep": "Ep", - "ซิงเกิล": "Single", - "รายการ": "Show", + "อัลบั้ม": "Album", "หนังสือเสียง": "Audiobook", - "อัลบั้ม": "Album" + "ep": "Ep", + "รายการ": "Show", + "ซิงเกิล": "Single" } }, "tr": { @@ -3912,8 +3919,8 @@ "sn.": "s", "dakika": "m", "dk.": "m", - "saat": "h", "sa.": "h", + "saat": "h", "gün": "D", "hafta": "W", "hf.": "W", @@ -3922,18 +3929,18 @@ }, "date_order": "DY", "months": { - "ara": 12, - "ağu": 8, - "eki": 10, - "eyl": 9, - "haz": 6, - "kas": 11, - "mar": 3, - "may": 5, - "nis": 4, "oca": 1, + "şub": 2, + "mar": 3, + "nis": 4, + "may": 5, + "haz": 6, "tem": 7, - "şub": 2 + "ağu": 8, + "eyl": 9, + "eki": 10, + "kas": 11, + "ara": 12 }, "timeago_nd_tokens": { "bugün": "0D", @@ -3950,9 +3957,9 @@ }, "album_types": { "albüm": "Album", + "sesli kitap": "Audiobook", "ep": "Ep", "program": "Show", - "sesli kitap": "Audiobook", "single": "Single" } }, @@ -3960,55 +3967,55 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "секунду": "s", - "секунди": "s", + "с": "s", "секунд": "s", "секунда": "s", - "с": "s", - "хвилину": "m", - "хвилини": "m", + "секунди": "s", + "секунду": "s", + "хв": "m", "хвилин": "m", "хвилина": "m", - "хв": "m", - "годину": "h", - "години": "h", - "годин": "h", + "хвилини": "m", + "хвилину": "m", "год": "h", + "годин": "h", + "години": "h", + "годину": "h", "день": "D", + "дн.": "D", "дні": "D", "днів": "D", "дня": "D", - "дн.": "D", + "тиж.": "W", "тиждень": "W", "тижні": "W", "тижнів": "W", "тижня": "W", - "тиж.": "W", - "місяць": "M", + "міс.": "M", "місяці": "M", "місяців": "M", + "місяць": "M", "місяця": "M", - "міс.": "M", + "р.": "Y", "рік": "Y", "роки": "Y", "років": "Y", - "року": "Y", - "р.": "Y" + "року": "Y" }, "date_order": "DY", "months": { - "бер.": 3, - "вер.": 9, - "груд.": 12, - "жовт.": 10, - "квіт.": 4, - "лип.": 7, - "лист.": 11, - "лют.": 2, - "серп.": 8, "січ.": 1, + "лют.": 2, + "бер.": 3, + "квіт.": 4, "трав.": 5, - "черв.": 6 + "черв.": 6, + "лип.": 7, + "серп.": 8, + "вер.": 9, + "жовт.": 10, + "лист.": 11, + "груд.": 12 }, "timeago_nd_tokens": { "сьогодні": "0D", @@ -4016,18 +4023,18 @@ }, "comma_decimal": true, "number_tokens": { + "тис": 3, "млн": 6, - "млрд": 9, - "тис": 3 + "млрд": 9 }, "number_nd_tokens": { "жодного": 0 }, "album_types": { "альбом": "Album", - "аудіодрама": "Show", "аудіокнига": "Audiobook", "мініальбом": "Ep", + "аудіодрама": "Show", "сингл": "Single" } }, @@ -4035,8 +4042,8 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "سیکنڈز": "s", "سیکنڈ": "s", + "سیکنڈز": "s", "منٹ": "m", "منٹ،": "m", "منٹس": "m", @@ -4046,25 +4053,25 @@ "دنوں": "D", "ہفتہ": "W", "ہفتے": "W", + "ماہ": "M", "مہینہ": "M", "مہینے": "M", - "ماہ": "M", "سال": "Y" }, "date_order": "DY", "months": { - "اپریل،": 4, - "اکتوبر،": 10, - "اگست،": 8, "جنوری،": 1, - "جولائی،": 7, - "جون،": 6, - "دسمبر،": 12, - "ستمبر،": 9, "فروری،": 2, - "مئی،": 5, "مارچ،": 3, - "نومبر،": 11 + "اپریل،": 4, + "مئی،": 5, + "جون،": 6, + "جولائی،": 7, + "اگست،": 8, + "ستمبر،": 9, + "اکتوبر،": 10, + "نومبر،": 11, + "دسمبر،": 12 }, "timeago_nd_tokens": { "آج": "0D", @@ -4072,18 +4079,18 @@ }, "comma_decimal": false, "number_tokens": { - "ارب": 9, + "ہزار": 3, "لاکھ": 5, "کروڑ": 7, - "ہزار": 3 + "ارب": 9 }, "number_nd_tokens": { "نہیں": 0 }, "album_types": { - "ep": "Ep", - "آڈیو بک": "Audiobook", "البم": "Album", + "آڈیو بک": "Audiobook", + "ep": "Ep", "شو": "Show", "واحد": "Single" } @@ -4102,18 +4109,18 @@ }, "date_order": "DY", "months": { - "apr,": 4, - "avg,": 8, - "dek,": 12, + "yan,": 1, "fev,": 2, - "iyl,": 7, - "iyn,": 6, "mar,": 3, + "apr,": 4, "may,": 5, - "noy,": 11, - "okt,": 10, + "iyn,": 6, + "iyl,": 7, + "avg,": 8, "sen,": 9, - "yan,": 1 + "okt,": 10, + "noy,": 11, + "dek,": 12 }, "timeago_nd_tokens": { "bugun": "0D", @@ -4155,15 +4162,15 @@ "comma_decimal": true, "number_tokens": { "n": 3, - "t": 9, - "tr": 6 + "tr": 6, + "t": 9 }, "number_nd_tokens": {}, "album_types": { - "chương trình": "Show", - "sách nói": "Audiobook", "đĩa nhạc": "Album", + "sách nói": "Audiobook", "đĩa nhạc mở rộng (ep)": "Ep", + "chương trình": "Show", "đĩa đơn": "Single" } }, @@ -4195,10 +4202,10 @@ }, "album_types": { "专辑": "Album", - "单曲": "Single", - "广播剧": "Show", "有声读物": "Audiobook", - "迷你专辑": "Ep" + "迷你专辑": "Ep", + "广播剧": "Show", + "单曲": "Single" } }, "zh-HK": { @@ -4222,29 +4229,29 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, - "m": 6 + "m": 6, + "b": 9 }, "number_nd_tokens": {}, "album_types": { - "ep": "Ep", - "單曲": "Single", "專輯": "Album", "有聲書": "Audiobook", - "節目": "Show" + "ep": "Ep", + "節目": "Show", + "單曲": "Single" } }, "zh-TW": { "equivalent": [], "by_char": true, "timeago_tokens": { - "分": "m", - "天": "D", - "小": "h", - "年": "Y", - "月": "M", "秒": "s", - "週": "W" + "分": "m", + "小": "h", + "天": "D", + "週": "W", + "月": "M", + "年": "Y" }, "date_order": "YMD", "months": {}, @@ -4254,60 +4261,60 @@ }, "comma_decimal": false, "number_tokens": { - "億": 8, - "萬": 4 + "萬": 4, + "億": 8 }, "number_nd_tokens": {}, "album_types": { - "ep": "Ep", - "單曲": "Single", "專輯": "Album", "有聲書": "Audiobook", - "節目": "Show" + "ep": "Ep", + "節目": "Show", + "單曲": "Single" } }, "zu": { "equivalent": [], "by_char": false, "timeago_tokens": { - "isekhondi": "s", "amasekhondi": "s", - "iminithi": "m", + "isekhondi": "s", "amaminithi": "m", - "ihora": "h", + "iminithi": "m", "emahoreni": "h", - "osukwini": "D", + "ihora": "h", + "ezedlule.": "D", + "ezingu": "D", + "ezinsukwini": "D", + "izinsuku": "D", "olungu": "D", "olwedlule": "D", - "ezinsukwini": "D", - "ezingu": "D", - "ezedlule.": "D", + "osukwini": "D", "usuku": "D", - "izinsuku": "D", - "iviki": "W", - "evikini": "W", - "elingu": "W", "amaviki": "W", + "elingu": "W", + "evikini": "W", + "iviki": "W", "inyanga": "M", "izinyanga": "M", - "unyaka": "Y", + "iminyaka": "Y", "odlule": "Y", - "iminyaka": "Y" + "unyaka": "Y" }, "date_order": "DY", "months": { - "aga": 8, - "dis": 12, - "eph": 4, - "feb": 2, "jan": 1, - "jul": 7, - "jun": 6, + "feb": 2, "mas": 3, + "eph": 4, "mey": 5, - "nov": 11, + "jun": 6, + "jul": 7, + "aga": 8, + "sep": 9, "okt": 10, - "sep": 9 + "nov": 11, + "dis": 12 }, "timeago_nd_tokens": { "namuhla": "0D", @@ -4315,17 +4322,17 @@ }, "comma_decimal": false, "number_tokens": { - "b": 9, - "m": 6 + "m": 6, + "b": 9 }, "number_nd_tokens": { "akukho": 0 }, "album_types": { - "bonisa": "Show", "i-albhamu": "Album", "i-audiobook": "Audiobook", "i-ep": "Ep", + "bonisa": "Show", "i-single": "Single" } } diff --git a/testfiles/dict/format_dict.js b/testfiles/dict/format_dict.js new file mode 100644 index 0000000..5a6895a --- /dev/null +++ b/testfiles/dict/format_dict.js @@ -0,0 +1,60 @@ +const fs = require("fs"); +const DICT_PATH = "dictionary.json"; + +const dict = JSON.parse(fs.readFileSync(DICT_PATH)); + +const TA_TOKENS = { s: 1, m: 2, h: 3, D: 4, W: 5, M: 6, Y: 7 }; + +// Sort a dictionary by value +function sortDict(dict) { + // Create items array + const items = Object.keys(dict).map(function (key) { + return [key, dict[key]]; + }); + // Sort the array based on the second element + items.sort(function (first, second) { + let d1; + if (typeof first[1] === "string") { + // Check for timeago token + const tokenPat = /^(\d*)([smhDWMY])$/; + const m1 = first[1].match(tokenPat); + const m2 = second[1].match(tokenPat); + if (m1 !== null && m2 !== null) { + const tok1 = TA_TOKENS[m1[2]]; + const tok2 = TA_TOKENS[m2[2]]; + if (tok1 === tok2) { + const n1 = parseInt(m1[1]) || 0; + const n2 = parseInt(m2[1]) || 0; + d1 = n1 - n2; + } else { + d1 = tok1 - tok2; + } + } else { + d1 = first[1].localeCompare(second[1]); + } + } else { + d1 = first[1] - second[1]; + } + if (d1 === 0) { + return first[0].localeCompare(second[0]); + } + return d1; + }); + + const newDict = {}; + items.forEach((item) => { + newDict[item[0]] = item[1]; + }); + return newDict; +} + +for (const [mainLang, entry] of Object.entries(dict)) { + for (key of Object.keys(entry)) { + const val = entry[key]; + if (typeof val === "object" && !Array.isArray(val)) { + dict[mainLang][key] = sortDict(val); + } + } +} + +fs.writeFileSync(DICT_PATH, JSON.stringify(dict, null, 2)); From bd0f3adba35c52dee65bde644f61b4ed7903e436 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 15 Nov 2023 01:03:03 +0100 Subject: [PATCH 066/459] fix: remove dots from timeago tokens --- src/util/dictionary.rs | 2476 ++++++++++++++++---------------- src/util/timeago.rs | 9 +- testfiles/dict/dictionary.json | 791 +++++----- testfiles/dict/format_dict.js | 2 +- 4 files changed, 1638 insertions(+), 1640 deletions(-) diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index 9d29edc..b4b9558 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -57,55 +57,55 @@ pub(crate) fn entry(lang: Language) -> Entry { match lang { Language::Af => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 15467950696543387533, disps: &[ - (17, 14), - (4, 2), - (0, 0), - (6, 6), + (4, 0), + (0, 9), + (0, 3), + (6, 0), ], entries: &[ - ("j.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("w.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekonde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("md.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("maande", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("dae", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("u.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("s.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("weke", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("j", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("md", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("w", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekonde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("maande", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("u", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (1, 3), - (0, 0), - (0, 7), + (4, 8), + (1, 0), + (7, 2), ], entries: &[ - ("jan.", 1), - ("des.", 12), - ("jun.", 6), - ("jul.", 7), - ("sep.", 9), - ("nov.", 11), - ("apr.", 4), - ("feb.", 2), - ("okt.", 10), - ("mrt.", 3), - ("aug.", 8), + ("nov", 11), + ("okt", 10), + ("apr", 4), + ("jun", 6), + ("mrt", 3), + ("aug", 8), + ("des", 12), ("mei", 5), + ("jan", 1), + ("jul", 7), + ("sep", 9), + ("feb", 2), ], }, timeago_nd_tokens: ::phf::Map { @@ -518,45 +518,45 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 28), + (7, 12), (0, 0), (0, 0), - (4, 25), - (28, 5), - (11, 16), + (5, 21), + (0, 3), + (31, 31), (1, 16), ], entries: &[ ("гадз", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("тыдняў", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("гадзіну", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("гадзіны", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("дзён", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("тыдні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("хвіліну", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("хвілін", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("мес.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("хв", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("г.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("дзень", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("гадзін", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("тыдняў", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("месяцаў", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("гады", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("гадзіну", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("тыдзень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("гадоў", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("хвіліны", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("г", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("тыдня", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("месяцы", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("тыдзень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("гадзін", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("тыд", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("хвіліна", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), @@ -632,34 +632,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Bg => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 351906021642186605, disps: &[ - (0, 0), - (17, 15), - (0, 5), - (6, 18), + (0, 11), + (6, 0), + (5, 0), + (11, 14), ], entries: &[ - ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("м", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("г.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("седм", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("дни", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("седм.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("м.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("г", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -810,41 +810,41 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 17), - (4, 17), - (0, 17), - (1, 13), - (9, 0), - (1, 26), + (14, 26), + (5, 10), + (0, 9), + (0, 7), + (1, 0), + (8, 20), ], entries: &[ - ("sedmicu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("mjesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mj.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mjeseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sedmica", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("god.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sed.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sedmice", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sed", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mj", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("god", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sedmicu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mjesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mjeseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sedmice", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -920,25 +920,25 @@ pub(crate) fn entry(lang: Language) -> Entry { key: 12913932095322966823, disps: &[ (0, 0), - (7, 4), (2, 0), - (10, 3), + (2, 0), + (0, 6), ], entries: &[ + ("anys", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("segon", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minuts", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("segons", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("any", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("setm", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("segons", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("segon", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dies", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("mesos", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuts", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("setm.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("anys", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("hores", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("setmanes", TaToken { n: 1, unit: Some(TimeUnit::Week) }), @@ -947,25 +947,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 15467950696543387533, + key: 12913932095322966823, disps: &[ - (0, 5), - (6, 9), - (0, 0), + (4, 2), + (1, 7), + (1, 0), ], entries: &[ + ("nov", 11), + ("jul", 7), ("juny", 6), - ("febr.", 2), - ("d’oct.", 10), ("març", 3), - ("set.", 9), + ("febr", 2), + ("set", 9), + ("des", 12), + ("d’ag", 8), + ("gen", 1), + ("d’abr", 4), ("maig", 5), - ("jul.", 7), - ("gen.", 1), - ("nov.", 11), - ("d’ag.", 8), - ("des.", 12), - ("d’abr.", 4), + ("d’oct", 10), ], }, timeago_nd_tokens: ::phf::Map { @@ -1014,50 +1014,50 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Cs => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 7485420634051515786, disps: &[ - (0, 6), + (2, 20), (0, 0), - (0, 3), - (2, 1), - (6, 13), - (31, 18), - (3, 19), + (4, 12), + (0, 13), + (1, 16), + (21, 31), + (10, 3), ], entries: &[ - ("týdny", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dne", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("hodinami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("měsíci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("týd.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("r.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("roky", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("rokem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("měs.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("měsícem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("týdne", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("l.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("lety", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("měsíce", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("týdnem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("hodiny", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minutou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("týd", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dny", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("měsícem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("měs", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("roky", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("týdne", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("rokem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minutou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("měsíce", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("lety", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("týdny", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dne", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("l", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("měsíci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("hodinami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("týdnem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("r", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -1113,54 +1113,54 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Da => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 15467950696543387533, disps: &[ - (5, 0), - (5, 13), - (0, 12), - (1, 10), + (0, 2), + (1, 0), + (10, 4), + (7, 10), ], entries: &[ - ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dage", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mdr.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("time", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("md.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("uger", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mdr", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("uge", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("md", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("måneder", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("uger", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("time", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dage", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 7485420634051515786, + key: 10121458955350035957, disps: &[ - (1, 0), - (1, 11), - (0, 5), + (0, 9), + (1, 6), + (5, 0), ], entries: &[ - ("aug.", 8), - ("jan.", 1), - ("dec.", 12), + ("jul", 7), + ("okt", 10), + ("sep", 9), + ("nov", 11), ("maj", 5), - ("nov.", 11), - ("sep.", 9), - ("mar.", 3), - ("okt.", 10), - ("jun.", 6), - ("feb.", 2), - ("apr.", 4), - ("jul.", 7), + ("mar", 3), + ("apr", 4), + ("feb", 2), + ("jun", 6), + ("jan", 1), + ("aug", 8), + ("dec", 12), ], }, timeago_nd_tokens: ::phf::Map { @@ -1211,29 +1211,29 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 15467950696543387533, disps: &[ - (3, 4), - (0, 0), - (4, 3), - (1, 12), + (2, 0), + (1, 2), + (12, 13), + (3, 3), ], entries: &[ + ("woche", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("std", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("monat", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("stunden", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekunden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("stunde", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("jahren", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("tagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("std.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("monaten", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("wochen", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("monat", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("monaten", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("minuten", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekunden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("tagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("tag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("jahr", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("woche", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -1290,33 +1290,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::El => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 15467950696543387533, disps: &[ - (1, 10), - (1, 5), - (1, 0), - (0, 5), + (0, 0), + (17, 9), + (2, 12), + (9, 15), ], entries: &[ - ("ημέρα", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("λεπ.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ημέρες", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("έτος", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ώρες", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("έτη", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("δευτερόλεπτο", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("δευτερόλεπτα", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("εβδομάδα", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("λεπτό", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ώ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ημ.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("δευτ.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("εβδομάδες", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("λεπ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ημέρες", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("εβδ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("έτη", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("μήνες", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("εβδ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("μήνα", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ημέρα", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ώρες", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("λεπτό", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("δευτερόλεπτα", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("δευτερόλεπτο", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ώ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("εβδομάδες", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("δευτ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ώρα", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ημ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1501,32 +1501,32 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 10121458955350035957, disps: &[ - (5, 2), - (19, 19), - (1, 0), + (7, 0), + (6, 15), + (0, 16), (0, 0), ], entries: &[ - ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("años", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1596,33 +1596,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::EsUs | Language::Es419 => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 14108922650502679131, disps: &[ - (4, 2), - (11, 2), - (6, 0), - (5, 0), + (9, 0), + (1, 3), + (2, 7), + (7, 6), ], entries: &[ - ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("años", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("año", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("años", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1811,25 +1811,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, date_order: &[DateCmp::Y, DateCmp::D], months: ::phf::Map { - key: 10121458955350035957, + key: 15467950696543387533, disps: &[ - (3, 0), - (0, 0), - (8, 7), + (1, 0), + (9, 5), + (2, 4), ], entries: &[ - ("mai.", 5), - ("mar.", 3), - ("urr.", 10), - ("aza.", 11), - ("ira.", 9), - ("ots.", 2), - ("urt.", 1), - ("eka.", 6), - ("abe.", 12), - ("uzt.", 7), - ("api.", 4), - ("abu.", 8), + ("uzt", 7), + ("aza", 11), + ("ots", 2), + ("urr", 10), + ("mai", 5), + ("urt", 1), + ("abu", 8), + ("eka", 6), + ("abe", 12), + ("ira", 9), + ("mar", 3), + ("api", 4), ], }, timeago_nd_tokens: ::phf::Map { @@ -2051,21 +2051,21 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Fil => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (2, 2), - (7, 0), + (1, 0), + (5, 2), ], entries: &[ - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("buwan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("seg.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("taon", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("linggo", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("oras", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("araw", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("oras", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("taon", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("seg", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("buwan", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("linggo", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2137,57 +2137,57 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Fr | Language::FrCa => Entry { timeago_tokens: ::phf::Map { - key: 1937371814602216758, + key: 2980949210194914378, disps: &[ - (6, 5), - (9, 7), - (4, 0), - (0, 3), + (3, 1), + (7, 0), + (17, 1), + (1, 11), ], entries: &[ + ("m", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("semaines", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("j", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("heures", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("semaine", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ans", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("jours", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("heure", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("secondes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("mois", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("jour", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("semaine", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("heures", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("m.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("heure", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("jour", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (9, 0), - (7, 6), - (1, 5), + (10, 7), + (1, 0), + (3, 1), ], entries: &[ ("août", 8), - ("avr.", 4), - ("juil.", 7), - ("févr.", 2), - ("oct.", 10), - ("déc.", 12), - ("janv.", 1), - ("mars", 3), + ("févr", 2), + ("nov", 11), + ("sept", 9), + ("janv", 1), + ("oct", 10), ("juin", 6), - ("juill.", 7), - ("nov.", 11), - ("sept.", 9), + ("déc", 12), + ("juil", 7), + ("mars", 3), + ("avr", 4), ("mai", 5), + ("juill", 7), ], }, timeago_nd_tokens: ::phf::Map { @@ -2241,55 +2241,55 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Gl => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 14108922650502679131, disps: &[ + (2, 4), + (12, 1), + (14, 2), (0, 0), - (8, 9), - (11, 7), - (7, 3), ], entries: &[ - ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("día", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("días", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 12913932095322966823, + key: 8694567506910003252, disps: &[ - (0, 0), (2, 0), - (0, 3), + (2, 10), + (2, 5), ], entries: &[ - ("out.", 10), - ("feb.", 2), - ("xan.", 1), - ("set.", 9), - ("mar.", 3), - ("nov.", 11), - ("xuño", 6), - ("xul.", 7), + ("nov", 11), + ("abr", 4), ("maio", 5), - ("dec.", 12), - ("ago.", 8), - ("abr.", 4), + ("ago", 8), + ("mar", 3), + ("xuño", 6), + ("xul", 7), + ("out", 10), + ("set", 9), + ("feb", 2), + ("xan", 1), + ("dec", 12), ], }, timeago_nd_tokens: ::phf::Map { @@ -2339,15 +2339,15 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 10121458955350035957, disps: &[ - (7, 1), + (0, 1), (4, 0), ], entries: &[ - ("અઠ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("દિવસ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("અઠવાડિયા", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("મિનિટ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("મહિના", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("દિવસ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("અઠ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("સ\u{ac7}ક\u{a82}ડ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("વર\u{acd}ષ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("કલાક", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), @@ -2513,41 +2513,41 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (5, 26), - (0, 10), - (0, 10), - (0, 8), + (0, 16), + (7, 4), + (0, 6), + (0, 1), (2, 0), - (0, 12), + (0, 8), ], entries: &[ - ("tj.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("mjeseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("tjedan", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mj", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("tjedna", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("tjedana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("godinu", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("mjesec", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("g.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mj.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dan", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("tjedana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tjedan", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("tj", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mjeseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("g", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -2648,25 +2648,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, date_order: &[DateCmp::Y, DateCmp::D], months: ::phf::Map { - key: 7485420634051515786, + key: 12913932095322966823, disps: &[ - (0, 0), - (5, 5), (5, 0), + (0, 10), + (6, 9), ], entries: &[ - ("febr.", 2), - ("júl.", 7), - ("márc.", 3), - ("máj.", 5), - ("szept.", 9), - ("jún.", 6), - ("aug.", 8), - ("jan.", 1), - ("okt.", 10), - ("nov.", 11), - ("dec.", 12), - ("ápr.", 4), + ("jan", 1), + ("jún", 6), + ("júl", 7), + ("márc", 3), + ("máj", 5), + ("dec", 12), + ("okt", 10), + ("ápr", 4), + ("nov", 11), + ("aug", 8), + ("szept", 9), + ("febr", 2), ], }, timeago_nd_tokens: ::phf::Map { @@ -2900,60 +2900,60 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Is => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 12913932095322966823, disps: &[ + (1, 20), (0, 0), - (4, 15), - (8, 13), - (0, 2), - (12, 7), + (0, 4), + (3, 3), + (3, 3), ], entries: &[ - ("klst.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ári", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("klukkustund", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekúnda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mínútu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mín.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mínúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("árum", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mínútum", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mán.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mánuðum", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekúndum", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mínútur", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("viku", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekúndu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("vikum", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("klukkustund", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ári", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("árum", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("sekúndur", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("klukkustundum", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mínútur", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dögum", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("klst", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("mánuði", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("viku", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mínúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mínútu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mínútum", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mín", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mánuðum", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekúnda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekúndum", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("klukkustundum", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekúndu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("degi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mán", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 8694567506910003252, + key: 15467950696543387533, disps: &[ - (0, 4), - (6, 5), - (9, 0), + (6, 0), + (0, 9), + (3, 7), ], entries: &[ - ("okt.", 10), - ("jún.", 6), - ("ágú.", 8), - ("júl.", 7), - ("nóv.", 11), - ("mar.", 3), - ("des.", 12), - ("feb.", 2), - ("sep.", 9), - ("jan.", 1), - ("apr.", 4), + ("apr", 4), + ("júl", 7), + ("feb", 2), + ("nóv", 11), + ("ágú", 8), + ("okt", 10), + ("des", 12), + ("sep", 9), + ("mar", 3), ("maí", 5), + ("jan", 1), + ("jún", 6), ], }, timeago_nd_tokens: ::phf::Map { @@ -3005,34 +3005,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::It => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 106375038446233661, disps: &[ - (0, 10), - (3, 19), - (6, 0), - (8, 16), + (5, 0), + (7, 19), + (7, 1), + (19, 15), ], entries: &[ - ("sett.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("giorno", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mesi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("gg", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("anni", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sec.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("anno", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("secondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("settimana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("g", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("settimane", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("giorni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sett", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("anno", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("mese", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("giorni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("anni", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("g", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("gg", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mesi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("giorno", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("settimane", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -3277,49 +3277,49 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ka => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 10121458955350035957, disps: &[ - (3, 0), - (0, 3), - (6, 0), + (10, 4), + (1, 0), + (5, 10), ], entries: &[ ("წამი", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("კვირის", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("საათის", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("წმ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("წლის", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("კვ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("წუთის", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("სთ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("თვის", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("დღის", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("წუთი", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("წთ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("კვირის", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("წუთის", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("წამის", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("წუთი", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("წლის", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("საათის", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("წთ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("სთ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("დღის", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("კვ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("წმ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 15467950696543387533, + key: 14108922650502679131, disps: &[ - (2, 11), + (0, 5), (1, 0), - (0, 3), + (6, 5), ], entries: &[ - ("სექ.", 9), - ("ნოე.", 11), - ("დეკ.", 12), - ("ივლ.", 7), - ("აპრ.", 4), - ("იან.", 1), - ("აგვ.", 8), - ("მაი.", 5), - ("თებ.", 2), - ("ივნ.", 6), - ("მარ.", 3), - ("ოქტ.", 10), + ("თებ", 2), + ("აგვ", 8), + ("ნოე", 11), + ("აპრ", 4), + ("დეკ", 12), + ("სექ", 9), + ("ოქტ", 10), + ("ივნ", 6), + ("მაი", 5), + ("ივლ", 7), + ("იან", 1), + ("მარ", 3), ], }, timeago_nd_tokens: ::phf::Map { @@ -3372,45 +3372,45 @@ pub(crate) fn entry(lang: Language) -> Entry { key: 12913932095322966823, disps: &[ (0, 1), - (3, 0), - (2, 7), + (2, 3), + (2, 0), ], entries: &[ - ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ж.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("сағ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ап.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("сағ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ап", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("сағат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ж", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], months: ::phf::Map { - key: 10121458955350035957, + key: 15467950696543387533, disps: &[ - (0, 0), + (3, 1), (1, 0), - (2, 0), + (0, 6), ], entries: &[ - ("мау.", 6), - ("там.", 8), - ("шіл.", 7), - ("сәу.", 4), - ("мам.", 5), - ("қаң.", 1), - ("қар.", 11), - ("жел.", 12), - ("нау.", 3), - ("қыр.", 9), - ("қаз.", 10), - ("ақп.", 2), + ("там", 8), + ("шіл", 7), + ("мау", 6), + ("мам", 5), + ("нау", 3), + ("қаз", 10), + ("жел", 12), + ("ақп", 2), + ("қар", 11), + ("сәу", 4), + ("қыр", 9), + ("қаң", 1), ], }, timeago_nd_tokens: ::phf::Map { @@ -3713,47 +3713,45 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ky => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 106375038446233661, disps: &[ - (3, 4), - (2, 2), - (0, 0), + (0, 5), + (7, 0), ], entries: &[ + ("апт", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("мүнөт", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("саат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("саат.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("мүн.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("апт.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("саат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("мүн", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], months: ::phf::Map { - key: 2980949210194914378, + key: 14108922650502679131, disps: &[ - (0, 0), - (5, 0), - (0, 0), + (0, 3), + (6, 10), + (2, 0), ], entries: &[ - ("фев.", 2), - ("ноя.", 11), - ("авг.", 8), ("май", 5), - ("янв.", 1), - ("окт.", 10), - ("июл.", 7), - ("сен.", 9), - ("июн.", 6), - ("мар.", 3), - ("дек.", 12), - ("апр.", 4), + ("фев", 2), + ("янв", 1), + ("ноя", 11), + ("июн", 6), + ("авг", 8), + ("сен", 9), + ("дек", 12), + ("мар", 3), + ("окт", 10), + ("апр", 4), + ("июл", 7), ], }, timeago_nd_tokens: ::phf::Map { @@ -3803,50 +3801,50 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Lo => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 12913932095322966823, disps: &[ - (8, 0), - (7, 5), - (0, 2), + (1, 0), + (11, 6), + (1, 0), ], entries: &[ - ("ນາທ\u{eb5}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ມ\u{eb7}\u{ec9}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ຊມ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ດ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ວ\u{eb4}ນາທ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ເດ\u{eb7}ອນກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ຊ\u{ebb}\u{ec8}ວໂມງກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ດ.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ມ\u{eb7}\u{ec9}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ປ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ອທ.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ຊ\u{ebb}\u{ec8}ວໂມງກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ເດ\u{eb7}ອນກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ວ\u{eb4}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ນາທ\u{eb5}ກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ນທ.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ນທ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ອາທ\u{eb4}ດກ\u{ec8}ອນ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ວ\u{eb4}.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ອທ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ນາທ\u{eb5}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ວ\u{eb4}ນາທ\u{eb5}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ຊມ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 471159234146692604, + key: 106375038446233661, disps: &[ - (2, 1), (1, 0), - (4, 0), + (5, 9), + (2, 0), ], entries: &[ - ("ພ.ຈ.", 11), - ("ມ\u{eb4}.ຖ.", 6), - ("ມ.ນ.", 3), - ("ກ.ຍ.", 9), - ("ທ.ວ.", 12), - ("ກ.ລ.", 7), - ("ຕ.ລ.", 10), - ("ມ.ກ.", 1), - ("ມ.ສ.", 4), - ("ກ.ພ.", 2), - ("ສ.ຫ.", 8), - ("ພ.ພ.", 5), + ("ມນ", 3), + ("ກຍ", 9), + ("ມ\u{eb4}ຖ", 6), + ("ພພ", 5), + ("ກລ", 7), + ("ມກ", 1), + ("ມສ", 4), + ("ສຫ", 8), + ("ກພ", 2), + ("ພຈ", 11), + ("ທວ", 12), + ("ຕລ", 10), ], }, timeago_nd_tokens: ::phf::Map { @@ -3897,52 +3895,52 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Lt => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 10121458955350035957, disps: &[ - (10, 3), - (8, 4), + (0, 12), (1, 15), - (1, 29), - (5, 0), - (0, 30), - (10, 17), + (0, 4), + (0, 33), + (3, 0), + (0, 13), + (5, 33), ], entries: &[ - ("minutė", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dieną", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("valandas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dienų", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekundė", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("savaitės", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekundžių", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mėnesių", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mėnesius", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("valandą", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minutės", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minučių", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundę", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("savaitę", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("metus", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("val.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mėn.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mėnesio", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mėnesį", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("valandų", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("valandos", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dienos", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sav.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("m.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekundės", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("savaites", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundė", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("valandą", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutė", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("val", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mėnesius", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekundžių", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("valandų", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("savaitę", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("valandas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("metus", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("savaičių", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mėnesį", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sav", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("metų", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dienos", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mėnesių", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("savaites", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minučių", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundę", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minutės", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("savaitės", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundės", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mėn", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dienų", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mėnesio", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dieną", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], @@ -4000,63 +3998,63 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Lv => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12913932095322966823, disps: &[ - (3, 3), - (17, 11), - (1, 1), + (14, 1), + (12, 11), (5, 0), - (10, 17), + (4, 0), + (2, 6), ], entries: &[ - ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekunžu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ned.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("st.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("nedēļām", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("g.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("nedēļas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mēneša", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mēn", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("nedēļām", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("gada", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("minūšu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mēnešiem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("stundām", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("minūte", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("stundas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundēm", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("dienām", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mēn.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("minūtes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("gadiem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("minūtēm", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dienas", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("gadiem", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("stundas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekunžu", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dienām", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mēneša", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("g", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekundēm", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("stundām", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mēnešiem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("st", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundes", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ned", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], months: ::phf::Map { - key: 10121458955350035957, + key: 12913932095322966823, disps: &[ + (3, 11), + (0, 6), (0, 0), - (2, 11), - (3, 1), ], entries: &[ + ("sept", 9), ("marts", 3), - ("nov.", 11), - ("sept.", 9), + ("febr", 2), + ("jūn", 6), + ("dec", 12), + ("nov", 11), + ("apr", 4), + ("jūl", 7), ("maijs", 5), - ("apr.", 4), - ("jūn.", 6), - ("janv.", 1), - ("okt.", 10), - ("aug.", 8), - ("dec.", 12), - ("febr.", 2), - ("jūl.", 7), + ("janv", 1), + ("aug", 8), + ("okt", 10), ], }, timeago_nd_tokens: ::phf::Map { @@ -4106,31 +4104,31 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Mk => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12913932095322966823, disps: &[ - (0, 11), - (11, 7), - (2, 9), - (2, 0), + (0, 7), + (0, 5), + (0, 0), + (5, 3), ], entries: &[ - ("дена", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("год.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("дена", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("минути", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("седмица", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ден", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("години", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("месец", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -4350,33 +4348,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Mr => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 7485420634051515786, disps: &[ - (7, 3), - (15, 0), - (0, 13), - (1, 0), + (0, 0), + (12, 8), + (8, 5), + (1, 13), ], entries: &[ - ("वर\u{94d}षा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("मिनिटा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("दिवसाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("आठवड\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("मिनिट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("दिवसा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("महिन\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("स\u{947}क\u{902}दाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("मिनिट", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("तासाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("स\u{947}क\u{902}दा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("मिनिटाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("मिनि", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("स\u{947}क\u{902}द", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("वर\u{94d}षाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("वर\u{94d}षा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("स\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("तासा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("महिन\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("आठवड\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("स\u{947}क\u{902}दाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("तासाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("महिन\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("स\u{947}.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("दिवसाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("मिनिटाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("स\u{947}क\u{902}दा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("मिनि.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("दिवसा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("मिनिटा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("स\u{947}क\u{902}द", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("मिनिट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("वर\u{94d}षाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("तासा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("आठवड\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4719,28 +4717,28 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Nl => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 471159234146692604, disps: &[ - (3, 9), - (7, 7), - (1, 0), + (3, 0), + (12, 4), + (1, 8), ], entries: &[ - ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minuten", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("maanden", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("weken", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sec.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dgn", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("seconden", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dgn", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("maanden", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuten", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("maand", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("weken", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("uur", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minuut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("seconde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4812,59 +4810,59 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::No => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 8694567506910003252, disps: &[ - (0, 2), - (3, 14), - (8, 14), - (12, 0), + (3, 5), + (1, 4), + (2, 18), + (3, 0), ], entries: &[ - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("t", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("måned", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("u.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("md.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minutt", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("døgn", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("md", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dager", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("u", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("uke", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("uker", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("time", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dager", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("uker", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("uke", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("t", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("måneder", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minutt", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("døgn", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("timer", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 15467950696543387533, + key: 10121458955350035957, disps: &[ - (4, 10), - (9, 6), + (5, 10), + (2, 1), (0, 0), ], entries: &[ - ("okt.", 10), - ("mar.", 3), + ("feb", 2), + ("jan", 1), + ("sep", 9), + ("jul", 7), ("juli", 7), - ("nov.", 11), - ("des.", 12), - ("apr.", 4), - ("mai", 5), + ("jun", 6), ("juni", 6), - ("feb.", 2), - ("sep.", 9), - ("aug.", 8), - ("jan.", 1), - ("jun.", 6), - ("jul.", 7), + ("mar", 3), + ("okt", 10), + ("nov", 11), + ("aug", 8), + ("des", 12), + ("mai", 5), + ("apr", 4), ], }, timeago_nd_tokens: ::phf::Map { @@ -4914,27 +4912,27 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Or => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (11, 1), - (7, 1), + (6, 1), + (13, 8), (1, 0), ], entries: &[ - ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ବ.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ଘ.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ବ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("ସପ\u{b4d}ତ\u{b3e}ହ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ମ\u{b3f}.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ବର\u{b4d}ଷ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ଦ\u{b3f}ନ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ସପ\u{b4d}ତ\u{b3e}.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ସେକେଣ\u{b4d}ଡ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ମ\u{b3e}.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ସେ.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ମ\u{b3e}ସ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}\u{200c}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ମ\u{b3f}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ମ\u{b3e}", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ଘଣ\u{b4d}ଟ\u{b3e}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ଦ\u{b3f}ନ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ଘ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ସପ\u{b4d}ତ\u{b3e}", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ବର\u{b4d}ଷ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ମ\u{b3f}ନ\u{b3f}ଟ\u{b4d}\u{200c}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ସେକେଣ\u{b4d}ଡ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ସେ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5103,49 +5101,49 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Pl => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 12913932095322966823, disps: &[ - (0, 30), - (3, 11), - (1, 6), + (0, 7), (0, 0), - (7, 0), - (10, 5), - (26, 5), + (2, 1), + (0, 4), + (5, 9), + (0, 1), + (10, 12), ], entries: &[ - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("miesiące", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("godziny", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("miesięcy", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("miesiąc", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("tygodnia", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dzień", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("tydz.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("tygodnie", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("godzin", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("minutę", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("lat", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("lata", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("tydz", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("rok", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("miesiąca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("godzinę", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("godziny", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mies", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("tyg", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("miesiące", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("tydzień", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("tygodnie", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sekundę", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minuty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("lat", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mies.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("lata", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("rok", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("godzinę", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("miesiąca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("godz.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("godzin", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("miesięcy", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("godz", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dzień", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dnia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("tydzień", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("tyg.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("miesiąc", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("tygodni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5218,31 +5216,31 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Pt => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 12913932095322966823, disps: &[ - (1, 13), - (0, 14), - (0, 0), - (3, 17), + (4, 1), + (2, 4), + (17, 1), + (1, 0), ], entries: &[ - ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("seg.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("seg", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, @@ -5250,23 +5248,23 @@ pub(crate) fn entry(lang: Language) -> Entry { months: ::phf::Map { key: 12913932095322966823, disps: &[ - (4, 10), - (7, 0), - (0, 6), + (1, 0), + (0, 3), + (3, 8), ], entries: &[ - ("out.", 10), - ("nov.", 11), - ("jun.", 6), - ("set.", 9), - ("ago.", 8), - ("fev.", 2), - ("jul.", 7), - ("mar.", 3), - ("mai.", 5), - ("abr.", 4), - ("dez.", 12), - ("jan.", 1), + ("jan", 1), + ("out", 10), + ("nov", 11), + ("dez", 12), + ("set", 9), + ("jul", 7), + ("fev", 2), + ("mar", 3), + ("abr", 4), + ("mai", 5), + ("jun", 6), + ("ago", 8), ], }, timeago_nd_tokens: ::phf::Map { @@ -5318,29 +5316,29 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 7485420634051515786, disps: &[ - (4, 15), - (0, 5), + (5, 9), + (3, 16), (2, 0), - (2, 1), + (4, 16), ], entries: &[ ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sem.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, @@ -5397,55 +5395,55 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ro => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 2980949210194914378, disps: &[ - (0, 6), - (3, 2), - (12, 4), + (9, 16), (4, 0), + (12, 14), + (4, 1), ], entries: &[ - ("sec.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("lună", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("săptămână", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("luni", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("zi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("săptămâni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("secunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("săpt.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("oră", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("zile", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("săptămâni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("luni", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("secundă", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("oră", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("secunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("zile", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("lună", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("săpt", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("săptămână", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("zi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 7485420634051515786, + key: 10121458955350035957, disps: &[ - (6, 6), - (0, 1), - (0, 0), + (10, 3), + (1, 7), + (1, 0), ], entries: &[ - ("dec.", 12), - ("ian.", 1), - ("oct.", 10), - ("sept.", 9), - ("feb.", 2), - ("apr.", 4), - ("mar.", 3), + ("iul", 7), + ("oct", 10), + ("apr", 4), + ("dec", 12), ("mai", 5), - ("aug.", 8), - ("iun.", 6), - ("iul.", 7), - ("nov.", 11), + ("feb", 2), + ("mar", 3), + ("nov", 11), + ("sept", 9), + ("iun", 6), + ("aug", 8), + ("ian", 1), ], }, timeago_nd_tokens: ::phf::Map { @@ -5497,69 +5495,69 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (25, 1), - (0, 0), - (0, 12), - (3, 1), - (5, 14), - (0, 1), - (27, 10), + (0, 4), + (1, 0), + (0, 14), + (3, 10), + (0, 23), + (15, 15), + (2, 22), ], entries: &[ - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("дн.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("г.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("л", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("нед", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("лет", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("минуту", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("г", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("месяцев", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("недель", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("неделю", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("нед.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("недели", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("дней", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("часов", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("недель", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("минуту", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("мес.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("л.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("лет", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("недели", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("часов", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("дн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("минуты", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("месяцев", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 12913932095322966823, + key: 8694567506910003252, disps: &[ - (0, 0), - (8, 7), - (0, 10), + (1, 9), + (7, 3), + (1, 0), ], entries: &[ - ("мар.", 3), - ("сент.", 9), - ("авг.", 8), - ("окт.", 10), - ("апр.", 4), - ("янв.", 1), - ("февр.", 2), - ("нояб.", 11), - ("дек.", 12), - ("июл.", 7), - ("июн.", 6), + ("янв", 1), + ("сент", 9), + ("авг", 8), + ("июн", 6), ("мая", 5), + ("апр", 4), + ("февр", 2), + ("дек", 12), + ("окт", 10), + ("июл", 7), + ("нояб", 11), + ("мар", 3), ], }, timeago_nd_tokens: ::phf::Map { @@ -5692,48 +5690,48 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sk => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 10121458955350035957, disps: &[ - (0, 14), + (0, 21), + (12, 8), + (25, 20), + (1, 2), (0, 0), - (0, 3), - (0, 5), - (5, 21), - (16, 5), - (4, 10), + (0, 10), + (1, 2), ], entries: &[ - ("mes.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mesiacmi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekúnd", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("hodinami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("týž.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dňa", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("r", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("rokom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("rokmi", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mesiacom", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("roka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("týždňami", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekúnd", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minútami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minútou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("dňom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minúty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("týždňa", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("r.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("dňami", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minút", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("týždňom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("rokmi", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("týž", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("týždňami", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("hodinami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("mesiaca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mesiacmi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("roka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minúta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minútou", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minút", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mesiacom", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("týždňom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("hodinou", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dňami", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("rokom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundy", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minúty", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minútami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("týždňa", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekundou", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dňa", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -5791,74 +5789,74 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sl => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 12913932095322966823, disps: &[ - (7, 9), + (4, 19), (0, 0), - (0, 3), - (0, 11), - (7, 26), - (0, 6), - (1, 17), + (0, 0), + (4, 0), + (15, 8), + (5, 16), + (9, 1), ], entries: &[ - ("tednom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("dnevom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mesecema", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekundama", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("leti", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("tednoma", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("dnevi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("letom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("letoma", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("minutama", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("tedni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ted.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("urama", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dnevoma", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("uro", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mes.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("tednoma", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("urami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("leti", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dnevoma", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mesecema", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("urama", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("uro", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("mesecem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("tednom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dnevom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("letoma", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("sekundama", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ted", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("urami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { key: 15467950696543387533, disps: &[ - (0, 5), - (2, 8), - (0, 0), + (3, 0), + (3, 4), + (0, 11), ], entries: &[ - ("jan.", 1), - ("jul.", 7), - ("avg.", 8), - ("mar.", 3), - ("jun.", 6), + ("apr", 4), + ("jan", 1), + ("jul", 7), + ("jun", 6), ("maj", 5), - ("feb.", 2), - ("apr.", 4), - ("nov.", 11), - ("okt.", 10), - ("sep.", 9), - ("dec.", 12), + ("mar", 3), + ("nov", 11), + ("feb", 2), + ("sep", 9), + ("dec", 12), + ("avg", 8), + ("okt", 10), ], }, timeago_nd_tokens: ::phf::Map { @@ -6001,34 +5999,34 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (1, 20), - (7, 11), - (5, 0), - (2, 5), - (1, 13), + (1, 2), + (0, 11), + (4, 0), + (6, 11), + (2, 3), ], entries: &[ - ("мин.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("дана", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("нед", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("д", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("године", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("недеља", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("сати", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("нед.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунде", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("недеље", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("сата", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("секунде", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("године", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("д.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("сати", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("мес.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("год.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("сек.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ч.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -6086,35 +6084,35 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::SrLatn => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 12913932095322966823, disps: &[ - (0, 0), - (4, 16), - (1, 12), - (4, 19), - (2, 15), + (1, 6), + (6, 3), + (5, 0), + (0, 7), + (1, 6), ], entries: &[ - ("meseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("god.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("nedelje", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sek.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("d.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("min.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ned", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("mes.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ned.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("č.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("č", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("meseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("nedelje", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("god", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("nedelja", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, @@ -6173,56 +6171,56 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sv => Entry { timeago_tokens: ::phf::Map { - key: 12213676231523076107, + key: 10121458955350035957, disps: &[ - (9, 3), - (6, 13), - (8, 17), - (1, 0), + (13, 5), + (15, 0), + (6, 0), + (0, 17), ], entries: &[ - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("månader", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("mån.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("veckor", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("timmar", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("månad", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("mån", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("vecka", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sekunder", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("tim", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("vecka", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("månad", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dag", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dagar", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("v.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("minuter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("år", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("veckor", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("timme", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("timmar", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("v", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuter", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("månader", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { key: 12913932095322966823, disps: &[ - (1, 5), - (2, 0), - (0, 3), + (0, 0), + (5, 5), + (4, 11), ], entries: &[ - ("juni", 6), - ("feb.", 2), - ("apr.", 4), - ("juli", 7), - ("sep.", 9), - ("nov.", 11), - ("aug.", 8), + ("sep", 9), + ("jan", 1), + ("okt", 10), + ("dec", 12), + ("nov", 11), + ("apr", 4), + ("feb", 2), ("mars", 3), - ("jan.", 1), - ("dec.", 12), - ("okt.", 10), + ("aug", 8), + ("juli", 7), ("maj", 5), + ("juni", 6), ], }, timeago_nd_tokens: ::phf::Map { @@ -6358,60 +6356,60 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ta => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 14108922650502679131, disps: &[ - (0, 6), - (3, 0), - (20, 14), - (4, 0), - (5, 17), + (2, 14), + (19, 10), + (0, 0), + (3, 12), + (12, 15), ], entries: &[ + ("ம\u{bbe}தத\u{bcd}துக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("விந\u{bbe}டிகள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ந\u{bbe}ளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ஆண\u{bcd}டிற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ம\u{bbe}தங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("விந\u{bbe}டிகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("மணி", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("வ\u{bbe}ர", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("வ\u{bbe}ரங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("வ\u{bbe}ரத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ஆண\u{bcd}டுகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("வ\u{bbe}ரங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("நிமி.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("நிமிடம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("நிமிடங\u{bcd}கள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ந\u{bbe}ளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("விந\u{bbe}டிகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("விந\u{bbe}.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ஆண\u{bcd}டிற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("மணிநேரம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("விந\u{bbe}டிகள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ம\u{bbe}த.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ம\u{bbe}த", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("விந\u{bbe}டி", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("நிமி", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("நிமிடங\u{bcd}கள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("விந\u{bbe}டிக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ந\u{bbe}ட\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("விந\u{bbe}டி", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ம\u{bbe}தத\u{bcd}துக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("நிமிடம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("நிமிடங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("வ\u{bbe}ர.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("மணி.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ம\u{bbe}தங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("விந\u{bbe}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 15467950696543387533, + key: 10121458955350035957, disps: &[ - (0, 6), - (7, 0), - (1, 0), + (0, 10), + (9, 8), + (3, 0), ], entries: &[ - ("ஜன.,", 1), - ("செப\u{bcd}.,", 9), - ("ஆக.,", 8), - ("ஜூன\u{bcd},", 6), - ("டிச.,", 12), - ("அக\u{bcd}.,", 10), - ("பிப\u{bcd}.,", 2), - ("நவ.,", 11), + ("ஆக,", 8), + ("பிப\u{bcd},", 2), + ("ஏப\u{bcd},", 4), + ("அக\u{bcd},", 10), + ("டிச,", 12), + ("நவ,", 11), ("ஜூலை,", 7), - ("ஏப\u{bcd}.,", 4), - ("ம\u{bbe}ர\u{bcd}.,", 3), + ("ம\u{bbe}ர\u{bcd},", 3), + ("ஜன,", 1), ("மே,", 5), + ("ஜூன\u{bcd},", 6), + ("செப\u{bcd},", 9), ], }, timeago_nd_tokens: ::phf::Map { @@ -6460,34 +6458,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Te => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 3599879742736855518, disps: &[ + (4, 0), (0, 0), - (2, 16), - (1, 2), - (3, 18), + (8, 4), + (8, 5), ], entries: &[ - ("స\u{c46}క.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("గంటల", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("న\u{c3f}మ\u{c3f}ష\u{c3e}లు", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("న\u{c46}ల", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("గం.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("సం.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("స\u{c46}కన\u{c4d}ల", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ర\u{c4b}జుల", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("స\u{c46}కను", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("సంవత\u{c4d}సరం", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("న\u{c3f}మ\u{c3f}ష\u{c3e}లు", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("న\u{c46}లల", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("న\u{c3f}మ\u{c3f}.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("గంట", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("సంవత\u{c4d}సర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ర\u{c4b}జు", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("వ\u{c3e}రం", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("వ\u{c3e}ర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("న\u{c3f}మ\u{c3f}ష\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("స\u{c46}కన\u{c4d}లు", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("న\u{c3f}మ\u{c3f}షం", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("వ\u{c3e}రం", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("గం", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("న\u{c3f}మ\u{c3f}ష\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ర\u{c4b}జుల", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("స\u{c46}కన\u{c4d}లు", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("స\u{c46}కను", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ర\u{c4b}జు", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("సంవత\u{c4d}సరం", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("వ\u{c3e}ర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("గంట", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("గంటల", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("స\u{c46}క", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("న\u{c3f}మ\u{c3f}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("సం", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("న\u{c46}ల", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("సంవత\u{c4d}సర\u{c3e}ల", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6560,53 +6558,53 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Th => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 7485420634051515786, disps: &[ - (0, 4), - (0, 0), - (5, 14), - (0, 15), + (1, 14), + (2, 0), + (1, 10), + (0, 11), ], entries: &[ ("ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ชม.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ว\u{e34}นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ว\u{e31}นท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ป\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("เด\u{e37}อนท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ว\u{e31}นท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("เด\u{e37}อนท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ช\u{e31}\u{e48}วโมงท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ป\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ว\u{e31}นท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ชม", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ว\u{e34}นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ว\u{e31}นท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("เด\u{e37}อนท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (1, 0), (2, 0), - (8, 8), + (2, 0), + (0, 11), ], entries: &[ - ("ต.ค.", 10), - ("ก.ค.", 7), - ("ธ.ค.", 12), - ("ม\u{e34}.ย.", 6), - ("ม.ค.", 1), - ("เม.ย.", 4), - ("ก.พ.", 2), - ("พ.ย.", 11), - ("ส.ค.", 8), - ("ม\u{e35}.ค.", 3), - ("ก.ย.", 9), - ("พ.ค.", 5), + ("สค", 8), + ("มค", 1), + ("ตค", 10), + ("ม\u{e34}ย", 6), + ("เมย", 4), + ("ม\u{e35}ค", 3), + ("กพ", 2), + ("กย", 9), + ("กค", 7), + ("ธค", 12), + ("พค", 5), + ("พย", 11), ], }, timeago_nd_tokens: ::phf::Map { @@ -6660,24 +6658,24 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Tr => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12913932095322966823, disps: &[ - (4, 4), + (4, 10), + (1, 0), (1, 0), - (2, 3), ], entries: &[ - ("saat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("hf.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("dakika", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("hafta", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("saniye", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dk.", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("yıl", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sn.", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sa.", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sn", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("hafta", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("hf", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dk", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("saniye", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("saat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dakika", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("gün", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sa", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6750,74 +6748,74 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Uk => Entry { timeago_tokens: ::phf::Map { - key: 8694567506910003252, + key: 15467950696543387533, disps: &[ - (0, 23), - (9, 17), - (0, 0), - (25, 6), - (13, 19), - (1, 11), + (0, 14), + (1, 5), + (10, 33), + (1, 10), + (4, 9), + (1, 0), (1, 24), ], entries: &[ - ("тиждень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("тижня", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("місяць", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("р.", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("місяці", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("хвилина", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("годину", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("годин", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("рік", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("року", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("години", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("днів", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("хвилини", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("тижні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("місяців", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("дн.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("років", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("хвилину", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("тижнів", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("хв", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("год", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("хвилин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("роки", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("місяця", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("години", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("тижня", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("тижні", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("міс.", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("тиж.", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("тиждень", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("тижнів", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("годину", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("року", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("місяців", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("годин", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("тиж", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("хв", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("р", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("місяця", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("хвилин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("роки", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("міс", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("років", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("хвилину", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("рік", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("місяць", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("дн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("дні", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("місяці", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("хвилина", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 15467950696543387533, + key: 10121458955350035957, disps: &[ - (2, 0), - (6, 7), - (0, 0), + (3, 5), + (3, 0), + (0, 11), ], entries: &[ - ("січ.", 1), - ("вер.", 9), - ("серп.", 8), - ("жовт.", 10), - ("трав.", 5), - ("груд.", 12), - ("черв.", 6), - ("квіт.", 4), - ("лип.", 7), - ("лист.", 11), - ("бер.", 3), - ("лют.", 2), + ("бер", 3), + ("лют", 2), + ("жовт", 10), + ("квіт", 4), + ("серп", 8), + ("вер", 9), + ("груд", 12), + ("черв", 6), + ("лип", 7), + ("січ", 1), + ("лист", 11), + ("трав", 5), ], }, timeago_nd_tokens: ::phf::Map { @@ -7317,38 +7315,38 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Zu => Entry { timeago_tokens: ::phf::Map { - key: 106375038446233661, + key: 10121458955350035957, disps: &[ - (0, 13), - (7, 20), - (6, 13), - (1, 0), - (21, 18), + (11, 21), + (0, 0), + (0, 3), + (1, 18), + (0, 16), ], entries: &[ - ("ezedlule.", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("inyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("amaviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("osukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ezingu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("elingu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("usuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("izinsuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("odlule", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("olungu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("unyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("amasekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ezinsukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("isekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("izinyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("iviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("amaminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ezingu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("unyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("usuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("inyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("evikini", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("olwedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("iminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("amaminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("iminyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("iviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ihora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("iminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ezedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("osukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("izinyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("izinsuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("olungu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("amaviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("amasekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("odlule", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ezinsukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("iminyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("elingu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], diff --git a/src/util/timeago.rs b/src/util/timeago.rs index 1069ffc..68a0923 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -133,12 +133,13 @@ impl From for OffsetDateTime { } } -fn filter_str(string: &str) -> String { +/// Prepare the datestring for parsing: lowercase and filter out unnecessary punctuation +fn filter_datestr(string: &str) -> String { string .to_lowercase() .chars() .filter_map(|c| { - if c == '\u{200b}' || c.is_ascii_digit() { + if matches!(c, '\u{200b}' | '.') || c.is_ascii_digit() { None } else if c == '-' { Some(' ') @@ -197,7 +198,7 @@ fn parse_textual_month(entry: &dictionary::Entry, filtered_str: &str) -> Option< /// Returns [`None`] if the date could not be parsed. pub fn parse_timeago(lang: Language, textual_date: &str) -> Option { let entry = dictionary::entry(lang); - let filtered_str = filter_str(textual_date); + let filtered_str = filter_datestr(textual_date); let qu: u8 = util::parse_numeric_prod(textual_date).unwrap_or(1); @@ -244,7 +245,7 @@ pub fn parse_timeago_dt_or_warn( pub fn parse_textual_date(lang: Language, textual_date: &str) -> Option { let entry = dictionary::entry(lang); let by_char = util::lang_by_char(lang); - let filtered_str = filter_str(textual_date); + let filtered_str = filter_datestr(textual_date); let nums = util::parse_numeric_vec::(textual_date); diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index 0138944..56f1630 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -3,39 +3,39 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "s.": "s", + "s": "s", "sekonde": "s", "sekondes": "s", - "min.": "m", + "min": "m", "minute": "m", "minuut": "m", - "u.": "h", + "u": "h", "uur": "h", "dae": "D", "dag": "D", - "w.": "W", + "w": "W", "week": "W", "weke": "W", "maand": "M", "maande": "M", - "md.": "M", - "j.": "Y", + "md": "M", + "j": "Y", "jaar": "Y" }, "date_order": "DY", "months": { - "jan.": 1, - "feb.": 2, - "mrt.": 3, - "apr.": 4, + "jan": 1, + "feb": 2, + "mrt": 3, + "apr": 4, "mei": 5, - "jun.": 6, - "jul.": 7, - "aug.": 8, - "sep.": 9, - "okt.": 10, - "nov.": 11, - "des.": 12 + "jun": 6, + "jul": 7, + "aug": 8, + "sep": 9, + "okt": 10, + "nov": 11, + "des": 12 }, "timeago_nd_tokens": { "vandag": "0D", @@ -294,12 +294,12 @@ "тыдні": "W", "тыдня": "W", "тыдняў": "W", - "мес.": "M", + "мес": "M", "месяц": "M", "месяца": "M", "месяцаў": "M", "месяцы": "M", - "г.": "Y", + "г": "Y", "гадоў": "Y", "гады": "Y", "год": "Y", @@ -356,13 +356,13 @@ "часа": "h", "ден": "D", "дни": "D", - "седм.": "W", + "седм": "W", "седмица": "W", "седмици": "W", - "м.": "M", + "м": "M", "месец": "M", "месеца": "M", - "г.": "Y", + "г": "Y", "година": "Y", "години": "Y" }, @@ -446,30 +446,30 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekunda": "s", "sekunde": "s", "sekundi": "s", "sekundu": "s", - "min.": "m", + "min": "m", "minuta": "m", "minute": "m", "minutu": "m", "sat": "h", "sata": "h", "sati": "h", - "d.": "D", + "d": "D", "dan": "D", "dana": "D", - "sed.": "W", + "sed": "W", "sedmica": "W", "sedmice": "W", "sedmicu": "W", - "mj.": "M", + "mj": "M", "mjesec": "M", "mjeseca": "M", "mjeseci": "M", - "god.": "Y", + "god": "Y", "godina": "Y", "godine": "Y", "godinu": "Y" @@ -525,7 +525,7 @@ "hores": "h", "dia": "D", "dies": "D", - "setm.": "W", + "setm": "W", "setmana": "W", "setmanes": "W", "mes": "M", @@ -535,18 +535,18 @@ }, "date_order": "DY", "months": { - "gen.": 1, - "febr.": 2, + "gen": 1, + "febr": 2, "març": 3, - "d’abr.": 4, + "d’abr": 4, "maig": 5, "juny": 6, - "jul.": 7, - "d’ag.": 8, - "set.": 9, - "d’oct.": 10, - "nov.": 11, - "des.": 12 + "jul": 7, + "d’ag": 8, + "set": 9, + "d’oct": 10, + "nov": 11, + "des": 12 }, "timeago_nd_tokens": { "avui": "0D", @@ -591,17 +591,17 @@ "dne": "D", "dnem": "D", "dny": "D", - "týd.": "W", + "týd": "W", "týdne": "W", "týdnem": "W", "týdny": "W", - "měs.": "M", + "měs": "M", "měsíce": "M", "měsícem": "M", "měsíci": "M", - "l.": "Y", + "l": "Y", "lety": "Y", - "r.": "Y", + "r": "Y", "rokem": "Y", "roku": "Y", "roky": "Y" @@ -631,10 +631,10 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekund": "s", "sekunder": "s", - "min.": "m", + "min": "m", "minut": "m", "minutter": "m", "time": "h", @@ -645,24 +645,24 @@ "uger": "W", "måned": "M", "måneder": "M", - "md.": "M", - "mdr.": "M", + "md": "M", + "mdr": "M", "år": "Y" }, "date_order": "DY", "months": { - "jan.": 1, - "feb.": 2, - "mar.": 3, - "apr.": 4, + "jan": 1, + "feb": 2, + "mar": 3, + "apr": 4, "maj": 5, - "jun.": 6, - "jul.": 7, - "aug.": 8, - "sep.": 9, - "okt.": 10, - "nov.": 11, - "dec.": 12 + "jun": 6, + "jul": 7, + "aug": 8, + "sep": 9, + "okt": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -688,13 +688,13 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekunde": "s", "sekunden": "s", - "min.": "m", + "min": "m", "minute": "m", "minuten": "m", - "std.": "h", + "std": "h", "stunde": "h", "stunden": "h", "tag": "D", @@ -732,19 +732,19 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "δευτ.": "s", + "δευτ": "s", "δευτερόλεπτα": "s", "δευτερόλεπτο": "s", - "λεπ.": "m", + "λεπ": "m", "λεπτά": "m", "λεπτό": "m", - "ώ.": "h", + "ώ": "h", "ώρα": "h", "ώρες": "h", - "ημ.": "D", + "ημ": "D", "ημέρα": "D", "ημέρες": "D", - "εβδ.": "W", + "εβδ": "W", "εβδομάδα": "W", "εβδομάδες": "W", "μήνα": "M", @@ -876,7 +876,7 @@ "d": "D", "día": "D", "días": "D", - "sem.": "W", + "sem": "W", "semana": "W", "semanas": "W", "m": "M", @@ -935,7 +935,7 @@ "horas": "h", "día": "D", "días": "D", - "sem.": "W", + "sem": "W", "semana": "W", "semanas": "W", "m": "M", @@ -1054,18 +1054,18 @@ }, "date_order": "YD", "months": { - "urt.": 1, - "ots.": 2, - "mar.": 3, - "api.": 4, - "mai.": 5, - "eka.": 6, - "uzt.": 7, - "abu.": 8, - "ira.": 9, - "urr.": 10, - "aza.": 11, - "abe.": 12 + "urt": 1, + "ots": 2, + "mar": 3, + "api": 4, + "mai": 5, + "eka": 6, + "uzt": 7, + "abu": 8, + "ira": 9, + "urr": 10, + "aza": 11, + "abe": 12 }, "timeago_nd_tokens": { "gaur": "0D", @@ -1189,9 +1189,9 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "seg.": "s", + "seg": "s", "segundo": "s", - "min.": "m", + "min": "m", "minuto": "m", "oras": "h", "araw": "D", @@ -1252,29 +1252,29 @@ "j": "D", "jour": "D", "jours": "D", - "sem.": "W", + "sem": "W", "semaine": "W", "semaines": "W", - "m.": "M", + "m": "M", "mois": "M", "an": "Y", "ans": "Y" }, "date_order": "DY", "months": { - "janv.": 1, - "févr.": 2, + "janv": 1, + "févr": 2, "mars": 3, - "avr.": 4, + "avr": 4, "mai": 5, "juin": 6, - "juil.": 7, - "juill.": 7, + "juil": 7, + "juill": 7, "août": 8, - "sept.": 9, - "oct.": 10, - "nov.": 11, - "déc.": 12 + "sept": 9, + "oct": 10, + "nov": 11, + "déc": 12 }, "timeago_nd_tokens": { "aujourd'hui": "0D", @@ -1315,7 +1315,7 @@ "horas": "h", "día": "D", "días": "D", - "sem.": "W", + "sem": "W", "semana": "W", "semanas": "W", "mes": "M", @@ -1325,18 +1325,18 @@ }, "date_order": "DY", "months": { - "xan.": 1, - "feb.": 2, - "mar.": 3, - "abr.": 4, + "xan": 1, + "feb": 2, + "mar": 3, + "abr": 4, "maio": 5, "xuño": 6, - "xul.": 7, - "ago.": 8, - "set.": 9, - "out.": 10, - "nov.": 11, - "dec.": 12 + "xul": 7, + "ago": 8, + "set": 9, + "out": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "hoxe": "0D", @@ -1365,7 +1365,7 @@ "મિનિટ": "m", "કલાક": "h", "દિવસ": "D", - "અઠ.": "W", + "અઠ": "W", "અઠવાડિયા": "W", "મહિના": "M", "વર્ષ": "Y" @@ -1476,15 +1476,15 @@ "sati": "h", "dan": "D", "dana": "D", - "tj.": "W", + "tj": "W", "tjedan": "W", "tjedana": "W", "tjedna": "W", - "mj.": "M", + "mj": "M", "mjesec": "M", "mjeseca": "M", "mjeseci": "M", - "g.": "Y", + "g": "Y", "godina": "Y", "godine": "Y", "godinu": "Y" @@ -1548,18 +1548,18 @@ }, "date_order": "YD", "months": { - "jan.": 1, - "febr.": 2, - "márc.": 3, - "ápr.": 4, - "máj.": 5, - "jún.": 6, - "júl.": 7, - "aug.": 8, - "szept.": 9, - "okt.": 10, - "nov.": 11, - "dec.": 12 + "jan": 1, + "febr": 2, + "márc": 3, + "ápr": 4, + "máj": 5, + "jún": 6, + "júl": 7, + "aug": 8, + "szept": 9, + "okt": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "ma": "0D", @@ -1694,24 +1694,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekúnda": "s", "sekúndu": "s", "sekúndum": "s", "sekúndur": "s", - "mín.": "m", + "mín": "m", "mínúta": "m", "mínútu": "m", "mínútum": "m", "mínútur": "m", - "klst.": "h", + "klst": "h", "klukkustund": "h", "klukkustundum": "h", "degi": "D", "dögum": "D", "viku": "W", "vikum": "W", - "mán.": "M", + "mán": "M", "mánuði": "M", "mánuðum": "M", "ári": "Y", @@ -1719,18 +1719,18 @@ }, "date_order": "DY", "months": { - "jan.": 1, - "feb.": 2, - "mar.": 3, - "apr.": 4, + "jan": 1, + "feb": 2, + "mar": 3, + "apr": 4, "maí": 5, - "jún.": 6, - "júl.": 7, - "ágú.": 8, - "sep.": 9, - "okt.": 10, - "nóv.": 11, - "des.": 12 + "jún": 6, + "júl": 7, + "ágú": 8, + "sep": 9, + "okt": 10, + "nóv": 11, + "des": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -1759,7 +1759,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sec.": "s", + "sec": "s", "secondi": "s", "secondo": "s", "min": "m", @@ -1772,7 +1772,7 @@ "gg": "D", "giorni": "D", "giorno": "D", - "sett.": "W", + "sett": "W", "settimana": "W", "settimane": "W", "mese": "M", @@ -1926,25 +1926,25 @@ "საათის": "h", "სთ": "h", "დღის": "D", - "კვ.": "W", + "კვ": "W", "კვირის": "W", "თვის": "M", "წლის": "Y" }, "date_order": "DY", "months": { - "იან.": 1, - "თებ.": 2, - "მარ.": 3, - "აპრ.": 4, - "მაი.": 5, - "ივნ.": 6, - "ივლ.": 7, - "აგვ.": 8, - "სექ.": 9, - "ოქტ.": 10, - "ნოე.": 11, - "დეკ.": 12 + "იან": 1, + "თებ": 2, + "მარ": 3, + "აპრ": 4, + "მაი": 5, + "ივნ": 6, + "ივლ": 7, + "აგვ": 8, + "სექ": 9, + "ოქტ": 10, + "ნოე": 11, + "დეკ": 12 }, "timeago_nd_tokens": { "დღეს": "0D", @@ -1971,33 +1971,33 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "сек.": "s", + "сек": "s", "секунд": "s", - "мин.": "m", + "мин": "m", "минут": "m", - "сағ.": "h", + "сағ": "h", "сағат": "h", "күн": "D", - "ап.": "W", + "ап": "W", "апта": "W", "ай": "M", - "ж.": "Y", + "ж": "Y", "жыл": "Y" }, "date_order": "YD", "months": { - "қаң.": 1, - "ақп.": 2, - "нау.": 3, - "сәу.": 4, - "мам.": 5, - "мау.": 6, - "шіл.": 7, - "там.": 8, - "қыр.": 9, - "қаз.": 10, - "қар.": 11, - "жел.": 12 + "қаң": 1, + "ақп": 2, + "нау": 3, + "сәу": 4, + "мам": 5, + "мау": 6, + "шіл": 7, + "там": 8, + "қыр": 9, + "қаз": 10, + "қар": 11, + "жел": 12 }, "timeago_nd_tokens": { "бүгін": "0D", @@ -2166,32 +2166,31 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "сек.": "s", + "сек": "s", "секунд": "s", - "мүн.": "m", + "мүн": "m", "мүнөт": "m", "саат": "h", - "саат.": "h", "күн": "D", - "апт.": "W", + "апт": "W", "апта": "W", "ай": "M", "жыл": "Y" }, "date_order": "YD", "months": { - "янв.": 1, - "фев.": 2, - "мар.": 3, - "апр.": 4, + "янв": 1, + "фев": 2, + "мар": 3, + "апр": 4, "май": 5, - "июн.": 6, - "июл.": 7, - "авг.": 8, - "сен.": 9, - "окт.": 10, - "ноя.": 11, - "дек.": 12 + "июн": 6, + "июл": 7, + "авг": 8, + "сен": 9, + "окт": 10, + "ноя": 11, + "дек": 12 }, "timeago_nd_tokens": { "бүгүн": "0D", @@ -2218,35 +2217,35 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ວິ.": "s", + "ວິ": "s", "ວິນາທີ": "s", "ວິນາທີກ່ອນ": "s", - "ນທ.": "m", + "ນທ": "m", "ນາທີ": "m", "ນາທີກ່ອນ": "m", - "ຊມ.": "h", + "ຊມ": "h", "ຊົ່ວໂມງກ່ອນ": "h", "ມື້ກ່ອນ": "D", - "ອທ.": "W", + "ອທ": "W", "ອາທິດກ່ອນ": "W", - "ດ.": "M", + "ດ": "M", "ເດືອນກ່ອນ": "M", "ປີກ່ອນ": "Y" }, "date_order": "DY", "months": { - "ມ.ກ.": 1, - "ກ.ພ.": 2, - "ມ.ນ.": 3, - "ມ.ສ.": 4, - "ພ.ພ.": 5, - "ມິ.ຖ.": 6, - "ກ.ລ.": 7, - "ສ.ຫ.": 8, - "ກ.ຍ.": 9, - "ຕ.ລ.": 10, - "ພ.ຈ.": 11, - "ທ.ວ.": 12 + "ມກ": 1, + "ກພ": 2, + "ມນ": 3, + "ມສ": 4, + "ພພ": 5, + "ມິຖ": 6, + "ກລ": 7, + "ສຫ": 8, + "ກຍ": 9, + "ຕລ": 10, + "ພຈ": 11, + "ທວ": 12 }, "timeago_nd_tokens": { "ອັບເດດມື້ນີ້": "0D", @@ -2274,39 +2273,39 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekundė": "s", "sekundę": "s", "sekundes": "s", "sekundės": "s", "sekundžių": "s", - "min.": "m", + "min": "m", "minučių": "m", "minutė": "m", "minutę": "m", "minutes": "m", "minutės": "m", - "val.": "h", + "val": "h", "valandą": "h", "valandas": "h", "valandos": "h", "valandų": "h", - "d.": "D", + "d": "D", "dieną": "D", "dienas": "D", "dienos": "D", "dienų": "D", - "sav.": "W", + "sav": "W", "savaičių": "W", "savaitę": "W", "savaites": "W", "savaitės": "W", - "mėn.": "M", + "mėn": "M", "mėnesį": "M", "mėnesio": "M", "mėnesių": "M", "mėnesius": "M", - "m.": "Y", + "m": "Y", "metų": "Y", "metus": "Y" }, @@ -2337,46 +2336,46 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekunde": "s", "sekundēm": "s", "sekundes": "s", "sekunžu": "s", - "min.": "m", + "min": "m", "minūšu": "m", "minūte": "m", "minūtēm": "m", "minūtes": "m", - "st.": "h", + "st": "h", "stundām": "h", "stundas": "h", - "d.": "D", + "d": "D", "dienām": "D", "dienas": "D", - "ned.": "W", + "ned": "W", "nedēļām": "W", "nedēļas": "W", - "mēn.": "M", + "mēn": "M", "mēneša": "M", "mēnešiem": "M", - "g.": "Y", + "g": "Y", "gada": "Y", "gadiem": "Y" }, "date_order": "YD", "months": { - "janv.": 1, - "febr.": 2, + "janv": 1, + "febr": 2, "marts": 3, - "apr.": 4, + "apr": 4, "maijs": 5, - "jūn.": 6, - "jūl.": 7, - "aug.": 8, - "sept.": 9, - "okt.": 10, - "nov.": 11, - "dec.": 12 + "jūn": 6, + "jūl": 7, + "aug": 8, + "sept": 9, + "okt": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "šodien": "0D", @@ -2403,10 +2402,10 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "сек.": "s", + "сек": "s", "секунда": "s", "секунди": "s", - "мин.": "m", + "мин": "m", "минута": "m", "минути": "m", "час": "h", @@ -2417,7 +2416,7 @@ "седмици": "W", "месец": "M", "месеци": "M", - "год.": "Y", + "год": "Y", "година": "Y", "години": "Y" }, @@ -2537,11 +2536,11 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "से.": "s", + "से": "s", "सेकंद": "s", "सेकंदापूर्वी": "s", "सेकंदांपूर्वी": "s", - "मिनि.": "m", + "मिनि": "m", "मिनिट": "m", "मिनिटापूर्वी": "m", "मिनिटांपूर्वी": "m", @@ -2754,10 +2753,10 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sec.": "s", + "sec": "s", "seconde": "s", "seconden": "s", - "min.": "m", + "min": "m", "minuten": "m", "minuut": "m", "uur": "h", @@ -2818,34 +2817,34 @@ "t": "h", "time": "h", "timer": "h", - "d.": "D", + "d": "D", "dag": "D", "dager": "D", "døgn": "D", - "u.": "W", + "u": "W", "uke": "W", "uker": "W", "måned": "M", "måneder": "M", - "md.": "M", + "md": "M", "år": "Y" }, "date_order": "DY", "months": { - "jan.": 1, - "feb.": 2, - "mar.": 3, - "apr.": 4, + "jan": 1, + "feb": 2, + "mar": 3, + "apr": 4, "mai": 5, - "jun.": 6, + "jun": 6, "juni": 6, - "jul.": 7, + "jul": 7, "juli": 7, - "aug.": 8, - "sep.": 9, - "okt.": 10, - "nov.": 11, - "des.": 12 + "aug": 8, + "sep": 9, + "okt": 10, + "nov": 11, + "des": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -2872,19 +2871,19 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "ସେ.": "s", + "ସେ": "s", "ସେକେଣ୍ଡ": "s", - "ମି.": "m", + "ମି": "m", "ମିନିଟ୍": "m", "ମିନିଟ୍‌": "m", - "ଘ.": "h", + "ଘ": "h", "ଘଣ୍ଟା": "h", "ଦିନ": "D", - "ସପ୍ତା.": "W", + "ସପ୍ତା": "W", "ସପ୍ତାହ": "W", - "ମା.": "M", + "ମା": "M", "ମାସ": "M", - "ବ.": "Y", + "ବ": "Y", "ବର୍ଷ": "Y" }, "date_order": "DY", @@ -2985,7 +2984,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekund": "s", "sekunda": "s", "sekundę": "s", @@ -2995,20 +2994,20 @@ "minuta": "m", "minutę": "m", "minuty": "m", - "godz.": "h", + "godz": "h", "godzin": "h", "godzinę": "h", "godziny": "h", "dni": "D", "dnia": "D", "dzień": "D", - "tydz.": "W", + "tydz": "W", "tydzień": "W", - "tyg.": "W", + "tyg": "W", "tygodni": "W", "tygodnia": "W", "tygodnie": "W", - "mies.": "M", + "mies": "M", "miesiąc": "M", "miesiąca": "M", "miesiące": "M", @@ -3058,10 +3057,10 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "seg.": "s", + "seg": "s", "segundo": "s", "segundos": "s", - "min.": "m", + "min": "m", "minuto": "m", "minutos": "m", "h": "h", @@ -3069,7 +3068,7 @@ "horas": "h", "dia": "D", "dias": "D", - "sem.": "W", + "sem": "W", "semana": "W", "semanas": "W", "mês": "M", @@ -3079,18 +3078,18 @@ }, "date_order": "DY", "months": { - "jan.": 1, - "fev.": 2, - "mar.": 3, - "abr.": 4, - "mai.": 5, - "jun.": 6, - "jul.": 7, - "ago.": 8, - "set.": 9, - "out.": 10, - "nov.": 11, - "dez.": 12 + "jan": 1, + "fev": 2, + "mar": 3, + "abr": 4, + "mai": 5, + "jun": 6, + "jul": 7, + "ago": 8, + "set": 9, + "out": 10, + "nov": 11, + "dez": 12 }, "timeago_nd_tokens": { "hoje": "0D", @@ -3128,7 +3127,7 @@ "horas": "h", "dia": "D", "dias": "D", - "sem.": "W", + "sem": "W", "semana": "W", "semanas": "W", "mês": "M", @@ -3161,10 +3160,10 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sec.": "s", + "sec": "s", "secundă": "s", "secunde": "s", - "min.": "m", + "min": "m", "minut": "m", "minute": "m", "h": "h", @@ -3172,7 +3171,7 @@ "ore": "h", "zi": "D", "zile": "D", - "săpt.": "W", + "săpt": "W", "săptămână": "W", "săptămâni": "W", "lună": "M", @@ -3182,18 +3181,18 @@ }, "date_order": "DY", "months": { - "ian.": 1, - "feb.": 2, - "mar.": 3, - "apr.": 4, + "ian": 1, + "feb": 2, + "mar": 3, + "apr": 4, "mai": 5, - "iun.": 6, - "iul.": 7, - "aug.": 8, - "sept.": 9, - "oct.": 10, - "nov.": 11, - "dec.": 12 + "iun": 6, + "iul": 7, + "aug": 8, + "sept": 9, + "oct": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "astăzi": "0D", @@ -3220,12 +3219,12 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "сек.": "s", + "сек": "s", "секунд": "s", "секунда": "s", "секунду": "s", "секунды": "s", - "мин.": "m", + "мин": "m", "минут": "m", "минута": "m", "минуту": "m", @@ -3235,37 +3234,37 @@ "часа": "h", "часов": "h", "день": "D", - "дн.": "D", + "дн": "D", "дней": "D", "дня": "D", - "нед.": "W", + "нед": "W", "недели": "W", "недель": "W", "неделю": "W", - "мес.": "M", + "мес": "M", "месяц": "M", "месяца": "M", "месяцев": "M", - "г.": "Y", + "г": "Y", "год": "Y", "года": "Y", - "л.": "Y", + "л": "Y", "лет": "Y" }, "date_order": "DY", "months": { - "янв.": 1, - "февр.": 2, - "мар.": 3, - "апр.": 4, + "янв": 1, + "февр": 2, + "мар": 3, + "апр": 4, "мая": 5, - "июн.": 6, - "июл.": 7, - "авг.": 8, - "сент.": 9, - "окт.": 10, - "нояб.": 11, - "дек.": 12 + "июн": 6, + "июл": 7, + "авг": 8, + "сент": 9, + "окт": 10, + "нояб": 11, + "дек": 12 }, "timeago_nd_tokens": { "сегодня": "0D", @@ -3353,19 +3352,19 @@ "h": "h", "hodinami": "h", "hodinou": "h", - "d.": "D", + "d": "D", "dňa": "D", "dňami": "D", "dňom": "D", - "týž.": "W", + "týž": "W", "týždňa": "W", "týždňami": "W", "týždňom": "W", - "mes.": "M", + "mes": "M", "mesiaca": "M", "mesiacmi": "M", "mesiacom": "M", - "r.": "Y", + "r": "Y", "roka": "Y", "rokmi": "Y", "rokom": "Y" @@ -3405,7 +3404,7 @@ "sekunde": "s", "sekundi": "s", "sekundo": "s", - "min.": "m", + "min": "m", "minut": "m", "minuta": "m", "minutama": "m", @@ -3420,11 +3419,11 @@ "dnevi": "D", "dnevom": "D", "dnevoma": "D", - "ted.": "W", + "ted": "W", "tedni": "W", "tednom": "W", "tednoma": "W", - "mes.": "M", + "mes": "M", "mesecem": "M", "mesecema": "M", "meseci": "M", @@ -3434,18 +3433,18 @@ }, "date_order": "DY", "months": { - "jan.": 1, - "feb.": 2, - "mar.": 3, - "apr.": 4, + "jan": 1, + "feb": 2, + "mar": 3, + "apr": 4, "maj": 5, - "jun.": 6, - "jul.": 7, - "avg.": 8, - "sep.": 9, - "okt.": 10, - "nov.": 11, - "dec.": 12 + "jun": 6, + "jul": 7, + "avg": 8, + "sep": 9, + "okt": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "danes": "0D", @@ -3525,25 +3524,25 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "сек.": "s", + "сек": "s", "секунда": "s", "секунде": "s", "секунди": "s", - "мин.": "m", + "мин": "m", "минут": "m", "минута": "m", "сата": "h", "сати": "h", - "ч.": "h", - "д.": "D", + "ч": "h", + "д": "D", "дана": "D", - "нед.": "W", + "нед": "W", "недеља": "W", "недеље": "W", - "мес.": "M", + "мес": "M", "месеца": "M", "месеци": "M", - "год.": "Y", + "год": "Y", "година": "Y", "године": "Y" }, @@ -3574,25 +3573,25 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "sek.": "s", + "sek": "s", "sekunda": "s", "sekunde": "s", "sekundi": "s", - "min.": "m", + "min": "m", "minut": "m", "minuta": "m", - "č.": "h", + "č": "h", "sata": "h", "sati": "h", - "d.": "D", + "d": "D", "dana": "D", - "ned.": "W", + "ned": "W", "nedelja": "W", "nedelje": "W", - "mes.": "M", + "mes": "M", "meseca": "M", "meseci": "M", - "god.": "Y", + "god": "Y", "godina": "Y", "godine": "Y" }, @@ -3635,28 +3634,28 @@ "d": "D", "dag": "D", "dagar": "D", - "v.": "W", + "v": "W", "vecka": "W", "veckor": "W", - "mån.": "M", + "mån": "M", "månad": "M", "månader": "M", "år": "Y" }, "date_order": "DY", "months": { - "jan.": 1, - "feb.": 2, + "jan": 1, + "feb": 2, "mars": 3, - "apr.": 4, + "apr": 4, "maj": 5, "juni": 6, "juli": 7, - "aug.": 8, - "sep.": 9, - "okt.": 10, - "nov.": 11, - "dec.": 12 + "aug": 8, + "sep": 9, + "okt": 10, + "nov": 11, + "dec": 12 }, "timeago_nd_tokens": { "dag": "0D", @@ -3732,24 +3731,24 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "விநா.": "s", + "விநா": "s", "விநாடி": "s", "விநாடிகளுக்கு": "s", "விநாடிகள்": "s", "விநாடிக்கு": "s", - "நிமி.": "m", + "நிமி": "m", "நிமிடங்களுக்கு": "m", "நிமிடங்கள்": "m", "நிமிடத்திற்கு": "m", "நிமிடம்": "m", - "மணி.": "h", + "மணி": "h", "மணிநேரம்": "h", "நாட்களுக்கு": "D", "நாளுக்கு": "D", - "வார.": "W", + "வார": "W", "வாரங்களுக்கு": "W", "வாரத்திற்கு": "W", - "மாத.": "M", + "மாத": "M", "மாதங்களுக்கு": "M", "மாதத்துக்கு": "M", "ஆண்டிற்கு": "Y", @@ -3757,18 +3756,18 @@ }, "date_order": "DY", "months": { - "ஜன.,": 1, - "பிப்.,": 2, - "மார்.,": 3, - "ஏப்.,": 4, + "ஜன,": 1, + "பிப்,": 2, + "மார்,": 3, + "ஏப்,": 4, "மே,": 5, "ஜூன்,": 6, "ஜூலை,": 7, - "ஆக.,": 8, - "செப்.,": 9, - "அக்.,": 10, - "நவ.,": 11, - "டிச.,": 12 + "ஆக,": 8, + "செப்,": 9, + "அக்,": 10, + "நவ,": 11, + "டிச,": 12 }, "timeago_nd_tokens": { "இன்று": "0D", @@ -3794,15 +3793,15 @@ "equivalent": [], "by_char": false, "timeago_tokens": { - "సెక.": "s", + "సెక": "s", "సెకను": "s", "సెకన్ల": "s", "సెకన్లు": "s", - "నిమి.": "m", + "నిమి": "m", "నిమిషం": "m", "నిమిషాల": "m", "నిమిషాలు": "m", - "గం.": "h", + "గం": "h", "గంట": "h", "గంటల": "h", "రోజు": "D", @@ -3811,7 +3810,7 @@ "వారాల": "W", "నెల": "M", "నెలల": "M", - "సం.": "Y", + "సం": "Y", "సంవత్సరం": "Y", "సంవత్సరాల": "Y" }, @@ -3861,7 +3860,7 @@ "นาที": "m", "นาทีที่ผ่านมา": "m", "นาทีที่แล้ว": "m", - "ชม.": "h", + "ชม": "h", "ชั่วโมงที่ผ่านมา": "h", "ที่แล้ว": "h", "วันที่ผ่านมา": "D", @@ -3874,18 +3873,18 @@ }, "date_order": "DY", "months": { - "ม.ค.": 1, - "ก.พ.": 2, - "มี.ค.": 3, - "เม.ย.": 4, - "พ.ค.": 5, - "มิ.ย.": 6, - "ก.ค.": 7, - "ส.ค.": 8, - "ก.ย.": 9, - "ต.ค.": 10, - "พ.ย.": 11, - "ธ.ค.": 12 + "มค": 1, + "กพ": 2, + "มีค": 3, + "เมย": 4, + "พค": 5, + "มิย": 6, + "กค": 7, + "สค": 8, + "กย": 9, + "ตค": 10, + "พย": 11, + "ธค": 12 }, "timeago_nd_tokens": { "อัปเดตแล้ววันนี้": "0D", @@ -3916,14 +3915,14 @@ "by_char": false, "timeago_tokens": { "saniye": "s", - "sn.": "s", + "sn": "s", "dakika": "m", - "dk.": "m", - "sa.": "h", + "dk": "m", + "sa": "h", "saat": "h", "gün": "D", "hafta": "W", - "hf.": "W", + "hf": "W", "ay": "M", "yıl": "Y" }, @@ -3982,21 +3981,21 @@ "години": "h", "годину": "h", "день": "D", - "дн.": "D", + "дн": "D", "дні": "D", "днів": "D", "дня": "D", - "тиж.": "W", + "тиж": "W", "тиждень": "W", "тижні": "W", "тижнів": "W", "тижня": "W", - "міс.": "M", + "міс": "M", "місяці": "M", "місяців": "M", "місяць": "M", "місяця": "M", - "р.": "Y", + "р": "Y", "рік": "Y", "роки": "Y", "років": "Y", @@ -4004,18 +4003,18 @@ }, "date_order": "DY", "months": { - "січ.": 1, - "лют.": 2, - "бер.": 3, - "квіт.": 4, - "трав.": 5, - "черв.": 6, - "лип.": 7, - "серп.": 8, - "вер.": 9, - "жовт.": 10, - "лист.": 11, - "груд.": 12 + "січ": 1, + "лют": 2, + "бер": 3, + "квіт": 4, + "трав": 5, + "черв": 6, + "лип": 7, + "серп": 8, + "вер": 9, + "жовт": 10, + "лист": 11, + "груд": 12 }, "timeago_nd_tokens": { "сьогодні": "0D", @@ -4283,7 +4282,7 @@ "iminithi": "m", "emahoreni": "h", "ihora": "h", - "ezedlule.": "D", + "ezedlule": "D", "ezingu": "D", "ezinsukwini": "D", "izinsuku": "D", diff --git a/testfiles/dict/format_dict.js b/testfiles/dict/format_dict.js index 5a6895a..dfaf426 100644 --- a/testfiles/dict/format_dict.js +++ b/testfiles/dict/format_dict.js @@ -57,4 +57,4 @@ for (const [mainLang, entry] of Object.entries(dict)) { } } -fs.writeFileSync(DICT_PATH, JSON.stringify(dict, null, 2)); +fs.writeFileSync(DICT_PATH, JSON.stringify(dict, null, 2) + "\n"); From a13262a2730bab14e8b7f293e5512645e3d7a7fb Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 15 Nov 2023 01:15:08 +0100 Subject: [PATCH 067/459] fix: update dictionary --- src/util/dictionary.rs | 926 +++++++++++++++++---------------- testfiles/dict/dictionary.json | 38 ++ 2 files changed, 522 insertions(+), 442 deletions(-) diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index b4b9558..789269b 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -154,31 +154,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Am => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 14108922650502679131, disps: &[ - (2, 11), - (2, 2), - (8, 4), - (0, 0), + (6, 0), + (8, 8), + (1, 15), + (6, 2), ], entries: &[ - ("ደቂቃ፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ሳምንታት", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ወራት", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ሰከንድ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ሳምንት", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ሰዓቶች", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ቀን", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ደቂቃዎች", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ሰዓት", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ሰከንድ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ሳምንታት", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ዓመት", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ሰዓቶች", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ወራት", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ዓመታት", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ሰከንዶች", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ቀናት", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ወር", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ቀኖች", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ደቂቃ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ደቂቃዎች፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ሳምንት", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ሰዓት", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ሰዓ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ሰከንዶች", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ወር", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ደቂቃዎች", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ሰከ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ደቂቃ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ደቂቃ፣", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ቀኖች", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ቀናት", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -432,19 +434,21 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Az => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 12913932095322966823, disps: &[ - (5, 0), - (1, 0), + (4, 0), + (8, 1), ], entries: &[ - ("dəqiqə", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("saniyə", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("il", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("həftə", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("dəq", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("gün", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("saat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("dəqiqə", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("il", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("saniyə", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("san", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1290,33 +1294,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::El => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 399332969041170284, disps: &[ (0, 0), - (17, 9), - (2, 12), - (9, 15), + (1, 10), + (3, 15), + (0, 0), ], entries: &[ - ("έτος", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("εβδομάδα", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("λεπ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ημέρες", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("εβδ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("έτη", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("μήνες", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("μήνα", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ημέρα", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ώρες", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("λεπτό", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("δευτερόλεπτα", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("δευτερόλεπτο", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ώ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("εβδομάδες", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("λεπτό", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("έτη", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("δευτ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ώρα", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("εβδομάδα", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("μήνες", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("έτος", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("εβδομάδες", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ημέρες", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("λεπ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("λ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("εβδ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ημέρα", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("δευτερόλεπτα", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ώρες", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ημ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ώ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("μήνα", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ώρα", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1391,40 +1396,42 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 7485420634051515786, disps: &[ - (5, 3), - (1, 24), - (1, 16), - (0, 2), + (5, 8), + (1, 23), + (2, 11), + (11, 4), (0, 0), - (3, 22), + (0, 16), ], entries: &[ - ("years", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("m", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("y", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("seconds", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("day", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("yr", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hours", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mo", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("weeks", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("wk", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hr", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("year", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("w", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("hour", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("month", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("months", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("days", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("week", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("day", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("seconds", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutes", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("month", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("yr", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("years", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("year", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("hr", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("secs", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mins", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("months", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("y", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mo", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("w", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("weeks", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("wk", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("m", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("hour", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("hours", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -1794,19 +1801,22 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Eu => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 8694567506910003252, disps: &[ - (0, 0), - (1, 5), + (5, 9), + (1, 0), ], entries: &[ + ("ordu", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("hilabete", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("egun", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("urte", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("aste", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("minutu", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ordu", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("urte", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("egun", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("hilabete", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -2620,30 +2630,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Hu => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (14, 3), - (2, 0), - (1, 0), - (3, 6), + (6, 1), + (3, 0), + (1, 5), + (0, 12), ], entries: &[ - ("másodperc", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("perc", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("másodperce", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("órája", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("hete", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("nappal", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("perccel", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("perce", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("másodperccel", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("évvel", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("éve", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("héttel", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("órával", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("hónappal", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("perce", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ó", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("évvel", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("másodperccel", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("perc", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("órája", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("héttel", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("hónapja", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("nappal", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("hete", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("perccel", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("p", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("mp", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("másodperc", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("napja", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("másodperce", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("éve", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("órával", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -3005,34 +3018,36 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::It => Entry { timeago_tokens: ::phf::Map { - key: 106375038446233661, + key: 10121458955350035957, disps: &[ - (5, 0), - (7, 19), - (7, 1), - (19, 15), + (2, 3), + (1, 0), + (7, 2), + (0, 3), + (7, 12), ], entries: &[ - ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("secondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("settimana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sett", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("anno", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("giorni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("anno", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("mese", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("giorni", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("anni", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("g", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("gg", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("mesi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("giorno", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("settimane", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("gg", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sett", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mese", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("settimana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("secondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("g", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("anni", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("giorno", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mesi", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -3104,40 +3119,42 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Iw => Entry { timeago_tokens: ::phf::Map { - key: 2980949210194914378, + key: 8694567506910003252, disps: &[ - (1, 24), - (1, 11), - (2, 0), - (23, 19), - (16, 16), + (0, 0), + (0, 8), + (0, 11), + (1, 3), + (1, 22), + (17, 18), ], entries: &[ - ("שעה", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("שתי", TaToken { n: 2, unit: None }), - ("אתמול", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("חודש", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("שבועות", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("יומיים", TaToken { n: 2, unit: Some(TimeUnit::Day) }), - ("חודשיים", TaToken { n: 2, unit: Some(TimeUnit::Month) }), - ("שבועיים", TaToken { n: 2, unit: Some(TimeUnit::Week) }), - ("שע׳", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("שב׳", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("שנייה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("שנים", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("יום", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("שעות", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("שבוע", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("דקות", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("שניה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("שנים", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("שנה", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("דקה", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ימים", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("שנתיים", TaToken { n: 2, unit: Some(TimeUnit::Year) }), - ("דק׳", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("שניות", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("חודשים", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("שעתיים", TaToken { n: 2, unit: Some(TimeUnit::Hour) }), + ("שנ׳", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("יומיים", TaToken { n: 2, unit: Some(TimeUnit::Day) }), + ("שבוע", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("שתי", TaToken { n: 2, unit: None }), + ("חודשיים", TaToken { n: 2, unit: Some(TimeUnit::Month) }), + ("שניה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("שניות", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("שבועות", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("דקה", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("שנתיים", TaToken { n: 2, unit: Some(TimeUnit::Year) }), + ("שעה", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("שעות", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("חודשים", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("דק׳", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("אתמול", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("שב׳", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("חודש", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("שבועיים", TaToken { n: 2, unit: Some(TimeUnit::Week) }), + ("ימים", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("שנייה", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("שע׳", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("דקות", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -3369,24 +3386,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Kk => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (0, 1), - (2, 3), (2, 0), + (4, 6), + (0, 7), ], entries: &[ - ("сағ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ап", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("сағат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("жыл", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("апта", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ж", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("сағ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("күн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ап", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, @@ -3548,30 +3566,34 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (2, 1), - (1, 10), - (1, 0), - (1, 11), + (0, 1), + (0, 6), + (4, 7), + (0, 0), + (0, 17), ], entries: &[ - ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ತ\u{cbf}ಂಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ನ\u{cbf}ಮ\u{cbf}ಷವು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ಸ\u{cc6}ಕ\u{cc6}ಂಡ\u{ccd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ವರ\u{ccd}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ವರ\u{ccd}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ವಾರಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ಗಂಟ\u{cc6}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ತ\u{cbf}ಂಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ದ\u{cbf}ನಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ದ\u{cbf}ನದ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ವರ\u{ccd}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ಗಂಟ\u{cc6}ಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ವಾರದ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ನ\u{cbf}ಮ\u{cbf}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ತ\u{cbf}ಂಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ವಾರಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ತ\u{cbf}ಂಗಳುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ಗಂ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳು", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ನ\u{cbf}ಮ\u{cbf}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ಗಂಟ\u{cc6}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ವಾರದ", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ಸ\u{cc6}ಕ\u{cc6}ಂಡುಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ತ\u{cbf}ಂಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ಸ\u{cc6}ಕ\u{cc6}ಂ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ನ\u{cbf}ಮ\u{cbf}ಷವು", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ವರ\u{ccd}ಷದ", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ದ\u{cbf}ನಗಳ", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ಸ\u{cc6}ಕ\u{cc6}ಂಡ\u{ccd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4187,19 +4209,22 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ml => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 2980949210194914378, disps: &[ - (1, 0), - (0, 0), + (9, 5), + (6, 0), ], entries: &[ - ("ആഴ\u{d4d}ച", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("സെക\u{d4d}കൻഡ\u{d4d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("മ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("മണിക\u{d4d}ക\u{d42}ർ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ദിവസം", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("വർഷം", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("സെ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("മ\u{d3e}സം", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ആഴ\u{d4d}ച", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ദിവസം", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("മിനിറ\u{d4d}റ\u{d4d}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("മി", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("വർഷം", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("സെക\u{d4d}കൻഡ\u{d4d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -4348,33 +4373,34 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Mr => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 14108922650502679131, disps: &[ - (0, 0), - (12, 8), - (8, 5), - (1, 13), + (1, 2), + (8, 0), + (13, 7), + (0, 4), ], entries: &[ - ("मिनिटा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("दिवसाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("आठवड\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("मिनिट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("दिवसा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("महिन\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("स\u{947}क\u{902}दाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("मिनिट", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("तासाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("स\u{947}क\u{902}दा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("मिनिटाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("मिनि", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("स\u{947}क\u{902}द", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("वर\u{94d}षाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("वर\u{94d}षा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("स\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("आठवड\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("स\u{947}क\u{902}द", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("मिनिटाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("स\u{947}क\u{902}दा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("तासा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("महिन\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("दिवसा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("मिनिटा\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ता", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("तासाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("आठवड\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("मिनिट", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("वर\u{94d}षाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("मिनि", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("दिवसाप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("महिन\u{94d}याप\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("मिनिट\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("महिन\u{94d}या\u{902}प\u{942}र\u{94d}वी", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("स\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -4538,21 +4564,22 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::My => Entry { timeago_tokens: ::phf::Map { - key: 15467950696543387533, + key: 7485420634051515786, disps: &[ (0, 0), - (7, 3), + (0, 2), ], entries: &[ - ("မ\u{102d}နစ\u{103a}န\u{103e}င\u{1037}\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("န\u{103e}စ\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("နာရ\u{102e}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("လ", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("စက\u{1039}ကန\u{1037}\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("မ\u{102d}နစ\u{103a}န\u{103e}င\u{1037}\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ရက\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ပတ\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ရက\u{103a}က", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("နာရ\u{102e}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("စက\u{1039}ကန\u{1037}\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("မ\u{102d}နစ\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ပတ\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("န\u{103e}စ\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::Y, DateCmp::D], @@ -5216,32 +5243,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Pt => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (4, 1), - (2, 4), - (17, 1), - (1, 0), + (0, 0), + (2, 2), + (8, 14), + (4, 10), ], entries: &[ - ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("horas", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("hora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minutos", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("segundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("anos", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("mês", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("segundos", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("seg", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ano", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("dias", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("semanas", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5395,32 +5423,33 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ro => Entry { timeago_tokens: ::phf::Map { - key: 2980949210194914378, + key: 15467950696543387533, disps: &[ - (9, 16), - (4, 0), - (12, 14), - (4, 1), + (11, 2), + (0, 5), + (2, 3), + (2, 0), ], entries: &[ - ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("săptămâni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("luni", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("secundă", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("oră", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("secunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("zile", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("zi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("săptămână", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("oră", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("zile", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ore", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("an", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("secundă", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("săptămâni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("lună", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("săpt", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("luni", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("săptămână", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("zi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("secunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5495,46 +5524,47 @@ pub(crate) fn entry(lang: Language) -> Entry { timeago_tokens: ::phf::Map { key: 12913932095322966823, disps: &[ - (0, 4), - (1, 0), - (0, 14), - (3, 10), - (0, 23), - (15, 15), - (2, 22), + (2, 1), + (0, 0), + (5, 11), + (2, 28), + (0, 17), + (4, 5), + (1, 1), ], entries: &[ - ("л", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("нед", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("лет", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("минуту", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("г", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("месяцев", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("недель", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("неделю", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("недели", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("дней", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("часов", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("дн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("час", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("недель", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("л", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("минуты", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("месяца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("г", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("секунду", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("секунды", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("дн", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("секунд", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("года", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("месяцев", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("часа", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("месяц", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("дней", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("дня", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("неделю", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("с", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("день", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("лет", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("минуту", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("нед", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("недели", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5605,18 +5635,20 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Si => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 471159234146692604, disps: &[ - (5, 3), - (5, 0), + (2, 0), + (6, 0), ], entries: &[ - ("ම\u{dd2}න\u{dd2}ත\u{dca}ත\u{dd4}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("තත\u{dca}පර", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("පැය", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("තත\u{dca}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ම\u{dd2}න\u{dd2}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ම\u{dd2}න\u{dd2}ත\u{dca}ත\u{dd4}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("වසර", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("ම\u{dcf}ස", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("සත\u{dd2}", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("වසර", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("තත\u{dca}පර", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ද\u{dd2}න", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ], }, @@ -5789,51 +5821,54 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sl => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 15467950696543387533, disps: &[ - (4, 19), + (0, 31), + (0, 5), + (2, 32), (0, 0), (0, 0), - (4, 0), - (15, 8), - (5, 16), - (9, 1), + (0, 30), + (0, 0), + (3, 12), ], entries: &[ - ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("leti", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("tednoma", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dnevi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("letom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("minutama", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("tedni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("sekundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("dnevoma", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("mesecema", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("urama", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("uro", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("mesecem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minute", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sekundo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("tednom", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("dnevom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("letoma", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sekundama", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ted", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("dnevi", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("h", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("tednoma", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("mesecema", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekundami", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("minuto", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("urami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minuti", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("tedni", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("urama", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("minutama", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("minutami", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ted", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mesecem", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dnevom", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("leti", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("dnem", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("uro", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("letom", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("letoma", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("urami", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("sekundama", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -5997,36 +6032,37 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Sr => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (1, 2), - (0, 11), - (4, 0), - (6, 11), - (2, 3), + (0, 17), + (0, 2), + (0, 3), + (5, 0), + (2, 7), ], entries: &[ - ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("дана", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("нед", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("сати", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("минут", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("д", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("године", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ч", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("недеља", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("године", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("сата", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("сат", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("д", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("месеца", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("недеље", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("год", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("секунде", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("година", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("недеље", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("сата", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("сати", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("нед", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("дана", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("месеци", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("минута", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("мес", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -6084,36 +6120,37 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::SrLatn => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (1, 6), - (6, 3), - (5, 0), - (0, 7), - (1, 6), + (5, 6), + (1, 0), + (1, 4), + (6, 10), + (4, 0), ], entries: &[ - ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ned", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("č", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("mes", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("god", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("sekunde", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("dana", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("nedelje", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("godine", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("meseca", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("sekundi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("nedelje", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("god", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("nedelja", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("minut", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ned", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("sekunda", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("sata", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("godina", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("min", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], @@ -6356,37 +6393,38 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ta => Entry { timeago_tokens: ::phf::Map { - key: 14108922650502679131, + key: 15467950696543387533, disps: &[ - (2, 14), - (19, 10), - (0, 0), - (3, 12), - (12, 15), + (1, 11), + (11, 19), + (1, 12), + (2, 0), + (2, 12), ], entries: &[ - ("ம\u{bbe}தத\u{bcd}துக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("விந\u{bbe}டிகள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ந\u{bbe}ளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ஆண\u{bcd}டிற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ம\u{bbe}தங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("விந\u{bbe}டிகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("மணி", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("வ\u{bbe}ர", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("வ\u{bbe}ரங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("வ\u{bbe}ரத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ஆண\u{bcd}டுகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("மணிநேரம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ம\u{bbe}த", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("விந\u{bbe}டிகள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("வ\u{bbe}ரங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("நிமிட", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ஆண\u{bcd}டிற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ம\u{bbe}தத\u{bcd}துக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("வ\u{bbe}ரத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("விந\u{bbe}டி", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("நிமி", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("நிமிடங\u{bcd}கள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("விந\u{bbe}டிக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ந\u{bbe}ட\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("வ\u{bbe}ர", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("நிமிடம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ம\u{bbe}தங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("நிமிடங\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("விந\u{bbe}டிக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("மணி", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("விந\u{bbe}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("மணிநேரம\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("நிமிடங\u{bcd}கள\u{bcd}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ந\u{bbe}ளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ந\u{bbe}ட\u{bcd}களுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("விந\u{bbe}டிகளுக\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ம\u{bbe}த", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("நிமி", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -6558,29 +6596,30 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Th => Entry { timeago_tokens: ::phf::Map { - key: 7485420634051515786, + key: 12913932095322966823, disps: &[ - (1, 14), - (2, 0), - (1, 10), + (0, 0), + (2, 10), (0, 11), + (8, 12), ], entries: &[ - ("ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("เด\u{e37}อนท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ช\u{e31}\u{e48}วโมงท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ป\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ว\u{e31}นท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ชม", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("ว\u{e34}นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ว\u{e31}นท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ว\u{e34}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ป\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ช\u{e31}\u{e48}วโมงท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("นาท\u{e35}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ว\u{e31}นท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("เด\u{e37}อนท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ส\u{e31}ปดาห\u{e4c}ท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("ชม", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ว\u{e34}นาท\u{e35}ท\u{e35}\u{e48}ผ\u{e48}านมา", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("เด\u{e37}อนท\u{e35}\u{e48}แล\u{e49}ว", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ], }, @@ -6960,19 +6999,21 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Uz => Entry { timeago_tokens: ::phf::Map { - key: 12913932095322966823, + key: 351906021642186605, disps: &[ - (2, 6), - (3, 0), + (2, 4), + (1, 0), ], entries: &[ - ("daqiqa", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("yil", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("kun", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("soat", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("hafta", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("soniya", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("oy", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("yil", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("soniya", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("daqiqa", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("hafta", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("kun", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("daq", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("son", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], @@ -7315,38 +7356,39 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Zu => Entry { timeago_tokens: ::phf::Map { - key: 10121458955350035957, + key: 12913932095322966823, disps: &[ - (11, 21), - (0, 0), - (0, 3), - (1, 18), - (0, 16), + (4, 21), + (12, 15), + (0, 14), + (2, 0), + (16, 18), ], entries: &[ - ("isekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("amaminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("ezingu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("unyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("usuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("inyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("evikini", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("olwedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("iviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ihora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("iminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("ezedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("osukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("izinyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("izinsuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("olungu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("amaviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("amasekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("iminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("iviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("amaminithi", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("osukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ihora", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("usuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("sec", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("odlule", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("ezinsukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ezedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("inyanga", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("iminyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("izinsuku", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ezingu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("amasekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("olwedlule", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("ezinsukwini", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("evikini", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("unyaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("amaviki", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("olungu", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("elingu", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("isekhondi", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ], }, date_order: &[DateCmp::D, DateCmp::Y], diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index 56f1630..a427158 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -61,12 +61,14 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "ሰከ": "s", "ሰከንድ": "s", "ሰከንዶች": "s", "ደቂቃ": "m", "ደቂቃ፣": "m", "ደቂቃዎች": "m", "ደቂቃዎች፣": "m", + "ሰዓ": "h", "ሰዓት": "h", "ሰዓቶች": "h", "ቀናት": "D", @@ -224,7 +226,9 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "san": "s", "saniyə": "s", + "dəq": "m", "dəqiqə": "m", "saat": "h", "gün": "D", @@ -735,6 +739,7 @@ "δευτ": "s", "δευτερόλεπτα": "s", "δευτερόλεπτο": "s", + "λ": "m", "λεπ": "m", "λεπτά": "m", "λεπτό": "m", @@ -799,8 +804,10 @@ "sec": "s", "second": "s", "seconds": "s", + "secs": "s", "m": "m", "min": "m", + "mins": "m", "minute": "m", "minutes": "m", "h": "h", @@ -1044,8 +1051,11 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "segundo": "s", + "min": "m", "minutu": "m", + "h": "h", "ordu": "h", "egun": "D", "aste": "W", @@ -1532,9 +1542,12 @@ "másodperc": "s", "másodperccel": "s", "másodperce": "s", + "mp": "s", + "p": "m", "perc": "m", "perccel": "m", "perce": "m", + "ó": "h", "órája": "h", "órával": "h", "napja": "D", @@ -1759,6 +1772,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "sec": "s", "secondi": "s", "secondo": "s", @@ -1819,6 +1833,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "שנ׳": "s", "שניה": "s", "שניות": "s", "שנייה": "1s", @@ -1971,6 +1986,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "с": "s", "сек": "s", "секунд": "s", "мин": "m", @@ -2073,13 +2089,16 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "ಸೆಕೆಂ": "s", "ಸೆಕೆಂಡುಗಳ": "s", "ಸೆಕೆಂಡುಗಳು": "s", "ಸೆಕೆಂಡ್": "s", + "ನಿಮಿ": "m", "ನಿಮಿಷಗಳ": "m", "ನಿಮಿಷಗಳು": "m", "ನಿಮಿಷದ": "m", "ನಿಮಿಷವು": "m", + "ಗಂ": "h", "ಗಂಟೆ": "h", "ಗಂಟೆಗಳ": "h", "ದಿನಗಳ": "D", @@ -2448,8 +2467,11 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "സെ": "s", "സെക്കൻഡ്": "s", + "മി": "m", "മിനിറ്റ്": "m", + "മ": "h", "മണിക്കൂർ": "h", "ദിവസം": "D", "ആഴ്ച": "W", @@ -2545,6 +2567,7 @@ "मिनिटापूर्वी": "m", "मिनिटांपूर्वी": "m", "मिनिटे": "m", + "ता": "h", "तासापूर्वी": "h", "तासांपूर्वी": "h", "दिवसापूर्वी": "D", @@ -2649,6 +2672,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "sec": "s", "စက္ကန့်": "s", "မိနစ်": "m", "မိနစ်နှင့်": "m", @@ -3057,6 +3081,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "seg": "s", "segundo": "s", "segundos": "s", @@ -3160,6 +3185,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "s": "s", "sec": "s", "secundă": "s", "secunde": "s", @@ -3219,6 +3245,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "с": "s", "сек": "s", "секунд": "s", "секунда": "s", @@ -3289,7 +3316,9 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "තත්": "s", "තත්පර": "s", + "මිනි": "m", "මිනිත්තු": "m", "පැය": "h", "දින": "D", @@ -3397,6 +3426,7 @@ "by_char": false, "timeago_tokens": { "s": "s", + "sek": "s", "sekund": "s", "sekunda": "s", "sekundama": "s", @@ -3412,6 +3442,7 @@ "minute": "m", "minuti": "m", "minuto": "m", + "h": "h", "urama": "h", "urami": "h", "uro": "h", @@ -3531,6 +3562,7 @@ "мин": "m", "минут": "m", "минута": "m", + "сат": "h", "сата": "h", "сати": "h", "ч": "h", @@ -3581,6 +3613,7 @@ "minut": "m", "minuta": "m", "č": "h", + "sat": "h", "sata": "h", "sati": "h", "d": "D", @@ -3737,6 +3770,7 @@ "விநாடிகள்": "s", "விநாடிக்கு": "s", "நிமி": "m", + "நிமிட": "m", "நிமிடங்களுக்கு": "m", "நிமிடங்கள்": "m", "நிமிடத்திற்கு": "m", @@ -3854,6 +3888,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "วิ": "s", "วินาที": "s", "วินาทีที่ผ่านมา": "s", "วินาทีที่แล้ว": "s", @@ -4098,7 +4133,9 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "son": "s", "soniya": "s", + "daq": "m", "daqiqa": "m", "soat": "h", "kun": "D", @@ -4278,6 +4315,7 @@ "timeago_tokens": { "amasekhondi": "s", "isekhondi": "s", + "sec": "s", "amaminithi": "m", "iminithi": "m", "emahoreni": "h", From 48ccfc5c067a55d7a727da61aadc0830981ec6d4 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 15 Nov 2023 01:42:04 +0100 Subject: [PATCH 068/459] fix: Arabic duration parsing --- src/util/dictionary.rs | 66 ++++++++++++++++++---------------- src/util/timeago.rs | 2 ++ testfiles/dict/dictionary.json | 3 ++ 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index 789269b..d4d3b79 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -253,46 +253,50 @@ pub(crate) fn entry(lang: Language) -> Entry { }, Language::Ar => Entry { timeago_tokens: ::phf::Map { - key: 2980949210194914378, + key: 14108922650502679131, disps: &[ - (1, 0), - (0, 3), - (2, 26), - (1, 11), - (25, 3), - (9, 5), + (3, 13), + (11, 32), + (0, 0), + (0, 0), + (4, 28), + (0, 1), + (5, 12), ], entries: &[ - ("يوم\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ثوان\u{650}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ساعات", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("دقائق", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("شهرين", TaToken { n: 2, unit: Some(TimeUnit::Month) }), - ("أشهر", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("ثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("ساعة", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), - ("يوم", TaToken { n: 1, unit: Some(TimeUnit::Day) }), - ("ثوان", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("دقيقة", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), - ("يومين", TaToken { n: 2, unit: Some(TimeUnit::Day) }), - ("ثانيتين", TaToken { n: 2, unit: Some(TimeUnit::Second) }), - ("أسبوعين", TaToken { n: 2, unit: Some(TimeUnit::Week) }), - ("دقيقتين", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), - ("سنوات", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("دقيقتان", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), - ("سنة", TaToken { n: 1, unit: Some(TimeUnit::Year) }), - ("أسابيع", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("خلال", TaToken { n: 1, unit: Some(TimeUnit::Month) }), - ("شهر\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("شهر", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("وثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), - ("سنتين", TaToken { n: 2, unit: Some(TimeUnit::Year) }), + ("دقيقتان", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), + ("ثوان\u{64d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("يوم", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("شهر\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("سنة", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("يوم\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("دقيقة", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("ثوان", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ثانية", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("ساعات", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("أيام", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ساعتين", TaToken { n: 2, unit: Some(TimeUnit::Hour) }), ("أسبوع\u{64b}ا", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("أيام", TaToken { n: 1, unit: Some(TimeUnit::Day) }), + ("سنوات", TaToken { n: 1, unit: Some(TimeUnit::Year) }), + ("ساعة", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ثانيتين", TaToken { n: 2, unit: Some(TimeUnit::Second) }), + ("أسابيع", TaToken { n: 1, unit: Some(TimeUnit::Week) }), + ("أشهر", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("أسبوع", TaToken { n: 1, unit: Some(TimeUnit::Week) }), - ("ثوان\u{64d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("شهرين", TaToken { n: 2, unit: Some(TimeUnit::Month) }), ("وثانيتان", TaToken { n: 2, unit: Some(TimeUnit::Second) }), + ("يومين", TaToken { n: 2, unit: Some(TimeUnit::Day) }), + ("س", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), + ("ث", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("دقيقتين", TaToken { n: 2, unit: Some(TimeUnit::Minute) }), + ("خلال", TaToken { n: 1, unit: Some(TimeUnit::Month) }), + ("ثوان\u{650}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), + ("د", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), + ("سنتين", TaToken { n: 2, unit: Some(TimeUnit::Year) }), + ("أسبوعين", TaToken { n: 2, unit: Some(TimeUnit::Week) }), + ("دقائق", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ], }, date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], diff --git a/src/util/timeago.rs b/src/util/timeago.rs index 68a0923..aa9781a 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -967,6 +967,8 @@ mod tests { #[case(Language::Ar, "19 دقيقة وثانيتان", 1142)] #[case(Language::Ar, "دقيقة و13 ثانية", 73)] #[case(Language::Sw, "dakika 1 na sekunde 13", 73)] + #[case(Language::Ar, "1 س و41 د", 6060)] + #[case(Language::Ar, "4 د و33 ث", 273)] fn t_parse_video_duration2( #[case] lang: Language, #[case] video_duration: &str, diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index a427158..66d9dea 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -121,6 +121,7 @@ "equivalent": [], "by_char": false, "timeago_tokens": { + "ث": "s", "ثانية": "s", "ثوان": "s", "ثوانٍ": "s", @@ -128,10 +129,12 @@ "وثانية": "s", "ثانيتين": "2s", "وثانيتان": "2s", + "د": "m", "دقائق": "m", "دقيقة": "m", "دقيقتان": "2m", "دقيقتين": "2m", + "س": "h", "ساعات": "h", "ساعة": "h", "ساعتين": "2h", From 8458d878e712e19e38844ee2e7dc73ce4cd5aa4a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 18 Nov 2023 01:19:47 +0100 Subject: [PATCH 069/459] refactor: generic search API --- cli/src/main.rs | 28 +- codegen/src/abtest.rs | 21 +- codegen/src/download_testfiles.rs | 18 +- src/client/music_search.rs | 255 +--- src/client/search.rs | 24 +- ...earch__tests__map_music_search_albums.snap | 2 +- ...arch__tests__map_music_search_artists.snap | 2 +- ...__tests__map_music_search_main_artist.snap | 1113 ++++++++--------- ..._tests__map_music_search_main_default.snap | 877 +++++++------ ...h__tests__map_music_search_main_radio.snap | 979 +++++++-------- ...ch__tests__map_music_search_main_typo.snap | 889 +++++++------ ..._map_music_search_playlists_community.snap | 2 +- ...tests__map_music_search_playlists_ytm.snap | 2 +- ...ests__map_music_search_tracks_default.snap | 2 +- ...ap_music_search_tracks_no_artist_link.snap | 2 +- ...__tests__map_music_search_tracks_typo.snap | 2 +- ...tests__map_music_search_tracks_videos.snap | 2 +- src/model/mod.rs | 31 +- src/model/paginator.rs | 2 - src/param/search_filter.rs | 32 + tests/youtube.rs | 162 ++- 21 files changed, 2185 insertions(+), 2262 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index d048820..cd8bd4c 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -9,7 +9,7 @@ use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use reqwest::{Client, ClientBuilder}; use rustypipe::{ client::RustyPipe, - model::{UrlTarget, VideoId}, + model::{UrlTarget, VideoId, YouTubeItem}, param::{search_filter, ChannelVideoTab, Country, Language, StreamFilter}, }; use serde::Serialize; @@ -178,7 +178,7 @@ enum SearchOrder { Views, } -#[derive(Copy, Clone, ValueEnum)] +#[derive(Copy, Clone, PartialEq, Eq, ValueEnum)] enum MusicSearchCategory { All, Tracks, @@ -667,13 +667,17 @@ async fn main() { .length_opt(length.map(search_filter::Length::from)) .date_opt(date.map(search_filter::UploadDate::from)) .sort_opt(order.map(search_filter::Order::from)); - let mut res = rp.query().search_filter(&query, &filter).await.unwrap(); + let mut res = rp + .query() + .search_filter::(&query, &filter) + .await + .unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); print_data(&res, format, pretty); } }, Some(MusicSearchCategory::All) => { - let res = rp.query().music_search(&query).await.unwrap(); + let res = rp.query().music_search_main(&query).await.unwrap(); print_data(&res, format, pretty); } Some(MusicSearchCategory::Tracks) => { @@ -696,19 +700,13 @@ async fn main() { res.items.extend_limit(rp.query(), limit).await.unwrap(); print_data(&res, format, pretty); } - Some(MusicSearchCategory::PlaylistsYtm) => { + Some(MusicSearchCategory::PlaylistsYtm | MusicSearchCategory::PlaylistsCommunity) => { let mut res = rp .query() - .music_search_playlists(&query, false) - .await - .unwrap(); - res.items.extend_limit(rp.query(), limit).await.unwrap(); - print_data(&res, format, pretty); - } - Some(MusicSearchCategory::PlaylistsCommunity) => { - let mut res = rp - .query() - .music_search_playlists(&query, true) + .music_search_playlists( + &query, + music == Some(MusicSearchCategory::PlaylistsCommunity), + ) .await .unwrap(); res.items.extend_limit(rp.query(), limit).await.unwrap(); diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index 23dd8ea..18676f8 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -7,7 +7,7 @@ use num_enum::TryFromPrimitive; use once_cell::sync::Lazy; use regex::Regex; use rustypipe::client::{ClientType, RustyPipe, RustyPipeQuery, YTContext}; -use rustypipe::model::YouTubeItem; +use rustypipe::model::{MusicItem, YouTubeItem}; use rustypipe::param::search_filter::{ItemType, SearchFilter}; use serde::de::IgnoredAny; use serde::{Deserialize, Serialize}; @@ -274,14 +274,25 @@ pub async fn playlists_for_shorts(rp: &RustyPipeQuery) -> Result { } pub async fn track_viewcount(rp: &RustyPipeQuery) -> Result { - let res = rp.music_search("lieblingsmensch namika").await?; + let res = rp.music_search_main("lieblingsmensch namika").await?; let track = &res - .tracks + .items + .items .iter() - .find(|a| a.id == "6485PhOtHzY") + .find_map(|itm| { + if let MusicItem::Track(track) = itm { + if track.id == "6485PhOtHzY" { + Some(track) + } else { + None + } + } else { + None + } + }) .unwrap_or_else(|| { - panic!("could not find track, got {:#?}", &res.tracks); + panic!("could not find track, got {:#?}", &res.items.items); }); Ok(track.view_count.is_some()) diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 239dabb..5bfd65c 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -8,6 +8,7 @@ use std::{ use path_macro::path; use rustypipe::{ client::{ClientType, RustyPipe}, + model::YouTubeItem, param::{ search_filter::{self, ItemType, SearchFilter}, ChannelVideoTab, Country, @@ -392,7 +393,10 @@ async fn search() { } let rp = rp_testfile(&json_path); - rp.query().search("doobydoobap").await.unwrap(); + rp.query() + .search::("doobydoobap") + .await + .unwrap(); } async fn search_cont() { @@ -402,7 +406,11 @@ async fn search_cont() { } let rp = RustyPipe::new(); - let search = rp.query().search("doobydoobap").await.unwrap(); + let search = rp + .query() + .search::("doobydoobap") + .await + .unwrap(); let rp = rp_testfile(&json_path); search.items.next(rp.query()).await.unwrap().unwrap(); @@ -416,7 +424,7 @@ async fn search_playlists() { let rp = rp_testfile(&json_path); rp.query() - .search_filter("pop", &SearchFilter::new().item_type(ItemType::Playlist)) + .search_filter::("pop", &SearchFilter::new().item_type(ItemType::Playlist)) .await .unwrap(); } @@ -429,7 +437,7 @@ async fn search_empty() { let rp = rp_testfile(&json_path); rp.query() - .search_filter( + .search_filter::( "test", &SearchFilter::new() .feature(search_filter::Feature::IsLive) @@ -558,7 +566,7 @@ async fn music_search() { } let rp = rp_testfile(&json_path); - rp.query().music_search(query).await.unwrap(); + rp.query().music_search_main(query).await.unwrap(); } } diff --git a/src/client/music_search.rs b/src/client/music_search.rs index 7d42842..2216171 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -8,9 +8,10 @@ use crate::{ model::{ paginator::{ContinuationEndpoint, Paginator}, traits::FromYtItem, - AlbumItem, ArtistItem, MusicPlaylistItem, MusicSearchFiltered, MusicSearchResult, + AlbumItem, ArtistItem, MusicItem, MusicPlaylistItem, MusicSearchResult, MusicSearchSuggestion, TrackItem, }, + param::search_filter::MusicSearchFilter, serializer::MapResult, }; @@ -22,7 +23,7 @@ struct QSearch<'a> { context: YTContext<'a>, query: &'a str, #[serde(skip_serializing_if = "Option::is_none")] - params: Option, + params: Option<&'a str>, } #[derive(Debug, Serialize)] @@ -32,76 +33,22 @@ struct QSearchSuggestion<'a> { input: &'a str, } -#[derive(Debug, Serialize)] -enum Params { - #[serde(rename = "EgWKAQIIAWoMEAMQBBAJEA4QChAF")] - Tracks, - #[serde(rename = "EgWKAQIQAWoMEAMQBBAJEA4QChAF")] - Videos, - #[serde(rename = "EgWKAQIYAWoMEAMQBBAJEA4QChAF")] - Albums, - #[serde(rename = "EgWKAQIgAWoMEAMQBBAJEA4QChAF")] - Artists, - #[serde(rename = "EgeKAQQoADgBagwQAxAEEAkQDhAKEAU%3D")] - YtmPlaylists, - #[serde(rename = "EgeKAQQoAEABagwQAxAEEAkQDhAKEAU%3D")] - CommunityPlaylists, -} - impl RustyPipeQuery { - /// Search YouTube Music. Returns items from any type. - #[tracing::instrument(skip(self))] - pub async fn music_search + Debug>( + /// Search YouTube Music. + /// + /// This is a generic implementation which casts items to the given type or filters + /// them out. + pub async fn music_search>( &self, query: S, - ) -> Result { + filter: Option, + ) -> Result, Error> { let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, query, - params: None, - }; - - self.execute_request::( - ClientType::DesktopMusic, - "music_search", - query, - "search", - &request_body, - ) - .await - } - - /// Search YouTube Music tracks - #[tracing::instrument(skip(self))] - pub async fn music_search_tracks + Debug>( - &self, - query: S, - ) -> Result, Error> { - self._music_search_tracks(query, Params::Tracks).await - } - - /// Search YouTube Music videos - #[tracing::instrument(skip(self))] - pub async fn music_search_videos + Debug>( - &self, - query: S, - ) -> Result, Error> { - self._music_search_tracks(query, Params::Videos).await - } - - async fn _music_search_tracks>( - &self, - query: S, - params: Params, - ) -> Result, Error> { - let query = query.as_ref(); - let context = self.get_context(ClientType::DesktopMusic, true, None).await; - let request_body = QSearch { - context, - query, - params: Some(params), + params: filter.map(MusicSearchFilter::params), }; self.execute_request::( @@ -114,81 +61,66 @@ impl RustyPipeQuery { .await } - /// Search YouTube Music albums - #[tracing::instrument(skip(self))] - pub async fn music_search_albums + Debug>( + /// Search YouTube music and return items of all types + pub async fn music_search_main>( &self, query: S, - ) -> Result, Error> { - let query = query.as_ref(); - let context = self.get_context(ClientType::DesktopMusic, true, None).await; - let request_body = QSearch { - context, - query, - params: Some(Params::Albums), - }; - - self.execute_request::( - ClientType::DesktopMusic, - "music_search_albums", - query, - "search", - &request_body, - ) - .await + ) -> Result, Error> { + self.music_search(query, None).await } /// Search YouTube Music artists - #[tracing::instrument(skip(self))] - pub async fn music_search_artists + Debug>( + pub async fn music_search_artists>( &self, query: S, - ) -> Result, Error> { - let query = query.as_ref(); - let context = self.get_context(ClientType::DesktopMusic, true, None).await; - let request_body = QSearch { - context, - query, - params: Some(Params::Artists), - }; - - self.execute_request::( - ClientType::DesktopMusic, - "music_search_albums", - query, - "search", - &request_body, - ) - .await + ) -> Result, Error> { + self.music_search(query, Some(MusicSearchFilter::Artists)) + .await } + + /// Search YouTube Music albums + pub async fn music_search_albums>( + &self, + query: S, + ) -> Result, Error> { + self.music_search(query, Some(MusicSearchFilter::Albums)) + .await + } + + /// Search YouTube Music tracks + pub async fn music_search_tracks>( + &self, + query: S, + ) -> Result, Error> { + self.music_search(query, Some(MusicSearchFilter::Tracks)) + .await + } + + /// Search YouTube Music videos + pub async fn music_search_videos>( + &self, + query: S, + ) -> Result, Error> { + self.music_search(query, Some(MusicSearchFilter::Videos)) + .await + } + /// Search YouTube Music playlists /// /// Playlists are filtered whether they are created by users /// (`community=true`) or by YouTube Music (`community=false`) - #[tracing::instrument(skip(self))] pub async fn music_search_playlists + Debug>( &self, query: S, community: bool, - ) -> Result, Error> { - let query = query.as_ref(); - let context = self.get_context(ClientType::DesktopMusic, true, None).await; - let request_body = QSearch { - context, + ) -> Result, Error> { + self.music_search( query, - params: Some(if community { - Params::CommunityPlaylists + Some(if community { + MusicSearchFilter::CommunityPlaylists } else { - Params::YtmPlaylists + MusicSearchFilter::YtmPlaylists }), - }; - - self.execute_request::( - ClientType::DesktopMusic, - "music_search_playlists", - query, - "search", - &request_body, ) .await } @@ -217,79 +149,14 @@ impl RustyPipeQuery { } } -impl MapResponse for response::MusicSearch { - fn map_response( - self, - _id: &str, - lang: crate::param::Language, - _deobf: Option<&crate::deobfuscate::DeobfData>, - _vdata: Option<&str>, - ) -> Result, crate::error::ExtractionError> { - // dbg!(&self); - - let sections = self - .contents - .tabbed_search_results_renderer - .contents - .into_iter() - .next() - .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no tab")))? - .tab_renderer - .content - .section_list_renderer - .contents; - - let mut corrected_query = None; - let mut order = Vec::new(); - let mut mapper = MusicListMapper::new(lang); - - sections.into_iter().for_each(|section| match section { - response::music_search::ItemSection::MusicShelfRenderer(shelf) => { - if let Some(etype) = mapper.map_response(shelf.contents) { - if !order.contains(&etype) { - order.push(etype); - } - } - } - response::music_search::ItemSection::MusicCardShelfRenderer(card) => { - if let Some(etype) = mapper.map_card(card) { - if !order.contains(&etype) { - order.push(etype); - } - } - } - response::music_search::ItemSection::ItemSectionRenderer { contents } => { - if let Some(corrected) = contents.into_iter().next() { - corrected_query = Some(corrected.showing_results_for_renderer.corrected_query); - } - } - response::music_search::ItemSection::None => {} - }); - - let map_res = mapper.group_items(); - - Ok(MapResult { - c: MusicSearchResult { - tracks: map_res.c.tracks, - albums: map_res.c.albums, - artists: map_res.c.artists, - playlists: map_res.c.playlists, - corrected_query, - order, - }, - warnings: map_res.warnings, - }) - } -} - -impl MapResponse> for response::MusicSearch { +impl MapResponse> for response::MusicSearch { fn map_response( self, _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, vdata: Option<&str>, - ) -> Result>, ExtractionError> { + ) -> Result>, ExtractionError> { // dbg!(&self); let tabs = self.contents.tabbed_search_results_renderer.contents; @@ -327,7 +194,7 @@ impl MapResponse> for response::MusicSearc let map_res = mapper.conv_items(); Ok(MapResult { - c: MusicSearchFiltered { + c: MusicSearchResult { items: Paginator::new_ext( None, map_res.c, @@ -391,7 +258,7 @@ mod tests { use crate::{ client::{response, MapResponse}, model::{ - AlbumItem, ArtistItem, MusicPlaylistItem, MusicSearchFiltered, MusicSearchResult, + AlbumItem, ArtistItem, MusicItem, MusicPlaylistItem, MusicSearchResult, MusicSearchSuggestion, TrackItem, }, param::Language, @@ -410,7 +277,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = + let map_res: MapResult> = search.map_response("", Language::En, None, None).unwrap(); assert!( @@ -433,7 +300,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = + let map_res: MapResult> = search.map_response("", Language::En, None, None).unwrap(); assert!( @@ -452,7 +319,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = + let map_res: MapResult> = search.map_response("", Language::En, None, None).unwrap(); assert!( @@ -471,7 +338,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = + let map_res: MapResult> = search.map_response("", Language::En, None, None).unwrap(); assert!( @@ -492,7 +359,7 @@ mod tests { let search: response::MusicSearch = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult> = + let map_res: MapResult> = search.map_response("", Language::En, None, None).unwrap(); assert!( diff --git a/src/client/search.rs b/src/client/search.rs index a2e6001..9a05b4e 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -6,6 +6,7 @@ use crate::{ error::{Error, ExtractionError}, model::{ paginator::{ContinuationEndpoint, Paginator}, + traits::FromYtItem, SearchResult, YouTubeItem, }, param::search_filter::SearchFilter, @@ -25,7 +26,10 @@ struct QSearch<'a> { impl RustyPipeQuery { /// Search YouTube #[tracing::instrument(skip(self))] - pub async fn search + Debug>(&self, query: S) -> Result { + pub async fn search + Debug>( + &self, + query: S, + ) -> Result, Error> { let query = query.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QSearch { @@ -46,11 +50,11 @@ impl RustyPipeQuery { /// Search YouTube using the given [`SearchFilter`] #[tracing::instrument(skip(self))] - pub async fn search_filter + Debug>( + pub async fn search_filter + Debug>( &self, query: S, filter: &SearchFilter, - ) -> Result { + ) -> Result, Error> { let query = query.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QSearch { @@ -97,14 +101,14 @@ impl RustyPipeQuery { } } -impl MapResponse for response::Search { +impl MapResponse> for response::Search { fn map_response( self, _id: &str, lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, vdata: Option<&str>, - ) -> Result, ExtractionError> { + ) -> Result>, ExtractionError> { let items = self .contents .two_column_search_results_renderer @@ -119,7 +123,11 @@ impl MapResponse for response::Search { c: SearchResult { items: Paginator::new_ext( self.estimated_results, - mapper.items, + mapper + .items + .into_iter() + .filter_map(T::from_yt_item) + .collect(), mapper.ctoken, None, ContinuationEndpoint::Search, @@ -144,7 +152,7 @@ mod tests { use crate::{ client::{response, MapResponse}, - model::SearchResult, + model::{SearchResult, YouTubeItem}, param::Language, serializer::MapResult, util::tests::TESTFILES, @@ -160,7 +168,7 @@ mod tests { let json_file = File::open(json_path).unwrap(); let search: response::Search = serde_json::from_reader(BufReader::new(json_file)).unwrap(); - let map_res: MapResult = + let map_res: MapResult> = search.map_response("", Language::En, None, None).unwrap(); assert!( diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_albums.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_albums.snap index 8478df1..1e0a7a8 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_albums.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_albums.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_artists.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_artists.snap index bab7467..1c19dfe 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_artists.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_artists.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_artist.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_artist.snap index 38b0155..e5d6979 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_artist.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_artist.snap @@ -3,573 +3,566 @@ source: src/client/music_search.rs expression: map_res.c --- MusicSearchResult( - tracks: [ - TrackItem( - id: "3YgtjHZyCIQ", - name: "Anti-Hero", - duration: Some(201), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/YT8q7RwmbNVf7EcjSii-T5vm7FZI7_mSb_KYvhfKqvKRWdCTB-mzr2jLZCPwYqER3wHFXhuEQKTKmUCJ=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YT8q7RwmbNVf7EcjSii-T5vm7FZI7_mSb_KYvhfKqvKRWdCTB-mzr2jLZCPwYqER3wHFXhuEQKTKmUCJ=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: Some(AlbumId( - id: "MPREb_MOJF3UvLsif", - name: "Midnights (3am Edition)", + items: Paginator( + count: Some(20), + items: [ + Artist(ArtistItem( + id: "UCPC0L1d253x-KuMNwa05TpA", + name: "Taylor Swift", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/U1cI80giSCUuNYx3zkRPt_AWytN1qFMlQoL5F7kTZeFzfIMmfHJYLJchX3BxeDLglE9MeVYp4OlN5Xc=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/U1cI80giSCUuNYx3zkRPt_AWytN1qFMlQoL5F7kTZeFzfIMmfHJYLJchX3BxeDLglE9MeVYp4OlN5Xc=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(51400000), )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "aZ1hziFhj1o", - name: "Love Story", - duration: Some(235), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/YEcmx-25aRBMaKNTvCx17QboP0KCJq2jqKdjpjLImqA60wWE2AZV_ZdQa417ZEmAkK7ipsEt1m0DEI-Z9A=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YEcmx-25aRBMaKNTvCx17QboP0KCJq2jqKdjpjLImqA60wWE2AZV_ZdQa417ZEmAkK7ipsEt1m0DEI-Z9A=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: Some(AlbumId( - id: "MPREb_u721jSRXVRq", - name: "Fearless (Platinum Edition)", + Track(TrackItem( + id: "3YgtjHZyCIQ", + name: "Anti-Hero", + duration: Some(201), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/YT8q7RwmbNVf7EcjSii-T5vm7FZI7_mSb_KYvhfKqvKRWdCTB-mzr2jLZCPwYqER3wHFXhuEQKTKmUCJ=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YT8q7RwmbNVf7EcjSii-T5vm7FZI7_mSb_KYvhfKqvKRWdCTB-mzr2jLZCPwYqER3wHFXhuEQKTKmUCJ=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: Some(AlbumId( + id: "MPREb_MOJF3UvLsif", + name: "Midnights (3am Edition)", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "VmBoTeLsKfs", - name: "I Knew You Were Trouble.", - duration: Some(220), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: Some(AlbumId( - id: "MPREb_6FbAboRIFSX", - name: "Red", + Track(TrackItem( + id: "aZ1hziFhj1o", + name: "Love Story", + duration: Some(235), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/YEcmx-25aRBMaKNTvCx17QboP0KCJq2jqKdjpjLImqA60wWE2AZV_ZdQa417ZEmAkK7ipsEt1m0DEI-Z9A=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YEcmx-25aRBMaKNTvCx17QboP0KCJq2jqKdjpjLImqA60wWE2AZV_ZdQa417ZEmAkK7ipsEt1m0DEI-Z9A=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: Some(AlbumId( + id: "MPREb_u721jSRXVRq", + name: "Fearless (Platinum Edition)", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "65Q7EdWnjqM", - name: "We Are Never Ever Getting Back Together", - duration: Some(194), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: Some(AlbumId( - id: "MPREb_6FbAboRIFSX", - name: "Red", + Album(AlbumItem( + id: "MPREb_l2IU1O3l6QK", + name: "Lavender Haze (Acoustic Version)", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album_type: Single, + year: Some(2023), + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "EL72UcDZLSk", - name: "Midnight Rain", - duration: Some(175), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/omCs21jqwK4Ss_VZxPFKwQP5z0UY0vi_8gXu4XNxHKDgE-GHYHWkIw80XR1uzFgdyhM3PvVUZeZ8iAfF=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/omCs21jqwK4Ss_VZxPFKwQP5z0UY0vi_8gXu4XNxHKDgE-GHYHWkIw80XR1uzFgdyhM3PvVUZeZ8iAfF=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: Some(AlbumId( - id: "MPREb_z0ABWl3jaT0", - name: "Midnights", + Track(TrackItem( + id: "VmBoTeLsKfs", + name: "I Knew You Were Trouble.", + duration: Some(220), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: Some(AlbumId( + id: "MPREb_6FbAboRIFSX", + name: "Red", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "b1kbLwvqugk", - name: "Anti-Hero", - duration: Some(310), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/b1kbLwvqugk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mTWxIS76F_mpp6z63jfh_wtth9RA", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: None, - view_count: Some(123000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "3tmd-ClpJxA", - name: "Look What You Made Me Do", - duration: Some(256), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/3tmd-ClpJxA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nNkqC6yuXrIsm7St2zBSUzvuji-Q", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: None, - view_count: Some(1300000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "FuXNumBwDOM", - name: "ME! (feat. Brendon Urie)", - duration: Some(249), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/FuXNumBwDOM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lT7i_HDpIpUM2j9RoGdVL7NBDh4A", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album: None, - view_count: Some(402000000), - is_video: true, - track_nr: None, - by_va: false, - ), - ], - albums: [ - AlbumItem( - id: "MPREb_l2IU1O3l6QK", - name: "Lavender Haze (Acoustic Version)", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YmOLcfKGBXqhvqc-JLhpN03MuLDEYReKP_hrTHPp1mE8uA5s1r7vVqrwwt7hoWNI3_PixnuFPzSTwRM=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album_type: Single, - year: Some(2023), - by_va: false, - ), - AlbumItem( - id: "MPREb_BiCQyyofUtj", - name: "Eyes Open (Taylor\'s Version)", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album_type: Single, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_aTnRAnnwbvO", - name: "The More Lover Chapter", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album_type: Ep, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_UGeXP8tVTb5", - name: "All Of The Girls You Loved Before", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCPC0L1d253x-KuMNwa05TpA"), - name: "Taylor Swift", - ), - ], - artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), - album_type: Single, - year: Some(2019), - by_va: false, - ), - ], - artists: [ - ArtistItem( - id: "UCPC0L1d253x-KuMNwa05TpA", - name: "Taylor Swift", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/U1cI80giSCUuNYx3zkRPt_AWytN1qFMlQoL5F7kTZeFzfIMmfHJYLJchX3BxeDLglE9MeVYp4OlN5Xc=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/U1cI80giSCUuNYx3zkRPt_AWytN1qFMlQoL5F7kTZeFzfIMmfHJYLJchX3BxeDLglE9MeVYp4OlN5Xc=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(51400000), - ), - ArtistItem( - id: "UCprAFmT0C6O4X0ToEXpeFTQ", - name: "Kendrick Lamar", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/hMjzHmIuTV0XPlvRSjl3wMR6NP-uF-fqF6kkandkFX-hEVp6d3tw-FQG9_smAq0tFwNBT6QLQR-Hkwge=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/hMjzHmIuTV0XPlvRSjl3wMR6NP-uF-fqF6kkandkFX-hEVp6d3tw-FQG9_smAq0tFwNBT6QLQR-Hkwge=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(11900000), - ), - ArtistItem( - id: "UCYR9erHSNBPjjNswR4FrMaw", - name: "ZAYN", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/x_OLwEjNh74QScfVbc3ejrbxjjG3WFe5CfVrO9KlIT_W2VvHpVC-orFzg-LF2kVYsBGK2YOA5JvUsVE=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/x_OLwEjNh74QScfVbc3ejrbxjjG3WFe5CfVrO9KlIT_W2VvHpVC-orFzg-LF2kVYsBGK2YOA5JvUsVE=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(15300000), - ), - ArtistItem( - id: "UCH9AZnGOJebPl3RiVGgpkKA", - name: "I Prevail", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/BsYJ-FyJ4DuXe3yLZ_C3gZREpGAOJ4g1s779ZOF5XqccwJ0ahXfiFujd8dIBkaPjsC6RhW1A6iNgVw=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/BsYJ-FyJ4DuXe3yLZ_C3gZREpGAOJ4g1s779ZOF5XqccwJ0ahXfiFujd8dIBkaPjsC6RhW1A6iNgVw=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(847000), - ), - ], - playlists: [ - MusicPlaylistItem( - id: "RDCLAK5uy_k1272v-yXtLJm7gmMiAxjOl-vh5aEC11A", - name: "Presenting Taylor Swift", - thumbnail: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - channel: None, - track_count: Some(72), - from_ytm: true, - ), - MusicPlaylistItem( - id: "PLMtpqbF01MkVhY0_Z4Afg1m3xCKa2kNBf", - name: "All Taylor Swift Songs", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/mANLpVYRbRYvB5AxT5PjOBkK7jDSuGs8slNDTidtTII6xoXgZAXloGaN6JOIDfN5lTc3TZ5yyxw=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/mANLpVYRbRYvB5AxT5PjOBkK7jDSuGs8slNDTidtTII6xoXgZAXloGaN6JOIDfN5lTc3TZ5yyxw=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/mANLpVYRbRYvB5AxT5PjOBkK7jDSuGs8slNDTidtTII6xoXgZAXloGaN6JOIDfN5lTc3TZ5yyxw=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UC0tDRlJxvcgAhXiHwZm4wcQ", - name: "Elyssa Hamilton", + Track(TrackItem( + id: "65Q7EdWnjqM", + name: "We Are Never Ever Getting Back Together", + duration: Some(194), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/_HJASc9B_QXn2yoUBn4ZLkn6ka8o_CYX4hNT3HQSeIRcqStiJU15VVtOwlaoFV4KqhJK3d-0W0sw3yQ=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: Some(AlbumId( + id: "MPREb_6FbAboRIFSX", + name: "Red", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PLsK_PMdOWOamZphWwqin4A1vw9IJQ0bxC", - name: "Taylor Swift The Eras Tour Setlist (Lyrics and Music Videos)", - thumbnail: [ - Thumbnail( - url: "https://yt3.googleusercontent.com/1ayovXXUII1Meb91J5iTGgsinZz7AXKXj_cLSRSzUvsaBC5gBesgJio8M1cxyo4QZX8hZyQzknA=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.googleusercontent.com/1ayovXXUII1Meb91J5iTGgsinZz7AXKXj_cLSRSzUvsaBC5gBesgJio8M1cxyo4QZX8hZyQzknA=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.googleusercontent.com/1ayovXXUII1Meb91J5iTGgsinZz7AXKXj_cLSRSzUvsaBC5gBesgJio8M1cxyo4QZX8hZyQzknA=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCNpa7-_q_H17TGFfUccs6mw", - name: "Spencer Ramirez Salas", + Track(TrackItem( + id: "EL72UcDZLSk", + name: "Midnight Rain", + duration: Some(175), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/omCs21jqwK4Ss_VZxPFKwQP5z0UY0vi_8gXu4XNxHKDgE-GHYHWkIw80XR1uzFgdyhM3PvVUZeZ8iAfF=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/omCs21jqwK4Ss_VZxPFKwQP5z0UY0vi_8gXu4XNxHKDgE-GHYHWkIw80XR1uzFgdyhM3PvVUZeZ8iAfF=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: Some(AlbumId( + id: "MPREb_z0ABWl3jaT0", + name: "Midnights", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PL_MyZJz846m0QstXAZMmDUJAEHw6je6-_", - name: "Taylor Swift - Top Tracks 2022 Playlist", - thumbnail: [ - Thumbnail( - url: "https://yt3.googleusercontent.com/N1g1refv6sTYiWO2Zbgjoo1eKD8rdEwntTY1L7cFfJV1coqaISjNVajG-a4ybUcjQhGGioJbUf0=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.googleusercontent.com/N1g1refv6sTYiWO2Zbgjoo1eKD8rdEwntTY1L7cFfJV1coqaISjNVajG-a4ybUcjQhGGioJbUf0=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.googleusercontent.com/N1g1refv6sTYiWO2Zbgjoo1eKD8rdEwntTY1L7cFfJV1coqaISjNVajG-a4ybUcjQhGGioJbUf0=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCrESzB-SUekVTY3QI3Jfqlg", - name: "N.J. Music", + Track(TrackItem( + id: "b1kbLwvqugk", + name: "Anti-Hero", + duration: Some(310), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/b1kbLwvqugk/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mTWxIS76F_mpp6z63jfh_wtth9RA", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: None, + view_count: Some(123000000), + is_video: true, + track_nr: None, + by_va: false, )), - track_count: None, - from_ytm: false, - ), - ], + Track(TrackItem( + id: "3tmd-ClpJxA", + name: "Look What You Made Me Do", + duration: Some(256), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/3tmd-ClpJxA/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nNkqC6yuXrIsm7St2zBSUzvuji-Q", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: None, + view_count: Some(1300000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "FuXNumBwDOM", + name: "ME! (feat. Brendon Urie)", + duration: Some(249), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/FuXNumBwDOM/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lT7i_HDpIpUM2j9RoGdVL7NBDh4A", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album: None, + view_count: Some(402000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Album(AlbumItem( + id: "MPREb_BiCQyyofUtj", + name: "Eyes Open (Taylor\'s Version)", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/d_T3L3Ed5ynZLMVs0Ely4aqTfBZ-y9P9azzlLuKvT2re1QQuxqTxRPoSv082zBOBWmXZZRZKqIFbR7YI=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album_type: Single, + year: Some(2021), + by_va: false, + )), + Album(AlbumItem( + id: "MPREb_aTnRAnnwbvO", + name: "The More Lover Chapter", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/wdHdhi2eTDZpnLaBV0y-sVDpOdxcpyzKCC_ivCcKpprhMoeJ4alAW3__PzTttGfR5yhX8vGsHs8u8upz=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album_type: Ep, + year: Some(2019), + by_va: false, + )), + Album(AlbumItem( + id: "MPREb_UGeXP8tVTb5", + name: "All Of The Girls You Loved Before", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Dbm6JTTRFJbiMNjrqRTIDircS8Jaj8MrJhOHb_d2a-rH6YuuOUwlxXh6vzQ4aKe0mHHZCAXVML-PcBLo=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCPC0L1d253x-KuMNwa05TpA"), + name: "Taylor Swift", + ), + ], + artist_id: Some("UCPC0L1d253x-KuMNwa05TpA"), + album_type: Single, + year: Some(2019), + by_va: false, + )), + Playlist(MusicPlaylistItem( + id: "RDCLAK5uy_k1272v-yXtLJm7gmMiAxjOl-vh5aEC11A", + name: "Presenting Taylor Swift", + thumbnail: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/1Z1x27acd-hAcqXUfF8pTtYrlK6bzuW5LERhwJOGKZ-i3IsnR9UGBiIetLRagRE-PtTw9MlCNQ7kkM0=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + channel: None, + track_count: Some(72), + from_ytm: true, + )), + Playlist(MusicPlaylistItem( + id: "PLMtpqbF01MkVhY0_Z4Afg1m3xCKa2kNBf", + name: "All Taylor Swift Songs", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/mANLpVYRbRYvB5AxT5PjOBkK7jDSuGs8slNDTidtTII6xoXgZAXloGaN6JOIDfN5lTc3TZ5yyxw=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/mANLpVYRbRYvB5AxT5PjOBkK7jDSuGs8slNDTidtTII6xoXgZAXloGaN6JOIDfN5lTc3TZ5yyxw=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/mANLpVYRbRYvB5AxT5PjOBkK7jDSuGs8slNDTidtTII6xoXgZAXloGaN6JOIDfN5lTc3TZ5yyxw=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UC0tDRlJxvcgAhXiHwZm4wcQ", + name: "Elyssa Hamilton", + )), + track_count: None, + from_ytm: false, + )), + Playlist(MusicPlaylistItem( + id: "PLsK_PMdOWOamZphWwqin4A1vw9IJQ0bxC", + name: "Taylor Swift The Eras Tour Setlist (Lyrics and Music Videos)", + thumbnail: [ + Thumbnail( + url: "https://yt3.googleusercontent.com/1ayovXXUII1Meb91J5iTGgsinZz7AXKXj_cLSRSzUvsaBC5gBesgJio8M1cxyo4QZX8hZyQzknA=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/1ayovXXUII1Meb91J5iTGgsinZz7AXKXj_cLSRSzUvsaBC5gBesgJio8M1cxyo4QZX8hZyQzknA=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/1ayovXXUII1Meb91J5iTGgsinZz7AXKXj_cLSRSzUvsaBC5gBesgJio8M1cxyo4QZX8hZyQzknA=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCNpa7-_q_H17TGFfUccs6mw", + name: "Spencer Ramirez Salas", + )), + track_count: None, + from_ytm: false, + )), + Playlist(MusicPlaylistItem( + id: "PL_MyZJz846m0QstXAZMmDUJAEHw6je6-_", + name: "Taylor Swift - Top Tracks 2022 Playlist", + thumbnail: [ + Thumbnail( + url: "https://yt3.googleusercontent.com/N1g1refv6sTYiWO2Zbgjoo1eKD8rdEwntTY1L7cFfJV1coqaISjNVajG-a4ybUcjQhGGioJbUf0=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/N1g1refv6sTYiWO2Zbgjoo1eKD8rdEwntTY1L7cFfJV1coqaISjNVajG-a4ybUcjQhGGioJbUf0=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/N1g1refv6sTYiWO2Zbgjoo1eKD8rdEwntTY1L7cFfJV1coqaISjNVajG-a4ybUcjQhGGioJbUf0=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCrESzB-SUekVTY3QI3Jfqlg", + name: "N.J. Music", + )), + track_count: None, + from_ytm: false, + )), + Artist(ArtistItem( + id: "UCprAFmT0C6O4X0ToEXpeFTQ", + name: "Kendrick Lamar", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/hMjzHmIuTV0XPlvRSjl3wMR6NP-uF-fqF6kkandkFX-hEVp6d3tw-FQG9_smAq0tFwNBT6QLQR-Hkwge=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/hMjzHmIuTV0XPlvRSjl3wMR6NP-uF-fqF6kkandkFX-hEVp6d3tw-FQG9_smAq0tFwNBT6QLQR-Hkwge=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(11900000), + )), + Artist(ArtistItem( + id: "UCYR9erHSNBPjjNswR4FrMaw", + name: "ZAYN", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/x_OLwEjNh74QScfVbc3ejrbxjjG3WFe5CfVrO9KlIT_W2VvHpVC-orFzg-LF2kVYsBGK2YOA5JvUsVE=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/x_OLwEjNh74QScfVbc3ejrbxjjG3WFe5CfVrO9KlIT_W2VvHpVC-orFzg-LF2kVYsBGK2YOA5JvUsVE=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(15300000), + )), + Artist(ArtistItem( + id: "UCH9AZnGOJebPl3RiVGgpkKA", + name: "I Prevail", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/BsYJ-FyJ4DuXe3yLZ_C3gZREpGAOJ4g1s779ZOF5XqccwJ0ahXfiFujd8dIBkaPjsC6RhW1A6iNgVw=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/BsYJ-FyJ4DuXe3yLZ_C3gZREpGAOJ4g1s779ZOF5XqccwJ0ahXfiFujd8dIBkaPjsC6RhW1A6iNgVw=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(847000), + )), + ], + ctoken: None, + endpoint: music_search, + ), corrected_query: None, - order: [ - Artist, - Track, - Album, - Playlist, - ], ) diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_default.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_default.snap index f545e67..a49d8d4 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_default.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_default.snap @@ -3,455 +3,448 @@ source: src/client/music_search.rs expression: map_res.c --- MusicSearchResult( - tracks: [ - TrackItem( - id: "ZeerrnuLi5E", - name: "Black Mamba", - duration: Some(230), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/ZeerrnuLi5E/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3maNxpYzTFmXZBd8s1w1iE6rTBDaw", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - name: "aespa", - ), - ], - artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - album: None, - view_count: Some(235000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "BL-aIpCLWnU", - name: "Black Mamba", - duration: Some(175), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - name: "aespa", - ), - ], - artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - album: Some(AlbumId( + items: Paginator( + count: Some(16), + items: [ + Track(TrackItem( + id: "ZeerrnuLi5E", + name: "Black Mamba", + duration: Some(230), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ZeerrnuLi5E/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3maNxpYzTFmXZBd8s1w1iE6rTBDaw", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + name: "aespa", + ), + ], + artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + album: None, + view_count: Some(235000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "BL-aIpCLWnU", + name: "Black Mamba", + duration: Some(175), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + name: "aespa", + ), + ], + artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + album: Some(AlbumId( + id: "MPREb_OpHWHwyNOuY", + name: "Black Mamba", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "cATe8Toht70", + name: "Black Mamba", + duration: Some(74), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/ZesxRmV1_bDW89z70eojCd6DofYPbzbgGaXSIRP3UjmE4nIAkOuWc8pXaozR4AwrzPQublDCKrg6vcxHOg=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/ZesxRmV1_bDW89z70eojCd6DofYPbzbgGaXSIRP3UjmE4nIAkOuWc8pXaozR4AwrzPQublDCKrg6vcxHOg=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCfCNL5oajlQBAlyjWv1ChVw"), + name: "Hans Zimmer", + ), + ArtistId( + id: Some("UCvTXGTZf9EvuCAwZOkoR2iQ"), + name: "Lorne Balfe", + ), + ], + artist_id: Some("UCfCNL5oajlQBAlyjWv1ChVw"), + album: Some(AlbumId( + id: "MPREb_UmDOhLpDsc0", + name: "Megamind (Music from the Motion Picture)", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "WwNKyoizf8k", + name: "BLACK MAMBA", + duration: Some(182), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/gall0XXuwoV_SYR3S6EgtOGaBC3YOR5wOpQxCyqgxC3Xht3Jc95Y-sFg-sGAcQl946MfurGY_xSv0YBT=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/gall0XXuwoV_SYR3S6EgtOGaBC3YOR5wOpQxCyqgxC3Xht3Jc95Y-sFg-sGAcQl946MfurGY_xSv0YBT=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCz6yr3CgFGrrrPDa2asbWMQ"), + name: "Bayamon PR Tribe", + ), + ], + artist_id: Some("UCz6yr3CgFGrrrPDa2asbWMQ"), + album: Some(AlbumId( + id: "MPREb_RV0PGHyGfkp", + name: "LISTEN ME", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "yQUU29NwNF4", + name: "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122", + duration: Some(213), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/yQUU29NwNF4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k0HD8CTPlz4YU0hvy1GqKSf2HKUQ", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCS_hnpJLQTvBkqALgapi_4g"), + name: "스브스케이팝 X INKIGAYO", + ), + ], + artist_id: Some("UCS_hnpJLQTvBkqALgapi_4g"), + album: None, + view_count: Some(10000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "Ky5RT5oGg0w", + name: "Black Mamba", + duration: Some(287), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Ky5RT5oGg0w/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mB-DDgCruC-dhPM0v66ckiZJQnJg", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + name: "aespa", + ), + ], + artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + album: None, + view_count: Some(18000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "dz9bieeSVRw", + name: "aespa - Black Mamba (Music Bank) | KBS WORLD TV 201127", + duration: Some(192), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/dz9bieeSVRw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lsJGKTqJhnt-ckrJtBLlvSp46Y5g", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UC5BMQOsAB8hKUyHu9KI6yig"), + name: "KBS WORLD TV", + ), + ], + artist_id: Some("UC5BMQOsAB8hKUyHu9KI6yig"), + album: None, + view_count: Some(3200000), + is_video: true, + track_nr: None, + by_va: false, + )), + Album(AlbumItem( id: "MPREb_OpHWHwyNOuY", name: "Black Mamba", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + name: "aespa", + ), + ], + artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + album_type: Single, + year: Some(2020), + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "cATe8Toht70", - name: "Black Mamba", - duration: Some(74), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/ZesxRmV1_bDW89z70eojCd6DofYPbzbgGaXSIRP3UjmE4nIAkOuWc8pXaozR4AwrzPQublDCKrg6vcxHOg=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/ZesxRmV1_bDW89z70eojCd6DofYPbzbgGaXSIRP3UjmE4nIAkOuWc8pXaozR4AwrzPQublDCKrg6vcxHOg=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCfCNL5oajlQBAlyjWv1ChVw"), - name: "Hans Zimmer", - ), - ArtistId( - id: Some("UCvTXGTZf9EvuCAwZOkoR2iQ"), - name: "Lorne Balfe", - ), - ], - artist_id: Some("UCfCNL5oajlQBAlyjWv1ChVw"), - album: Some(AlbumId( - id: "MPREb_UmDOhLpDsc0", - name: "Megamind (Music from the Motion Picture)", + Album(AlbumItem( + id: "MPREb_pvdHyqvGjbI", + name: "Girls - The 2nd Mini Album", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + name: "aespa", + ), + ], + artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), + album_type: Album, + year: Some(2022), + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "WwNKyoizf8k", - name: "BLACK MAMBA", - duration: Some(182), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/gall0XXuwoV_SYR3S6EgtOGaBC3YOR5wOpQxCyqgxC3Xht3Jc95Y-sFg-sGAcQl946MfurGY_xSv0YBT=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/gall0XXuwoV_SYR3S6EgtOGaBC3YOR5wOpQxCyqgxC3Xht3Jc95Y-sFg-sGAcQl946MfurGY_xSv0YBT=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCz6yr3CgFGrrrPDa2asbWMQ"), - name: "Bayamon PR Tribe", - ), - ], - artist_id: Some("UCz6yr3CgFGrrrPDa2asbWMQ"), - album: Some(AlbumId( - id: "MPREb_RV0PGHyGfkp", - name: "LISTEN ME", + Album(AlbumItem( + id: "MPREb_CznUTKnATw6", + name: "Black Mamba (feat. Foolio)", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCZK5n7V2-iPHfUXLV2tDvzw"), + name: "Cojack", + ), + ], + artist_id: Some("UCZK5n7V2-iPHfUXLV2tDvzw"), + album_type: Single, + year: Some(2020), + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "yQUU29NwNF4", - name: "aespa(에스파) - Black Mamba @인기가요 inkigayo 20201122", - duration: Some(213), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/yQUU29NwNF4/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3k0HD8CTPlz4YU0hvy1GqKSf2HKUQ", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCS_hnpJLQTvBkqALgapi_4g"), - name: "스브스케이팝 X INKIGAYO", - ), - ], - artist_id: Some("UCS_hnpJLQTvBkqALgapi_4g"), - album: None, - view_count: Some(10000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "Ky5RT5oGg0w", - name: "Black Mamba", - duration: Some(287), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/Ky5RT5oGg0w/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mB-DDgCruC-dhPM0v66ckiZJQnJg", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - name: "aespa", - ), - ], - artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - album: None, - view_count: Some(18000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "dz9bieeSVRw", - name: "aespa - Black Mamba (Music Bank) | KBS WORLD TV 201127", - duration: Some(192), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/dz9bieeSVRw/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3lsJGKTqJhnt-ckrJtBLlvSp46Y5g", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UC5BMQOsAB8hKUyHu9KI6yig"), - name: "KBS WORLD TV", - ), - ], - artist_id: Some("UC5BMQOsAB8hKUyHu9KI6yig"), - album: None, - view_count: Some(3200000), - is_video: true, - track_nr: None, - by_va: false, - ), - ], - albums: [ - AlbumItem( - id: "MPREb_OpHWHwyNOuY", - name: "Black Mamba", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/MOL4_Ula9hocErkX2xK_7mISFiWvQz51vReT14KCHF9wsqCEH6sO8iilFFelWMn7JOYIk2WFa-gMmw2uvw=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - name: "aespa", - ), - ], - artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - album_type: Single, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_pvdHyqvGjbI", - name: "Girls - The 2nd Mini Album", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/JYOTl7neLJLMUEVjdg_qIqz7XjUZB2AQAx_sRDlNVd5jSYiv1xA0v68ZN8Kn0KKf1fSfQnTaeakGeQgI=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - name: "aespa", - ), - ], - artist_id: Some("UCEdZAdnnKqbaHOlv8nM6OtA"), - album_type: Album, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_CznUTKnATw6", - name: "Black Mamba (feat. Foolio)", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/3ut0tvS5LYcfHjLwrYPSYNbraALbFb9ov28b2GXHB8ABaMGWILUko_BJa1jpsSVrELE_B8so3NtYMVfb1g=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCZK5n7V2-iPHfUXLV2tDvzw"), - name: "Cojack", - ), - ], - artist_id: Some("UCZK5n7V2-iPHfUXLV2tDvzw"), - album_type: Single, - year: Some(2020), - by_va: false, - ), - ], - artists: [ - ArtistItem( - id: "UCEdZAdnnKqbaHOlv8nM6OtA", - name: "aespa", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/gV8Sbt3iKraNm_H9ZaH3oh6ERRdN0Dj6qHmTLPiQQ4WS8uGNN09HlpujMJOWwei_z5yC9Th1cZXyOQ=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/gV8Sbt3iKraNm_H9ZaH3oh6ERRdN0Dj6qHmTLPiQQ4WS8uGNN09HlpujMJOWwei_z5yC9Th1cZXyOQ=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(4120000), - ), - ArtistItem( - id: "UCaDT20-B3U8h-tPg_VMvntw", - name: "The Black Mamba", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/Vq3Jc5g2QNJCdkwHbk4uShyhlzwKx0oVovyBXH_AzQs7i6lF7eRN149E56bo4OP_rP2TPvYem8RV3DhV=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Vq3Jc5g2QNJCdkwHbk4uShyhlzwKx0oVovyBXH_AzQs7i6lF7eRN149E56bo4OP_rP2TPvYem8RV3DhV=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(2640), - ), - ArtistItem( - id: "UCLcwLJIGBDDvbfq8JERV6Ag", - name: "Black Mamba", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/qPN6oDatmKgTxytO4b8ScN1qGGMBpsF2_vH9OG1sSDn8Hew28J8vy9y4WNWOJYvSCyHbghIs_B5aGgkJ=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/qPN6oDatmKgTxytO4b8ScN1qGGMBpsF2_vH9OG1sSDn8Hew28J8vy9y4WNWOJYvSCyHbghIs_B5aGgkJ=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(9), - ), - ], - playlists: [ - MusicPlaylistItem( - id: "PLk76iSbFqNJsu_Gozn9SkEXxQ7t-bpXid", - name: "IRMA MIRTILLA Black Mamba", - thumbnail: [ - Thumbnail( - url: "https://i.ytimg.com/vi/md19pon3B9o/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kR84wE4E_UufGzATfZhAsFWEieaA", - width: 400, - height: 225, - ), - Thumbnail( - url: "https://i.ytimg.com/vi/md19pon3B9o/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nxumiGKYWYiiTokZB8M6rwtK5mRw", - width: 800, - height: 450, - ), - Thumbnail( - url: "https://i.ytimg.com/vi/md19pon3B9o/hq720.jpg?sqp=-oaymwEXCNUGEOADIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mEU1yvpIHQXYgVnCyXx8Rlzilg6Q", - width: 853, - height: 480, - ), - ], - channel: Some(ChannelId( - id: "UCtZaFx5MXZHIh7VTItJK1lQ", - name: "Lajos Fülöp", - )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PLIL9Q2jz6euDEJZKHd4QaG4iic944_vKY", - name: "Black Mamba", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/jsvBK6isPIQ0ERSc1xV6PoaYxbYZqCzqr90lHZNEfUcQL2lP0oNzrdimX8KIBchE6X8myc58zwyS=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/jsvBK6isPIQ0ERSc1xV6PoaYxbYZqCzqr90lHZNEfUcQL2lP0oNzrdimX8KIBchE6X8myc58zwyS=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/jsvBK6isPIQ0ERSc1xV6PoaYxbYZqCzqr90lHZNEfUcQL2lP0oNzrdimX8KIBchE6X8myc58zwyS=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCwFT0vvkbtbohtzVbwx7WjQ", - name: "Toshihiko KOMINAMI", - )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PLinm7-cvTdN7RqadpfNrncUGqkdyKNpn6", - name: "Black Mamba", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/hj6EywHSUD3UEnRQPHaEjHPC1VRi9UcsrkW8zGiOaXhRGlyNikLw6Iv0VnHTSuo2MlVBiQaskqo=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/hj6EywHSUD3UEnRQPHaEjHPC1VRi9UcsrkW8zGiOaXhRGlyNikLw6Iv0VnHTSuo2MlVBiQaskqo=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/hj6EywHSUD3UEnRQPHaEjHPC1VRi9UcsrkW8zGiOaXhRGlyNikLw6Iv0VnHTSuo2MlVBiQaskqo=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( + Artist(ArtistItem( id: "UCEdZAdnnKqbaHOlv8nM6OtA", name: "aespa", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/gV8Sbt3iKraNm_H9ZaH3oh6ERRdN0Dj6qHmTLPiQQ4WS8uGNN09HlpujMJOWwei_z5yC9Th1cZXyOQ=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/gV8Sbt3iKraNm_H9ZaH3oh6ERRdN0Dj6qHmTLPiQQ4WS8uGNN09HlpujMJOWwei_z5yC9Th1cZXyOQ=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(4120000), )), - track_count: None, - from_ytm: false, - ), - ], + Artist(ArtistItem( + id: "UCaDT20-B3U8h-tPg_VMvntw", + name: "The Black Mamba", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/Vq3Jc5g2QNJCdkwHbk4uShyhlzwKx0oVovyBXH_AzQs7i6lF7eRN149E56bo4OP_rP2TPvYem8RV3DhV=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Vq3Jc5g2QNJCdkwHbk4uShyhlzwKx0oVovyBXH_AzQs7i6lF7eRN149E56bo4OP_rP2TPvYem8RV3DhV=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(2640), + )), + Artist(ArtistItem( + id: "UCLcwLJIGBDDvbfq8JERV6Ag", + name: "Black Mamba", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/qPN6oDatmKgTxytO4b8ScN1qGGMBpsF2_vH9OG1sSDn8Hew28J8vy9y4WNWOJYvSCyHbghIs_B5aGgkJ=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/qPN6oDatmKgTxytO4b8ScN1qGGMBpsF2_vH9OG1sSDn8Hew28J8vy9y4WNWOJYvSCyHbghIs_B5aGgkJ=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(9), + )), + Playlist(MusicPlaylistItem( + id: "PLk76iSbFqNJsu_Gozn9SkEXxQ7t-bpXid", + name: "IRMA MIRTILLA Black Mamba", + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/md19pon3B9o/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kR84wE4E_UufGzATfZhAsFWEieaA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/md19pon3B9o/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3nxumiGKYWYiiTokZB8M6rwtK5mRw", + width: 800, + height: 450, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/md19pon3B9o/hq720.jpg?sqp=-oaymwEXCNUGEOADIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3mEU1yvpIHQXYgVnCyXx8Rlzilg6Q", + width: 853, + height: 480, + ), + ], + channel: Some(ChannelId( + id: "UCtZaFx5MXZHIh7VTItJK1lQ", + name: "Lajos Fülöp", + )), + track_count: None, + from_ytm: false, + )), + Playlist(MusicPlaylistItem( + id: "PLIL9Q2jz6euDEJZKHd4QaG4iic944_vKY", + name: "Black Mamba", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/jsvBK6isPIQ0ERSc1xV6PoaYxbYZqCzqr90lHZNEfUcQL2lP0oNzrdimX8KIBchE6X8myc58zwyS=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/jsvBK6isPIQ0ERSc1xV6PoaYxbYZqCzqr90lHZNEfUcQL2lP0oNzrdimX8KIBchE6X8myc58zwyS=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/jsvBK6isPIQ0ERSc1xV6PoaYxbYZqCzqr90lHZNEfUcQL2lP0oNzrdimX8KIBchE6X8myc58zwyS=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCwFT0vvkbtbohtzVbwx7WjQ", + name: "Toshihiko KOMINAMI", + )), + track_count: None, + from_ytm: false, + )), + Playlist(MusicPlaylistItem( + id: "PLinm7-cvTdN7RqadpfNrncUGqkdyKNpn6", + name: "Black Mamba", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/hj6EywHSUD3UEnRQPHaEjHPC1VRi9UcsrkW8zGiOaXhRGlyNikLw6Iv0VnHTSuo2MlVBiQaskqo=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/hj6EywHSUD3UEnRQPHaEjHPC1VRi9UcsrkW8zGiOaXhRGlyNikLw6Iv0VnHTSuo2MlVBiQaskqo=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/hj6EywHSUD3UEnRQPHaEjHPC1VRi9UcsrkW8zGiOaXhRGlyNikLw6Iv0VnHTSuo2MlVBiQaskqo=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCEdZAdnnKqbaHOlv8nM6OtA", + name: "aespa", + )), + track_count: None, + from_ytm: false, + )), + ], + ctoken: None, + endpoint: music_search, + ), corrected_query: None, - order: [ - Track, - Album, - Artist, - Playlist, - ], ) diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_radio.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_radio.snap index 9b6a9a2..8c5b912 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_radio.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_radio.snap @@ -3,504 +3,497 @@ source: src/client/music_search.rs expression: map_res.c --- MusicSearchResult( - tracks: [ - TrackItem( - id: "ITdJEc_81h4", - name: "Pop (Radio Version)", - duration: Some(176), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/gwNUEmnlDQimTO_eMcH4Dv-74PK_mcc00xyIk-3tzbW98KkRoD5ZGMhJHBNkZV-ExnTWfa-_ruQbcuM=w60-h60-s-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/gwNUEmnlDQimTO_eMcH4Dv-74PK_mcc00xyIk-3tzbW98KkRoD5ZGMhJHBNkZV-ExnTWfa-_ruQbcuM=w120-h120-s-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCm-wsxhI_OOhg4O1TwDJ98A"), - name: "*NSYNC", - ), - ], - artist_id: Some("UCm-wsxhI_OOhg4O1TwDJ98A"), - album: Some(AlbumId( - id: "MPREb_k2jVJAzQhba", - name: "Greatest Hits (Deluxe)", + items: Paginator( + count: Some(18), + items: [ + Track(TrackItem( + id: "ITdJEc_81h4", + name: "Pop (Radio Version)", + duration: Some(176), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/gwNUEmnlDQimTO_eMcH4Dv-74PK_mcc00xyIk-3tzbW98KkRoD5ZGMhJHBNkZV-ExnTWfa-_ruQbcuM=w60-h60-s-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/gwNUEmnlDQimTO_eMcH4Dv-74PK_mcc00xyIk-3tzbW98KkRoD5ZGMhJHBNkZV-ExnTWfa-_ruQbcuM=w120-h120-s-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCm-wsxhI_OOhg4O1TwDJ98A"), + name: "*NSYNC", + ), + ], + artist_id: Some("UCm-wsxhI_OOhg4O1TwDJ98A"), + album: Some(AlbumId( + id: "MPREb_k2jVJAzQhba", + name: "Greatest Hits (Deluxe)", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "VHLPvrlclmQ", - name: "Pop im Radio", - duration: Some(224), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/OD-BVa7OhsLAQ-bV01DBNiBdzVecGxQ_kBvO7bsVJa6HBg9bVWdF7Izkmgs0E86RLRbKjYxVZTc4__o=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/OD-BVa7OhsLAQ-bV01DBNiBdzVecGxQ_kBvO7bsVJa6HBg9bVWdF7Izkmgs0E86RLRbKjYxVZTc4__o=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCTMksUr7ijdCL7U5wqjKcdA"), - name: "Michy Reincke", - ), - ], - artist_id: Some("UCTMksUr7ijdCL7U5wqjKcdA"), - album: Some(AlbumId( - id: "MPREb_2AXSzG1uDh5", - name: "Das böse Glück (Bonus Edition)", + Track(TrackItem( + id: "VHLPvrlclmQ", + name: "Pop im Radio", + duration: Some(224), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/OD-BVa7OhsLAQ-bV01DBNiBdzVecGxQ_kBvO7bsVJa6HBg9bVWdF7Izkmgs0E86RLRbKjYxVZTc4__o=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/OD-BVa7OhsLAQ-bV01DBNiBdzVecGxQ_kBvO7bsVJa6HBg9bVWdF7Izkmgs0E86RLRbKjYxVZTc4__o=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCTMksUr7ijdCL7U5wqjKcdA"), + name: "Michy Reincke", + ), + ], + artist_id: Some("UCTMksUr7ijdCL7U5wqjKcdA"), + album: Some(AlbumId( + id: "MPREb_2AXSzG1uDh5", + name: "Das böse Glück (Bonus Edition)", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "R9TPed_ohKM", - name: "POP!", - duration: Some(169), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/Xdwe3OXj4qkOv5P_FCNWqSf3cx1VnAfAtB6dD8g1v04ReAcxHm6KAtA08CzPSnbKph-9DwrIMGcRtwFx=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Xdwe3OXj4qkOv5P_FCNWqSf3cx1VnAfAtB6dD8g1v04ReAcxHm6KAtA08CzPSnbKph-9DwrIMGcRtwFx=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCBznuF9zIIbRS9Y1Yu4yOhg"), - name: "NAYEON", - ), - ], - artist_id: Some("UCBznuF9zIIbRS9Y1Yu4yOhg"), - album: Some(AlbumId( - id: "MPREb_pBK5MaK36C5", - name: "IM NAYEON", + Track(TrackItem( + id: "R9TPed_ohKM", + name: "POP!", + duration: Some(169), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/Xdwe3OXj4qkOv5P_FCNWqSf3cx1VnAfAtB6dD8g1v04ReAcxHm6KAtA08CzPSnbKph-9DwrIMGcRtwFx=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Xdwe3OXj4qkOv5P_FCNWqSf3cx1VnAfAtB6dD8g1v04ReAcxHm6KAtA08CzPSnbKph-9DwrIMGcRtwFx=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCBznuF9zIIbRS9Y1Yu4yOhg"), + name: "NAYEON", + ), + ], + artist_id: Some("UCBznuF9zIIbRS9Y1Yu4yOhg"), + album: Some(AlbumId( + id: "MPREb_pBK5MaK36C5", + name: "IM NAYEON", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "Ej1nxBxFSKc", - name: "Non-Stop-Pop FM (Hosted by Cara Delevingne) [Grand Theft Auto V] | Pop, R&B, Dance-pop Music Mix", - duration: Some(8752), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/Ej1nxBxFSKc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nyY9c1BovrvjSAa2rjVSmcTZZcNA", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UC6ZVjGqRf7elKAcYTXCaIsw"), - name: "Listen To This", - ), - ], - artist_id: Some("UC6ZVjGqRf7elKAcYTXCaIsw"), - album: None, - view_count: Some(2400000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "26OrUhkRa3c", - name: "Top Hits 2020 Video Mix (CLEAN) | Hip Hop 2020 - (POP HITS 2020, TOP 40 HITS, BEST POP HITS,TOP 40)", - duration: Some(10012), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/26OrUhkRa3c/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mtPP2bCRAx6JAsJ3NGPbFrs06n6w", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCM7nREGFBumYELglbtUL8FA"), - name: "Top Music", - ), - ], - artist_id: Some("UCM7nREGFBumYELglbtUL8FA"), - album: None, - view_count: Some(2100000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "Idk-oFqn3kM", - name: "THE BEST CHARTS POP HITS 2021 I THE BEST MUSIC RADIO CHARTS I", - duration: Some(8795), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/Idk-oFqn3kM/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3lm-ElqoCByIARJE5_7xs7jLv9AHA", - width: 320, - height: 180, - ), - ], - artists: [ - ArtistId( - id: Some("UCOVD3PtbJGiAcp-c6opijoQ"), - name: "SCHLAGER AKTUELL", - ), - ], - artist_id: Some("UCOVD3PtbJGiAcp-c6opijoQ"), - album: None, - view_count: Some(67000), - is_video: true, - track_nr: None, - by_va: false, - ), - ], - albums: [ - AlbumItem( - id: "MPREb_CYbQPbuAWrt", - name: "Pop Radio", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [], - artist_id: None, - album_type: Album, - year: Some(2016), - by_va: true, - ), - AlbumItem( - id: "MPREb_Cmf1lWfv0dV", - name: "Pop Radio", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [], - artist_id: None, - album_type: Album, - year: Some(2022), - by_va: true, - ), - AlbumItem( - id: "MPREb_Ic1ZUsaeuRv", - name: "Pop Radio", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCG7LUZBrK6GcfTwowTeTiOQ"), - name: "Strange Radio", - ), - ], - artist_id: Some("UCG7LUZBrK6GcfTwowTeTiOQ"), - album_type: Album, - year: Some(2002), - by_va: false, - ), - ], - artists: [ - ArtistItem( - id: "UCSZJrhZ2_ILCpyk3Z3AZVTA", - name: "Icona Pop", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/sw3ilLK-equKu_EtKG1ehnbNqbmo55ZqS_LjOlu4SuYRQrGyWoxIMF9OSw4ORpVtgYlKoeJGD4thG7k=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/sw3ilLK-equKu_EtKG1ehnbNqbmo55ZqS_LjOlu4SuYRQrGyWoxIMF9OSw4ORpVtgYlKoeJGD4thG7k=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(713000), - ), - ArtistItem( - id: "UCOk0CLydqB-B0UH7UaZrVqw", - name: "Bacilos", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/HtQH-8U0IvzGUjkEzOZjpLEBdqcEBaSRAmpneHhtXbiZHL1rJsoq8iJFwcCSMY7PlM-UuzVGDkoJn6k=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/HtQH-8U0IvzGUjkEzOZjpLEBdqcEBaSRAmpneHhtXbiZHL1rJsoq8iJFwcCSMY7PlM-UuzVGDkoJn6k=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(339000), - ), - ArtistItem( - id: "UC-Unifbw_ADqgIeMq4AdvvA", - name: "Death Pop Radio", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/P8DRNrrBP_x4GmPXXKJkWKroLuMCpGW4DJTgxFPYFI-MlLk3pI6xOYMpMnzyb49md-8VVn9L3RHNTfMq=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/P8DRNrrBP_x4GmPXXKJkWKroLuMCpGW4DJTgxFPYFI-MlLk3pI6xOYMpMnzyb49md-8VVn9L3RHNTfMq=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(11), - ), - ], - playlists: [ - MusicPlaylistItem( - id: "RDCLAK5uy_l8kJfTElp2zFMop7IboOXetbbKU3a9VeQ", - name: "REST Turkish Rap", - thumbnail: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - channel: None, - track_count: Some(50), - from_ytm: true, - ), - MusicPlaylistItem( - id: "RDCLAK5uy_kLB769E3eFSzgy4fbpu6-1YPLh90b0JAY", - name: "Pop Hotlist", - thumbnail: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - channel: None, - track_count: Some(54), - from_ytm: true, - ), - MusicPlaylistItem( - id: "RDCLAK5uy_mCvOm3kQy1RTBwDOGYkNhtHwMO89ffquk", - name: "Crème French Pop", - thumbnail: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - channel: None, - track_count: Some(50), - from_ytm: true, - ), - MusicPlaylistItem( - id: "PL47aILYuQXEKiHdqMfNCHat1Gck3XQrrK", - name: "Today\'s Pop Hits Playlist 2022 ♫ Best Radio Hits 2022", - thumbnail: [ - Thumbnail( - url: "https://yt3.googleusercontent.com/l9yiCtp9NGGXn397Jybr_7_4I8TvjKpp9XG54Tv8ZfwkimDWvCfSJXNTf-x9XlgSzsOxdh0doJw=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.googleusercontent.com/l9yiCtp9NGGXn397Jybr_7_4I8TvjKpp9XG54Tv8ZfwkimDWvCfSJXNTf-x9XlgSzsOxdh0doJw=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.googleusercontent.com/l9yiCtp9NGGXn397Jybr_7_4I8TvjKpp9XG54Tv8ZfwkimDWvCfSJXNTf-x9XlgSzsOxdh0doJw=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCEYgc2eKzQXQ9OGCuT4JVPQ", - name: "Redlist - International Playlists", + Track(TrackItem( + id: "Ej1nxBxFSKc", + name: "Non-Stop-Pop FM (Hosted by Cara Delevingne) [Grand Theft Auto V] | Pop, R&B, Dance-pop Music Mix", + duration: Some(8752), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Ej1nxBxFSKc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nyY9c1BovrvjSAa2rjVSmcTZZcNA", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UC6ZVjGqRf7elKAcYTXCaIsw"), + name: "Listen To This", + ), + ], + artist_id: Some("UC6ZVjGqRf7elKAcYTXCaIsw"), + album: None, + view_count: Some(2400000), + is_video: true, + track_nr: None, + by_va: false, )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PL5ITQ2Yq_HLpidRR3wAio-YRBnG7-FeLd", - name: "Radio Swiss Pop", - thumbnail: [ - Thumbnail( - url: "https://i.ytimg.com/vi/MBH-QbN5BcQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nIIqml8U-wrYWs5ZG8jbBPxOahQA", - width: 400, - height: 225, - ), - Thumbnail( - url: "https://i.ytimg.com/vi/MBH-QbN5BcQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3ksKy8FmdwpeWF52rPYk16zPYN4pg", - width: 800, - height: 450, - ), - Thumbnail( - url: "https://i.ytimg.com/vi/MBH-QbN5BcQ/hq720.jpg?sqp=-oaymwEXCNUGEOADIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lfMhiN7qWWYCkvyhloPNJsjK6p5g", - width: 853, - height: 480, - ), - ], - channel: Some(ChannelId( - id: "UCjD0UddJFWadpaTrBJPOVGw", - name: "Raphaël Weissreiner", + Track(TrackItem( + id: "26OrUhkRa3c", + name: "Top Hits 2020 Video Mix (CLEAN) | Hip Hop 2020 - (POP HITS 2020, TOP 40 HITS, BEST POP HITS,TOP 40)", + duration: Some(10012), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/26OrUhkRa3c/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3mtPP2bCRAx6JAsJ3NGPbFrs06n6w", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCM7nREGFBumYELglbtUL8FA"), + name: "Top Music", + ), + ], + artist_id: Some("UCM7nREGFBumYELglbtUL8FA"), + album: None, + view_count: Some(2100000), + is_video: true, + track_nr: None, + by_va: false, )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PLX6L4t7t6ZanfCJ1wBxRdGZ_mk9ygmKqo", - name: "Deutsch Pop Hits NEU 2022", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/AhXFgxhzyIQumeUtEasnjczPfMXZLWu5gBNlWW_z-Evb0sbcJLPHTMuKzy0cbsBHqDhDSNA7Lg=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/AhXFgxhzyIQumeUtEasnjczPfMXZLWu5gBNlWW_z-Evb0sbcJLPHTMuKzy0cbsBHqDhDSNA7Lg=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/AhXFgxhzyIQumeUtEasnjczPfMXZLWu5gBNlWW_z-Evb0sbcJLPHTMuKzy0cbsBHqDhDSNA7Lg=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCesP91XKnuZVd6OJN06hokg", - name: "Startup Records", + Track(TrackItem( + id: "Idk-oFqn3kM", + name: "THE BEST CHARTS POP HITS 2021 I THE BEST MUSIC RADIO CHARTS I", + duration: Some(8795), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Idk-oFqn3kM/hqdefault.jpg?sqp=-oaymwEWCMACELQBIAQqCghQEJADGFogjgJIWg&rs=AMzJL3lm-ElqoCByIARJE5_7xs7jLv9AHA", + width: 320, + height: 180, + ), + ], + artists: [ + ArtistId( + id: Some("UCOVD3PtbJGiAcp-c6opijoQ"), + name: "SCHLAGER AKTUELL", + ), + ], + artist_id: Some("UCOVD3PtbJGiAcp-c6opijoQ"), + album: None, + view_count: Some(67000), + is_video: true, + track_nr: None, + by_va: false, )), - track_count: None, - from_ytm: false, - ), - ], + Album(AlbumItem( + id: "MPREb_CYbQPbuAWrt", + name: "Pop Radio", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Lh8ESFXrI084BAHjCQTPTAwtMRxDiU3NqfCDNT0IHrG6s8eqPHzPbY5O5SumZaxwjq2g4EEtPIak47Sm=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [], + artist_id: None, + album_type: Album, + year: Some(2016), + by_va: true, + )), + Album(AlbumItem( + id: "MPREb_Cmf1lWfv0dV", + name: "Pop Radio", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/f0kOUZ3WurOC8qwxQ0JHtWhrmOGzwANS0x23Yw7iK9OdIvct4kMjJwNHla99_AI96-JBHwcq4Afs6rI=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [], + artist_id: None, + album_type: Album, + year: Some(2022), + by_va: true, + )), + Album(AlbumItem( + id: "MPREb_Ic1ZUsaeuRv", + name: "Pop Radio", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/AFWgHYm5Q7LdNo83TGXQWVApLntgB76Z8Vdf5wBMCxVhzwzcInS0uo2S9E_c6d9brP9MXjkAZW0X4EQ=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCG7LUZBrK6GcfTwowTeTiOQ"), + name: "Strange Radio", + ), + ], + artist_id: Some("UCG7LUZBrK6GcfTwowTeTiOQ"), + album_type: Album, + year: Some(2002), + by_va: false, + )), + Playlist(MusicPlaylistItem( + id: "RDCLAK5uy_l8kJfTElp2zFMop7IboOXetbbKU3a9VeQ", + name: "REST Turkish Rap", + thumbnail: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/xhb5UI1wFvzj6g6llLK2GBBxL1M_ozXRIMXDOIcMyeVY3yG58_qnqRbfbpqlI-C2wUaGU9_re5yC7Tzg=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + channel: None, + track_count: Some(50), + from_ytm: true, + )), + Playlist(MusicPlaylistItem( + id: "RDCLAK5uy_kLB769E3eFSzgy4fbpu6-1YPLh90b0JAY", + name: "Pop Hotlist", + thumbnail: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/YlPXlLEWrIQjBJ37sKN96YLw8x5nDpPgqGWaUmOft0S0C0arw-MJr3cKvKzWGjLAtDxCTIA_Uobx9sA=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + channel: None, + track_count: Some(54), + from_ytm: true, + )), + Playlist(MusicPlaylistItem( + id: "RDCLAK5uy_mCvOm3kQy1RTBwDOGYkNhtHwMO89ffquk", + name: "Crème French Pop", + thumbnail: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/Tnkqaz7qIHSzvdyK2UqNQZCcV9fCKfc98a4FoN0iD1cPMn6j_8apdd0ukTdbe2Dlu11EnV1QuYRuGgE=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + channel: None, + track_count: Some(50), + from_ytm: true, + )), + Playlist(MusicPlaylistItem( + id: "PL47aILYuQXEKiHdqMfNCHat1Gck3XQrrK", + name: "Today\'s Pop Hits Playlist 2022 ♫ Best Radio Hits 2022", + thumbnail: [ + Thumbnail( + url: "https://yt3.googleusercontent.com/l9yiCtp9NGGXn397Jybr_7_4I8TvjKpp9XG54Tv8ZfwkimDWvCfSJXNTf-x9XlgSzsOxdh0doJw=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/l9yiCtp9NGGXn397Jybr_7_4I8TvjKpp9XG54Tv8ZfwkimDWvCfSJXNTf-x9XlgSzsOxdh0doJw=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/l9yiCtp9NGGXn397Jybr_7_4I8TvjKpp9XG54Tv8ZfwkimDWvCfSJXNTf-x9XlgSzsOxdh0doJw=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCEYgc2eKzQXQ9OGCuT4JVPQ", + name: "Redlist - International Playlists", + )), + track_count: None, + from_ytm: false, + )), + Playlist(MusicPlaylistItem( + id: "PL5ITQ2Yq_HLpidRR3wAio-YRBnG7-FeLd", + name: "Radio Swiss Pop", + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/MBH-QbN5BcQ/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nIIqml8U-wrYWs5ZG8jbBPxOahQA", + width: 400, + height: 225, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/MBH-QbN5BcQ/hq720.jpg?sqp=-oaymwEXCKAGEMIDIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3ksKy8FmdwpeWF52rPYk16zPYN4pg", + width: 800, + height: 450, + ), + Thumbnail( + url: "https://i.ytimg.com/vi/MBH-QbN5BcQ/hq720.jpg?sqp=-oaymwEXCNUGEOADIAQqCwjVARCqCBh4INgESFo&rs=AMzJL3lfMhiN7qWWYCkvyhloPNJsjK6p5g", + width: 853, + height: 480, + ), + ], + channel: Some(ChannelId( + id: "UCjD0UddJFWadpaTrBJPOVGw", + name: "Raphaël Weissreiner", + )), + track_count: None, + from_ytm: false, + )), + Playlist(MusicPlaylistItem( + id: "PLX6L4t7t6ZanfCJ1wBxRdGZ_mk9ygmKqo", + name: "Deutsch Pop Hits NEU 2022", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/AhXFgxhzyIQumeUtEasnjczPfMXZLWu5gBNlWW_z-Evb0sbcJLPHTMuKzy0cbsBHqDhDSNA7Lg=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/AhXFgxhzyIQumeUtEasnjczPfMXZLWu5gBNlWW_z-Evb0sbcJLPHTMuKzy0cbsBHqDhDSNA7Lg=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/AhXFgxhzyIQumeUtEasnjczPfMXZLWu5gBNlWW_z-Evb0sbcJLPHTMuKzy0cbsBHqDhDSNA7Lg=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCesP91XKnuZVd6OJN06hokg", + name: "Startup Records", + )), + track_count: None, + from_ytm: false, + )), + Artist(ArtistItem( + id: "UCSZJrhZ2_ILCpyk3Z3AZVTA", + name: "Icona Pop", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/sw3ilLK-equKu_EtKG1ehnbNqbmo55ZqS_LjOlu4SuYRQrGyWoxIMF9OSw4ORpVtgYlKoeJGD4thG7k=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/sw3ilLK-equKu_EtKG1ehnbNqbmo55ZqS_LjOlu4SuYRQrGyWoxIMF9OSw4ORpVtgYlKoeJGD4thG7k=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(713000), + )), + Artist(ArtistItem( + id: "UCOk0CLydqB-B0UH7UaZrVqw", + name: "Bacilos", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/HtQH-8U0IvzGUjkEzOZjpLEBdqcEBaSRAmpneHhtXbiZHL1rJsoq8iJFwcCSMY7PlM-UuzVGDkoJn6k=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/HtQH-8U0IvzGUjkEzOZjpLEBdqcEBaSRAmpneHhtXbiZHL1rJsoq8iJFwcCSMY7PlM-UuzVGDkoJn6k=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(339000), + )), + Artist(ArtistItem( + id: "UC-Unifbw_ADqgIeMq4AdvvA", + name: "Death Pop Radio", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/P8DRNrrBP_x4GmPXXKJkWKroLuMCpGW4DJTgxFPYFI-MlLk3pI6xOYMpMnzyb49md-8VVn9L3RHNTfMq=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/P8DRNrrBP_x4GmPXXKJkWKroLuMCpGW4DJTgxFPYFI-MlLk3pI6xOYMpMnzyb49md-8VVn9L3RHNTfMq=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(11), + )), + ], + ctoken: None, + endpoint: music_search, + ), corrected_query: None, - order: [ - Track, - Album, - Playlist, - Artist, - ], ) diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_typo.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_typo.snap index 9e43c4d..d37ab3c 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_typo.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_main_typo.snap @@ -3,463 +3,456 @@ source: src/client/music_search.rs expression: map_res.c --- MusicSearchResult( - tracks: [ - TrackItem( - id: "6485PhOtHzY", - name: "Lieblingsmensch", - duration: Some(191), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - name: "Namika", - ), - ], - artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - album: Some(AlbumId( + items: Paginator( + count: Some(16), + items: [ + Album(AlbumItem( id: "MPREb_RXHxrUFfrvQ", name: "Lieblingsmensch", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + name: "Namika", + ), + ], + artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + album_type: Single, + year: Some(2015), + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "pt0YvfnhGgI", - name: "Lieblingsmensch", - duration: Some(524), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCCpID8TTjkkjLCwBybAfHSg"), - name: "Boris Brejcha", - ), - ], - artist_id: Some("UCCpID8TTjkkjLCwBybAfHSg"), - album: Some(AlbumId( + Track(TrackItem( + id: "6485PhOtHzY", + name: "Lieblingsmensch", + duration: Some(191), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + name: "Namika", + ), + ], + artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + album: Some(AlbumId( + id: "MPREb_RXHxrUFfrvQ", + name: "Lieblingsmensch", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "pt0YvfnhGgI", + name: "Lieblingsmensch", + duration: Some(524), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCCpID8TTjkkjLCwBybAfHSg"), + name: "Boris Brejcha", + ), + ], + artist_id: Some("UCCpID8TTjkkjLCwBybAfHSg"), + album: Some(AlbumId( + id: "MPREb_VFqQlfPhsFW", + name: "Lieblingsmensch", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "0yPnvetCm-U", + name: "Lieblingsmensch", + duration: Some(174), + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/RORTouE503-ZZqgAov66r2cK-YyTJbZIwbM1Hz58ja7jNgWSG_xjTLxK41nwAT8ejRvY7U35dMm4OOYhYg=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/RORTouE503-ZZqgAov66r2cK-YyTJbZIwbM1Hz58ja7jNgWSG_xjTLxK41nwAT8ejRvY7U35dMm4OOYhYg=w120-h120-l90-rj", + width: 120, + height: 120, + ), + ], + artists: [ + ArtistId( + id: Some("UCvfUKCnUBfsZAVHgF-pYmJg"), + name: "Voyce", + ), + ], + artist_id: Some("UCvfUKCnUBfsZAVHgF-pYmJg"), + album: Some(AlbumId( + id: "MPREb_SpT32xAd4YR", + name: "Gegenstück EP", + )), + view_count: None, + is_video: false, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "3ryohiCVq3M", + name: "Namika - Lieblingsmensch (Official Video)", + duration: Some(191), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/3ryohiCVq3M/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nsa7wZ13z3ie49RzcBHKQAmjlU9w", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + name: "Namika", + ), + ], + artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + album: None, + view_count: Some(108000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "6Bt1KeMNqvc", + name: "Lieblingsmensch Namika Lyrics", + duration: Some(188), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/6Bt1KeMNqvc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n9IkVmxE5YqesHGPS0xtJemxrNzQ", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCgoJMRKimbxB374QjHgE6kA"), + name: "jessika adam", + ), + ], + artist_id: Some("UCgoJMRKimbxB374QjHgE6kA"), + album: None, + view_count: Some(10000000), + is_video: true, + track_nr: None, + by_va: false, + )), + Track(TrackItem( + id: "5YQRHUItXTI", + name: "Namika - Lieblingsmensch 1 Hour Version", + duration: Some(3801), + cover: [ + Thumbnail( + url: "https://i.ytimg.com/vi/5YQRHUItXTI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kP0NYgZ5YbsGdULVIXOu08eoHGrw", + width: 400, + height: 225, + ), + ], + artists: [ + ArtistId( + id: Some("UCiQjRO2m3dBBlg7sqTaFA_A"), + name: "ZockerAlarm", + ), + ], + artist_id: Some("UCiQjRO2m3dBBlg7sqTaFA_A"), + album: None, + view_count: Some(56000), + is_video: true, + track_nr: None, + by_va: false, + )), + Album(AlbumItem( + id: "MPREb_V5f8YfHKp2j", + name: "Lieblingsmensch", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + name: "Namika", + ), + ], + artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), + album_type: Ep, + year: Some(2015), + by_va: false, + )), + Album(AlbumItem( + id: "MPREb_AlIjxpnBKtn", + name: "Lieblingsmensch (Edit)", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCCpID8TTjkkjLCwBybAfHSg"), + name: "Boris Brejcha", + ), + ], + artist_id: Some("UCCpID8TTjkkjLCwBybAfHSg"), + album_type: Single, + year: Some(2019), + by_va: false, + )), + Album(AlbumItem( id: "MPREb_VFqQlfPhsFW", name: "Lieblingsmensch", + cover: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w60-h60-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w120-h120-l90-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w226-h226-l90-rj", + width: 226, + height: 226, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w544-h544-l90-rj", + width: 544, + height: 544, + ), + ], + artists: [ + ArtistId( + id: Some("UCCpID8TTjkkjLCwBybAfHSg"), + name: "Boris Brejcha", + ), + ], + artist_id: Some("UCCpID8TTjkkjLCwBybAfHSg"), + album_type: Single, + year: Some(2019), + by_va: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "0yPnvetCm-U", - name: "Lieblingsmensch", - duration: Some(174), - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/RORTouE503-ZZqgAov66r2cK-YyTJbZIwbM1Hz58ja7jNgWSG_xjTLxK41nwAT8ejRvY7U35dMm4OOYhYg=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/RORTouE503-ZZqgAov66r2cK-YyTJbZIwbM1Hz58ja7jNgWSG_xjTLxK41nwAT8ejRvY7U35dMm4OOYhYg=w120-h120-l90-rj", - width: 120, - height: 120, - ), - ], - artists: [ - ArtistId( - id: Some("UCvfUKCnUBfsZAVHgF-pYmJg"), - name: "Voyce", - ), - ], - artist_id: Some("UCvfUKCnUBfsZAVHgF-pYmJg"), - album: Some(AlbumId( - id: "MPREb_SpT32xAd4YR", - name: "Gegenstück EP", + Playlist(MusicPlaylistItem( + id: "PL46jG0sBz4EabjYqv0tVEd1RvrZRjfJ8m", + name: "Lieblingsmensch", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/by72Kvz8N4he_jFPWRBMwQhNJiFa-Zy-rstO8aVacuFMZiH6tYQUMLbUtNZOs_8m2evJ59ccTKM=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/by72Kvz8N4he_jFPWRBMwQhNJiFa-Zy-rstO8aVacuFMZiH6tYQUMLbUtNZOs_8m2evJ59ccTKM=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/by72Kvz8N4he_jFPWRBMwQhNJiFa-Zy-rstO8aVacuFMZiH6tYQUMLbUtNZOs_8m2evJ59ccTKM=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UC2iUWrsf_RJIskqCZZHz4tg", + name: "Saskia Wehmeyer", + )), + track_count: None, + from_ytm: false, )), - view_count: None, - is_video: false, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "3ryohiCVq3M", - name: "Namika - Lieblingsmensch (Official Video)", - duration: Some(191), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/3ryohiCVq3M/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3nsa7wZ13z3ie49RzcBHKQAmjlU9w", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - name: "Namika", - ), - ], - artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - album: None, - view_count: Some(108000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "6Bt1KeMNqvc", - name: "Lieblingsmensch Namika Lyrics", - duration: Some(188), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/6Bt1KeMNqvc/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3n9IkVmxE5YqesHGPS0xtJemxrNzQ", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCgoJMRKimbxB374QjHgE6kA"), - name: "jessika adam", - ), - ], - artist_id: Some("UCgoJMRKimbxB374QjHgE6kA"), - album: None, - view_count: Some(10000000), - is_video: true, - track_nr: None, - by_va: false, - ), - TrackItem( - id: "5YQRHUItXTI", - name: "Namika - Lieblingsmensch 1 Hour Version", - duration: Some(3801), - cover: [ - Thumbnail( - url: "https://i.ytimg.com/vi/5YQRHUItXTI/sddefault.jpg?sqp=-oaymwEWCJADEOEBIAQqCghqEJQEGHgg6AJIWg&rs=AMzJL3kP0NYgZ5YbsGdULVIXOu08eoHGrw", - width: 400, - height: 225, - ), - ], - artists: [ - ArtistId( - id: Some("UCiQjRO2m3dBBlg7sqTaFA_A"), - name: "ZockerAlarm", - ), - ], - artist_id: Some("UCiQjRO2m3dBBlg7sqTaFA_A"), - album: None, - view_count: Some(56000), - is_video: true, - track_nr: None, - by_va: false, - ), - ], - albums: [ - AlbumItem( - id: "MPREb_RXHxrUFfrvQ", - name: "Lieblingsmensch", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/dwrJ5NnlZU7CBziLRlTm1uizuolakRAX7g34-eKeqEZQGZgwmvhqcs3TiZClfm7v6a-KYHieitdakpPo=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - name: "Namika", - ), - ], - artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - album_type: Single, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_V5f8YfHKp2j", - name: "Lieblingsmensch", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/vh1NIdzUQTuH3jlZFTJ-XK3f_QIUVJGZe1qTE-O1O8MZtylnx7JpYtd0NPSUWFFgIzlysNfbUOaeryr5Zw=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - name: "Namika", - ), - ], - artist_id: Some("UCIh4j8fXWf2U0ro0qnGU8Mg"), - album_type: Ep, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_AlIjxpnBKtn", - name: "Lieblingsmensch (Edit)", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/52NEd25MuR_LmWQw_sbHEm1s4jdiUm1SB25aLeFSaz70Z89GTdghmRNd21YgggAFbAg4NgMHiGpSdCyANw=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCCpID8TTjkkjLCwBybAfHSg"), - name: "Boris Brejcha", - ), - ], - artist_id: Some("UCCpID8TTjkkjLCwBybAfHSg"), - album_type: Single, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_VFqQlfPhsFW", - name: "Lieblingsmensch", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w60-h60-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w120-h120-l90-rj", - width: 120, - height: 120, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/38mrm1ntm4MQfmB4Pl2EdY7o6McbLq06sC7qqLxDMqOfL-eqySheDnfl3IOpZYIE_ozt6Bywlmjj2DCe=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], - artists: [ - ArtistId( - id: Some("UCCpID8TTjkkjLCwBybAfHSg"), - name: "Boris Brejcha", - ), - ], - artist_id: Some("UCCpID8TTjkkjLCwBybAfHSg"), - album_type: Single, - year: Some(2019), - by_va: false, - ), - ], - artists: [ - ArtistItem( - id: "UCIh4j8fXWf2U0ro0qnGU8Mg", - name: "Namika", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/iY5H0k9sMP6hevj7ttwx2WibgxmJ9OMoK9TuVHwUMvdA8ZrrJCdGYT_BG-HhgYcVDihVJMQqSKbOcpk=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/iY5H0k9sMP6hevj7ttwx2WibgxmJ9OMoK9TuVHwUMvdA8ZrrJCdGYT_BG-HhgYcVDihVJMQqSKbOcpk=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(737000), - ), - ArtistItem( - id: "UCCpID8TTjkkjLCwBybAfHSg", - name: "Boris Brejcha", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/2aw3EVIIy1zbuvkl0txoqPBGUjvkv056NUzc6Qdz5ZdmknsJr28AQig7HTy_q9xqYC4LjVsyffl-9shZ=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/2aw3EVIIy1zbuvkl0txoqPBGUjvkv056NUzc6Qdz5ZdmknsJr28AQig7HTy_q9xqYC4LjVsyffl-9shZ=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(988000), - ), - ArtistItem( - id: "UCZnutiGgJ2LrrwzDH_ElSDg", - name: "Dendemann", - avatar: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/G_nI16FH_wiRKj1HAhmltOA-vTifD8UVwsNcJGKu40c6Y2A6Pg2S6o6f5EajkIZguv8JAt1mU9V66dw=w60-h60-p-l90-rj", - width: 60, - height: 60, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/G_nI16FH_wiRKj1HAhmltOA-vTifD8UVwsNcJGKu40c6Y2A6Pg2S6o6f5EajkIZguv8JAt1mU9V66dw=w120-h120-p-l90-rj", - width: 120, - height: 120, - ), - ], - subscriber_count: Some(22700), - ), - ], - playlists: [ - MusicPlaylistItem( - id: "PL46jG0sBz4EabjYqv0tVEd1RvrZRjfJ8m", - name: "Lieblingsmensch", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/by72Kvz8N4he_jFPWRBMwQhNJiFa-Zy-rstO8aVacuFMZiH6tYQUMLbUtNZOs_8m2evJ59ccTKM=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/by72Kvz8N4he_jFPWRBMwQhNJiFa-Zy-rstO8aVacuFMZiH6tYQUMLbUtNZOs_8m2evJ59ccTKM=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/by72Kvz8N4he_jFPWRBMwQhNJiFa-Zy-rstO8aVacuFMZiH6tYQUMLbUtNZOs_8m2evJ59ccTKM=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UC2iUWrsf_RJIskqCZZHz4tg", - name: "Saskia Wehmeyer", + Playlist(MusicPlaylistItem( + id: "PL-2Z-8cOvEixQ2EKumbXXW8XivJG6U7-D", + name: "Namika - Lieblingsmensch", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/wQgbTyXbuwVAO1fK5Ssk6CfhXuRO0w-k8ipIv8nNsrD88lIL4wWMPkeDenb3Dy-XbqcCZNOVOkk=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/wQgbTyXbuwVAO1fK5Ssk6CfhXuRO0w-k8ipIv8nNsrD88lIL4wWMPkeDenb3Dy-XbqcCZNOVOkk=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/wQgbTyXbuwVAO1fK5Ssk6CfhXuRO0w-k8ipIv8nNsrD88lIL4wWMPkeDenb3Dy-XbqcCZNOVOkk=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCSj8sEcs5CEUmeIZMSPB7Ew", + name: "Daniel Switali", + )), + track_count: None, + from_ytm: false, )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PL-2Z-8cOvEixQ2EKumbXXW8XivJG6U7-D", - name: "Namika - Lieblingsmensch", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/wQgbTyXbuwVAO1fK5Ssk6CfhXuRO0w-k8ipIv8nNsrD88lIL4wWMPkeDenb3Dy-XbqcCZNOVOkk=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/wQgbTyXbuwVAO1fK5Ssk6CfhXuRO0w-k8ipIv8nNsrD88lIL4wWMPkeDenb3Dy-XbqcCZNOVOkk=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/wQgbTyXbuwVAO1fK5Ssk6CfhXuRO0w-k8ipIv8nNsrD88lIL4wWMPkeDenb3Dy-XbqcCZNOVOkk=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCSj8sEcs5CEUmeIZMSPB7Ew", - name: "Daniel Switali", + Playlist(MusicPlaylistItem( + id: "PLDnJKuRrOR5sx_jZ8-dsweq1OdayL_kpz", + name: "Lieblingsmensch", + thumbnail: [ + Thumbnail( + url: "https://yt3.ggpht.com/xij8t1OQqD8qwjx4AaYBbKkXsQDB5L70hKuFBicbaw7fQ2m9NMdsm_86bxyIIeyblwcm9FaWiA=s192", + width: 192, + height: 192, + ), + Thumbnail( + url: "https://yt3.ggpht.com/xij8t1OQqD8qwjx4AaYBbKkXsQDB5L70hKuFBicbaw7fQ2m9NMdsm_86bxyIIeyblwcm9FaWiA=s576", + width: 576, + height: 576, + ), + Thumbnail( + url: "https://yt3.ggpht.com/xij8t1OQqD8qwjx4AaYBbKkXsQDB5L70hKuFBicbaw7fQ2m9NMdsm_86bxyIIeyblwcm9FaWiA=s1200", + width: 1200, + height: 1200, + ), + ], + channel: Some(ChannelId( + id: "UCs2uL32TTzWX0oVoblPF1nQ", + name: "Nicole Kr", + )), + track_count: None, + from_ytm: false, )), - track_count: None, - from_ytm: false, - ), - MusicPlaylistItem( - id: "PLDnJKuRrOR5sx_jZ8-dsweq1OdayL_kpz", - name: "Lieblingsmensch", - thumbnail: [ - Thumbnail( - url: "https://yt3.ggpht.com/xij8t1OQqD8qwjx4AaYBbKkXsQDB5L70hKuFBicbaw7fQ2m9NMdsm_86bxyIIeyblwcm9FaWiA=s192", - width: 192, - height: 192, - ), - Thumbnail( - url: "https://yt3.ggpht.com/xij8t1OQqD8qwjx4AaYBbKkXsQDB5L70hKuFBicbaw7fQ2m9NMdsm_86bxyIIeyblwcm9FaWiA=s576", - width: 576, - height: 576, - ), - Thumbnail( - url: "https://yt3.ggpht.com/xij8t1OQqD8qwjx4AaYBbKkXsQDB5L70hKuFBicbaw7fQ2m9NMdsm_86bxyIIeyblwcm9FaWiA=s1200", - width: 1200, - height: 1200, - ), - ], - channel: Some(ChannelId( - id: "UCs2uL32TTzWX0oVoblPF1nQ", - name: "Nicole Kr", + Artist(ArtistItem( + id: "UCIh4j8fXWf2U0ro0qnGU8Mg", + name: "Namika", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/iY5H0k9sMP6hevj7ttwx2WibgxmJ9OMoK9TuVHwUMvdA8ZrrJCdGYT_BG-HhgYcVDihVJMQqSKbOcpk=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/iY5H0k9sMP6hevj7ttwx2WibgxmJ9OMoK9TuVHwUMvdA8ZrrJCdGYT_BG-HhgYcVDihVJMQqSKbOcpk=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(737000), )), - track_count: None, - from_ytm: false, - ), - ], + Artist(ArtistItem( + id: "UCCpID8TTjkkjLCwBybAfHSg", + name: "Boris Brejcha", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/2aw3EVIIy1zbuvkl0txoqPBGUjvkv056NUzc6Qdz5ZdmknsJr28AQig7HTy_q9xqYC4LjVsyffl-9shZ=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/2aw3EVIIy1zbuvkl0txoqPBGUjvkv056NUzc6Qdz5ZdmknsJr28AQig7HTy_q9xqYC4LjVsyffl-9shZ=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(988000), + )), + Artist(ArtistItem( + id: "UCZnutiGgJ2LrrwzDH_ElSDg", + name: "Dendemann", + avatar: [ + Thumbnail( + url: "https://lh3.googleusercontent.com/G_nI16FH_wiRKj1HAhmltOA-vTifD8UVwsNcJGKu40c6Y2A6Pg2S6o6f5EajkIZguv8JAt1mU9V66dw=w60-h60-p-l90-rj", + width: 60, + height: 60, + ), + Thumbnail( + url: "https://lh3.googleusercontent.com/G_nI16FH_wiRKj1HAhmltOA-vTifD8UVwsNcJGKu40c6Y2A6Pg2S6o6f5EajkIZguv8JAt1mU9V66dw=w120-h120-p-l90-rj", + width: 120, + height: 120, + ), + ], + subscriber_count: Some(22700), + )), + ], + ctoken: None, + endpoint: music_search, + ), corrected_query: Some("lieblingsmensch"), - order: [ - Album, - Track, - Playlist, - Artist, - ], ) diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_community.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_community.snap index aeccc82..a5b626d 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_community.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_community.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_ytm.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_ytm.snap index 1773035..00daa94 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_ytm.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_playlists_ytm.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_default.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_default.snap index 71a783a..4b18010 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_default.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_default.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_no_artist_link.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_no_artist_link.snap index 7fdd958..5c2d043 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_no_artist_link.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_no_artist_link.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: Some(7), items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_typo.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_typo.snap index 3ba28b1..06bc59d 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_typo.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_typo.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_videos.snap b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_videos.snap index 347a427..d41b358 100644 --- a/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_videos.snap +++ b/src/client/snapshots/rustypipe__client__music_search__tests__map_music_search_tracks_videos.snap @@ -2,7 +2,7 @@ source: src/client/music_search.rs expression: map_res.c --- -MusicSearchFiltered( +MusicSearchResult( items: Paginator( count: None, items: [ diff --git a/src/model/mod.rs b/src/model/mod.rs index 4bf7b37..b44eb83 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -810,9 +810,9 @@ pub struct ChannelRssVideo { /// YouTube search result #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub struct SearchResult { +pub struct SearchResult { /// Search result items - pub items: Paginator, + pub items: Paginator, /// Corrected search query /// /// If the search term containes a typo, YouTube instead searches @@ -1143,29 +1143,6 @@ pub struct MusicArtist { pub radio_id: Option, } -/// YouTube Music search result -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[non_exhaustive] -pub struct MusicSearchResult { - /// Found tracks - pub tracks: Vec, - /// Found albums - pub albums: Vec, - /// Found artists - pub artists: Vec, - /// Found playlists - pub playlists: Vec, - /// Corrected search query - /// - /// If the search term containes a typo, YouTube instead searches - /// for the corrected search term and displays it on top of the - /// search results page. - pub corrected_query: Option, - /// Order of the item sections of the search page, starting with - /// the most relevant. - pub order: Vec, -} - /// Generic YouTube Music item #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[allow(missing_docs)] @@ -1186,10 +1163,10 @@ pub enum MusicItemType { Playlist, } -/// Filtered YouTube Music search result (one item type) +/// YouTube Music search result #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] -pub struct MusicSearchFiltered { +pub struct MusicSearchResult { /// Search items pub items: Paginator, /// Corrected search query diff --git a/src/model/paginator.rs b/src/model/paginator.rs index 2139ade..a59e377 100644 --- a/src/model/paginator.rs +++ b/src/model/paginator.rs @@ -1,7 +1,5 @@ //! Wrapper model for progressively fetched items -use std::convert::TryInto; - use serde::{Deserialize, Serialize}; /// Wrapper around progressively fetched items diff --git a/src/param/search_filter.rs b/src/param/search_filter.rs index b0edf71..92ea81b 100644 --- a/src/param/search_filter.rs +++ b/src/param/search_filter.rs @@ -217,6 +217,38 @@ impl SearchFilter { } } +/// YouTube Music search filter +/// +/// Allows you to filter YTM search results by item type. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum MusicSearchFilter { + /// YouTube Music tracks + Tracks, + /// YouTube videos + Videos, + /// Albums + Albums, + /// Artists + Artists, + /// Playlists created by YouTube Music + YtmPlaylists, + /// Playlists created by YouTube users + CommunityPlaylists, +} + +impl MusicSearchFilter { + pub(crate) fn params(self) -> &'static str { + match self { + MusicSearchFilter::Tracks => "EgWKAQIIAWoMEAMQBBAJEA4QChAF", + MusicSearchFilter::Videos => "EgWKAQIQAWoMEAMQBBAJEA4QChAF", + MusicSearchFilter::Albums => "EgWKAQIYAWoMEAMQBBAJEA4QChAF", + MusicSearchFilter::Artists => "EgWKAQIgAWoMEAMQBBAJEA4QChAF", + MusicSearchFilter::YtmPlaylists => "EgeKAQQoADgBagwQAxAEEAkQDhAKEAU%3D", + MusicSearchFilter::CommunityPlaylists => "EgeKAQQoAEABagwQAxAEEAkQDhAKEAU%3D", + } + } +} + #[cfg(test)] mod tests { use rstest::rstest; diff --git a/tests/youtube.rs b/tests/youtube.rs index 118ad28..cc50841 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -5,25 +5,22 @@ use std::fmt::Display; use std::str::FromStr; use rstest::{fixture, rstest}; -use rustypipe::model::paginator::ContinuationEndpoint; -use rustypipe::param::{ChannelOrder, ChannelVideoTab, Language}; -use rustypipe::validate; -use time::macros::date; -use time::OffsetDateTime; +use time::{macros::date, OffsetDateTime}; use rustypipe::client::{ClientType, RustyPipe, RustyPipeQuery}; use rustypipe::error::{Error, ExtractionError, UnavailabilityReason}; use rustypipe::model::{ - paginator::Paginator, + paginator::{ContinuationEndpoint, Paginator}, richtext::ToPlaintext, traits::{FromYtItem, YtStream}, - AlbumType, AudioCodec, AudioFormat, AudioTrackType, Channel, Frameset, MusicGenre, - MusicItemType, UrlTarget, Verification, VideoCodec, VideoFormat, YouTubeItem, + AlbumType, AudioCodec, AudioFormat, AudioTrackType, Channel, Frameset, MusicGenre, MusicItem, + UrlTarget, Verification, VideoCodec, VideoFormat, YouTubeItem, }; use rustypipe::param::{ search_filter::{self, SearchFilter}, - Country, + ChannelOrder, ChannelVideoTab, Country, Language, }; +use rustypipe::validate; //#PLAYER @@ -1162,7 +1159,7 @@ mod channel_rss { #[rstest] fn search(rp: RustyPipe, unlocalized: bool) { - let result = tokio_test::block_on(rp.query().search("doobydoobap")).unwrap(); + let result = tokio_test::block_on(rp.query().search::("doobydoobap")).unwrap(); assert_gte( result.items.count.unwrap(), @@ -1182,10 +1179,10 @@ fn search(rp: RustyPipe, unlocalized: bool) { #[case::channel(search_filter::ItemType::Channel)] #[case::playlist(search_filter::ItemType::Playlist)] fn search_filter_item_type(#[case] item_type: search_filter::ItemType, rp: RustyPipe) { - let mut result = tokio_test::block_on( - rp.query() - .search_filter("with no videos", &SearchFilter::new().item_type(item_type)), - ) + let mut result = tokio_test::block_on(rp.query().search_filter::( + "with no videos", + &SearchFilter::new().item_type(item_type), + )) .unwrap(); tokio_test::block_on(result.items.extend(rp.query())).unwrap(); @@ -1207,7 +1204,7 @@ fn search_filter_item_type(#[case] item_type: search_filter::ItemType, rp: Rusty #[rstest] fn search_empty(rp: RustyPipe) { let result = tokio_test::block_on( - rp.query().search_filter( + rp.query().search_filter::( "3gig84hgi34gu8vj34gj489", &search_filter::SearchFilter::new() .feature(search_filter::Feature::IsLive) @@ -1602,18 +1599,15 @@ fn music_artist_albums_not_found(rp: RustyPipe) { #[rstest] #[case::default(false)] #[case::typo(true)] -fn music_search(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { - let res = tokio_test::block_on(rp.query().music_search(match typo { +fn music_search_main(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { + let res = tokio_test::block_on(rp.query().music_search_main(match typo { false => "lieblingsmensch namika", true => "lieblingsmesch namika", })) .unwrap(); + let items = res.items.items; - assert!(!res.tracks.is_empty(), "no tracks"); - assert!(!res.albums.is_empty(), "no albums"); - assert!(!res.artists.is_empty(), "no artists"); - assert!(!res.playlists.is_empty(), "no playlists"); - assert_eq!(res.order[0], MusicItemType::Track); + check_search_result(&items); if typo { if unlocalized { @@ -1623,12 +1617,21 @@ fn music_search(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { assert_eq!(res.corrected_query, None); } - let track = &res - .tracks + let track = items .iter() - .find(|a| a.id == "6485PhOtHzY") + .find_map(|itm| { + if let MusicItem::Track(track) = itm { + if track.id == "6485PhOtHzY" { + Some(track) + } else { + None + } + } else { + None + } + }) .unwrap_or_else(|| { - panic!("could not find track, got {:#?}", &res.tracks); + panic!("could not find track, got {:#?}", &items); }); assert_eq!(track.name, "Lieblingsmensch"); @@ -1654,21 +1657,27 @@ fn music_search(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { } #[rstest] -fn music_search2(rp: RustyPipe, unlocalized: bool) { - let res = tokio_test::block_on(rp.query().music_search("taylor swift")).unwrap(); +fn music_search_main2(rp: RustyPipe, unlocalized: bool) { + let res = tokio_test::block_on(rp.query().music_search_main("taylor swift")).unwrap(); + let items = res.items.items; - assert!(!res.tracks.is_empty(), "no tracks"); - assert!(!res.albums.is_empty(), "no albums"); - assert!(!res.artists.is_empty(), "no artists"); - assert!(!res.playlists.is_empty(), "no playlists"); - assert_eq!(res.order[0], MusicItemType::Artist); + check_search_result(&items); - let artist = &res - .artists + let artist = items .iter() - .find(|a| a.id == "UCPC0L1d253x-KuMNwa05TpA") + .find_map(|itm| { + if let MusicItem::Artist(artist) = itm { + if artist.id == "UCPC0L1d253x-KuMNwa05TpA" { + Some(artist) + } else { + None + } + } else { + None + } + }) .unwrap_or_else(|| { - panic!("could not find artist, got {:#?}", &res.artists); + panic!("could not find artist, got {:#?}", &items); }); if unlocalized { @@ -1677,6 +1686,37 @@ fn music_search2(rp: RustyPipe, unlocalized: bool) { assert!(!artist.avatar.is_empty(), "got no avatar"); } +fn check_search_result(items: &[MusicItem]) { + assert_gte(items.len(), 10, "search results"); + + let mut has_tracks = false; + let mut has_videos = false; + let mut has_albums = false; + let mut has_artists = false; + let mut has_playlists = false; + + for itm in items { + match itm { + MusicItem::Track(t) => { + if t.is_video { + has_videos = true + } else { + has_tracks = true + } + } + MusicItem::Album(_) => has_albums = true, + MusicItem::Artist(_) => has_artists = true, + MusicItem::Playlist(_) => has_playlists = true, + } + } + + assert!(has_tracks, "no tracks"); + assert!(has_videos, "no videos"); + assert!(has_albums, "no albums"); + assert!(has_artists, "no artists"); + assert!(has_playlists, "no playlists"); +} + #[rstest] fn music_search_tracks(rp: RustyPipe, unlocalized: bool) { let res = tokio_test::block_on(rp.query().music_search_tracks("black mamba")).unwrap(); @@ -1754,23 +1794,35 @@ fn music_search_videos(rp: RustyPipe, unlocalized: bool) { #[case::videos(true)] fn music_search_episode(rp: RustyPipe, #[case] videos: bool) { let query = "Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1"; - let tracks = if videos { - tokio_test::block_on(rp.query().music_search_videos(query)) - .unwrap() - .items - .items - } else { - tokio_test::block_on(rp.query().music_search(query)) - .unwrap() - .tracks - }; + let track_id = "Zq_-LDy7AgE"; - let track = &tracks - .iter() - .find(|a| a.id == "Zq_-LDy7AgE") - .unwrap_or_else(|| { - panic!("could not find episode, got {:#?}", &tracks); - }); + let track = if videos { + let items = tokio_test::block_on(rp.query().music_search_videos(query)) + .unwrap() + .items + .items; + items.iter().find(|a| a.id == track_id).cloned() + } else { + let items = tokio_test::block_on(rp.query().music_search_main(query)) + .unwrap() + .items + .items; + items + .iter() + .find_map(|itm| { + if let MusicItem::Track(track) = itm { + if track.id == track_id { + Some(track) + } else { + None + } + } else { + None + } + }) + .cloned() + } + .expect("could not find episode"); assert_eq!(track.artists.len(), 1); let track_artist = &track.artists[0]; @@ -1967,7 +2019,7 @@ fn music_search_playlists_community(rp: RustyPipe) { /// The YouTube Music search sometimes shows genre radio items. They should be skipped. #[rstest] fn music_search_genre_radio(rp: RustyPipe) { - tokio_test::block_on(rp.query().music_search("pop radio")).unwrap(); + tokio_test::block_on(rp.query().music_search_main("pop radio")).unwrap(); } #[rstest] @@ -2372,7 +2424,7 @@ const VISITOR_DATA_SEARCH_CHANNEL_HANDLES: &str = "CgszYlc1Yk1WZGRCSSjrwOSbBg%3D fn ab3_search_channel_handles() { let rp = rp_visitor_data(VISITOR_DATA_SEARCH_CHANNEL_HANDLES); - tokio_test::block_on(rp.query().search_filter( + tokio_test::block_on(rp.query().search_filter::( "test", &SearchFilter::new().item_type(search_filter::ItemType::Channel), )) From 22deccb4081f86ac479c6824d7a2d4ccebc2dbb9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 21 Nov 2023 13:29:46 +0100 Subject: [PATCH 070/459] feat: add is_empty method to richtext --- src/model/richtext.rs | 7 +++++++ tests/youtube.rs | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/model/richtext.rs b/src/model/richtext.rs index 4f52ab7..aeb81fc 100644 --- a/src/model/richtext.rs +++ b/src/model/richtext.rs @@ -72,6 +72,13 @@ pub trait ToMarkdown { fn to_markdown_yt_host(&self, yt_host: &str) -> String; } +impl RichText { + /// Returns `true` if the rich text contains no text components. + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } +} + impl TextComponent { /// Get the text from the component pub fn get_text(&self) -> &str { diff --git a/tests/youtube.rs b/tests/youtube.rs index cc50841..0d707fe 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -730,6 +730,29 @@ fn get_video_details_agegate(rp: RustyPipe) { assert!(details.recommended.items.is_empty()); } +#[rstest] +fn get_video_details_no_desc(rp: RustyPipe) { + let details = tokio_test::block_on(rp.query().video_details("VYJNSQ_ANyA")).unwrap(); + + assert_eq!(details.id, "VYJNSQ_ANyA"); + assert_eq!(details.name, "Cricket comedy by Modi"); + assert_eq!(details.channel.id, "UC8gBy2lByHxIyoPMglerNWg"); + assert_eq!(details.channel.name, "TMP VIBES"); + assert!(!details.channel.avatar.is_empty(), "no channel avatars"); + + assert!( + details.description.is_empty(), + "got desc: `{}`", + details.description.to_plaintext() + ); + + let date = details.publish_date.unwrap(); + assert_eq!(date.date(), date!(2023 - 11 - 21)); + + assert!(!details.is_live); + assert!(!details.is_ccommons); +} + #[rstest] fn get_video_details_not_found(rp: RustyPipe) { let err = tokio_test::block_on(rp.query().video_details("abcdefgLi5X")).unwrap_err(); From 0a02e946b345482d970692c67a1d00dfa7a9060d Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 23 Nov 2023 02:11:06 +0100 Subject: [PATCH 071/459] chore: update woodpecker pipeline schema --- .woodpecker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 47541f7..c76d6d0 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -1,4 +1,4 @@ -pipeline: +steps: test: image: rust:latest environment: From 7ca17f725ac963761afe8eb9d2151b93ca50ec84 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 23 Nov 2023 03:08:13 +0100 Subject: [PATCH 072/459] fix: failing YTM tests by changing objects --- .../youtube__music_album_audiobook.snap | 401 ++-- .../youtube__music_album_audiobook_intl.snap | 400 ++-- .../youtube__music_album_one_artist.snap | 343 ++-- .../youtube__music_album_one_artist_intl.snap | 257 +-- .../snapshots/youtube__music_album_show.snap | 511 +++-- .../youtube__music_album_show_intl.snap | 423 +++- .../youtube__music_artist_basic_all.snap | 1776 ++++++++++++----- .../youtube__music_artist_basic_all_intl.snap | 1690 ++++++++++++---- tests/youtube.rs | 41 +- 9 files changed, 3937 insertions(+), 1905 deletions(-) diff --git a/tests/snapshots/youtube__music_album_audiobook.snap b/tests/snapshots/youtube__music_album_audiobook.snap index 5c835e3..5699c30 100644 --- a/tests/snapshots/youtube__music_album_audiobook.snap +++ b/tests/snapshots/youtube__music_album_audiobook.snap @@ -1,6 +1,5 @@ --- source: tests/youtube.rs -assertion_line: 1298 expression: album --- MusicAlbum( @@ -31,7 +30,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -47,7 +46,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -63,7 +62,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -79,7 +78,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -95,7 +94,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -111,7 +110,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -127,7 +126,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -143,7 +142,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -159,7 +158,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -175,7 +174,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(10), by_va: false, @@ -191,7 +190,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -207,7 +206,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -223,7 +222,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -239,7 +238,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, @@ -255,7 +254,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(15), by_va: false, @@ -271,7 +270,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(16), by_va: false, @@ -287,7 +286,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(17), by_va: false, @@ -303,7 +302,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(18), by_va: false, @@ -319,7 +318,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(19), by_va: false, @@ -335,7 +334,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(20), by_va: false, @@ -351,7 +350,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(21), by_va: false, @@ -367,7 +366,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(22), by_va: false, @@ -383,7 +382,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(23), by_va: false, @@ -399,7 +398,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(24), by_va: false, @@ -415,7 +414,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(25), by_va: false, @@ -431,7 +430,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(26), by_va: false, @@ -447,7 +446,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(27), by_va: false, @@ -463,7 +462,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(28), by_va: false, @@ -479,7 +478,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(29), by_va: false, @@ -495,7 +494,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(30), by_va: false, @@ -511,7 +510,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(31), by_va: false, @@ -527,7 +526,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(32), by_va: false, @@ -543,7 +542,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(33), by_va: false, @@ -559,7 +558,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(34), by_va: false, @@ -575,7 +574,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(35), by_va: false, @@ -591,7 +590,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(36), by_va: false, @@ -607,7 +606,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(37), by_va: false, @@ -623,7 +622,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(38), by_va: false, @@ -639,7 +638,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(39), by_va: false, @@ -655,7 +654,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(40), by_va: false, @@ -671,7 +670,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(41), by_va: false, @@ -687,7 +686,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(42), by_va: false, @@ -703,7 +702,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(43), by_va: false, @@ -719,7 +718,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(44), by_va: false, @@ -735,7 +734,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(45), by_va: false, @@ -751,7 +750,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(46), by_va: false, @@ -767,7 +766,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(47), by_va: false, @@ -783,7 +782,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(48), by_va: false, @@ -799,7 +798,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(49), by_va: false, @@ -815,7 +814,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(50), by_va: false, @@ -831,7 +830,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(51), by_va: false, @@ -847,7 +846,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(52), by_va: false, @@ -863,7 +862,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(53), by_va: false, @@ -879,7 +878,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(54), by_va: false, @@ -895,7 +894,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(55), by_va: false, @@ -911,7 +910,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(56), by_va: false, @@ -927,7 +926,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(57), by_va: false, @@ -943,7 +942,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(58), by_va: false, @@ -959,7 +958,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(59), by_va: false, @@ -975,7 +974,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(60), by_va: false, @@ -991,7 +990,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(61), by_va: false, @@ -1007,7 +1006,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(62), by_va: false, @@ -1023,7 +1022,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(63), by_va: false, @@ -1039,7 +1038,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(64), by_va: false, @@ -1055,7 +1054,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(65), by_va: false, @@ -1071,7 +1070,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(66), by_va: false, @@ -1087,7 +1086,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(67), by_va: false, @@ -1103,7 +1102,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(68), by_va: false, @@ -1119,7 +1118,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(69), by_va: false, @@ -1135,7 +1134,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(70), by_va: false, @@ -1151,7 +1150,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(71), by_va: false, @@ -1167,7 +1166,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(72), by_va: false, @@ -1183,7 +1182,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(73), by_va: false, @@ -1199,7 +1198,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(74), by_va: false, @@ -1215,7 +1214,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(75), by_va: false, @@ -1231,7 +1230,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(76), by_va: false, @@ -1247,7 +1246,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(77), by_va: false, @@ -1263,7 +1262,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(78), by_va: false, @@ -1279,7 +1278,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(79), by_va: false, @@ -1295,7 +1294,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(80), by_va: false, @@ -1311,7 +1310,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(81), by_va: false, @@ -1327,7 +1326,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(82), by_va: false, @@ -1343,7 +1342,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(83), by_va: false, @@ -1359,7 +1358,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(84), by_va: false, @@ -1375,7 +1374,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(85), by_va: false, @@ -1391,7 +1390,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(86), by_va: false, @@ -1407,7 +1406,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(87), by_va: false, @@ -1423,7 +1422,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(88), by_va: false, @@ -1439,7 +1438,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(90), by_va: false, @@ -1455,7 +1454,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(91), by_va: false, @@ -1471,7 +1470,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(92), by_va: false, @@ -1487,7 +1486,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(93), by_va: false, @@ -1503,7 +1502,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(94), by_va: false, @@ -1519,7 +1518,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(95), by_va: false, @@ -1535,7 +1534,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(96), by_va: false, @@ -1551,7 +1550,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(97), by_va: false, @@ -1567,7 +1566,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(98), by_va: false, @@ -1583,7 +1582,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(99), by_va: false, @@ -1599,7 +1598,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(100), by_va: false, @@ -1615,7 +1614,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(101), by_va: false, @@ -1631,7 +1630,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(102), by_va: false, @@ -1647,7 +1646,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(103), by_va: false, @@ -1663,7 +1662,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(104), by_va: false, @@ -1679,7 +1678,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(105), by_va: false, @@ -1695,7 +1694,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(106), by_va: false, @@ -1711,7 +1710,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(107), by_va: false, @@ -1727,7 +1726,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(108), by_va: false, @@ -1743,7 +1742,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(109), by_va: false, @@ -1759,7 +1758,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(110), by_va: false, @@ -1775,7 +1774,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(111), by_va: false, @@ -1791,7 +1790,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(112), by_va: false, @@ -1807,7 +1806,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(113), by_va: false, @@ -1823,7 +1822,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(114), by_va: false, @@ -1839,7 +1838,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(115), by_va: false, @@ -1855,7 +1854,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(116), by_va: false, @@ -1871,7 +1870,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(117), by_va: false, @@ -1887,7 +1886,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(118), by_va: false, @@ -1903,7 +1902,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(119), by_va: false, @@ -1919,7 +1918,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(120), by_va: false, @@ -1935,7 +1934,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(121), by_va: false, @@ -1951,7 +1950,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(122), by_va: false, @@ -1967,7 +1966,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(123), by_va: false, @@ -1983,7 +1982,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(124), by_va: false, @@ -1999,7 +1998,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(125), by_va: false, @@ -2015,7 +2014,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(126), by_va: false, @@ -2031,7 +2030,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(127), by_va: false, @@ -2047,7 +2046,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(128), by_va: false, @@ -2063,7 +2062,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(129), by_va: false, @@ -2079,7 +2078,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(130), by_va: false, @@ -2095,7 +2094,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(131), by_va: false, @@ -2111,7 +2110,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(132), by_va: false, @@ -2127,7 +2126,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(133), by_va: false, @@ -2143,7 +2142,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(134), by_va: false, @@ -2159,7 +2158,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(135), by_va: false, @@ -2175,7 +2174,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(136), by_va: false, @@ -2191,7 +2190,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(137), by_va: false, @@ -2207,7 +2206,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(138), by_va: false, @@ -2223,7 +2222,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(139), by_va: false, @@ -2239,7 +2238,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(140), by_va: false, @@ -2255,7 +2254,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(141), by_va: false, @@ -2271,7 +2270,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(142), by_va: false, @@ -2287,7 +2286,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(143), by_va: false, @@ -2303,7 +2302,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(144), by_va: false, @@ -2319,7 +2318,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(145), by_va: false, @@ -2335,7 +2334,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(146), by_va: false, @@ -2351,7 +2350,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(147), by_va: false, @@ -2367,7 +2366,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(148), by_va: false, @@ -2383,7 +2382,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(149), by_va: false, @@ -2399,7 +2398,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(150), by_va: false, @@ -2415,7 +2414,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(151), by_va: false, @@ -2431,7 +2430,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(152), by_va: false, @@ -2447,7 +2446,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(153), by_va: false, @@ -2463,7 +2462,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(154), by_va: false, @@ -2479,7 +2478,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(155), by_va: false, @@ -2495,7 +2494,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(156), by_va: false, @@ -2511,7 +2510,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(157), by_va: false, @@ -2527,7 +2526,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(158), by_va: false, @@ -2543,7 +2542,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(159), by_va: false, @@ -2559,7 +2558,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(160), by_va: false, @@ -2575,7 +2574,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(161), by_va: false, @@ -2591,7 +2590,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(162), by_va: false, @@ -2607,7 +2606,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(163), by_va: false, @@ -2623,7 +2622,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(164), by_va: false, @@ -2639,7 +2638,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(165), by_va: false, @@ -2655,7 +2654,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(166), by_va: false, @@ -2671,7 +2670,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(167), by_va: false, @@ -2687,7 +2686,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(168), by_va: false, @@ -2703,7 +2702,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(169), by_va: false, @@ -2719,7 +2718,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(170), by_va: false, @@ -2735,7 +2734,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(171), by_va: false, @@ -2751,7 +2750,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(172), by_va: false, @@ -2767,7 +2766,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(173), by_va: false, @@ -2783,7 +2782,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(174), by_va: false, @@ -2799,7 +2798,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(175), by_va: false, @@ -2815,7 +2814,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(176), by_va: false, @@ -2831,7 +2830,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(177), by_va: false, @@ -2847,7 +2846,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(178), by_va: false, @@ -2863,7 +2862,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(179), by_va: false, @@ -2879,7 +2878,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(180), by_va: false, @@ -2895,7 +2894,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(181), by_va: false, @@ -2911,7 +2910,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(182), by_va: false, @@ -2927,7 +2926,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(183), by_va: false, @@ -2943,7 +2942,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(184), by_va: false, @@ -2959,7 +2958,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(185), by_va: false, @@ -2975,7 +2974,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(186), by_va: false, @@ -2991,7 +2990,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(187), by_va: false, @@ -3007,7 +3006,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(188), by_va: false, @@ -3023,7 +3022,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(189), by_va: false, @@ -3039,7 +3038,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(190), by_va: false, @@ -3055,7 +3054,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(191), by_va: false, @@ -3071,7 +3070,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(192), by_va: false, @@ -3087,7 +3086,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(193), by_va: false, @@ -3103,7 +3102,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(194), by_va: false, @@ -3119,7 +3118,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(195), by_va: false, @@ -3135,7 +3134,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(196), by_va: false, @@ -3151,7 +3150,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(197), by_va: false, @@ -3167,7 +3166,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(198), by_va: false, @@ -3183,7 +3182,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(199), by_va: false, @@ -3199,7 +3198,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(200), by_va: false, @@ -3215,7 +3214,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "1984", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(201), by_va: false, diff --git a/tests/snapshots/youtube__music_album_audiobook_intl.snap b/tests/snapshots/youtube__music_album_audiobook_intl.snap index 3eee56d..d741a01 100644 --- a/tests/snapshots/youtube__music_album_audiobook_intl.snap +++ b/tests/snapshots/youtube__music_album_audiobook_intl.snap @@ -30,7 +30,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(1), by_va: false, @@ -46,7 +46,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(2), by_va: false, @@ -62,7 +62,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(3), by_va: false, @@ -78,7 +78,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(4), by_va: false, @@ -94,7 +94,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(5), by_va: false, @@ -110,7 +110,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(6), by_va: false, @@ -126,7 +126,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(7), by_va: false, @@ -142,7 +142,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(8), by_va: false, @@ -158,7 +158,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(9), by_va: false, @@ -174,7 +174,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(10), by_va: false, @@ -190,7 +190,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(11), by_va: false, @@ -206,7 +206,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(12), by_va: false, @@ -222,7 +222,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, @@ -238,7 +238,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, @@ -254,7 +254,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(15), by_va: false, @@ -270,7 +270,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(16), by_va: false, @@ -286,7 +286,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(17), by_va: false, @@ -302,7 +302,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(18), by_va: false, @@ -318,7 +318,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(19), by_va: false, @@ -334,7 +334,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(20), by_va: false, @@ -350,7 +350,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(21), by_va: false, @@ -366,7 +366,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(22), by_va: false, @@ -382,7 +382,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(23), by_va: false, @@ -398,7 +398,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(24), by_va: false, @@ -414,7 +414,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(25), by_va: false, @@ -430,7 +430,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(26), by_va: false, @@ -446,7 +446,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(27), by_va: false, @@ -462,7 +462,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(28), by_va: false, @@ -478,7 +478,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(29), by_va: false, @@ -494,7 +494,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(30), by_va: false, @@ -510,7 +510,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(31), by_va: false, @@ -526,7 +526,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(32), by_va: false, @@ -542,7 +542,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(33), by_va: false, @@ -558,7 +558,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(34), by_va: false, @@ -574,7 +574,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(35), by_va: false, @@ -590,7 +590,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(36), by_va: false, @@ -606,7 +606,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(37), by_va: false, @@ -622,7 +622,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(38), by_va: false, @@ -638,7 +638,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(39), by_va: false, @@ -654,7 +654,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(40), by_va: false, @@ -670,7 +670,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(41), by_va: false, @@ -686,7 +686,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(42), by_va: false, @@ -702,7 +702,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(43), by_va: false, @@ -718,7 +718,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(44), by_va: false, @@ -734,7 +734,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(45), by_va: false, @@ -750,7 +750,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(46), by_va: false, @@ -766,7 +766,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(47), by_va: false, @@ -782,7 +782,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(48), by_va: false, @@ -798,7 +798,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(49), by_va: false, @@ -814,7 +814,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(50), by_va: false, @@ -830,7 +830,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(51), by_va: false, @@ -846,7 +846,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(52), by_va: false, @@ -862,7 +862,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(53), by_va: false, @@ -878,7 +878,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(54), by_va: false, @@ -894,7 +894,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(55), by_va: false, @@ -910,7 +910,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(56), by_va: false, @@ -926,7 +926,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(57), by_va: false, @@ -942,7 +942,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(58), by_va: false, @@ -958,7 +958,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(59), by_va: false, @@ -974,7 +974,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(60), by_va: false, @@ -990,7 +990,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(61), by_va: false, @@ -1006,7 +1006,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(62), by_va: false, @@ -1022,7 +1022,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(63), by_va: false, @@ -1038,7 +1038,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(64), by_va: false, @@ -1054,7 +1054,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(65), by_va: false, @@ -1070,7 +1070,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(66), by_va: false, @@ -1086,7 +1086,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(67), by_va: false, @@ -1102,7 +1102,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(68), by_va: false, @@ -1118,7 +1118,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(69), by_va: false, @@ -1134,7 +1134,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(70), by_va: false, @@ -1150,7 +1150,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(71), by_va: false, @@ -1166,7 +1166,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(72), by_va: false, @@ -1182,7 +1182,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(73), by_va: false, @@ -1198,7 +1198,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(74), by_va: false, @@ -1214,7 +1214,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(75), by_va: false, @@ -1230,7 +1230,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(76), by_va: false, @@ -1246,7 +1246,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(77), by_va: false, @@ -1262,7 +1262,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(78), by_va: false, @@ -1278,7 +1278,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(79), by_va: false, @@ -1294,7 +1294,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(80), by_va: false, @@ -1310,7 +1310,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(81), by_va: false, @@ -1326,7 +1326,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(82), by_va: false, @@ -1342,7 +1342,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(83), by_va: false, @@ -1358,7 +1358,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(84), by_va: false, @@ -1374,7 +1374,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(85), by_va: false, @@ -1390,7 +1390,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(86), by_va: false, @@ -1406,7 +1406,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(87), by_va: false, @@ -1422,7 +1422,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(88), by_va: false, @@ -1438,7 +1438,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(90), by_va: false, @@ -1454,7 +1454,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(91), by_va: false, @@ -1470,7 +1470,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(92), by_va: false, @@ -1486,7 +1486,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(93), by_va: false, @@ -1502,7 +1502,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(94), by_va: false, @@ -1518,7 +1518,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(95), by_va: false, @@ -1534,7 +1534,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(96), by_va: false, @@ -1550,7 +1550,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(97), by_va: false, @@ -1566,7 +1566,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(98), by_va: false, @@ -1582,7 +1582,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(99), by_va: false, @@ -1598,7 +1598,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(100), by_va: false, @@ -1614,7 +1614,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(101), by_va: false, @@ -1630,7 +1630,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(102), by_va: false, @@ -1646,7 +1646,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(103), by_va: false, @@ -1662,7 +1662,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(104), by_va: false, @@ -1678,7 +1678,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(105), by_va: false, @@ -1694,7 +1694,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(106), by_va: false, @@ -1710,7 +1710,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(107), by_va: false, @@ -1726,7 +1726,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(108), by_va: false, @@ -1742,7 +1742,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(109), by_va: false, @@ -1758,7 +1758,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(110), by_va: false, @@ -1774,7 +1774,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(111), by_va: false, @@ -1790,7 +1790,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(112), by_va: false, @@ -1806,7 +1806,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(113), by_va: false, @@ -1822,7 +1822,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(114), by_va: false, @@ -1838,7 +1838,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(115), by_va: false, @@ -1854,7 +1854,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(116), by_va: false, @@ -1870,7 +1870,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(117), by_va: false, @@ -1886,7 +1886,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(118), by_va: false, @@ -1902,7 +1902,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(119), by_va: false, @@ -1918,7 +1918,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(120), by_va: false, @@ -1934,7 +1934,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(121), by_va: false, @@ -1950,7 +1950,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(122), by_va: false, @@ -1966,7 +1966,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(123), by_va: false, @@ -1982,7 +1982,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(124), by_va: false, @@ -1998,7 +1998,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(125), by_va: false, @@ -2014,7 +2014,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(126), by_va: false, @@ -2030,7 +2030,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(127), by_va: false, @@ -2046,7 +2046,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(128), by_va: false, @@ -2062,7 +2062,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(129), by_va: false, @@ -2078,7 +2078,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(130), by_va: false, @@ -2094,7 +2094,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(131), by_va: false, @@ -2110,7 +2110,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(132), by_va: false, @@ -2126,7 +2126,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(133), by_va: false, @@ -2142,7 +2142,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(134), by_va: false, @@ -2158,7 +2158,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(135), by_va: false, @@ -2174,7 +2174,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(136), by_va: false, @@ -2190,7 +2190,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(137), by_va: false, @@ -2206,7 +2206,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(138), by_va: false, @@ -2222,7 +2222,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(139), by_va: false, @@ -2238,7 +2238,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(140), by_va: false, @@ -2254,7 +2254,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(141), by_va: false, @@ -2270,7 +2270,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(142), by_va: false, @@ -2286,7 +2286,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(143), by_va: false, @@ -2302,7 +2302,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(144), by_va: false, @@ -2318,7 +2318,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(145), by_va: false, @@ -2334,7 +2334,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(146), by_va: false, @@ -2350,7 +2350,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(147), by_va: false, @@ -2366,7 +2366,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(148), by_va: false, @@ -2382,7 +2382,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(149), by_va: false, @@ -2398,7 +2398,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(150), by_va: false, @@ -2414,7 +2414,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(151), by_va: false, @@ -2430,7 +2430,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(152), by_va: false, @@ -2446,7 +2446,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(153), by_va: false, @@ -2462,7 +2462,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(154), by_va: false, @@ -2478,7 +2478,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(155), by_va: false, @@ -2494,7 +2494,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(156), by_va: false, @@ -2510,7 +2510,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(157), by_va: false, @@ -2526,7 +2526,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(158), by_va: false, @@ -2542,7 +2542,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(159), by_va: false, @@ -2558,7 +2558,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(160), by_va: false, @@ -2574,7 +2574,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(161), by_va: false, @@ -2590,7 +2590,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(162), by_va: false, @@ -2606,7 +2606,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(163), by_va: false, @@ -2622,7 +2622,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(164), by_va: false, @@ -2638,7 +2638,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(165), by_va: false, @@ -2654,7 +2654,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(166), by_va: false, @@ -2670,7 +2670,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(167), by_va: false, @@ -2686,7 +2686,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(168), by_va: false, @@ -2702,7 +2702,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(169), by_va: false, @@ -2718,7 +2718,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(170), by_va: false, @@ -2734,7 +2734,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(171), by_va: false, @@ -2750,7 +2750,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(172), by_va: false, @@ -2766,7 +2766,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(173), by_va: false, @@ -2782,7 +2782,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(174), by_va: false, @@ -2798,7 +2798,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(175), by_va: false, @@ -2814,7 +2814,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(176), by_va: false, @@ -2830,7 +2830,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(177), by_va: false, @@ -2846,7 +2846,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(178), by_va: false, @@ -2862,7 +2862,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(179), by_va: false, @@ -2878,7 +2878,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(180), by_va: false, @@ -2894,7 +2894,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(181), by_va: false, @@ -2910,7 +2910,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(182), by_va: false, @@ -2926,7 +2926,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(183), by_va: false, @@ -2942,7 +2942,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(184), by_va: false, @@ -2958,7 +2958,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(185), by_va: false, @@ -2974,7 +2974,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(186), by_va: false, @@ -2990,7 +2990,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(187), by_va: false, @@ -3006,7 +3006,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(188), by_va: false, @@ -3022,7 +3022,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(189), by_va: false, @@ -3038,7 +3038,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(190), by_va: false, @@ -3054,7 +3054,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(191), by_va: false, @@ -3070,7 +3070,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(192), by_va: false, @@ -3086,7 +3086,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(193), by_va: false, @@ -3102,7 +3102,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(194), by_va: false, @@ -3118,7 +3118,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(195), by_va: false, @@ -3134,7 +3134,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(196), by_va: false, @@ -3150,7 +3150,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(197), by_va: false, @@ -3166,7 +3166,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(198), by_va: false, @@ -3182,7 +3182,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(199), by_va: false, @@ -3198,7 +3198,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(200), by_va: false, @@ -3214,7 +3214,7 @@ MusicAlbum( id: "MPREb_gaoNzsQHedo", name: "[name]", )), - view_count: None, + view_count: "[view_count]", is_video: false, track_nr: Some(201), by_va: false, diff --git a/tests/snapshots/youtube__music_album_one_artist.snap b/tests/snapshots/youtube__music_album_one_artist.snap index 85f2d34..420230b 100644 --- a/tests/snapshots/youtube__music_album_one_artist.snap +++ b/tests/snapshots/youtube__music_album_one_artist.snap @@ -3,37 +3,37 @@ source: tests/youtube.rs expression: album --- MusicAlbum( - id: "MPREb_nlBWQROfvjo", - playlist_id: Some("OLAK5uy_myZkBX2d2TzcrlQhIwLy3hCj2MkAMaPR4"), - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + playlist_id: Some("OLAK5uy_mAg4o-PpgUtVY97PDxaY3DRTZt37WUDaQ"), + name: "Demi", cover: "[cover]", artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - description: None, + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + description: Some("Demi is the fourth studio album by American singer Demi Lovato. It was released on May 10, 2013, by Hollywood Records. Looking to transition from her self-described \"generic\" third album Unbroken, Lovato wanted her fourth album to \"have songs that excited her\". Demi is primarily a pop record with elements of synthpop, and bubblegum pop.\nDemi received generally favorable reviews from music critics, who complimented Lovato\'s vocal performance. The album debuted at number three on the US Billboard 200 with first-week sales of 110,000 copies. The album also reached the top five in Canada, Ireland, Italy, Mexico and Spain. It has since sold 490,000 digital copies in the US and been certified Gold by the RIAA.\nThe album\'s lead single, \"Heart Attack\" peaked at number ten on the Billboard Hot 100, marking Lovato\'s third US top-ten single, and has been certified double platinum by the RIAA. The second single \"Made in the USA\" peaked at number 80, while later singles \"Neon Lights\" and \"Really Don\'t Care\" both reached the top 40 peaking at 36 and 26, respectively, and both have been certified platinum by RIAA.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Demi_(album)) under Creative Commons Attribution CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/legalcode)"), album_type: Album, - year: Some(2016), + year: Some(2013), by_va: false, tracks: [ TrackItem( - id: "g0iRiJ_ck48", - name: "Aulë und Yavanna", - duration: Some(217), + id: "8DmPZaCLMcE", + name: "Heart Attack", + duration: Some(211), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -41,20 +41,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "rREEBXp0y9s", - name: "Numenor", - duration: Some(225), + id: "RRE0hz60t8I", + name: "Made In The USA", + duration: Some(197), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -62,20 +62,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "zvU5Y8Q19hU", - name: "Das Mädchen und die Liebe (feat. Santiano)", - duration: Some(177), + id: "O38fBJpWqGM", + name: "Without The Love", + duration: Some(236), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -83,20 +83,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "ARKLrzzTQA0", - name: "Niënna", - duration: Some(216), + id: "BB1Q5XjCOho", + name: "Neon Lights", + duration: Some(234), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -104,20 +104,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "tstLgN8A_Ng", - name: "Der fahle Mond", - duration: Some(269), + id: "0VOm-MoZ3Xg", + name: "Two Pieces", + duration: Some(266), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -125,20 +125,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "k2DjgQOY3Ts", - name: "Weise den Weg", - duration: Some(203), + id: "vvm-XtXQ7wI", + name: "Nightingale", + duration: Some(217), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -146,20 +146,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "azHwhecxEsI", - name: "Zeit der Sommernächte", - duration: Some(186), + id: "CJYhllodSAc", + name: "In Case", + duration: Some(215), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -167,20 +167,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "_FcsdYIQ2co", - name: "Märchen enden gut", - duration: Some(227), + id: "tTmJoiCIebg", + name: "Really Don\'t Care (feat. Cher Lloyd)", + duration: Some(202), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -188,20 +188,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "27bOWEbshyE", - name: "Das Mädchen und der Tod", - duration: Some(208), + id: "qmGtn0TQ8Fk", + name: "Fire Starter", + duration: Some(205), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -209,20 +209,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "riD_3oZwt8w", - name: "Wir sehn uns wieder", - duration: Some(212), + id: "Bb_j4TTlEZA", + name: "Something That We\'re Not", + duration: Some(198), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -230,20 +230,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "8GNvjF3no9s", - name: "Tanz mit mir", - duration: Some(180), + id: "rVey1Qgn1vc", + name: "Never Been Hurt", + duration: Some(237), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -251,20 +251,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "YHMFzf1uN2U", - name: "Nachtigall", - duration: Some(219), + id: "mdXNWcYYZ10", + name: "Shouldn\'t Come Back", + duration: Some(230), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, @@ -272,155 +272,50 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "jvV-z5F3oAo", - name: "Gayatri Mantra", - duration: Some(278), + id: "yX40-XWjWe0", + name: "Warrior", + duration: Some(232), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", + id: "MPREb_mXdQvyCqLnx", + name: "Demi", )), view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, ), - TrackItem( - id: "u8_9cxlrh8k", - name: "Sing mir deine Lieder", - duration: Some(205), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(14), - by_va: false, - ), - TrackItem( - id: "gSvKcvM1Wk0", - name: "Laurië lantar", - duration: Some(203), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(15), - by_va: false, - ), - TrackItem( - id: "wQHgKRJ0pDQ", - name: "Wächter vor dem Tor", - duration: Some(223), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(16), - by_va: false, - ), - TrackItem( - id: "Ckz5i6-hzf0", - name: "Stroh zu Gold", - duration: Some(178), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(17), - by_va: false, - ), - TrackItem( - id: "y5zuUgyFqrc", - name: "Sonnenwendnacht", - duration: Some(221), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "Märchen enden gut", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(18), - by_va: false, - ), ], variants: [ AlbumItem( - id: "MPREb_jk6Msw8izou", - name: "Märchen enden gut (Nyáre Ranta (Märchenedition))", + id: "MPREb_bURBKIaURqK", + name: "Demi (Deluxe)", cover: [ Thumbnail( - url: "https://lh3.googleusercontent.com/BKgnW_-hapCHk599AtRfTYZGdXVIo0C4bJp1Bh7qUpGK7fNAXGW8Bhv2x-ukeFM8cuxKbGqqGaTo8fZASA=w226-h226-l90-rj", + url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w226-h226-l90-rj", width: 226, height: 226, ), Thumbnail( - url: "https://lh3.googleusercontent.com/BKgnW_-hapCHk599AtRfTYZGdXVIo0C4bJp1Bh7qUpGK7fNAXGW8Bhv2x-ukeFM8cuxKbGqqGaTo8fZASA=w544-h544-l90-rj", + url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w544-h544-l90-rj", width: 544, height: 544, ), ], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "Oonagh", + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album_type: Album, year: None, by_va: false, diff --git a/tests/snapshots/youtube__music_album_one_artist_intl.snap b/tests/snapshots/youtube__music_album_one_artist_intl.snap index e667a66..fd6b4de 100644 --- a/tests/snapshots/youtube__music_album_one_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_one_artist_intl.snap @@ -3,36 +3,36 @@ source: tests/youtube.rs expression: album --- MusicAlbum( - id: "MPREb_nlBWQROfvjo", - playlist_id: Some("OLAK5uy_myZkBX2d2TzcrlQhIwLy3hCj2MkAMaPR4"), + id: "MPREb_mXdQvyCqLnx", + playlist_id: Some("OLAK5uy_mAg4o-PpgUtVY97PDxaY3DRTZt37WUDaQ"), name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), description: "[description]", album_type: Album, - year: Some(2016), + year: Some(2013), by_va: false, tracks: [ TrackItem( - id: "g0iRiJ_ck48", + id: "8DmPZaCLMcE", name: "[name]", - duration: Some(217), + duration: Some(211), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -41,19 +41,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "rREEBXp0y9s", + id: "RRE0hz60t8I", name: "[name]", - duration: Some(225), + duration: Some(197), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -62,19 +62,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "zvU5Y8Q19hU", + id: "O38fBJpWqGM", name: "[name]", - duration: Some(177), + duration: Some(236), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -83,19 +83,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "ARKLrzzTQA0", + id: "BB1Q5XjCOho", name: "[name]", - duration: Some(216), + duration: Some(234), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -104,19 +104,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "tstLgN8A_Ng", + id: "0VOm-MoZ3Xg", name: "[name]", - duration: Some(269), + duration: Some(266), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -125,19 +125,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "k2DjgQOY3Ts", + id: "vvm-XtXQ7wI", name: "[name]", - duration: Some(203), + duration: Some(217), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -146,19 +146,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "azHwhecxEsI", + id: "CJYhllodSAc", name: "[name]", - duration: Some(186), + duration: Some(215), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -167,19 +167,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "_FcsdYIQ2co", + id: "tTmJoiCIebg", name: "[name]", - duration: Some(227), + duration: Some(202), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -188,19 +188,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "27bOWEbshyE", + id: "qmGtn0TQ8Fk", name: "[name]", - duration: Some(208), + duration: Some(205), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -209,19 +209,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "riD_3oZwt8w", + id: "Bb_j4TTlEZA", name: "[name]", - duration: Some(212), + duration: Some(198), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -230,19 +230,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "8GNvjF3no9s", + id: "rVey1Qgn1vc", name: "[name]", - duration: Some(180), + duration: Some(237), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -251,19 +251,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "YHMFzf1uN2U", + id: "mdXNWcYYZ10", name: "[name]", - duration: Some(219), + duration: Some(230), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -272,19 +272,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "jvV-z5F3oAo", + id: "yX40-XWjWe0", name: "[name]", - duration: Some(278), + duration: Some(232), cover: [], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", + id: "MPREb_mXdQvyCqLnx", name: "[name]", )), view_count: "[view_count]", @@ -292,135 +292,30 @@ MusicAlbum( track_nr: Some(13), by_va: false, ), - TrackItem( - id: "u8_9cxlrh8k", - name: "[name]", - duration: Some(205), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "[name]", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "[name]", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(14), - by_va: false, - ), - TrackItem( - id: "gSvKcvM1Wk0", - name: "[name]", - duration: Some(203), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "[name]", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "[name]", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(15), - by_va: false, - ), - TrackItem( - id: "wQHgKRJ0pDQ", - name: "[name]", - duration: Some(223), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "[name]", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "[name]", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(16), - by_va: false, - ), - TrackItem( - id: "Ckz5i6-hzf0", - name: "[name]", - duration: Some(178), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "[name]", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "[name]", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(17), - by_va: false, - ), - TrackItem( - id: "y5zuUgyFqrc", - name: "[name]", - duration: Some(221), - cover: [], - artists: [ - ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - name: "[name]", - ), - ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), - album: Some(AlbumId( - id: "MPREb_nlBWQROfvjo", - name: "[name]", - )), - view_count: "[view_count]", - is_video: false, - track_nr: Some(18), - by_va: false, - ), ], variants: [ AlbumItem( - id: "MPREb_jk6Msw8izou", - name: "Märchen enden gut (Nyáre Ranta (Märchenedition))", + id: "MPREb_bURBKIaURqK", + name: "Demi (Deluxe)", cover: [ Thumbnail( - url: "https://lh3.googleusercontent.com/BKgnW_-hapCHk599AtRfTYZGdXVIo0C4bJp1Bh7qUpGK7fNAXGW8Bhv2x-ukeFM8cuxKbGqqGaTo8fZASA=w226-h226-l90-rj", + url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w226-h226-l90-rj", width: 226, height: 226, ), Thumbnail( - url: "https://lh3.googleusercontent.com/BKgnW_-hapCHk599AtRfTYZGdXVIo0C4bJp1Bh7qUpGK7fNAXGW8Bhv2x-ukeFM8cuxKbGqqGaTo8fZASA=w544-h544-l90-rj", + url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w544-h544-l90-rj", width: 544, height: 544, ), ], artists: [ ArtistId( - id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), ], - artist_id: Some("UC_vmjW5e1xEHhYjY2a0kK1A"), + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album_type: Album, year: None, by_va: false, diff --git a/tests/snapshots/youtube__music_album_show.snap b/tests/snapshots/youtube__music_album_show.snap index f202333..43d312a 100644 --- a/tests/snapshots/youtube__music_album_show.snap +++ b/tests/snapshots/youtube__music_album_show.snap @@ -3,37 +3,37 @@ source: tests/youtube.rs expression: album --- MusicAlbum( - id: "MPREb_cwzk8EUwypZ", - playlist_id: Some("OLAK5uy_kODvYZ5CEpYdtd4VPsmg0eRTlpazG0dvA"), - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + playlist_id: Some("OLAK5uy_kdNoJ-uBZrMFvZCHQpkCwz9kmAELojcKs"), + name: "Die Abenteuer des Odysseus. Hörspiel", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), description: None, album_type: Show, - year: Some(2022), + year: Some(2015), by_va: false, tracks: [ TrackItem( - id: "lSbKz5LWvKE", - name: "Achtung, Waldbrand - Teil 1", - duration: Some(229), + id: "ZIjGPc6vG0Y", + name: "Kapitel 1 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -41,20 +41,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "fdO6gu4qjRw", - name: "Achtung, Waldbrand - Teil 2", - duration: Some(235), + id: "Wqrg6ceVgK8", + name: "Kapitel 2 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(122), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -62,20 +62,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "muCxstXirvY", - name: "Achtung, Waldbrand - Teil 3", - duration: Some(197), + id: "oWlZR0mU3fQ", + name: "Kapitel 3 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(125), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -83,20 +83,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "aG1N0vo__Ng", - name: "Eiszeit - Teil 1", - duration: Some(186), + id: "pcdWTaNK_w4", + name: "Kapitel 4 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(181), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -104,20 +104,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "roHhLNYS9yo", - name: "Eiszeit - Teil 2", - duration: Some(188), + id: "hJhcL8A4AEI", + name: "Kapitel 5 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -125,20 +125,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "nJ49NuLvcAw", - name: "Eiszeit - Teil 3", - duration: Some(205), + id: "ROwmS2PzXiE", + name: "Kapitel 6 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -146,20 +146,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "Me119D570h0", - name: "Eiszeit - Teil 4", - duration: Some(219), + id: "u5fduXogSKU", + name: "Kapitel 7 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(143), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -167,20 +167,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "YXnRLK-qKG8", - name: "Im Sinkloch - Teil 1", - duration: Some(240), + id: "37aeBkbW5Y4", + name: "Kapitel 8 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(128), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -188,20 +188,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "A61wz1jz9X0", - name: "Im Sinkloch - Teil 2", - duration: Some(239), + id: "Hn2701yNst0", + name: "Kapitel 9 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(124), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -209,20 +209,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "u_S08EJOTUg", - name: "Im Sinkloch - Teil 3", - duration: Some(197), + id: "dQiTv0BdwwA", + name: "Kapitel 10 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -230,20 +230,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "0qwYJihV1EU", - name: "Vorsicht, heiß - Teil 1", - duration: Some(201), + id: "DXYXlAljscM", + name: "Kapitel 11 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(166), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -251,20 +251,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "zjhoyTnEzuQ", - name: "Vorsicht, heiß - Teil 2", - duration: Some(187), + id: "mfbmff4MQ2M", + name: "Kapitel 12 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(148), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -272,20 +272,20 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "oDjDd0UBzAY", - name: "Vorsicht, heiß - Teil 3", - duration: Some(183), + id: "mHkR5PHlHpQ", + name: "Kapitel 13 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(136), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, @@ -293,26 +293,299 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "_3-WVmqgi-Q", - name: "Vorsicht, heiß - Teil 4", - duration: Some(193), + id: "VBnKIZ1b5Cg", + name: "Kapitel 14 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(149), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), - name: "Kingdom Force", + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", - name: "Folge 2: Eiszeit (Das Original-Hörspiel zur TV-Serie)", + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", )), view_count: "[view_count]", is_video: false, track_nr: Some(14), by_va: false, ), + TrackItem( + id: "1iOIPRlLFgM", + name: "Kapitel 15 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(121), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(15), + by_va: false, + ), + TrackItem( + id: "z1nDiIcnxoM", + name: "Kapitel 16 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(122), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(16), + by_va: false, + ), + TrackItem( + id: "TNpe9wfbW9U", + name: "Kapitel 17 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(120), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(17), + by_va: false, + ), + TrackItem( + id: "9FtXAfifarI", + name: "Kapitel 18 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(136), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(18), + by_va: false, + ), + TrackItem( + id: "bRG8YR7ZBtI", + name: "Kapitel 19 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(155), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(19), + by_va: false, + ), + TrackItem( + id: "wYV9GxkHdRE", + name: "Kapitel 20 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(209), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(20), + by_va: false, + ), + TrackItem( + id: "wbrz2yUKiwo", + name: "Kapitel 21 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(148), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(21), + by_va: false, + ), + TrackItem( + id: "_MUx8LqzuY8", + name: "Kapitel 22 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(123), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(22), + by_va: false, + ), + TrackItem( + id: "s0xXo8ftgCA", + name: "Kapitel 23 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(134), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(23), + by_va: false, + ), + TrackItem( + id: "6Q_etK9rgV8", + name: "Kapitel 24 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(203), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(24), + by_va: false, + ), + TrackItem( + id: "4pwRZBhZH6Y", + name: "Kapitel 25 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(128), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(25), + by_va: false, + ), + TrackItem( + id: "O75q5a1s02E", + name: "Kapitel 26 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(148), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(26), + by_va: false, + ), + TrackItem( + id: "KSD9dI_ZgPQ", + name: "Kapitel 27 - Die Abenteuer des Odysseus. Hörspiel", + duration: Some(185), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "Dimiter Inkiow", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "Die Abenteuer des Odysseus. Hörspiel", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(27), + by_va: false, + ), ], variants: [], ) diff --git a/tests/snapshots/youtube__music_album_show_intl.snap b/tests/snapshots/youtube__music_album_show_intl.snap index bac426b..ff8113f 100644 --- a/tests/snapshots/youtube__music_album_show_intl.snap +++ b/tests/snapshots/youtube__music_album_show_intl.snap @@ -3,36 +3,36 @@ source: tests/youtube.rs expression: album --- MusicAlbum( - id: "MPREb_cwzk8EUwypZ", - playlist_id: Some("OLAK5uy_kODvYZ5CEpYdtd4VPsmg0eRTlpazG0dvA"), + id: "MPREb_aDDw2kVEFtM", + playlist_id: Some("OLAK5uy_kdNoJ-uBZrMFvZCHQpkCwz9kmAELojcKs"), name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), description: "[description]", album_type: Show, - year: Some(2022), + year: Some(2015), by_va: false, tracks: [ TrackItem( - id: "lSbKz5LWvKE", + id: "ZIjGPc6vG0Y", name: "[name]", - duration: Some(229), + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -41,19 +41,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "fdO6gu4qjRw", + id: "Wqrg6ceVgK8", name: "[name]", - duration: Some(235), + duration: Some(122), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -62,19 +62,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "muCxstXirvY", + id: "oWlZR0mU3fQ", name: "[name]", - duration: Some(197), + duration: Some(125), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -83,19 +83,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "aG1N0vo__Ng", + id: "pcdWTaNK_w4", name: "[name]", - duration: Some(186), + duration: Some(181), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -104,19 +104,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "roHhLNYS9yo", + id: "hJhcL8A4AEI", name: "[name]", - duration: Some(188), + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -125,19 +125,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "nJ49NuLvcAw", + id: "ROwmS2PzXiE", name: "[name]", - duration: Some(205), + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -146,19 +146,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "Me119D570h0", + id: "u5fduXogSKU", name: "[name]", - duration: Some(219), + duration: Some(143), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -167,19 +167,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "YXnRLK-qKG8", + id: "37aeBkbW5Y4", name: "[name]", - duration: Some(240), + duration: Some(128), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -188,19 +188,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "A61wz1jz9X0", + id: "Hn2701yNst0", name: "[name]", - duration: Some(239), + duration: Some(124), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -209,19 +209,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "u_S08EJOTUg", + id: "dQiTv0BdwwA", name: "[name]", - duration: Some(197), + duration: Some(123), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -230,19 +230,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "0qwYJihV1EU", + id: "DXYXlAljscM", name: "[name]", - duration: Some(201), + duration: Some(166), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -251,19 +251,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "zjhoyTnEzuQ", + id: "mfbmff4MQ2M", name: "[name]", - duration: Some(187), + duration: Some(148), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -272,19 +272,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "oDjDd0UBzAY", + id: "mHkR5PHlHpQ", name: "[name]", - duration: Some(183), + duration: Some(136), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -293,19 +293,19 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "_3-WVmqgi-Q", + id: "VBnKIZ1b5Cg", name: "[name]", - duration: Some(193), + duration: Some(149), cover: [], artists: [ ArtistId( - id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), ], - artist_id: Some("UCNoyEM0e2A7WlsBmP2w3avg"), + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( - id: "MPREb_cwzk8EUwypZ", + id: "MPREb_aDDw2kVEFtM", name: "[name]", )), view_count: "[view_count]", @@ -313,6 +313,279 @@ MusicAlbum( track_nr: Some(14), by_va: false, ), + TrackItem( + id: "1iOIPRlLFgM", + name: "[name]", + duration: Some(121), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(15), + by_va: false, + ), + TrackItem( + id: "z1nDiIcnxoM", + name: "[name]", + duration: Some(122), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(16), + by_va: false, + ), + TrackItem( + id: "TNpe9wfbW9U", + name: "[name]", + duration: Some(120), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(17), + by_va: false, + ), + TrackItem( + id: "9FtXAfifarI", + name: "[name]", + duration: Some(136), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(18), + by_va: false, + ), + TrackItem( + id: "bRG8YR7ZBtI", + name: "[name]", + duration: Some(155), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(19), + by_va: false, + ), + TrackItem( + id: "wYV9GxkHdRE", + name: "[name]", + duration: Some(209), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(20), + by_va: false, + ), + TrackItem( + id: "wbrz2yUKiwo", + name: "[name]", + duration: Some(148), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(21), + by_va: false, + ), + TrackItem( + id: "_MUx8LqzuY8", + name: "[name]", + duration: Some(123), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(22), + by_va: false, + ), + TrackItem( + id: "s0xXo8ftgCA", + name: "[name]", + duration: Some(134), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(23), + by_va: false, + ), + TrackItem( + id: "6Q_etK9rgV8", + name: "[name]", + duration: Some(203), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(24), + by_va: false, + ), + TrackItem( + id: "4pwRZBhZH6Y", + name: "[name]", + duration: Some(128), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(25), + by_va: false, + ), + TrackItem( + id: "O75q5a1s02E", + name: "[name]", + duration: Some(148), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(26), + by_va: false, + ), + TrackItem( + id: "KSD9dI_ZgPQ", + name: "[name]", + duration: Some(185), + cover: [], + artists: [ + ArtistId( + id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + name: "[name]", + ), + ], + artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), + album: Some(AlbumId( + id: "MPREb_aDDw2kVEFtM", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(27), + by_va: false, + ), ], variants: [], ) diff --git a/tests/snapshots/youtube__music_artist_basic_all.snap b/tests/snapshots/youtube__music_artist_basic_all.snap index 109ea14..32f5f14 100644 --- a/tests/snapshots/youtube__music_artist_basic_all.snap +++ b/tests/snapshots/youtube__music_artist_basic_all.snap @@ -3,663 +3,1503 @@ source: tests/youtube.rs expression: artist --- MusicArtist( - id: "UC7cl4MmM6ZZ2TcFyMk_b4pg", - name: "Unheilig", + id: "UCNezSmfQ8VIgvHUNj1Gzx6A", + name: "Klaus Schulze", header_image: "[header_image]", - description: Some("Unheilig is a German band that draws from a variety of influences, including various pop and electronic styles as well as heavier, nihilistic hard rock. The band was founded in Aachen in 1999 and principally consisted of singer Bernd Heinrich \"Der Graf\" along with various musical partners. He was accompanied for live shows with musicians Christoph \"Licky\" Termühlen, Henning Verlage, and Martin \"Potti\" Potthoff. The group\'s debut, Phosphor, came out in 2000.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Unheilig) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), - wikipedia_url: Some("https://en.wikipedia.org/wiki/Unheilig"), + description: Some("Klaus Schulze was a German electronic music pioneer, composer and musician. He also used the alias Richard Wahnfried and was a member of the Krautrock bands Tangerine Dream, Ash Ra Tempel, and the Cosmic Jokers before launching a solo career consisting of more than 60 albums released across six decades.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Klaus_Schulze) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), + wikipedia_url: Some("https://en.wikipedia.org/wiki/Klaus_Schulze"), subscriber_count: "[subscriber_count]", tracks: "[tracks]", albums: [ AlbumItem( - id: "MPREb_43NWLzXChnh", - name: "Grosse Freiheit (Digital Version)", + id: "MPREb_1YdfqtEhzJk", + name: "Big in Europe, Vol. 2 (Live at Melkweg, Amsterdam 2009)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_585fV7eqUP8", - name: "Gipfelstürmer", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_6PEkIQE7sWY", - name: "An deiner Seite (Online Version)", + id: "MPREb_1xPKoZWoeIu", + name: "Osiris - Pt. 1", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Single, + year: Some(2022), + by_va: false, + ), + AlbumItem( + id: "MPREb_2V2kxN1gA8H", + name: "Virtual Outback", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, year: Some(2008), by_va: false, ), AlbumItem( - id: "MPREb_7nIPO6oeETY", - name: "Lichter der Stadt - Live", + id: "MPREb_3pEEsTT78cq", + name: "Another Green Mile (feat. Wolfgang Tiepold, Tobias Becker & Mickes)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_88p7e6nBtgz", - name: "Lichter der Stadt", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_8rukEzdytkN", - name: "Gipfelstürmer (Live in Österreich)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_BJKvCuKo7nJ", - name: "MTV Unplugged \"Unter Dampf – Ohne Strom\" (Deluxe Version)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_EAiIEvINDHB", - name: "Stark", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_HrCgErOdgCv", - name: "Freiheit", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2004), - by_va: false, - ), - AlbumItem( - id: "MPREb_Md2aZrjaqHX", - name: "Stille Winternacht", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_OW1GOBZ64ap", - name: "Hallo Leben", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2018), - by_va: false, - ), - AlbumItem( - id: "MPREb_Oq0WKqNwSVY", - name: "Das 2. Gebot", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2003), - by_va: false, - ), - AlbumItem( - id: "MPREb_QEClJsuO9xM", - name: "So wie Du warst", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_QyGCcLWExXj", - name: "Als wär\'s das erste Mal (Exklusive Piano Version)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2014), - by_va: false, - ), - AlbumItem( - id: "MPREb_R3p5kDRIGKL", - name: "Astronaut", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2006), - by_va: false, - ), - AlbumItem( - id: "MPREb_T4fJMmrfxXk", - name: "Phosphor", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2000), - by_va: false, - ), - AlbumItem( - id: "MPREb_TiIBQqCFttT", - name: "Von Mensch zu Mensch", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_U9HLD8nF7H5", - name: "Der Himmel über mir", + id: "MPREb_4XJAm8XR4zo", + name: "The Dark Side of the Moog (Complete Version) (feat. Pete Namlook)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_U9dMPQUeR9q", - name: "Wie wir waren (feat. Andreas Bourani)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_V0FEmw2pj2u", - name: "Sonnentag", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_WYx2c0e95TA", - name: "Spiegelbild", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2008), + year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_Wc8Ehka0R0T", - name: "Lichterland - Best Of (Deluxe)", + id: "MPREb_4zrbBUagjzR", + name: "The Crime of Suspense", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_Yj49s4xy7fM", - name: "Lichtermeer", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_baIxpKBcYbF", - name: "Schutzengel", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, - year: Some(2003), - by_va: false, - ), - AlbumItem( - id: "MPREb_eiYjUXT1Mn3", - name: "Geboren um zu leben", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_f4MhYbccbPi", - name: "Moderne Zeiten", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2006), by_va: false, ), AlbumItem( - id: "MPREb_gHlGAdNjEZI", - name: "Für immer", + id: "MPREb_6HW4Nw73smP", + name: "Drive Inn 1", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_kW2NAMSZElX", - name: "Glück auf das Leben", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_m5U1xZasDSy", - name: "Frohes Fest", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2002), + year: Some(1997), by_va: false, ), AlbumItem( - id: "MPREb_n1H3JiFyGkv", - name: "Mein Berg (EP)", + id: "MPREb_6dGGnA5dw09", + name: "Angst (Original Motion Picture Soundtrack / Remastered 2017)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1984), + by_va: false, + ), + AlbumItem( + id: "MPREb_7jUKDBJBWiv", + name: "Body Love, Vol. 2", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_82lKeM7Vwfc", + name: "La vie électronique, Vol. 9", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_830EY0Vwdpl", + name: "Privée (feat. Razoof Lear & O\'Finken)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_87Dpc5SQkSb", + name: "La Vie Electronique, Vol. 2", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_8qm8QuqVot1", + name: "Trancefer", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1981), + by_va: false, + ), + AlbumItem( + id: "MPREb_9ZHX8sqcAyL", + name: "The Dark Side of the Moog, Pt. 1 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1994), + by_va: false, + ), + AlbumItem( + id: "MPREb_9l7jGsdk6HJ", + name: "Chicken Biryani", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Ep, - year: Some(2015), + year: Some(1997), by_va: false, ), AlbumItem( - id: "MPREb_ohcGTZrqKPZ", - name: "Zelluloid", + id: "MPREb_AHY6X6M1F6w", + name: "The Dark Side of the Moog, Vol. 7 (feat. Pete Namlook)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2004), + year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_pWpeXxATZYb", - name: "Wir sind alle wie eins", + id: "MPREb_B7tr0ihsrZl", + name: "La vie électronique, Vol. 10", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_BFX2NuxokTt", + name: "Timbres of Ice", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2020), + by_va: false, + ), + AlbumItem( + id: "MPREb_Bi9U4F52NTe", + name: "In Blue", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1995), + by_va: false, + ), + AlbumItem( + id: "MPREb_C87JgTOwTID", + name: "The Dark Side of the Moog, Vol. 10 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_CazIrat9i5X", + name: "Ultimate Docking", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_FCbBh2FzaAN", + name: "La Vie Electronique, Vol. 4", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2020), + by_va: false, + ), + AlbumItem( + id: "MPREb_FudXQ3u3MMJ", + name: "The Dresden Performance", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1990), + by_va: false, + ), + AlbumItem( + id: "MPREb_GMIt8Nj9DPk", + name: "The Dark Side of the Moog, Vol. 6 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_H6he4DCvQWh", + name: "...Live...", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1980), + by_va: false, + ), + AlbumItem( + id: "MPREb_HguJDkhr7Jp", + name: "Live @ Klangart", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2001), + by_va: false, + ), + AlbumItem( + id: "MPREb_HmJ5Ll5To3Q", + name: "Timewind", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1975), + by_va: false, + ), + AlbumItem( + id: "MPREb_IRWbo2OJEfj", + name: "En = Trance", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1987), + by_va: false, + ), + AlbumItem( + id: "MPREb_IgMbxq76UxR", + name: "Dig It", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1980), + by_va: false, + ), + AlbumItem( + id: "MPREb_J6RzeMkseSc", + name: "Beyond Recall", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1991), + by_va: false, + ), + AlbumItem( + id: "MPREb_JR8Hbd21BcW", + name: "Shadowlands", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_JVvppBjeDJE", + name: "The Evolution of the Dark Side of the Moog", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2008), + by_va: false, + ), + AlbumItem( + id: "MPREb_JcMSoRcvEok", + name: "The Dark Side of the Moog, Vol. 8 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_JdbmYSbZK77", + name: "La vie électronique, Vol. 14", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_ptO8gh250LP", - name: "Maschine", + id: "MPREb_Jhgpzn29Nnu", + name: "Audentity", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, - year: Some(2003), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1983), by_va: false, ), AlbumItem( - id: "MPREb_qbJv3f0ijrk", - name: "Alles hat seine Zeit (Best Of Unheilig 1999 - 2014)", + id: "MPREb_KbjBmrLHlpc", + name: "The Dark Side of the Moog, Vol. 8-E (feat. Pete Namlook)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Single, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_Kf9cJhi7sbP", + name: "Ballet 2", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2007), by_va: false, ), AlbumItem( - id: "MPREb_rHhaDLqalbT", - name: "Winter (EP)", + id: "MPREb_MiWibgl6kLh", + name: "Eternal - The 70th Birthday Edition", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, - year: Some(2010), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), by_va: false, ), AlbumItem( - id: "MPREb_rdrfznTDhSX", - name: "Lichter der Stadt", + id: "MPREb_N4JsVV4Ufjg", + name: "The Dark Side of the Moog [Live Jazzfestival Hamburg 23.04.1999] (feat. Pete Namlook)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_NMW4JmSXAlo", + name: "Mirage", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_NSN8eVYHel1", + name: "Androgyn (feat. Wolfgang Tiepold)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_PWICjCH8Sqt", + name: "Cocooning", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2018), + by_va: false, + ), + AlbumItem( + id: "MPREb_QidqbACaJRt", + name: "Richard Wahnfried\'s Tonwelle [Remastered [33 rpm Streaming Version]] (feat. Manuel Göttsching & Michael Shrieve)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1981), + by_va: false, + ), + AlbumItem( + id: "MPREb_RJ8KP2FUrkc", + name: "The Dark Side of the Moog, Vol. 5 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1996), + by_va: false, + ), + AlbumItem( + id: "MPREb_SUwSYEk8Mtu", + name: "Dziekuje Bardzo: Vielen Dank [Live] (feat. Lisa Gerrard)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2009), + by_va: false, + ), + AlbumItem( + id: "MPREb_SYwccaCyCRW", + name: "La Vie Electronique, Vol. 11", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2012), by_va: false, ), AlbumItem( - id: "MPREb_saXgTKNPaSu", - name: "Zeit zu gehen", + id: "MPREb_ScWLtTsEBa4", + name: "The Dark Side of the Moog (Complete Version, Vol. 2) (feat. Pete Namlook)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_TxOC4PzSj00", + name: "La vie électronique, Vol. 6", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2010), + by_va: false, + ), + AlbumItem( + id: "MPREb_U9JPzI3TF6c", + name: "La Vie Electronique, Vol. 1", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_VA5uabZd2Vc", + name: "Das Wagner Desaster (Live)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1994), + by_va: false, + ), + AlbumItem( + id: "MPREb_VbMmY6baf5V", + name: "Dune", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1979), + by_va: false, + ), + AlbumItem( + id: "MPREb_WTI8Z2nOKkS", + name: "Ballett 1", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2006), + by_va: false, + ), + AlbumItem( + id: "MPREb_WZ6MhN62Mfe", + name: "The Dark Side of the Moog, Pt. 3 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_Y2WXQCxCzvJ", + name: "Babel", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Single, + year: Some(1987), + by_va: false, + ), + AlbumItem( + id: "MPREb_YcAeUKiFaZz", + name: "Inter * Face", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1985), + by_va: false, + ), + AlbumItem( + id: "MPREb_Z0GuFKGhYXN", + name: "La vie electronique, Vol. 3", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_ZuyA9VHU1sH", + name: "The Dark Side of the Moog, Vol. 9 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_arpxDESu8HE", + name: "Linzer Stahlsinfonie [Live, Linz, 1980] (feat. Tommy Betzler)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1997), + by_va: false, + ), + AlbumItem( + id: "MPREb_bYhOsGCAXHi", + name: "Audentity (The Bonus Tracks)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1982), + by_va: false, + ), + AlbumItem( + id: "MPREb_bvYhGUA7ifF", + name: "\"X\" (Sechs Musikalische Biographien)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1978), + by_va: false, + ), + AlbumItem( + id: "MPREb_cqgWddwQqRU", + name: "Silhouettes", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Ep, + year: Some(2018), + by_va: false, + ), + AlbumItem( + id: "MPREb_dMEKEJfZn94", + name: "The Dark Side of the Moog, Pt. 4 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_e9V2xnBBtfV", + name: "The Dark Side of the Moog (Complete Version, Vol. 3) (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_eWqX5U7yhLX", + name: "Black Dance", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1974), + by_va: false, + ), + AlbumItem( + id: "MPREb_g9pV31y1er7", + name: "Le moulin de Daudet", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1992), + by_va: false, + ), + AlbumItem( + id: "MPREb_goR1k65Lg21", + name: "Dziekuje Poland Live \'83", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1983), + by_va: false, + ), + AlbumItem( + id: "MPREb_i4EQt7Y73Xl", + name: "Royal Festival Hall Volume II", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1992), + by_va: false, + ), + AlbumItem( + id: "MPREb_jG7RroeYqjr", + name: "La vie électronique, Vol. 16", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2015), + by_va: false, + ), + AlbumItem( + id: "MPREb_jKEWIgvzxYX", + name: "Cyborg", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1973), + by_va: false, + ), + AlbumItem( + id: "MPREb_jq0xEpkBzz8", + name: "Irrlicht", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1972), + by_va: false, + ), + AlbumItem( + id: "MPREb_keOALsvXDNY", + name: "Deus Arrakis", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2022), + by_va: false, + ), + AlbumItem( + id: "MPREb_keYMDo0Fjmn", + name: "Ballett 3 & 4", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_lt6Zhp7WHOQ", + name: "La Vie Electronique 15", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_t6zStv8YrVG", - name: "Unter deiner Flagge", + id: "MPREb_lv4Dftlsg4q", + name: "Moondawn", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2010), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1976), by_va: false, ), AlbumItem( - id: "MPREb_vM0cMpn8pHh", - name: "Puppenspiel Live - Vorhang auf!", + id: "MPREb_lwj5eVCmkNN", + name: "Vanity of Sounds", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2000), + by_va: false, + ), + AlbumItem( + id: "MPREb_m5ZjSslpz7b", + name: "Trancelation", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2020), + by_va: false, + ), + AlbumItem( + id: "MPREb_m9o4mYTUGcv", + name: "Body Love Original Soundtrack", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1983), + by_va: false, + ), + AlbumItem( + id: "MPREb_n6FSu1OoHak", + name: "La vie électronique, Vol. 5", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_niyagUM087H", + name: "Next of Kin (Music from the Motion Picture Soundtrack)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_nuQPYyvUzOz", + name: "Farscape", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2008), by_va: false, ), AlbumItem( - id: "MPREb_wgm3k1qxpbF", - name: "Grosse Freiheit Live", + id: "MPREb_oWx2G2riYJ9", + name: "Big In Europe, Vol. 1 (Live 2009 Warsaw)", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2010), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Ep, + year: Some(2013), by_va: false, ), AlbumItem( - id: "MPREb_wmSecJVDwPB", - name: "Puppenspiel", + id: "MPREb_ostsiuMgUIl", + name: "En=Trance", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2008), + year: Some(1987), by_va: false, ), AlbumItem( - id: "MPREb_xCehp2mGhCk", - name: "Winter", + id: "MPREb_qJzvNDhs6bQ", + name: "La vie électronique, Vol. 8", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_rd5idUDDFCB", + name: "Richard Wahnfried\'s Miditation (feat. Steve Jollife)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1986), + by_va: false, + ), + AlbumItem( + id: "MPREb_rffvZ1luE5Z", + name: "La vie électronique, Vol. 7", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_rrIWOKARaET", + name: "Der Hauch des Lebens - Pt. 5", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Single, - year: Some(2010), + year: Some(2022), by_va: false, ), AlbumItem( - id: "MPREb_y5fUQ2toJwT", - name: "Best Of Vol. 2 - Rares Gold (Deluxe Version)", + id: "MPREb_s0prtfMVIrV", + name: "Dreams", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "Unheilig", + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1986), + by_va: false, + ), + AlbumItem( + id: "MPREb_uPZpfuSlwHZ", + name: "Body Love (Original Motion Picture Soundtrack / Remastered 2017)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_vLa1zis7A7T", + name: "La vie electronique, Vol. 12", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_ve7V58PgC6P", + name: "Body Love", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_vrXLgYkjFJF", + name: "Vat Was Dat", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2022), + by_va: false, + ), + AlbumItem( + id: "MPREb_vvl4q5fGyAT", + name: "La vie électronique, Vol. 13", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_wBTls1XLsdh", + name: "The Dome Event", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1993), + by_va: false, + ), + AlbumItem( + id: "MPREb_wc4BcZCJ4ta", + name: "Picture Music", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1975), + by_va: false, + ), + AlbumItem( + id: "MPREb_wzXAlg8conF", + name: "Come Quietly (10th Anniversary Re-Release)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2009), + by_va: false, + ), + AlbumItem( + id: "MPREb_xfF1uj0XEMs", + name: "Ballett 1 & 2", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2017), by_va: false, ), + AlbumItem( + id: "MPREb_yksMnGxPisK", + name: "Mental Floss at Owl Hoot Station", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Single, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_z97CXHPQRpE", + name: "Royal Festival Hall Volume I", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1992), + by_va: false, + ), + AlbumItem( + id: "MPREb_zjqNBTHAaKD", + name: "The Dark Side of the Moog, Pt. 2 (feat. Pete Namlook)", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "Klaus Schulze", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), ], playlists: "[playlists]", similar_artists: "[artists]", - tracks_playlist_id: Some("OLAK5uy_n6aX-F_lCQxgyTIv4FJhp78bXV93b9NUM"), - videos_playlist_id: Some("OLAK5uy_nrePwvOEzmO7SydszEFfCDu8gAJxKfFtw"), - radio_id: Some("RDEMdgjzN3Qrk_GD7BooQbkJ4A"), + tracks_playlist_id: Some("OLAK5uy_mn_ooNJyFCj3PwCvEXpF9cSleYqpHnIvc"), + videos_playlist_id: Some("OLAK5uy_ndKn992CN9EMlvbLRh7w-QJN6wn_cEfgw"), + radio_id: None, ) diff --git a/tests/snapshots/youtube__music_artist_basic_all_intl.snap b/tests/snapshots/youtube__music_artist_basic_all_intl.snap index e059a83..c95196e 100644 --- a/tests/snapshots/youtube__music_artist_basic_all_intl.snap +++ b/tests/snapshots/youtube__music_artist_basic_all_intl.snap @@ -3,7 +3,7 @@ source: tests/youtube.rs expression: artist --- MusicArtist( - id: "UC7cl4MmM6ZZ2TcFyMk_b4pg", + id: "UCNezSmfQ8VIgvHUNj1Gzx6A", name: "[name]", header_image: "[header_image]", description: "[description]", @@ -12,654 +12,1494 @@ MusicArtist( tracks: "[tracks]", albums: [ AlbumItem( - id: "MPREb_43NWLzXChnh", + id: "MPREb_1YdfqtEhzJk", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_585fV7eqUP8", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_6PEkIQE7sWY", + id: "MPREb_1xPKoZWoeIu", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Single, + year: Some(2022), + by_va: false, + ), + AlbumItem( + id: "MPREb_2V2kxN1gA8H", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, year: Some(2008), by_va: false, ), AlbumItem( - id: "MPREb_7nIPO6oeETY", + id: "MPREb_3pEEsTT78cq", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_88p7e6nBtgz", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_8rukEzdytkN", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_BJKvCuKo7nJ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_EAiIEvINDHB", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_HrCgErOdgCv", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2004), - by_va: false, - ), - AlbumItem( - id: "MPREb_Md2aZrjaqHX", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_OW1GOBZ64ap", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2018), - by_va: false, - ), - AlbumItem( - id: "MPREb_Oq0WKqNwSVY", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2003), - by_va: false, - ), - AlbumItem( - id: "MPREb_QEClJsuO9xM", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_QyGCcLWExXj", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2014), - by_va: false, - ), - AlbumItem( - id: "MPREb_R3p5kDRIGKL", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2006), - by_va: false, - ), - AlbumItem( - id: "MPREb_T4fJMmrfxXk", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2000), - by_va: false, - ), - AlbumItem( - id: "MPREb_TiIBQqCFttT", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_U9HLD8nF7H5", + id: "MPREb_4XJAm8XR4zo", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_U9dMPQUeR9q", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2012), - by_va: false, - ), - AlbumItem( - id: "MPREb_V0FEmw2pj2u", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_WYx2c0e95TA", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2008), + year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_Wc8Ehka0R0T", + id: "MPREb_4zrbBUagjzR", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_Yj49s4xy7fM", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2021), - by_va: false, - ), - AlbumItem( - id: "MPREb_baIxpKBcYbF", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, - year: Some(2003), - by_va: false, - ), - AlbumItem( - id: "MPREb_eiYjUXT1Mn3", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_f4MhYbccbPi", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2006), by_va: false, ), AlbumItem( - id: "MPREb_gHlGAdNjEZI", + id: "MPREb_6HW4Nw73smP", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_kW2NAMSZElX", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2015), - by_va: false, - ), - AlbumItem( - id: "MPREb_m5U1xZasDSy", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - name: "[name]", - ), - ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2002), + year: Some(1997), by_va: false, ), AlbumItem( - id: "MPREb_n1H3JiFyGkv", + id: "MPREb_6dGGnA5dw09", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1984), + by_va: false, + ), + AlbumItem( + id: "MPREb_7jUKDBJBWiv", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_82lKeM7Vwfc", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_830EY0Vwdpl", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_87Dpc5SQkSb", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_8qm8QuqVot1", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1981), + by_va: false, + ), + AlbumItem( + id: "MPREb_9ZHX8sqcAyL", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1994), + by_va: false, + ), + AlbumItem( + id: "MPREb_9l7jGsdk6HJ", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Ep, - year: Some(2015), + year: Some(1997), by_va: false, ), AlbumItem( - id: "MPREb_ohcGTZrqKPZ", + id: "MPREb_AHY6X6M1F6w", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2004), + year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_pWpeXxATZYb", + id: "MPREb_B7tr0ihsrZl", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_BFX2NuxokTt", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2020), + by_va: false, + ), + AlbumItem( + id: "MPREb_Bi9U4F52NTe", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1995), + by_va: false, + ), + AlbumItem( + id: "MPREb_C87JgTOwTID", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_CazIrat9i5X", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_FCbBh2FzaAN", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2020), + by_va: false, + ), + AlbumItem( + id: "MPREb_FudXQ3u3MMJ", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1990), + by_va: false, + ), + AlbumItem( + id: "MPREb_GMIt8Nj9DPk", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_H6he4DCvQWh", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1980), + by_va: false, + ), + AlbumItem( + id: "MPREb_HguJDkhr7Jp", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2001), + by_va: false, + ), + AlbumItem( + id: "MPREb_HmJ5Ll5To3Q", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1975), + by_va: false, + ), + AlbumItem( + id: "MPREb_IRWbo2OJEfj", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1987), + by_va: false, + ), + AlbumItem( + id: "MPREb_IgMbxq76UxR", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1980), + by_va: false, + ), + AlbumItem( + id: "MPREb_J6RzeMkseSc", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1991), + by_va: false, + ), + AlbumItem( + id: "MPREb_JR8Hbd21BcW", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_JVvppBjeDJE", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2008), + by_va: false, + ), + AlbumItem( + id: "MPREb_JcMSoRcvEok", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_JdbmYSbZK77", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_ptO8gh250LP", + id: "MPREb_Jhgpzn29Nnu", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, - year: Some(2003), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1983), by_va: false, ), AlbumItem( - id: "MPREb_qbJv3f0ijrk", + id: "MPREb_KbjBmrLHlpc", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Single, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_Kf9cJhi7sbP", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2007), by_va: false, ), AlbumItem( - id: "MPREb_rHhaDLqalbT", + id: "MPREb_MiWibgl6kLh", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Ep, - year: Some(2010), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), by_va: false, ), AlbumItem( - id: "MPREb_rdrfznTDhSX", + id: "MPREb_N4JsVV4Ufjg", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_NMW4JmSXAlo", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_NSN8eVYHel1", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_PWICjCH8Sqt", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2018), + by_va: false, + ), + AlbumItem( + id: "MPREb_QidqbACaJRt", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1981), + by_va: false, + ), + AlbumItem( + id: "MPREb_RJ8KP2FUrkc", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1996), + by_va: false, + ), + AlbumItem( + id: "MPREb_SUwSYEk8Mtu", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2009), + by_va: false, + ), + AlbumItem( + id: "MPREb_SYwccaCyCRW", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2012), by_va: false, ), AlbumItem( - id: "MPREb_saXgTKNPaSu", + id: "MPREb_ScWLtTsEBa4", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_TxOC4PzSj00", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2010), + by_va: false, + ), + AlbumItem( + id: "MPREb_U9JPzI3TF6c", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_VA5uabZd2Vc", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1994), + by_va: false, + ), + AlbumItem( + id: "MPREb_VbMmY6baf5V", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1979), + by_va: false, + ), + AlbumItem( + id: "MPREb_WTI8Z2nOKkS", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2006), + by_va: false, + ), + AlbumItem( + id: "MPREb_WZ6MhN62Mfe", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_Y2WXQCxCzvJ", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Single, + year: Some(1987), + by_va: false, + ), + AlbumItem( + id: "MPREb_YcAeUKiFaZz", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1985), + by_va: false, + ), + AlbumItem( + id: "MPREb_Z0GuFKGhYXN", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_ZuyA9VHU1sH", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_arpxDESu8HE", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1997), + by_va: false, + ), + AlbumItem( + id: "MPREb_bYhOsGCAXHi", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1982), + by_va: false, + ), + AlbumItem( + id: "MPREb_bvYhGUA7ifF", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1978), + by_va: false, + ), + AlbumItem( + id: "MPREb_cqgWddwQqRU", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Ep, + year: Some(2018), + by_va: false, + ), + AlbumItem( + id: "MPREb_dMEKEJfZn94", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_e9V2xnBBtfV", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), + AlbumItem( + id: "MPREb_eWqX5U7yhLX", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1974), + by_va: false, + ), + AlbumItem( + id: "MPREb_g9pV31y1er7", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1992), + by_va: false, + ), + AlbumItem( + id: "MPREb_goR1k65Lg21", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1983), + by_va: false, + ), + AlbumItem( + id: "MPREb_i4EQt7Y73Xl", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1992), + by_va: false, + ), + AlbumItem( + id: "MPREb_jG7RroeYqjr", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2015), + by_va: false, + ), + AlbumItem( + id: "MPREb_jKEWIgvzxYX", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1973), + by_va: false, + ), + AlbumItem( + id: "MPREb_jq0xEpkBzz8", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1972), + by_va: false, + ), + AlbumItem( + id: "MPREb_keOALsvXDNY", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2022), + by_va: false, + ), + AlbumItem( + id: "MPREb_keYMDo0Fjmn", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_lt6Zhp7WHOQ", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_t6zStv8YrVG", + id: "MPREb_lv4Dftlsg4q", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Single, - year: Some(2010), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1976), by_va: false, ), AlbumItem( - id: "MPREb_vM0cMpn8pHh", + id: "MPREb_lwj5eVCmkNN", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2000), + by_va: false, + ), + AlbumItem( + id: "MPREb_m5ZjSslpz7b", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2020), + by_va: false, + ), + AlbumItem( + id: "MPREb_m9o4mYTUGcv", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1983), + by_va: false, + ), + AlbumItem( + id: "MPREb_n6FSu1OoHak", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_niyagUM087H", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2019), + by_va: false, + ), + AlbumItem( + id: "MPREb_nuQPYyvUzOz", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2008), by_va: false, ), AlbumItem( - id: "MPREb_wgm3k1qxpbF", + id: "MPREb_oWx2G2riYJ9", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), - album_type: Album, - year: Some(2010), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Ep, + year: Some(2013), by_va: false, ), AlbumItem( - id: "MPREb_wmSecJVDwPB", + id: "MPREb_ostsiuMgUIl", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, - year: Some(2008), + year: Some(1987), by_va: false, ), AlbumItem( - id: "MPREb_xCehp2mGhCk", + id: "MPREb_qJzvNDhs6bQ", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_rd5idUDDFCB", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1986), + by_va: false, + ), + AlbumItem( + id: "MPREb_rffvZ1luE5Z", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_rrIWOKARaET", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Single, - year: Some(2010), + year: Some(2022), by_va: false, ), AlbumItem( - id: "MPREb_y5fUQ2toJwT", + id: "MPREb_s0prtfMVIrV", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), name: "[name]", ), ], - artist_id: Some("UC7cl4MmM6ZZ2TcFyMk_b4pg"), + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1986), + by_va: false, + ), + AlbumItem( + id: "MPREb_uPZpfuSlwHZ", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_vLa1zis7A7T", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_ve7V58PgC6P", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1977), + by_va: false, + ), + AlbumItem( + id: "MPREb_vrXLgYkjFJF", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2022), + by_va: false, + ), + AlbumItem( + id: "MPREb_vvl4q5fGyAT", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2013), + by_va: false, + ), + AlbumItem( + id: "MPREb_wBTls1XLsdh", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1993), + by_va: false, + ), + AlbumItem( + id: "MPREb_wc4BcZCJ4ta", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1975), + by_va: false, + ), + AlbumItem( + id: "MPREb_wzXAlg8conF", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2009), + by_va: false, + ), + AlbumItem( + id: "MPREb_xfF1uj0XEMs", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), album_type: Album, year: Some(2017), by_va: false, ), + AlbumItem( + id: "MPREb_yksMnGxPisK", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Single, + year: Some(2017), + by_va: false, + ), + AlbumItem( + id: "MPREb_z97CXHPQRpE", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(1992), + by_va: false, + ), + AlbumItem( + id: "MPREb_zjqNBTHAaKD", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + name: "[name]", + ), + ], + artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + album_type: Album, + year: Some(2016), + by_va: false, + ), ], playlists: "[playlists]", similar_artists: "[artists]", - tracks_playlist_id: Some("OLAK5uy_n6aX-F_lCQxgyTIv4FJhp78bXV93b9NUM"), - videos_playlist_id: Some("OLAK5uy_nrePwvOEzmO7SydszEFfCDu8gAJxKfFtw"), - radio_id: Some("RDEMdgjzN3Qrk_GD7BooQbkJ4A"), + tracks_playlist_id: Some("OLAK5uy_mn_ooNJyFCj3PwCvEXpF9cSleYqpHnIvc"), + videos_playlist_id: Some("OLAK5uy_ndKn992CN9EMlvbLRh7w-QJN6wn_cEfgw"), + radio_id: None, ) diff --git a/tests/youtube.rs b/tests/youtube.rs index 0d707fe..06970e3 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -300,7 +300,6 @@ fn get_player( #[case::censored("6SJNVb0GnPI", UnavailabilityReason::Deleted)] // This video is geoblocked outside of Japan, so expect this test case to fail when using a Japanese IP address. #[case::geoblock("sJL6WA-aGkQ", UnavailabilityReason::Geoblocked)] -#[case::drm("1bfOsni7EgI", UnavailabilityReason::Paid)] #[case::private("s7_qI6_mIXc", UnavailabilityReason::Private)] #[case::age_restricted("CUO8secmc0g", UnavailabilityReason::AgeRestricted)] #[case::premium_only("3LvozjEOUxU", UnavailabilityReason::Premium)] @@ -316,6 +315,24 @@ fn get_player_error(#[case] id: &str, #[case] expect: UnavailabilityReason, rp: } } +#[rstest] +fn get_player_error_paid(rp: RustyPipe) { + let err = tokio_test::block_on(rp.query().player("N8ee9OLumrs")).unwrap_err(); + match err { + // Sometimes YouTube shows an 'unplayable' error on paid videos + Error::Extraction(ExtractionError::Unavailable { reason, .. }) => { + assert!( + matches!( + reason, + UnavailabilityReason::Paid | UnavailabilityReason::Unplayable + ), + "got {err}" + ) + } + _ => panic!("got {err}"), + } +} + //#PLAYLIST #[rstest] @@ -1448,12 +1465,12 @@ fn music_playlist_not_found(rp: RustyPipe) { } #[rstest] -#[case::one_artist("one_artist", "MPREb_nlBWQROfvjo")] +#[case::one_artist("one_artist", "MPREb_mXdQvyCqLnx")] #[case::various_artists("various_artists", "MPREb_8QkDeEIawvX")] #[case::single("single", "MPREb_bHfHGoy7vuv")] #[case::ep("ep", "MPREb_u1I69lSAe5v")] -// #[case::audiobook("audiobook", "MPREb_gaoNzsQHedo")] -#[case::show("show", "MPREb_cwzk8EUwypZ")] +#[case::audiobook("audiobook", "MPREb_gaoNzsQHedo")] +#[case::show("show", "MPREb_aDDw2kVEFtM")] #[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")] #[case::no_year("no_year", "MPREb_F3Af9UZZVxX")] #[case::version_no_artist("version_no_artist", "MPREb_h8ltx5oKvyY")] @@ -1495,7 +1512,7 @@ fn music_album_not_found(rp: RustyPipe) { } #[rstest] -#[case::basic_all("basic_all", "UC7cl4MmM6ZZ2TcFyMk_b4pg", true, 15, 2)] +#[case::basic_all("basic_all", "UCNezSmfQ8VIgvHUNj1Gzx6A", true, 15, 1)] // TODO: wait for A/B test 6 to stabilize // #[case::basic("basic", "UC7cl4MmM6ZZ2TcFyMk_b4pg", false, 15, 2)] #[case::no_more_albums("no_more_albums", "UCOR4_bSVIXPsGa4BbCSt60Q", true, 15, 0)] @@ -1521,7 +1538,7 @@ fn music_artist( assert!(artist.similar_artists.is_empty()); assert!(artist.subscriber_count.is_none()); } else { - assert_gte(artist.subscriber_count.unwrap(), 30000, "subscribers"); + assert_gte(artist.subscriber_count.unwrap(), 10_000, "subscribers"); } artist.tracks.iter().for_each(|t| { @@ -1888,12 +1905,12 @@ fn music_search_episode(rp: RustyPipe, #[case] videos: bool) { false )] #[case::album( - "märchen enden", - "Märchen enden gut", - "MPREb_nlBWQROfvjo", - "Oonagh", - "UC_vmjW5e1xEHhYjY2a0kK1A", - 2016, + "demi", + "Demi", + "MPREb_mXdQvyCqLnx", + "Demi Lovato", + "UCwem2sj-QUJCiWiPAo9JuAw", + 2013, AlbumType::Album, true )] From b0a0df50b47b0d4d06e528180516a4b4bfd91ad7 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 23 Nov 2023 03:26:43 +0100 Subject: [PATCH 073/459] fix: failing YTM tests (again) --- .../youtube__music_album_one_artist.snap | 193 ++- .../youtube__music_album_one_artist_intl.snap | 137 +- .../youtube__music_artist_basic_all.snap | 1450 +---------------- .../youtube__music_artist_basic_all_intl.snap | 1392 +--------------- tests/youtube.rs | 12 +- 5 files changed, 317 insertions(+), 2867 deletions(-) diff --git a/tests/snapshots/youtube__music_album_one_artist.snap b/tests/snapshots/youtube__music_album_one_artist.snap index 420230b..25f4647 100644 --- a/tests/snapshots/youtube__music_album_one_artist.snap +++ b/tests/snapshots/youtube__music_album_one_artist.snap @@ -3,9 +3,9 @@ source: tests/youtube.rs expression: album --- MusicAlbum( - id: "MPREb_mXdQvyCqLnx", - playlist_id: Some("OLAK5uy_mAg4o-PpgUtVY97PDxaY3DRTZt37WUDaQ"), - name: "Demi", + id: "MPREb_rMegpebUBPU", + playlist_id: Some("OLAK5uy_nZzwnG9SLy5l-hd5Ze0FH4LfTWMqDXQdY"), + name: "Unbroken", cover: "[cover]", artists: [ ArtistId( @@ -14,15 +14,15 @@ MusicAlbum( ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), - description: Some("Demi is the fourth studio album by American singer Demi Lovato. It was released on May 10, 2013, by Hollywood Records. Looking to transition from her self-described \"generic\" third album Unbroken, Lovato wanted her fourth album to \"have songs that excited her\". Demi is primarily a pop record with elements of synthpop, and bubblegum pop.\nDemi received generally favorable reviews from music critics, who complimented Lovato\'s vocal performance. The album debuted at number three on the US Billboard 200 with first-week sales of 110,000 copies. The album also reached the top five in Canada, Ireland, Italy, Mexico and Spain. It has since sold 490,000 digital copies in the US and been certified Gold by the RIAA.\nThe album\'s lead single, \"Heart Attack\" peaked at number ten on the Billboard Hot 100, marking Lovato\'s third US top-ten single, and has been certified double platinum by the RIAA. The second single \"Made in the USA\" peaked at number 80, while later singles \"Neon Lights\" and \"Really Don\'t Care\" both reached the top 40 peaking at 36 and 26, respectively, and both have been certified platinum by RIAA.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Demi_(album)) under Creative Commons Attribution CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/legalcode)"), + description: Some("Unbroken is the third studio album by American singer Demi Lovato. It was released on September 20, 2011, by Hollywood Records. Primarily a pop record, Lovato described the album as \"more mature\" and with more R&B elements than her previous material, citing Rihanna as the major influence. While some of the album\'s lyrical content was heavily influenced by Lovato\'s personal struggles, it also deals with lighter subjects, such as love, self-empowerment, and having fun. Contributions to the album\'s production came from a wide range of producers, including Toby Gad, Ryan Tedder, Timbaland, Jim Beanz and Rock Mafia.\nLovato initially began recording her third studio album in 2010 before going on tour with the Jonas Brothers on their Live in Concert Tour. After withdrawing from the tour to seek treatment for physical and emotional issues, Lovato continued work on the album and described the recording process as therapeutic. She collaborated with artists such as Missy Elliott, Timbaland, Dev, Iyaz, and Jason Derulo on several tracks.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Unbroken_(Demi_Lovato_album)) under Creative Commons Attribution CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/legalcode)"), album_type: Album, - year: Some(2013), + year: Some(2011), by_va: false, tracks: [ TrackItem( - id: "8DmPZaCLMcE", - name: "Heart Attack", - duration: Some(211), + id: "js0moD0CIRQ", + name: "All Night Long", + duration: Some(195), cover: [], artists: [ ArtistId( @@ -32,8 +32,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -41,9 +41,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "RRE0hz60t8I", - name: "Made In The USA", - duration: Some(197), + id: "-xFJfXE2Cms", + name: "Who\'s That Boy", + duration: Some(193), cover: [], artists: [ ArtistId( @@ -53,8 +53,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -62,9 +62,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "O38fBJpWqGM", - name: "Without The Love", - duration: Some(236), + id: "KWDAaQDq8CQ", + name: "You\'re My Only Shorty", + duration: Some(187), cover: [], artists: [ ArtistId( @@ -74,8 +74,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -83,9 +83,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "BB1Q5XjCOho", - name: "Neon Lights", - duration: Some(234), + id: "0bcovdD1gQo", + name: "Together", + duration: Some(274), cover: [], artists: [ ArtistId( @@ -95,8 +95,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -104,9 +104,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "0VOm-MoZ3Xg", - name: "Two Pieces", - duration: Some(266), + id: "lJsqxERcxR8", + name: "Lightweight", + duration: Some(242), cover: [], artists: [ ArtistId( @@ -116,8 +116,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -125,9 +125,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "vvm-XtXQ7wI", - name: "Nightingale", - duration: Some(217), + id: "iLfB6-slQdc", + name: "Unbroken", + duration: Some(199), cover: [], artists: [ ArtistId( @@ -137,8 +137,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -146,9 +146,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "CJYhllodSAc", - name: "In Case", - duration: Some(215), + id: "4DjGZIdMcZk", + name: "Fix a Heart", + duration: Some(194), cover: [], artists: [ ArtistId( @@ -158,8 +158,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -167,9 +167,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "tTmJoiCIebg", - name: "Really Don\'t Care (feat. Cher Lloyd)", - duration: Some(202), + id: "hakoZyX4QIc", + name: "Hold Up", + duration: Some(172), cover: [], artists: [ ArtistId( @@ -179,8 +179,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -188,9 +188,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "qmGtn0TQ8Fk", - name: "Fire Starter", - duration: Some(205), + id: "GOh96GiHVgI", + name: "Mistake", + duration: Some(214), cover: [], artists: [ ArtistId( @@ -200,8 +200,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -209,9 +209,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "Bb_j4TTlEZA", - name: "Something That We\'re Not", - duration: Some(198), + id: "ne_jRAHABx0", + name: "Give Your Heart a Break", + duration: Some(206), cover: [], artists: [ ArtistId( @@ -221,8 +221,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -230,9 +230,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "rVey1Qgn1vc", - name: "Never Been Hurt", - duration: Some(237), + id: "g8oyC2g5V64", + name: "Skyscraper", + duration: Some(222), cover: [], artists: [ ArtistId( @@ -242,8 +242,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -251,9 +251,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "mdXNWcYYZ10", - name: "Shouldn\'t Come Back", - duration: Some(230), + id: "RxTEv7wXvG0", + name: "In Real Life", + duration: Some(178), cover: [], artists: [ ArtistId( @@ -263,8 +263,8 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, @@ -272,9 +272,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "yX40-XWjWe0", - name: "Warrior", - duration: Some(232), + id: "V8iVLlSZeNs", + name: "My Love Is Like a Star", + duration: Some(231), cover: [], artists: [ ArtistId( @@ -284,31 +284,19 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", - name: "Demi", + id: "MPREb_rMegpebUBPU", + name: "Unbroken", )), view_count: "[view_count]", is_video: false, track_nr: Some(13), by_va: false, ), - ], - variants: [ - AlbumItem( - id: "MPREb_bURBKIaURqK", - name: "Demi (Deluxe)", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], + TrackItem( + id: "OESslKlpao4", + name: "For the Love of a Daughter", + duration: Some(241), + cover: [], artists: [ ArtistId( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), @@ -316,9 +304,36 @@ MusicAlbum( ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), - album_type: Album, - year: None, + album: Some(AlbumId( + id: "MPREb_rMegpebUBPU", + name: "Unbroken", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(14), + by_va: false, + ), + TrackItem( + id: "ennw5cHAebo", + name: "Skyscraper (Wizz Dumb Remix)", + duration: Some(223), + cover: [], + artists: [ + ArtistId( + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "Demi Lovato", + ), + ], + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + album: Some(AlbumId( + id: "MPREb_rMegpebUBPU", + name: "Unbroken", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(15), by_va: false, ), ], + variants: [], ) diff --git a/tests/snapshots/youtube__music_album_one_artist_intl.snap b/tests/snapshots/youtube__music_album_one_artist_intl.snap index fd6b4de..26c2e91 100644 --- a/tests/snapshots/youtube__music_album_one_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_one_artist_intl.snap @@ -3,8 +3,8 @@ source: tests/youtube.rs expression: album --- MusicAlbum( - id: "MPREb_mXdQvyCqLnx", - playlist_id: Some("OLAK5uy_mAg4o-PpgUtVY97PDxaY3DRTZt37WUDaQ"), + id: "MPREb_rMegpebUBPU", + playlist_id: Some("OLAK5uy_nZzwnG9SLy5l-hd5Ze0FH4LfTWMqDXQdY"), name: "[name]", cover: "[cover]", artists: [ @@ -16,13 +16,13 @@ MusicAlbum( artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), description: "[description]", album_type: Album, - year: Some(2013), + year: Some(2011), by_va: false, tracks: [ TrackItem( - id: "8DmPZaCLMcE", + id: "js0moD0CIRQ", name: "[name]", - duration: Some(211), + duration: Some(195), cover: [], artists: [ ArtistId( @@ -32,7 +32,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -41,9 +41,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "RRE0hz60t8I", + id: "-xFJfXE2Cms", name: "[name]", - duration: Some(197), + duration: Some(193), cover: [], artists: [ ArtistId( @@ -53,7 +53,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -62,9 +62,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "O38fBJpWqGM", + id: "KWDAaQDq8CQ", name: "[name]", - duration: Some(236), + duration: Some(187), cover: [], artists: [ ArtistId( @@ -74,7 +74,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -83,9 +83,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "BB1Q5XjCOho", + id: "0bcovdD1gQo", name: "[name]", - duration: Some(234), + duration: Some(274), cover: [], artists: [ ArtistId( @@ -95,7 +95,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -104,9 +104,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "0VOm-MoZ3Xg", + id: "lJsqxERcxR8", name: "[name]", - duration: Some(266), + duration: Some(242), cover: [], artists: [ ArtistId( @@ -116,7 +116,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -125,9 +125,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "vvm-XtXQ7wI", + id: "iLfB6-slQdc", name: "[name]", - duration: Some(217), + duration: Some(199), cover: [], artists: [ ArtistId( @@ -137,7 +137,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -146,9 +146,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "CJYhllodSAc", + id: "4DjGZIdMcZk", name: "[name]", - duration: Some(215), + duration: Some(194), cover: [], artists: [ ArtistId( @@ -158,7 +158,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -167,9 +167,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "tTmJoiCIebg", + id: "hakoZyX4QIc", name: "[name]", - duration: Some(202), + duration: Some(172), cover: [], artists: [ ArtistId( @@ -179,7 +179,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -188,9 +188,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "qmGtn0TQ8Fk", + id: "GOh96GiHVgI", name: "[name]", - duration: Some(205), + duration: Some(214), cover: [], artists: [ ArtistId( @@ -200,7 +200,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -209,9 +209,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "Bb_j4TTlEZA", + id: "ne_jRAHABx0", name: "[name]", - duration: Some(198), + duration: Some(206), cover: [], artists: [ ArtistId( @@ -221,7 +221,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -230,9 +230,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "rVey1Qgn1vc", + id: "g8oyC2g5V64", name: "[name]", - duration: Some(237), + duration: Some(222), cover: [], artists: [ ArtistId( @@ -242,7 +242,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -251,9 +251,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "mdXNWcYYZ10", + id: "RxTEv7wXvG0", name: "[name]", - duration: Some(230), + duration: Some(178), cover: [], artists: [ ArtistId( @@ -263,7 +263,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -272,9 +272,9 @@ MusicAlbum( by_va: false, ), TrackItem( - id: "yX40-XWjWe0", + id: "V8iVLlSZeNs", name: "[name]", - duration: Some(232), + duration: Some(231), cover: [], artists: [ ArtistId( @@ -284,7 +284,7 @@ MusicAlbum( ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( - id: "MPREb_mXdQvyCqLnx", + id: "MPREb_rMegpebUBPU", name: "[name]", )), view_count: "[view_count]", @@ -292,23 +292,11 @@ MusicAlbum( track_nr: Some(13), by_va: false, ), - ], - variants: [ - AlbumItem( - id: "MPREb_bURBKIaURqK", - name: "Demi (Deluxe)", - cover: [ - Thumbnail( - url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w226-h226-l90-rj", - width: 226, - height: 226, - ), - Thumbnail( - url: "https://lh3.googleusercontent.com/p6Fy9_hfUY-Y6BXzdsIfOKpSZBhjGkDrpPcbA8DNrR1zvCFUL7p3cCeUywx8PxQ6FX7eb30MsWq3fpn2=w544-h544-l90-rj", - width: 544, - height: 544, - ), - ], + TrackItem( + id: "OESslKlpao4", + name: "[name]", + duration: Some(241), + cover: [], artists: [ ArtistId( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), @@ -316,9 +304,36 @@ MusicAlbum( ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), - album_type: Album, - year: None, + album: Some(AlbumId( + id: "MPREb_rMegpebUBPU", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(14), + by_va: false, + ), + TrackItem( + id: "ennw5cHAebo", + name: "[name]", + duration: Some(223), + cover: [], + artists: [ + ArtistId( + id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + name: "[name]", + ), + ], + artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), + album: Some(AlbumId( + id: "MPREb_rMegpebUBPU", + name: "[name]", + )), + view_count: "[view_count]", + is_video: false, + track_nr: Some(15), by_va: false, ), ], + variants: [], ) diff --git a/tests/snapshots/youtube__music_artist_basic_all.snap b/tests/snapshots/youtube__music_artist_basic_all.snap index 32f5f14..caecec2 100644 --- a/tests/snapshots/youtube__music_artist_basic_all.snap +++ b/tests/snapshots/youtube__music_artist_basic_all.snap @@ -3,1503 +3,213 @@ source: tests/youtube.rs expression: artist --- MusicArtist( - id: "UCNezSmfQ8VIgvHUNj1Gzx6A", - name: "Klaus Schulze", + id: "UCFKUUtHjT4iq3p0JJA13SOA", + name: "Every Time I Die", header_image: "[header_image]", - description: Some("Klaus Schulze was a German electronic music pioneer, composer and musician. He also used the alias Richard Wahnfried and was a member of the Krautrock bands Tangerine Dream, Ash Ra Tempel, and the Cosmic Jokers before launching a solo career consisting of more than 60 albums released across six decades.\n\nFrom Wikipedia (https://en.wikipedia.org/wiki/Klaus_Schulze) under Creative Commons Attribution CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/legalcode)"), - wikipedia_url: Some("https://en.wikipedia.org/wiki/Klaus_Schulze"), + description: Some("Every Time I Die is a loud rock institution committed to leaving every nuanced outpouring of chaotic passion and blissful malcontent all over their records and on the stage. With boiling charisma and unrelenting energy to spare, the Buffalo band manages not one but two near-impossible tasks. They’ve survived two decades as an underground entity cherished for coloring outside the lines, and contrary to most career arcs, continually improving with each successive album as they charge ahead. \n\nETID makes a glorious hardcore-punk noise, alchemized by a swampy summoning of Southern rock’s coarse poetry. The music swirls beneath sardonic and clever wordplay, a combination cementing them as leaders, not followers. The band is recognized and revered for its anarchic explosiveness, artistic impulsiveness, and approachable camaraderie. It’s all interwoven with a visceral lack of the usual fucks. Revolver counted 2016’s Low Teens among the 25 Best Albums of the 2010s, and the follow-up, Radical, is no less revelatory. Once again produced by Will Putney (A Day To Remember, The Ghost Inside, Body Count), Radical is 16 tracks of peak-ETID, including raucous new anthems like “Post-Boredom,” “Planet Shit,” “A Colossal Wreck,” “Desperate Pleasures,” and “AWOL.”"), + wikipedia_url: None, subscriber_count: "[subscriber_count]", tracks: "[tracks]", albums: [ AlbumItem( - id: "MPREb_1YdfqtEhzJk", - name: "Big in Europe, Vol. 2 (Live at Melkweg, Amsterdam 2009)", + id: "MPREb_1WAcRG9Or6Y", + name: "AWOL", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2014), - by_va: false, - ), - AlbumItem( - id: "MPREb_1xPKoZWoeIu", - name: "Osiris - Pt. 1", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Single, - year: Some(2022), + year: Some(2021), by_va: false, ), AlbumItem( - id: "MPREb_2V2kxN1gA8H", - name: "Virtual Outback", + id: "MPREb_2ncVzLpAAI8", + name: "Hot Damn!", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2008), + year: Some(2003), by_va: false, ), AlbumItem( - id: "MPREb_3pEEsTT78cq", - name: "Another Green Mile (feat. Wolfgang Tiepold, Tobias Becker & Mickes)", + id: "MPREb_7pqAzvcPDlz", + name: "New Junk Aesthetic (Deluxe Edition)", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2016), + year: Some(2009), by_va: false, ), AlbumItem( - id: "MPREb_4XJAm8XR4zo", - name: "The Dark Side of the Moog (Complete Version) (feat. Pete Namlook)", + id: "MPREb_9inZtV1xhrb", + name: "The Big Dirty", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_4zrbBUagjzR", - name: "The Crime of Suspense", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2006), - by_va: false, - ), - AlbumItem( - id: "MPREb_6HW4Nw73smP", - name: "Drive Inn 1", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1997), - by_va: false, - ), - AlbumItem( - id: "MPREb_6dGGnA5dw09", - name: "Angst (Original Motion Picture Soundtrack / Remastered 2017)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1984), - by_va: false, - ), - AlbumItem( - id: "MPREb_7jUKDBJBWiv", - name: "Body Love, Vol. 2", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_82lKeM7Vwfc", - name: "La vie électronique, Vol. 9", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_830EY0Vwdpl", - name: "Privée (feat. Razoof Lear & O\'Finken)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_87Dpc5SQkSb", - name: "La Vie Electronique, Vol. 2", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_8qm8QuqVot1", - name: "Trancefer", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1981), - by_va: false, - ), - AlbumItem( - id: "MPREb_9ZHX8sqcAyL", - name: "The Dark Side of the Moog, Pt. 1 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1994), - by_va: false, - ), - AlbumItem( - id: "MPREb_9l7jGsdk6HJ", - name: "Chicken Biryani", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Ep, - year: Some(1997), - by_va: false, - ), - AlbumItem( - id: "MPREb_AHY6X6M1F6w", - name: "The Dark Side of the Moog, Vol. 7 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_B7tr0ihsrZl", - name: "La vie électronique, Vol. 10", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_BFX2NuxokTt", - name: "Timbres of Ice", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_Bi9U4F52NTe", - name: "In Blue", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1995), - by_va: false, - ), - AlbumItem( - id: "MPREb_C87JgTOwTID", - name: "The Dark Side of the Moog, Vol. 10 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_CazIrat9i5X", - name: "Ultimate Docking", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_FCbBh2FzaAN", - name: "La Vie Electronique, Vol. 4", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_FudXQ3u3MMJ", - name: "The Dresden Performance", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1990), - by_va: false, - ), - AlbumItem( - id: "MPREb_GMIt8Nj9DPk", - name: "The Dark Side of the Moog, Vol. 6 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_H6he4DCvQWh", - name: "...Live...", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1980), - by_va: false, - ), - AlbumItem( - id: "MPREb_HguJDkhr7Jp", - name: "Live @ Klangart", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2001), - by_va: false, - ), - AlbumItem( - id: "MPREb_HmJ5Ll5To3Q", - name: "Timewind", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1975), - by_va: false, - ), - AlbumItem( - id: "MPREb_IRWbo2OJEfj", - name: "En = Trance", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1987), - by_va: false, - ), - AlbumItem( - id: "MPREb_IgMbxq76UxR", - name: "Dig It", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1980), - by_va: false, - ), - AlbumItem( - id: "MPREb_J6RzeMkseSc", - name: "Beyond Recall", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1991), - by_va: false, - ), - AlbumItem( - id: "MPREb_JR8Hbd21BcW", - name: "Shadowlands", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_JVvppBjeDJE", - name: "The Evolution of the Dark Side of the Moog", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2008), - by_va: false, - ), - AlbumItem( - id: "MPREb_JcMSoRcvEok", - name: "The Dark Side of the Moog, Vol. 8 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_JdbmYSbZK77", - name: "La vie électronique, Vol. 14", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2014), - by_va: false, - ), - AlbumItem( - id: "MPREb_Jhgpzn29Nnu", - name: "Audentity", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1983), - by_va: false, - ), - AlbumItem( - id: "MPREb_KbjBmrLHlpc", - name: "The Dark Side of the Moog, Vol. 8-E (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Single, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_Kf9cJhi7sbP", - name: "Ballet 2", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2007), by_va: false, ), AlbumItem( - id: "MPREb_MiWibgl6kLh", - name: "Eternal - The 70th Birthday Edition", + id: "MPREb_Lm0z7ZzAIza", + name: "Last Night In Town", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2017), + year: Some(2001), by_va: false, ), AlbumItem( - id: "MPREb_N4JsVV4Ufjg", - name: "The Dark Side of the Moog [Live Jazzfestival Hamburg 23.04.1999] (feat. Pete Namlook)", + id: "MPREb_STqA5MgO6m3", + name: "Ex Lives (Deluxe Edition)", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_NMW4JmSXAlo", - name: "Mirage", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_NSN8eVYHel1", - name: "Androgyn (feat. Wolfgang Tiepold)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_PWICjCH8Sqt", - name: "Cocooning", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2018), - by_va: false, - ), - AlbumItem( - id: "MPREb_QidqbACaJRt", - name: "Richard Wahnfried\'s Tonwelle [Remastered [33 rpm Streaming Version]] (feat. Manuel Göttsching & Michael Shrieve)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1981), - by_va: false, - ), - AlbumItem( - id: "MPREb_RJ8KP2FUrkc", - name: "The Dark Side of the Moog, Vol. 5 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1996), - by_va: false, - ), - AlbumItem( - id: "MPREb_SUwSYEk8Mtu", - name: "Dziekuje Bardzo: Vielen Dank [Live] (feat. Lisa Gerrard)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2009), - by_va: false, - ), - AlbumItem( - id: "MPREb_SYwccaCyCRW", - name: "La Vie Electronique, Vol. 11", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2012), by_va: false, ), AlbumItem( - id: "MPREb_ScWLtTsEBa4", - name: "The Dark Side of the Moog (Complete Version, Vol. 2) (feat. Pete Namlook)", + id: "MPREb_adnNFkyYKaI", + name: "Low Teens (Deluxe Edition)", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_TxOC4PzSj00", - name: "La vie électronique, Vol. 6", + id: "MPREb_eMoEiEI3OYr", + name: "A Colossal Wreck // Desperate Pleasures", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_U9JPzI3TF6c", - name: "La Vie Electronique, Vol. 1", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_VA5uabZd2Vc", - name: "Das Wagner Desaster (Live)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1994), - by_va: false, - ), - AlbumItem( - id: "MPREb_VbMmY6baf5V", - name: "Dune", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1979), - by_va: false, - ), - AlbumItem( - id: "MPREb_WTI8Z2nOKkS", - name: "Ballett 1", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2006), - by_va: false, - ), - AlbumItem( - id: "MPREb_WZ6MhN62Mfe", - name: "The Dark Side of the Moog, Pt. 3 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_Y2WXQCxCzvJ", - name: "Babel", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Single, - year: Some(1987), + year: Some(2020), by_va: false, ), AlbumItem( - id: "MPREb_YcAeUKiFaZz", - name: "Inter * Face", + id: "MPREb_fnFsgQzeLNk", + name: "Salem", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1985), - by_va: false, - ), - AlbumItem( - id: "MPREb_Z0GuFKGhYXN", - name: "La vie electronique, Vol. 3", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_ZuyA9VHU1sH", - name: "The Dark Side of the Moog, Vol. 9 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_arpxDESu8HE", - name: "Linzer Stahlsinfonie [Live, Linz, 1980] (feat. Tommy Betzler)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1997), - by_va: false, - ), - AlbumItem( - id: "MPREb_bYhOsGCAXHi", - name: "Audentity (The Bonus Tracks)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1982), - by_va: false, - ), - AlbumItem( - id: "MPREb_bvYhGUA7ifF", - name: "\"X\" (Sechs Musikalische Biographien)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1978), - by_va: false, - ), - AlbumItem( - id: "MPREb_cqgWddwQqRU", - name: "Silhouettes", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Ep, - year: Some(2018), - by_va: false, - ), - AlbumItem( - id: "MPREb_dMEKEJfZn94", - name: "The Dark Side of the Moog, Pt. 4 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_e9V2xnBBtfV", - name: "The Dark Side of the Moog (Complete Version, Vol. 3) (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_eWqX5U7yhLX", - name: "Black Dance", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1974), - by_va: false, - ), - AlbumItem( - id: "MPREb_g9pV31y1er7", - name: "Le moulin de Daudet", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1992), - by_va: false, - ), - AlbumItem( - id: "MPREb_goR1k65Lg21", - name: "Dziekuje Poland Live \'83", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1983), - by_va: false, - ), - AlbumItem( - id: "MPREb_i4EQt7Y73Xl", - name: "Royal Festival Hall Volume II", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1992), - by_va: false, - ), - AlbumItem( - id: "MPREb_jG7RroeYqjr", - name: "La vie électronique, Vol. 16", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, year: Some(2015), by_va: false, ), AlbumItem( - id: "MPREb_jKEWIgvzxYX", - name: "Cyborg", + id: "MPREb_h0UZr2ALQXf", + name: "From Parts Unknown (Deluxe Edition)", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1973), - by_va: false, - ), - AlbumItem( - id: "MPREb_jq0xEpkBzz8", - name: "Irrlicht", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1972), - by_va: false, - ), - AlbumItem( - id: "MPREb_keOALsvXDNY", - name: "Deus Arrakis", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_keYMDo0Fjmn", - name: "Ballett 3 & 4", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_lt6Zhp7WHOQ", - name: "La Vie Electronique 15", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_lv4Dftlsg4q", - name: "Moondawn", + id: "MPREb_hwA5K7iMdvm", + name: "Radical", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(1976), + year: Some(2021), by_va: false, ), AlbumItem( - id: "MPREb_lwj5eVCmkNN", - name: "Vanity of Sounds", + id: "MPREb_psxr5vulVn8", + name: "The Burial Plot Bidding War", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + album_type: Ep, year: Some(2000), by_va: false, ), AlbumItem( - id: "MPREb_m5ZjSslpz7b", - name: "Trancelation", + id: "MPREb_yhvkvc5F70E", + name: "Gutter Phenomenon", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_m9o4mYTUGcv", - name: "Body Love Original Soundtrack", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1983), - by_va: false, - ), - AlbumItem( - id: "MPREb_n6FSu1OoHak", - name: "La vie électronique, Vol. 5", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_niyagUM087H", - name: "Next of Kin (Music from the Motion Picture Soundtrack)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_nuQPYyvUzOz", - name: "Farscape", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2008), - by_va: false, - ), - AlbumItem( - id: "MPREb_oWx2G2riYJ9", - name: "Big In Europe, Vol. 1 (Live 2009 Warsaw)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Ep, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_ostsiuMgUIl", - name: "En=Trance", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1987), - by_va: false, - ), - AlbumItem( - id: "MPREb_qJzvNDhs6bQ", - name: "La vie électronique, Vol. 8", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_rd5idUDDFCB", - name: "Richard Wahnfried\'s Miditation (feat. Steve Jollife)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1986), - by_va: false, - ), - AlbumItem( - id: "MPREb_rffvZ1luE5Z", - name: "La vie électronique, Vol. 7", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_rrIWOKARaET", - name: "Der Hauch des Lebens - Pt. 5", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Single, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_s0prtfMVIrV", - name: "Dreams", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1986), - by_va: false, - ), - AlbumItem( - id: "MPREb_uPZpfuSlwHZ", - name: "Body Love (Original Motion Picture Soundtrack / Remastered 2017)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_vLa1zis7A7T", - name: "La vie electronique, Vol. 12", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_ve7V58PgC6P", - name: "Body Love", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_vrXLgYkjFJF", - name: "Vat Was Dat", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_vvl4q5fGyAT", - name: "La vie électronique, Vol. 13", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_wBTls1XLsdh", - name: "The Dome Event", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1993), - by_va: false, - ), - AlbumItem( - id: "MPREb_wc4BcZCJ4ta", - name: "Picture Music", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1975), - by_va: false, - ), - AlbumItem( - id: "MPREb_wzXAlg8conF", - name: "Come Quietly (10th Anniversary Re-Release)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2009), - by_va: false, - ), - AlbumItem( - id: "MPREb_xfF1uj0XEMs", - name: "Ballett 1 & 2", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_yksMnGxPisK", - name: "Mental Floss at Owl Hoot Station", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Single, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_z97CXHPQRpE", - name: "Royal Festival Hall Volume I", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1992), - by_va: false, - ), - AlbumItem( - id: "MPREb_zjqNBTHAaKD", - name: "The Dark Side of the Moog, Pt. 2 (feat. Pete Namlook)", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "Klaus Schulze", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), + year: Some(2005), by_va: false, ), ], playlists: "[playlists]", similar_artists: "[artists]", - tracks_playlist_id: Some("OLAK5uy_mn_ooNJyFCj3PwCvEXpF9cSleYqpHnIvc"), - videos_playlist_id: Some("OLAK5uy_ndKn992CN9EMlvbLRh7w-QJN6wn_cEfgw"), - radio_id: None, + tracks_playlist_id: Some("OLAK5uy_mK5osaO0zr74UgaNu_mTIAd_0kI8yitSM"), + videos_playlist_id: Some("OLAK5uy_mI8VvWLkZFpXOyez2McOMI1Fc6CE7BIgQ"), + radio_id: Some("RDEMioQESHiXb-9cWhy0QX4fVg"), ) diff --git a/tests/snapshots/youtube__music_artist_basic_all_intl.snap b/tests/snapshots/youtube__music_artist_basic_all_intl.snap index c95196e..7e30c47 100644 --- a/tests/snapshots/youtube__music_artist_basic_all_intl.snap +++ b/tests/snapshots/youtube__music_artist_basic_all_intl.snap @@ -3,7 +3,7 @@ source: tests/youtube.rs expression: artist --- MusicArtist( - id: "UCNezSmfQ8VIgvHUNj1Gzx6A", + id: "UCFKUUtHjT4iq3p0JJA13SOA", name: "[name]", header_image: "[header_image]", description: "[description]", @@ -12,1494 +12,204 @@ MusicArtist( tracks: "[tracks]", albums: [ AlbumItem( - id: "MPREb_1YdfqtEhzJk", + id: "MPREb_1WAcRG9Or6Y", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2014), - by_va: false, - ), - AlbumItem( - id: "MPREb_1xPKoZWoeIu", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Single, - year: Some(2022), + year: Some(2021), by_va: false, ), AlbumItem( - id: "MPREb_2V2kxN1gA8H", + id: "MPREb_2ncVzLpAAI8", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2008), + year: Some(2003), by_va: false, ), AlbumItem( - id: "MPREb_3pEEsTT78cq", + id: "MPREb_7pqAzvcPDlz", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2016), + year: Some(2009), by_va: false, ), AlbumItem( - id: "MPREb_4XJAm8XR4zo", + id: "MPREb_9inZtV1xhrb", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_4zrbBUagjzR", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2006), - by_va: false, - ), - AlbumItem( - id: "MPREb_6HW4Nw73smP", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1997), - by_va: false, - ), - AlbumItem( - id: "MPREb_6dGGnA5dw09", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1984), - by_va: false, - ), - AlbumItem( - id: "MPREb_7jUKDBJBWiv", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_82lKeM7Vwfc", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_830EY0Vwdpl", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_87Dpc5SQkSb", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_8qm8QuqVot1", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1981), - by_va: false, - ), - AlbumItem( - id: "MPREb_9ZHX8sqcAyL", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1994), - by_va: false, - ), - AlbumItem( - id: "MPREb_9l7jGsdk6HJ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Ep, - year: Some(1997), - by_va: false, - ), - AlbumItem( - id: "MPREb_AHY6X6M1F6w", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_B7tr0ihsrZl", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_BFX2NuxokTt", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_Bi9U4F52NTe", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1995), - by_va: false, - ), - AlbumItem( - id: "MPREb_C87JgTOwTID", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_CazIrat9i5X", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_FCbBh2FzaAN", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_FudXQ3u3MMJ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1990), - by_va: false, - ), - AlbumItem( - id: "MPREb_GMIt8Nj9DPk", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_H6he4DCvQWh", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1980), - by_va: false, - ), - AlbumItem( - id: "MPREb_HguJDkhr7Jp", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2001), - by_va: false, - ), - AlbumItem( - id: "MPREb_HmJ5Ll5To3Q", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1975), - by_va: false, - ), - AlbumItem( - id: "MPREb_IRWbo2OJEfj", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1987), - by_va: false, - ), - AlbumItem( - id: "MPREb_IgMbxq76UxR", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1980), - by_va: false, - ), - AlbumItem( - id: "MPREb_J6RzeMkseSc", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1991), - by_va: false, - ), - AlbumItem( - id: "MPREb_JR8Hbd21BcW", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_JVvppBjeDJE", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2008), - by_va: false, - ), - AlbumItem( - id: "MPREb_JcMSoRcvEok", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_JdbmYSbZK77", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2014), - by_va: false, - ), - AlbumItem( - id: "MPREb_Jhgpzn29Nnu", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1983), - by_va: false, - ), - AlbumItem( - id: "MPREb_KbjBmrLHlpc", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Single, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_Kf9cJhi7sbP", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2007), by_va: false, ), AlbumItem( - id: "MPREb_MiWibgl6kLh", + id: "MPREb_Lm0z7ZzAIza", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2017), + year: Some(2001), by_va: false, ), AlbumItem( - id: "MPREb_N4JsVV4Ufjg", + id: "MPREb_STqA5MgO6m3", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_NMW4JmSXAlo", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_NSN8eVYHel1", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_PWICjCH8Sqt", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2018), - by_va: false, - ), - AlbumItem( - id: "MPREb_QidqbACaJRt", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1981), - by_va: false, - ), - AlbumItem( - id: "MPREb_RJ8KP2FUrkc", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1996), - by_va: false, - ), - AlbumItem( - id: "MPREb_SUwSYEk8Mtu", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2009), - by_va: false, - ), - AlbumItem( - id: "MPREb_SYwccaCyCRW", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2012), by_va: false, ), AlbumItem( - id: "MPREb_ScWLtTsEBa4", + id: "MPREb_adnNFkyYKaI", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2016), by_va: false, ), AlbumItem( - id: "MPREb_TxOC4PzSj00", + id: "MPREb_eMoEiEI3OYr", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2010), - by_va: false, - ), - AlbumItem( - id: "MPREb_U9JPzI3TF6c", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_VA5uabZd2Vc", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1994), - by_va: false, - ), - AlbumItem( - id: "MPREb_VbMmY6baf5V", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1979), - by_va: false, - ), - AlbumItem( - id: "MPREb_WTI8Z2nOKkS", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2006), - by_va: false, - ), - AlbumItem( - id: "MPREb_WZ6MhN62Mfe", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_Y2WXQCxCzvJ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Single, - year: Some(1987), + year: Some(2020), by_va: false, ), AlbumItem( - id: "MPREb_YcAeUKiFaZz", + id: "MPREb_fnFsgQzeLNk", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1985), - by_va: false, - ), - AlbumItem( - id: "MPREb_Z0GuFKGhYXN", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_ZuyA9VHU1sH", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_arpxDESu8HE", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1997), - by_va: false, - ), - AlbumItem( - id: "MPREb_bYhOsGCAXHi", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1982), - by_va: false, - ), - AlbumItem( - id: "MPREb_bvYhGUA7ifF", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1978), - by_va: false, - ), - AlbumItem( - id: "MPREb_cqgWddwQqRU", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Ep, - year: Some(2018), - by_va: false, - ), - AlbumItem( - id: "MPREb_dMEKEJfZn94", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_e9V2xnBBtfV", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), - by_va: false, - ), - AlbumItem( - id: "MPREb_eWqX5U7yhLX", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1974), - by_va: false, - ), - AlbumItem( - id: "MPREb_g9pV31y1er7", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1992), - by_va: false, - ), - AlbumItem( - id: "MPREb_goR1k65Lg21", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1983), - by_va: false, - ), - AlbumItem( - id: "MPREb_i4EQt7Y73Xl", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1992), - by_va: false, - ), - AlbumItem( - id: "MPREb_jG7RroeYqjr", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, year: Some(2015), by_va: false, ), AlbumItem( - id: "MPREb_jKEWIgvzxYX", + id: "MPREb_h0UZr2ALQXf", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1973), - by_va: false, - ), - AlbumItem( - id: "MPREb_jq0xEpkBzz8", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1972), - by_va: false, - ), - AlbumItem( - id: "MPREb_keOALsvXDNY", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_keYMDo0Fjmn", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_lt6Zhp7WHOQ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, year: Some(2014), by_va: false, ), AlbumItem( - id: "MPREb_lv4Dftlsg4q", + id: "MPREb_hwA5K7iMdvm", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(1976), + year: Some(2021), by_va: false, ), AlbumItem( - id: "MPREb_lwj5eVCmkNN", + id: "MPREb_psxr5vulVn8", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + album_type: Ep, year: Some(2000), by_va: false, ), AlbumItem( - id: "MPREb_m5ZjSslpz7b", + id: "MPREb_yhvkvc5F70E", name: "[name]", cover: "[cover]", artists: [ ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), name: "[name]", ), ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), album_type: Album, - year: Some(2020), - by_va: false, - ), - AlbumItem( - id: "MPREb_m9o4mYTUGcv", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1983), - by_va: false, - ), - AlbumItem( - id: "MPREb_n6FSu1OoHak", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_niyagUM087H", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2019), - by_va: false, - ), - AlbumItem( - id: "MPREb_nuQPYyvUzOz", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2008), - by_va: false, - ), - AlbumItem( - id: "MPREb_oWx2G2riYJ9", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Ep, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_ostsiuMgUIl", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1987), - by_va: false, - ), - AlbumItem( - id: "MPREb_qJzvNDhs6bQ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_rd5idUDDFCB", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1986), - by_va: false, - ), - AlbumItem( - id: "MPREb_rffvZ1luE5Z", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_rrIWOKARaET", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Single, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_s0prtfMVIrV", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1986), - by_va: false, - ), - AlbumItem( - id: "MPREb_uPZpfuSlwHZ", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_vLa1zis7A7T", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_ve7V58PgC6P", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1977), - by_va: false, - ), - AlbumItem( - id: "MPREb_vrXLgYkjFJF", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2022), - by_va: false, - ), - AlbumItem( - id: "MPREb_vvl4q5fGyAT", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2013), - by_va: false, - ), - AlbumItem( - id: "MPREb_wBTls1XLsdh", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1993), - by_va: false, - ), - AlbumItem( - id: "MPREb_wc4BcZCJ4ta", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1975), - by_va: false, - ), - AlbumItem( - id: "MPREb_wzXAlg8conF", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2009), - by_va: false, - ), - AlbumItem( - id: "MPREb_xfF1uj0XEMs", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_yksMnGxPisK", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Single, - year: Some(2017), - by_va: false, - ), - AlbumItem( - id: "MPREb_z97CXHPQRpE", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(1992), - by_va: false, - ), - AlbumItem( - id: "MPREb_zjqNBTHAaKD", - name: "[name]", - cover: "[cover]", - artists: [ - ArtistId( - id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - name: "[name]", - ), - ], - artist_id: Some("UCNezSmfQ8VIgvHUNj1Gzx6A"), - album_type: Album, - year: Some(2016), + year: Some(2005), by_va: false, ), ], playlists: "[playlists]", similar_artists: "[artists]", - tracks_playlist_id: Some("OLAK5uy_mn_ooNJyFCj3PwCvEXpF9cSleYqpHnIvc"), - videos_playlist_id: Some("OLAK5uy_ndKn992CN9EMlvbLRh7w-QJN6wn_cEfgw"), - radio_id: None, + tracks_playlist_id: Some("OLAK5uy_mK5osaO0zr74UgaNu_mTIAd_0kI8yitSM"), + videos_playlist_id: Some("OLAK5uy_mI8VvWLkZFpXOyez2McOMI1Fc6CE7BIgQ"), + radio_id: Some("RDEMioQESHiXb-9cWhy0QX4fVg"), ) diff --git a/tests/youtube.rs b/tests/youtube.rs index 06970e3..6999870 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1465,7 +1465,7 @@ fn music_playlist_not_found(rp: RustyPipe) { } #[rstest] -#[case::one_artist("one_artist", "MPREb_mXdQvyCqLnx")] +#[case::one_artist("one_artist", "MPREb_rMegpebUBPU")] #[case::various_artists("various_artists", "MPREb_8QkDeEIawvX")] #[case::single("single", "MPREb_bHfHGoy7vuv")] #[case::ep("ep", "MPREb_u1I69lSAe5v")] @@ -1512,7 +1512,7 @@ fn music_album_not_found(rp: RustyPipe) { } #[rstest] -#[case::basic_all("basic_all", "UCNezSmfQ8VIgvHUNj1Gzx6A", true, 15, 1)] +#[case::basic_all("basic_all", "UCFKUUtHjT4iq3p0JJA13SOA", true, 15, 1)] // TODO: wait for A/B test 6 to stabilize // #[case::basic("basic", "UC7cl4MmM6ZZ2TcFyMk_b4pg", false, 15, 2)] #[case::no_more_albums("no_more_albums", "UCOR4_bSVIXPsGa4BbCSt60Q", true, 15, 0)] @@ -1905,12 +1905,12 @@ fn music_search_episode(rp: RustyPipe, #[case] videos: bool) { false )] #[case::album( - "demi", - "Demi", - "MPREb_mXdQvyCqLnx", + "unbroken", + "Unbroken", + "MPREb_rMegpebUBPU", "Demi Lovato", "UCwem2sj-QUJCiWiPAo9JuAw", - 2013, + 2011, AlbumType::Album, true )] From 342780ef68bfdc62da059204c9bcdb59ee6365ec Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Nov 2023 16:21:53 +0100 Subject: [PATCH 074/459] fix: use url-safe base64, rename channel_info2 operation --- codegen/src/download_testfiles.rs | 2 +- src/client/channel.rs | 2 +- src/util/mod.rs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/codegen/src/download_testfiles.rs b/codegen/src/download_testfiles.rs index 5bfd65c..9fafa11 100644 --- a/codegen/src/download_testfiles.rs +++ b/codegen/src/download_testfiles.rs @@ -340,7 +340,7 @@ async fn channel_playlists() { } async fn channel_info() { - let json_path = path!(*TESTFILES_DIR / "channel" / "channel_info2.json"); + let json_path = path!(*TESTFILES_DIR / "channel" / "channel_info.json"); if json_path.exists() { return; } diff --git a/src/client/channel.rs b/src/client/channel.rs index c02d8fb..1907160 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -189,7 +189,7 @@ impl RustyPipeQuery { self.execute_request::( ClientType::Desktop, - "channel_info2", + "channel_info", channel_id, "browse", &request_body, diff --git a/src/util/mod.rs b/src/util/mod.rs index c1c4f17..e48cd2b 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -467,11 +467,11 @@ pub fn video_id_from_thumbnail_url(url: &str) -> Option { } pub fn b64_encode>(input: T) -> String { - base64::engine::general_purpose::STANDARD.encode(input) + base64::engine::general_purpose::URL_SAFE.encode(input) } pub fn b64_decode>(input: T) -> Result, base64::DecodeError> { - base64::engine::general_purpose::STANDARD.decode(input) + base64::engine::general_purpose::URL_SAFE.decode(input) } /// Get the country from its English name From e0124894732a9dd3bd6390b54cb3e087d05dce51 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Nov 2023 16:33:20 +0100 Subject: [PATCH 075/459] tests: remove audiobook test again --- tests/youtube.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 6999870..7ce72b2 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1469,7 +1469,7 @@ fn music_playlist_not_found(rp: RustyPipe) { #[case::various_artists("various_artists", "MPREb_8QkDeEIawvX")] #[case::single("single", "MPREb_bHfHGoy7vuv")] #[case::ep("ep", "MPREb_u1I69lSAe5v")] -#[case::audiobook("audiobook", "MPREb_gaoNzsQHedo")] +// #[case::audiobook("audiobook", "MPREb_gaoNzsQHedo")] #[case::show("show", "MPREb_aDDw2kVEFtM")] #[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")] #[case::no_year("no_year", "MPREb_F3Af9UZZVxX")] From 9d243fa0ad38ea0aa1f125554850bd926430b87f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Nov 2023 17:22:35 +0100 Subject: [PATCH 076/459] fix: parsing text components with empty navigation endpoints --- src/serializer/text.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/serializer/text.rs b/src/serializer/text.rs index 90ad772..12101f2 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -3,7 +3,7 @@ use std::convert::TryFrom; use once_cell::sync::Lazy; use regex::Regex; use serde::{Deserialize, Deserializer}; -use serde_with::{serde_as, DeserializeAs, VecSkipError}; +use serde_with::{serde_as, DefaultOnError, DeserializeAs, VecSkipError}; use crate::{ client::response::url_endpoint::{ @@ -122,10 +122,13 @@ struct RichTextInternal { } /// TextLinkRun is a single component from a YouTube text with links +#[serde_as] #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct RichTextRun { text: String, + #[serde(default)] + #[serde_as(as = "DefaultOnError")] navigation_endpoint: Option, } From 9a652d851fa962183e60b11cbb4e34477a979aac Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Nov 2023 17:40:05 +0100 Subject: [PATCH 077/459] fix: improve VecLogErr messages --- src/serializer/vec_log_err.rs | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/serializer/vec_log_err.rs b/src/serializer/vec_log_err.rs index 9e3e32c..c2e89ff 100644 --- a/src/serializer/vec_log_err.rs +++ b/src/serializer/vec_log_err.rs @@ -20,13 +20,6 @@ where where D: serde::Deserializer<'de>, { - #[derive(serde::Deserialize)] - #[serde(untagged)] - enum GoodOrError { - Good(T), - Error(serde_json::Value), - } - struct SeqVisitor(PhantomData); impl<'de, T> Visitor<'de> for SeqVisitor @@ -46,16 +39,14 @@ where let mut values = Vec::with_capacity(seq.size_hint().unwrap_or_default()); let mut warnings = Vec::new(); - while let Some(value) = seq.next_element()? { - match value { - GoodOrError::::Good(value) => { - values.push(value); - } - GoodOrError::::Error(value) => { - warnings.push(format!( - "error deserializing item: {}", - serde_json::to_string(&value).unwrap_or_default() - )); + loop { + match seq.next_element::() { + Ok(val) => match val { + Some(val) => values.push(val), + None => break, + }, + Err(e) => { + warnings.push(format!("error deserializing item: {e}")); } } } @@ -186,8 +177,8 @@ mod tests { insta::assert_debug_snapshot!(res.items.warnings, @r###" [ - "error deserializing item: {\"xyz\":\"i2\"}", - "error deserializing item: {\"namra\":\"i4\"}", + "error deserializing item: missing field `name` at line 1 column 40", + "error deserializing item: missing field `name` at line 1 column 73", ] "###); } From cf24f978f23af1bf11868df26850e6824a1f88d2 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 29 Nov 2023 14:00:58 +0100 Subject: [PATCH 078/459] tests: fix artist_albums test, add status to A/B test notes --- notes/AB_Tests.md | 11 +++++++++++ .../youtube__music_artist_basic_all.snap | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index a6108e8..4e06ed3 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -32,6 +32,7 @@ with the following command: `rustypipe-codegen ab-test `. - **Encountered on:** 24.09.2022 - **Impact:** 🟡 Medium - **Endpoint:** next (video details) +- **Status:** Stabilized ![A/B test 1 screenshot](./_img/ab_1.png) @@ -121,6 +122,7 @@ UTF-16 index seperately. - **Encountered on:** 11.10.2022 - **Impact:** 🔴 High - **Endpoint:** browse (channel videos) +- **Status:** Stabilized ![A/B test 2 screenshot](./_img/ab_2.webp) @@ -217,6 +219,7 @@ Additionally the channel tab response model was slightly changed, now using a - **Encountered on:** 20.11.2022 - **Impact:** 🟡 Medium - **Endpoint:** search +- **Status:** Stabilized ![A/B test 3 screenshot](./_img/ab_3.png) @@ -276,6 +279,7 @@ Note that channels without handles still use the old data model, even on the sam - **Encountered on:** 1.04.2023 - **Impact:** 🟢 Low - **Endpoint:** browse (trending videos) +- **Status:** Discontinued YouTube moved the list of trending videos from the main _trending_ page to a separate tab (Videos). @@ -300,6 +304,7 @@ The data model for the video shelves did not change. - **Encountered on:** 1.05.2023 - **Impact:** 🟢 Low - **Endpoint:** browse (trending videos) +- **Status:** Frequent (99%) YouTube changed the header renderer type on the trending page to a `pageHeaderRenderer`. @@ -359,6 +364,7 @@ YouTube changed the header renderer type on the trending page to a `pageHeaderRe - **Encountered on:** 13.05.2023 - **Impact:** 🟡 Medium - **Endpoint:** browse (music artist) +- **Status:** Stabilized YouTube merged the 2 sections for singles and albums on artist pages together. Now there is only a _Top Releases_ section. @@ -381,6 +387,7 @@ visitor data cookie to be set, as it was the case with the old system. - **Encountered on:** 28.05.2023 - **Impact:** 🟢 Low +- **Status:** Discontinued YouTube changed their date format from the long format (_21 hours ago_, _3 days ago_) to a short format (_21h ago_, _3d ago_). @@ -389,6 +396,7 @@ a short format (_21h ago_, _3d ago_). - **Encountered on:** 29.06.2023 - **Impact:** 🟡 Medium +- **Status:** Experimental (9%) YouTube added the track playback count to search results and top artist tracks. In exchange, they removed the "Song" type identifier from search results. @@ -402,6 +410,7 @@ In exchange, they removed the "Song" type identifier from search results. - **Encountered on:** 26.06.2023 - **Impact:** 🟡 Medium - **Endpoint:** browse (playlist) +- **Status:** Stabilized ![A/B test 9 screenshot](./_img/ab_9.png) @@ -423,6 +432,7 @@ by using the mobile client. But that may change in the future. - **Encountered on:** 03.11.2023 - **Impact:** 🟡 Medium - **Endpoint:** browse (channel info) +- **Status:** Stabilized ![A/B test 10 screenshot](./_img/ab_10.png) @@ -438,6 +448,7 @@ the main tab. - **Encountered on:** 03.11.2023 - **Impact:** 🟢 Low - **Endpoint:** next +- **Status:** Experimental (7%) YouTube introduced an updated date model for the like/dislike buttons. The new model looks needlessly complex but contains the same parsing-relevant data as the old model diff --git a/tests/snapshots/youtube__music_artist_basic_all.snap b/tests/snapshots/youtube__music_artist_basic_all.snap index caecec2..e03c7a1 100644 --- a/tests/snapshots/youtube__music_artist_basic_all.snap +++ b/tests/snapshots/youtube__music_artist_basic_all.snap @@ -146,6 +146,21 @@ MusicArtist( year: Some(2015), by_va: false, ), + AlbumItem( + id: "MPREb_ghrNI6BJSM8", + name: "Friends And Family", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "Every Time I Die", + ), + ], + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + album_type: Album, + year: Some(2017), + by_va: false, + ), AlbumItem( id: "MPREb_h0UZr2ALQXf", name: "From Parts Unknown (Deluxe Edition)", From deeffacc1c5264f682e5737124ece5ff4ebf2c53 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 6 Dec 2023 21:53:35 +0100 Subject: [PATCH 079/459] feat: use official date serializer, fix test --- Cargo.toml | 3 ++- src/model/mod.rs | 7 +----- src/serializer/date.rs | 50 ------------------------------------------ src/serializer/mod.rs | 2 -- tests/youtube.rs | 2 +- 5 files changed, 4 insertions(+), 60 deletions(-) delete mode 100644 src/serializer/date.rs diff --git a/Cargo.toml b/Cargo.toml index f6b75ac..3beeed8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" authors = ["ThetaDev "] license = "GPL-3.0" description = "Client for the public YouTube / YouTube Music API (Innertube), inspired by NewPipe" +repository = "https://code.thetadev.de/ThetaDev/rustypipe" keywords = ["youtube", "video", "music"] categories = ["api-bindings", "multimedia"] @@ -51,7 +52,7 @@ serde_plain = "1.0.1" rand = "0.8.5" time = { version = "0.3.15", features = [ "macros", - "serde", + "serde-human-readable", "serde-well-known", ] } futures = "0.3.21" diff --git a/src/model/mod.rs b/src/model/mod.rs index b44eb83..11a25e6 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -12,11 +12,10 @@ pub use frameset::{Frameset, FramesetUrls}; use std::{collections::BTreeSet, ops::Range}; use serde::{Deserialize, Serialize}; -use serde_with::serde_as; use time::{Date, OffsetDateTime}; use self::{paginator::Paginator, richtext::RichText}; -use crate::{error::Error, param::Country, serializer::DateYmd, validate}; +use crate::{error::Error, param::Country, validate}; /* #COMMON @@ -501,7 +500,6 @@ pub struct Subtitle { */ /// YouTube playlist -#[serde_as] #[derive(Clone, Debug, Serialize, Deserialize)] #[non_exhaustive] pub struct Playlist { @@ -520,7 +518,6 @@ pub struct Playlist { /// Channel of the playlist pub channel: Option, /// Last update date - #[serde_as(as = "Option")] pub last_update: Option, /// Textual last update date pub last_update_txt: Option, @@ -739,7 +736,6 @@ pub struct Channel { } /// Detailed channel information -#[serde_as] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[non_exhaustive] pub struct ChannelInfo { @@ -757,7 +753,6 @@ pub struct ChannelInfo { /// Channel video count pub video_count: Option, /// Channel creation date - #[serde_as(as = "Option")] pub create_date: Option, /// Channel view count pub view_count: Option, diff --git a/src/serializer/date.rs b/src/serializer/date.rs deleted file mode 100644 index e26348c..0000000 --- a/src/serializer/date.rs +++ /dev/null @@ -1,50 +0,0 @@ -use serde::{ - de::{self, Visitor}, - ser, Serialize, -}; -use serde_with::{DeserializeAs, SerializeAs}; -use time::{macros::format_description, Date}; - -const YMD_FORMAT: &[time::format_description::FormatItem] = - format_description!("[year]-[month]-[day]"); - -pub struct DateYmd; - -impl SerializeAs for DateYmd { - fn serialize_as(date: &Date, serializer: S) -> Result - where - S: serde::Serializer, - { - date.format(YMD_FORMAT) - .map_err(ser::Error::custom)? - .serialize(serializer) - } -} - -impl<'de> DeserializeAs<'de, Date> for DateYmd { - fn deserialize_as(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - struct DateYmdVisitor; - - impl<'de> Visitor<'de> for DateYmdVisitor { - type Value = Date; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str("a YYYY-MM-DD formatted date") - } - - fn visit_str(self, v: &str) -> Result - where - E: serde::de::Error, - { - Date::parse(v, YMD_FORMAT).map_err(|_| { - de::Error::invalid_value(de::Unexpected::Str(v), &"a YYYY-MM-DD formatted date") - }) - } - } - - deserializer.deserialize_str(DateYmdVisitor) - } -} diff --git a/src/serializer/mod.rs b/src/serializer/mod.rs index b0a582e..fe02d70 100644 --- a/src/serializer/mod.rs +++ b/src/serializer/mod.rs @@ -1,10 +1,8 @@ pub mod text; -mod date; mod range; mod vec_log_err; -pub use date::DateYmd; pub use range::Range; pub use vec_log_err::VecSkipErrorWrap; diff --git a/tests/youtube.rs b/tests/youtube.rs index 7ce72b2..40a481f 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -754,7 +754,7 @@ fn get_video_details_no_desc(rp: RustyPipe) { assert_eq!(details.id, "VYJNSQ_ANyA"); assert_eq!(details.name, "Cricket comedy by Modi"); assert_eq!(details.channel.id, "UC8gBy2lByHxIyoPMglerNWg"); - assert_eq!(details.channel.name, "TMP VIBES"); + assert_eq!(details.channel.name, "TMP Shorts"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert!( From 7dc47b1090e1dac8764d69438c2a4557903757de Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 9 Dec 2023 02:44:56 +0100 Subject: [PATCH 080/459] tests: fix music_radio_not_found --- tests/youtube.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 40a481f..0b35439 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2294,8 +2294,7 @@ fn music_radio_artist(rp: RustyPipe) { #[rstest] fn music_radio_not_found(rp: RustyPipe) { - let err = - tokio_test::block_on(rp.query().music_radio("RDEM_Ktu-TilkxtLvmc9wXZZZZ")).unwrap_err(); + let err = tokio_test::block_on(rp.query().music_radio("RDEM_foo")).unwrap_err(); assert!( matches!(err, Error::Extraction(ExtractionError::NotFound { .. })), From 31a8fcf2fba99ab4e479ebde73f8287575c2c169 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 21 Dec 2023 21:09:09 +0100 Subject: [PATCH 081/459] fix: search for sensitive topics --- src/client/search.rs | 7 +++--- src/param/search_filter.rs | 48 ++++++++++++++++++++------------------ tests/youtube.rs | 20 +++++++++++++++- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/client/search.rs b/src/client/search.rs index 9a05b4e..b99066b 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -19,8 +19,7 @@ use super::{response, ClientType, MapResponse, MapResult, RustyPipeQuery, YTCont struct QSearch<'a> { context: YTContext<'a>, query: &'a str, - #[serde(skip_serializing_if = "Option::is_none")] - params: Option, + params: &'a str, } impl RustyPipeQuery { @@ -35,7 +34,7 @@ impl RustyPipeQuery { let request_body = QSearch { context, query, - params: None, + params: "8AEB", }; self.execute_request::( @@ -60,7 +59,7 @@ impl RustyPipeQuery { let request_body = QSearch { context, query, - params: Some(filter.encode()), + params: &filter.encode(), }; self.execute_request::( diff --git a/src/param/search_filter.rs b/src/param/search_filter.rs index 92ea81b..dddddc0 100644 --- a/src/param/search_filter.rs +++ b/src/param/search_filter.rs @@ -212,6 +212,8 @@ impl SearchFilter { extras.varint(1, 1); pb.embedded(8, extras); } + // Disable filter for sensitive topics (e.g. suicide) + pb.varint(30, 1); pb.to_base64() } @@ -256,29 +258,29 @@ mod tests { use super::*; #[rstest] - #[case(SearchFilter::new().item_type(ItemType::Video), "EgIQAQ%253D%253D")] - #[case(SearchFilter::new().item_type(ItemType::Channel), "EgIQAg%253D%253D")] - #[case(SearchFilter::new().item_type(ItemType::Playlist), "EgIQAw%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Hour), "EgIIAQ%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Day), "EgIIAg%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Week), "EgIIAw%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Month), "EgIIBA%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Year), "EgIIBQ%253D%253D")] - #[case(SearchFilter::new().length(Length::Short), "EgIYAQ%253D%253D")] - #[case(SearchFilter::new().length(Length::Medium), "EgIYAw%253D%253D")] - #[case(SearchFilter::new().length(Length::Long), "EgIYAg%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsLive), "EgJAAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::Is4k), "EgJwAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsHd), "EgIgAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::Subtitles), "EgIoAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::CCommons), "EgIwAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::Is360), "EgJ4AQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsVr180), "EgPQAQE%253D")] - #[case(SearchFilter::new().feature(Feature::Is3d), "EgI4AQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsHdr), "EgPIAQE%253D")] - #[case(SearchFilter::new().sort(Order::Date), "CAI%253D")] - #[case(SearchFilter::new().sort(Order::Views), "CAM%253D")] - #[case(SearchFilter::new().sort(Order::Rating), "CAE%253D")] + #[case(SearchFilter::new().item_type(ItemType::Video), "EgIQAfABAQ%253D%253D")] + #[case(SearchFilter::new().item_type(ItemType::Channel), "EgIQAvABAQ%253D%253D")] + #[case(SearchFilter::new().item_type(ItemType::Playlist), "EgIQA_ABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Hour), "EgIIAfABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Day), "EgIIAvABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Week), "EgIIA_ABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Month), "EgIIBPABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Year), "EgIIBfABAQ%253D%253D")] + #[case(SearchFilter::new().length(Length::Short), "EgIYAfABAQ%253D%253D")] + #[case(SearchFilter::new().length(Length::Medium), "EgIYA_ABAQ%253D%253D")] + #[case(SearchFilter::new().length(Length::Long), "EgIYAvABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsLive), "EgJAAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::Is4k), "EgJwAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsHd), "EgIgAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::Subtitles), "EgIoAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::CCommons), "EgIwAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::Is360), "EgJ4AfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsVr180), "EgPQAQHwAQE%253D")] + #[case(SearchFilter::new().feature(Feature::Is3d), "EgI4AfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsHdr), "EgPIAQHwAQE%253D")] + #[case(SearchFilter::new().sort(Order::Date), "CALwAQE%253D")] + #[case(SearchFilter::new().sort(Order::Views), "CAPwAQE%253D")] + #[case(SearchFilter::new().sort(Order::Rating), "CAHwAQE%253D")] fn t_filter(#[case] filter: SearchFilter, #[case] expect: &str) { assert_eq!(urlencoding::encode(&filter.encode()), expect); } diff --git a/tests/youtube.rs b/tests/youtube.rs index 0b35439..ded1a58 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -754,7 +754,7 @@ fn get_video_details_no_desc(rp: RustyPipe) { assert_eq!(details.id, "VYJNSQ_ANyA"); assert_eq!(details.name, "Cricket comedy by Modi"); assert_eq!(details.channel.id, "UC8gBy2lByHxIyoPMglerNWg"); - assert_eq!(details.channel.name, "TMP Shorts"); + assert_eq!(details.channel.name, "TMP Mix Veg"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert!( @@ -1256,6 +1256,24 @@ fn search_empty(rp: RustyPipe) { assert!(result.items.is_empty()); } +#[rstest] +#[case::no_filter(false)] +#[case::filter(true)] +fn search_sensitive(rp: RustyPipe, #[case] filter: bool) { + let q = "suicide"; + let result = if filter { + tokio_test::block_on( + rp.query() + .search_filter::(q, &search_filter::SearchFilter::new()), + ) + } else { + tokio_test::block_on(rp.query().search::(q)) + } + .unwrap(); + assert_gte(result.items.count.unwrap(), 10_000, "results"); + assert_next(result.items, rp.query(), 10, 2); +} + #[rstest] fn search_suggestion(rp: RustyPipe) { let result = tokio_test::block_on(rp.query().search_suggestion("hunger ga")).unwrap(); From 9e574d733dbf88961a93f12d52fcc994cbb3090a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 22 Dec 2023 23:31:50 +0100 Subject: [PATCH 082/459] fix: use new cookie consent token --- src/client/mod.rs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/client/mod.rs b/src/client/mod.rs index 5b21882..e6d3f1b 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -27,7 +27,6 @@ use std::sync::Arc; use std::{borrow::Cow, fmt::Debug, time::Duration}; use once_cell::sync::Lazy; -use rand::Rng; use regex::Regex; use reqwest::{header, Client, ClientBuilder, Request, RequestBuilder, Response, StatusCode}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; @@ -185,8 +184,7 @@ struct QContinuation<'a> { const DEFAULT_UA: &str = "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0"; -const CONSENT_COOKIE: &str = "CONSENT"; -const CONSENT_COOKIE_YES: &str = "YES+yt.462272069.de+FX+"; +const CONSENT_COOKIE: &str = "SOCS=CAISAiAD"; const YOUTUBEI_V1_URL: &str = "https://www.youtube.com/youtubei/v1/"; const YOUTUBEI_V1_GAPIS_URL: &str = "https://youtubei.googleapis.com/youtubei/v1/"; @@ -229,7 +227,6 @@ struct RustyPipeRef { storage: Option>, reporter: Option>, n_http_retries: u32, - consent_cookie: String, cache: CacheHolder, default_opts: RustyPipeOpts, } @@ -505,12 +502,6 @@ impl RustyPipeBuilder { Box::new(FileReporter::new(report_dir)) }), n_http_retries: self.n_http_retries, - consent_cookie: format!( - "{}={}{}", - CONSENT_COOKIE, - CONSENT_COOKIE_YES, - rand::thread_rng().gen_range(100..1000) - ), cache: CacheHolder { desktop_client: RwLock::new(cdata.desktop_client), music_client: RwLock::new(cdata.music_client), @@ -815,7 +806,7 @@ impl RustyPipe { .get(sw_url) .header(header::ORIGIN, origin) .header(header::REFERER, origin) - .header(header::COOKIE, self.inner.consent_cookie.clone()) + .header(header::COOKIE, CONSENT_COOKIE) .build() .unwrap(), ) @@ -1202,7 +1193,7 @@ impl RustyPipeQuery { )) .header(header::ORIGIN, YOUTUBE_HOME_URL) .header(header::REFERER, YOUTUBE_HOME_URL) - .header(header::COOKIE, self.client.inner.consent_cookie.clone()) + .header(header::COOKIE, CONSENT_COOKIE) .header("X-YouTube-Client-Name", "1") .header( "X-YouTube-Client-Version", @@ -1217,7 +1208,7 @@ impl RustyPipeQuery { )) .header(header::ORIGIN, YOUTUBE_MUSIC_HOME_URL) .header(header::REFERER, YOUTUBE_MUSIC_HOME_URL) - .header(header::COOKIE, self.client.inner.consent_cookie.clone()) + .header(header::COOKIE, CONSENT_COOKIE) .header("X-YouTube-Client-Name", "67") .header( "X-YouTube-Client-Version", From 8f0e1468395909a164ebb7b85c693d0111d41c89 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 2 Jan 2024 18:01:32 +0100 Subject: [PATCH 083/459] chore: update dependencies --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3beeed8..8803f28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ quick-js-dtp = { version = "0.4.1", default-features = false, features = [ ] } once_cell = "1.12.0" regex = "1.6.0" -fancy-regex = "0.12.0" +fancy-regex = "0.13.0" thiserror = "1.0.36" url = "2.2.2" reqwest = { version = "0.11.11", default-features = false, features = [ From 11fe9a5fa1c7eeb34055d3c232b4ec94ebcccd75 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 18 Jan 2024 13:21:10 +0100 Subject: [PATCH 084/459] fix(tests): update YTM snapshots --- .../youtube__music_album_no_artist.snap | 4 +- .../youtube__music_album_no_artist_intl.snap | 4 +- .../youtube__music_album_one_artist.snap | 20 ++++ .../youtube__music_album_one_artist_intl.snap | 20 ++++ .../snapshots/youtube__music_album_show.snap | 112 ++++++++++++++++++ .../youtube__music_album_show_intl.snap | 112 ++++++++++++++++++ .../youtube__music_album_unavailable.snap | 25 +++- ...youtube__music_album_unavailable_intl.snap | 25 +++- .../youtube__music_album_various_artists.snap | 4 +- ...ube__music_album_various_artists_intl.snap | 4 +- .../youtube__music_artist_basic_all_intl.snap | 15 +++ 11 files changed, 329 insertions(+), 16 deletions(-) diff --git a/tests/snapshots/youtube__music_album_no_artist.snap b/tests/snapshots/youtube__music_album_no_artist.snap index 60a3b5b..eea1c14 100644 --- a/tests/snapshots/youtube__music_album_no_artist.snap +++ b/tests/snapshots/youtube__music_album_no_artist.snap @@ -63,11 +63,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: None, + id: Some("UCUhWwvF6gIPWTYlYb4-icLA"), name: "L.r. Eswari", ), ], - artist_id: None, + artist_id: Some("UCUhWwvF6gIPWTYlYb4-icLA"), album: Some(AlbumId( id: "MPREb_bqWA6mAZFWS", name: "Pedha Rasi Peddamma Katha", diff --git a/tests/snapshots/youtube__music_album_no_artist_intl.snap b/tests/snapshots/youtube__music_album_no_artist_intl.snap index c450608..a8cefcf 100644 --- a/tests/snapshots/youtube__music_album_no_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_no_artist_intl.snap @@ -63,11 +63,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: None, + id: Some("UCUhWwvF6gIPWTYlYb4-icLA"), name: "[name]", ), ], - artist_id: None, + artist_id: Some("UCUhWwvF6gIPWTYlYb4-icLA"), album: Some(AlbumId( id: "MPREb_bqWA6mAZFWS", name: "[name]", diff --git a/tests/snapshots/youtube__music_album_one_artist.snap b/tests/snapshots/youtube__music_album_one_artist.snap index 25f4647..14f672c 100644 --- a/tests/snapshots/youtube__music_album_one_artist.snap +++ b/tests/snapshots/youtube__music_album_one_artist.snap @@ -29,6 +29,14 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "Demi Lovato", ), + ArtistId( + id: Some("UCKqVP7_535ELJu2OeEd3zzQ"), + name: "Missy Elliott", + ), + ArtistId( + id: Some("UCStR3TnjvL7CL8ZNFPKmRXw"), + name: "Timbaland", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( @@ -50,6 +58,10 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "Demi Lovato", ), + ArtistId( + id: Some("UC58M_VmdxEw-h-p_HgeE0Zg"), + name: "Dev", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( @@ -71,6 +83,10 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "Demi Lovato", ), + ArtistId( + id: Some("UC0tIFKS5uijPeJLjH8uAWJg"), + name: "Iyaz", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( @@ -92,6 +108,10 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "Demi Lovato", ), + ArtistId( + id: Some("UCA7oqkXUZIlT8QXhxaIR4RA"), + name: "Jason Derulo", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( diff --git a/tests/snapshots/youtube__music_album_one_artist_intl.snap b/tests/snapshots/youtube__music_album_one_artist_intl.snap index 26c2e91..d67935f 100644 --- a/tests/snapshots/youtube__music_album_one_artist_intl.snap +++ b/tests/snapshots/youtube__music_album_one_artist_intl.snap @@ -29,6 +29,14 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), + ArtistId( + id: Some("UCKqVP7_535ELJu2OeEd3zzQ"), + name: "[name]", + ), + ArtistId( + id: Some("UCStR3TnjvL7CL8ZNFPKmRXw"), + name: "[name]", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( @@ -50,6 +58,10 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), + ArtistId( + id: Some("UC58M_VmdxEw-h-p_HgeE0Zg"), + name: "[name]", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( @@ -71,6 +83,10 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), + ArtistId( + id: Some("UC0tIFKS5uijPeJLjH8uAWJg"), + name: "[name]", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( @@ -92,6 +108,10 @@ MusicAlbum( id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), name: "[name]", ), + ArtistId( + id: Some("UCA7oqkXUZIlT8QXhxaIR4RA"), + name: "[name]", + ), ], artist_id: Some("UCwem2sj-QUJCiWiPAo9JuAw"), album: Some(AlbumId( diff --git a/tests/snapshots/youtube__music_album_show.snap b/tests/snapshots/youtube__music_album_show.snap index 43d312a..570534a 100644 --- a/tests/snapshots/youtube__music_album_show.snap +++ b/tests/snapshots/youtube__music_album_show.snap @@ -12,6 +12,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), description: None, @@ -29,6 +33,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -50,6 +58,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -71,6 +83,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -92,6 +108,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -113,6 +133,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -134,6 +158,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -155,6 +183,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -176,6 +208,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -197,6 +233,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -218,6 +258,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -239,6 +283,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -260,6 +308,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -281,6 +333,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -302,6 +358,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -323,6 +383,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -344,6 +408,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -365,6 +433,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -386,6 +458,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -407,6 +483,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -428,6 +508,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -449,6 +533,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -470,6 +558,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -491,6 +583,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -512,6 +608,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -533,6 +633,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -554,6 +658,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -575,6 +683,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "Dimiter Inkiow", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "Griechische Mythologie für Kinder", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( diff --git a/tests/snapshots/youtube__music_album_show_intl.snap b/tests/snapshots/youtube__music_album_show_intl.snap index ff8113f..219157c 100644 --- a/tests/snapshots/youtube__music_album_show_intl.snap +++ b/tests/snapshots/youtube__music_album_show_intl.snap @@ -12,6 +12,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), description: "[description]", @@ -29,6 +33,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -50,6 +58,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -71,6 +83,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -92,6 +108,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -113,6 +133,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -134,6 +158,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -155,6 +183,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -176,6 +208,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -197,6 +233,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -218,6 +258,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -239,6 +283,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -260,6 +308,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -281,6 +333,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -302,6 +358,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -323,6 +383,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -344,6 +408,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -365,6 +433,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -386,6 +458,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -407,6 +483,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -428,6 +508,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -449,6 +533,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -470,6 +558,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -491,6 +583,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -512,6 +608,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -533,6 +633,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -554,6 +658,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( @@ -575,6 +683,10 @@ MusicAlbum( id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), name: "[name]", ), + ArtistId( + id: Some("UCsg6xTDzVnvrcWhgLYX6_rg"), + name: "[name]", + ), ], artist_id: Some("UCAotr_lJ3JJ79DPRlA7k47w"), album: Some(AlbumId( diff --git a/tests/snapshots/youtube__music_album_unavailable.snap b/tests/snapshots/youtube__music_album_unavailable.snap index ef83f26..57bcba2 100644 --- a/tests/snapshots/youtube__music_album_unavailable.snap +++ b/tests/snapshots/youtube__music_album_unavailable.snap @@ -7,12 +7,25 @@ MusicAlbum( playlist_id: Some("OLAK5uy_mux5ygfN9sbiR1ma3yh1GHTmqNekZNoAI"), name: "13 Reasons Why (Season 3)", cover: "[cover]", - artists: [], - artist_id: None, + artists: [ + ArtistId( + id: Some("UCCj0RlDqqahEB5BXVtDcPqg"), + name: "5 Seconds of Summer", + ), + ArtistId( + id: Some("UCMrCoizKiBxqeg5pTpBXn1A"), + name: "YUNGBLUD", + ), + ArtistId( + id: Some("UCvsgN5NKOzXnAURfaf3TOig"), + name: "Alexander 23", + ), + ], + artist_id: Some("UCCj0RlDqqahEB5BXVtDcPqg"), description: None, album_type: Album, year: Some(2019), - by_va: true, + by_va: false, tracks: [ TrackItem( id: "R3VIKRtzAdE", @@ -251,12 +264,16 @@ MusicAlbum( duration: Some(246), cover: [], artists: [ + ArtistId( + id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), + name: "Brendan Angelides", + ), ArtistId( id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"), name: "Eskmo", ), ], - artist_id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"), + artist_id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), album: Some(AlbumId( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", diff --git a/tests/snapshots/youtube__music_album_unavailable_intl.snap b/tests/snapshots/youtube__music_album_unavailable_intl.snap index cdf785d..36c8a58 100644 --- a/tests/snapshots/youtube__music_album_unavailable_intl.snap +++ b/tests/snapshots/youtube__music_album_unavailable_intl.snap @@ -7,12 +7,25 @@ MusicAlbum( playlist_id: Some("OLAK5uy_mux5ygfN9sbiR1ma3yh1GHTmqNekZNoAI"), name: "[name]", cover: "[cover]", - artists: [], - artist_id: None, + artists: [ + ArtistId( + id: Some("UCCj0RlDqqahEB5BXVtDcPqg"), + name: "[name]", + ), + ArtistId( + id: Some("UCMrCoizKiBxqeg5pTpBXn1A"), + name: "[name]", + ), + ArtistId( + id: Some("UCvsgN5NKOzXnAURfaf3TOig"), + name: "[name]", + ), + ], + artist_id: Some("UCCj0RlDqqahEB5BXVtDcPqg"), description: "[description]", album_type: Album, year: Some(2019), - by_va: true, + by_va: false, tracks: [ TrackItem( id: "R3VIKRtzAdE", @@ -251,12 +264,16 @@ MusicAlbum( duration: Some(246), cover: [], artists: [ + ArtistId( + id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), + name: "[name]", + ), ArtistId( id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"), name: "[name]", ), ], - artist_id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"), + artist_id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), album: Some(AlbumId( id: "MPREb_AzuWg8qAVVl", name: "[name]", diff --git a/tests/snapshots/youtube__music_album_various_artists.snap b/tests/snapshots/youtube__music_album_various_artists.snap index eac36e1..75ffe38 100644 --- a/tests/snapshots/youtube__music_album_various_artists.snap +++ b/tests/snapshots/youtube__music_album_various_artists.snap @@ -105,11 +105,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: None, + id: Some("UCa4ZqZPRjz9MYYnfpoh2few"), name: "LOONA", ), ], - artist_id: None, + artist_id: Some("UCa4ZqZPRjz9MYYnfpoh2few"), album: Some(AlbumId( id: "MPREb_8QkDeEIawvX", name: "<Queendom2> FINAL", diff --git a/tests/snapshots/youtube__music_album_various_artists_intl.snap b/tests/snapshots/youtube__music_album_various_artists_intl.snap index f44751e..6215266 100644 --- a/tests/snapshots/youtube__music_album_various_artists_intl.snap +++ b/tests/snapshots/youtube__music_album_various_artists_intl.snap @@ -105,11 +105,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: None, + id: Some("UCa4ZqZPRjz9MYYnfpoh2few"), name: "[name]", ), ], - artist_id: None, + artist_id: Some("UCa4ZqZPRjz9MYYnfpoh2few"), album: Some(AlbumId( id: "MPREb_8QkDeEIawvX", name: "[name]", diff --git a/tests/snapshots/youtube__music_artist_basic_all_intl.snap b/tests/snapshots/youtube__music_artist_basic_all_intl.snap index 7e30c47..4a7ad20 100644 --- a/tests/snapshots/youtube__music_artist_basic_all_intl.snap +++ b/tests/snapshots/youtube__music_artist_basic_all_intl.snap @@ -146,6 +146,21 @@ MusicArtist( year: Some(2015), by_va: false, ), + AlbumItem( + id: "MPREb_ghrNI6BJSM8", + name: "[name]", + cover: "[cover]", + artists: [ + ArtistId( + id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + name: "[name]", + ), + ], + artist_id: Some("UCFKUUtHjT4iq3p0JJA13SOA"), + album_type: Album, + year: Some(2017), + by_va: false, + ), AlbumItem( id: "MPREb_h0UZr2ALQXf", name: "[name]", From 9ecf7eff74eb1c9b98a198bb5559ab67bc2c4d97 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 18 Jan 2024 13:23:56 +0100 Subject: [PATCH 085/459] chore: fix clippy lints --- src/client/channel.rs | 2 +- src/client/music_playlist.rs | 2 +- src/client/response/mod.rs | 14 ++++++++------ src/lib.rs | 1 + 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/client/channel.rs b/src/client/channel.rs index 1907160..85ecfb3 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -529,7 +529,7 @@ fn map_channel_content( .content .section_list_renderer .as_ref() - .and_then(|c| c.contents.c.get(0)) + .and_then(|c| c.contents.c.first()) { return Err(ExtractionError::Unavailable { reason: crate::error::UnavailabilityReason::AgeRestricted, diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 49350fb..d3fb2a9 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -327,7 +327,7 @@ impl MapResponse for response::MusicPlaylist { let year_txt = subtitle_split .swap_remove(2) .0 - .get(0) + .first() .map(|c| c.as_str().to_owned()); (year_txt, subtitle_split.try_swap_remove(1)) } diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index 237c930..47f0b81 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -335,12 +335,14 @@ impl From for Vec { impl From> for crate::model::Verification { fn from(badges: Vec) -> Self { - badges.get(0).map_or(crate::model::Verification::None, |b| { - match b.metadata_badge_renderer.style { - ChannelBadgeStyle::BadgeStyleTypeVerified => Self::Verified, - ChannelBadgeStyle::BadgeStyleTypeVerifiedArtist => Self::Artist, - } - }) + badges + .first() + .map_or(crate::model::Verification::None, |b| { + match b.metadata_badge_renderer.style { + ChannelBadgeStyle::BadgeStyleTypeVerified => Self::Verified, + ChannelBadgeStyle::BadgeStyleTypeVerifiedArtist => Self::Artist, + } + }) } } diff --git a/src/lib.rs b/src/lib.rs index e6868d8..2f4fa34 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ #![allow( clippy::doc_markdown, clippy::similar_names, + clippy::struct_field_names, clippy::items_after_statements, clippy::too_many_lines, clippy::module_name_repetitions, From d38a1366e738db92f1b7a98e144d30ee340209ae Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 18 Jan 2024 13:32:24 +0100 Subject: [PATCH 086/459] tests: disable channel shorts tests --- tests/youtube.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index ded1a58..1207df8 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -827,6 +827,7 @@ fn channel_videos(rp: RustyPipe) { } #[rstest] +#[ignore] fn channel_shorts(rp: RustyPipe) { let channel = tokio_test::block_on( rp.query() @@ -1006,8 +1007,9 @@ fn channel_more( #[rstest] #[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos)] -#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts)] #[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live)] +#[ignore] +#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts)] fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: RustyPipe) { let latest = tokio_test::block_on(rp.query().channel_videos_tab_order( id, @@ -1033,8 +1035,9 @@ fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: Rust #[rstest] #[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos, "XqZsoesa55w")] -#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts, "k91vRvXGwHs")] #[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live, "ojes5ULOqhc")] +#[ignore] +#[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts, "k91vRvXGwHs")] fn channel_order_popular( #[case] id: &str, #[case] tab: ChannelVideoTab, From f618add384d6812b5ac1576fe58bd7603101b42f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 18 Jan 2024 13:44:11 +0100 Subject: [PATCH 087/459] chore: disable pedantic lints --- src/lib.rs | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 2f4fa34..6d5b355 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,19 +1,6 @@ #![doc = include_str!("../README.md")] -#![warn(missing_docs, clippy::todo, clippy::dbg_macro, clippy::pedantic)] -#![allow( - clippy::doc_markdown, - clippy::similar_names, - clippy::struct_field_names, - clippy::items_after_statements, - clippy::too_many_lines, - clippy::module_name_repetitions, - clippy::must_use_candidate, - clippy::cast_possible_truncation, - clippy::cast_sign_loss, - clippy::cast_precision_loss, - clippy::single_match_else, - clippy::missing_errors_doc -)] +#![forbid(unsafe_code)] +#![warn(missing_docs, clippy::todo, clippy::dbg_macro)] //! ## Go to //! From fd3e128f5002f572f80b0215ef9df8dc80f479b9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 18 Jan 2024 16:03:15 +0100 Subject: [PATCH 088/459] fix: remove shorts duration parsing --- src/client/response/video_item.rs | 90 +------------------------------ src/util/timeago.rs | 4 ++ tests/youtube.rs | 1 - 3 files changed, 6 insertions(+), 89 deletions(-) diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index a46b0a0..c151e08 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -1,5 +1,3 @@ -use once_cell::sync::Lazy; -use regex::Regex; use serde::Deserialize; use serde_with::{ rust::deserialize_ignore_any, serde_as, DefaultOnError, DisplayFromStr, VecSkipError, @@ -14,7 +12,7 @@ use crate::{ }, param::Language, serializer::{ - text::{AccessibilityText, Text, TextComponent}, + text::{Text, TextComponent}, MapResult, }, util::{self, timeago, TryRemove}, @@ -139,13 +137,6 @@ pub(crate) struct ReelItemRenderer { /// Contains `No views` if the view count is zero #[serde_as(as = "Option")] pub view_count_text: Option, - /// video duration - /// - /// Example: `the horror maze - 44 seconds - play video` - /// - /// Dashes may be `\u2013` (emdash) - #[serde_as(as = "Option")] - pub accessibility: Option, #[serde(default)] #[serde_as(as = "DefaultOnError")] pub navigation_endpoint: Option, @@ -395,10 +386,6 @@ impl IsShort for Vec { } } -static ACCESSIBILITY_SEP_REGEX: Lazy = Lazy::new(|| { - Regex::new("(?:[ \u{00a0}][-\u{2013}\u{2014}] )|\u{2013}|(?:\u{055d} )|(?:\", )").unwrap() -}); - /// Result of mapping a list of different YouTube enities /// (videos, channels, playlists) #[derive(Debug)] @@ -510,36 +497,10 @@ impl YouTubeListMapper { .timestamp_text }); - let length = video.accessibility.and_then(|acc| { - // The video title has to be stripped from the beginning because in Swahili - // the duration follows the title with no separator (probably a bug). - // Example: `what I do with leftoversdakika 1 - cheza video` - let parts = ACCESSIBILITY_SEP_REGEX - .split(acc.trim_start_matches(&video.headline)) - .collect::>(); - if parts.len() > 1 { - // In Russian, the duration is the last part - // Example: `Воспроизвести видео – \"hangover food\". Его продолжительность – 58 секунд.` - let i = match self.lang { - Language::Ru => 1, - _ => 2, - }; - timeago::parse_video_duration_or_warn( - self.lang, - parts[parts.len() - i], - &mut self.warnings, - ) - } else { - self.warnings - .push(format!("could not split video duration `{acc}`")); - None - } - }); - VideoItem { id: video.video_id, name: video.headline, - length, + length: None, thumbnail: video.thumbnail.into(), channel: self.channel.clone(), publish_date: pub_date_txt.as_ref().and_then(|txt| { @@ -789,50 +750,3 @@ impl YouTubeListMapper { res.c.into_iter().for_each(|item| self.map_item(item)); } } - -#[cfg(test)] -mod tests { - use super::ACCESSIBILITY_SEP_REGEX; - - use rstest::rstest; - - #[rstest] - #[case::af( - "BTS - Permission to Dance Cover #shorts #pinkfong – 50 sekondes – speel video", - "50 sekondes" - )] - #[case::de( - "Point of view: Me VS My mom #shorts – 8 Sekunden – Video wiedergeben", - "8 Sekunden" - )] - #[case::be( - "Point of view: Me VS My mom #shorts–8 секунд – прайграць відэа", - "8 секунд" - )] - #[case::fil("do u wanna get swole? - 53 segundo - i-play ang video", "53 segundo")] - #[case::ar( - "«the holy trinity of korean street food»՝ 1 րոպե՝ նվագարկել տեսանյութը", - "1 րոպե" - )] - #[case::lv( - "what i ate in google japan — 1 minūte — atskaņot videoklipu", - "1 minūte" - )] - #[case::sq("When you impulse buy... - 1 minutë - luaj videon", "1 minutë")] - #[case::uk( - "\"Point of view: Me VS My mom #shorts\", 8 секунд – відтворити відео", - "8 секунд" - )] - // INFO: sw is unparseable "coming soonsekunde 58 - cheza video" - fn split_duration_txt(#[case] s: &str, #[case] expect: &str) { - let parts = ACCESSIBILITY_SEP_REGEX.split(s).collect::>(); - assert_eq!(parts[parts.len() - 2], expect); - } - - #[test] - fn split_duration_txt_ru() { - let s = "Воспроизвести видео – \"the holy trinity of korean street food\". Его продолжительность – 1 минута."; - let parts = ACCESSIBILITY_SEP_REGEX.split(s).collect::>(); - assert_eq!(parts[parts.len() - 1], "1 минута."); - } -} diff --git a/src/util/timeago.rs b/src/util/timeago.rs index aa9781a..bcd25f0 100644 --- a/src/util/timeago.rs +++ b/src/util/timeago.rs @@ -322,6 +322,10 @@ pub fn parse_video_duration(lang: Language, video_duration: &str) -> Option let parts = split_duration_txt(video_duration, matches!(lang, Language::Si | Language::Sw)); let mut secs = 0; + if parts.is_empty() { + return None; + } + for part in parts { let mut n = if part.digits.is_empty() { 1 diff --git a/tests/youtube.rs b/tests/youtube.rs index 1207df8..0629b56 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -831,7 +831,6 @@ fn channel_videos(rp: RustyPipe) { fn channel_shorts(rp: RustyPipe) { let channel = tokio_test::block_on( rp.query() - .lang(Language::Sq) .channel_videos_tab("UCh8gHdtzO2tXd593_bjErWg", ChannelVideoTab::Shorts), ) .unwrap(); From d413cad8bbe0957aae150e21c9f1121fda6a629c Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 24 Jan 2024 12:48:13 +0100 Subject: [PATCH 089/459] fix: number parsing for as,bs,it, update testdata --- ...t__channel__tests__map_channel_shorts.snap | 96 +++++++++---------- src/util/dictionary.rs | 35 +++---- src/util/mod.rs | 3 + testfiles/dict/dictionary.json | 5 +- tests/youtube.rs | 14 +-- 5 files changed, 79 insertions(+), 74 deletions(-) diff --git a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts.snap b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts.snap index 65d6b8b..c2116be 100644 --- a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts.snap +++ b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts.snap @@ -122,7 +122,7 @@ Channel( VideoItem( id: "bGXP83AU3Mc", name: "do u wanna get swole?", - length: Some(53), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/bGXP83AU3Mc/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC9bzCBeHDbZFLE84Up3IiBIsxmmA", @@ -148,7 +148,7 @@ Channel( VideoItem( id: "E52sSgZlgYs", name: "the holy trinity of korean street food", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/E52sSgZlgYs/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDBahtFRcfBInHuA8CjXFPWkF2jHg", @@ -174,7 +174,7 @@ Channel( VideoItem( id: "ovaHmfy3O6U", name: "hangover food", - length: Some(58), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/ovaHmfy3O6U/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCHmvWlG06h-DT6oxfmh69JGQ69KA", @@ -200,7 +200,7 @@ Channel( VideoItem( id: "FHTQmKTZnlI", name: "pig trotter raguuuuuuuuu 💅", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/FHTQmKTZnlI/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD0xhka1osA4nI3VCwhQusn3ND3Hg", @@ -226,7 +226,7 @@ Channel( VideoItem( id: "1AXB0l_wKMs", name: "what i ate in google japan", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/1AXB0l_wKMs/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBsfYJ0KffUNn-9jBzNRTqetyFr8g", @@ -252,7 +252,7 @@ Channel( VideoItem( id: "1ARLtk3HiB0", name: "succumb to your cravings", - length: Some(53), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/1ARLtk3HiB0/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBY9E40Ehvq862CVItJy0Uj_pS5bg", @@ -278,7 +278,7 @@ Channel( VideoItem( id: "0FfDoDHpaN8", name: "you can\'t let the what ifs rule your life", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/0FfDoDHpaN8/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBiV2TVPO-VbIjoNtwCKmFuxmj6LA", @@ -304,7 +304,7 @@ Channel( VideoItem( id: "kuT90_RIdF0", name: "duck confit lollipop 🦆🍭", - length: Some(59), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/kuT90_RIdF0/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCUN-DW72m7sAXJMgVkWNxPYpJBcQ", @@ -330,7 +330,7 @@ Channel( VideoItem( id: "aPJLhrcM4Yg", name: "HOUSE TOUR", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/aPJLhrcM4Yg/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1TbWAIbzyWq8AXLoW0xqaji3ukQ", @@ -356,7 +356,7 @@ Channel( VideoItem( id: "DKQrG_hJJX4", name: "how to meal prep like a korean", - length: Some(59), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/DKQrG_hJJX4/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBE2DnpLFvtXsZOu1Ta4JQeOToVAw", @@ -382,7 +382,7 @@ Channel( VideoItem( id: "lNizW_P_oVw", name: "Rating Everything I ate at McDonald\'s Japan 🇯🇵", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/lNizW_P_oVw/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBI5XrkQ9Hesbf4lWELy7Uk3yMGMg", @@ -408,7 +408,7 @@ Channel( VideoItem( id: "kbWyJjrCjwA", name: "enemies as fertilizer √(veg)", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/kbWyJjrCjwA/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDlk30Km1M0jze1M3O90fB2LdvoAQ", @@ -434,7 +434,7 @@ Channel( VideoItem( id: "xAp910JTDig", name: "let\'s make some cabbage rolls for lunch", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/xAp910JTDig/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAJtpPGRgffBu9WDXACbtiGa_oRgA", @@ -460,7 +460,7 @@ Channel( VideoItem( id: "vSL7dhKatEk", name: "Rating Everything I ate at IKEA Korea", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/vSL7dhKatEk/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBYpIDYbwwWiCqRNVi6PlfEfjrt4A", @@ -486,7 +486,7 @@ Channel( VideoItem( id: "LZzhUpACXSk", name: "I\'m done being the bigger person", - length: Some(59), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/LZzhUpACXSk/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAFTvhtVUP7QZ4P7U70-0XH7PzDDg", @@ -512,7 +512,7 @@ Channel( VideoItem( id: "5C7nqNDfhis", name: "we\'re cooking a whole bird today", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/5C7nqNDfhis/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLA9I9irDsRjikwd0aqp1FWNFtjAqA", @@ -538,7 +538,7 @@ Channel( VideoItem( id: "6mj4Af0kUOQ", name: "men will disappoint but never potatoes", - length: Some(50), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/6mj4Af0kUOQ/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAVxl-FPt878AQXPBhbV1VSGeR8sw", @@ -564,7 +564,7 @@ Channel( VideoItem( id: "1c3axhSJiaQ", name: "I used to hate korean food", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/1c3axhSJiaQ/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBucOEbTsWTDjOOCjNa-fAvz1yxyA", @@ -590,7 +590,7 @@ Channel( VideoItem( id: "F9Vz0m7DPeU", name: "Rating everything I got at 7/11 Hawaii ( ft. Mauna Kea )", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/F9Vz0m7DPeU/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDOoCVL6la3ztUeQ6vP4iL1cEBRjQ", @@ -616,7 +616,7 @@ Channel( VideoItem( id: "Uey7kl56wks", name: "Grabbing Snacks from 7/11 Hawaii", - length: Some(49), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/Uey7kl56wks/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCWmgajinNtIEbiPbqEtDvkC7Ydrg", @@ -642,7 +642,7 @@ Channel( VideoItem( id: "3un2eUAr6Dg", name: "cheesy korean corn balls hit different", - length: Some(46), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/3un2eUAr6Dg/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD4LziL6GHd1jg8btMJDIM_RhgE_A", @@ -668,7 +668,7 @@ Channel( VideoItem( id: "rI5tWrGpDJA", name: "hawaiian tajin?!?", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/rI5tWrGpDJA/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAjNiKHdFSKGavBrZRDxi9WdR-gJw", @@ -694,7 +694,7 @@ Channel( VideoItem( id: "WQiGksTxr5g", name: "Rating everything I ate at Hawaiian Supermarket 🌺🏰 pt.2", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/WQiGksTxr5g/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCvzC5xVdTEJX8xtiOqzmeKvmouIg", @@ -720,7 +720,7 @@ Channel( VideoItem( id: "G7aw-QOsagk", name: "Grocery Shopping at Hawaiian Supermarket 🌺🏰 pt.1", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/G7aw-QOsagk/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAoKEkj2lqYU07yW_DU35TNHEOq4w", @@ -746,7 +746,7 @@ Channel( VideoItem( id: "Y_F1_Yf-DKQ", name: "Breakfast at Hawaiian McDonald\'s 🌺", - length: Some(61), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/Y_F1_Yf-DKQ/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLDTLFBwRThZUk0eugFSNxc-CKI_HQ", @@ -772,7 +772,7 @@ Channel( VideoItem( id: "Q_ZMcP8faw4", name: "crab rangoon toast 🦀 🍞", - length: Some(55), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/Q_ZMcP8faw4/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLATLiHTNqLoBKsEKbOckkGjXMvoHA", @@ -798,7 +798,7 @@ Channel( VideoItem( id: "1aedyP3r3D0", name: "my secret hot pot sauce 🧙\u{200d}♀\u{fe0f}🍃", - length: Some(59), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/1aedyP3r3D0/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCh2MpR5k3jCS_wfX-wjtVuIcu7YQ", @@ -824,7 +824,7 @@ Channel( VideoItem( id: "fkPkHZ1yyBU", name: "the good vs the bad", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/fkPkHZ1yyBU/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCMngiRtLrBPppmfPnJwJ-cYMwttA", @@ -850,7 +850,7 @@ Channel( VideoItem( id: "NbQcySLMLmA", name: "cooking with waste?!🗑\u{fe0f}", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/NbQcySLMLmA/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCvxPQo9eqYwjk4cxyBnrHed-tcZg", @@ -876,7 +876,7 @@ Channel( VideoItem( id: "3w_5vzM1Pc4", name: "Shrek burger 🍔🍀👹", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/3w_5vzM1Pc4/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLB64zOKgmhOt7bvQseeIbjKBICDAg", @@ -902,7 +902,7 @@ Channel( VideoItem( id: "girJP2r_zLg", name: "$$$ on food", - length: Some(55), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/girJP2r_zLg/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBg2hmruZvx30aiP4Jb4dhz03qOZA", @@ -928,7 +928,7 @@ Channel( VideoItem( id: "zHp7sZ5OONM", name: "pumpkin spice churro?! 🎃", - length: Some(58), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/zHp7sZ5OONM/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD8ZrcI6mq91ARKnRb_vg-0Qv2raw", @@ -954,7 +954,7 @@ Channel( VideoItem( id: "iqMl3gQEZ0E", name: "3,000,000", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/iqMl3gQEZ0E/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBUC1sw84NlLiyTJTcfnDWFjVC75w", @@ -980,7 +980,7 @@ Channel( VideoItem( id: "glyJWxp7a5g", name: "being smart was my personality trait", - length: Some(56), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/glyJWxp7a5g/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBbrWwLndPt5ZV5x4dnqmTC_aAhig", @@ -1006,7 +1006,7 @@ Channel( VideoItem( id: "dd1EZIkANYs", name: "the horror maze", - length: Some(44), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/dd1EZIkANYs/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBlqz2BM3K2VeLlXMPBVwXNXih6vg", @@ -1032,7 +1032,7 @@ Channel( VideoItem( id: "enioc_stRww", name: "furikake bagels with wasabi cream cheese", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/enioc_stRww/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBz9Qo96FWssNsMhQ54DMxdYYwLfQ", @@ -1058,7 +1058,7 @@ Channel( VideoItem( id: "NUM8kCPas5w", name: "simple is best", - length: Some(49), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/NUM8kCPas5w/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC8N3YRr9A6-u6L0AtMynct4C_GzQ", @@ -1084,7 +1084,7 @@ Channel( VideoItem( id: "1djkcsFnlYE", name: "edible history lesson!", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/1djkcsFnlYE/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBHn_6yOrnRXH_zbxVaAuKzSulcew", @@ -1110,7 +1110,7 @@ Channel( VideoItem( id: "cIYrJtAoftI", name: "and I\'m feeling good", - length: Some(53), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/cIYrJtAoftI/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC4q0VcbBZroejhAztDkdlk7Ww5Og", @@ -1136,7 +1136,7 @@ Channel( VideoItem( id: "cCrH8Er5tf4", name: "Rating Korean Convenience Store Milk Flavors 🥛🍼", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/cCrH8Er5tf4/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBwc2ikrGH_gZfcyqTnZDfHjt5LuA", @@ -1162,7 +1162,7 @@ Channel( VideoItem( id: "tav5wsH7pzU", name: "online dating?", - length: Some(58), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/tav5wsH7pzU/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCheup7XAM_O1UAMEO5Iqup4-lGRQ", @@ -1188,7 +1188,7 @@ Channel( VideoItem( id: "5Vd4_GXjF7o", name: "Creating thumbnails has never been easier with Adobe Express", - length: Some(26), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/5Vd4_GXjF7o/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCbYkH7INYGHW0IcO3DKip5iD2PCA", @@ -1214,7 +1214,7 @@ Channel( VideoItem( id: "-FN1sEI8HkU", name: "my favorite color is green", - length: Some(45), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/-FN1sEI8HkU/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCLWKPrR-VCdsXagJ1MIyah7dDdDQ", @@ -1240,7 +1240,7 @@ Channel( VideoItem( id: "viT-dcl2DGE", name: "frodo baggins?", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/viT-dcl2DGE/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDb0oYC_3V79CSR0j-4sR4CuNQekQ", @@ -1266,7 +1266,7 @@ Channel( VideoItem( id: "N5AKQflK1TU", name: "When you impulse buy...", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/N5AKQflK1TU/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDwfPTcuQHyziYsmTrSkg9xi1jnag", @@ -1292,7 +1292,7 @@ Channel( VideoItem( id: "OzIFALQ_YtA", name: "taste testing gam!", - length: Some(60), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/OzIFALQ_YtA/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBMcyG6Fu4rrXk-JQL5tx0hzSAxlw", @@ -1318,7 +1318,7 @@ Channel( VideoItem( id: "dAcJILbc_0Q", name: "How to: Korean rice wine 🍶 (makgeolli)", - length: Some(59), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/dAcJILbc_0Q/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAXbHym4PFTTO25GCI4n1tjSaQVCw", @@ -1344,7 +1344,7 @@ Channel( VideoItem( id: "GvutfmW26JQ", name: "👹stay sour 🍋", - length: Some(52), + length: None, thumbnail: [ Thumbnail( url: "https://i.ytimg.com/vi/GvutfmW26JQ/oar2.jpg?sqp=-oaymwEaCJUDENAFSFXyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBgCJ06W3wOend0UgkuBKoHOg0eig", diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index d4d3b79..a7711ff 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -391,24 +391,25 @@ pub(crate) fn entry(lang: Language) -> Entry { }, comma_decimal: false, number_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ - (0, 7), - (9, 8), - (0, 0), + (1, 0), + (3, 6), + (1, 4), ], entries: &[ ("হ\u{9be}", 3), - ("হ\u{9be}জ\u{9be}ৰট\u{9be}", 3), - ("নিয\u{9c1}তট\u{9be}", 6), - ("হ\u{9be}জ\u{9be}ৰ", 3), - ("ল\u{9be}", 5), + ("কোঃ", 5), ("ল\u{9be}খট\u{9be}", 5), - ("কোঃট\u{9be}", 9), - ("নিঃট\u{9be}", 6), - ("নিয\u{9c1}ত", 6), - ("নিঃ", 6), ("ল\u{9be}খ", 5), + ("নিঃট\u{9be}", 6), + ("হ\u{9be}জ\u{9be}ৰট\u{9be}", 3), + ("কোঃট\u{9be}", 9), + ("নিঃ", 6), + ("নিয\u{9c1}তট\u{9be}", 6), + ("ল\u{9be}", 5), + ("নিয\u{9c1}ত", 6), + ("হ\u{9be}জ\u{9be}ৰ", 3), ], }, number_nd_tokens: ::phf::Map { @@ -890,14 +891,15 @@ pub(crate) fn entry(lang: Language) -> Entry { }, comma_decimal: true, number_tokens: ::phf::Map { - key: 12913932095322966823, + key: 10121458955350035957, disps: &[ (2, 0), ], entries: &[ - ("hilj", 3), - ("mlr", 9), ("mil", 6), + ("mlr", 9), + ("hilj", 3), + ("mlrd", 9), ], }, number_nd_tokens: ::phf::Map { @@ -3094,8 +3096,9 @@ pub(crate) fn entry(lang: Language) -> Entry { (0, 0), ], entries: &[ - ("mrd", 9), + ("mio", 6), ("mln", 6), + ("mrd", 9), ], }, number_nd_tokens: ::phf::Map { diff --git a/src/util/mod.rs b/src/util/mod.rs index e48cd2b..34d09ac 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -643,6 +643,9 @@ pub(crate) mod tests { #[case(Language::As, "১ জন গ্ৰাহক", 1)] #[case(Language::Ru, "Зрителей, ожидающих начала трансляции: 6", 6)] #[case(Language::Si, "වාදන මි4.6ක්", 4_600_000)] + #[case(Language::As, "3.7 শঃ কোঃ বাৰ প্লে’ কৰা হৈছে", 370_000)] + #[case(Language::Bs, "3,3 mlrd. pregleda", 3_300_000_000)] + #[case(Language::It, "3,73 Mio di iscritti", 3_730_000)] fn t_parse_large_numstr(#[case] lang: Language, #[case] string: &str, #[case] expect: u64) { let res = parse_large_numstr::(string, lang).unwrap(); assert_eq!(res, expect); diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index 66d9dea..9a1fc98 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -203,6 +203,7 @@ "হা": 3, "হাজাৰ": 3, "হাজাৰটা": 3, + "কোঃ": 5, "লা": 5, "লাখ": 5, "লাখটা": 5, @@ -504,7 +505,8 @@ "number_tokens": { "hilj": 3, "mil": 6, - "mlr": 9 + "mlr": 9, + "mlrd": 9 }, "number_nd_tokens": { "nema": 0 @@ -1818,6 +1820,7 @@ }, "comma_decimal": true, "number_tokens": { + "mio": 6, "mln": 6, "mrd": 9 }, diff --git a/tests/youtube.rs b/tests/youtube.rs index 0629b56..60c5c0e 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1537,7 +1537,7 @@ fn music_album_not_found(rp: RustyPipe) { // #[case::basic("basic", "UC7cl4MmM6ZZ2TcFyMk_b4pg", false, 15, 2)] #[case::no_more_albums("no_more_albums", "UCOR4_bSVIXPsGa4BbCSt60Q", true, 15, 0)] #[case::only_singles("only_singles", "UCfwCE5VhPMGxNPFxtVv7lRw", false, 13, 0)] -#[case::no_artist("no_artist", "UCh8gHdtzO2tXd593_bjErWg", false, 0, 2)] +#[case::no_artist("no_artist", "UCh8gHdtzO2tXd593_bjErWg", false, 0, 0)] // querying Trailerpark's secondary YouTube channel should result in the YTM channel being fetched #[case::secondary_channel("no_more_albums", "UCC9192yGQD25eBZgFZ84MPw", true, 15, 0)] fn music_artist( @@ -1960,12 +1960,12 @@ fn music_search_albums( assert_eq!(album.artists.len(), 1); let album_artist = &album.artists[0]; - assert_eq!(album_artist.id.as_ref().unwrap(), artist_id); + assert_eq!(album_artist.id.as_ref().expect("artist.id"), artist_id); if unlocalized { assert_eq!(album_artist.name, artist); } - assert_eq!(album.artist_id.as_ref().unwrap(), artist_id); + assert_eq!(album.artist_id.as_ref().expect("artist_id"), artist_id); assert!(!album.cover.is_empty(), "got no cover"); assert_eq!(album.year.as_ref().unwrap(), &year); assert_eq!(album.album_type, album_type); @@ -2011,11 +2011,7 @@ fn music_search_artists_cont(rp: RustyPipe) { #[rstest] fn music_search_playlists(rp: RustyPipe, unlocalized: bool) { - let res = tokio_test::block_on( - rp.query() - .music_search_playlists("today's rock hits", false), - ) - .unwrap(); + let res = tokio_test::block_on(rp.query().music_search_playlists("rock hits", false)).unwrap(); assert_eq!(res.corrected_query, None); let playlist = res @@ -2028,7 +2024,7 @@ fn music_search_playlists(rp: RustyPipe, unlocalized: bool) { }); if unlocalized { - assert_eq!(playlist.name, "Today's Rock Hits"); + assert_eq!(playlist.name, "Rock Hits"); } assert!(!playlist.thumbnail.is_empty(), "got no thumbnail"); assert_gte(playlist.track_count.unwrap(), 100, "tracks"); From c065af08510439dd6a0c9f80352e9f79fcf3eb0f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 24 Jan 2024 17:11:47 +0100 Subject: [PATCH 090/459] fix(tests): change YTM playlist --- tests/youtube.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 60c5c0e..8e3a37e 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2011,23 +2011,27 @@ fn music_search_artists_cont(rp: RustyPipe) { #[rstest] fn music_search_playlists(rp: RustyPipe, unlocalized: bool) { - let res = tokio_test::block_on(rp.query().music_search_playlists("rock hits", false)).unwrap(); + let res = tokio_test::block_on( + rp.query() + .music_search_playlists("Massive Rock Hits", false), + ) + .unwrap(); assert_eq!(res.corrected_query, None); let playlist = res .items .items .iter() - .find(|p| p.id == "RDCLAK5uy_nLtxizvEMkzYQUrA-bFf6MnBeR4bGYWUQ") + .find(|p| p.id == "RDCLAK5uy_k7h5535MeHE8xmgHsrZx7HOKH4lb5vAfY") .unwrap_or_else(|| { panic!("could not find playlist, got {:#?}", &res.items.items); }); if unlocalized { - assert_eq!(playlist.name, "Rock Hits"); + assert_eq!(playlist.name, "Massive Rock Hits"); } assert!(!playlist.thumbnail.is_empty(), "got no thumbnail"); - assert_gte(playlist.track_count.unwrap(), 100, "tracks"); + assert_gte(playlist.track_count.unwrap(), 40, "tracks"); assert_eq!(playlist.channel, None); assert!(playlist.from_ytm); From b20940e934d05fdd5236c73b5ccdef395a02a5f9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Wed, 24 Jan 2024 17:22:44 +0100 Subject: [PATCH 091/459] fix(tests): dont fetch non-existant channel tabs --- tests/youtube.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 8e3a37e..e0ed22d 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -980,20 +980,20 @@ fn channel_more( } } - let channel_videos = tokio_test::block_on(rp.query().channel_videos(&id)).unwrap(); - assert_channel(&channel_videos, id, name, unlocalized || name_unlocalized); if has_videos { + let channel_videos = tokio_test::block_on(rp.query().channel_videos(&id)).unwrap(); + assert_channel(&channel_videos, id, name, unlocalized || name_unlocalized); assert!(!channel_videos.content.items.is_empty(), "got no videos"); } - let channel_playlists = tokio_test::block_on(rp.query().channel_playlists(&id)).unwrap(); - assert_channel( - &channel_playlists, - id, - name, - unlocalized || name_unlocalized, - ); if has_playlists { + let channel_playlists = tokio_test::block_on(rp.query().channel_playlists(&id)).unwrap(); + assert_channel( + &channel_playlists, + id, + name, + unlocalized || name_unlocalized, + ); assert!( !channel_playlists.content.items.is_empty(), "got no playlists" From e5b8a9a9b083b7afcfa91008b6d93255b5e6fc41 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 29 Jan 2024 01:41:46 +0100 Subject: [PATCH 092/459] fix(tests): update comment count --- tests/youtube.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index e0ed22d..0d9e428 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -664,7 +664,7 @@ fn get_video_details_chapters(rp: RustyPipe) { assert!(details.recommended.visitor_data.is_some()); assert_next(details.recommended, rp.query(), 10, 1); - assert_gte(details.top_comments.count.unwrap(), 3200, "comments"); + assert_gte(details.top_comments.count.unwrap(), 3000, "comments"); assert!(!details.top_comments.is_exhausted()); assert!(!details.latest_comments.is_exhausted()); } From 5275170f9ac024b85468383ad88b56939ca9d3ce Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 29 Jan 2024 17:09:42 +0100 Subject: [PATCH 093/459] fix: a/b test 12: parsing new channel page header --- codegen/src/abtest.rs | 10 + notes/AB_Tests.md | 117 +- src/client/channel.rs | 40 + src/client/response/channel.rs | 168 +- src/client/response/mod.rs | 2 +- ...ap_channel_shorts_20240129_pageheader.snap | 1322 +++ .../channel_shorts_20240129_pageheader.json | 9258 +++++++++++++++++ tests/youtube.rs | 20 +- 8 files changed, 10925 insertions(+), 12 deletions(-) create mode 100644 src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts_20240129_pageheader.snap create mode 100644 testfiles/channel/channel_shorts_20240129_pageheader.json diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index 18676f8..aff36cf 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -9,6 +9,7 @@ use regex::Regex; use rustypipe::client::{ClientType, RustyPipe, RustyPipeQuery, YTContext}; use rustypipe::model::{MusicItem, YouTubeItem}; use rustypipe::param::search_filter::{ItemType, SearchFilter}; +use rustypipe::param::ChannelVideoTab; use serde::de::IgnoredAny; use serde::{Deserialize, Serialize}; @@ -28,6 +29,7 @@ pub enum ABTest { PlaylistsForShorts = 9, ChannelAboutModal = 10, LikeButtonViewmodel = 11, + ChannelPageHeader = 12, } const TESTS_TO_RUN: [ABTest; 3] = [ @@ -102,6 +104,7 @@ pub async fn run_test( ABTest::TrackViewcount => track_viewcount(&query).await, ABTest::ChannelAboutModal => channel_about_modal(&query).await, ABTest::LikeButtonViewmodel => like_button_viewmodel(&query).await, + ABTest::ChannelPageHeader => channel_page_header(&query).await, } .unwrap(); pb.inc(1); @@ -330,3 +333,10 @@ pub async fn like_button_viewmodel(rp: &RustyPipeQuery) -> Result { .await?; Ok(res.contains("\"segmentedLikeDislikeButtonViewModel\"")) } + +pub async fn channel_page_header(rp: &RustyPipeQuery) -> Result { + let channel = rp + .channel_videos_tab("UCh8gHdtzO2tXd593_bjErWg", ChannelVideoTab::Shorts) + .await?; + Ok(channel.mobile_banner.is_empty() && channel.tv_banner.is_empty()) +} diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index 4e06ed3..238a386 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -398,8 +398,8 @@ a short format (_21h ago_, _3d ago_). - **Impact:** 🟡 Medium - **Status:** Experimental (9%) -YouTube added the track playback count to search results and top artist tracks. -In exchange, they removed the "Song" type identifier from search results. +YouTube added the track playback count to search results and top artist tracks. In +exchange, they removed the "Song" type identifier from search results. ![A/B test 8 old screenshot](./_img/ab_8_old.png) @@ -436,7 +436,7 @@ by using the mobile client. But that may change in the future. ![A/B test 10 screenshot](./_img/ab_10.png) -YouTube replaced the *About* channel tab with a modal. This changes the way additional +YouTube replaced the _About_ channel tab with a modal. This changes the way additional channel metadata has to be fetched. The new modal uses a continuation request with a token which can be easily generated. @@ -450,7 +450,7 @@ the main tab. - **Endpoint:** next - **Status:** Experimental (7%) -YouTube introduced an updated date model for the like/dislike buttons. The new model +YouTube introduced an updated data model for the like/dislike buttons. The new model looks needlessly complex but contains the same parsing-relevant data as the old model (accessibility text to get like count). @@ -475,3 +475,112 @@ looks needlessly complex but contains the same parsing-relevant data as the old } } ``` + +## [12] New channel page header + +- **Encountered on:** 29.01.2024 +- **Impact:** 🟢 Low +- **Endpoint:** browse +- **Status:** Experimental (<1%) + +YouTube introduced a new data model for channel headers, based on a +`"pageHeaderRenderer"`. The new model comes with more needless complexity that needs to +be accomodated. There are also no mobile/TV header images available any more. + +```json +{ + "pageHeaderViewModel": { + "title": { + "dynamicTextViewModel": { + "text": { + "content": "Doobydobap", + "attachmentRuns": [ + { + "startIndex": 10, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "clientResource": { + "imageName": "CHECK_CIRCLE_FILLED" + }, + "width": 14, + "height": 14 + } + ] + } + } + } + } + } + ] + } + } + }, + "image": { + "decoratedAvatarViewModel": { + "avatar": { + "avatarViewModel": { + "image": { + "sources": [ + { + "url": "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s72-c-k-c0x00ffffff-no-rj", + "width": 72, + "height": 72 + } + ] + } + } + } + } + }, + "metadata": { + "contentMetadataViewModel": { + "metadataRows": [ + { + "metadataParts": [ + { + "text": { + "content": "@Doobydobap" + } + }, + { + "text": { + "content": "3.74M subscribers" + } + }, + { + "text": { + "content": "345 videos", + "styleRuns": [ + { + "startIndex": 0, + "length": 10 + } + ] + } + } + ] + } + ] + } + }, + "banner": { + "imageBannerViewModel": { + "image": { + "sources": [ + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 1060, + "height": 175 + } + ] + } + } + } + } +} +``` diff --git a/src/client/channel.rs b/src/client/channel.rs index 85ecfb3..aa1a928 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -462,6 +462,8 @@ fn map_channel( }) }), avatar: hdata.map(|hdata| hdata.1.into()).unwrap_or_default(), + // Since the carousel header is only used for YT-internal channels or special events + // (World Cup, Coachella, etc.) we can assume the channel to be verified verification: crate::model::Verification::Verified, description: metadata.description, tags: microformat.microformat_data_renderer.tags, @@ -475,6 +477,43 @@ fn map_channel( content: (), } } + response::channel::Header::PageHeaderRenderer(header) => { + let hdata = header.content.page_header_view_model; + // channel handle - subscriber count - video count + let subscriber_count = hdata + .metadata + .content_metadata_view_model + .metadata_rows + .first() + .and_then(|md| { + md.metadata_parts.get(1).and_then(|t| { + util::parse_large_numstr_or_warn::(&t.text, lang, &mut warnings) + }) + }); + Channel { + id: metadata.external_id, + name: metadata.title, + subscriber_count, + avatar: hdata + .image + .decorated_avatar_view_model + .avatar + .avatar_view_model + .image + .into(), + verification: hdata.title.into(), + description: metadata.description, + tags: microformat.microformat_data_renderer.tags, + vanity_url, + banner: hdata.banner.image_banner_view_model.image.into(), + mobile_banner: Vec::new(), + tv_banner: Vec::new(), + has_shorts: d.has_shorts, + has_live: d.has_live, + visitor_data: d.visitor_data, + content: (), + } + } }, warnings, }) @@ -680,6 +719,7 @@ mod tests { #[case::coachella("videos_20230415_coachella", "UCHF66aWLOxBW4l6VkSrS3cQ")] #[case::shorts("shorts", "UCh8gHdtzO2tXd593_bjErWg")] #[case::livestreams("livestreams", "UC2DjFE7Xf11URZqWBigcVOQ")] + #[case::pageheader("shorts_20240129_pageheader", "UCh8gHdtzO2tXd593_bjErWg")] fn map_channel_videos(#[case] name: &str, #[case] id: &str) { let json_path = path!(*TESTFILES / "channel" / format!("channel_{name}.json")); let json_file = File::open(json_path).unwrap(); diff --git a/src/client/response/channel.rs b/src/client/response/channel.rs index a7d91b7..7b371a4 100644 --- a/src/client/response/channel.rs +++ b/src/client/response/channel.rs @@ -2,8 +2,8 @@ use serde::Deserialize; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError}; use super::{ - video_item::YouTubeListRenderer, Alert, ChannelBadge, ContentsRenderer, ContinuationActionWrap, - ResponseContext, Thumbnails, TwoColumnBrowseResults, + video_item::YouTubeListRenderer, Alert, ChannelBadge, ContentRenderer, ContentsRenderer, + ContinuationActionWrap, ResponseContext, Thumbnails, TwoColumnBrowseResults, }; use crate::serializer::text::{AttributedText, Text, TextComponent}; @@ -71,10 +71,12 @@ pub(crate) struct ChannelTabWebCommandMetadata { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] +#[allow(clippy::enum_variant_names)] pub(crate) enum Header { C4TabbedHeaderRenderer(HeaderRenderer), /// Used for special channels like YouTube Music CarouselHeaderRenderer(ContentsRenderer), + PageHeaderRenderer(ContentRenderer), } #[serde_as] @@ -117,6 +119,149 @@ pub(crate) enum CarouselHeaderRendererItem { None, } +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PageHeaderRenderer { + pub page_header_view_model: PageHeaderRendererInner, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PageHeaderRendererInner { + pub title: PhTitleView, + pub image: PhAvatarView, + pub metadata: PhMetadataView, + pub banner: PhBannerView, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhTitleView { + pub dynamic_text_view_model: PhTitleView2, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhTitleView2 { + pub text: PhTitleView3, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhTitleView3 { + #[serde_as(as = "VecSkipError<_>")] + pub attachment_runs: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AttachmentRun { + pub element: AttachmentRunElement, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AttachmentRunElement { + #[serde(rename = "type")] + pub typ: AttachmentRunElementType, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AttachmentRunElementType { + pub image_type: AttachmentRunElementImageType, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AttachmentRunElementImageType { + pub image: AttachmentRunElementImage, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AttachmentRunElementImage { + #[serde_as(as = "VecSkipError<_>")] + pub sources: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AttachmentRunElementImageSource { + pub client_resource: ClientResource, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ClientResource { + pub image_name: IconName, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub(crate) enum IconName { + CheckCircleFilled, + MusicFilled, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhAvatarView { + pub decorated_avatar_view_model: PhAvatarView2, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhAvatarView2 { + pub avatar: PhAvatarView3, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhAvatarView3 { + pub avatar_view_model: ImageView, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ImageView { + pub image: Thumbnails, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhMetadataView { + pub content_metadata_view_model: PhMetadataView2, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhMetadataView2 { + pub metadata_rows: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhMetadataRow { + pub metadata_parts: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct PhBannerView { + pub image_banner_view_model: ImageView, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct TextWrap { + #[serde_as(deserialize_as = "Text")] + pub text: String, +} + #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Metadata { @@ -214,3 +359,22 @@ pub(crate) struct ExternalLinkInner { #[serde_as(as = "AttributedText")] pub link: TextComponent, } + +impl From for crate::model::Verification { + fn from(value: PhTitleView) -> Self { + value + .dynamic_text_view_model + .text + .attachment_runs + .iter() + .find_map(|r| { + r.element.typ.image_type.image.sources.first().map(|s| { + match s.client_resource.image_name { + IconName::CheckCircleFilled => crate::model::Verification::Verified, + IconName::MusicFilled => crate::model::Verification::Artist, + } + }) + }) + .unwrap_or_default() + } +} diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index 47f0b81..02c4075 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -108,7 +108,7 @@ pub(crate) struct ThumbnailsWrap { #[derive(Default, Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Thumbnails { - #[serde(default)] + #[serde(default, alias = "sources")] pub thumbnails: Vec, } diff --git a/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts_20240129_pageheader.snap b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts_20240129_pageheader.snap new file mode 100644 index 0000000..c3a1f02 --- /dev/null +++ b/src/client/snapshots/rustypipe__client__channel__tests__map_channel_shorts_20240129_pageheader.snap @@ -0,0 +1,1322 @@ +--- +source: src/client/channel.rs +expression: map_res.c +--- +Channel( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + subscriber_count: Some(3740000), + avatar: [ + Thumbnail( + url: "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s72-c-k-c0x00ffffff-no-rj", + width: 72, + height: 72, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s120-c-k-c0x00ffffff-no-rj", + width: 120, + height: 120, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s160-c-k-c0x00ffffff-no-rj", + width: 160, + height: 160, + ), + ], + verification: Verified, + description: "Hi, I’m Tina, aka Doobydobap!\n\nFood is the medium I use to tell stories and connect with people who share the same passion as I do. Whether it’s because you’re hungry at midnight or trying to learn how to cook, I hope you enjoy watching my content and recipes. Don\'t yuck my yum!\n\nwww.doobydobap.com\n", + tags: [], + vanity_url: Some("https://www.youtube.com/@Doobydobap"), + banner: [ + Thumbnail( + url: "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + width: 1060, + height: 175, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + width: 1138, + height: 188, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1707-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + width: 1707, + height: 283, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + width: 2120, + height: 351, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w2276-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + width: 2276, + height: 377, + ), + Thumbnail( + url: "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + width: 2560, + height: 424, + ), + ], + mobile_banner: [], + tv_banner: [], + has_shorts: true, + has_live: false, + visitor_data: None, + content: Paginator( + count: None, + items: [ + VideoItem( + id: "LJAt2RHBhYA", + name: "Rating Korean Traditional Desserts out of 10!!!", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/LJAt2RHBhYA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBs1ulw5vkRkR_SG6pp7Wuy90QK0Q", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(835000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "apL97zDoAY0", + name: "best bang for your buck", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/apL97zDoAY0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDTJ5F-kzUTGBPolJgqloUZWve4GQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(932000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "6au8hFOnUXI", + name: "don\'t judge a book by its cover", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/6au8hFOnUXI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCACe2S2wBTr0KVSFWzGda61k8Epw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1200000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "4wJAOnnPYsI", + name: "I ❤\u{fe0f} feet", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/4wJAOnnPYsI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCwFBUxJXMhuiv1ZevlM6r2x7Wq-Q", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(906000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "DDsWN4HcoWQ", + name: "Trying North Korean Food 🇰🇵 and Rating it out of 10", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/DDsWN4HcoWQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBIBARX0aoleQ1NFxd_DGhhHT4gDg", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1300000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "oMIIEp8JMT0", + name: "get that bag 💰", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/oMIIEp8JMT0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBKsO5-KQzqU-bJinHsPDWrEQBIzQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(409000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "ElEgDnx3Dfk", + name: "My Mom\'s 10-step Korean Skincare Routine", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ElEgDnx3Dfk/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD4uT5fSWvTnjAh_BC6hsW48zoH1w", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1000000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "kNpFjW0VAUQ", + name: "What Koreans eat on New Year\'s", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/kNpFjW0VAUQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBJTK-xhUMSzq8MBJ3s4kSXR7pFlw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(895000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "0_5Y3ZBo5cw", + name: "DOOBYMART", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/0_5Y3ZBo5cw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBlcI8i0DqG2vKRFGDzIQXBEsifFQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(696000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "VyVs3GCQlG0", + name: "I love ogres", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/VyVs3GCQlG0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBsbPYKlWAAZNphAPobZQReZzk-lA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1200000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "_yMEpzXq3yI", + name: "Are you broke?😞📉📉📉", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/_yMEpzXq3yI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCRyJDCY-7MsSYbsl2ZZoC8DxPkKw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(2500000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "sM1jIMnq0M0", + name: "best tteokbokki & dark sketchy alleys", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/sM1jIMnq0M0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCIQyuEFF2m676ZX7UpcK3hVHTzzw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1400000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "nZg_Qoknu_M", + name: "moist.", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/nZg_Qoknu_M/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCcXipLuXAs9D8d1nRJbMh-BZkK1Q", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1200000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "CgS55gL33nY", + name: "Do you have any Korean Friends?", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/CgS55gL33nY/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCVh8B6HRomEnQX6dyDJVbYhE-RGA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1800000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "VOxXkxFNOpM", + name: "take my money", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/VOxXkxFNOpM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAkP1n1_Oe8pBGluy_lyi4I3pO4SQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(5400000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "aZW65r9uUXA", + name: "i\'m a mother?", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/aZW65r9uUXA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDIcJpRgW65hGv0GM8ak-L0PyErUw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1700000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "CnI9or-Ings", + name: "moshi moshi (ASMR)", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/CnI9or-Ings/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDIoImzeIOlO25vkY7j92YwUhAOdw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(780000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "oYAp2v4PxdQ", + name: "perfect procrastination", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/oYAp2v4PxdQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLA3PsooCO5Cot_z-vLFCF1Kdtshtg", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(961000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "1ivqsJSGghU", + name: "THREE CHILI MAPO TOFU (Vegan)", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1ivqsJSGghU/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCk5IRHy8TmJPzE9yD3M_OGXdww_g", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1000000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "s56ctQoFi70", + name: "day 1 leaving seoul", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/s56ctQoFi70/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCfn6oYumOdPd33WlDWaqBUZzaEiw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(835000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "8XHcYgsJJjs", + name: "I love Korea but", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/8XHcYgsJJjs/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAtj-QeOzONDGPzDWC8IdFGigmKYA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3900000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "DXYbvkJEYzw", + name: "demogorgon rice", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/DXYbvkJEYzw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDd33uW_fC4Dz5JqYlDtGWGdMQn8A", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(2100000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "3YGVw8RrB3U", + name: "Rating Everything I Ate at McDonald\'s Singapore 🇸🇬🤡", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/3YGVw8RrB3U/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAV2y-_1JXq9RecS8ELjyUsoN52NA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3100000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "VWh8hm-GlXw", + name: "the magic number: 25", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/VWh8hm-GlXw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1wp7tz9TU3Kx2Oho7mrVoFys8Jw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1300000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "ewpJQHj5jWY", + name: "How we started✨ the garden ✨", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ewpJQHj5jWY/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAOw5ntEtOhIgNJy2y1QQCFLUtGBQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(2300000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "SRnHMGMJ6mM", + name: "How to Shop at Costco ✨economical milf✨", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/SRnHMGMJ6mM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDrwe86eXSemFBKB3xLGnRIDcL_qA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3700000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "bGXP83AU3Mc", + name: "do u wanna get swole?", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/bGXP83AU3Mc/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBLGuAqqpjhQ_Y81P2pxchz-z971g", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(2900000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "E52sSgZlgYs", + name: "the holy trinity of korean street food", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/E52sSgZlgYs/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAZr5j2o2IdpTLXUoSKT5QK-DFJgw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(5500000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "ovaHmfy3O6U", + name: "hangover food", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/ovaHmfy3O6U/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBg-kG4rAi-BQ8Xkp2hOtOu-oXDLQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(16000000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "FHTQmKTZnlI", + name: "pig trotter raguuuuuuuuu 💅", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/FHTQmKTZnlI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBaPmdp59deKec5AiRRJ_c6oWOpuA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1500000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "1AXB0l_wKMs", + name: "what i ate in google japan", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1AXB0l_wKMs/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAwymbQoerZLtr77RuARo1iok4_WQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(4100000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "1ARLtk3HiB0", + name: "succumb to your cravings", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1ARLtk3HiB0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDSjiCiBhM1i7n68LVRv_G5GW5vRw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(7100000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "0FfDoDHpaN8", + name: "you can\'t let the what ifs rule your life", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/0FfDoDHpaN8/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAJK1Av4zHRIWRBMSEfYRXxpwCSlQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(2700000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "kuT90_RIdF0", + name: "duck confit lollipop 🦆🍭", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/kuT90_RIdF0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCt9L5XUhmlkwuxMuupIt4kCnxctA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3200000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "aPJLhrcM4Yg", + name: "HOUSE TOUR", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/aPJLhrcM4Yg/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBCLF6yI6Ke96PIrfo1s5BhYfeWvg", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3600000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "DKQrG_hJJX4", + name: "how to meal prep like a korean", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/DKQrG_hJJX4/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDZTyFRl919wEGdUg95-XrNIH99mg", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(2500000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "lNizW_P_oVw", + name: "Rating Everything I ate at McDonald\'s Japan 🇯🇵", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/lNizW_P_oVw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAAiwuuJufebYj3P4aTo7wyBjh9Kw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(4300000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "kbWyJjrCjwA", + name: "enemies as fertilizer √(veg)", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/kbWyJjrCjwA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCItmfFh3UD53WvNCWd9HAItdubgg", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(4200000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "xAp910JTDig", + name: "let\'s make some cabbage rolls for lunch", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/xAp910JTDig/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD0jor2XgDSjgk4IdMhCOGNqv0Vag", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3500000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "vSL7dhKatEk", + name: "Rating Everything I ate at IKEA Korea", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/vSL7dhKatEk/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1jtkvWyabnlTD7ktUQCWYvKctFQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(11000000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "LZzhUpACXSk", + name: "I\'m done being the bigger person", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/LZzhUpACXSk/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBKpbXJ3fj1mWw8YLEGgqqQJFPapw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(3400000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "5C7nqNDfhis", + name: "we\'re cooking a whole bird today", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/5C7nqNDfhis/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAywBcN0oFzKJrq2jxAcYU8Gz5mQQ", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(5300000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "6mj4Af0kUOQ", + name: "men will disappoint but never potatoes", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/6mj4Af0kUOQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLB3pIz2cfevgV0ccu3bQM4IDaBSKg", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1800000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "1c3axhSJiaQ", + name: "I used to hate korean food", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/1c3axhSJiaQ/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBucOEbTsWTDjOOCjNa-fAvz1yxyA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(4800000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "F9Vz0m7DPeU", + name: "Rating everything I got at 7/11 Hawaii ( ft. Mauna Kea )", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/F9Vz0m7DPeU/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1w_8DhU37Mv_R3tQ9Kb6ouIU_VA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1900000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "Uey7kl56wks", + name: "Grabbing Snacks from 7/11 Hawaii", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/Uey7kl56wks/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCybGwQAf9s43HoSQJGvWlOmmLPgw", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1100000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "3un2eUAr6Dg", + name: "cheesy korean corn balls hit different", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/3un2eUAr6Dg/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC9I2IQJx0hUPF9mcw4lvs1I6Bj4A", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1900000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + VideoItem( + id: "rI5tWrGpDJA", + name: "hawaiian tajin?!?", + length: None, + thumbnail: [ + Thumbnail( + url: "https://i.ytimg.com/vi/rI5tWrGpDJA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCkg-RG2ToW-gXsSdYwO57sis0DkA", + width: 405, + height: 720, + ), + ], + channel: Some(ChannelTag( + id: "UCh8gHdtzO2tXd593_bjErWg", + name: "Doobydobap", + avatar: [], + verification: Verified, + subscriber_count: Some(3740000), + )), + publish_date: "[date]", + publish_date_txt: None, + view_count: Some(1600000), + is_live: false, + is_short: true, + is_upcoming: false, + short_description: None, + ), + ], + ctoken: Some("4qmFsgL3ARIYVUNoOGdIZHR6TzJ0WGQ1OTNfYmpFcldnGtoBOGdhZEFScWFBVktYQVFxU0FRcHFRME00VVVGU2IyNXZaMWxyUTJob1ZsRXlaelJhTUdoclpFaHdVRTF1VWxsYVJGVTFUVEU1YVdGclZubFdNbU5SUVZKdlEwTkJRV2xCWjJkQlNXaEZTMFI2UlRaTlZHTjNUbXBWZVU5VWEzaE9hbEY0VGtOdlRrTm5kSGxUVkZZd1ZqTktTR05GVWt0UlVSSWtOamRpWVRVd016UXRNREF3TUMweVpEQmpMVGc0TnpndE1UUXlNak5pWWpoaU9HUmhHQUUlM0Q%3D"), + endpoint: browse, + ), +) diff --git a/testfiles/channel/channel_shorts_20240129_pageheader.json b/testfiles/channel/channel_shorts_20240129_pageheader.json new file mode 100644 index 0000000..77a233c --- /dev/null +++ b/testfiles/channel/channel_shorts_20240129_pageheader.json @@ -0,0 +1,9258 @@ +{ + "responseContext": { + "serviceTrackingParams": [ + { + "service": "GFEEDBACK", + "params": [ + { + "key": "route", + "value": "channel.shorts" + }, + { + "key": "is_casual", + "value": "false" + }, + { + "key": "is_owner", + "value": "false" + }, + { + "key": "is_alc_surface", + "value": "false" + }, + { + "key": "browse_id", + "value": "UCh8gHdtzO2tXd593_bjErWg" + }, + { + "key": "browse_id_prefix", + "value": "" + }, + { + "key": "logged_in", + "value": "0" + }, + { + "key": "e", + "value": "23804281,23858057,23946420,23966208,23983296,23986029,23998056,24004644,24007246,24034168,24036947,24058862,24077241,24080738,24120819,24135310,24140247,24166867,24181174,24187377,24241378,24255543,24255545,24288664,24290971,24367580,24377598,24377909,24382552,24385728,24387949,24390675,24428788,24428941,24428945,24439361,24445497,24451319,24452041,24453989,24458317,24458324,24458329,24459436,24468724,24485421,24506515,24506784,24515423,24524098,24526644,24526774,24526787,24526794,24526801,24526804,24526815,24526825,24528552,24528557,24528575,24528584,24528644,24528651,24528661,24528668,24531225,24531254,24537200,24539025,24542367,24542452,24546060,24546075,24547317,24548627,24548629,24550458,24559328,24559698,24560416,24566687,24694842,24697068,24698452,24699899,39324567,39325337,39325345,39325402,39325424,39325431,39325617,51003636,51004018,51006181,51007117,51009781,51010235,51012165,51012659,51014091,51016856,51017346,51019626,51020570,51021953,51025415,51026715,51027870,51028271,51028853,51028870,51028883,51028895,51028902,51028911,51028922,51028986,51028993,51029412,51030103,51031341,51033399,51037346,51037349,51037540,51037819,51037893,51038498,51038805,51039200,51040540,51041497,51045885,51045889,51047539,51048240,51048489,51049006,51050361,51053689,51055130,51056364,51057501,51057746,51057842,51057851,51059571,51060353,51061001,51061018,51062131,51063125,51063140,51063149,51063154,51063643,51065651,51069269,51070732,51072748,51073969,51074109,51074183,51074717,51074722,51074739,51075084,51075837,51078536,51079299,51079353,51080341,51080396,51080469,51080511,51080532,51080715,51083238,51083585,51083748,51084267,51084279,51084290,51086327,51086857,51087987,51088558,51088826,51089441,51089858,51089956,51091331,51091643,51092258,51092559,51092929,51092953,51094173,51094195,51094202,51094209,51094774,51095273,51096389,51096576,51096647,51096961,51097257,51098297,51098299,51100119,51101454,51102758,51102966,51103434,51103884,51105868,51106625,51106957,51107333,51107340,51108006" + } + ] + }, + { + "service": "GOOGLE_HELP", + "params": [ + { + "key": "browse_id", + "value": "UCh8gHdtzO2tXd593_bjErWg" + }, + { + "key": "browse_id_prefix", + "value": "" + } + ] + }, + { + "service": "CSI", + "params": [ + { + "key": "c", + "value": "WEB" + }, + { + "key": "cver", + "value": "2.20240123.06.00" + }, + { + "key": "yt_li", + "value": "0" + }, + { + "key": "GetChannelPage_rid", + "value": "0x278124dd629ee3fb" + } + ] + }, + { + "service": "GUIDED_HELP", + "params": [ + { + "key": "logged_in", + "value": "0" + } + ] + }, + { + "service": "ECATCHER", + "params": [ + { + "key": "client.version", + "value": "2.20240123" + }, + { + "key": "client.name", + "value": "WEB" + }, + { + "key": "client.fexp", + "value": "51028902,24694842,24528584,51094774,51021953,51016856,51091331,51057501,51028870,24542367,51050361,51048240,51063125,51039200,24559328,51062131,24526815,51045889,51108006,24428945,51084290,24526794,51028993,51009781,24699899,51089956,51097257,23998056,51103884,51086857,51059571,51038498,51092559,51098297,51040540,51033399,24377909,51056364,24255543,51028986,24451319,24058862,51037346,24445497,24036947,24524098,24007246,51053689,51074109,51101454,51028922,51037893,51088826,51010235,24548629,51079353,24459436,24528575,24077241,51070732,51080532,51075837,24367580,24528661,24528668,51041497,24187377,24550458,51092953,51037349,24458329,24166867,51096576,24542452,51060353,51028883,24290971,51096389,24560416,24004644,51091643,51084279,24377598,24382552,51074722,51061001,51080396,24559698,51057851,51105868,24528552,24697068,51027870,51080511,51006181,24506784,24241378,51074183,24255545,51106957,24181174,51014091,51045885,24428941,51100119,51007117,51074717,24526804,51088558,51102758,51094202,24566687,51075084,51049006,51047539,51094195,39325345,51012165,51020570,24468724,24547317,51080469,24034168,51074739,51025415,24288664,23946420,51003636,51065651,51083748,51103434,24531225,51012659,51083238,39325402,24080738,24135310,24515423,24528644,51078536,24526825,24531254,51048489,51028853,39325337,51028271,51004018,51094173,24528651,51089441,24452041,39325424,51057842,51084267,23966208,51063149,51095273,24140247,51106625,51028911,51092929,39325431,24428788,24526774,51096961,51017346,24528557,51107333,24526644,24546075,51096647,51069269,51063154,51086327,39324567,51038805,51107340,51079299,24506515,51055130,51061018,51063643,24485421,23983296,51031341,24453989,24385728,51026715,51080715,24120819,39325617,51080341,51037540,24526787,23804281,51083585,23986029,51102966,24698452,24458317,24458324,24546060,51087987,51029412,51094209,51072748,24537200,51092258,51057746,24390675,51037819,23858057,51089858,51073969,51030103,51028895,24439361,24548627,51019626,24387949,24539025,51098299,24526801,51063140" + } + ] + } + ], + "maxAgeSeconds": 300, + "consistencyTokenJar": { + "encryptedTokenJarContents": "AKreu9s8owT89em-3ethzwqMVjwqaIqjLOicmTwi0hsCshRV5GmV-zx9TD6j89e9m0RM0Pm3HARQHzKBsHvRhm3EfVz1rD4TNOHYYL20gU13xMSNtgyiklM", + "expirationSeconds": "600" + }, + "mainAppWebResponseContext": { + "loggedOut": true, + "trackingParam": "kx_fmPxhoPZRDo-znf17_kZsz8yOri2Unky2n8mXUJJ6v_wRgkuswmIBwOcCE59TDtslLKPQ-SS" + }, + "webResponseContextExtensionData": { + "hasDecorated": true + } + }, + "contents": { + "twoColumnBrowseResultsRenderer": { + "tabs": [ + { + "tabRenderer": { + "endpoint": { + "clickTrackingParams": "CLcBEPCTARgFIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/featured", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "EghmZWF0dXJlZPIGBAoCMgA%3D", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "title": "Home", + "trackingParams": "CLcBEPCTARgFIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "tabRenderer": { + "endpoint": { + "clickTrackingParams": "CLYBEPCTARgGIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/videos", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "EgZ2aWRlb3PyBgQKAjoA", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "title": "Videos", + "trackingParams": "CLYBEPCTARgGIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "tabRenderer": { + "endpoint": { + "clickTrackingParams": "CB8Q8JMBGAciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/shorts", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "EgZzaG9ydHPyBgUKA5oBAA%3D%3D", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "title": "Shorts", + "selected": true, + "content": { + "richGridRenderer": { + "contents": [ + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "LJAt2RHBhYA", + "headline": { + "simpleText": "Rating Korean Traditional Desserts out of 10!!!" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/LJAt2RHBhYA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBs1ulw5vkRkR_SG6pp7Wuy90QK0Q", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "835K views" + } + }, + "simpleText": "835K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLQBEIf2BBgAIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/LJAt2RHBhYA", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "LJAt2RHBhYA", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jsb0DhGNuu2T3mpX9WQ_aUI", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/LJAt2RHBhYA/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CLUBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAAQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtMSkF0MlJIQmhZQSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLQBEIf2BBgAIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "LJAt2RHBhYA" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CLQBEIf2BBgAIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CLQBEIf2BBgAIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CLQBEIf2BBgAIhMIlt3cq8eChAMVBelCBR0MLQx5QICLho6Ru4vILA==", + "accessibility": { + "accessibilityData": { + "label": "Rating Korean Traditional Desserts out of 10!!! - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CLQBEIf2BBgAIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CLMBEJmNBRgAIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "apL97zDoAY0", + "headline": { + "simpleText": "best bang for your buck" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/apL97zDoAY0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDTJ5F-kzUTGBPolJgqloUZWve4GQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "932K views" + } + }, + "simpleText": "932K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEBEIf2BBgBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/apL97zDoAY0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "apL97zDoAY0", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jt-kiJXf32s0w8fRESuotn2", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/apL97zDoAY0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CLIBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAEQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgthcEw5N3pEb0FZMCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CLEBEIf2BBgBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "apL97zDoAY0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CLEBEIf2BBgBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CLEBEIf2BBgBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CLEBEIf2BBgBIhMIlt3cq8eChAMVBelCBR0MLQx5QI2DoIfzvb_Jag==", + "accessibility": { + "accessibilityData": { + "label": "best bang for your buck - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CLEBEIf2BBgBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CLABEJmNBRgBIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "6au8hFOnUXI", + "headline": { + "simpleText": "don't judge a book by its cover" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/6au8hFOnUXI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCACe2S2wBTr0KVSFWzGda61k8Epw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.2 million views" + } + }, + "simpleText": "1.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK4BEIf2BBgCIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/6au8hFOnUXI", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "6au8hFOnUXI", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtavC8UEjNQRawsMt-pL-0u", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/6au8hFOnUXI/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CK8BELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAIQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgs2YXU4aEZPblVYSSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CK4BEIf2BBgCIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "6au8hFOnUXI" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CK4BEIf2BBgCIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CK4BEIf2BBgCIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CK4BEIf2BBgCIhMIlt3cq8eChAMVBelCBR0MLQx5QPKinZ3FkO_V6QE=", + "accessibility": { + "accessibilityData": { + "label": "don't judge a book by its cover - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CK4BEIf2BBgCIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CK0BEJmNBRgCIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "4wJAOnnPYsI", + "headline": { + "simpleText": "I ❤️ feet" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/4wJAOnnPYsI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCwFBUxJXMhuiv1ZevlM6r2x7Wq-Q", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "906K views" + } + }, + "simpleText": "906K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsBEIf2BBgDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/4wJAOnnPYsI", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "4wJAOnnPYsI", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jv_NfrSdgDXTvBoASjHAQqJ", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/4wJAOnnPYsI/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CKwBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAMQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgs0d0pBT25uUFlzSSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKsBEIf2BBgDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "4wJAOnnPYsI" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CKsBEIf2BBgDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CKsBEIf2BBgDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CKsBEIf2BBgDIhMIlt3cq8eChAMVBelCBR0MLQx5QMLFvc6nh5CB4wE=", + "accessibility": { + "accessibilityData": { + "label": "I ❤️ feet - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CKsBEIf2BBgDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CKoBEJmNBRgDIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "DDsWN4HcoWQ", + "headline": { + "simpleText": "Trying North Korean Food 🇰🇵 and Rating it out of 10" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DDsWN4HcoWQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBIBARX0aoleQ1NFxd_DGhhHT4gDg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.3 million views" + } + }, + "simpleText": "1.3M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgBEIf2BBgEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/DDsWN4HcoWQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "DDsWN4HcoWQ", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jshlNx0DvuNZwu6rVxz-8m6", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DDsWN4HcoWQ/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CKkBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAQQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtERHNXTjRIY29XUSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKgBEIf2BBgEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "DDsWN4HcoWQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CKgBEIf2BBgEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CKgBEIf2BBgEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CKgBEIf2BBgEIhMIlt3cq8eChAMVBelCBR0MLQx5QOTC8o74xsWdDA==", + "accessibility": { + "accessibilityData": { + "label": "Trying North Korean Food 🇰🇵 and Rating it out of 10 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CKgBEIf2BBgEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CKcBEJmNBRgEIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "oMIIEp8JMT0", + "headline": { + "simpleText": "get that bag 💰" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/oMIIEp8JMT0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBKsO5-KQzqU-bJinHsPDWrEQBIzQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "409K views" + } + }, + "simpleText": "409K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKUBEIf2BBgFIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/oMIIEp8JMT0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "oMIIEp8JMT0", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jv67GRuEncb-lyLAaQjpr-g", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/oMIIEp8JMT0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CKYBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAUQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtvTUlJRXA4Sk1UMCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKUBEIf2BBgFIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "oMIIEp8JMT0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CKUBEIf2BBgFIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CKUBEIf2BBgFIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CKUBEIf2BBgFIhMIlt3cq8eChAMVBelCBR0MLQx5QL3ipPipgoLhoAE=", + "accessibility": { + "accessibilityData": { + "label": "get that bag 💰 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CKUBEIf2BBgFIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CKQBEJmNBRgFIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "ElEgDnx3Dfk", + "headline": { + "simpleText": "My Mom's 10-step Korean Skincare Routine" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ElEgDnx3Dfk/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD4uT5fSWvTnjAh_BC6hsW48zoH1w", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1 million views" + } + }, + "simpleText": "1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIBEIf2BBgGIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/ElEgDnx3Dfk", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "ElEgDnx3Dfk", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-js-EUblC8jQraXG-cFv5hy2", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ElEgDnx3Dfk/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CKMBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAYQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtFbEVnRG54M0RmayoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CKIBEIf2BBgGIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "ElEgDnx3Dfk" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CKIBEIf2BBgGIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CKIBEIf2BBgGIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CKIBEIf2BBgGIhMIlt3cq8eChAMVBelCBR0MLQx5QPmb3OPngcioEg==", + "accessibility": { + "accessibilityData": { + "label": "My Mom's 10-step Korean Skincare Routine - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CKIBEIf2BBgGIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CKEBEJmNBRgGIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "kNpFjW0VAUQ", + "headline": { + "simpleText": "What Koreans eat on New Year's" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kNpFjW0VAUQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBJTK-xhUMSzq8MBJ3s4kSXR7pFlw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "895K views" + } + }, + "simpleText": "895K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8BEIf2BBgHIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/kNpFjW0VAUQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "kNpFjW0VAUQ", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jviZw66RVStxmBixPpfqxTL", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kNpFjW0VAUQ/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CKABELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAcQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtrTnBGalcwVkFVUSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJ8BEIf2BBgHIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "kNpFjW0VAUQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CJ8BEIf2BBgHIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CJ8BEIf2BBgHIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CJ8BEIf2BBgHIhMIlt3cq8eChAMVBelCBR0MLQx5QMSC1OjWsZHtkAE=", + "accessibility": { + "accessibilityData": { + "label": "What Koreans eat on New Year's - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CJ8BEIf2BBgHIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CJ4BEJmNBRgHIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "0_5Y3ZBo5cw", + "headline": { + "simpleText": "DOOBYMART" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0_5Y3ZBo5cw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBlcI8i0DqG2vKRFGDzIQXBEsifFQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "696K views" + } + }, + "simpleText": "696K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwBEIf2BBgIIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/0_5Y3ZBo5cw", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "0_5Y3ZBo5cw", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juEzx0RMcUB6RlAv5F7GZD2", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0_5Y3ZBo5cw/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CJ0BELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAgQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgswXzVZM1pCbzVjdyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJwBEIf2BBgIIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "0_5Y3ZBo5cw" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CJwBEIf2BBgIIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CJwBEIf2BBgIIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CJwBEIf2BBgIIhMIlt3cq8eChAMVBelCBR0MLQx5QMzLo4PZm5b_0wE=", + "accessibility": { + "accessibilityData": { + "label": "DOOBYMART - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CJwBEIf2BBgIIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CJsBEJmNBRgIIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "VyVs3GCQlG0", + "headline": { + "simpleText": "I love ogres" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VyVs3GCQlG0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBsbPYKlWAAZNphAPobZQReZzk-lA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.2 million views" + } + }, + "simpleText": "1.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkBEIf2BBgJIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/VyVs3GCQlG0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "VyVs3GCQlG0", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-js2iBcPpnw1b7GTNeIme3ZA", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VyVs3GCQlG0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CJoBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAkQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtWeVZzM0dDUWxHMCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJkBEIf2BBgJIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "VyVs3GCQlG0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CJkBEIf2BBgJIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CJkBEIf2BBgJIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CJkBEIf2BBgJIhMIlt3cq8eChAMVBelCBR0MLQx5QO2owoTGm9uSVw==", + "accessibility": { + "accessibilityData": { + "label": "I love ogres - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CJkBEIf2BBgJIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CJgBEJmNBRgJIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "_yMEpzXq3yI", + "headline": { + "simpleText": "Are you broke?😞📉📉📉" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_yMEpzXq3yI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCRyJDCY-7MsSYbsl2ZZoC8DxPkKw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.5 million views" + } + }, + "simpleText": "2.5M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJYBEIf2BBgKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/_yMEpzXq3yI", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "_yMEpzXq3yI", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvD3wwgHGhLcIPRGv-p6N4k", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/_yMEpzXq3yI/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CJcBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAoQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtfeU1FcHpYcTN5SSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJYBEIf2BBgKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "_yMEpzXq3yI" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CJYBEIf2BBgKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CJYBEIf2BBgKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CJYBEIf2BBgKIhMIlt3cq8eChAMVBelCBR0MLQx5QKK-q6_zlMGR_wE=", + "accessibility": { + "accessibilityData": { + "label": "Are you broke?😞📉📉📉 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CJYBEIf2BBgKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CJUBEJmNBRgKIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "sM1jIMnq0M0", + "headline": { + "simpleText": "best tteokbokki & dark sketchy alleys" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/sM1jIMnq0M0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCIQyuEFF2m676ZX7UpcK3hVHTzzw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.4 million views" + } + }, + "simpleText": "1.4M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJMBEIf2BBgLIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/sM1jIMnq0M0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "sM1jIMnq0M0", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-ju97x8oqkGLs_HKq_3zM9I6", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/sM1jIMnq0M0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CJQBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAsQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtzTTFqSU1ucTBNMCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJMBEIf2BBgLIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "sM1jIMnq0M0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CJMBEIf2BBgLIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CJMBEIf2BBgLIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CJMBEIf2BBgLIhMIlt3cq8eChAMVBelCBR0MLQx5QM2hq8-M5NjmsAE=", + "accessibility": { + "accessibilityData": { + "label": "best tteokbokki & dark sketchy alleys - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CJMBEIf2BBgLIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CJIBEJmNBRgLIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "nZg_Qoknu_M", + "headline": { + "simpleText": "moist." + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/nZg_Qoknu_M/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCcXipLuXAs9D8d1nRJbMh-BZkK1Q", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.2 million views" + } + }, + "simpleText": "1.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJABEIf2BBgMIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/nZg_Qoknu_M", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "nZg_Qoknu_M", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtSy9viuchVFbQdafwEckr4", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/nZg_Qoknu_M/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CJEBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCAwQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtuWmdfUW9rbnVfTSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CJABEIf2BBgMIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "nZg_Qoknu_M" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CJABEIf2BBgMIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CJABEIf2BBgMIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CJABEIf2BBgMIhMIlt3cq8eChAMVBelCBR0MLQx5QPP3nsmo6I_MnQE=", + "accessibility": { + "accessibilityData": { + "label": "moist. - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CJABEIf2BBgMIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CI8BEJmNBRgMIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "CgS55gL33nY", + "headline": { + "simpleText": "Do you have any Korean Friends?" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CgS55gL33nY/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCVh8B6HRomEnQX6dyDJVbYhE-RGA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.8 million views" + } + }, + "simpleText": "1.8M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0BEIf2BBgNIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/CgS55gL33nY", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "CgS55gL33nY", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtxzEeIeUPfHomCeaSX2Rua", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CgS55gL33nY/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CI4BELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCA0QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtDZ1M1NWdMMzNuWSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CI0BEIf2BBgNIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "CgS55gL33nY" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CI0BEIf2BBgNIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CI0BEIf2BBgNIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CI0BEIf2BBgNIhMIlt3cq8eChAMVBelCBR0MLQx5QPa835fgvK6CCg==", + "accessibility": { + "accessibilityData": { + "label": "Do you have any Korean Friends? - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CI0BEIf2BBgNIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CIwBEJmNBRgNIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "VOxXkxFNOpM", + "headline": { + "simpleText": "take my money" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VOxXkxFNOpM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAkP1n1_Oe8pBGluy_lyi4I3pO4SQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "5.4 million views" + } + }, + "simpleText": "5.4M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoBEIf2BBgOIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/VOxXkxFNOpM", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "VOxXkxFNOpM", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juas9zQZJYH6YudRMDbVqBr", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VOxXkxFNOpM/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CIsBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCA4QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtWT3hYa3hGTk9wTSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIoBEIf2BBgOIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "VOxXkxFNOpM" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CIoBEIf2BBgOIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CIoBEIf2BBgOIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CIoBEIf2BBgOIhMIlt3cq8eChAMVBelCBR0MLQx5QJP1tIqx8pX2VA==", + "accessibility": { + "accessibilityData": { + "label": "take my money - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CIoBEIf2BBgOIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CIkBEJmNBRgOIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "aZW65r9uUXA", + "headline": { + "simpleText": "i'm a mother?" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aZW65r9uUXA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDIcJpRgW65hGv0GM8ak-L0PyErUw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.7 million views" + } + }, + "simpleText": "1.7M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIcBEIf2BBgPIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/aZW65r9uUXA", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "aZW65r9uUXA", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtyxqS8I9TfVP7iKs-pjN_T", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aZW65r9uUXA/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CIgBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCA8QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgthWlc2NXI5dVVYQSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIcBEIf2BBgPIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "aZW65r9uUXA" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CIcBEIf2BBgPIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CIcBEIf2BBgPIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CIcBEIf2BBgPIhMIlt3cq8eChAMVBelCBR0MLQx5QPCiufvr3O7KaQ==", + "accessibility": { + "accessibilityData": { + "label": "i'm a mother? - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CIcBEIf2BBgPIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CIYBEJmNBRgPIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "CnI9or-Ings", + "headline": { + "simpleText": "moshi moshi (ASMR)" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CnI9or-Ings/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDIoImzeIOlO25vkY7j92YwUhAOdw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "780K views" + } + }, + "simpleText": "780K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIQBEIf2BBgQIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/CnI9or-Ings", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "CnI9or-Ings", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvuU7oBIflblTV4CO0YzBD2", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/CnI9or-Ings/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CIUBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBAQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtDbkk5b3ItSW5ncyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIQBEIf2BBgQIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "CnI9or-Ings" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CIQBEIf2BBgQIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CIQBEIf2BBgQIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CIQBEIf2BBgQIhMIlt3cq8eChAMVBelCBR0MLQx5QIu8ovyrtI-5Cg==", + "accessibility": { + "accessibilityData": { + "label": "moshi moshi (ASMR) - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CIQBEIf2BBgQIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CIMBEJmNBRgQIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "oYAp2v4PxdQ", + "headline": { + "simpleText": "perfect procrastination" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/oYAp2v4PxdQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLA3PsooCO5Cot_z-vLFCF1Kdtshtg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "961K views" + } + }, + "simpleText": "961K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIEBEIf2BBgRIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/oYAp2v4PxdQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "oYAp2v4PxdQ", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juu7p7u0p-LBz0Ps78DQooe", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/oYAp2v4PxdQ/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CIIBELC1BCITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBEQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtvWUFwMnY0UHhkUSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CIEBEIf2BBgRIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "oYAp2v4PxdQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CIEBEIf2BBgRIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CIEBEIf2BBgRIhMIlt3cq8eChAMVBelCBR0MLQx5", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CIEBEIf2BBgRIhMIlt3cq8eChAMVBelCBR0MLQx5QNSLv_Cvu4rAoQE=", + "accessibility": { + "accessibilityData": { + "label": "perfect procrastination - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CIEBEIf2BBgRIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CIABEJmNBRgRIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "1ivqsJSGghU", + "headline": { + "simpleText": "THREE CHILI MAPO TOFU (Vegan)" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1ivqsJSGghU/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCk5IRHy8TmJPzE9yD3M_OGXdww_g", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1 million views" + } + }, + "simpleText": "1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CH4Qh_YEGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/1ivqsJSGghU", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "1ivqsJSGghU", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvoQtIJuyxzy8P93KX7U7bp", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1ivqsJSGghU/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CH8QsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBIQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgsxaXZxc0pTR2doVSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CH4Qh_YEGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "1ivqsJSGghU" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CH4Qh_YEGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CH4Qh_YEGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CH4Qh_YEGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHlAlYSapInW-pXWAQ==", + "accessibility": { + "accessibilityData": { + "label": "THREE CHILI MAPO TOFU (Vegan) - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CH4Qh_YEGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CH0QmY0FGBIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "s56ctQoFi70", + "headline": { + "simpleText": "day 1 leaving seoul" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/s56ctQoFi70/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCfn6oYumOdPd33WlDWaqBUZzaEiw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "835K views" + } + }, + "simpleText": "835K views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHsQh_YEGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/s56ctQoFi70", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "s56ctQoFi70", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvSYEUosSeEcWJmmug4uclZ", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/s56ctQoFi70/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CHwQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBMQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtzNTZjdFFvRmk3MCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHsQh_YEGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "s56ctQoFi70" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CHsQh_YEGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CHsQh_YEGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CHsQh_YEGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHlAvZeW0NCWp8-zAQ==", + "accessibility": { + "accessibilityData": { + "label": "day 1 leaving seoul - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CHsQh_YEGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CHoQmY0FGBMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "8XHcYgsJJjs", + "headline": { + "simpleText": "I love Korea but" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8XHcYgsJJjs/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAtj-QeOzONDGPzDWC8IdFGigmKYA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.9 million views" + } + }, + "simpleText": "3.9M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHgQh_YEGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/8XHcYgsJJjs", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "8XHcYgsJJjs", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-ju-Piua9GTx99QOKSLwjEbL", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/8XHcYgsJJjs/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CHkQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBQQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgs4WEhjWWdzSkpqcyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHgQh_YEGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "8XHcYgsJJjs" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CHgQh_YEGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CHgQh_YEGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CHgQh_YEGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHlAu8yk2KCM97jxAQ==", + "accessibility": { + "accessibilityData": { + "label": "I love Korea but - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CHgQh_YEGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CHcQmY0FGBQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "DXYbvkJEYzw", + "headline": { + "simpleText": "demogorgon rice" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DXYbvkJEYzw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDd33uW_fC4Dz5JqYlDtGWGdMQn8A", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.1 million views" + } + }, + "simpleText": "2.1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHUQh_YEGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/DXYbvkJEYzw", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "DXYbvkJEYzw", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-ju44FooSZpI6I0zMZAJk1XN", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DXYbvkJEYzw/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CHYQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBUQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtEWFlidmtKRVl6dyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHUQh_YEGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "DXYbvkJEYzw" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CHUQh_YEGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CHUQh_YEGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CHUQh_YEGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHlAvMaRkuT3hrsN", + "accessibility": { + "accessibilityData": { + "label": "demogorgon rice - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CHUQh_YEGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CHQQmY0FGBUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "3YGVw8RrB3U", + "headline": { + "simpleText": "Rating Everything I Ate at McDonald's Singapore 🇸🇬🤡" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/3YGVw8RrB3U/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAV2y-_1JXq9RecS8ELjyUsoN52NA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.1 million views" + } + }, + "simpleText": "3.1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHIQh_YEGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/3YGVw8RrB3U", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "3YGVw8RrB3U", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtVil8UtTs_vpaNIk5GRbDJ", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/3YGVw8RrB3U/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CHMQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBYQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgszWUdWdzhSckIzVSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CHIQh_YEGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "3YGVw8RrB3U" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CHIQh_YEGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CHIQh_YEGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CHIQh_YEGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHlA9Y6so7y45cDdAQ==", + "accessibility": { + "accessibilityData": { + "label": "Rating Everything I Ate at McDonald's Singapore 🇸🇬🤡 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CHIQh_YEGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CHEQmY0FGBYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "VWh8hm-GlXw", + "headline": { + "simpleText": "the magic number: 25" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VWh8hm-GlXw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1wp7tz9TU3Kx2Oho7mrVoFys8Jw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.3 million views" + } + }, + "simpleText": "1.3M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CG8Qh_YEGBciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/VWh8hm-GlXw", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "VWh8hm-GlXw", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jumGPPnKALwZJhyEXz17k79", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/VWh8hm-GlXw/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CHAQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBcQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtWV2g4aG0tR2xYdyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CG8Qh_YEGBciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "VWh8hm-GlXw" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CG8Qh_YEGBciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CG8Qh_YEGBciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CG8Qh_YEGBciEwiW3dyrx4KEAxUF6UIFHQwtDHlA_Kqa_OaQn7RV", + "accessibility": { + "accessibilityData": { + "label": "the magic number: 25 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CG8Qh_YEGBciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CG4QmY0FGBciEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "ewpJQHj5jWY", + "headline": { + "simpleText": "How we started✨ the garden ✨" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ewpJQHj5jWY/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAOw5ntEtOhIgNJy2y1QQCFLUtGBQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.3 million views" + } + }, + "simpleText": "2.3M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGwQh_YEGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/ewpJQHj5jWY", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "ewpJQHj5jWY", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvgInuS9J4_6Yl9VUrFZsoj", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ewpJQHj5jWY/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CG0QsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBgQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtld3BKUUhqNWpXWSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGwQh_YEGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "ewpJQHj5jWY" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CGwQh_YEGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CGwQh_YEGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CGwQh_YEGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHlA5prmx4eokoV7", + "accessibility": { + "accessibilityData": { + "label": "How we started✨ the garden ✨ - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CGwQh_YEGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CGsQmY0FGBgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "SRnHMGMJ6mM", + "headline": { + "simpleText": "How to Shop at Costco ✨economical milf✨" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/SRnHMGMJ6mM/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDrwe86eXSemFBKB3xLGnRIDcL_qA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.7 million views" + } + }, + "simpleText": "3.7M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGkQh_YEGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/SRnHMGMJ6mM", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "SRnHMGMJ6mM", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jt3KPYHUAnTSZYl_qrJoMLf", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/SRnHMGMJ6mM/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CGoQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBkQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtTUm5ITUdNSjZtTSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGkQh_YEGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "SRnHMGMJ6mM" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CGkQh_YEGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CGkQh_YEGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CGkQh_YEGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHlA49SnmIbm8YxJ", + "accessibility": { + "accessibilityData": { + "label": "How to Shop at Costco ✨economical milf✨ - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CGkQh_YEGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CGgQmY0FGBkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "bGXP83AU3Mc", + "headline": { + "simpleText": "do u wanna get swole?" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/bGXP83AU3Mc/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBLGuAqqpjhQ_Y81P2pxchz-z971g", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.9 million views" + } + }, + "simpleText": "2.9M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGYQh_YEGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/bGXP83AU3Mc", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "bGXP83AU3Mc", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jsEPf8CWZEueK1skwnK_6ui", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/bGXP83AU3Mc/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CGcQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBoQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtiR1hQODNBVTNNYyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGYQh_YEGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "bGXP83AU3Mc" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CGYQh_YEGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CGYQh_YEGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CGYQh_YEGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHlAx7nTgLf-87Js", + "accessibility": { + "accessibilityData": { + "label": "do u wanna get swole? - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CGYQh_YEGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CGUQmY0FGBoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "E52sSgZlgYs", + "headline": { + "simpleText": "the holy trinity of korean street food" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/E52sSgZlgYs/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAZr5j2o2IdpTLXUoSKT5QK-DFJgw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "5.5 million views" + } + }, + "simpleText": "5.5M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGMQh_YEGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/E52sSgZlgYs", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "E52sSgZlgYs", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jt67N6boi8bqSO-JuQ-0KSg", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/E52sSgZlgYs/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CGQQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBsQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtFNTJzU2dabGdZcyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGMQh_YEGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "E52sSgZlgYs" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CGMQh_YEGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CGMQh_YEGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CGMQh_YEGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHlAi4OWs6CJ684T", + "accessibility": { + "accessibilityData": { + "label": "the holy trinity of korean street food - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CGMQh_YEGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CGIQmY0FGBsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "ovaHmfy3O6U", + "headline": { + "simpleText": "hangover food" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ovaHmfy3O6U/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBg-kG4rAi-BQ8Xkp2hOtOu-oXDLQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "16 million views" + } + }, + "simpleText": "16M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGAQh_YEGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/ovaHmfy3O6U", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "ovaHmfy3O6U", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvMmJ4g2ESEnz0VQ10M4Age", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/ovaHmfy3O6U/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CGEQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCBwQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtvdmFIbWZ5M082VSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CGAQh_YEGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "ovaHmfy3O6U" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CGAQh_YEGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CGAQh_YEGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CGAQh_YEGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHlApffc5Z_zofuiAQ==", + "accessibility": { + "accessibilityData": { + "label": "hangover food - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CGAQh_YEGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CF8QmY0FGBwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "FHTQmKTZnlI", + "headline": { + "simpleText": "pig trotter raguuuuuuuuu 💅" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/FHTQmKTZnlI/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBaPmdp59deKec5AiRRJ_c6oWOpuA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.5 million views" + } + }, + "simpleText": "1.5M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF0Qh_YEGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/FHTQmKTZnlI", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "FHTQmKTZnlI", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-ju-boPeFKn2m2mImjZ_Ypnh", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/FHTQmKTZnlI/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CF4QsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCB0QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtGSFRRbUtUWm5sSSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CF0Qh_YEGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "FHTQmKTZnlI" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CF0Qh_YEGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CF0Qh_YEGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CF0Qh_YEGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHlA0rzmpoqTtLoU", + "accessibility": { + "accessibilityData": { + "label": "pig trotter raguuuuuuuuu 💅 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CF0Qh_YEGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CFwQmY0FGB0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "1AXB0l_wKMs", + "headline": { + "simpleText": "what i ate in google japan" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1AXB0l_wKMs/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAwymbQoerZLtr77RuARo1iok4_WQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.1 million views" + } + }, + "simpleText": "4.1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFoQh_YEGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/1AXB0l_wKMs", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "1AXB0l_wKMs", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvlZ5tXvuZDVJOSYrgGv4-D", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1AXB0l_wKMs/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFsQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCB4QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgsxQVhCMGxfd0tNcyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFoQh_YEGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "1AXB0l_wKMs" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFoQh_YEGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFoQh_YEGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFoQh_YEGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHlAy9HA_6W68ILUAQ==", + "accessibility": { + "accessibilityData": { + "label": "what i ate in google japan - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFoQh_YEGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CFkQmY0FGB4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "1ARLtk3HiB0", + "headline": { + "simpleText": "succumb to your cravings" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1ARLtk3HiB0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDSjiCiBhM1i7n68LVRv_G5GW5vRw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "7.1 million views" + } + }, + "simpleText": "7.1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFcQh_YEGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/1ARLtk3HiB0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "1ARLtk3HiB0", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-ju05k6lFvcDONtJpzPzyHfy", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1ARLtk3HiB0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFgQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCB8QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgsxQVJMdGszSGlCMCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFcQh_YEGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "1ARLtk3HiB0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFcQh_YEGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFcQh_YEGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFcQh_YEGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHlAnZCe7uT2koLUAQ==", + "accessibility": { + "accessibilityData": { + "label": "succumb to your cravings - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFcQh_YEGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CFYQmY0FGB8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "0FfDoDHpaN8", + "headline": { + "simpleText": "you can't let the what ifs rule your life" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0FfDoDHpaN8/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAJK1Av4zHRIWRBMSEfYRXxpwCSlQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.7 million views" + } + }, + "simpleText": "2.7M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFQQh_YEGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/0FfDoDHpaN8", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "0FfDoDHpaN8", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jud1w030NKwS7MTmmfrerat", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/0FfDoDHpaN8/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFUQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCAQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgswRmZEb0RIcGFOOCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFQQh_YEGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "0FfDoDHpaN8" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFQQh_YEGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFQQh_YEGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFQQh_YEGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHlA39Glj4P08KvQAQ==", + "accessibility": { + "accessibilityData": { + "label": "you can't let the what ifs rule your life - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFQQh_YEGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CFMQmY0FGCAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "kuT90_RIdF0", + "headline": { + "simpleText": "duck confit lollipop 🦆🍭" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kuT90_RIdF0/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCt9L5XUhmlkwuxMuupIt4kCnxctA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.2 million views" + } + }, + "simpleText": "3.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFEQh_YEGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/kuT90_RIdF0", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "kuT90_RIdF0", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtUquGM-pMGAB8J7XNvPNOG", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kuT90_RIdF0/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CFIQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCEQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtrdVQ5MF9SSWRGMCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CFEQh_YEGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "kuT90_RIdF0" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CFEQh_YEGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CFEQh_YEGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CFEQh_YEGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHlA3eihor-6v_KSAQ==", + "accessibility": { + "accessibilityData": { + "label": "duck confit lollipop 🦆🍭 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CFEQh_YEGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CFAQmY0FGCEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "aPJLhrcM4Yg", + "headline": { + "simpleText": "HOUSE TOUR" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aPJLhrcM4Yg/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBCLF6yI6Ke96PIrfo1s5BhYfeWvg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.6 million views" + } + }, + "simpleText": "3.6M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE4Qh_YEGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/aPJLhrcM4Yg", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "aPJLhrcM4Yg", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juC3KN5sAIsITRSCe4wGtih", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/aPJLhrcM4Yg/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CE8QsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCIQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgthUEpMaHJjTTRZZyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CE4Qh_YEGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "aPJLhrcM4Yg" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CE4Qh_YEGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CE4Qh_YEGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CE4Qh_YEGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHlAiMOzuOvwkvlo", + "accessibility": { + "accessibilityData": { + "label": "HOUSE TOUR - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CE4Qh_YEGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CE0QmY0FGCIiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "DKQrG_hJJX4", + "headline": { + "simpleText": "how to meal prep like a korean" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DKQrG_hJJX4/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLDZTyFRl919wEGdUg95-XrNIH99mg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "2.5 million views" + } + }, + "simpleText": "2.5M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEsQh_YEGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/DKQrG_hJJX4", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "DKQrG_hJJX4", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jsmhfV8w0ifA8sBQnmcNoq6", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/DKQrG_hJJX4/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEwQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCMQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtES1FyR19oSkpYNCoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEsQh_YEGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "DKQrG_hJJX4" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEsQh_YEGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEsQh_YEGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEsQh_YEGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHlA_sqkwr_jitIM", + "accessibility": { + "accessibilityData": { + "label": "how to meal prep like a korean - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEsQh_YEGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CEoQmY0FGCMiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "lNizW_P_oVw", + "headline": { + "simpleText": "Rating Everything I ate at McDonald's Japan 🇯🇵" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/lNizW_P_oVw/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAAiwuuJufebYj3P4aTo7wyBjh9Kw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.3 million views" + } + }, + "simpleText": "4.3M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEgQh_YEGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/lNizW_P_oVw", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "lNizW_P_oVw", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juyhuupGX9flUpm7kI4-R2i", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/lNizW_P_oVw/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEkQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCQQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtsTml6V19QX29WdyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEgQh_YEGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "lNizW_P_oVw" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEgQh_YEGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEgQh_YEGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEgQh_YEGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHlA3ML-n7_rrOyUAQ==", + "accessibility": { + "accessibilityData": { + "label": "Rating Everything I ate at McDonald's Japan 🇯🇵 - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEgQh_YEGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CEcQmY0FGCQiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "kbWyJjrCjwA", + "headline": { + "simpleText": "enemies as fertilizer √(veg)" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kbWyJjrCjwA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCItmfFh3UD53WvNCWd9HAItdubgg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.2 million views" + } + }, + "simpleText": "4.2M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEUQh_YEGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/kbWyJjrCjwA", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "kbWyJjrCjwA", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvBSusRea3r7w6ooxmmJwR7", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/kbWyJjrCjwA/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEYQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCUQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtrYld5SmpyQ2p3QSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEUQh_YEGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "kbWyJjrCjwA" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEUQh_YEGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEUQh_YEGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEUQh_YEGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHlAgJ6K1uPE7NqRAQ==", + "accessibility": { + "accessibilityData": { + "label": "enemies as fertilizer √(veg) - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEUQh_YEGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CEQQmY0FGCUiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "xAp910JTDig", + "headline": { + "simpleText": "let's make some cabbage rolls for lunch" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xAp910JTDig/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD0jor2XgDSjgk4IdMhCOGNqv0Vag", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.5 million views" + } + }, + "simpleText": "3.5M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEIQh_YEGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/xAp910JTDig", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "xAp910JTDig", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jsgflCnQN969CqbLU13AA-H", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/xAp910JTDig/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEMQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCYQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgt4QXA5MTBKVERpZyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CEIQh_YEGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "xAp910JTDig" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CEIQh_YEGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CEIQh_YEGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CEIQh_YEGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHlAqJzMkvS6n4XEAQ==", + "accessibility": { + "accessibilityData": { + "label": "let's make some cabbage rolls for lunch - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CEIQh_YEGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CEEQmY0FGCYiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "vSL7dhKatEk", + "headline": { + "simpleText": "Rating Everything I ate at IKEA Korea" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/vSL7dhKatEk/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1jtkvWyabnlTD7ktUQCWYvKctFQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "11 million views" + } + }, + "simpleText": "11M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD8Qh_YEGCciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/vSL7dhKatEk", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "vSL7dhKatEk", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtZOYnzpBrLMHcqDuBtqSEI", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/vSL7dhKatEk/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CEAQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCcQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgt2U0w3ZGhLYXRFayoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CD8Qh_YEGCciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "vSL7dhKatEk" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CD8Qh_YEGCciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CD8Qh_YEGCciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CD8Qh_YEGCciEwiW3dyrx4KEAxUF6UIFHQwtDHlAyejqlOHuvpG9AQ==", + "accessibility": { + "accessibilityData": { + "label": "Rating Everything I ate at IKEA Korea - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CD8Qh_YEGCciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CD4QmY0FGCciEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "LZzhUpACXSk", + "headline": { + "simpleText": "I'm done being the bigger person" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/LZzhUpACXSk/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLBKpbXJ3fj1mWw8YLEGgqqQJFPapw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "3.4 million views" + } + }, + "simpleText": "3.4M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDwQh_YEGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/LZzhUpACXSk", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "LZzhUpACXSk", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtlZc4pTq3NjjqDayEnoJSJ", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/LZzhUpACXSk/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CD0QsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCgQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtMWnpoVXBBQ1hTayoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDwQh_YEGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "LZzhUpACXSk" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDwQh_YEGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDwQh_YEGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDwQh_YEGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHlAqbqJgKmquM4t", + "accessibility": { + "accessibilityData": { + "label": "I'm done being the bigger person - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDwQh_YEGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CDsQmY0FGCgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "5C7nqNDfhis", + "headline": { + "simpleText": "we're cooking a whole bird today" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/5C7nqNDfhis/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLAywBcN0oFzKJrq2jxAcYU8Gz5mQQ", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "5.3 million views" + } + }, + "simpleText": "5.3M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDkQh_YEGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/5C7nqNDfhis", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "5C7nqNDfhis", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juK9y07PlV6kgX_ElXwmMv2", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/5C7nqNDfhis/frame0.jpg", + "width": 1080, + "height": 1920 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDoQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCkQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgs1QzducU5EZmhpcyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDkQh_YEGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "5C7nqNDfhis" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDkQh_YEGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDkQh_YEGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDkQh_YEGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHlAq4z-ho31uZfkAQ==", + "accessibility": { + "accessibilityData": { + "label": "we're cooking a whole bird today - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDkQh_YEGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CDgQmY0FGCkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "6mj4Af0kUOQ", + "headline": { + "simpleText": "men will disappoint but never potatoes" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/6mj4Af0kUOQ/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLB3pIz2cfevgV0ccu3bQM4IDaBSKg", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.8 million views" + } + }, + "simpleText": "1.8M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDYQh_YEGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/6mj4Af0kUOQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "6mj4Af0kUOQ", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-juK4PXIsK2S2wmD9fv-R3rE", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/6mj4Af0kUOQ/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDcQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCoQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgs2bWo0QWYwa1VPUSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDYQh_YEGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "6mj4Af0kUOQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDYQh_YEGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDYQh_YEGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDYQh_YEGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHlA5KGR6Z-AvrTqAQ==", + "accessibility": { + "accessibilityData": { + "label": "men will disappoint but never potatoes - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDYQh_YEGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CDUQmY0FGCoiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "1c3axhSJiaQ", + "headline": { + "simpleText": "I used to hate korean food" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1c3axhSJiaQ/hq720_2.jpg?sqp=-oaymwEdCJUDENAFSFXyq4qpAw8IARUAAIhCcAHAAQbQAQE=&rs=AOn4CLBucOEbTsWTDjOOCjNa-fAvz1yxyA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "4.8 million views" + } + }, + "simpleText": "4.8M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDMQh_YEGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/1c3axhSJiaQ", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "1c3axhSJiaQ", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtmExeuul92I9_cOHWcg8fn", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/1c3axhSJiaQ/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDQQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCsQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgsxYzNheGhTSmlhUSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDMQh_YEGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "1c3axhSJiaQ" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDMQh_YEGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDMQh_YEGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDMQh_YEGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHlApJOmpOHY9ubVAQ==", + "accessibility": { + "accessibilityData": { + "label": "I used to hate korean food - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDMQh_YEGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CDIQmY0FGCsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "F9Vz0m7DPeU", + "headline": { + "simpleText": "Rating everything I got at 7/11 Hawaii ( ft. Mauna Kea )" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/F9Vz0m7DPeU/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLD1w_8DhU37Mv_R3tQ9Kb6ouIU_VA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.9 million views" + } + }, + "simpleText": "1.9M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDAQh_YEGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/F9Vz0m7DPeU", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "F9Vz0m7DPeU", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-ju78Z0wtLHSS7usuzni-0TO", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/F9Vz0m7DPeU/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CDEQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCCwQARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtGOVZ6MG03RFBlVSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CDAQh_YEGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "F9Vz0m7DPeU" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CDAQh_YEGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CDAQh_YEGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CDAQh_YEGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHlA5fuM9qb63OoX", + "accessibility": { + "accessibilityData": { + "label": "Rating everything I got at 7/11 Hawaii ( ft. Mauna Kea ) - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CDAQh_YEGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CC8QmY0FGCwiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "Uey7kl56wks", + "headline": { + "simpleText": "Grabbing Snacks from 7/11 Hawaii" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Uey7kl56wks/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCybGwQAf9s43HoSQJGvWlOmmLPgw", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.1 million views" + } + }, + "simpleText": "1.1M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CC0Qh_YEGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/Uey7kl56wks", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "Uey7kl56wks", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jv9nOfjSgqux3Pe87HEfPQx", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/Uey7kl56wks/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CC4QsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCC0QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtVZXk3a2w1NndrcyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CC0Qh_YEGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "Uey7kl56wks" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CC0Qh_YEGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CC0Qh_YEGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CC0Qh_YEGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHlAy4Tr86XyrvZR", + "accessibility": { + "accessibilityData": { + "label": "Grabbing Snacks from 7/11 Hawaii - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CC0Qh_YEGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CCwQmY0FGC0iEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "3un2eUAr6Dg", + "headline": { + "simpleText": "cheesy korean corn balls hit different" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/3un2eUAr6Dg/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLC9I2IQJx0hUPF9mcw4lvs1I6Bj4A", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.9 million views" + } + }, + "simpleText": "1.9M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCoQh_YEGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/3un2eUAr6Dg", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "3un2eUAr6Dg", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jtCHOJF_oytufOceQIwBhsh", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/3un2eUAr6Dg/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CCsQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCC4QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgszdW4yZVVBcjZEZyoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCoQh_YEGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "3un2eUAr6Dg" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CCoQh_YEGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CCoQh_YEGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CCoQh_YEGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHlAuNCvgZTP_fTeAQ==", + "accessibility": { + "accessibilityData": { + "label": "cheesy korean corn balls hit different - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CCoQh_YEGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CCkQmY0FGC4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "richItemRenderer": { + "content": { + "reelItemRenderer": { + "videoId": "rI5tWrGpDJA", + "headline": { + "simpleText": "hawaiian tajin?!?" + }, + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/rI5tWrGpDJA/oar2.jpg?sqp=-oaymwEdCJUDENAFSFWQAgHyq4qpAwwIARUAAIhCcAHAAQY=&rs=AOn4CLCkg-RG2ToW-gXsSdYwO57sis0DkA", + "width": 405, + "height": 720 + } + ], + "isOriginalAspectRatio": true + }, + "viewCountText": { + "accessibility": { + "accessibilityData": { + "label": "1.6 million views" + } + }, + "simpleText": "1.6M views" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCcQh_YEGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/shorts/rI5tWrGpDJA", + "webPageType": "WEB_PAGE_TYPE_SHORTS", + "rootVe": 37414 + } + }, + "reelWatchEndpoint": { + "videoId": "rI5tWrGpDJA", + "playerParams": "8AEByAMkuAQ0ogYVAdXZ-jvB1usBAPvbjs6x8uHrBzgZ", + "thumbnail": { + "thumbnails": [ + { + "url": "https://i.ytimg.com/vi/rI5tWrGpDJA/frame0.jpg", + "width": 720, + "height": 1280 + } + ], + "isOriginalAspectRatio": true + }, + "overlay": { + "reelPlayerOverlayRenderer": { + "style": "REEL_PLAYER_OVERLAY_STYLE_SHORTS", + "trackingParams": "CCgQsLUEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "reelPlayerNavigationModel": "REEL_PLAYER_NAVIGATION_MODEL_UNSPECIFIED" + } + }, + "params": "CDMwAg%3D%3D", + "sequenceProvider": "REEL_WATCH_SEQUENCE_PROVIDER_RPC", + "sequenceParams": "GlMgAUJPCC8QARonogYkChhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2cQARoCCAAiAggAIhEKDzE6MTcwNjUyOTkxNjQxNCoNCgtySTV0V3JHcERKQSoCGDOQAQE%3D", + "loggingContext": { + "vssLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + }, + "qoeLoggingContext": { + "serializedContextData": "CgIIDA%3D%3D" + } + }, + "ustreamerConfig": "CAwSGG1MdndaZU9qYzlpR3pxNnFMMkxGS1Q0PQ==" + } + }, + "menu": { + "menuRenderer": { + "items": [ + { + "menuNavigationItemRenderer": { + "text": { + "runs": [ + { + "text": "Send feedback" + } + ] + }, + "icon": { + "iconType": "FEEDBACK" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCcQh_YEGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "userFeedbackEndpoint": { + "additionalDatas": [ + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "video_id", + "value": "rI5tWrGpDJA" + } + }, + { + "userFeedbackEndpointProductSpecificValueData": { + "key": "lockup", + "value": "shelf" + } + } + ] + } + }, + "trackingParams": "CCcQh_YEGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Send feedback" + } + } + } + } + ], + "trackingParams": "CCcQh_YEGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "More actions" + } + } + } + }, + "trackingParams": "CCcQh_YEGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHlAkJmkjaurm8esAQ==", + "accessibility": { + "accessibilityData": { + "label": "hawaiian tajin?!? - play Short" + } + }, + "style": "REEL_ITEM_STYLE_AVATAR_CIRCLE", + "videoType": "REEL_VIDEO_TYPE_VIDEO", + "loggingDirectives": { + "trackingParams": "CCcQh_YEGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "visibility": { + "types": "12" + }, + "enableDisplayloggerExperiment": true + } + } + }, + "trackingParams": "CCYQmY0FGC8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "continuationItemRenderer": { + "trigger": "CONTINUATION_TRIGGER_ON_ITEM_SHOWN", + "continuationEndpoint": { + "clickTrackingParams": "CCAQ8eIEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse" + } + }, + "continuationCommand": { + "token": "4qmFsgL3ARIYVUNoOGdIZHR6TzJ0WGQ1OTNfYmpFcldnGtoBOGdhZEFScWFBVktYQVFxU0FRcHFRME00VVVGU2IyNXZaMWxyUTJob1ZsRXlaelJhTUdoclpFaHdVRTF1VWxsYVJGVTFUVEU1YVdGclZubFdNbU5SUVZKdlEwTkJRV2xCWjJkQlNXaEZTMFI2UlRaTlZHTjNUbXBWZVU5VWEzaE9hbEY0VGtOdlRrTm5kSGxUVkZZd1ZqTktTR05GVWt0UlVSSWtOamRpWVRVd016UXRNREF3TUMweVpEQmpMVGc0TnpndE1UUXlNak5pWWpoaU9HUmhHQUUlM0Q%3D", + "request": "CONTINUATION_REQUEST_TYPE_BROWSE" + } + } + } + } + ], + "trackingParams": "CCAQ8eIEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "header": { + "feedFilterChipBarRenderer": { + "contents": [ + { + "chipCloudChipRenderer": { + "text": { + "simpleText": "Latest" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCUQ_V0YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse" + } + }, + "continuationCommand": { + "token": "4qmFsgJkEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caSDhnWXVHaXhTS2hJbUNpUTJOMkpoTlRBek5DMHdNREF3TFRKa01HTXRPRGczT0MweE5ESXlNMkppT0dJNFpHRVlBUSUzRCUzRA%3D%3D", + "request": "CONTINUATION_REQUEST_TYPE_BROWSE", + "command": { + "clickTrackingParams": "CCUQ_V0YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "showReloadUiCommand": { + "targetId": "67ba5034-0000-2d0c-8878-14223bb8b8da" + } + } + } + }, + "trackingParams": "CCUQ_V0YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "isSelected": true + } + }, + { + "chipCloudChipRenderer": { + "text": { + "simpleText": "Popular" + }, + "navigationEndpoint": { + "clickTrackingParams": "CCQQ_V0YASITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse" + } + }, + "continuationCommand": { + "token": "4qmFsgJkEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caSDhnWXVHaXhTS2hJbUNpUTJOMkpoTlRBek5DMHdNREF3TFRKa01HTXRPRGczT0MweE5ESXlNMkppT0dJNFpHRVlBZyUzRCUzRA%3D%3D", + "request": "CONTINUATION_REQUEST_TYPE_BROWSE", + "command": { + "clickTrackingParams": "CCQQ_V0YASITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "showReloadUiCommand": { + "targetId": "67ba5034-0000-2d0c-8878-14223bb8b8da" + } + } + } + }, + "trackingParams": "CCQQ_V0YASITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "isSelected": false + } + } + ], + "trackingParams": "CCEQ4M4DIhMIlt3cq8eChAMVBelCBR0MLQx5", + "nextButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CHEVRON_RIGHT" + }, + "tooltip": "Next", + "trackingParams": "CCMQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibilityData": { + "accessibilityData": { + "label": "Next" + } + } + } + }, + "previousButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CHEVRON_LEFT" + }, + "tooltip": "Previous", + "trackingParams": "CCIQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibilityData": { + "accessibilityData": { + "label": "Previous" + } + } + } + }, + "styleType": "FEED_FILTER_CHIP_BAR_STYLE_TYPE_CHANNEL_PAGE_GRID" + } + }, + "targetId": "67ba5034-0000-2d0c-8878-14223bb8b8da", + "style": "RICH_GRID_STYLE_SHORTS_GRID" + } + }, + "trackingParams": "CB8Q8JMBGAciEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "tabRenderer": { + "endpoint": { + "clickTrackingParams": "CB4Q8JMBGAgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/playlists", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "EglwbGF5bGlzdHPyBgQKAkIA", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "title": "Playlists", + "trackingParams": "CB4Q8JMBGAgiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "tabRenderer": { + "endpoint": { + "clickTrackingParams": "CB0Q8JMBGAkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/community", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "Egljb21tdW5pdHnyBgQKAkoA", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "title": "Community", + "trackingParams": "CB0Q8JMBGAkiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + { + "expandableTabRenderer": { + "endpoint": { + "clickTrackingParams": "CAAQhGciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/search", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "EgZzZWFyY2jyBgQKAloA", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "title": "Search", + "selected": false + } + } + ] + } + }, + "header": { + "pageHeaderRenderer": { + "pageTitle": "Doobydobap", + "content": { + "pageHeaderViewModel": { + "title": { + "dynamicTextViewModel": { + "text": { + "content": "Doobydobap", + "styleRuns": [ + { + "startIndex": 10, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + } + ], + "attachmentRuns": [ + { + "startIndex": 10, + "length": 0, + "element": { + "type": { + "imageType": { + "image": { + "sources": [ + { + "clientResource": { + "imageName": "CHECK_CIRCLE_FILLED" + }, + "width": 14, + "height": 14 + } + ] + } + } + }, + "properties": { + "layoutProperties": { + "height": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "width": { + "value": 14, + "unit": "DIMENSION_UNIT_POINT" + }, + "margin": { + "left": { + "value": 8, + "unit": "DIMENSION_UNIT_POINT" + } + } + } + } + }, + "alignment": "ALIGNMENT_VERTICAL_CENTER" + } + ] + }, + "maxLines": 2, + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CBwQj-QKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 176655, + "veCounter": 589492038 + } + } + }, + "accessibilityContext": { + "label": "Doobydobap, Verified" + } + } + } + }, + "image": { + "decoratedAvatarViewModel": { + "avatar": { + "avatarViewModel": { + "image": { + "sources": [ + { + "url": "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s72-c-k-c0x00ffffff-no-rj", + "width": 72, + "height": 72 + }, + { + "url": "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s120-c-k-c0x00ffffff-no-rj", + "width": 120, + "height": 120 + }, + { + "url": "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s160-c-k-c0x00ffffff-no-rj", + "width": 160, + "height": 160 + } + ], + "processor": { + "borderImageProcessor": { + "circular": true + } + } + }, + "avatarImageSize": "AVATAR_SIZE_XL" + } + } + } + }, + "metadata": { + "contentMetadataViewModel": { + "metadataRows": [ + { + "metadataParts": [ + { + "text": { + "content": "@Doobydobap" + } + }, + { + "text": { + "content": "3.74M subscribers" + } + }, + { + "text": { + "content": "345 videos", + "styleRuns": [ + { + "startIndex": 0, + "length": 10 + } + ] + } + } + ] + } + ], + "delimiter": "•", + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CBsQ9eQKIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 176757, + "veCounter": 589492036 + } + } + } + } + } + }, + "actions": { + "flexibleActionsViewModel": { + "actionsRows": [ + { + "actions": [ + { + "buttonViewModel": { + "title": "Subscribe", + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBkQjqULIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "ignoreNavigation": true + } + }, + "modalEndpoint": { + "modal": { + "modalWithTitleAndButtonRenderer": { + "title": { + "simpleText": "Want to subscribe to this channel?" + }, + "content": { + "simpleText": "Sign in to subscribe to this channel." + }, + "button": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "simpleText": "Sign in" + }, + "navigationEndpoint": { + "clickTrackingParams": "CBoQ_YYEIhMIlt3cq8eChAMVBelCBR0MLQx5MglzdWJzY3JpYmU=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252F%2540Doobydobap%252Fshorts%26continue_action%3DQUFFLUhqbF9pMm5IZnoxeEFJaGhkS2ZDZEJhSXEtdE43Z3xBQ3Jtc0tsLVBfTkFaZlJjc3VPVjZyMmYxOFYwU1lkNnBDU0dUUmVmVW9FbUlhdTVmekpkZzVTTXhPSHA2eEkzalgyTlJwR2xUVnFfZUJCQ3lxbDU4R29lcFp5OGc5a2JTZG42MzJ0WXB1QTJIc0dabVdRR0ZsMkczOEhySFliWWo3cGlzOFpMYW1LMnIyNWdUQ3pvYlJZeFcwSkVYMEYzOXhPeXVrd3d3bk5FLVF4dkJIc3MwdjA2a29OV291b3FzcVNtenJfQ3VyYm4&hl=en&ec=66429", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "nextEndpoint": { + "clickTrackingParams": "CBoQ_YYEIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "/@Doobydobap/shorts", + "webPageType": "WEB_PAGE_TYPE_CHANNEL", + "rootVe": 3611, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "UCh8gHdtzO2tXd593_bjErWg", + "params": "EgZzaG9ydHM%3D", + "canonicalBaseUrl": "/@Doobydobap" + } + }, + "continueAction": "QUFFLUhqbF9pMm5IZnoxeEFJaGhkS2ZDZEJhSXEtdE43Z3xBQ3Jtc0tsLVBfTkFaZlJjc3VPVjZyMmYxOFYwU1lkNnBDU0dUUmVmVW9FbUlhdTVmekpkZzVTTXhPSHA2eEkzalgyTlJwR2xUVnFfZUJCQ3lxbDU4R29lcFp5OGc5a2JTZG42MzJ0WXB1QTJIc0dabVdRR0ZsMkczOEhySFliWWo3cGlzOFpMYW1LMnIyNWdUQ3pvYlJZeFcwSkVYMEYzOXhPeXVrd3d3bk5FLVF4dkJIc3MwdjA2a29OV291b3FzcVNtenJfQ3VyYm4", + "idamTag": "66429" + } + }, + "trackingParams": "CBoQ_YYEIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + } + } + } + } + } + }, + "accessibilityText": "Subscribe", + "style": "BUTTON_VIEW_MODEL_STYLE_MONO", + "trackingParams": "CBkQjqULIhMIlt3cq8eChAMVBelCBR0MLQx5", + "isFullWidth": false, + "type": "BUTTON_VIEW_MODEL_TYPE_FILLED", + "buttonSize": "BUTTON_VIEW_MODEL_SIZE_DEFAULT", + "state": "BUTTON_VIEW_MODEL_STATE_ACTIVE" + } + } + ] + } + ], + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CBkQjqULIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 184974, + "veCounter": 589492034 + } + } + } + } + } + }, + "description": { + "descriptionPreviewViewModel": { + "description": { + "content": "Hi, I’m Tina, aka Doobydobap! " + }, + "maxLines": 2, + "truncationText": { + "content": "...more", + "styleRuns": [ + { + "startIndex": 0, + "length": 7, + "weight": 500 + } + ] + }, + "alwaysShowTruncationText": true, + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CBQQr_4KIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 180015, + "veCounter": 589492032 + } + } + }, + "accessibilityContext": { + "label": "Description. Hi, I’m Tina, aka Doobydobap!...tap for more." + }, + "commandContext": { + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBQQr_4KIhMIlt3cq8eChAMVBelCBR0MLQx5", + "showEngagementPanelEndpoint": { + "engagementPanel": { + "engagementPanelSectionListRenderer": { + "header": { + "engagementPanelTitleHeaderRenderer": { + "title": { + "simpleText": "About" + }, + "visibilityButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CLOSE" + }, + "accessibility": { + "label": "Close" + }, + "trackingParams": "CBgQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibilityData": { + "accessibilityData": { + "label": "Close" + } + }, + "command": { + "clickTrackingParams": "CBgQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "changeEngagementPanelVisibilityAction": { + "targetId": "67ba5045-0000-2d0c-8878-14223bb8b8da", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN" + } + } + } + }, + "trackingParams": "CBUQ040EIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + "content": { + "sectionListRenderer": { + "contents": [ + { + "itemSectionRenderer": { + "contents": [ + { + "continuationItemRenderer": { + "trigger": "CONTINUATION_TRIGGER_ON_ITEM_SHOWN", + "continuationEndpoint": { + "clickTrackingParams": "CBcQuy8YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse" + } + }, + "continuationCommand": { + "token": "4qmFsgJgEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caRDhnWXJHaW1hQVNZS0pEWTNZbUUxTURRMkxUQXdNREF0TW1Rd1l5MDRPRGM0TFRFME1qSXpZbUk0WWpoa1lRJTNEJTNE", + "request": "CONTINUATION_REQUEST_TYPE_BROWSE" + } + } + } + } + ], + "trackingParams": "CBcQuy8YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "sectionIdentifier": "67ba5046-0000-2d0c-8878-14223bb8b8da", + "targetId": "67ba5046-0000-2d0c-8878-14223bb8b8da" + } + } + ], + "trackingParams": "CBYQui8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "scrollPaneStyle": { + "scrollable": true + } + } + }, + "targetId": "67ba5045-0000-2d0c-8878-14223bb8b8da", + "identifier": { + "surface": "ENGAGEMENT_PANEL_SURFACE_BROWSE", + "tag": "67ba5045-0000-2d0c-8878-14223bb8b8da" + } + } + }, + "identifier": { + "surface": "ENGAGEMENT_PANEL_SURFACE_BROWSE", + "tag": "67ba5045-0000-2d0c-8878-14223bb8b8da" + }, + "engagementPanelPresentationConfigs": { + "engagementPanelPopupPresentationConfig": { + "popupType": "PANEL_POPUP_TYPE_DIALOG" + } + } + } + } + } + } + } + } + }, + "attribution": { + "attributionViewModel": { + "text": { + "content": "instagram.com/doobydobap", + "commandRuns": [ + { + "startIndex": 0, + "length": 24, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CA8QjaULIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=channel_header&redir_token=QUFFLUhqbWNFQmxuaGhKV1dhNkJMSmhMNHZzZXNiWWNBZ3xBQ3Jtc0ttb1hNQzNGbXJKcTFESkdwbHRmN1VkNGtSaGFhREhhSHF2NTZtQUM0Mi1nQ1FfbmhQbGhzaS1VZ1YyUThXekhncXVLbWJ0TmtMRmVUYjh6Q2ZVSUpCZmQ5MTcxbUF2QlQxeWtSaXZOSEl1cEtyVFhYRQ&q=https%3A%2F%2Fwww.instagram.com%2Fdoobydobap%2F", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "urlEndpoint": { + "url": "https://www.youtube.com/redirect?event=channel_header&redir_token=QUFFLUhqbWNFQmxuaGhKV1dhNkJMSmhMNHZzZXNiWWNBZ3xBQ3Jtc0ttb1hNQzNGbXJKcTFESkdwbHRmN1VkNGtSaGFhREhhSHF2NTZtQUM0Mi1nQ1FfbmhQbGhzaS1VZ1YyUThXekhncXVLbWJ0TmtMRmVUYjh6Q2ZVSUpCZmQ5MTcxbUF2QlQxeWtSaXZOSEl1cEtyVFhYRQ&q=https%3A%2F%2Fwww.instagram.com%2Fdoobydobap%2F", + "target": "TARGET_NEW_WINDOW" + } + } + } + } + ], + "styleRuns": [ + { + "weightLabel": "FONT_WEIGHT_NORMAL", + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + } + } + ] + }, + "suffix": { + "content": "and 2 more links", + "commandRuns": [ + { + "startIndex": 0, + "length": 16, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CA8QjaULIhMIlt3cq8eChAMVBelCBR0MLQx5", + "showEngagementPanelEndpoint": { + "engagementPanel": { + "engagementPanelSectionListRenderer": { + "header": { + "engagementPanelTitleHeaderRenderer": { + "title": { + "simpleText": "About" + }, + "visibilityButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CLOSE" + }, + "accessibility": { + "label": "Close" + }, + "trackingParams": "CBMQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibilityData": { + "accessibilityData": { + "label": "Close" + } + }, + "command": { + "clickTrackingParams": "CBMQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "changeEngagementPanelVisibilityAction": { + "targetId": "67ba5047-0000-2d0c-8878-14223bb8b8da", + "visibility": "ENGAGEMENT_PANEL_VISIBILITY_HIDDEN" + } + } + } + }, + "trackingParams": "CBAQ040EIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + "content": { + "sectionListRenderer": { + "contents": [ + { + "itemSectionRenderer": { + "contents": [ + { + "continuationItemRenderer": { + "trigger": "CONTINUATION_TRIGGER_ON_ITEM_SHOWN", + "continuationEndpoint": { + "clickTrackingParams": "CBIQuy8YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/browse" + } + }, + "continuationCommand": { + "token": "4qmFsgJgEhhVQ2g4Z0hkdHpPMnRYZDU5M19iakVyV2caRDhnWXJHaW1hQVNZS0pEWTNZbUUxTURRNExUQXdNREF0TW1Rd1l5MDRPRGM0TFRFME1qSXpZbUk0WWpoa1lRJTNEJTNE", + "request": "CONTINUATION_REQUEST_TYPE_BROWSE" + } + } + } + } + ], + "trackingParams": "CBIQuy8YACITCJbd3KvHgoQDFQXpQgUdDC0MeQ==", + "sectionIdentifier": "67ba5048-0000-2d0c-8878-14223bb8b8da", + "targetId": "67ba5048-0000-2d0c-8878-14223bb8b8da" + } + } + ], + "trackingParams": "CBEQui8iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "scrollPaneStyle": { + "scrollable": true + } + } + }, + "targetId": "67ba5047-0000-2d0c-8878-14223bb8b8da", + "identifier": { + "surface": "ENGAGEMENT_PANEL_SURFACE_BROWSE", + "tag": "67ba5047-0000-2d0c-8878-14223bb8b8da" + } + } + }, + "identifier": { + "surface": "ENGAGEMENT_PANEL_SURFACE_BROWSE", + "tag": "67ba5047-0000-2d0c-8878-14223bb8b8da" + }, + "engagementPanelPresentationConfigs": { + "engagementPanelPopupPresentationConfig": { + "popupType": "PANEL_POPUP_TYPE_DIALOG" + } + } + } + } + } + } + ], + "styleRuns": [ + { + "fontName": "", + "fontSize": 0, + "weightLabel": "FONT_WEIGHT_MEDIUM" + } + ] + }, + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CA8QjaULIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 184973, + "veCounter": 589492030 + } + } + } + } + } + }, + "banner": { + "imageBannerViewModel": { + "image": { + "sources": [ + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1060-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 1060, + "height": 175 + }, + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1138-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 1138, + "height": 188 + }, + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w1707-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 1707, + "height": 283 + }, + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w2120-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 2120, + "height": 351 + }, + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w2276-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 2276, + "height": 377 + }, + { + "url": "https://yt3.googleusercontent.com/BvnAqgiursrXpmS9AgDLtkOSTQfOG_Dqn0KzY5hcwO9XrHTEQTVgaflI913f9KRp7d0U2qBp=w2560-fcrop64=1,00005a57ffffa5a8-k-c0xffffffff-no-nd-rj", + "width": 2560, + "height": 424 + } + ] + }, + "style": "IMAGE_BANNER_STYLE_INSET", + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CA4QnfILIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 194845, + "veCounter": 589492028 + } + } + } + } + } + }, + "rendererContext": { + "loggingContext": { + "loggingDirectives": { + "trackingParams": "CA0Qot8KIhMIlt3cq8eChAMVBelCBR0MLQx5", + "visibility": { + "types": "12" + }, + "clientVeSpec": { + "uiType": 176034, + "veCounter": 589492026 + } + } + } + } + } + } + } + }, + "metadata": { + "channelMetadataRenderer": { + "title": "Doobydobap", + "description": "Hi, I’m Tina, aka Doobydobap!\n\nFood is the medium I use to tell stories and connect with people who share the same passion as I do. Whether it’s because you’re hungry at midnight or trying to learn how to cook, I hope you enjoy watching my content and recipes. Don't yuck my yum!\n\nwww.doobydobap.com\n", + "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCh8gHdtzO2tXd593_bjErWg", + "externalId": "UCh8gHdtzO2tXd593_bjErWg", + "keywords": "", + "ownerUrls": [ + "http://www.youtube.com/@Doobydobap" + ], + "avatar": { + "thumbnails": [ + { + "url": "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s900-c-k-c0x00ffffff-no-rj", + "width": 900, + "height": 900 + } + ] + }, + "channelUrl": "https://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg", + "isFamilySafe": true, + "availableCountryCodes": [ + "SY", + "PL", + "UA", + "TN", + "SV", + "ZM", + "TD", + "CH", + "KE", + "AU", + "SA", + "SE", + "SO", + "AG", + "JP", + "LV", + "SG", + "TG", + "SJ", + "IS", + "BT", + "KM", + "RO", + "BR", + "PG", + "JO", + "EC", + "TH", + "UY", + "VI", + "SC", + "AI", + "CC", + "CV", + "MD", + "CW", + "BA", + "BJ", + "AX", + "MF", + "TM", + "PY", + "SM", + "CM", + "ML", + "SX", + "IO", + "CO", + "NF", + "JM", + "GH", + "LA", + "IR", + "TC", + "TK", + "LI", + "TL", + "ST", + "VA", + "CY", + "BS", + "MQ", + "BV", + "GG", + "DM", + "BO", + "BD", + "MA", + "AF", + "AS", + "FK", + "GM", + "HN", + "AQ", + "BH", + "MN", + "LS", + "MT", + "SD", + "BI", + "YE", + "AO", + "MO", + "GY", + "CI", + "IN", + "BQ", + "CX", + "VG", + "SI", + "PF", + "PA", + "FO", + "NP", + "EH", + "GR", + "AZ", + "IM", + "LT", + "SB", + "TV", + "AL", + "NA", + "SK", + "GF", + "NI", + "PT", + "SL", + "GN", + "PN", + "LU", + "ME", + "ET", + "AM", + "ZW", + "GE", + "BL", + "CA", + "DE", + "TW", + "GI", + "VN", + "BW", + "FI", + "MK", + "DZ", + "LR", + "VE", + "BM", + "QA", + "UG", + "MW", + "ZA", + "IT", + "RW", + "RS", + "WF", + "PK", + "BG", + "KR", + "HU", + "IQ", + "OM", + "VU", + "KY", + "NO", + "WS", + "CD", + "PM", + "PW", + "US", + "GT", + "LY", + "BB", + "GU", + "GQ", + "KI", + "DK", + "BN", + "FR", + "GD", + "FJ", + "KW", + "SZ", + "FM", + "RE", + "RU", + "TZ", + "SH", + "VC", + "MM", + "BY", + "LK", + "JE", + "MG", + "HR", + "GS", + "GW", + "NR", + "GP", + "ES", + "AE", + "CK", + "EG", + "CZ", + "HK", + "PE", + "CR", + "TO", + "LC", + "IE", + "AR", + "DJ", + "PS", + "HT", + "KZ", + "MS", + "ER", + "NL", + "BE", + "EE", + "ID", + "MC", + "MX", + "NU", + "UM", + "MY", + "AD", + "MH", + "GA", + "MU", + "CL", + "KH", + "MR", + "HM", + "CF", + "LB", + "BZ", + "CU", + "SN", + "BF", + "UZ", + "NG", + "SS", + "AT", + "DO", + "CG", + "TT", + "GL", + "NC", + "SR", + "AW", + "TR", + "MP", + "YT", + "KG", + "NZ", + "NE", + "GB", + "TJ", + "IL", + "CN", + "TF", + "KP", + "MZ", + "MV", + "KN", + "PH", + "PR" + ], + "androidDeepLink": "android-app://com.google.android.youtube/http/www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg", + "androidAppindexingLink": "android-app://com.google.android.youtube/http/www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg", + "iosAppindexingLink": "ios-app://544007664/vnd.youtube/www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg", + "vanityChannelUrl": "http://www.youtube.com/@Doobydobap" + } + }, + "trackingParams": "CAAQhGciEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "topbar": { + "desktopTopbarRenderer": { + "logo": { + "topbarLogoRenderer": { + "iconImage": { + "iconType": "YOUTUBE_LOGO" + }, + "tooltipText": { + "runs": [ + { + "text": "YouTube Home" + } + ] + }, + "endpoint": { + "clickTrackingParams": "CAwQsV4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 3854, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEwhat_to_watch" + } + }, + "trackingParams": "CAwQsV4iEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "overrideEntityKey": "EgZ0b3BiYXIg9QEoAQ%3D%3D" + } + }, + "searchbox": { + "fusionSearchboxRenderer": { + "icon": { + "iconType": "SEARCH" + }, + "placeholderText": { + "runs": [ + { + "text": "Search" + } + ] + }, + "config": { + "webSearchboxConfig": { + "requestLanguage": "en", + "requestDomain": "us", + "hasOnscreenKeyboard": false, + "focusSearchbox": true + } + }, + "trackingParams": "CAoQ7VAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "searchEndpoint": { + "clickTrackingParams": "CAoQ7VAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/results?search_query=", + "webPageType": "WEB_PAGE_TYPE_SEARCH", + "rootVe": 4724 + } + }, + "searchEndpoint": { + "query": "" + } + }, + "clearButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "icon": { + "iconType": "CLOSE" + }, + "trackingParams": "CAsQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibilityData": { + "accessibilityData": { + "label": "Clear search query" + } + } + } + } + } + }, + "trackingParams": "CAEQq6wBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "topbarButtons": [ + { + "topbarMenuButtonRenderer": { + "icon": { + "iconType": "MORE_VERT" + }, + "menuRequest": { + "clickTrackingParams": "CAgQ_qsBGAAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true, + "apiUrl": "/youtubei/v1/account/account_menu" + } + }, + "signalServiceEndpoint": { + "signal": "GET_ACCOUNT_MENU", + "actions": [ + { + "clickTrackingParams": "CAgQ_qsBGAAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "openPopupAction": { + "popup": { + "multiPageMenuRenderer": { + "trackingParams": "CAkQ_6sBIhMIlt3cq8eChAMVBelCBR0MLQx5", + "style": "MULTI_PAGE_MENU_STYLE_TYPE_SYSTEM", + "showLoadingSpinner": true + } + }, + "popupType": "DROPDOWN", + "beReused": true + } + } + ] + } + }, + "trackingParams": "CAgQ_qsBGAAiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "accessibility": { + "accessibilityData": { + "label": "Settings" + } + }, + "tooltip": "Settings", + "style": "STYLE_DEFAULT" + } + }, + { + "buttonRenderer": { + "style": "STYLE_SUGGESTIVE", + "size": "SIZE_SMALL", + "text": { + "runs": [ + { + "text": "Sign in" + } + ] + }, + "icon": { + "iconType": "AVATAR_LOGGED_OUT" + }, + "navigationEndpoint": { + "clickTrackingParams": "CAcQ1IAEGAEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252Fyoutubei%252Fv1%252Fbrowse%253Fkey%253DAIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8%2526prettyPrint%253Dfalse&hl=en&ec=65620", + "webPageType": "WEB_PAGE_TYPE_UNKNOWN", + "rootVe": 83769 + } + }, + "signInEndpoint": { + "idamTag": "65620" + } + }, + "trackingParams": "CAcQ1IAEGAEiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "targetId": "topbar-signin" + } + } + ], + "hotkeyDialog": { + "hotkeyDialogRenderer": { + "title": { + "runs": [ + { + "text": "Keyboard shortcuts" + } + ] + }, + "sections": [ + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Playback" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle play/pause" + } + ] + }, + "hotkey": "k" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rewind 10 seconds" + } + ] + }, + "hotkey": "j" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Fast forward 10 seconds" + } + ] + }, + "hotkey": "l" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Previous video" + } + ] + }, + "hotkey": "P (SHIFT+p)" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Next video" + } + ] + }, + "hotkey": "N (SHIFT+n)" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Previous frame (while paused)" + } + ] + }, + "hotkey": ",", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Comma" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Next frame (while paused)" + } + ] + }, + "hotkey": ".", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Period" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Decrease playback rate" + } + ] + }, + "hotkey": "< (SHIFT+,)", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Less than or SHIFT + comma" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Increase playback rate" + } + ] + }, + "hotkey": "> (SHIFT+.)", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Greater than or SHIFT + period" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to specific point in the video (7 advances to 70% of duration)" + } + ] + }, + "hotkey": "0..9" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to previous chapter" + } + ] + }, + "hotkey": "CONTROL + ←" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Seek to next chapter" + } + ] + }, + "hotkey": "CONTROL + →" + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "General" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle full screen" + } + ] + }, + "hotkey": "f" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle theater mode" + } + ] + }, + "hotkey": "t" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle miniplayer" + } + ] + }, + "hotkey": "i" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Close miniplayer or current dialog" + } + ] + }, + "hotkey": "ESCAPE" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Toggle mute" + } + ] + }, + "hotkey": "m" + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Subtitles and closed captions" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "If the video supports captions, toggle captions ON/OFF" + } + ] + }, + "hotkey": "c" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through different text opacity levels" + } + ] + }, + "hotkey": "o" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through different window opacity levels" + } + ] + }, + "hotkey": "w" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through font sizes (increasing)" + } + ] + }, + "hotkey": "+" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Rotate through font sizes (decreasing)" + } + ] + }, + "hotkey": "-", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Minus" + } + } + } + } + ] + } + }, + { + "hotkeyDialogSectionRenderer": { + "title": { + "runs": [ + { + "text": "Spherical Videos" + } + ] + }, + "options": [ + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan up" + } + ] + }, + "hotkey": "w" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan left" + } + ] + }, + "hotkey": "a" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan down" + } + ] + }, + "hotkey": "s" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Pan right" + } + ] + }, + "hotkey": "d" + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Zoom in" + } + ] + }, + "hotkey": "+ on numpad or ]", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Plus on number pad or right bracket" + } + } + } + }, + { + "hotkeyDialogSectionOptionRenderer": { + "label": { + "runs": [ + { + "text": "Zoom out" + } + ] + }, + "hotkey": "- on numpad or [", + "hotkeyAccessibilityLabel": { + "accessibilityData": { + "label": "Minus on number pad or left bracket" + } + } + } + } + ] + } + } + ], + "dismissButton": { + "buttonRenderer": { + "style": "STYLE_BLUE_TEXT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Dismiss" + } + ] + }, + "trackingParams": "CAYQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=" + } + }, + "trackingParams": "CAUQteYDIhMIlt3cq8eChAMVBelCBR0MLQx5" + } + }, + "backButton": { + "buttonRenderer": { + "trackingParams": "CAQQvIYDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "command": { + "clickTrackingParams": "CAQQvIYDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAQQvIYDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "signalAction": { + "signal": "HISTORY_BACK" + } + } + ] + } + } + } + }, + "forwardButton": { + "buttonRenderer": { + "trackingParams": "CAMQvYYDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "command": { + "clickTrackingParams": "CAMQvYYDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAMQvYYDIhMIlt3cq8eChAMVBelCBR0MLQx5", + "signalAction": { + "signal": "HISTORY_FORWARD" + } + } + ] + } + } + } + }, + "a11ySkipNavigationButton": { + "buttonRenderer": { + "style": "STYLE_DEFAULT", + "size": "SIZE_DEFAULT", + "isDisabled": false, + "text": { + "runs": [ + { + "text": "Skip navigation" + } + ] + }, + "trackingParams": "CAIQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "command": { + "clickTrackingParams": "CAIQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "commandMetadata": { + "webCommandMetadata": { + "sendPost": true + } + }, + "signalServiceEndpoint": { + "signal": "CLIENT_SIGNAL", + "actions": [ + { + "clickTrackingParams": "CAIQ8FsiEwiW3dyrx4KEAxUF6UIFHQwtDHk=", + "signalAction": { + "signal": "SKIP_NAVIGATION" + } + } + ] + } + } + } + } + } + }, + "microformat": { + "microformatDataRenderer": { + "urlCanonical": "https://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg", + "title": "Doobydobap", + "description": "Hi, I’m Tina, aka Doobydobap! Food is the medium I use to tell stories and connect with people who share the same passion as I do. Whether it’s because you’r...", + "thumbnail": { + "thumbnails": [ + { + "url": "https://yt3.googleusercontent.com/dm5Aq93xvVJz0NoVO88ieBkDXmuShCujGPlZ7qETMEPTrXvPUCFI3-BB6Xs_P-r6Uk3mnBy9zA=s200-c-k-c0x00ffffff-no-rj?days_since_epoch=19751", + "width": 200, + "height": 200 + } + ] + }, + "siteName": "YouTube", + "appName": "YouTube", + "androidPackage": "com.google.android.youtube", + "iosAppStoreId": "544007664", + "iosAppArguments": "https://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg", + "ogType": "yt-fb-app:channel", + "urlApplinksWeb": "https://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg?feature=applinks", + "urlApplinksIos": "vnd.youtube://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg?feature=applinks", + "urlApplinksAndroid": "vnd.youtube://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg?feature=applinks", + "urlTwitterIos": "vnd.youtube://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg?feature=twitter-deep-link", + "urlTwitterAndroid": "vnd.youtube://www.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg?feature=twitter-deep-link", + "twitterCardType": "summary", + "twitterSiteHandle": "@YouTube", + "schemaDotOrgType": "http://schema.org/http://schema.org/YoutubeChannelV2", + "noindex": false, + "unlisted": false, + "familySafe": true, + "availableCountries": [ + "SY", + "PL", + "UA", + "TN", + "SV", + "ZM", + "TD", + "CH", + "KE", + "AU", + "SA", + "SE", + "SO", + "AG", + "JP", + "LV", + "SG", + "TG", + "SJ", + "IS", + "BT", + "KM", + "RO", + "BR", + "PG", + "JO", + "EC", + "TH", + "UY", + "VI", + "SC", + "AI", + "CC", + "CV", + "MD", + "CW", + "BA", + "BJ", + "AX", + "MF", + "TM", + "PY", + "SM", + "CM", + "ML", + "SX", + "IO", + "CO", + "NF", + "JM", + "GH", + "LA", + "IR", + "TC", + "TK", + "LI", + "TL", + "ST", + "VA", + "CY", + "BS", + "MQ", + "BV", + "GG", + "DM", + "BO", + "BD", + "MA", + "AF", + "AS", + "FK", + "GM", + "HN", + "AQ", + "BH", + "MN", + "LS", + "MT", + "SD", + "BI", + "YE", + "AO", + "MO", + "GY", + "CI", + "IN", + "BQ", + "CX", + "VG", + "SI", + "PF", + "PA", + "FO", + "NP", + "EH", + "GR", + "AZ", + "IM", + "LT", + "SB", + "TV", + "AL", + "NA", + "SK", + "GF", + "NI", + "PT", + "SL", + "GN", + "PN", + "LU", + "ME", + "ET", + "AM", + "ZW", + "GE", + "BL", + "CA", + "DE", + "TW", + "GI", + "VN", + "BW", + "FI", + "MK", + "DZ", + "LR", + "VE", + "BM", + "QA", + "UG", + "MW", + "ZA", + "IT", + "RW", + "RS", + "WF", + "PK", + "BG", + "KR", + "HU", + "IQ", + "OM", + "VU", + "KY", + "NO", + "WS", + "CD", + "PM", + "PW", + "US", + "GT", + "LY", + "BB", + "GU", + "GQ", + "KI", + "DK", + "BN", + "FR", + "GD", + "FJ", + "KW", + "SZ", + "FM", + "RE", + "RU", + "TZ", + "SH", + "VC", + "MM", + "BY", + "LK", + "JE", + "MG", + "HR", + "GS", + "GW", + "NR", + "GP", + "ES", + "AE", + "CK", + "EG", + "CZ", + "HK", + "PE", + "CR", + "TO", + "LC", + "IE", + "AR", + "DJ", + "PS", + "HT", + "KZ", + "MS", + "ER", + "NL", + "BE", + "EE", + "ID", + "MC", + "MX", + "NU", + "UM", + "MY", + "AD", + "MH", + "GA", + "MU", + "CL", + "KH", + "MR", + "HM", + "CF", + "LB", + "BZ", + "CU", + "SN", + "BF", + "UZ", + "NG", + "SS", + "AT", + "DO", + "CG", + "TT", + "GL", + "NC", + "SR", + "AW", + "TR", + "MP", + "YT", + "KG", + "NZ", + "NE", + "GB", + "TJ", + "IL", + "CN", + "TF", + "KP", + "MZ", + "MV", + "KN", + "PH", + "PR" + ], + "linkAlternates": [ + { + "hrefUrl": "https://m.youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg" + }, + { + "hrefUrl": "android-app://com.google.android.youtube/http/youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg" + }, + { + "hrefUrl": "ios-app://544007664/http/youtube.com/channel/UCh8gHdtzO2tXd593_bjErWg" + } + ] + } + } +} diff --git a/tests/youtube.rs b/tests/youtube.rs index 0d9e428..4234899 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1175,13 +1175,23 @@ mod channel_rss { #[rstest] fn get_channel_rss_empty(rp: RustyPipe) { - let channel = - tokio_test::block_on(rp.query().channel_rss("UCAyFbMjB3qAQSZBj6NCuBSg")).unwrap(); + let channel = tokio_test::block_on(rp.query().channel_rss("UCAyFbMjB3qAQSZBj6NCuBSg")); - assert_eq!(channel.id, "UCAyFbMjB3qAQSZBj6NCuBSg"); - assert_eq!(channel.name, "Cheryl Calogero"); + match channel { + Ok(channel) => { + assert_eq!(channel.id, "UCAyFbMjB3qAQSZBj6NCuBSg"); + assert_eq!(channel.name, "Cheryl Calogero"); - assert!(channel.videos.is_empty()); + assert!(channel.videos.is_empty()); + } + Err(err) => { + assert!( + matches!(err, Error::Extraction(ExtractionError::NotFound { .. })), + "got: {}", + err + ); + } + } } #[rstest] From 9516eb7e3859a16a6fe36b527b90fb44ca33fa04 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 29 Jan 2024 17:17:16 +0100 Subject: [PATCH 094/459] chore: update A/B test statuses --- notes/AB_Tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index 238a386..fbe5d15 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -396,7 +396,7 @@ a short format (_21h ago_, _3d ago_). - **Encountered on:** 29.06.2023 - **Impact:** 🟡 Medium -- **Status:** Experimental (9%) +- **Status:** Stabilized YouTube added the track playback count to search results and top artist tracks. In exchange, they removed the "Song" type identifier from search results. @@ -448,7 +448,7 @@ the main tab. - **Encountered on:** 03.11.2023 - **Impact:** 🟢 Low - **Endpoint:** next -- **Status:** Experimental (7%) +- **Status:** Stabilized YouTube introduced an updated data model for the like/dislike buttons. The new model looks needlessly complex but contains the same parsing-relevant data as the old model From 0a362f7129370ed2031051589f7027eb53174026 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 29 Jan 2024 18:51:08 +0100 Subject: [PATCH 095/459] fix(tests): dont ignore 404 error on rss feed --- tests/youtube.rs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 4234899..0d9e428 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1175,23 +1175,13 @@ mod channel_rss { #[rstest] fn get_channel_rss_empty(rp: RustyPipe) { - let channel = tokio_test::block_on(rp.query().channel_rss("UCAyFbMjB3qAQSZBj6NCuBSg")); + let channel = + tokio_test::block_on(rp.query().channel_rss("UCAyFbMjB3qAQSZBj6NCuBSg")).unwrap(); - match channel { - Ok(channel) => { - assert_eq!(channel.id, "UCAyFbMjB3qAQSZBj6NCuBSg"); - assert_eq!(channel.name, "Cheryl Calogero"); + assert_eq!(channel.id, "UCAyFbMjB3qAQSZBj6NCuBSg"); + assert_eq!(channel.name, "Cheryl Calogero"); - assert!(channel.videos.is_empty()); - } - Err(err) => { - assert!( - matches!(err, Error::Extraction(ExtractionError::NotFound { .. })), - "got: {}", - err - ); - } - } + assert!(channel.videos.is_empty()); } #[rstest] From b4ee4f3f5f28bf5a865b45bfd1e5e385345f4b79 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 2 Feb 2024 02:58:26 +0100 Subject: [PATCH 096/459] chore: add Gitea Actions workflow --- .gitea/workflows/ci.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .gitea/workflows/ci.yaml diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml new file mode 100644 index 0000000..daa3a9c --- /dev/null +++ b/.gitea/workflows/ci.yaml @@ -0,0 +1,21 @@ +name: CI +on: [push, pull_request] + +jobs: + Test: + runs-on: ubuntu-latest + steps: + - name: 📦 Checkout repository + uses: actions/checkout@v3 + - name: 🦀 Setup Rust + uses: https://github.com/ATiltedTree/setup-rust@v1 + with: + rust-version: stable + components: clippy + - name: 📥 Setup Rust cache + uses: https://github.com/Swatinem/rust-cache@v2 + + - name: 📎 Clippy + run: cargo clippy --all --features=rss -- -D warnings + - name: 🧪 Test + run: cargo test --features=rss --workspace From 709e35e3138a5eaff6a12c10e9540d89066f61a9 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 2 Feb 2024 03:00:09 +0100 Subject: [PATCH 097/459] chore: add Gitea Actions workflow --- .gitea/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index daa3a9c..3bd7197 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -17,5 +17,6 @@ jobs: - name: 📎 Clippy run: cargo clippy --all --features=rss -- -D warnings + - name: 🧪 Test run: cargo test --features=rss --workspace From ac0b687ec43d9761f13e47536939e538f2c34d32 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 2 Feb 2024 03:09:36 +0100 Subject: [PATCH 098/459] chore: cache CI deps on failure --- .gitea/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 3bd7197..6feecec 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -14,6 +14,8 @@ jobs: components: clippy - name: 📥 Setup Rust cache uses: https://github.com/Swatinem/rust-cache@v2 + with: + cache-on-failure: "true" - name: 📎 Clippy run: cargo clippy --all --features=rss -- -D warnings From 571c23f940a6cd3e55c5fd333a708da0afcca4dd Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 2 Feb 2024 03:38:12 +0100 Subject: [PATCH 099/459] chore: fix tests Video ZeerrnuLi5E does not show any recommendations. This is probably temporary, should keep an eye on it. --- tests/youtube.rs | 61 +++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 0d9e428..1fa6ef7 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -454,8 +454,11 @@ fn get_video_details(rp: RustyPipe) { assert!(!details.is_live); assert!(!details.is_ccommons); + /* + As of 01.02.2024 this video does not show any recommendations assert!(details.recommended.visitor_data.is_some()); - assert_next(details.recommended, rp.query(), 10, 1); + assert_next(details.recommended, rp.query(), 10, 1, false); + */ assert_gte(details.top_comments.count.unwrap(), 700_000, "comments"); assert!(!details.top_comments.is_exhausted()); @@ -492,7 +495,7 @@ fn get_video_details_music(rp: RustyPipe) { assert!(!details.is_ccommons); assert!(details.recommended.visitor_data.is_some()); - assert_next(details.recommended, rp.query(), 10, 1); + assert_next(details.recommended, rp.query(), 10, 1, false); // Update(01.11.2022): comments are sometimes enabled /* @@ -539,7 +542,7 @@ fn get_video_details_ccommons(rp: RustyPipe) { assert!(details.is_ccommons); assert!(details.recommended.visitor_data.is_some()); - assert_next(details.recommended, rp.query(), 10, 1); + assert_next(details.recommended, rp.query(), 10, 1, false); assert_eq!(details.top_comments.count.unwrap(), 0); assert!(details.top_comments.is_exhausted()); @@ -662,7 +665,7 @@ fn get_video_details_chapters(rp: RustyPipe) { } assert!(details.recommended.visitor_data.is_some()); - assert_next(details.recommended, rp.query(), 10, 1); + assert_next(details.recommended, rp.query(), 10, 1, false); assert_gte(details.top_comments.count.unwrap(), 3000, "comments"); assert!(!details.top_comments.is_exhausted()); @@ -705,7 +708,7 @@ fn get_video_details_live(rp: RustyPipe) { assert!(!details.is_ccommons); assert!(details.recommended.visitor_data.is_some()); - assert_next(details.recommended, rp.query(), 10, 1); + assert_next(details.recommended, rp.query(), 10, 1, false); // No comments because livestream assert_eq!(details.top_comments.count, Some(0)); @@ -823,7 +826,7 @@ fn channel_videos(rp: RustyPipe) { assert!(age_days < 60, "latest video older than 60 days"); - assert_next(channel.content, rp.query(), 15, 2); + assert_next(channel.content, rp.query(), 15, 2, true); } #[rstest] @@ -857,7 +860,7 @@ fn channel_shorts(rp: RustyPipe) { "got no shorts" ); - assert_next(channel.content, rp.query(), 15, 1); + assert_next(channel.content, rp.query(), 15, 1, true); } #[rstest] @@ -876,7 +879,7 @@ fn channel_livestreams(rp: RustyPipe) { "got no streams" ); - assert_next(channel.content, rp.query(), 5, 1); + assert_next(channel.content, rp.query(), 5, 1, true); } #[rstest] @@ -891,7 +894,7 @@ fn channel_playlists(rp: RustyPipe) { "got no playlists" ); - assert_next(channel.content, rp.query(), 15, 1); + assert_next(channel.content, rp.query(), 15, 1, true); } #[rstest] @@ -932,7 +935,7 @@ fn channel_search(rp: RustyPipe) { .unwrap(); assert_channel_eevblog(&channel); - assert_next(channel.content, rp.query(), 20, 2); + assert_next(channel.content, rp.query(), 20, 2, true); } fn assert_channel_eevblog(channel: &Channel) { @@ -1029,7 +1032,7 @@ fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: Rust } } } - assert_next(latest, rp.query(), 15, 1); + assert_next(latest, rp.query(), 15, 1, true); } #[rstest] @@ -1067,7 +1070,7 @@ fn channel_order_popular( ); } } - assert_next(popular, rp.query(), 15, 1); + assert_next(popular, rp.query(), 15, 1, true); } #[rstest] @@ -1100,7 +1103,7 @@ fn channel_order_oldest( ); } } - assert_next(videos, rp.query(), 15, 1); + assert_next(videos, rp.query(), 15, 1, true); } #[rstest] @@ -1213,7 +1216,7 @@ fn search(rp: RustyPipe, unlocalized: bool) { assert_eq!(result.corrected_query.unwrap(), "doobydobap"); } - assert_next(result.items, rp.query(), 10, 2); + assert_next(result.items, rp.query(), 10, 2, true); } #[rstest] @@ -1273,7 +1276,7 @@ fn search_sensitive(rp: RustyPipe, #[case] filter: bool) { } .unwrap(); assert_gte(result.items.count.unwrap(), 10_000, "results"); - assert_next(result.items, rp.query(), 10, 2); + assert_next(result.items, rp.query(), 10, 2, true); } #[rstest] @@ -1363,7 +1366,7 @@ fn startpage(rp: RustyPipe) { // The startpage requires visitor data to fetch continuations assert!(startpage.visitor_data.is_some()); - assert_next(startpage, rp.query(), 8, 2); + assert_next(startpage, rp.query(), 8, 2, true); } #[rstest] @@ -1811,7 +1814,7 @@ fn music_search_tracks(rp: RustyPipe, unlocalized: bool) { assert_eq!(album.id, "MPREb_OpHWHwyNOuY"); assert_eq!(album.name, "Black Mamba"); - assert_next(res.items, rp.query(), 15, 2); + assert_next(res.items, rp.query(), 15, 2, true); } #[rstest] @@ -1846,7 +1849,7 @@ fn music_search_videos(rp: RustyPipe, unlocalized: bool) { assert_eq!(track.album, None); assert_gte(track.view_count.unwrap(), 230_000_000, "views"); - assert_next(res.items, rp.query(), 15, 2); + assert_next(res.items, rp.query(), 15, 2, true); } #[rstest] @@ -1973,7 +1976,7 @@ fn music_search_albums( assert_eq!(res.corrected_query, None); if more && unlocalized { - assert_next(res.items, rp.query(), 15, 1); + assert_next(res.items, rp.query(), 15, 1, true); } } @@ -2006,7 +2009,7 @@ fn music_search_artists_cont(rp: RustyPipe) { let res = tokio_test::block_on(rp.query().music_search_artists("band")).unwrap(); assert_eq!(res.corrected_query, None); - assert_next(res.items, rp.query(), 15, 2); + assert_next(res.items, rp.query(), 15, 2, true); } #[rstest] @@ -2341,12 +2344,19 @@ fn music_charts( ) { let charts = tokio_test::block_on(rp.query().music_charts(Some(country))).unwrap(); - assert_eq!(charts.top_playlist_id.unwrap(), plid_top); - assert_eq!(charts.trending_playlist_id.unwrap(), plid_trend); + assert_eq!(charts.top_playlist_id.expect("top_playlist_id"), plid_top); assert_gte(charts.top_tracks.len(), 30, "top tracks"); assert_gte(charts.artists.len(), 30, "top artists"); - assert_gte(charts.trending_tracks.len(), 15, "trending tracks"); + + // Currently (01.02.2024) is no trending playlist shown for Global and US + if country != Country::Us { + assert_eq!( + charts.trending_playlist_id.expect("trending_playlist_id"), + plid_trend + ); + assert_gte(charts.trending_tracks.len(), 15, "trending tracks"); + } // Chart playlists only available in USA if country == Country::Us { @@ -2569,10 +2579,13 @@ fn assert_next>( query: Q, min_items: usize, n_pages: usize, + on_first: bool, ) { let mut p = paginator; let query = query.as_ref(); - assert_gte(p.items.len(), min_items, "items on page 0"); + if on_first { + assert_gte(p.items.len(), min_items, "items on page 0"); + } for i in 0..n_pages { p = tokio_test::block_on(p.next(query)) From 92c46424ca5abfc241ba127554310986a7f10e44 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 2 Feb 2024 11:50:12 +0100 Subject: [PATCH 100/459] tests: add back recommended videos assertion YouTube video recommendations display normally again, there was probably a temporary outage. --- tests/youtube.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 1fa6ef7..b298a52 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -454,11 +454,8 @@ fn get_video_details(rp: RustyPipe) { assert!(!details.is_live); assert!(!details.is_ccommons); - /* - As of 01.02.2024 this video does not show any recommendations assert!(details.recommended.visitor_data.is_some()); assert_next(details.recommended, rp.query(), 10, 1, false); - */ assert_gte(details.top_comments.count.unwrap(), 700_000, "comments"); assert!(!details.top_comments.is_exhausted()); From bb41a71eef00b33e47ab24ab022fe6734ba506d6 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 6 Feb 2024 13:25:52 +0100 Subject: [PATCH 101/459] tests: update get_video_details_no_desc test video (got taken down), update German trending playlist --- tests/youtube.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index b298a52..cee130b 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -749,12 +749,15 @@ fn get_video_details_agegate(rp: RustyPipe) { #[rstest] fn get_video_details_no_desc(rp: RustyPipe) { - let details = tokio_test::block_on(rp.query().video_details("VYJNSQ_ANyA")).unwrap(); + let details = tokio_test::block_on(rp.query().video_details("BXpTGEEZpV8")).unwrap(); - assert_eq!(details.id, "VYJNSQ_ANyA"); - assert_eq!(details.name, "Cricket comedy by Modi"); - assert_eq!(details.channel.id, "UC8gBy2lByHxIyoPMglerNWg"); - assert_eq!(details.channel.name, "TMP Mix Veg"); + assert_eq!(details.id, "BXpTGEEZpV8"); + assert_eq!( + details.name, + "The Streets Make Me Feel Alive Stitches Official Audio" + ); + assert_eq!(details.channel.id, "UC3oJqv3NXiHkBVUW4i9R_pQ"); + assert_eq!(details.channel.name, "Test Upload channel"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert!( @@ -764,7 +767,7 @@ fn get_video_details_no_desc(rp: RustyPipe) { ); let date = details.publish_date.unwrap(); - assert_eq!(date.date(), date!(2023 - 11 - 21)); + assert_eq!(date.date(), date!(2017 - 4 - 28)); assert!(!details.is_live); assert!(!details.is_ccommons); @@ -2326,7 +2329,7 @@ fn music_radio_not_found(rp: RustyPipe) { #[case::de( Country::De, "PL4fGSI1pDJn4X-OicSCOy-dChXWdTgziQ", - "PL0sHkSjKd2rpxgOMD-vlUlIDqvQ5ChYJh" + "OLAK5uy_nPQBmQpOIYYxuvYW4gIHsjgDqX9kc--Dg" )] #[case::us( Country::Us, From 3b28121fdbb8993a295038b5f8de516fc89b6f74 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Sat, 10 Feb 2024 18:26:41 +0100 Subject: [PATCH 102/459] tests: update album snapshot --- tests/snapshots/youtube__music_album_unavailable.snap | 8 ++------ .../snapshots/youtube__music_album_unavailable_intl.snap | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/snapshots/youtube__music_album_unavailable.snap b/tests/snapshots/youtube__music_album_unavailable.snap index 57bcba2..1ae3a45 100644 --- a/tests/snapshots/youtube__music_album_unavailable.snap +++ b/tests/snapshots/youtube__music_album_unavailable.snap @@ -265,15 +265,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), + id: Some("UCCu_bk4x0KOg4NnCKoerDaw"), name: "Brendan Angelides", ), - ArtistId( - id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"), - name: "Eskmo", - ), ], - artist_id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), + artist_id: Some("UCCu_bk4x0KOg4NnCKoerDaw"), album: Some(AlbumId( id: "MPREb_AzuWg8qAVVl", name: "13 Reasons Why (Season 3)", diff --git a/tests/snapshots/youtube__music_album_unavailable_intl.snap b/tests/snapshots/youtube__music_album_unavailable_intl.snap index 36c8a58..b41f826 100644 --- a/tests/snapshots/youtube__music_album_unavailable_intl.snap +++ b/tests/snapshots/youtube__music_album_unavailable_intl.snap @@ -265,15 +265,11 @@ MusicAlbum( cover: [], artists: [ ArtistId( - id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), - name: "[name]", - ), - ArtistId( - id: Some("UC4YvDAbE1EYwZpj6gQ-lpLw"), + id: Some("UCCu_bk4x0KOg4NnCKoerDaw"), name: "[name]", ), ], - artist_id: Some("UCRBHsrbsZDxjHkcgMKEJwpw"), + artist_id: Some("UCCu_bk4x0KOg4NnCKoerDaw"), album: Some(AlbumId( id: "MPREb_AzuWg8qAVVl", name: "[name]", From 6589016684c0a81c0ec36efcdccd05313a58b195 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 13 Feb 2024 14:24:11 +0100 Subject: [PATCH 103/459] tests: update lyrics --- tests/snapshots/youtube__music_lyrics.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/snapshots/youtube__music_lyrics.snap b/tests/snapshots/youtube__music_lyrics.snap index 02bb86a..59748f9 100644 --- a/tests/snapshots/youtube__music_lyrics.snap +++ b/tests/snapshots/youtube__music_lyrics.snap @@ -2,4 +2,4 @@ source: tests/youtube.rs expression: lyrics.body --- -"Eyes, in the sky, gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby let the light shine through\nIf you believe it\'s true\nBaby won\'t you let the light shine through\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nWon\'t you let the light shine through\n\nEyes, in the sky, gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby let the light shine through\nIf you believe it\'s true\nBaby won\'t you let the light shine through\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you" +"Eyes, in the sky, gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby, let the light shine through\nIf you believe, it\'s true\nBaby, won\'t you let the light shine through\nFor you?\nFor you\nFor you\n\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nWon\'t you let the light shine through?\n\nEyes, in the sky, gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby, let the light shine through\nIf you believe it\'s true\nBaby, won\'t you let the light shine through\nFor you\nFor you\n\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you" From 8950c3bd0499c48f6581e39180f8eea7157de94a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 13 Feb 2024 15:17:50 +0100 Subject: [PATCH 104/459] tests: remove unnecessary unwraps, improve assert functions --- tests/youtube.rs | 225 +++++++++++++++++++++-------------------------- 1 file changed, 101 insertions(+), 124 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index cee130b..359deb7 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -43,7 +43,11 @@ fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { if client_type == ClientType::DesktopMusic { assert!(player_data.details.description.is_none()); } else { - assert!(player_data.details.description.unwrap().contains( + assert!(player_data + .details + .description + .expect("description") + .contains( "NCS (NoCopyrightSounds): Empowering Creators through Copyright / Royalty Free Music" )); } @@ -60,17 +64,17 @@ fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { .video_only_streams .into_iter() .find(|s| s.itag == 247) - .unwrap(); + .expect("video #247"); let audio = player_data .audio_streams .into_iter() .find(|s| s.itag == 140) - .unwrap(); + .expect("audio #140"); // Bitrates may change between requests assert_approx(f64::from(video.bitrate), 1_851_854.0); assert_eq!(video.average_bitrate, 923_766); - assert_eq!(video.size.unwrap(), 29_909_835); + assert_eq!(video.size, Some(29_909_835)); assert_eq!(video.width, 1280); assert_eq!(video.height, 720); assert_eq!(video.fps, 30); @@ -103,7 +107,7 @@ fn get_player_from_client(#[case] client_type: ClientType, rp: RustyPipe) { assert_approx(f64::from(video.bitrate), 1_340_829.0); assert_approx(f64::from(video.average_bitrate), 1_046_557.0); - assert_approx(video.size.unwrap() as f64, 33_885_572.0); + assert_approx(video.size.expect("video size") as f64, 33_885_572.0); assert_eq!(video.width, 1280); assert_eq!(video.height, 720); assert_eq!(video.fps, 30); @@ -139,7 +143,7 @@ fn check_video_stream(s: impl YtStream) { .unwrap(); if let Some(size) = s.size() { - assert_eq!(resp.content_length().unwrap(), size) + assert_eq!(resp.content_length(), Some(size)) } } @@ -228,7 +232,7 @@ fn get_player( assert_eq!(details.id, id); assert_eq!(details.name, name); - let desc = details.description.unwrap(); + let desc = details.description.expect("description"); assert!(desc.contains(description), "description: {desc}"); assert_eq!(details.length, length); assert_eq!(details.channel.id, channel_id); @@ -382,7 +386,7 @@ fn get_playlist( assert_eq!(playlist.description, description); if let Some(expect) = channel { - let c = playlist.channel.unwrap(); + let c = playlist.channel.expect("channel"); assert_eq!(c.id, expect.0); assert_eq!(c.name, expect.1); } @@ -395,8 +399,8 @@ fn playlist_cont(rp: RustyPipe) { tokio_test::block_on(rp.query().playlist("PLbZIPy20-1pN7mqjckepWF78ndb6ci_qi")).unwrap(); tokio_test::block_on(playlist.videos.extend_pages(rp.query(), usize::MAX)).unwrap(); - assert!(playlist.videos.items.len() > 100); - assert!(playlist.videos.count.unwrap() > 100); + assert_gte(playlist.videos.items.len(), 101, "video items"); + assert_gteo(playlist.videos.count, 101, "video count"); } #[rstest] @@ -405,8 +409,8 @@ fn playlist_cont2(rp: RustyPipe) { tokio_test::block_on(rp.query().playlist("PLbZIPy20-1pN7mqjckepWF78ndb6ci_qi")).unwrap(); tokio_test::block_on(playlist.videos.extend_limit(rp.query(), 101)).unwrap(); - assert!(playlist.videos.items.len() > 100); - assert!(playlist.videos.count.unwrap() > 100); + assert_gte(playlist.videos.items.len(), 101, "video items"); + assert_gteo(playlist.videos.count, 101, "video count"); } #[rstest] @@ -440,15 +444,11 @@ fn get_video_details(rp: RustyPipe) { assert_eq!(details.channel.name, "SMTOWN"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::Verified); - assert_gte( - details.channel.subscriber_count.unwrap(), - 30_000_000, - "subscribers", - ); + assert_gteo(details.channel.subscriber_count, 30_000_000, "subscribers"); assert_gte(details.view_count, 232_000_000, "views"); - assert_gte(details.like_count.unwrap(), 4_000_000, "likes"); + assert_gteo(details.like_count, 4_000_000, "likes"); - let date = details.publish_date.unwrap(); + let date = details.publish_date.expect("publish_date"); assert_eq!(date.date(), date!(2020 - 11 - 17)); assert!(!details.is_live); @@ -457,7 +457,7 @@ fn get_video_details(rp: RustyPipe) { assert!(details.recommended.visitor_data.is_some()); assert_next(details.recommended, rp.query(), 10, 1, false); - assert_gte(details.top_comments.count.unwrap(), 700_000, "comments"); + assert_gteo(details.top_comments.count, 700_000, "comments"); assert!(!details.top_comments.is_exhausted()); assert!(!details.latest_comments.is_exhausted()); } @@ -477,13 +477,9 @@ fn get_video_details_music(rp: RustyPipe) { assert_eq!(details.channel.name, "Sentamusic"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::Artist); - assert_gte( - details.channel.subscriber_count.unwrap(), - 33_000, - "subscribers", - ); + assert_gteo(details.channel.subscriber_count, 33_000, "subscribers"); assert_gte(details.view_count, 20_309, "views"); - assert_gte(details.like_count.unwrap(), 145, "likes"); + assert_gteo(details.like_count, 145, "likes"); let date = details.publish_date.unwrap(); assert_eq!(date.date(), date!(2020 - 8 - 6)); @@ -524,15 +520,11 @@ fn get_video_details_ccommons(rp: RustyPipe) { assert_eq!(details.channel.name, "media.ccc.de"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::None); - assert_gte( - details.channel.subscriber_count.unwrap(), - 170_000, - "subscribers", - ); + assert_gteo(details.channel.subscriber_count, 170_000, "subscribers"); assert_gte(details.view_count, 2_517_358, "views"); - assert_gte(details.like_count.unwrap(), 52_330, "likes"); + assert_gteo(details.like_count, 52_330, "likes"); - let date = details.publish_date.unwrap(); + let date = details.publish_date.expect("publish_date"); assert_eq!(date.date(), date!(2019 - 12 - 29)); assert!(!details.is_live); @@ -564,15 +556,11 @@ fn get_video_details_chapters(rp: RustyPipe) { assert_eq!(details.channel.name, "Linus Tech Tips"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::Verified); - assert_gte( - details.channel.subscriber_count.unwrap(), - 14_700_000, - "subscribers", - ); + assert_gteo(details.channel.subscriber_count, 14_700_000, "subscribers"); assert_gte(details.view_count, 1_157_262, "views"); - assert_gte(details.like_count.unwrap(), 54_670, "likes"); + assert_gteo(details.like_count, 54_670, "likes"); - let date = details.publish_date.unwrap(); + let date = details.publish_date.expect("publish_date"); assert_eq!(date.date(), date!(2022 - 9 - 15)); assert!(!details.is_live); @@ -664,7 +652,7 @@ fn get_video_details_chapters(rp: RustyPipe) { assert!(details.recommended.visitor_data.is_some()); assert_next(details.recommended, rp.query(), 10, 1, false); - assert_gte(details.top_comments.count.unwrap(), 3000, "comments"); + assert_gteo(details.top_comments.count, 3000, "comments"); assert!(!details.top_comments.is_exhausted()); assert!(!details.latest_comments.is_exhausted()); } @@ -690,15 +678,11 @@ fn get_video_details_live(rp: RustyPipe) { assert_eq!(details.channel.name, "Lofi Girl"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::Verified); - assert_gte( - details.channel.subscriber_count.unwrap(), - 5_500_000, - "subscribers", - ); + assert_gteo(details.channel.subscriber_count, 5_500_000, "subscribers"); assert_gte(details.view_count, 100, "views"); - assert_gte(details.like_count.unwrap(), 1_800_000, "likes"); + assert_gteo(details.like_count, 1_800_000, "likes"); - let date = details.publish_date.unwrap(); + let date = details.publish_date.expect("publish_date"); assert_eq!(date.date(), date!(2022 - 7 - 12)); assert!(details.is_live); @@ -728,15 +712,11 @@ fn get_video_details_agegate(rp: RustyPipe) { assert_eq!(details.channel.name, "Summerfield Records"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert_eq!(details.channel.verification, Verification::Verified); - assert_gte( - details.channel.subscriber_count.unwrap(), - 250_000, - "subscribers", - ); + assert_gteo(details.channel.subscriber_count, 250_000, "subscribers"); assert_gte(details.view_count, 10_000_000, "views"); - assert_gte(details.like_count.unwrap(), 150_000, "likes"); + assert_gteo(details.like_count, 150_000, "likes"); - let date = details.publish_date.unwrap(); + let date = details.publish_date.expect("publish_date"); assert_eq!(date.date(), date!(2022 - 5 - 13)); assert!(!details.is_live); @@ -766,7 +746,7 @@ fn get_video_details_no_desc(rp: RustyPipe) { details.description.to_plaintext() ); - let date = details.publish_date.unwrap(); + let date = details.publish_date.expect("publish_date"); assert_eq!(date.date(), date!(2017 - 4 - 28)); assert!(!details.is_live); @@ -794,8 +774,7 @@ fn get_video_comments(rp: RustyPipe) { assert!(!top_comments.is_exhausted()); assert!(top_comments.visitor_data.is_some()); - let n_comments = top_comments.count.unwrap(); - assert_gte(n_comments, 700_000, "comments"); + assert_gteo(top_comments.count, 700_000, "comments"); let latest_comments = tokio_test::block_on(details.latest_comments.next(rp.query())) .unwrap() @@ -841,15 +820,15 @@ fn channel_shorts(rp: RustyPipe) { // dbg!(&channel); assert_eq!(channel.id, "UCh8gHdtzO2tXd593_bjErWg"); assert_eq!(channel.name, "Doobydobap"); - assert_gte(channel.subscriber_count.unwrap(), 2_800_000, "subscribers"); + assert_gteo(channel.subscriber_count, 2_800_000, "subscribers"); assert!(!channel.avatar.is_empty(), "got no thumbnails"); assert_eq!(channel.verification, Verification::Verified); assert!(channel .description .contains("Hi, I\u{2019}m Tina, aka Doobydobap")); assert_eq!( - channel.vanity_url.as_ref().unwrap(), - "https://www.youtube.com/@Doobydobap" + channel.vanity_url.as_deref(), + Some("https://www.youtube.com/@Doobydobap") ); assert!(!channel.banner.is_empty(), "got no banners"); assert!(!channel.mobile_banner.is_empty(), "got no mobile banners"); @@ -901,11 +880,11 @@ fn channel_playlists(rp: RustyPipe) { fn channel_info(rp: RustyPipe) { let info = tokio_test::block_on(rp.query().channel_info("UC2DjFE7Xf11URZqWBigcVOQ")).unwrap(); - assert_eq!(info.create_date.unwrap(), date!(2009 - 4 - 4)); - assert_gte(info.view_count.unwrap(), 186_854_340, "channel views"); - assert_gte(info.video_count.unwrap(), 1920, "channel videos"); - assert_gte(info.subscriber_count.unwrap(), 920_000, "subscribers"); - assert_eq!(info.country.unwrap(), Country::Au); + assert_eq!(info.create_date, Some(date!(2009 - 4 - 4))); + assert_gteo(info.view_count, 186_854_340, "channel views"); + assert_gteo(info.video_count, 1920, "channel videos"); + assert_gteo(info.subscriber_count, 920_000, "subscribers"); + assert_eq!(info.country, Some(Country::Au)); insta::assert_ron_snapshot!(info.links, @r###" [ @@ -941,14 +920,14 @@ fn channel_search(rp: RustyPipe) { fn assert_channel_eevblog(channel: &Channel) { assert_eq!(channel.id, "UC2DjFE7Xf11URZqWBigcVOQ"); assert_eq!(channel.name, "EEVblog"); - assert_gte(channel.subscriber_count.unwrap(), 880_000, "subscribers"); + assert_gteo(channel.subscriber_count, 880_000, "subscribers"); assert!(!channel.avatar.is_empty(), "got no thumbnails"); assert_eq!(channel.verification, Verification::Verified); assert_eq!(channel.description, "NO SCRIPT, NO FEAR, ALL OPINION\nAn off-the-cuff Video Blog about Electronics Engineering, for engineers, hobbyists, enthusiasts, hackers and Makers\nHosted by Dave Jones from Sydney Australia\n\nDONATIONS:\nBitcoin: 3KqyH1U3qrMPnkLufM2oHDU7YB4zVZeFyZ\nEthereum: 0x99ccc4d2654ba40744a1f678d9868ecb15e91206\nPayPal: david@alternatezone.com\n\nPatreon: https://www.patreon.com/eevblog\n\nEEVblog2: http://www.youtube.com/EEVblog2\nEEVdiscover: https://www.youtube.com/channel/UCkGvUEt8iQLmq3aJIMjT2qQ\n\nEMAIL:\nAdvertising/Commercial: eevblog+business@gmail.com\nFan mail: eevblog+fan@gmail.com\nHate Mail: eevblog+hate@gmail.com\n\nI DON'T DO PAID VIDEO SPONSORSHIPS, DON'T ASK!\n\nPLEASE:\nDo NOT ask for personal advice on something, post it in the EEVblog forum.\nI read ALL email, but please don't be offended if I don't have time to reply, I get a LOT of email.\n\nMailbag\nPO Box 7949\nBaulkham Hills NSW 2153\nAUSTRALIA"); assert!(!channel.tags.is_empty(), "got no tags"); assert_eq!( - channel.vanity_url.as_ref().unwrap(), - "https://www.youtube.com/@EEVblog" + channel.vanity_url.as_deref(), + Some("https://www.youtube.com/@EEVblog") ); assert!(!channel.banner.is_empty(), "got no banners"); assert!(!channel.mobile_banner.is_empty(), "got no mobile banners"); @@ -1025,8 +1004,8 @@ fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: Rust while let (Some(v), Some(next_v)) = (latest_items.next(), latest_items.peek()) { if !v.is_upcoming && !v.is_live && !next_v.is_upcoming && !next_v.is_live { assert_gte( - v.publish_date.unwrap(), - next_v.publish_date.unwrap(), + v.publish_date.expect("publish_date"), + next_v.publish_date.expect("publish_date"), "latest video date", ); } @@ -1062,10 +1041,10 @@ fn channel_order_popular( if tab != ChannelVideoTab::Shorts { let mut popular_items = popular.items.iter().peekable(); while let (Some(v), Some(next_v)) = (popular_items.next(), popular_items.peek()) { - let vc = v.view_count.unwrap(); + let vc = v.view_count.expect("views"); assert_gte( vc + (vc as f64 * 0.05) as u64, - next_v.view_count.unwrap(), + next_v.view_count.expect("views"), "most popular view count", ); } @@ -1097,8 +1076,8 @@ fn channel_order_oldest( while let (Some(v), Some(next_v)) = (latest_items.next(), latest_items.peek()) { if !v.is_upcoming && !v.is_live && !next_v.is_upcoming && !next_v.is_live { assert_gte( - next_v.publish_date.unwrap(), - v.publish_date.unwrap(), + next_v.publish_date.expect("publish_date"), + v.publish_date.expect("publish_date"), "oldest video date", ); } @@ -1206,14 +1185,14 @@ mod channel_rss { fn search(rp: RustyPipe, unlocalized: bool) { let result = tokio_test::block_on(rp.query().search::("doobydoobap")).unwrap(); - assert_gte( - result.items.count.unwrap(), + assert_gteo( + result.items.count, if unlocalized { 7000 } else { 150 }, "results", ); if unlocalized { - assert_eq!(result.corrected_query.unwrap(), "doobydobap"); + assert_eq!(result.corrected_query.as_deref(), Some("doobydobap")); } assert_next(result.items, rp.query(), 10, 2, true); @@ -1275,7 +1254,7 @@ fn search_sensitive(rp: RustyPipe, #[case] filter: bool) { tokio_test::block_on(rp.query().search::(q)) } .unwrap(); - assert_gte(result.items.count.unwrap(), 10_000, "results"); + assert_gteo(result.items.count, 10_000, "results"); assert_next(result.items, rp.query(), 10, 2, true); } @@ -1418,8 +1397,8 @@ fn music_playlist( assert_eq!(playlist.id, id); assert!(!playlist.tracks.is_empty()); assert_eq!(!playlist.tracks.is_exhausted(), is_long); - assert_gte( - playlist.track_count.unwrap(), + assert_gteo( + playlist.track_count, if is_long { 100 } else { 10 }, "track count", ); @@ -1429,7 +1408,7 @@ fn music_playlist( } if let Some(expect) = channel { - let c = playlist.channel.unwrap(); + let c = playlist.channel.expect("channel"); assert_eq!(c.id, expect.0); assert_eq!(c.name, expect.1); } @@ -1561,7 +1540,7 @@ fn music_artist( assert!(artist.similar_artists.is_empty()); assert!(artist.subscriber_count.is_none()); } else { - assert_gte(artist.subscriber_count.unwrap(), 10_000, "subscribers"); + assert_gteo(artist.subscriber_count, 10_000, "subscribers"); } artist.tracks.iter().for_each(|t| { @@ -1674,7 +1653,10 @@ fn music_search_main(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { if typo { if unlocalized { - assert_eq!(res.corrected_query.unwrap(), "lieblingsmensch namika"); + assert_eq!( + res.corrected_query.as_deref(), + Some("lieblingsmensch namika") + ); } } else { assert_eq!(res.corrected_query, None); @@ -1698,20 +1680,17 @@ fn music_search_main(#[case] typo: bool, rp: RustyPipe, unlocalized: bool) { }); assert_eq!(track.name, "Lieblingsmensch"); - assert_eq!(track.duration.unwrap(), 191); + assert_eq!(track.duration, Some(191)); assert!(!track.cover.is_empty(), "got no cover"); assert_eq!(track.artists.len(), 1); let track_artist = &track.artists[0]; - assert_eq!( - track_artist.id.as_ref().unwrap(), - "UCIh4j8fXWf2U0ro0qnGU8Mg" - ); + assert_eq!(track_artist.id.as_deref(), Some("UCIh4j8fXWf2U0ro0qnGU8Mg")); if unlocalized { assert_eq!(track_artist.name, "Namika"); } - let track_album = track.album.as_ref().unwrap(); + let track_album = track.album.as_ref().expect("track_album"); assert_eq!(track_album.id, "MPREb_RXHxrUFfrvQ"); assert_eq!(track_album.name, "Lieblingsmensch"); @@ -1800,17 +1779,14 @@ fn music_search_tracks(rp: RustyPipe, unlocalized: bool) { assert_eq!(track.artists.len(), 1); let track_artist = &track.artists[0]; - assert_eq!( - track_artist.id.as_ref().unwrap(), - "UCEdZAdnnKqbaHOlv8nM6OtA" - ); + assert_eq!(track_artist.id.as_deref(), Some("UCEdZAdnnKqbaHOlv8nM6OtA")); if unlocalized { assert_eq!(track_artist.name, "aespa"); } - assert_eq!(track.duration.unwrap(), 175); + assert_eq!(track.duration, Some(175)); - let album = track.album.as_ref().unwrap(); + let album = track.album.as_ref().expect("track_album"); assert_eq!(album.id, "MPREb_OpHWHwyNOuY"); assert_eq!(album.name, "Black Mamba"); @@ -1837,17 +1813,14 @@ fn music_search_videos(rp: RustyPipe, unlocalized: bool) { assert_eq!(track.artists.len(), 1); let track_artist = &track.artists[0]; - assert_eq!( - track_artist.id.as_ref().unwrap(), - "UCEdZAdnnKqbaHOlv8nM6OtA" - ); + assert_eq!(track_artist.id.as_deref(), Some("UCEdZAdnnKqbaHOlv8nM6OtA")); if unlocalized { assert_eq!(track_artist.name, "aespa"); } - assert_eq!(track.duration.unwrap(), 230); + assert_eq!(track.duration, Some(230)); assert_eq!(track.album, None); - assert_gte(track.view_count.unwrap(), 230_000_000, "views"); + assert_gteo(track.view_count, 230_000_000, "views"); assert_next(res.items, rp.query(), 15, 2, true); } @@ -1894,14 +1867,8 @@ fn music_search_episode(rp: RustyPipe, #[case] videos: bool) { "Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1" ); assert_eq!(track_artist.name, "BLOND_OFFICIAL"); - assert_eq!( - track_artist.id.as_ref().unwrap(), - "UC8SmM4bue6bKHT4p-_YFZHQ" - ); - assert_eq!( - track.artist_id.as_ref().unwrap(), - "UC8SmM4bue6bKHT4p-_YFZHQ" - ); + assert_eq!(track_artist.id.as_deref(), Some("UC8SmM4bue6bKHT4p-_YFZHQ")); + assert_eq!(track.artist_id.as_deref(), Some("UC8SmM4bue6bKHT4p-_YFZHQ")); assert!(!track.cover.is_empty(), "got no cover"); assert!(track.is_video); } @@ -1970,7 +1937,7 @@ fn music_search_albums( assert_eq!(album.artist_id.as_ref().expect("artist_id"), artist_id); assert!(!album.cover.is_empty(), "got no cover"); - assert_eq!(album.year.as_ref().unwrap(), &year); + assert_eq!(album.year, Some(year)); assert_eq!(album.album_type, album_type); assert_eq!(res.corrected_query, None); @@ -1996,11 +1963,7 @@ fn music_search_artists(rp: RustyPipe, unlocalized: bool) { assert_eq!(artist.name, "Namika"); } assert!(!artist.avatar.is_empty(), "got no avatar"); - assert!( - artist.subscriber_count.unwrap() > 735_000, - "expected >735K subscribers, got {}", - artist.subscriber_count.unwrap() - ); + assert_gteo(artist.subscriber_count, 735_000, "subscribers"); assert_eq!(res.corrected_query, None); } @@ -2034,7 +1997,7 @@ fn music_search_playlists(rp: RustyPipe, unlocalized: bool) { assert_eq!(playlist.name, "Massive Rock Hits"); } assert!(!playlist.thumbnail.is_empty(), "got no thumbnail"); - assert_gte(playlist.track_count.unwrap(), 40, "tracks"); + assert_gteo(playlist.track_count, 40, "tracks"); assert_eq!(playlist.channel, None); assert!(playlist.from_ytm); @@ -2123,7 +2086,7 @@ fn music_details(#[case] name: &str, #[case] id: &str, rp: RustyPipe) { assert!(!track.track.cover.is_empty(), "got no cover"); if name == "mv" { - assert_gte(track.track.view_count.unwrap(), 235_000_000, "view count"); + assert_gteo(track.track.view_count, 235_000_000, "view count"); } else { assert!(track.track.view_count.is_none()); } @@ -2183,7 +2146,7 @@ fn music_related(#[case] id: &str, #[case] full: bool, rp: RustyPipe) { track_artist_ids += 1; } - let artist = track.artists.first().unwrap(); + let artist = track.artists.first().expect("track_artist"); assert!(!artist.name.is_empty()); if let Some(artist_id) = &artist.id { validate::channel_id(artist_id).unwrap(); @@ -2192,7 +2155,7 @@ fn music_related(#[case] id: &str, #[case] full: bool, rp: RustyPipe) { if track.is_video { assert!(track.album.is_none()); - assert_gte(track.view_count.unwrap(), 10_000, "views") + assert_gteo(track.view_count, 10_000, "views") } else { n_tracks_ytm += 1; @@ -2219,8 +2182,8 @@ fn music_related(#[case] id: &str, #[case] full: bool, rp: RustyPipe) { assert!(!album.name.is_empty()); assert!(!album.cover.is_empty(), "got no cover"); - let artist = album.artists.first().unwrap(); - validate::channel_id(artist.id.as_ref().unwrap()).unwrap(); + let artist = album.artists.first().expect("album artist"); + validate::channel_id(artist.id.as_ref().expect("artist id")).unwrap(); assert!(!artist.name.is_empty()); } @@ -2229,7 +2192,7 @@ fn music_related(#[case] id: &str, #[case] full: bool, rp: RustyPipe) { validate::channel_id(&artist.id).unwrap(); assert!(!artist.name.is_empty()); assert!(!artist.avatar.is_empty(), "got no avatar"); - assert_gte(artist.subscriber_count.unwrap(), 5000, "subscribers") + assert_gteo(artist.subscriber_count, 5000, "subscribers") } assert_gte(related.playlists.len(), 10, "playlists"); @@ -2247,7 +2210,7 @@ fn music_related(#[case] id: &str, #[case] full: bool, rp: RustyPipe) { "pl: {}, got no channel", playlist.id ); - let channel = playlist.channel.unwrap(); + let channel = playlist.channel.expect("playlist channel"); validate::channel_id(&channel.id).unwrap(); assert!(!channel.name.is_empty()); } else { @@ -2558,6 +2521,7 @@ fn rp_visitor_data(vdata: &str) -> RustyPipe { } /// Assert equality within 10% margin +#[track_caller] fn assert_approx(left: f64, right: f64) { if left != right { let f = left / right; @@ -2569,11 +2533,22 @@ fn assert_approx(left: f64, right: f64) { } /// Assert that number A is greater than or equal to number B +#[track_caller] fn assert_gte(a: T, b: T, msg: &str) { assert!(a >= b, "expected >= {b} {msg}, got {a}"); } +/// Assert that optional number A is greater than or equal to number B +#[track_caller] +fn assert_gteo(a: Option, b: T, msg: &str) { + match a { + Some(a) => assert_gte(a, b, msg), + None => panic!("expected >= {b} {msg}, got None"), + } +} + /// Assert that the paginator produces at least n pages +#[track_caller] fn assert_next>( paginator: Paginator, query: Q, @@ -2600,6 +2575,7 @@ fn assert_next>( } /// Assert that the paginator produces at least n items +#[track_caller] fn assert_next_items>( paginator: Paginator, query: Q, @@ -2611,6 +2587,7 @@ fn assert_next_items>( assert_gte(p.items.len(), n_items, "items"); } +#[track_caller] fn assert_frameset(frameset: &Frameset) { assert_gte(frameset.frame_height, 20, "frame height"); assert_gte(frameset.frame_height, 20, "frame width"); From df9da157de04cf65885d3ec391336aabdb210b21 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 13 Feb 2024 15:22:52 +0100 Subject: [PATCH 105/459] tests: remove channel mobile/tv banner assertion --- tests/youtube.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/youtube.rs b/tests/youtube.rs index 359deb7..91abae6 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -831,8 +831,6 @@ fn channel_shorts(rp: RustyPipe) { Some("https://www.youtube.com/@Doobydobap") ); assert!(!channel.banner.is_empty(), "got no banners"); - assert!(!channel.mobile_banner.is_empty(), "got no mobile banners"); - assert!(!channel.tv_banner.is_empty(), "got no tv banners"); assert!( !channel.content.items.is_empty() && !channel.content.is_exhausted(), @@ -930,8 +928,6 @@ fn assert_channel_eevblog(channel: &Channel) { Some("https://www.youtube.com/@EEVblog") ); assert!(!channel.banner.is_empty(), "got no banners"); - assert!(!channel.mobile_banner.is_empty(), "got no mobile banners"); - assert!(!channel.tv_banner.is_empty(), "got no tv banners"); } #[rstest] From d71da2413685ffc212b6f12fdc7474f42c632dd1 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 13 Feb 2024 17:53:38 +0100 Subject: [PATCH 106/459] tests: channel shorts: dont fetch more pages In some cases YouTube does not return a continuation response when fetching the *Shorts* channel tab. There should be more research done about this issue, for the moment this part of the test is disabled. --- codegen/src/abtest.rs | 6 +----- tests/youtube.rs | 15 +++++++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index aff36cf..8b2c9f0 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -32,11 +32,7 @@ pub enum ABTest { ChannelPageHeader = 12, } -const TESTS_TO_RUN: [ABTest; 3] = [ - ABTest::TrendsVideoTab, - ABTest::TrendsPageHeaderRenderer, - ABTest::DiscographyPage, -]; +const TESTS_TO_RUN: [ABTest; 1] = [ABTest::ChannelPageHeader]; #[derive(Debug, Serialize, Deserialize)] pub struct ABTestRes { diff --git a/tests/youtube.rs b/tests/youtube.rs index 91abae6..6cc69bc 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -809,7 +809,6 @@ fn channel_videos(rp: RustyPipe) { } #[rstest] -#[ignore] fn channel_shorts(rp: RustyPipe) { let channel = tokio_test::block_on( rp.query() @@ -837,7 +836,7 @@ fn channel_shorts(rp: RustyPipe) { "got no shorts" ); - assert_next(channel.content, rp.query(), 15, 1, true); + // assert_next(channel.content, rp.query(), 15, 1, true); } #[rstest] @@ -985,7 +984,6 @@ fn channel_more( #[rstest] #[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos)] #[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live)] -#[ignore] #[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts)] fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: RustyPipe) { let latest = tokio_test::block_on(rp.query().channel_videos_tab_order( @@ -1007,13 +1005,15 @@ fn channel_order_latest(#[case] id: &str, #[case] tab: ChannelVideoTab, rp: Rust } } } - assert_next(latest, rp.query(), 15, 1, true); + + if tab != ChannelVideoTab::Shorts { + assert_next(latest, rp.query(), 15, 1, true); + } } #[rstest] #[case::videos("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Videos, "XqZsoesa55w")] #[case::live("UCvqRdlKsE5Q8mf8YXbdIJLw", ChannelVideoTab::Live, "ojes5ULOqhc")] -#[ignore] #[case::shorts("UCcdwLMPsaU2ezNSJU1nFoBQ", ChannelVideoTab::Shorts, "k91vRvXGwHs")] fn channel_order_popular( #[case] id: &str, @@ -1045,7 +1045,10 @@ fn channel_order_popular( ); } } - assert_next(popular, rp.query(), 15, 1, true); + + if tab != ChannelVideoTab::Shorts { + assert_next(popular, rp.query(), 15, 1, true); + } } #[rstest] From 339231924b61c4f5c23f0d6f5885af2b89049c87 Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Tue, 13 Feb 2024 18:38:58 +0100 Subject: [PATCH 107/459] fix: update dictionary, fix parsing playlist dates in `am` and `no` --- codegen/src/collect_playlist_dates.rs | 6 +-- src/client/channel_rss.rs | 2 +- src/client/mod.rs | 2 +- src/deobfuscate.rs | 2 +- src/report.rs | 10 +++-- src/util/dictionary.rs | 63 ++++++++++++++------------- testfiles/dict/dictionary.json | 3 ++ testfiles/dict/playlist_samples.json | 32 +++++++------- 8 files changed, 65 insertions(+), 55 deletions(-) diff --git a/codegen/src/collect_playlist_dates.rs b/codegen/src/collect_playlist_dates.rs index 21cce76..12279cf 100644 --- a/codegen/src/collect_playlist_dates.rs +++ b/codegen/src/collect_playlist_dates.rs @@ -66,9 +66,9 @@ pub async fn collect_dates(concurrency: usize) { // These are the sample playlists let cases = [ - (DateCase::Today, "PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj"), - (DateCase::Yesterday, "PL3oW2tjiIxvQ98ZTLhBh5soCbE1mC3uAT"), - (DateCase::Ago, "PLeDakahyfrO9Amk2GFrzpI4UWOkgqzoIE"), + (DateCase::Today, "PL3oW2tjiIxvQ98ZTLhBh5soCbE1mC3uAT"), + (DateCase::Yesterday, "PLGBuKfnErZlCkRRgt06em8nbXvcV5Sae7"), + (DateCase::Ago, "PLAQ7nLSEnhWTEihjeM1I-ToPDJEKfZHZu"), (DateCase::Jan, "PL1J-6JOckZtFjcni6Xj1pLYglJp6JCpKD"), (DateCase::Feb, "PL1J-6JOckZtETrbzwZE7mRIIK6BzWNLAs"), (DateCase::Mar, "PL1J-6JOckZtG3AVdvBXhMO64mB2k3BtKi"), diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index 32bcaaf..a2f0db3 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -45,7 +45,7 @@ impl RustyPipeQuery { Err(e) => { if let Some(reporter) = &self.client.inner.reporter { let report = Report { - info: RustyPipeInfo::default(), + info: RustyPipeInfo::new(Some(self.opts.lang)), level: crate::report::Level::ERR, operation: "channel_rss", error: Some(e.to_string()), diff --git a/src/client/mod.rs b/src/client/mod.rs index e6d3f1b..e014d18 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1428,7 +1428,7 @@ impl RustyPipeQuery { if level > Level::DBG || self.opts.report { if let Some(reporter) = &self.client.inner.reporter { let report = Report { - info: RustyPipeInfo::default(), + info: RustyPipeInfo::new(Some(self.opts.lang)), level, operation: &format!("{operation}({id})"), error, diff --git a/src/deobfuscate.rs b/src/deobfuscate.rs index a8fff16..cf31cca 100644 --- a/src/deobfuscate.rs +++ b/src/deobfuscate.rs @@ -36,7 +36,7 @@ impl DeobfData { if let Err(e) = &res { if let Some(reporter) = reporter { let report = Report { - info: RustyPipeInfo::default(), + info: RustyPipeInfo::new(None), level: Level::ERR, operation: "extract_deobf", error: Some(e.to_string()), diff --git a/src/report.rs b/src/report.rs index f5a163b..e0df4ff 100644 --- a/src/report.rs +++ b/src/report.rs @@ -27,7 +27,7 @@ use serde::{Deserialize, Serialize}; use time::{macros::format_description, OffsetDateTime}; use tracing::error; -use crate::{deobfuscate::DeobfData, util}; +use crate::{deobfuscate::DeobfData, param::Language, util}; pub(crate) const DEFAULT_REPORT_DIR: &str = "rustypipe_reports"; @@ -67,6 +67,9 @@ pub struct RustyPipeInfo<'a> { /// Date/Time when the event occurred #[serde(with = "time::serde::rfc3339")] pub date: OffsetDateTime, + /// YouTube content language + #[serde(skip_serializing_if = "Option::is_none")] + pub language: Option, } /// Reported HTTP request data @@ -101,12 +104,13 @@ pub enum Level { ERR, } -impl Default for RustyPipeInfo<'_> { - fn default() -> Self { +impl RustyPipeInfo<'_> { + pub(crate) fn new(language: Option) -> Self { Self { package: env!("CARGO_PKG_NAME"), version: env!("CARGO_PKG_VERSION"), date: util::now_sec(), + language, } } } diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs index a7711ff..eee7f6e 100644 --- a/src/util/dictionary.rs +++ b/src/util/dictionary.rs @@ -185,25 +185,27 @@ pub(crate) fn entry(lang: Language) -> Entry { }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 15467950696543387533, + key: 7485420634051515786, disps: &[ - (0, 0), - (1, 1), - (6, 8), + (2, 0), + (0, 10), + (9, 7), ], entries: &[ - ("ፌብሩ", 2), - ("ጁን", 6), - ("ኦገስ", 8), - ("ኤፕሪ", 4), - ("ዲሴም", 12), - ("ጁላይ", 7), - ("ማርች", 3), - ("ሴፕቴ", 9), - ("ኖቬም", 11), - ("ጃንዩ", 1), - ("ኦክቶ", 10), ("ሜይ", 5), + ("ሴፕቴ", 9), + ("ዲሴም", 12), + ("ፌብ", 2), + ("ፌብሩ", 2), + ("ኦገስ", 8), + ("ማርች", 3), + ("ኤፕሪ", 4), + ("ኦክቶ", 10), + ("ጃንዩ", 1), + ("ኖቬም", 11), + ("ጁን", 6), + ("ጃን", 1), + ("ጁላይ", 7), ], }, timeago_nd_tokens: ::phf::Map { @@ -4876,27 +4878,28 @@ pub(crate) fn entry(lang: Language) -> Entry { }, date_order: &[DateCmp::D, DateCmp::Y], months: ::phf::Map { - key: 10121458955350035957, + key: 1937371814602216758, disps: &[ - (5, 10), - (2, 1), - (0, 0), + (14, 0), + (10, 3), + (1, 8), ], entries: &[ - ("feb", 2), ("jan", 1), - ("sep", 9), - ("jul", 7), - ("juli", 7), - ("jun", 6), - ("juni", 6), ("mar", 3), - ("okt", 10), - ("nov", 11), - ("aug", 8), - ("des", 12), - ("mai", 5), ("apr", 4), + ("jul", 7), + ("des", 12), + ("juli", 7), + ("okt", 10), + ("mars", 3), + ("juni", 6), + ("jun", 6), + ("feb", 2), + ("aug", 8), + ("nov", 11), + ("sep", 9), + ("mai", 5), ], }, timeago_nd_tokens: ::phf::Map { diff --git a/testfiles/dict/dictionary.json b/testfiles/dict/dictionary.json index 9a1fc98..66a6671 100644 --- a/testfiles/dict/dictionary.json +++ b/testfiles/dict/dictionary.json @@ -83,7 +83,9 @@ }, "date_order": "DY", "months": { + "ጃን": 1, "ጃንዩ": 1, + "ፌብ": 2, "ፌብሩ": 2, "ማርች": 3, "ኤፕሪ": 4, @@ -2864,6 +2866,7 @@ "jan": 1, "feb": 2, "mar": 3, + "mars": 3, "apr": 4, "mai": 5, "jun": 6, diff --git a/testfiles/dict/playlist_samples.json b/testfiles/dict/playlist_samples.json index 4c510c9..023251e 100644 --- a/testfiles/dict/playlist_samples.json +++ b/testfiles/dict/playlist_samples.json @@ -20,8 +20,8 @@ "Today": "ዛሬ ተዘምኗል", "Yesterday": "ትላንት ተዘምኗል", "Ago": "ከ5 ቀናት በፊት ተዘምኗል", - "Jan": "ለመጨረሻ ጊዜ የዘመነው 3 ጃንዩ 2020", - "Feb": "ለመጨረሻ ጊዜ የዘመነው 7 ፌብሩ 2016", + "Jan": "ለመጨረሻ ጊዜ የዘመነው 3 ጃን 2020", + "Feb": "ለመጨረሻ ጊዜ የዘመነው 7 ፌብ 2016", "Mar": "ለመጨረሻ ጊዜ የዘመነው 9 ማርች 2015", "Apr": "ለመጨረሻ ጊዜ የዘመነው 2 ኤፕሪ 2017", "May": "ለመጨረሻ ጊዜ የዘመነው 22 ሜይ 2014", @@ -275,18 +275,18 @@ "Today": "Updated today", "Yesterday": "Updated yesterday", "Ago": "Updated 5 days ago", - "Jan": "Last updated on 03-Jan-2020", - "Feb": "Last updated on 07-Feb-2016", - "Mar": "Last updated on 09-Mar-2015", - "Apr": "Last updated on 02-Apr-2017", - "May": "Last updated on 22-May-2014", - "Jun": "Last updated on 28-Jun-2014", - "Jul": "Last updated on 02-Jul-2014", - "Aug": "Last updated on 23-Aug-2015", - "Sep": "Last updated on 16-Sept-2018", - "Oct": "Last updated on 31-Oct-2014", - "Nov": "Last updated on 03-Nov-2016", - "Dec": "Last updated on 24-Dec-2021" + "Jan": "Last updated on 3 Jan 2020", + "Feb": "Last updated on 7 Feb 2016", + "Mar": "Last updated on 9 Mar 2015", + "Apr": "Last updated on 2 Apr 2017", + "May": "Last updated on 22 May 2014", + "Jun": "Last updated on 28 Jun 2014", + "Jul": "Last updated on 2 Jul 2014", + "Aug": "Last updated on 23 Aug 2015", + "Sep": "Last updated on 16 Sept 2018", + "Oct": "Last updated on 31 Oct 2014", + "Nov": "Last updated on 3 Nov 2016", + "Dec": "Last updated on 24 Dec 2021" }, "es": { "Today": "Actualizada hoy", @@ -850,7 +850,7 @@ "Dec": "Сүүлд 2021 оны 12-р сарын 24-нд шинэчилсэн" }, "mr": { - "Today": "आज अपडेट केले", + "Today": "Updated today", "Yesterday": "काल अपडेट केली", "Ago": "5 दिवसांपूर्वी अपडेट केली", "Jan": "3 जाने, 2020 रोजी अंतिम अपडेट", @@ -940,7 +940,7 @@ "Ago": "Oppdatert for 5 dager siden", "Jan": "Sist oppdatert 3. jan. 2020", "Feb": "Sist oppdatert 7. feb. 2016", - "Mar": "Sist oppdatert 9. mar. 2015", + "Mar": "Sist oppdatert 9. mars 2015", "Apr": "Sist oppdatert 2. apr. 2017", "May": "Sist oppdatert 22. mai 2014", "Jun": "Sist oppdatert 28. juni 2014", From bd04a87ad5b955fb7caa0c402d68112a98b7f66c Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Mon, 19 Feb 2024 16:55:45 +0100 Subject: [PATCH 108/459] tests: update lyrics --- tests/snapshots/youtube__music_lyrics.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/snapshots/youtube__music_lyrics.snap b/tests/snapshots/youtube__music_lyrics.snap index 59748f9..32af9d3 100644 --- a/tests/snapshots/youtube__music_lyrics.snap +++ b/tests/snapshots/youtube__music_lyrics.snap @@ -2,4 +2,4 @@ source: tests/youtube.rs expression: lyrics.body --- -"Eyes, in the sky, gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby, let the light shine through\nIf you believe, it\'s true\nBaby, won\'t you let the light shine through\nFor you?\nFor you\nFor you\n\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nWon\'t you let the light shine through?\n\nEyes, in the sky, gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby, let the light shine through\nIf you believe it\'s true\nBaby, won\'t you let the light shine through\nFor you\nFor you\n\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you\nFor you" +"Eyes in the sky gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby, let the light shine through\nIf you believe, it\'s true\nBaby, won\'t you let the light shine through for you?\n\nFor you, for you\nFor you, for you\nFor you, for you\nFor you, for you\nFor you, for you\nWon\'t you let the light shine through?\n\nEyes in the sky gazing far into the night\nI raise my hand to the fire, but it\'s no use\n\'Cause you can\'t stop it from shining through\nIt\'s true\nBaby, let the light shine through\nIf you believe it\'s true\nBaby, won\'t you let the light shine through for you?\n\nFor you, for you\nFor you, for you\nFor you, for you\nFor you, for you\nFor you, for you\nFor you" From 76c27f032429c089a7a4c22caa4d4a14cceb578a Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Thu, 29 Feb 2024 02:54:40 +0100 Subject: [PATCH 109/459] fix: add support for A/B-13 (2-column layout for music playlists/albums) --- codegen/src/abtest.rs | 22 +- notes/AB_Tests.md | 20 + notes/_img/ab_13.png | Bin 0 -> 174815 bytes src/client/music_playlist.rs | 181 +- src/client/response/mod.rs | 3 + src/client/response/music_playlist.rs | 85 +- src/client/response/url_endpoint.rs | 16 + ...__map_music_album_20240228_twoColumns.snap | 74 + ...ts__map_music_playlist_20240228_album.snap | 73 + ...ap_music_playlist_20240228_twoColumns.snap | 3251 + src/serializer/text.rs | 7 + .../album_20240228_twoColumns.json | 1225 + .../playlist_20240228_album.json | 691 + .../playlist_20240228_twoColumns.json | 57976 ++++++++++++++++ 14 files changed, 63535 insertions(+), 89 deletions(-) create mode 100644 notes/_img/ab_13.png create mode 100644 src/client/snapshots/rustypipe__client__music_playlist__tests__map_music_album_20240228_twoColumns.snap create mode 100644 src/client/snapshots/rustypipe__client__music_playlist__tests__map_music_playlist_20240228_album.snap create mode 100644 src/client/snapshots/rustypipe__client__music_playlist__tests__map_music_playlist_20240228_twoColumns.snap create mode 100644 testfiles/music_playlist/album_20240228_twoColumns.json create mode 100644 testfiles/music_playlist/playlist_20240228_album.json create mode 100644 testfiles/music_playlist/playlist_20240228_twoColumns.json diff --git a/codegen/src/abtest.rs b/codegen/src/abtest.rs index 8b2c9f0..f09a30d 100644 --- a/codegen/src/abtest.rs +++ b/codegen/src/abtest.rs @@ -30,9 +30,11 @@ pub enum ABTest { ChannelAboutModal = 10, LikeButtonViewmodel = 11, ChannelPageHeader = 12, + MusicPlaylistTwoColumn = 13, } -const TESTS_TO_RUN: [ABTest; 1] = [ABTest::ChannelPageHeader]; +/// List of active A/B tests that are run when none is manually specified +const TESTS_TO_RUN: [ABTest; 2] = [ABTest::ChannelPageHeader, ABTest::MusicPlaylistTwoColumn]; #[derive(Debug, Serialize, Deserialize)] pub struct ABTestRes { @@ -101,6 +103,7 @@ pub async fn run_test( ABTest::ChannelAboutModal => channel_about_modal(&query).await, ABTest::LikeButtonViewmodel => like_button_viewmodel(&query).await, ABTest::ChannelPageHeader => channel_page_header(&query).await, + ABTest::MusicPlaylistTwoColumn => music_playlist_two_column(&query).await, } .unwrap(); pb.inc(1); @@ -336,3 +339,20 @@ pub async fn channel_page_header(rp: &RustyPipeQuery) -> Result { .await?; Ok(channel.mobile_banner.is_empty() && channel.tv_banner.is_empty()) } + +pub async fn music_playlist_two_column(rp: &RustyPipeQuery) -> Result { + let id = "VLRDCLAK5uy_kb7EBi6y3GrtJri4_ZH56Ms786DFEimbM"; + let res = rp + .raw( + ClientType::DesktopMusic, + "browse", + &QBrowse { + context: rp.get_context(ClientType::DesktopMusic, true, None).await, + browse_id: id, + params: None, + }, + ) + .await + .unwrap(); + Ok(res.contains("\"musicResponsiveHeaderRenderer\"")) +} diff --git a/notes/AB_Tests.md b/notes/AB_Tests.md index fbe5d15..9f5457d 100644 --- a/notes/AB_Tests.md +++ b/notes/AB_Tests.md @@ -24,6 +24,13 @@ to the new feature. - 🔴 **High** Changes to the functionality of YouTube that will require API changes for alternative clients +**Status:** + +- Experimental (<3%) +- Common (>3%) +- Frequent (>40%) +- Stabilized (100%) + If you want to check how often these A/B tests occur, you can use the `codegen` tool with the following command: `rustypipe-codegen ab-test `. @@ -584,3 +591,16 @@ be accomodated. There are also no mobile/TV header images available any more. } } ``` + + +## [13] Music album/playlist 2-column layout + +- **Encountered on:** 29.02.2024 +- **Impact:** 🟢 Low +- **Endpoint:** browse +- **Status:** Common (6%) + +![A/B test 13 screenshot](./_img/ab_13.png) + +YouTube Music updated the layout of album and playlist pages. The new layout shows +the cover on the left side of the playlist content. diff --git a/notes/_img/ab_13.png b/notes/_img/ab_13.png new file mode 100644 index 0000000000000000000000000000000000000000..a372da6d6d4cb82fc5c609069106d239690e2ca8 GIT binary patch literal 174815 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�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
    >swL)B;us?&PudU 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 Io>S!i0b?rZ%m4rY literal 0 HcmV?d00001 diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index d3fb2a9..e754e34 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -1,6 +1,7 @@ use std::{borrow::Cow, fmt::Debug}; use crate::{ + client::response::url_endpoint::NavigationEndpoint, error::{Error, ExtractionError}, model::{ paginator::{ContinuationEndpoint, Paginator}, @@ -143,16 +144,35 @@ impl MapResponse for response::MusicPlaylist { ) -> Result, ExtractionError> { // dbg!(&self); - let music_contents = self - .contents - .single_column_browse_results_renderer - .contents - .into_iter() - .next() - .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? - .tab_renderer - .content - .section_list_renderer; + let (header, music_contents) = match self.contents { + response::music_playlist::Contents::SingleColumnBrowseResultsRenderer(c) => ( + self.header, + c.contents + .into_iter() + .next() + .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? + .tab_renderer + .content + .section_list_renderer, + ), + response::music_playlist::Contents::TwoColumnBrowseResultsRenderer { + secondary_contents, + tabs, + } => ( + tabs.into_iter() + .next() + .and_then(|t| { + t.tab_renderer + .content + .section_list_renderer + .contents + .into_iter() + .next() + }) + .or(self.header), + secondary_contents.section_list_renderer, + ), + }; let shelf = music_contents .contents .into_iter() @@ -183,7 +203,7 @@ impl MapResponse for response::MusicPlaylist { .map(|cont| cont.next_continuation_data.continuation); let track_count = if ctoken.is_some() { - self.header.as_ref().and_then(|h| { + header.as_ref().and_then(|h| { let parts = h .music_detail_header_renderer .second_subtitle @@ -203,23 +223,24 @@ impl MapResponse for response::MusicPlaylist { .next() .map(|c| c.next_continuation_data.continuation); - let (from_ytm, channel, name, thumbnail, description) = match self.header { + let (from_ytm, channel, name, thumbnail, description) = match header { Some(header) => { let h = header.music_detail_header_renderer; - let from_ytm = h.subtitle.0.iter().any(util::is_ytm); - let channel = h - .subtitle - .0 - .into_iter() - .find_map(|c| ChannelId::try_from(c).ok()); + let st = match h.strapline_text_one { + Some(s) => s, + None => h.subtitle, + }; + + let from_ytm = st.0.iter().any(util::is_ytm); + let channel = st.0.into_iter().find_map(|c| ChannelId::try_from(c).ok()); ( from_ytm, channel, h.title, h.thumbnail.into(), - h.description, + h.description.map(String::from), ) } None => { @@ -288,23 +309,40 @@ impl MapResponse for response::MusicPlaylist { ) -> Result, ExtractionError> { // dbg!(&self); - let header = self - .header + let (header, sections) = match self.contents { + response::music_playlist::Contents::SingleColumnBrowseResultsRenderer(c) => ( + self.header, + c.contents + .into_iter() + .next() + .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? + .tab_renderer + .content + .section_list_renderer + .contents, + ), + response::music_playlist::Contents::TwoColumnBrowseResultsRenderer { + secondary_contents, + tabs, + } => ( + tabs.into_iter() + .next() + .and_then(|t| { + t.tab_renderer + .content + .section_list_renderer + .contents + .into_iter() + .next() + }) + .or(self.header), + secondary_contents.section_list_renderer.contents, + ), + }; + let header = header .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no header")))? .music_detail_header_renderer; - let sections = self - .contents - .single_column_browse_results_renderer - .contents - .into_iter() - .next() - .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? - .tab_renderer - .content - .section_list_renderer - .contents; - let mut shelf = None; let mut album_variants = None; for section in sections { @@ -322,27 +360,37 @@ impl MapResponse for response::MusicPlaylist { let mut subtitle_split = header.subtitle.split(util::DOT_SEPARATOR); - let (year_txt, artists_p) = match subtitle_split.len() { - 3.. => { + let (year_txt, artists_p) = match header.strapline_text_one { + Some(sl) => { let year_txt = subtitle_split - .swap_remove(2) + .swap_remove(1) .0 .first() .map(|c| c.as_str().to_owned()); - (year_txt, subtitle_split.try_swap_remove(1)) + (year_txt, Some(sl)) } - 2 => { - // The second part may either be the year or the artist - let p2 = subtitle_split.swap_remove(1); - let is_year = - p2.0.len() == 1 && p2.0[0].as_str().chars().all(|c| c.is_ascii_digit()); - if is_year { - (Some(p2.0[0].as_str().to_owned()), None) - } else { - (None, Some(p2)) + None => match subtitle_split.len() { + 3.. => { + let year_txt = subtitle_split + .swap_remove(2) + .0 + .first() + .map(|c| c.as_str().to_owned()); + (year_txt, subtitle_split.try_swap_remove(1)) } - } - _ => (None, None), + 2 => { + // The second part may either be the year or the artist + let p2 = subtitle_split.swap_remove(1); + let is_year = + p2.0.len() == 1 && p2.0[0].as_str().chars().all(|c| c.is_ascii_digit()); + if is_year { + (Some(p2.0[0].as_str().to_owned()), None) + } else { + (None, Some(p2)) + } + } + _ => (None, None), + }, }; let (artists, by_va) = map_artists(artists_p); @@ -355,21 +403,34 @@ impl MapResponse for response::MusicPlaylist { let album_type = map_album_type(album_type_txt.as_str(), lang); let year = year_txt.and_then(|txt| util::parse_numeric(&txt).ok()); - let (artist_id, playlist_id) = header + fn map_playlist_id(ep: &NavigationEndpoint) -> Option { + if let NavigationEndpoint::WatchPlaylist { + watch_playlist_endpoint, + } = ep + { + Some(watch_playlist_endpoint.playlist_id.to_owned()) + } else { + None + } + } + + let (playlist_id, artist_id) = header .menu + .or_else(|| header.buttons.into_iter().next()) .map(|menu| { ( - map_artist_id(menu.menu_renderer.items), menu.menu_renderer .top_level_buttons - .into_iter() - .next() - .map(|btn| { - btn.button_renderer - .navigation_endpoint - .watch_playlist_endpoint - .playlist_id + .iter() + .find_map(|btn| map_playlist_id(&btn.button_renderer.navigation_endpoint)) + .or_else(|| { + menu.menu_renderer.items.iter().find_map(|itm| { + map_playlist_id( + &itm.menu_navigation_item_renderer.navigation_endpoint, + ) + }) }), + map_artist_id(menu.menu_renderer.items), ) }) .unwrap_or_default(); @@ -403,7 +464,7 @@ impl MapResponse for response::MusicPlaylist { cover: header.thumbnail.into(), artists, artist_id, - description: header.description, + description: header.description.map(String::from), album_type, year, by_va, @@ -429,6 +490,8 @@ mod tests { #[case::short("short", "RDCLAK5uy_kFQXdnqMaQCVx2wpUM4ZfbsGCDibZtkJk")] #[case::long("long", "PL5dDx681T4bR7ZF1IuWzOv1omlRbE7PiJ")] #[case::nomusic("nomusic", "PL1J-6JOckZtE_P9Xx8D3b2O6w0idhuKBe")] + #[case::two_columns("20240228_twoColumns", "RDCLAK5uy_kb7EBi6y3GrtJri4_ZH56Ms786DFEimbM")] + #[case::n_album("20240228_album", "OLAK5uy_kdSWBZ-9AZDkYkuy0QCc3p0KO9DEHVNH0")] fn map_music_playlist(#[case] name: &str, #[case] id: &str) { let json_path = path!(*TESTFILES / "music_playlist" / format!("playlist_{name}.json")); let json_file = File::open(json_path).unwrap(); @@ -454,6 +517,8 @@ mod tests { #[case::single("single", "MPREb_bHfHGoy7vuv")] #[case::description("description", "MPREb_PiyfuVl6aYd")] #[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")] + #[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")] + #[case::two_columns("20240228_twoColumns", "MPREb_bHfHGoy7vuv")] fn map_music_album(#[case] name: &str, #[case] id: &str) { let json_path = path!(*TESTFILES / "music_playlist" / format!("album_{name}.json")); let json_file = File::open(json_path).unwrap(); diff --git a/src/client/response/mod.rs b/src/client/response/mod.rs index 02c4075..3f5682d 100644 --- a/src/client/response/mod.rs +++ b/src/client/response/mod.rs @@ -67,6 +67,9 @@ pub(crate) struct ContentRenderer { pub content: T, } +/// Deserializes any object with an array field named `contents`, `tabs` or `items`. +/// +/// Invalid items are skipped #[derive(Debug)] pub(crate) struct ContentsRenderer { pub contents: Vec, diff --git a/src/client/response/music_playlist.rs b/src/client/response/music_playlist.rs index 8de1c91..734f6c4 100644 --- a/src/client/response/music_playlist.rs +++ b/src/client/response/music_playlist.rs @@ -5,23 +5,37 @@ use crate::serializer::text::{Text, TextComponents}; use super::{ music_item::{ - ItemSection, MusicContentsRenderer, MusicItemMenuEntry, MusicThumbnailRenderer, - SingleColumnBrowseResult, + Button, ItemSection, MusicContentsRenderer, MusicItemMenuEntry, MusicThumbnailRenderer, }, - Tab, + ContentsRenderer, SectionList, Tab, }; /// Response model for YouTube Music playlists and albums #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct MusicPlaylist { - pub contents: SingleColumnBrowseResult>, + pub contents: Contents, pub header: Option

    , } +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) enum Contents { + SingleColumnBrowseResultsRenderer(ContentsRenderer>), + #[serde(rename_all = "camelCase")] + TwoColumnBrowseResultsRenderer { + /// List content + secondary_contents: PlSectionList, + /// Header + #[serde_as(as = "VecSkipError<_>")] + tabs: Vec>>, + }, +} + #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub(crate) struct SectionList { +pub(crate) struct PlSectionList { /// Includes a continuation token for fetching recommendations pub section_list_renderer: MusicContentsRenderer, } @@ -29,6 +43,7 @@ pub(crate) struct SectionList { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct Header { + #[serde(alias = "musicResponsiveHeaderRenderer")] pub music_detail_header_renderer: HeaderRenderer, } @@ -48,12 +63,13 @@ pub(crate) struct HeaderRenderer { pub subtitle: TextComponents, /// Playlist/album description. May contain hashtags which are /// displayed as search links on the YouTube website. - #[serde_as(as = "Option")] - pub description: Option, + pub description: Option, /// Playlist thumbnail / album cover. /// Missing on artist_tracks view. #[serde(default)] pub thumbnail: MusicThumbnailRenderer, + /// Channel (only on TwoColumnBrowseResultsRenderer) + pub strapline_text_one: Option, /// Number of tracks + playtime. /// Missing on artist_tracks view. /// @@ -66,6 +82,28 @@ pub(crate) struct HeaderRenderer { #[serde(default)] #[serde_as(as = "DefaultOnError")] pub menu: Option, + #[serde(default)] + #[serde_as(as = "VecSkipError<_>")] + pub buttons: Vec, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub(crate) enum Description { + Text(#[serde_as(as = "Text")] String), + #[serde(rename_all = "camelCase")] + Shelf { + music_description_shelf_renderer: DescriptionShelf, + }, +} + +#[serde_as] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct DescriptionShelf { + #[serde_as(as = "Text")] + pub description: String, } #[derive(Debug, Deserialize)] @@ -80,31 +118,18 @@ pub(crate) struct HeaderMenu { pub(crate) struct HeaderMenuRenderer { #[serde(default)] #[serde_as(as = "VecSkipError<_>")] - pub top_level_buttons: Vec, + pub top_level_buttons: Vec