diff --git a/Justfile b/Justfile index 9bc4fd6..7d48e2b 100644 --- a/Justfile +++ b/Justfile @@ -49,16 +49,15 @@ release crate="rustypipe": set -e CRATE="{{crate}}" - INCLUDES='--include-path README.md --include-path LICENSE --include-path Cargo.toml' CHANGELOG="CHANGELOG.md" if [ "$CRATE" = "rustypipe" ]; then - INCLUDES="$INCLUDES --include-path 'src/**' --include-path 'tests/**' --include-path 'testfiles/**'" + INCLUDES="--exclude-path 'notes/**' --exclude-path 'cli/**' --exclude-path 'downloader/**'" else if [ ! -d "$CRATE" ]; then echo "$CRATE does not exist."; exit 1 fi - INCLUDES="$INCLUDES --include-path '$CRATE/**'" + INCLUDES="--include-path README.md --include-path LICENSE --include-path Cargo.toml --include-path '$CRATE/**'" CHANGELOG="$CRATE/$CHANGELOG" CRATE="rustypipe-$CRATE" # Add crate name prefix fi 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 c47814b..c4bf828 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 @@ -26,7 +26,7 @@ SAttributed { }, }, Video { - text: "aespa 에스파 'Black ...", + text: "aespa 에스파 'Black Mamba' The Debut Stage", video_id: "Ky5RT5oGg0w", start_time: 0, vtype: Video, @@ -64,7 +64,7 @@ SAttributed { }, }, Web { - text: "aespa", + text: "YouTube: aespa", url: "https://www.youtube.com/c/aespa", }, Text { @@ -76,7 +76,7 @@ SAttributed { }, }, Web { - text: "https://www.instagram.com/aespa_official", + text: "Instagram: aespa_official", url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbE9FVEtZZkVLUExjdFBnZjZnZ19KNWRYOVZUd3xBQ3Jtc0tsbHpCa1hLTVJ6MEllczlzUEpoVi1IQ2F5NG1jMnlOT3p3bnlFeE80ZzlsaG5CUXlFQnFGTkMtN19DcVYzQkw3bVlVVmNwQlpYQWZnNGNsME45WE1WQ21sR3V1Z3k5RG9DUDE0VTZQTm53Mk9vTWhiOA&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", }, Text { @@ -88,7 +88,7 @@ SAttributed { }, }, Web { - text: "https://www.tiktok.com/@aespa_official", + text: "TikTok: aespa_official", url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbVdlSGk3eDd5U0dUVG16VFJCQnhKVFBEUUxMQXxBQ3Jtc0tuX3ZJbENNY1ZSN0FFemdxTFdlcTVvc3AwZE05NEFvRW5nOHpZWDUtZG9ORHBnT1JGc2UySDh3WWl3MU53VjFvbHRSdjdxMUlGM2Z6SmdaLTVaWWxhamJEems0Uld3MGlTT0Z0bkh5Y0hpcnY1aXptSQ&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", }, Text { @@ -100,7 +100,7 @@ SAttributed { }, }, Web { - text: "https://twitter.com/aespa_Official", + text: "Twitter: aespa_official", url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3lNcG1lMHkwSzNLQVBrUXFNTXl0N1hNa04wUXxBQ3Jtc0tubm1sQkdaVjNYR04xOHpJV3NxZVBpb3I5V1FVOHVFNC1uWE5vb211ZmZKYzhTZXZfbjlkY09fanBRdHpjUkdRVGJJYS0xZ3NBNkVZQVhWSS0xVDYwRlRzQ0J3ODQxNDE0ODAxd1Q0cG5icVlNWndscw&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", }, Text { @@ -112,7 +112,7 @@ SAttributed { }, }, Web { - text: "https://www.facebook.com/aespa.official", + text: "Facebook: aespa.official", url: "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbjdBNG5yVEFwU0JMNGZaLUpQZ1ZoeGgwT0xOZ3xBQ3Jtc0tuRFdFNlJNV29PMThRNWo5MHZrREZ1ZU5oZlkxVmE4ZlU5STFCZW1mUFVSdXJ3VUQxUnNVVkUzLWJQMS1uRzVjdkRCV2ZxSWJ6cFNxRVVzejY0SDltZFZPc2xwS3ZPZGIxcFZ6cndIVkMtUjVtZ054cw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", }, Text { diff --git a/src/serializer/text.rs b/src/serializer/text.rs index 6f4cd5b..b708625 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -1,7 +1,5 @@ use std::convert::TryFrom; -use once_cell::sync::Lazy; -use regex::Regex; use serde::{Deserialize, Deserializer}; use serde_with::{serde_as, DefaultOnError, DeserializeAs, VecSkipError}; @@ -155,12 +153,16 @@ pub(crate) struct AttributedText { style_runs: Vec, } +#[serde_as] #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct CommandRun { start_index: usize, length: usize, on_tap: AttributedTextOnTap, + #[serde(default)] + #[serde_as(as = "DefaultOnError<_>")] + on_tap_options: Option, } #[derive(Deserialize)] @@ -200,6 +202,18 @@ struct AttributedTextOnTap { innertube_command: NavigationEndpoint, } +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct AttributedTextOnTapOptions { + accessibility_info: AccessibilityInfo, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct AccessibilityInfo { + accessibility_label: String, +} + struct AttributedTextRun { start_index: usize, length: usize, @@ -207,7 +221,7 @@ struct AttributedTextRun { } enum AttributedTextRunContent { - Link(NavigationEndpoint), + Link(NavigationEndpoint, Option), Style(Style), } @@ -230,7 +244,12 @@ impl From for AttributedTextRun { Self { start_index: value.start_index, length: value.length, - content: AttributedTextRunContent::Link(value.on_tap.innertube_command), + content: AttributedTextRunContent::Link( + value.on_tap.innertube_command, + value + .on_tap_options + .map(|o| o.accessibility_info.accessibility_label), + ), } } } @@ -381,7 +400,7 @@ impl<'de> DeserializeAs<'de, TextComponents> for AttributedText { components.push(TextComponent::new(txt_before)); } components.push(match run.content { - AttributedTextRunContent::Link(link) => { + AttributedTextRunContent::Link(link, label) => { // Trim link text: // 3xnbsp, (/ •), nbsp, Name, 2xnbsp // Channel: `\u{a0}\u{a0}\u{a0}/\u{a0}aespa\u{a0}\u{a0}` @@ -391,10 +410,35 @@ impl<'de> DeserializeAs<'de, TextComponents> for AttributedText { let txt_link = txt_run.trim(); let txt_link = txt_link.replace('\u{a0}', " "); - static LINK_PREFIX: Lazy = Lazy::new(|| Regex::new("^[/•] *").unwrap()); - let txt_link = LINK_PREFIX.replace(&txt_link, ""); - - map_text_component(txt_link.to_string(), Style::default(), Some(link)) + if let Some(txt_link) = txt_link.strip_prefix(['/', '•']) { + let txt_link = txt_link.trim_start(); + match (&link, label) { + (NavigationEndpoint::Url { .. }, Some(label)) => { + // Prefix chip-style web links with the service name from accessibility label + // Example: `Twitter: aespa_official` + if let Some(first_word) = label.split_whitespace().next() { + map_text_component( + format!("{first_word}: {txt_link}"), + Style::default(), + Some(link), + ) + } else { + map_text_component( + txt_link.to_owned(), + Style::default(), + Some(link), + ) + } + } + _ => map_text_component( + txt_link.to_owned(), + Style::default(), + Some(link), + ), + } + } else { + map_text_component(txt_link, Style::default(), Some(link)) + } } AttributedTextRunContent::Style(style) => { map_text_component(txt_run.to_string(), style, None) diff --git a/testfiles/text/attributed_description.json b/testfiles/text/attributed_description.json index 3dcbb04..f169c79 100644 --- a/testfiles/text/attributed_description.json +++ b/testfiles/text/attributed_description.json @@ -1,346 +1,1325 @@ { - "ln": { - "content": "🎧Listen and download aespa's debut single \"Black Mamba\": https://smarturl.it/aespa_BlackMamba\n🐍The Debut Stage    • aespa 에스파 'Black ...  \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  \nhttps://www.instagram.com/aespa_official\nhttps://www.tiktok.com/@aespa_official\nhttps://twitter.com/aespa_Official\nhttps://www.facebook.com/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": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbm1qRVVfQUlObURLcnFFQXBTUkJSOEpqWGIzUXxBQ3Jtc0tsNUJIYm5xdERxZk9rZEw3YlJzV0ZIYTNaSjU2a21PaFhNUmxzdjI5VE1VRWUyczZwYmtmQXh3QXV0eXlkMDgxRUJoNVMzRFZ6RlZ6MGdXeXdWQXFTTGY2ZHhFcUFqdExRQ21PYzNfWmlBaHhqYXVUdw&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=QUFFLUhqbm1qRVVfQUlObURLcnFFQXBTUkJSOEpqWGIzUXxBQ3Jtc0tsNUJIYm5xdERxZk9rZEw3YlJzV0ZIYTNaSjU2a21PaFhNUmxzdjI5VE1VRWUyczZwYmtmQXh3QXV0eXlkMDgxRUJoNVMzRFZ6RlZ6MGdXeXdWQXFTTGY2ZHhFcUFqdExRQ21PYzNfWmlBaHhqYXVUdw&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 113, - "length": 27, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "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&orc=1&oeis=1&c=WEB&oad=3200&ovd=3200&oaad=11000&oavd=11000&ocs=700&oewis=1&oputc=1&ofpcc=1&msp=1&odeak=1&odepv=1&osfc=1&id=2b2e514f9a06834c&ip=2003%3Ade%3Aaf30%3A200%3Ad8ce%3A4044%3A2ba2%3A3881&initcwndbps=1556250&mt=1663992556&oweuc=" - } - } - } - } - } - } - }, - { - "startIndex": 194, - "length": 40, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbU1ObGNaRDZaRmo1X1ZjejBoeTRnWkxuVUJxZ3xBQ3Jtc0ttWk1BVVhaRXRfN1VYWXBqMHdaYURTRFJNcUZJVlY3a21wRHE2ZGZaclE3WUM5bEZWbmFfT0sxWTZHOVotWVh6U3YtVk94SlA5NkRFTnBPcHVCWDJhMGJRQlI3ZHN0MnJleHp0c2lEVWNxeW1jSDZuVQ&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=QUFFLUhqbU1ObGNaRDZaRmo1X1ZjejBoeTRnWkxuVUJxZ3xBQ3Jtc0ttWk1BVVhaRXRfN1VYWXBqMHdaYURTRFJNcUZJVlY3a21wRHE2ZGZaclE3WUM5bEZWbmFfT0sxWTZHOVotWVh6U3YtVk94SlA5NkRFTnBPcHVCWDJhMGJRQlI3ZHN0MnJleHp0c2lEVWNxeW1jSDZuVQ&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 281, - "length": 40, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "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": 338, - "length": 12, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "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": 351, - "length": 40, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbE9FVEtZZkVLUExjdFBnZjZnZ19KNWRYOVZUd3xBQ3Jtc0tsbHpCa1hLTVJ6MEllczlzUEpoVi1IQ2F5NG1jMnlOT3p3bnlFeE80ZzlsaG5CUXlFQnFGTkMtN19DcVYzQkw3bVlVVmNwQlpYQWZnNGNsME45WE1WQ21sR3V1Z3k5RG9DUDE0VTZQTm53Mk9vTWhiOA&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=QUFFLUhqbE9FVEtZZkVLUExjdFBnZjZnZ19KNWRYOVZUd3xBQ3Jtc0tsbHpCa1hLTVJ6MEllczlzUEpoVi1IQ2F5NG1jMnlOT3p3bnlFeE80ZzlsaG5CUXlFQnFGTkMtN19DcVYzQkw3bVlVVmNwQlpYQWZnNGNsME45WE1WQ21sR3V1Z3k5RG9DUDE0VTZQTm53Mk9vTWhiOA&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 392, - "length": 38, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbVdlSGk3eDd5U0dUVG16VFJCQnhKVFBEUUxMQXxBQ3Jtc0tuX3ZJbENNY1ZSN0FFemdxTFdlcTVvc3AwZE05NEFvRW5nOHpZWDUtZG9ORHBnT1JGc2UySDh3WWl3MU53VjFvbHRSdjdxMUlGM2Z6SmdaLTVaWWxhamJEems0Uld3MGlTT0Z0bkh5Y0hpcnY1aXptSQ&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=QUFFLUhqbVdlSGk3eDd5U0dUVG16VFJCQnhKVFBEUUxMQXxBQ3Jtc0tuX3ZJbENNY1ZSN0FFemdxTFdlcTVvc3AwZE05NEFvRW5nOHpZWDUtZG9ORHBnT1JGc2UySDh3WWl3MU53VjFvbHRSdjdxMUlGM2Z6SmdaLTVaWWxhamJEems0Uld3MGlTT0Z0bkh5Y0hpcnY1aXptSQ&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 431, - "length": 34, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3lNcG1lMHkwSzNLQVBrUXFNTXl0N1hNa04wUXxBQ3Jtc0tubm1sQkdaVjNYR04xOHpJV3NxZVBpb3I5V1FVOHVFNC1uWE5vb211ZmZKYzhTZXZfbjlkY09fanBRdHpjUkdRVGJJYS0xZ3NBNkVZQVhWSS0xVDYwRlRzQ0J3ODQxNDE0ODAxd1Q0cG5icVlNWndscw&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=QUFFLUhqa3lNcG1lMHkwSzNLQVBrUXFNTXl0N1hNa04wUXxBQ3Jtc0tubm1sQkdaVjNYR04xOHpJV3NxZVBpb3I5V1FVOHVFNC1uWE5vb211ZmZKYzhTZXZfbjlkY09fanBRdHpjUkdRVGJJYS0xZ3NBNkVZQVhWSS0xVDYwRlRzQ0J3ODQxNDE0ODAxd1Q0cG5icVlNWndscw&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 466, - "length": 39, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbjdBNG5yVEFwU0JMNGZaLUpQZ1ZoeGgwT0xOZ3xBQ3Jtc0tuRFdFNlJNV29PMThRNWo5MHZrREZ1ZU5oZlkxVmE4ZlU5STFCZW1mUFVSdXJ3VUQxUnNVVkUzLWJQMS1uRzVjdkRCV2ZxSWJ6cFNxRVVzejY0SDltZFZPc2xwS3ZPZGIxcFZ6cndIVkMtUjVtZ054cw&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=QUFFLUhqbjdBNG5yVEFwU0JMNGZaLUpQZ1ZoeGgwT0xOZ3xBQ3Jtc0tuRFdFNlJNV29PMThRNWo5MHZrREZ1ZU5oZlkxVmE4ZlU5STFCZW1mUFVSdXJ3VUQxUnNVVkUzLWJQMS1uRzVjdkRCV2ZxSWJ6cFNxRVVzejY0SDltZFZPc2xwS3ZPZGIxcFZ6cndIVkMtUjVtZ054cw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 506, - "length": 23, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ0BEM2rARgBIhMIzvHr0sis-gIV0kZ6BR0GNA_4SJGXrtzn9erzZQ==", - "commandMetadata": { - "webCommandMetadata": { - "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbEtGMHB6eXBESW92aEVLc1FybkRwQU95eTh6UXxBQ3Jtc0tuWXc5d2JsTHFYcHExdy1FTDFyUV9wdU1DSmxELUxGSGlPMzhBdFVkblRSZkNLQzRaMEJGUGhYLWp4RU40YUVwV3N3ZUpRTVVKVDRiY19zeE5RUkt2dW5aUVcxcHBRQldCOTE3YktXSXZlSFJhRWRjdw&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=QUFFLUhqbEtGMHB6eXBESW92aEVLc1FybkRwQU95eTh6UXxBQ3Jtc0tuWXc5d2JsTHFYcHExdy1FTDFyUV9wdU1DSmxELUxGSGlPMzhBdFVkblRSZkNLQzRaMEJGUGhYLWp4RU40YUVwV3N3ZUpRTVVKVDRiY19zeE5RUkt2dW5aUVcxcHBRQldCOTE3YktXSXZlSFJhRWRjdw&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E", - "target": "TARGET_NEW_WINDOW", - "nofollow": true - } - } - } - }, - { - "startIndex": 531, - "length": 6, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CKIBENzXBBgKIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "commandMetadata": { - "webCommandMetadata": { - "url": "/hashtag/aespa", - "webPageType": "WEB_PAGE_TYPE_BROWSE", - "rootVe": 6827, - "apiUrl": "/youtubei/v1/browse" - } - }, - "browseEndpoint": { - "browseId": "FEhashtag", - "params": "6gUHCgVhZXNwYQ%3D%3D" - } - } - }, - "loggingDirectives": { - "trackingParams": "CKIBENzXBBgKIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "enableDisplayloggerExperiment": true - } - }, - { - "startIndex": 538, - "length": 5, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CKEBENzXBBgLIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "commandMetadata": { - "webCommandMetadata": { - "url": "/hashtag/%C3%A6spa", - "webPageType": "WEB_PAGE_TYPE_BROWSE", - "rootVe": 6827, - "apiUrl": "/youtubei/v1/browse" - } - }, - "browseEndpoint": { - "browseId": "FEhashtag", - "params": "6gUHCgXDpnNwYQ%3D%3D" - } - } - }, - "loggingDirectives": { - "trackingParams": "CKEBENzXBBgLIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "enableDisplayloggerExperiment": true - } - }, - { - "startIndex": 544, - "length": 11, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CKABENzXBBgMIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "commandMetadata": { - "webCommandMetadata": { - "url": "/hashtag/blackmamba", - "webPageType": "WEB_PAGE_TYPE_BROWSE", - "rootVe": 6827, - "apiUrl": "/youtubei/v1/browse" - } - }, - "browseEndpoint": { - "browseId": "FEhashtag", - "params": "6gUMCgpibGFja21hbWJh" - } - } - }, - "loggingDirectives": { - "trackingParams": "CKABENzXBBgMIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "enableDisplayloggerExperiment": true - } - }, - { - "startIndex": 556, - "length": 5, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ8BENzXBBgNIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "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": "6gUOCgzruJTrnpnrp5jrsJQ%3D" - } - } - }, - "loggingDirectives": { - "trackingParams": "CJ8BENzXBBgNIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "enableDisplayloggerExperiment": true - } - }, - { - "startIndex": 562, - "length": 4, - "onTap": { - "innertubeCommand": { - "clickTrackingParams": "CJ4BENzXBBgOIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "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": "6gULCgnsl5DsiqTtjIw%3D" - } - } - }, - "loggingDirectives": { - "trackingParams": "CJ4BENzXBBgOIhMIzvHr0sis-gIV0kZ6BR0GNA_4", - "enableDisplayloggerExperiment": true - } - } - ] - } + "ln": { + "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": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbm1qRVVfQUlObURLcnFFQXBTUkJSOEpqWGIzUXxBQ3Jtc0tsNUJIYm5xdERxZk9rZEw3YlJzV0ZIYTNaSjU2a21PaFhNUmxzdjI5VE1VRWUyczZwYmtmQXh3QXV0eXlkMDgxRUJoNVMzRFZ6RlZ6MGdXeXdWQXFTTGY2ZHhFcUFqdExRQ21PYzNfWmlBaHhqYXVUdw&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=QUFFLUhqbm1qRVVfQUlObURLcnFFQXBTUkJSOEpqWGIzUXxBQ3Jtc0tsNUJIYm5xdERxZk9rZEw3YlJzV0ZIYTNaSjU2a21PaFhNUmxzdjI5VE1VRWUyczZwYmtmQXh3QXV0eXlkMDgxRUJoNVMzRFZ6RlZ6MGdXeXdWQXFTTGY2ZHhFcUFqdExRQ21PYzNfWmlBaHhqYXVUdw&q=https%3A%2F%2Fsmarturl.it%2Faespa_BlackMamba&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 113, + "length": 46, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "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&msp=1&odepv=1&id=2b2e514f9a06834c&ip=79.205.220.219&initcwndbps=1590000&mt=1712917030&oweuc=&pxtags=Cg4KAnR4Egg1MTExODU2NA&rxtags=Cg4KAnR4Egg1MTExODU2MQ%2CCg4KAnR4Egg1MTExODU2Mg%2CCg4KAnR4Egg1MTExODU2Mw%2CCg4KAnR4Egg1MTExODU2NA%2CCg4KAnR4Egg1MTExODU2NQ%2CCg4KAnR4Egg1MTExODU2Ng%2CCg4KAnR4Egg1MTExODU2Nw" + } + } + } + } + } + }, + "onTapOptions": { + "accessibilityInfo": { + "accessibilityLabel": "YouTube Channel Link: aespa 에스파 'Black Mamba' The Debut Stage" + } + } + }, + { + "startIndex": 213, + "length": 40, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbU1ObGNaRDZaRmo1X1ZjejBoeTRnWkxuVUJxZ3xBQ3Jtc0ttWk1BVVhaRXRfN1VYWXBqMHdaYURTRFJNcUZJVlY3a21wRHE2ZGZaclE3WUM5bEZWbmFfT0sxWTZHOVotWVh6U3YtVk94SlA5NkRFTnBPcHVCWDJhMGJRQlI3ZHN0MnJleHp0c2lEVWNxeW1jSDZuVQ&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=QUFFLUhqbU1ObGNaRDZaRmo1X1ZjejBoeTRnWkxuVUJxZ3xBQ3Jtc0ttWk1BVVhaRXRfN1VYWXBqMHdaYURTRFJNcUZJVlY3a21wRHE2ZGZaclE3WUM5bEZWbmFfT0sxWTZHOVotWVh6U3YtVk94SlA5NkRFTnBPcHVCWDJhMGJRQlI3ZHN0MnJleHp0c2lEVWNxeW1jSDZuVQ&q=https%3A%2F%2Fwww.ticketmaster.com%2Fevent%2F0A005CCD9E871F6E&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 300, + "length": 40, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "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": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "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 + } + } + }, + "onTapOptions": { + "accessibilityInfo": { + "accessibilityLabel": "YouTube Channel Link: aespa" + } + } + }, + { + "startIndex": 370, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbE9FVEtZZkVLUExjdFBnZjZnZ19KNWRYOVZUd3xBQ3Jtc0tsbHpCa1hLTVJ6MEllczlzUEpoVi1IQ2F5NG1jMnlOT3p3bnlFeE80ZzlsaG5CUXlFQnFGTkMtN19DcVYzQkw3bVlVVmNwQlpYQWZnNGNsME45WE1WQ21sR3V1Z3k5RG9DUDE0VTZQTm53Mk9vTWhiOA&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=QUFFLUhqbE9FVEtZZkVLUExjdFBnZjZnZ19KNWRYOVZUd3xBQ3Jtc0tsbHpCa1hLTVJ6MEllczlzUEpoVi1IQ2F5NG1jMnlOT3p3bnlFeE80ZzlsaG5CUXlFQnFGTkMtN19DcVYzQkw3bVlVVmNwQlpYQWZnNGNsME45WE1WQ21sR3V1Z3k5RG9DUDE0VTZQTm53Mk9vTWhiOA&q=https%3A%2F%2Fwww.instagram.com%2Faespa_official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + }, + "onTapOptions": { + "accessibilityInfo": { + "accessibilityLabel": "Instagram Channel Link: aespa_official" + } + } + }, + { + "startIndex": 391, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbVdlSGk3eDd5U0dUVG16VFJCQnhKVFBEUUxMQXxBQ3Jtc0tuX3ZJbENNY1ZSN0FFemdxTFdlcTVvc3AwZE05NEFvRW5nOHpZWDUtZG9ORHBnT1JGc2UySDh3WWl3MU53VjFvbHRSdjdxMUlGM2Z6SmdaLTVaWWxhamJEems0Uld3MGlTT0Z0bkh5Y0hpcnY1aXptSQ&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=QUFFLUhqbVdlSGk3eDd5U0dUVG16VFJCQnhKVFBEUUxMQXxBQ3Jtc0tuX3ZJbENNY1ZSN0FFemdxTFdlcTVvc3AwZE05NEFvRW5nOHpZWDUtZG9ORHBnT1JGc2UySDh3WWl3MU53VjFvbHRSdjdxMUlGM2Z6SmdaLTVaWWxhamJEems0Uld3MGlTT0Z0bkh5Y0hpcnY1aXptSQ&q=https%3A%2F%2Fwww.tiktok.com%2F%40aespa_official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + }, + "onTapOptions": { + "accessibilityInfo": { + "accessibilityLabel": "TikTok Channel Link: aespa_official" + } + } + }, + { + "startIndex": 412, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa3lNcG1lMHkwSzNLQVBrUXFNTXl0N1hNa04wUXxBQ3Jtc0tubm1sQkdaVjNYR04xOHpJV3NxZVBpb3I5V1FVOHVFNC1uWE5vb211ZmZKYzhTZXZfbjlkY09fanBRdHpjUkdRVGJJYS0xZ3NBNkVZQVhWSS0xVDYwRlRzQ0J3ODQxNDE0ODAxd1Q0cG5icVlNWndscw&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=QUFFLUhqa3lNcG1lMHkwSzNLQVBrUXFNTXl0N1hNa04wUXxBQ3Jtc0tubm1sQkdaVjNYR04xOHpJV3NxZVBpb3I5V1FVOHVFNC1uWE5vb211ZmZKYzhTZXZfbjlkY09fanBRdHpjUkdRVGJJYS0xZ3NBNkVZQVhWSS0xVDYwRlRzQ0J3ODQxNDE0ODAxd1Q0cG5icVlNWndscw&q=https%3A%2F%2Ftwitter.com%2Faespa_Official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + }, + "onTapOptions": { + "accessibilityInfo": { + "accessibilityLabel": "Twitter Channel Link: aespa_Official" + } + } + }, + { + "startIndex": 433, + "length": 20, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbjdBNG5yVEFwU0JMNGZaLUpQZ1ZoeGgwT0xOZ3xBQ3Jtc0tuRFdFNlJNV29PMThRNWo5MHZrREZ1ZU5oZlkxVmE4ZlU5STFCZW1mUFVSdXJ3VUQxUnNVVkUzLWJQMS1uRzVjdkRCV2ZxSWJ6cFNxRVVzejY0SDltZFZPc2xwS3ZPZGIxcFZ6cndIVkMtUjVtZ054cw&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=QUFFLUhqbjdBNG5yVEFwU0JMNGZaLUpQZ1ZoeGgwT0xOZ3xBQ3Jtc0tuRFdFNlJNV29PMThRNWo5MHZrREZ1ZU5oZlkxVmE4ZlU5STFCZW1mUFVSdXJ3VUQxUnNVVkUzLWJQMS1uRzVjdkRCV2ZxSWJ6cFNxRVVzejY0SDltZFZPc2xwS3ZPZGIxcFZ6cndIVkMtUjVtZ054cw&q=https%3A%2F%2Fwww.facebook.com%2Faespa.official&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + }, + "onTapOptions": { + "accessibilityInfo": { + "accessibilityLabel": "Facebook Channel Link: aespa.official" + } + } + }, + { + "startIndex": 454, + "length": 23, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CBwQ040EGAMiEwjGtqeIuryFAxUvb3oFHcieCCxIkZeu3Of16vNl", + "commandMetadata": { + "webCommandMetadata": { + "url": "https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbEtGMHB6eXBESW92aEVLc1FybkRwQU95eTh6UXxBQ3Jtc0tuWXc5d2JsTHFYcHExdy1FTDFyUV9wdU1DSmxELUxGSGlPMzhBdFVkblRSZkNLQzRaMEJGUGhYLWp4RU40YUVwV3N3ZUpRTVVKVDRiY19zeE5RUkt2dW5aUVcxcHBRQldCOTE3YktXSXZlSFJhRWRjdw&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=QUFFLUhqbEtGMHB6eXBESW92aEVLc1FybkRwQU95eTh6UXxBQ3Jtc0tuWXc5d2JsTHFYcHExdy1FTDFyUV9wdU1DSmxELUxGSGlPMzhBdFVkblRSZkNLQzRaMEJGUGhYLWp4RU40YUVwV3N3ZUpRTVVKVDRiY19zeE5RUkt2dW5aUVcxcHBRQldCOTE3YktXSXZlSFJhRWRjdw&q=https%3A%2F%2Fweibo.com%2Faespa&v=ZeerrnuLi5E", + "target": "TARGET_NEW_WINDOW", + "nofollow": true + } + } + } + }, + { + "startIndex": 479, + "length": 6, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CHAQ3NcEGC8iEwjGtqeIuryFAxUvb3oFHcieCCw=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/aespa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgVhZXNwYRgB" + } + } + }, + "loggingDirectives": { + "trackingParams": "CHAQ3NcEGC8iEwjGtqeIuryFAxUvb3oFHcieCCw=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 486, + "length": 5, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CG8Q3NcEGDAiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/%C3%A6spa", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUJCgXDpnNwYRgB" + } + } + }, + "loggingDirectives": { + "trackingParams": "CG8Q3NcEGDAiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 492, + "length": 11, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CG4Q3NcEGDEiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "commandMetadata": { + "webCommandMetadata": { + "url": "/hashtag/blackmamba", + "webPageType": "WEB_PAGE_TYPE_BROWSE", + "rootVe": 6827, + "apiUrl": "/youtubei/v1/browse" + } + }, + "browseEndpoint": { + "browseId": "FEhashtag", + "params": "6gUOCgpibGFja21hbWJhGAE%3D" + } + } + }, + "loggingDirectives": { + "trackingParams": "CG4Q3NcEGDEiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 504, + "length": 5, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CG0Q3NcEGDIiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "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": "CG0Q3NcEGDIiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "enableDisplayloggerExperiment": true + } + }, + { + "startIndex": 510, + "length": 4, + "onTap": { + "innertubeCommand": { + "clickTrackingParams": "CGwQ3NcEGDMiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "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": "CGwQ3NcEGDMiEwjGtqeIuryFAxUvb3oFHcieCCw=", + "enableDisplayloggerExperiment": true + } + } + ], + "styleRuns": [ + { + "startIndex": 0, + "length": 58, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 58, + "length": 36, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 94, + "length": 19, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "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 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 213, + "length": 40, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 253, + "length": 47, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 300, + "length": 40, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 340, + "length": 17, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "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_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 370, + "length": 20, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + } + }, + { + "startIndex": 390, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "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 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "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 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "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 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 454, + "length": 23, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 477, + "length": 2, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 479, + "length": 6, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 485, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 486, + "length": 5, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 491, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 492, + "length": 11, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 503, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 504, + "length": 5, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 509, + "length": 1, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 510, + "length": 4, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4282296063 + }, + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4278607828 + } + ] + } + }, + "fontFamilyName": "Roboto" + }, + { + "startIndex": 514, + "length": 46, + "styleRunExtensions": { + "styleRunColorMapExtension": { + "colorMap": [ + { + "key": "USER_INTERFACE_THEME_LIGHT", + "value": 4279440147 + }, + { + "key": "USER_INTERFACE_THEME_DARK", + "value": 4294967295 + } + ] + } + }, + "fontFamilyName": "Roboto" + } + ], + "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" + }, + "margin": { + "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" + }, + "margin": { + "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" + }, + "margin": { + "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" + }, + "margin": { + "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" + }, + "margin": { + "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" + }, + "margin": { + "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 + } + ] + } + } + } + } + } + ] + } } diff --git a/tests/youtube.rs b/tests/youtube.rs index 84c6b08..f4979ef 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -2519,7 +2519,7 @@ async fn music_new_videos(rp: RustyPipe) { assert!(!video.name.is_empty()); assert!(!video.cover.is_empty(), "got no cover"); if let Some(view_count) = video.view_count { - assert_gte(view_count, 1000, "views"); + assert_gte(view_count, 500, "views"); } else { // Podcast episode: shows duration instead of view count assert!(video.duration.is_some(), "no view count or duration");