-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
The search
for Korean short
s is no more working!
#300
Comments
As someone figured out on Discord, it does not work for English searches as well. I am investigating the issue. |
search
for Korean works in short
s is not working!
search
for Korean works in short
s is not working!search
for Korean works in short
s is no more working!
search
for Korean works in short
s is no more working!search
for Korean short
s is no more working!
Personal notes:In Firefox %EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88 turns into 굿파트너. I confirm the issue on local instance:
Related to #24. It seems that https://www.youtube.com/results?search_query=test have 2 carousels to some extent redundant and provide a limited number of entries. 40 entries for the first one and the other one being of 10 entries. getJSONPathFromKey results | grep 'Can you pass the dumb test'
The Shorts tab look more specific hence better. At least it returns 279 entries. getJSONPathFromKey a | grep -i 'The 15 second personality'
It seems that until now the second approach was implemented. So as we don't know what is the quality of results tradeoff between both approaches (if there is any), let us use the second one bringing more results. Otherwise I started getting closer to previous parsing but seems to be different at the video scale: diff --git a/search.php b/search.php
index 25210bd..b990286 100644
--- a/search.php
+++ b/search.php
@@ -127,9 +127,9 @@ function getAPI($id, $order, $continuationToken)
'content' => json_encode($rawData),
]
];
- $json = getJSON('https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
if(isset($_GET['type']) && $_GET['type'] === 'short')
{
+ $json = getJSONFromHTMLForcingLanguage('https://www.youtube.com/results?search_query=' . $_GET['q']);
$contents = $json['contents']['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents'];
foreach($contents as $content)
{
@@ -142,6 +142,7 @@ function getAPI($id, $order, $continuationToken)
}
else
{
+ $json = getJSON('https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
$items = ($continuationTokenProvided ? $json['onResponseReceivedCommands'][0]['appendContinuationItemsAction']['continuationItems'] : $json['contents']['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'])[0]['itemSectionRenderer']['contents'];
}
} else { // if (isset($_GET['channelId'])) Related to #256. Protobuf usage seems mandatory, hence blocked by #265. |
The solution to this issue is not very complicated but requires a significant, in my opinion, API change by introducing a new Protobuf dependency. @KimHyeonGyeom do you host your own instance of the YouTube operational API or only rely on the official instance one at https://yt.lemnoslife.com? The same question applies to the person on Discord who can either answer here or on Discord. Your answer will help me to figure out how to proceed to this significant change. |
I’m sorry for the delayed response. I am relying solely on the instance of https://yt.lemnoslife.com! |
@Benjamin-Loison Sorry, is this going to take longer to resolve? |
I am still working on #303 but it should not take me more than today, hence I will work on your issue today. |
Personal notes:#265 solved. Just verifying that a short video id is part of the response is incorrect as it may be part of a carousel, precising that it should be the first video return is incorrect too as it is not deterministic, so here are versions verifying that all videos returned (and check that there are some) are shorts: Verify despite not determinism:import requests
import json
import base64
import blackboxprotobuf
def getBase64Protobuf(message, typedef):
data = blackboxprotobuf.encode_message(message, typedef)
return base64.b64encode(data).decode('ascii')
URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
'Content-Type': 'application/json',
#'User-Agent': 'curl/8.5.0',
}
message = {
"2": {
"2": "test",
"3": "ErEKkgGtCjqVARKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSk4AWAaSpIJCiYKBHRlc3TqAQ8KDVoLCgcIhgESABgLGGHyAQUKA0FsbNgCAbgDYQq1AeoBDwoNWgsKBwiGARIAGAsYGvIBCAoGU2hvcnRzwgKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSn4AgG4AxoKTOoBDwoNWgsKBwiGARIAGAsYSPIBCAoGVmlkZW9zwgIaeW91dHViZV92aWRlb19wYWdlIDp0eXBlOnLoAgGoAwG4A0jAAwHIAwHQAwEKKOoBDwoNWgsKBwiGARIAGAsYHPIBCwoJVW53YXRjaGVkygICCAG4AxwKJuoBDwoNWgsKBwiGARIAGAsYSvIBCQoHV2F0Y2hlZMoCAhgCuANKCi1gB-oBDwoNWgsKBwiGARIAGAsYB_IBEwoRUmVjZW50bHkgdXBsb2FkZWS4AwcKS-oBDwoNWgsKBwiGARIAGAsYBPIBBgoETGl2ZcICJ3lvdXR1YmVfbGl2ZV9icm9hZGNhc3Rfc3RhdHVzPTAgOnR5cGU6cugCAbgDBApOChVjeWJlcnRydWNrIGNyYXNoIHRlc3TqAR8KHVobCgcIhgESABgLEhBjeWJlcnRydWNrX2NyYXNo8gESChBDeWJlcnRydWNrIGNyYXNoCj8KEHZvbHZvIGNyYXNoIHRlc3TqARoKGFoWCgcIhgESABgLEgt2b2x2b19jcmFzaPIBDQoLVm9sdm8gY3Jhc2gKPwoQcGVyc29uYWxpdHkgdGVzdOoBGgoYWhYKBwiGARIAGAsSC3BlcnNvbmFsaXR58gENCgtQZXJzb25hbGl0eQozCgx0ZXN0IGNyaWNrZXTqARYKFFoSCgcIhgESABgLEgdjcmlja2V08gEJCgdDcmlja2V0Ci0KCnRlc3QgbXVzaWPqARQKEloQCgcIhgESABgLEgVtdXNpY_IBBwoFTXVzaWMKPwoQdGVzbGEgY3Jhc2ggdGVzdOoBGgoYWhYKBwiGARIAGAsSC3Rlc2xhX2NyYXNo8gENCgtUZXNsYSBjcmFzaAotCgp0ZXN0IGF1ZGlv6gEUChJaEAoHCIYBEgAYCxIFYXVkaW_yAQcKBUF1ZGlvCigKBXRlc3Rv6gEUChJaEAoHCIYBEgAYCxIFdGVzdG_yAQcKBVRlc3RvCi0KCnRlc3QgZHJpdmXqARQKEloQCgcIhgESABgLEgVkcml2ZfIBBwoFRHJpdmUKKAoFdGVzdHPqARQKEloQCgcIhgESABgLEgV0ZXN0c_IBBwoFVGVzdHMKJAoHdGVzdCBtZeoBEQoPWg0KBwiGARIAGAsSAm1l8gEECgJNZQo0Cgl0ZXN0IHRlc3TqARgKFloUCgcIhgESABgLEgl0ZXN0X3Rlc3TyAQsKCVRlc3QgdGVzdBgLWg0KCwgEKgcIhgESABgLeAA%3D",
"18": 1
},
"3": 52047873,
"4": "search-page"
}
typedef = {
"2": {
"field_order": [
"2",
"3",
"18"
],
"message_typedef": {
"2": {
"type": "string"
},
"3": {
"type": "string"
},
"18": {
"type": "int"
}
},
"type": "message"
},
"3": {
"type": "int"
},
"4": {
"type": "string"
}
}
continuation = getBase64Protobuf(message, typedef)
DATA = {
'context': {
'client': {
'clientName': 'WEB',
'clientVersion': '2.20240913.01.00',
}
},
'continuation': continuation#"EoIOEgR0ZXN0GvYNRXJFS2tnR3RDanFWQVJLT0FTaGhJSGx2ZFhSMVltVmZjMmh2Y25SelgyVnNhV2RwWW14bElEcDBlWEJsT25JZ0tHNGdlVzkxZEhWaVpWOW1iR0ZuWDJoaGMxOXdjbVZ0YVdWeVpWOTJhV1JsYjE5dFpYUmhaR0YwWVQweElEcDBlWEJsT25JcElDaHVJSGx2ZFhSMVltVmZabXhoWjE5b1lYTmZiR2wyWlY5emRISmxZVzFmYldWMFlXUmhkR0U5TVNBNmRIbHdaVHB5S1NrNEFXQWFTcElKQ2lZS0JIUmxjM1RxQVE4S0RWb0xDZ2NJaGdFU0FCZ0xHR0h5QVFVS0EwRnNiTmdDQWJnRFlRcTFBZW9CRHdvTldnc0tCd2lHQVJJQUdBc1lHdklCQ0FvR1UyaHZjblJ6d2dLT0FTaGhJSGx2ZFhSMVltVmZjMmh2Y25SelgyVnNhV2RwWW14bElEcDBlWEJsT25JZ0tHNGdlVzkxZEhWaVpWOW1iR0ZuWDJoaGMxOXdjbVZ0YVdWeVpWOTJhV1JsYjE5dFpYUmhaR0YwWVQweElEcDBlWEJsT25JcElDaHVJSGx2ZFhSMVltVmZabXhoWjE5b1lYTmZiR2wyWlY5emRISmxZVzFmYldWMFlXUmhkR0U5TVNBNmRIbHdaVHB5S1NuNEFnRzRBeG9LVE9vQkR3b05XZ3NLQndpR0FSSUFHQXNZU1BJQkNBb0dWbWxrWlc5endnSWFlVzkxZEhWaVpWOTJhV1JsYjE5d1lXZGxJRHAwZVhCbE9uTG9BZ0dvQXdHNEEwakFBd0hJQXdIUUF3RUtLT29CRHdvTldnc0tCd2lHQVJJQUdBc1lIUElCQ3dvSlZXNTNZWFJqYUdWa3lnSUNDQUc0QXh3S0p1b0JEd29OV2dzS0J3aUdBUklBR0FzWVN2SUJDUW9IVjJGMFkyaGxaTW9DQWhnQ3VBTktDaTFnQi1vQkR3b05XZ3NLQndpR0FSSUFHQXNZQl9JQkV3b1JVbVZqWlc1MGJIa2dkWEJzYjJGa1pXUzRBd2NLUy1vQkR3b05XZ3NLQndpR0FSSUFHQXNZQlBJQkJnb0VUR2wyWmNJQ0ozbHZkWFIxWW1WZmJHbDJaVjlpY205aFpHTmhjM1JmYzNSaGRIVnpQVEFnT25SNWNHVTZjdWdDQWJnREJBcE9DaFZqZVdKbGNuUnlkV05ySUdOeVlYTm9JSFJsYzNUcUFSOEtIVm9iQ2djSWhnRVNBQmdMRWhCamVXSmxjblJ5ZFdOclgyTnlZWE5vOGdFU0NoQkRlV0psY25SeWRXTnJJR055WVhOb0NqOEtFSFp2YkhadklHTnlZWE5vSUhSbGMzVHFBUm9LR0ZvV0NnY0loZ0VTQUJnTEVndDJiMngyYjE5amNtRnphUElCRFFvTFZtOXNkbThnWTNKaGMyZ0tQd29RY0dWeWMyOXVZV3hwZEhrZ2RHVnpkT29CR2dvWVdoWUtCd2lHQVJJQUdBc1NDM0JsY25OdmJtRnNhWFI1OGdFTkNndFFaWEp6YjI1aGJHbDBlUW96Q2d4MFpYTjBJR055YVdOclpYVHFBUllLRkZvU0NnY0loZ0VTQUJnTEVnZGpjbWxqYTJWMDhnRUpDZ2REY21samEyVjBDaTBLQ25SbGMzUWdiWFZ6YVdQcUFSUUtFbG9RQ2djSWhnRVNBQmdMRWdWdGRYTnBZX0lCQndvRlRYVnphV01LUHdvUWRHVnpiR0VnWTNKaGMyZ2dkR1Z6ZE9vQkdnb1lXaFlLQndpR0FSSUFHQXNTQzNSbGMyeGhYMk55WVhObzhnRU5DZ3RVWlhOc1lTQmpjbUZ6YUFvdENncDBaWE4wSUdGMVpHbHY2Z0VVQ2hKYUVBb0hDSVlCRWdBWUN4SUZZWFZrYVdfeUFRY0tCVUYxWkdsdkNpZ0tCWFJsYzNSdjZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRmRHVnpkR195QVFjS0JWUmxjM1J2Q2kwS0NuUmxjM1FnWkhKcGRtWHFBUlFLRWxvUUNnY0loZ0VTQUJnTEVnVmtjbWwyWmZJQkJ3b0ZSSEpwZG1VS0tBb0ZkR1Z6ZEhQcUFSUUtFbG9RQ2djSWhnRVNBQmdMRWdWMFpYTjBjX0lCQndvRlZHVnpkSE1LSkFvSGRHVnpkQ0J0WmVvQkVRb1BXZzBLQndpR0FSSUFHQXNTQW0xbDhnRUVDZ0pOWlFvMENnbDBaWE4wSUhSbGMzVHFBUmdLRmxvVUNnY0loZ0VTQUJnTEVnbDBaWE4wWDNSbGMzVHlBUXNLQ1ZSbGMzUWdkR1Z6ZEJnTFdnMEtDd2dFS2djSWhnRVNBQmdMZUFBJTNEkAEBGIHg6BgiC3NlYXJjaC1wYWdl",
}
PARAMS = {
'prettyPrint': 'false',
}
##
response = requests.post(URL, params = PARAMS, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)
def isDataOnlyContainingShorts(data):
verificationParams = {
'part': 'short',
}
try:
videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
for video in videos:
#print(json.dumps(video, indent = 4))
#try:
videoId = video['videoRenderer']['videoId']
# *No results found*
#except KeyError:
# return False
#print(videoId)
verificationUrl = 'http://localhost/YouTube-operational-API/videos'
verificationParams['id'] = videoId
if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
return False
except:
return False
return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data)) def isRequestStillFine(httpMethod, url, params, headers, data, needle):
data = httpMethod(url, params = params, headers = headers, json = data).json()
dataStr = json.dumps(data, indent = 4)
#print(dataStr)
return isDataOnlyContainingShorts(data) So need Protobuf recursive minimization.
Could otherwise just proceed with received page token. I am able to reproduce the warning with a standalone approach with menmob/innertube-documentation/issues/1#issuecomment-1688923923, however, Maybe have to particularly pay attention to Minimized Python script:import requests
import json
import base64
import blackboxprotobuf
def getBase64Protobuf(message, typedef):
data = blackboxprotobuf.encode_message(message, typedef)
return base64.b64encode(data, altchars = b'-_').decode('ascii')
URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
'Content-Type': 'application/json',
#'User-Agent': 'curl/8.5.0',
}
message = {
'2': {
'18': {
'7': {
'12': 26
},
'9': {
}
}
},
}
typedef = {
'2': {
'field_order': [
'18'
],
'message_typedef': {
'18': {
'field_order': [
'7',
'9'
],
'message_typedef': {
'7': {
'field_order': [
'12'
],
'message_typedef': {
'12': {
'type': 'int'
}
},
'type': 'message'
},
'9': {
'message_typedef': {},
'type': 'message'
}
},
'type': 'message'
}
},
'type': 'message'
},
'15': {
'type': 'int'
}
}
three = getBase64Protobuf(message, typedef)
message = {
'2': {
'2': 'test',
'3': three,
'18': 1
},
'3': 52047873,
'4': 'search-page'
}
typedef = {
'2': {
'field_order': [
'2',
'3',
'18'
],
'message_typedef': {
'2': {
'type': 'string'
},
'3': {
'type': 'string'
},
'18': {
'type': 'int'
}
},
'type': 'message'
},
'3': {
'type': 'int'
},
'4': {
'type': 'string'
}
}
continuation = getBase64Protobuf(message, typedef)
DATA = {
'context': {
'client': {
'clientName': 'WEB',
'clientVersion': '2.20240913.01.00',
}
},
'continuation': continuation,
}
##
response = requests.post(URL, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)
def isDataOnlyContainingShorts(data):
verificationParams = {
'part': 'short',
}
try:
videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
for video in videos:
#print(json.dumps(video, indent = 4))
#try:
videoId = video['videoRenderer']['videoId']
# *No results found*
#except KeyError:
# return False
#print(videoId)
verificationUrl = 'http://localhost/YouTube-operational-API/videos'
verificationParams['id'] = videoId
if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
print(videoId)
return False
except:
return False
return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data)) seems minimized. Some R&D about not ending up with 6 files seems needed. Can we put multiple ls proto/prototypes/
|
@KimHyeonGyeom Are the first 20 results fine for you or you need more? Personal notes:Count retrieved from both JSON in PHP and YouTube UI. |
Personal notes:Diff showing debugging:diff --git a/search.php b/search.php
index 25210bd..4fa189f 100644
--- a/search.php
+++ b/search.php
@@ -13,6 +13,16 @@
include_once 'common.php';
+includeOnceProtos([
+ 'BrowseShorts',
+ 'Sub0BrowseShorts',
+ 'Sub1BrowseShorts',
+ 'Sub2BrowseShorts',
+ 'Sub3BrowseShorts',
+ 'Sub4_7BrowseShorts',
+ 'Sub4_9BrowseShorts',
+]);
+
$realOptions = [
'id',
'snippet',
@@ -112,14 +122,58 @@ function getAPI($id, $order, $continuationToken)
'clientVersion' => MUSIC_VERSION
]
],
- 'query' => str_replace('"', '\"', $_GET['q'])
];
+ if(isset($_GET['type']) && $_GET['type'] === 'short') {
+ /*
+ $browseShorts = (new \Sub3BrowseShorts())
+ ->setSeven((new \Sub4_7BrowseShorts())
+ ->setTwelve(26));
+ $continuation = base64_encode($browseShorts->serializeToString());
+ die("!$continuation!"); // matches Python
+ $browseShorts = ((new \Sub4_7BrowseShorts())
+ ->setTwelve(26));
+ $continuation = base64_encode($browseShorts->serializeToString());
+ die("!$continuation!"); // matches Python
+ $browseShorts = (new \Sub3BrowseShorts())->setNine(new \Sub4_9BrowseShorts());
+ $continuation = base64_encode($browseShorts->serializeToString());
+ die("!$continuation!"); // matches Python
+ $browseShorts = new \Sub4_9BrowseShorts();
+ $continuation = base64_encode($browseShorts->serializeToString());
+ die("!$continuation!");*/
+ // three differs with Python
+ $sub1BrowseShorts = (new \Sub1BrowseShorts())
+ ->setTwo((new \Sub2BrowseShorts())
+ ->setEighteen((new \Sub3BrowseShorts())
+ ->setSeven((new \Sub4_7BrowseShorts())
+ ->setTwelve(26))
+ ->setNine(new \Sub4_9BrowseShorts())));
+ /*$continuation = base64_encode($browseShorts->serializeToString());
+ die($continuation);*/ // matches Python
+ /*$browseShorts = (new \Sub0BrowseShorts())
+ ->setThree(base64_encode($sub1BrowseShorts->serializeToString()));
+ $continuation = base64_encode($browseShorts->serializeToString());
+ die($continuation);*/
+ // The following does not only return shorts no matter if comment `setNine`
+ $browseShorts = (new \BrowseShorts())
+ ->setTwo((new \Sub0BrowseShorts())
+ ->setTwo('test')
+ ->setThree(base64_encode($sub1BrowseShorts->serializeToString()))
+ ->setEighteen(1))
+ ->setThree(52047873)
+ ->setFour('search-page');
+
+ $continuation = base64_encode($browseShorts->serializeToString());
+ //die($continuation);
+ $rawData['continuation'] = $continuation;
+ } else {
+ $rawData['query'] = str_replace('"', '\"', $_GET['q']);
+ if($typeBase64 !== '') {
+ $rawData['params'] = $typeBase64;
+ }
+ }
if($continuationTokenProvided) {
$rawData['continuation'] = $continuationToken;
}
- if($typeBase64 !== '') {
- $rawData['params'] = $typeBase64;
- }
$opts = [
'http' => [
'method' => 'POST',
@@ -127,7 +181,9 @@ function getAPI($id, $order, $continuationToken)
'content' => json_encode($rawData),
]
];
+ //$json = getJSON('http://localhost/https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
$json = getJSON('https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
+ die(json_encode($json));
if(isset($_GET['type']) && $_GET['type'] === 'short')
{
$contents = $json['contents']['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']; The first retrieved video is as wanted a short. Is
|
20 is plenty! |
Personal notes:When just pass 굿파트너 to echo 'EvIREgzqtb_tjIztirjrhIga3hFFcDhOa2dHYkRUcVZBUktPQVNoaElIbHZkWFIxWW1WZmMyaHZjblJ6WDJWc2FXZHBZbXhsSURwMGVYQmxPbklnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5d2NtVnRhV1Z5WlY5MmFXUmxiMTl0WlhSaFpHRjBZVDB4SURwMGVYQmxPbklwSUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU2s0QVdBYVNvQU1DaTRLRE9xMXYtMk1qTzJLdU91RWlPb0JEd29OV2dzS0J3aUdBUklBR0FzWVlmSUJCUW9EUVd4czJBSUJ1QU5oQ3JVQjZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYThnRUlDZ1pUYUc5eWRIUENBbzRCS0dFZ2VXOTFkSFZpWlY5emFHOXlkSE5mWld4cFoybGliR1VnT25SNWNHVTZjaUFvYmlCNWIzVjBkV0psWDJac1lXZGZhR0Z6WDNCeVpXMXBaWEpsWDNacFpHVnZYMjFsZEdGa1lYUmhQVEVnT25SNWNHVTZjaWtnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5c2FYWmxYM04wY21WaGJWOXRaWFJoWkdGMFlUMHhJRHAwZVhCbE9uSXBLZmdDQWJnREdncE02Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4aEk4Z0VJQ2daV2FXUmxiM1BDQWhwNWIzVjBkV0psWDNacFpHVnZYM0JoWjJVZ09uUjVjR1U2Y3VnQ0FhZ0RBYmdEU01BREFjZ0RBZEFEQVFvbzZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYzhnRUxDZ2xWYm5kaGRHTm9aV1RLQWdJSUFiZ0RIQW9tNmdFUENnMWFDd29IQ0lZQkVnQVlDeGhLOGdFSkNnZFhZWFJqYUdWa3lnSUNHQUs0QTBvS0xXQUg2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0g4Z0VUQ2hGU1pXTmxiblJzZVNCMWNHeHZZV1JsWkxnREJ3cEw2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0U4Z0VHQ2dSTWFYWmx3Z0luZVc5MWRIVmlaVjlzYVhabFgySnliMkZrWTJGemRGOXpkR0YwZFhNOU1DQTZkSGx3WlRweTZBSUJ1QU1FQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RycHF6cnQ3RHFBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnJwcXpydDdEeUFRZ0tCdXVtck91M3NBcEJDaGJxdGJfdGpJenRpcmpyaElnZzdLQ1Y3SnF3N0tlRTZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdLQ1Y3SnF3N0tlRThnRUxDZ25zb0pYc21yRHNwNFFLV3dvZTZyV183WXlNN1lxNDY0U0lNVEx0bW93ZzY0dWs3SXVjNjdPMDZyaXc2Z0VoQ2g5YUhRb0hDSVlCRWdBWUN4SVNNVEx0bW94ZjY0dWs3SXVjNjdPMDZyaXc4Z0VVQ2hJeE11MmFqQ0RyaTZUc2k1enJzN1RxdUxBS1FRb1c2cldfN1l5TTdZcTQ2NFNJSU9xenZleUxuT3lXa2VvQkdBb1dXaFFLQndpR0FSSUFHQXNTQ2VxenZleUxuT3lXa2ZJQkN3b0o2ck85N0l1YzdKYVJDaXdLRC1xMXYtMk1qTzJLdU91RWlDQXhNZW9CRVFvUFdnMEtCd2lHQVJJQUdBc1NBakV4OGdFRUNnSXhNUW9zQ2dfcXRiX3RqSXp0aXJqcmhJZ2dNVERxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TVBJQkJBb0NNVEFLS3dvTzZyV183WXlNN1lxNDY0U0lNVFBxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TV9JQkJBb0NNVE1LTlFvUzZyV183WXlNN1lxNDY0U0lJREV6N1ptVTZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRk1UUHRtWlR5QVFjS0JURXo3Wm1VQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RzbXBUc2xiM3FBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnNtcFRzbGIzeUFRZ0tCdXlhbE95VnZRbzlDaFRxdGJfdGpJenRpcmpyaElneE5PeVlpT3F6b09vQkZ3b1ZXaE1LQndpR0FSSUFHQXNTQ0RFMDdKaUk2ck9nOGdFS0NnZ3hOT3lZaU9xem9BcEJDaGJxdGJfdGpJenRpcmpyaElnZzdJU2c2ck8xNnJDYzZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdJU2c2ck8xNnJDYzhnRUxDZ25zaEtEcXM3WHFzSndLU2dvWjZyV183WXlNN1lxNDY0U0lJREV5N1ptVUlPeVlpT3F6b09vQkd3b1pXaGNLQndpR0FSSUFHQXNTRERFeTdabVVYLXlZaU9xem9QSUJEZ29NTVRMdG1aUWc3SmlJNnJPZ0NudnFBUThLRFZvTENnY0loZ0VTQUJnTEdFenlBUTBLQzFWdVpHVnlJRFFnYldsdXdnSlRLR0VnZVc5MWRIVmlaVjl6YUc5eWRGOTJhV1JsYnlBNmRIbHdaVHB5SUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU200QTB3S1Etb0JEd29OV2dzS0J3aUdBUklBR0FzWVRmSUJEQW9LTkNBdElESXdJRzFwYnNJQ0hIbHZkWFIxWW1WZmJXVmthWFZ0WDNacFpHVnZJRHAwZVhCbE9uSzRBMDBLUXVvQkR3b05XZ3NLQndpR0FSSUFHQXNZVHZJQkRRb0xUM1psY2lBeU1DQnRhVzdDQWhwNWIzVjBkV0psWDJ4dmJtZGZkbWxrWlc4Z09uUjVjR1U2Y3JnRFRoZ0xXZzBLQ3dnRUtnY0loZ0VTQUJnTGVBQSUzRJABARiB4OgYIgtzZWFyY2gtcGFnZQ==' | base64url -d | protoc --decode_raw Output:
b'\352\265\277\355\214\214\355\212\270\353\204\210'.decode('utf-8')
Source: the Stack Overflow answer 20210262 $browseShorts = (new \Sub0BrowseShorts())
->setTwo($_GET['q']);
$continuation = base64_encode($browseShorts->serializeToString());
die($continuation); echo 'Egzqtb/tjIztirjrhIg=' | base64 -d
echo 'Egzqtb/tjIztirjrhIg=' | base64 -d | protoc --decode_raw
Python script focusing on Korean:import requests
import json
import base64
import blackboxprotobuf
def getBase64Protobuf(message, typedef):
data = blackboxprotobuf.encode_message(message, typedef)
return base64.b64encode(data).decode('ascii')
URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
'Content-Type': 'application/json',
#'User-Agent': 'curl/8.5.0',
}
message = {
"2": {
"2": "\uad7f\ud30c\ud2b8\ub108",
"3": "Ep8NkgGbDTqVARKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSk4AWAaSoAMCi4KDOq1v-2MjO2KuOuEiOoBDwoNWgsKBwiGARIAGAsYYfIBBQoDQWxs2AIBuANhCrUB6gEPCg1aCwoHCIYBEgAYCxga8gEICgZTaG9ydHPCAo4BKGEgeW91dHViZV9zaG9ydHNfZWxpZ2libGUgOnR5cGU6ciAobiB5b3V0dWJlX2ZsYWdfaGFzX3ByZW1pZXJlX3ZpZGVvX21ldGFkYXRhPTEgOnR5cGU6cikgKG4geW91dHViZV9mbGFnX2hhc19saXZlX3N0cmVhbV9tZXRhZGF0YT0xIDp0eXBlOnIpKfgCAbgDGgpM6gEPCg1aCwoHCIYBEgAYCxhI8gEICgZWaWRlb3PCAhp5b3V0dWJlX3ZpZGVvX3BhZ2UgOnR5cGU6cugCAagDAbgDSMADAcgDAdADAQoo6gEPCg1aCwoHCIYBEgAYCxgc8gELCglVbndhdGNoZWTKAgIIAbgDHAom6gEPCg1aCwoHCIYBEgAYCxhK8gEJCgdXYXRjaGVkygICGAK4A0oKLWAH6gEPCg1aCwoHCIYBEgAYCxgH8gETChFSZWNlbnRseSB1cGxvYWRlZLgDBwpL6gEPCg1aCwoHCIYBEgAYCxgE8gEGCgRMaXZlwgIneW91dHViZV9saXZlX2Jyb2FkY2FzdF9zdGF0dXM9MCA6dHlwZTpy6AIBuAMECjgKE-q1v-2MjO2KuOuEiCDrpqzrt7DqARUKE1oRCgcIhgESABgLEgbrpqzrt7DyAQgKBuumrOu3sApBChbqtb_tjIztirjrhIgg7KCV7Jqw7KeE6gEYChZaFAoHCIYBEgAYCxIJ7KCV7Jqw7KeE8gELCgnsoJXsmrDsp4QKWwoe6rW_7YyM7Yq464SIMTLtmowg64uk7Iuc67O06riw6gEhCh9aHQoHCIYBEgAYCxISMTLtmoxf64uk7Iuc67O06riw8gEUChIxMu2ajCDri6Tsi5zrs7TquLAKQQoW6rW_7YyM7Yq464SIIOqzveyLnOyWkeoBGAoWWhQKBwiGARIAGAsSCeqzveyLnOyWkfIBCwoJ6rO97Iuc7JaRCiwKD-q1v-2MjO2KuOuEiCAxMeoBEQoPWg0KBwiGARIAGAsSAjEx8gEECgIxMQosCg_qtb_tjIztirjrhIggMTDqAREKD1oNCgcIhgESABgLEgIxMPIBBAoCMTAKKwoO6rW_7YyM7Yq464SIMTPqAREKD1oNCgcIhgESABgLEgIxM_IBBAoCMTMKNQoS6rW_7YyM7Yq464SIIDEz7ZmU6gEUChJaEAoHCIYBEgAYCxIFMTPtmZTyAQcKBTEz7ZmUCjgKE-q1v-2MjO2KuOuEiCDsmpTslb3qARUKE1oRCgcIhgESABgLEgbsmpTslb3yAQgKBuyalOyVvQo9ChTqtb_tjIztirjrhIgxNOyYiOqzoOoBFwoVWhMKBwiGARIAGAsSCDE07JiI6rOg8gEKCggxNOyYiOqzoApBChbqtb_tjIztirjrhIgg7ISg6rO16rCc6gEYChZaFAoHCIYBEgAYCxIJ7ISg6rO16rCc8gELCgnshKDqs7XqsJwKSgoZ6rW_7YyM7Yq464SIIDEy7ZmUIOyYiOqzoOoBGwoZWhcKBwiGARIAGAsSDDEy7ZmUX-yYiOqzoPIBDgoMMTLtmZQg7JiI6rOgCnvqAQ8KDVoLCgcIhgESABgLGEzyAQ0KC1VuZGVyIDQgbWluwgJTKGEgeW91dHViZV9zaG9ydF92aWRlbyA6dHlwZTpyIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSm4A0wKQ-oBDwoNWgsKBwiGARIAGAsYTfIBDAoKNCAtIDIwIG1pbsICHHlvdXR1YmVfbWVkaXVtX3ZpZGVvIDp0eXBlOnK4A00KQuoBDwoNWgsKBwiGARIAGAsYTvIBDQoLT3ZlciAyMCBtaW7CAhp5b3V0dWJlX2xvbmdfdmlkZW8gOnR5cGU6crgDThgLWg0KCwgEKgcIhgESABgLeAA%3D",
"18": 1
},
"3": 52047873,
"4": "search-page"
}
typedef = {
"2": {
"field_order": [
"2",
"3",
"18"
],
"message_typedef": {
"2": {
"type": "string"
},
"3": {
"type": "string"
},
"18": {
"type": "int"
}
},
"type": "message"
},
"3": {
"type": "int"
},
"4": {
"type": "string"
}
}
continuation = getBase64Protobuf(message, typedef)
DATA = {
'context': {
'client': {
'clientName': 'WEB',
'clientVersion': '2.20240913.01.00',
}
},
'continuation': continuation#"EvIREgzqtb_tjIztirjrhIga3hFFcDhOa2dHYkRUcVZBUktPQVNoaElIbHZkWFIxWW1WZmMyaHZjblJ6WDJWc2FXZHBZbXhsSURwMGVYQmxPbklnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5d2NtVnRhV1Z5WlY5MmFXUmxiMTl0WlhSaFpHRjBZVDB4SURwMGVYQmxPbklwSUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU2s0QVdBYVNvQU1DaTRLRE9xMXYtMk1qTzJLdU91RWlPb0JEd29OV2dzS0J3aUdBUklBR0FzWVlmSUJCUW9EUVd4czJBSUJ1QU5oQ3JVQjZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYThnRUlDZ1pUYUc5eWRIUENBbzRCS0dFZ2VXOTFkSFZpWlY5emFHOXlkSE5mWld4cFoybGliR1VnT25SNWNHVTZjaUFvYmlCNWIzVjBkV0psWDJac1lXZGZhR0Z6WDNCeVpXMXBaWEpsWDNacFpHVnZYMjFsZEdGa1lYUmhQVEVnT25SNWNHVTZjaWtnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5c2FYWmxYM04wY21WaGJWOXRaWFJoWkdGMFlUMHhJRHAwZVhCbE9uSXBLZmdDQWJnREdncE02Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4aEk4Z0VJQ2daV2FXUmxiM1BDQWhwNWIzVjBkV0psWDNacFpHVnZYM0JoWjJVZ09uUjVjR1U2Y3VnQ0FhZ0RBYmdEU01BREFjZ0RBZEFEQVFvbzZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYzhnRUxDZ2xWYm5kaGRHTm9aV1RLQWdJSUFiZ0RIQW9tNmdFUENnMWFDd29IQ0lZQkVnQVlDeGhLOGdFSkNnZFhZWFJqYUdWa3lnSUNHQUs0QTBvS0xXQUg2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0g4Z0VUQ2hGU1pXTmxiblJzZVNCMWNHeHZZV1JsWkxnREJ3cEw2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0U4Z0VHQ2dSTWFYWmx3Z0luZVc5MWRIVmlaVjlzYVhabFgySnliMkZrWTJGemRGOXpkR0YwZFhNOU1DQTZkSGx3WlRweTZBSUJ1QU1FQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RycHF6cnQ3RHFBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnJwcXpydDdEeUFRZ0tCdXVtck91M3NBcEJDaGJxdGJfdGpJenRpcmpyaElnZzdLQ1Y3SnF3N0tlRTZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdLQ1Y3SnF3N0tlRThnRUxDZ25zb0pYc21yRHNwNFFLV3dvZTZyV183WXlNN1lxNDY0U0lNVEx0bW93ZzY0dWs3SXVjNjdPMDZyaXc2Z0VoQ2g5YUhRb0hDSVlCRWdBWUN4SVNNVEx0bW94ZjY0dWs3SXVjNjdPMDZyaXc4Z0VVQ2hJeE11MmFqQ0RyaTZUc2k1enJzN1RxdUxBS1FRb1c2cldfN1l5TTdZcTQ2NFNJSU9xenZleUxuT3lXa2VvQkdBb1dXaFFLQndpR0FSSUFHQXNTQ2VxenZleUxuT3lXa2ZJQkN3b0o2ck85N0l1YzdKYVJDaXdLRC1xMXYtMk1qTzJLdU91RWlDQXhNZW9CRVFvUFdnMEtCd2lHQVJJQUdBc1NBakV4OGdFRUNnSXhNUW9zQ2dfcXRiX3RqSXp0aXJqcmhJZ2dNVERxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TVBJQkJBb0NNVEFLS3dvTzZyV183WXlNN1lxNDY0U0lNVFBxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TV9JQkJBb0NNVE1LTlFvUzZyV183WXlNN1lxNDY0U0lJREV6N1ptVTZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRk1UUHRtWlR5QVFjS0JURXo3Wm1VQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RzbXBUc2xiM3FBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnNtcFRzbGIzeUFRZ0tCdXlhbE95VnZRbzlDaFRxdGJfdGpJenRpcmpyaElneE5PeVlpT3F6b09vQkZ3b1ZXaE1LQndpR0FSSUFHQXNTQ0RFMDdKaUk2ck9nOGdFS0NnZ3hOT3lZaU9xem9BcEJDaGJxdGJfdGpJenRpcmpyaElnZzdJU2c2ck8xNnJDYzZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdJU2c2ck8xNnJDYzhnRUxDZ25zaEtEcXM3WHFzSndLU2dvWjZyV183WXlNN1lxNDY0U0lJREV5N1ptVUlPeVlpT3F6b09vQkd3b1pXaGNLQndpR0FSSUFHQXNTRERFeTdabVVYLXlZaU9xem9QSUJEZ29NTVRMdG1aUWc3SmlJNnJPZ0NudnFBUThLRFZvTENnY0loZ0VTQUJnTEdFenlBUTBLQzFWdVpHVnlJRFFnYldsdXdnSlRLR0VnZVc5MWRIVmlaVjl6YUc5eWRGOTJhV1JsYnlBNmRIbHdaVHB5SUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU200QTB3S1Etb0JEd29OV2dzS0J3aUdBUklBR0FzWVRmSUJEQW9LTkNBdElESXdJRzFwYnNJQ0hIbHZkWFIxWW1WZmJXVmthWFZ0WDNacFpHVnZJRHAwZVhCbE9uSzRBMDBLUXVvQkR3b05XZ3NLQndpR0FSSUFHQXNZVHZJQkRRb0xUM1psY2lBeU1DQnRhVzdDQWhwNWIzVjBkV0psWDJ4dmJtZGZkbWxrWlc4Z09uUjVjR1U2Y3JnRFRoZ0xXZzBLQ3dnRUtnY0loZ0VTQUJnTGVBQSUzRJABARiB4OgYIgtzZWFyY2gtcGFnZQ==",
}
PARAMS = {
'prettyPrint': 'false',
}
##
response = requests.post(URL, params = PARAMS, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)
def isDataOnlyContainingShorts(data):
verificationParams = {
'part': 'short',
}
try:
videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
for video in videos:
#print(json.dumps(video, indent = 4))
#try:
videoId = video['videoRenderer']['videoId']
# *No results found*
#except KeyError:
# return False
#print(videoId)
verificationUrl = 'http://localhost/YouTube-operational-API/videos'
verificationParams['id'] = videoId
if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
return False
except:
return False
return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data) and 'SBS Drama' in dataStr) https://www.php.net/manual/en/function.base64-encode.php#103849 More simplified Python script Korean compatible:import requests
import json
import base64
import blackboxprotobuf
def getBase64Protobuf(message, typedef):
data = blackboxprotobuf.encode_message(message, typedef)
return base64.b64encode(data, altchars = b'-_').decode('ascii')
URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
'Content-Type': 'application/json',
#'User-Agent': 'curl/8.5.0',
}
message = {
'2': {
'18': {
'7': {
'12': 26
},
'9': {
}
}
},
}
typedef = {
'2': {
'field_order': [
'18'
],
'message_typedef': {
'18': {
'field_order': [
'7',
'9'
],
'message_typedef': {
'7': {
'field_order': [
'12'
],
'message_typedef': {
'12': {
'type': 'int'
}
},
'type': 'message'
},
'9': {
'message_typedef': {},
'type': 'message'
}
},
'type': 'message'
}
},
'type': 'message'
},
'15': {
'type': 'int'
}
}
three = getBase64Protobuf(message, typedef)
message = {
"2": {
"2": "\uad7f\ud30c\ud2b8\ub108",
"3": three#"Ep8NkgGbDTqVARKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSk4AWAaSoAMCi4KDOq1v-2MjO2KuOuEiOoBDwoNWgsKBwiGARIAGAsYYfIBBQoDQWxs2AIBuANhCrUB6gEPCg1aCwoHCIYBEgAYCxga8gEICgZTaG9ydHPCAo4BKGEgeW91dHViZV9zaG9ydHNfZWxpZ2libGUgOnR5cGU6ciAobiB5b3V0dWJlX2ZsYWdfaGFzX3ByZW1pZXJlX3ZpZGVvX21ldGFkYXRhPTEgOnR5cGU6cikgKG4geW91dHViZV9mbGFnX2hhc19saXZlX3N0cmVhbV9tZXRhZGF0YT0xIDp0eXBlOnIpKfgCAbgDGgpM6gEPCg1aCwoHCIYBEgAYCxhI8gEICgZWaWRlb3PCAhp5b3V0dWJlX3ZpZGVvX3BhZ2UgOnR5cGU6cugCAagDAbgDSMADAcgDAdADAQoo6gEPCg1aCwoHCIYBEgAYCxgc8gELCglVbndhdGNoZWTKAgIIAbgDHAom6gEPCg1aCwoHCIYBEgAYCxhK8gEJCgdXYXRjaGVkygICGAK4A0oKLWAH6gEPCg1aCwoHCIYBEgAYCxgH8gETChFSZWNlbnRseSB1cGxvYWRlZLgDBwpL6gEPCg1aCwoHCIYBEgAYCxgE8gEGCgRMaXZlwgIneW91dHViZV9saXZlX2Jyb2FkY2FzdF9zdGF0dXM9MCA6dHlwZTpy6AIBuAMECjgKE-q1v-2MjO2KuOuEiCDrpqzrt7DqARUKE1oRCgcIhgESABgLEgbrpqzrt7DyAQgKBuumrOu3sApBChbqtb_tjIztirjrhIgg7KCV7Jqw7KeE6gEYChZaFAoHCIYBEgAYCxIJ7KCV7Jqw7KeE8gELCgnsoJXsmrDsp4QKWwoe6rW_7YyM7Yq464SIMTLtmowg64uk7Iuc67O06riw6gEhCh9aHQoHCIYBEgAYCxISMTLtmoxf64uk7Iuc67O06riw8gEUChIxMu2ajCDri6Tsi5zrs7TquLAKQQoW6rW_7YyM7Yq464SIIOqzveyLnOyWkeoBGAoWWhQKBwiGARIAGAsSCeqzveyLnOyWkfIBCwoJ6rO97Iuc7JaRCiwKD-q1v-2MjO2KuOuEiCAxMeoBEQoPWg0KBwiGARIAGAsSAjEx8gEECgIxMQosCg_qtb_tjIztirjrhIggMTDqAREKD1oNCgcIhgESABgLEgIxMPIBBAoCMTAKKwoO6rW_7YyM7Yq464SIMTPqAREKD1oNCgcIhgESABgLEgIxM_IBBAoCMTMKNQoS6rW_7YyM7Yq464SIIDEz7ZmU6gEUChJaEAoHCIYBEgAYCxIFMTPtmZTyAQcKBTEz7ZmUCjgKE-q1v-2MjO2KuOuEiCDsmpTslb3qARUKE1oRCgcIhgESABgLEgbsmpTslb3yAQgKBuyalOyVvQo9ChTqtb_tjIztirjrhIgxNOyYiOqzoOoBFwoVWhMKBwiGARIAGAsSCDE07JiI6rOg8gEKCggxNOyYiOqzoApBChbqtb_tjIztirjrhIgg7ISg6rO16rCc6gEYChZaFAoHCIYBEgAYCxIJ7ISg6rO16rCc8gELCgnshKDqs7XqsJwKSgoZ6rW_7YyM7Yq464SIIDEy7ZmUIOyYiOqzoOoBGwoZWhcKBwiGARIAGAsSDDEy7ZmUX-yYiOqzoPIBDgoMMTLtmZQg7JiI6rOgCnvqAQ8KDVoLCgcIhgESABgLGEzyAQ0KC1VuZGVyIDQgbWluwgJTKGEgeW91dHViZV9zaG9ydF92aWRlbyA6dHlwZTpyIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSm4A0wKQ-oBDwoNWgsKBwiGARIAGAsYTfIBDAoKNCAtIDIwIG1pbsICHHlvdXR1YmVfbWVkaXVtX3ZpZGVvIDp0eXBlOnK4A00KQuoBDwoNWgsKBwiGARIAGAsYTvIBDQoLT3ZlciAyMCBtaW7CAhp5b3V0dWJlX2xvbmdfdmlkZW8gOnR5cGU6crgDThgLWg0KCwgEKgcIhgESABgLeAA=",
},
"3": 52047873,
"4": "search-page"
}
typedef = {
"2": {
"field_order": [
"2",
"3",
"18"
],
"message_typedef": {
"2": {
"type": "string"
},
"3": {
"type": "string"
},
"18": {
"type": "int"
}
},
"type": "message"
},
"3": {
"type": "int"
},
"4": {
"type": "string"
}
}
continuation = getBase64Protobuf(message, typedef)
DATA = {
'context': {
'client': {
'clientName': 'WEB',
'clientVersion': '2.20240913.01.00',
}
},
'continuation': continuation#"EvIREgzqtb_tjIztirjrhIga3hFFcDhOa2dHYkRUcVZBUktPQVNoaElIbHZkWFIxWW1WZmMyaHZjblJ6WDJWc2FXZHBZbXhsSURwMGVYQmxPbklnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5d2NtVnRhV1Z5WlY5MmFXUmxiMTl0WlhSaFpHRjBZVDB4SURwMGVYQmxPbklwSUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU2s0QVdBYVNvQU1DaTRLRE9xMXYtMk1qTzJLdU91RWlPb0JEd29OV2dzS0J3aUdBUklBR0FzWVlmSUJCUW9EUVd4czJBSUJ1QU5oQ3JVQjZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYThnRUlDZ1pUYUc5eWRIUENBbzRCS0dFZ2VXOTFkSFZpWlY5emFHOXlkSE5mWld4cFoybGliR1VnT25SNWNHVTZjaUFvYmlCNWIzVjBkV0psWDJac1lXZGZhR0Z6WDNCeVpXMXBaWEpsWDNacFpHVnZYMjFsZEdGa1lYUmhQVEVnT25SNWNHVTZjaWtnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5c2FYWmxYM04wY21WaGJWOXRaWFJoWkdGMFlUMHhJRHAwZVhCbE9uSXBLZmdDQWJnREdncE02Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4aEk4Z0VJQ2daV2FXUmxiM1BDQWhwNWIzVjBkV0psWDNacFpHVnZYM0JoWjJVZ09uUjVjR1U2Y3VnQ0FhZ0RBYmdEU01BREFjZ0RBZEFEQVFvbzZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYzhnRUxDZ2xWYm5kaGRHTm9aV1RLQWdJSUFiZ0RIQW9tNmdFUENnMWFDd29IQ0lZQkVnQVlDeGhLOGdFSkNnZFhZWFJqYUdWa3lnSUNHQUs0QTBvS0xXQUg2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0g4Z0VUQ2hGU1pXTmxiblJzZVNCMWNHeHZZV1JsWkxnREJ3cEw2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0U4Z0VHQ2dSTWFYWmx3Z0luZVc5MWRIVmlaVjlzYVhabFgySnliMkZrWTJGemRGOXpkR0YwZFhNOU1DQTZkSGx3WlRweTZBSUJ1QU1FQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RycHF6cnQ3RHFBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnJwcXpydDdEeUFRZ0tCdXVtck91M3NBcEJDaGJxdGJfdGpJenRpcmpyaElnZzdLQ1Y3SnF3N0tlRTZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdLQ1Y3SnF3N0tlRThnRUxDZ25zb0pYc21yRHNwNFFLV3dvZTZyV183WXlNN1lxNDY0U0lNVEx0bW93ZzY0dWs3SXVjNjdPMDZyaXc2Z0VoQ2g5YUhRb0hDSVlCRWdBWUN4SVNNVEx0bW94ZjY0dWs3SXVjNjdPMDZyaXc4Z0VVQ2hJeE11MmFqQ0RyaTZUc2k1enJzN1RxdUxBS1FRb1c2cldfN1l5TTdZcTQ2NFNJSU9xenZleUxuT3lXa2VvQkdBb1dXaFFLQndpR0FSSUFHQXNTQ2VxenZleUxuT3lXa2ZJQkN3b0o2ck85N0l1YzdKYVJDaXdLRC1xMXYtMk1qTzJLdU91RWlDQXhNZW9CRVFvUFdnMEtCd2lHQVJJQUdBc1NBakV4OGdFRUNnSXhNUW9zQ2dfcXRiX3RqSXp0aXJqcmhJZ2dNVERxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TVBJQkJBb0NNVEFLS3dvTzZyV183WXlNN1lxNDY0U0lNVFBxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TV9JQkJBb0NNVE1LTlFvUzZyV183WXlNN1lxNDY0U0lJREV6N1ptVTZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRk1UUHRtWlR5QVFjS0JURXo3Wm1VQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RzbXBUc2xiM3FBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnNtcFRzbGIzeUFRZ0tCdXlhbE95VnZRbzlDaFRxdGJfdGpJenRpcmpyaElneE5PeVlpT3F6b09vQkZ3b1ZXaE1LQndpR0FSSUFHQXNTQ0RFMDdKaUk2ck9nOGdFS0NnZ3hOT3lZaU9xem9BcEJDaGJxdGJfdGpJenRpcmpyaElnZzdJU2c2ck8xNnJDYzZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdJU2c2ck8xNnJDYzhnRUxDZ25zaEtEcXM3WHFzSndLU2dvWjZyV183WXlNN1lxNDY0U0lJREV5N1ptVUlPeVlpT3F6b09vQkd3b1pXaGNLQndpR0FSSUFHQXNTRERFeTdabVVYLXlZaU9xem9QSUJEZ29NTVRMdG1aUWc3SmlJNnJPZ0NudnFBUThLRFZvTENnY0loZ0VTQUJnTEdFenlBUTBLQzFWdVpHVnlJRFFnYldsdXdnSlRLR0VnZVc5MWRIVmlaVjl6YUc5eWRGOTJhV1JsYnlBNmRIbHdaVHB5SUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU200QTB3S1Etb0JEd29OV2dzS0J3aUdBUklBR0FzWVRmSUJEQW9LTkNBdElESXdJRzFwYnNJQ0hIbHZkWFIxWW1WZmJXVmthWFZ0WDNacFpHVnZJRHAwZVhCbE9uSzRBMDBLUXVvQkR3b05XZ3NLQndpR0FSSUFHQXNZVHZJQkRRb0xUM1psY2lBeU1DQnRhVzdDQWhwNWIzVjBkV0psWDJ4dmJtZGZkbWxrWlc4Z09uUjVjR1U2Y3JnRFRoZ0xXZzBLQ3dnRUtnY0loZ0VTQUJnTGVBQSUzRJABARiB4OgYIgtzZWFyY2gtcGFnZQ==",
}
PARAMS = {
'prettyPrint': 'false',
}
##
response = requests.post(URL, params = PARAMS, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)
def isDataOnlyContainingShorts(data):
verificationParams = {
'part': 'short',
}
try:
videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
for video in videos:
#print(json.dumps(video, indent = 4))
#try:
videoId = video['videoRenderer']['videoId']
# *No results found*
#except KeyError:
# return False
#print(videoId)
verificationUrl = 'http://localhost/YouTube-operational-API/videos'
verificationParams['id'] = videoId
if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
return False
except:
return False
return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data) and 'SBS Drama' in dataStr) Diff with debugging:diff --git a/search.php b/search.php
index 25210bd..cb57988 100644
--- a/search.php
+++ b/search.php
@@ -13,6 +13,16 @@
include_once 'common.php';
+includeOnceProtos([
+ 'BrowseShorts',
+ 'Sub0BrowseShorts',
+ 'Sub1BrowseShorts',
+ 'Sub2BrowseShorts',
+ 'Sub3BrowseShorts',
+ 'Sub4_7BrowseShorts',
+ 'Sub4_9BrowseShorts',
+]);
+
$realOptions = [
'id',
'snippet',
@@ -112,14 +122,40 @@ function getAPI($id, $order, $continuationToken)
'clientVersion' => MUSIC_VERSION
]
],
- 'query' => str_replace('"', '\"', $_GET['q'])
];
+ if(isset($_GET['type']) && $_GET['type'] === 'short') {
+ /*$browseShorts = (new \Sub0BrowseShorts())
+ ->setTwo($_GET['q']);
+ $continuation = base64_encode($browseShorts->serializeToString());
+ die($continuation);*/
+ $sub1BrowseShorts = (new \Sub1BrowseShorts())
+ ->setTwo((new \Sub2BrowseShorts())
+ ->setEighteen((new \Sub3BrowseShorts())
+ ->setSeven((new \Sub4_7BrowseShorts())
+ ->setTwelve(26))
+ ->setNine(new \Sub4_9BrowseShorts())));
+ //die(base64_encode($sub1BrowseShorts->serializeToString()));
+ $browseShorts = (new \BrowseShorts())
+ ->setTwo((new \Sub0BrowseShorts())
+ ->setTwo($_GET['q'])
+ ->setThree(base64_encode($sub1BrowseShorts->serializeToString())))
+ ->setThree(52047873)
+ ->setFour('search-page');
+ //$browseShorts = (new \Sub0BrowseShorts())
+ // ->setTwo($_GET['q']);
+
+ $continuation = base64url_encode($browseShorts->serializeToString());
+ //die($continuation);
+ $rawData['continuation'] = $continuation;
+ } else {
+ $rawData['query'] = str_replace('"', '\"', $_GET['q']);
+ if($typeBase64 !== '') {
+ $rawData['params'] = $typeBase64;
+ }
+ }
if($continuationTokenProvided) {
$rawData['continuation'] = $continuationToken;
}
- if($typeBase64 !== '') {
- $rawData['params'] = $typeBase64;
- }
$opts = [
'http' => [
'method' => 'POST',
@@ -128,17 +164,10 @@ function getAPI($id, $order, $continuationToken)
]
];
$json = getJSON('https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
+ //die(json_encode($json));
if(isset($_GET['type']) && $_GET['type'] === 'short')
{
- $contents = $json['contents']['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents'];
- foreach($contents as $content)
- {
- if(array_key_exists('reelShelfRenderer', $content))
- {
- $items = $content['reelShelfRenderer']['items'];
- break;
- }
- }
+ $items = $json['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents'];
}
else
{
@@ -178,13 +207,13 @@ function getAPI($id, $order, $continuationToken)
for ($itemsIndex = 0; $itemsIndex < $itemsCount - ($continuationTokenProvided || $_GET['hashtag'] ? 1 : 0); $itemsIndex++) { // check upper bound for hashtags
$item = $items[$itemsIndex];
$path = '';
- $isShort = isset($_GET['type']) && $_GET['type'] === 'short';
+ //die(json_encode($item));
if (isset($_GET['hashtag'])) {
$path = 'richItemRenderer/content/videoRenderer';
} elseif (isset($_GET['q'])) {
- $path = $isShort ? 'reelItemRenderer' : 'videoRenderer';
+ $path = 'videoRenderer';
// Skip `People also watched`.
- if(!$isShort && !array_key_exists($path, $item)) {
+ if(!array_key_exists($path, $item)) {
continue;
}
} else {
@@ -203,11 +232,11 @@ function getAPI($id, $order, $continuationToken)
];
}
if ($options['snippet']) {
- $title = $isShort ? $gridVideoRenderer['headline']['simpleText'] : $gridVideoRenderer['title']['runs'][0]['text'];
+ $title = $gridVideoRenderer['title']['runs'][0]['text'];
$run = $gridVideoRenderer['ownerText']['runs'][0];
$browseEndpoint = $run['navigationEndpoint']['browseEndpoint'];
$channelId = $browseEndpoint['browseId'];
- $views = call_user_func($isShort ? 'getIntValue' : 'getIntFromViewCount', $gridVideoRenderer['viewCountText']['simpleText'], 'view');
+ $views = getIntFromViewCount($gridVideoRenderer['viewCountText']['simpleText']);
$badges = $gridVideoRenderer['badges'];
$badges = !empty($badges) ? array_map(fn($badge) => $badge['metadataBadgeRenderer']['label'], $badges) : [];
$chapters = $gridVideoRenderer['expandableMetadata']['expandableMetadataRenderer']['expandedContent']['horizontalCardListRenderer']['cards'];
@@ -226,7 +255,7 @@ function getAPI($id, $order, $continuationToken)
'channelTitle' => $run['text'],
'channelHandle' => $channelHandle[0] === '@' ? $channelHandle : null,
'timestamp' => $gridVideoRenderer['publishedTimeText']['simpleText'],
- 'duration' => $isShort ? getIntValue(end(explode('- ', str_replace(' - play video', '', $gridVideoRenderer['accessibility']['accessibilityData']['label']))), 'second') : getIntFromDuration($gridVideoRenderer['lengthText']['simpleText']),
+ 'duration' => getIntFromDuration($gridVideoRenderer['lengthText']['simpleText']),
'views' => $views,
'badges' => $badges,
'channelApproval' => $gridVideoRenderer['ownerBadges'][0]['metadataBadgeRenderer']['tooltip'], |
Fix deployed, let me know if you have issues. Thanks for having reported this issue. |
Personal notes:Next time have to face such Protobuf will ask on Discord if some people know how to better proceed. Don't forget to provide a minimal reproducible example and a wanted example code. See https://discord.com/channels/933841502155706418/933841503103627316/1295201776424849464. |
@Benjamin-Loison Can't you use it locally? I'm using docker with the main branch and have the same problem as before. |
work fine. I believe that your Docker container/image (I forgot how all that work) is not up-to-date. |
Note that the homepage of the YouTube operational API instance shows the commit used:
Source: https://yt.lemnoslife.com |
Let me try again |
@KimHyeonGyeom Is there an error in logs when fetching |
“Yes, when I send the API request, it returns a 500 response.” response : [2024년 9월 19일:01:45:15 +0000] "GET /search?part=snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short HTTP/1.1" 500 218 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" |
What you sent me are access logs ( What commit is shown on your instance homepage, as I mentioned in #issuecomment-2359738845? |
About #issuecomment-2359809058, concerning warnings you can get rid of tests like: YouTube-operational-API/videos.php Lines 5 to 34 in 0ddadb1
Related to #23. |
I’m sorry, I didn’t understand what I need to check. |
Send here the result of |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>YouTube operational API</title>
<style>
body {
max-width: 73%;
margin: 5% auto;
font-family: sans-serif;
color: #444;
padding: 0;
}
h1,
h2,
h3 {
line-height: 1.2;
}
p {
word-break: break-word;
}
@media (prefers-color-scheme: dark) {
body {
color: #c9d1d9;
background: #0d1117;
}
a:link {
color: #58a6ff;
}
a:visited {
color: #8e96f0;
}
}
</style>
</head>
<body>
<h1>YouTube operational API works when <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a> fails.</h1>
<h2>Current implemented features:</h2>
<p>Based on <a href="https://developers.google.com/youtube/v3/docs/channels/list">Channels: list</a>: <a href="http://localhost:8081/channels?part=status,upcomingEvents,shorts,community,channels,about,approval,playlists,snippet,membership,popular,recent,letsPlay&cId=C_ID&id=CHANNEL_ID&handle=HANDLE&forUsername=USERNAME&raw=RAW&order=viewCount(&pageToken=PAGE_TOKEN)">http://localhost:8081/channels?part=status,upcomingEvents,shorts,community,channels,about,approval,playlists,snippet,membership,popular,recent,letsPlay&cId=C_ID&id=CHANNEL_ID&handle=HANDLE&forUsername=USERNAME&raw=RAW&order=viewCount(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/commentThreads/list">CommentThreads: list</a>: <a href="http://localhost:8081/commentThreads?part=snippet,replies&id=COMMENT_ID&videoId=VIDEO_ID&order=relevance,time(&pageToken=PAGE_TOKEN)">http://localhost:8081/commentThreads?part=snippet,replies&id=COMMENT_ID&videoId=VIDEO_ID&order=relevance,time(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/playlists/list">Playlists: list</a>: <a href="http://localhost:8081/playlists?part=snippet,statistics&id=PLAYLIST_ID">http://localhost:8081/playlists?part=snippet,statistics&id=PLAYLIST_ID</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/playlistItems/list">PlaylistItems: list</a>: <a href="http://localhost:8081/playlistItems?part=snippet&playlistId=PLAYLIST_ID(&pageToken=PAGE_TOKEN)">http://localhost:8081/playlistItems?part=snippet&playlistId=PLAYLIST_ID(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/search/list">Search: list</a>: <a href="http://localhost:8081/search?part=id,snippet&q=QUERY&channelId=CHANNEL_ID&eventType=upcoming&hashtag=HASH_TAG&type=video,short&order=viewCount,relevance(&pageToken=PAGE_TOKEN)">http://localhost:8081/search?part=id,snippet&q=QUERY&channelId=CHANNEL_ID&eventType=upcoming&hashtag=HASH_TAG&type=video,short&order=viewCount,relevance(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/videos/list">Videos: list</a>: <a href="http://localhost:8081/videos?part=id,status,contentDetails,music,short,impressions,musics,isPaidPromotion,isPremium,isMemberOnly,mostReplayed,qualities,chapters,isOriginal,isRestricted,snippet,clip,activity,explicitLyrics,statistics&id=VIDEO_ID&clipId=CLIP_ID&SAPISIDHASH=YOUR_SAPISIDHASH">http://localhost:8081/videos?part=id,status,contentDetails,music,short,impressions,musics,isPaidPromotion,isPremium,isMemberOnly,mostReplayed,qualities,chapters,isOriginal,isRestricted,snippet,clip,activity,explicitLyrics,statistics&id=VIDEO_ID&clipId=CLIP_ID&SAPISIDHASH=YOUR_SAPISIDHASH</a></p><p><a href="http://localhost:8081/community?part=snippet&id=POST_ID&channelId=CHANNEL_ID&order=relevance,time">http://localhost:8081/community?part=snippet&id=POST_ID&channelId=CHANNEL_ID&order=relevance,time</a></p><p><a href="http://localhost:8081/lives?part=donations,sponsorshipGifts,memberships,poll&id=VIDEO_ID">http://localhost:8081/lives?part=donations,sponsorshipGifts,memberships,poll&id=VIDEO_ID</a></p><p><a href="http://localhost:8081/liveChats?part=snippet,participants&id=VIDEO_ID&time=TIME_MS">http://localhost:8081/liveChats?part=snippet,participants&id=VIDEO_ID&time=TIME_MS</a></p>
<h2>Make <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a> request WITHOUT ANY KEY:</h2>
<p>To make <strong>ANY <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a> request WITHOUT ANY KEY/USING YOUR QUOTA</strong>, you can use: <a href="http://localhost:8081/noKey/YOUR_REQUEST">http://localhost:8081/noKey/YOUR_REQUEST</a></p>
<p>For instance you can use: <a href="http://localhost:8081/noKey/videos?part=snippet&id=VIDEO_ID">http://localhost:8081/noKey/videos?part=snippet&id=VIDEO_ID</a> instead of <a href="https://www.googleapis.com/youtube/v3/videos?part=snippet&id=VIDEO_ID">https://www.googleapis.com/youtube/v3/videos?part=snippet&id=VIDEO_ID</a></p>
<p>I may add in the future limitation per IP etc if the quota need to be better shared among the persons using this API.</p>
<p>Currently this service is <a href='keys.php'>powered by 0 keys</a>.</p>
<script>
function share() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
alert(xhttp.responseText);
youtubeDataAPIV3KeyInput.value = '';
}
};
var youtubeDataAPIV3KeyInput = document.getElementById('youtubeDataAPIV3Key');
const key = youtubeDataAPIV3KeyInput.value;
xhttp.open('GET', `addKey.php?key=${key}`);
xhttp.send();
}
</script>
Share your YouTube Data API v3 key to power the no-key service: <input type="text" id="youtubeDataAPIV3Key" placeholder="AIzaSy..." minlength="39" maxlength="39" size="39"><button type="button" onClick="share()">share</button>
<h2>Open-source:</h2>
The source code is available on GitHub: <a href="https://github.com/Benjamin-Loison/YouTube-operational-API">https://github.com/Benjamin-Loison/YouTube-operational-API</a>
<h2>Contact:</h2>
If a feature you are looking for which isn't working on <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a>, ask kindly with the below contact:<br/>
- <a href="https://yt.lemnoslife.com/matrix">Matrix</a><br/>
- <a href="https://yt.lemnoslife.com/discord">Discord</a>
<br/><br/>This instance (my instance) uses version: <a href="https://github.com/Benjamin-Loison/YouTube-operational-API/commit/0ddadb17ef58624da1b87cf0eee9592db4a5055d
">0ddadb17ef58624da1b87cf0eee9592db4a5055d
</a>
</body>
</html> The result is as shown above. |
Ok so your instance is up to date. How have you installed your Docker YouTube operational API instance, have you followed the official guide blob/0ddadb17ef58624da1b87cf0eee9592db4a5055d/README.md#run-the-api-with-docker? |
Yes, I followed the official guide exactly. |
Personal notes:On my Linux Mint 22 Cinnamon Framework 13: docker container ls
docker image ls Output:
docker Output:
git status Output:
ls -l .env{,.sample} Output:
|
@KimHyeonGyeom On what OS are you? |
I’m using Ubuntu. |
The issue is that Protobuf is not yet compliant with YouTube operational API from Docker, I will investigate that after 12:00 UTC+2 Related to #265. |
Let me know if with the new commit you still have the issue. Personal notes:sudo docker image ls
sudo docker container ls
git log | head -n 5 Output:
sudo docker-compose up Output:
curl 'http://localhost:8080//search?part=id,snippet&q=굿파트너&type=short' on Debian 12 GNOME. curl 'http://localhost:8080//search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short' Output:{
"kind": "youtube#searchListResponse",
"etag": "NotImplemented",
"items": [
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "9YgbJerHZx8"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\uc601\uc5c5\ub825 \uc788\ub294 \ubcc0\ud638\uc0ac? \ub450\ub465 \uc804\uc740\ud638 \ub4f1\uc7a5. #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/9YgbJerHZx8\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBgKEQwDw==&rs=AOn4CLAI7Q0hsYbvwmE0a5lbPQCz3o8y6g",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/9YgbJerHZx8\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBgKEQwDw==&rs=AOn4CLBMSoL2mcESeSl87Q6F4GjYirByAQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "4 days ago",
"duration": 59,
"views": 134484,
"badges": [
"New"
],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790\ud0a4\ud0a4 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "Q8vta107MoU"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\ubd88\ub95c\ub0a8\ub140\uc758 \ub05d #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/Q8vta107MoU\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEIwDw==&rs=AOn4CLDcistRGOPiQXud9eOSsm8_-2H1AQ",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/Q8vta107MoU\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEIwDw==&rs=AOn4CLB8mZ2sAUyBOGypeQYW65_5N_GjNQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "2 weeks ago",
"duration": 60,
"views": 241644,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\ud3b8\uc9d1\uc790_\ub3d9\ub3d9 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "1GLbAwu-myM"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\uc8c4\uc218\ubc88\ud638\uac00 \uc801\ud78c \uc18c\uc911\ud55c \ucabd\uc9c0 #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/1GLbAwu-myM\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYSyBjKGUwDw==&rs=AOn4CLANn7G_ouY--jd8c-MRm__9Cgy_BQ",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/1GLbAwu-myM\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYSyBjKGUwDw==&rs=AOn4CLBqPyJUpALw4oOytbHFhzQTiiMuJA",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "5 days ago",
"duration": 57,
"views": 143736,
"badges": [
"New"
],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\ud3b8\uc9d1\uc790_\ub3d9\ub3d9 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "tYpVf1A6tWM"
},
"snippet": {
"channelId": "UCcMdp-Z4XPzhFthAbkp_jSQ",
"title": "\uc138\uc0c1 \ubaa8\ub4e0 \ub0b4\uc5f0\ub0a8\ub140\uac00 \uba85\uc2ec\ud574\uc57c\ud558\ub294 \ub9d0 #\uad7f\ud30c\ud2b8\ub108",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/tYpVf1A6tWM\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBYKEYwDw==&rs=AOn4CLC5Vc5d4a7Nl1etzkeNUopftqq8Gg",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/tYpVf1A6tWM\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBYKEYwDw==&rs=AOn4CLDemiMYs0w7uW28QK-P6hGmeL_Ogg",
"width": 720,
"height": 404
}
],
"channelTitle": "\uc20f\ud504\ub808\uc18c",
"channelHandle": "@%EC%88%8F%ED%94%84%EB%A0%88%EC%86%8C",
"timestamp": "2 weeks ago",
"duration": 54,
"views": 186111,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/RFR7XM93qv2h7thob-OEnmxZb4rKbV0wDqpmDneBgG9bk7Nyt12IBO2TG6X5dPlUVRdxISmR=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\ub4dc\ub77c\ub9c8 #\ud55c\uc7ac\uc774 #\uc9c0\uc2b9\ud604."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "XtYLaOBwA98"
},
"snippet": {
"channelId": "UC3re3ueOE_6VZK85zlEUWFA",
"title": "\uc8fc\uc81c \ud30c\uc545 \uc2e4\ud328\ud55c \uc0c1\uac04\ub140 #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/XtYLaOBwA98\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYTCBeKGUwDw==&rs=AOn4CLCwuSCmo3mbnKfo0cND2y-5Gll58g",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/XtYLaOBwA98\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYTCBeKGUwDw==&rs=AOn4CLAlFFo23NuxUr7S3gPfT9xSyjTrkQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Catch",
"channelHandle": "@SBSCatch",
"timestamp": "1 month ago",
"duration": 60,
"views": 242254,
"badges": [],
"channelApproval": "Verified",
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \uc8fc\uc81c \ud30c\uc545 \uc2e4\ud328\ud55c \uc0c1\uac04\ub140 #SBS #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "JOH0uHfKsi8"
},
"snippet": {
"channelId": "UC3re3ueOE_6VZK85zlEUWFA",
"title": "\"\ub0b4 \uc544\uc774 \ub9de\uc544??\" \ubed4\ubed4\ud574\uc9c4 \uc0c1\uac04\ub0a8\uc758 \uc5ed\ub300\uae09 \ub9dd\uc5b8 #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/JOH0uHfKsi8\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBaKEcwDw==&rs=AOn4CLAMibRKw88SdEX-Cs6Yv-8RsDYYyw",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/JOH0uHfKsi8\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBaKEcwDw==&rs=AOn4CLAhSPO74p1-1mt810-TAmx4yxt1fQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Catch",
"channelHandle": "@SBSCatch",
"timestamp": "3 weeks ago",
"duration": 60,
"views": 205384,
"badges": [],
"channelApproval": "Verified",
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \"\ub0b4 \uc544\uc774 \ub9de\uc544??\" \ubed4\ubed4\ud574\uc9c4 \uc0c1\uac04\ub0a8\uc758 \uc5ed\ub300\uae09 \ub9dd\uc5b8\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "tte-E687fPQ"
},
"snippet": {
"channelId": "UC3re3ueOE_6VZK85zlEUWFA",
"title": "\uc378\ub0a8\uc758 \ube48\uc790\ub9ac\uac00 \ub108\ubb34 \ud06c\ub2e4.. #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/tte-E687fPQ\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBUKDgwDw==&rs=AOn4CLA9_nCyHDKiOiNOReGe2XBLFOc9VA",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/tte-E687fPQ\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBUKDgwDw==&rs=AOn4CLAD7SGRbZlXOhmjPlFQdls5ofm4vw",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Catch",
"channelHandle": "@SBSCatch",
"timestamp": "2 days ago",
"duration": 59,
"views": 12097,
"badges": [
"New"
],
"channelApproval": "Verified",
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \uc378\ub0a8\uc758 \ube48\uc790\ub9ac\uac00 \ub108\ubb34 \ud06c\ub2e4.. #SBS #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "z5480SgvtIU"
},
"snippet": {
"channelId": "UCvueSxhMPghtEnVNATsErnw",
"title": "\ubc30\uc6b4\uac70 \uadf8\ub300\ub85c \uc368\uba39\ub294 \ud55c\uc720\ub9ac\ubcc0\ud638\uc0ac#shorts #\ub4dc\ub77c\ub9c8 #\uad7f\ud30c\ud2b8\ub108",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/z5480SgvtIU\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYNiBaKHIwDw==&rs=AOn4CLCBeRW6WPhRAse1ApDhgU2VHB2Jew",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/z5480SgvtIU\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYNiBaKHIwDw==&rs=AOn4CLBCWkdlitPgeXEa7G223w7z9LMq_w",
"width": 720,
"height": 404
}
],
"channelTitle": "\uc1fc\ud06c\ub77c\ud14c\uce20",
"channelHandle": "@syokeulatecheu",
"timestamp": "5 hours ago",
"duration": 55,
"views": 4064,
"badges": [
"New"
],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/32q44vAEY4mOd70dcYWOj4nO5dOUSRUv_Rz4pfrwRPajigkYjnewRyb8EMcPYUyyLD0qowBGCw=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": null,
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "h2bKVWKCIM8"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\uc65c \ub098\ud55c\ud14c\ub294 \uc548 \ub9d0\ud574\uc918 \uc789\uc789!!!! \uc18d\uc0c1\ud574 \uadf8\uce58\ub9cc \uc0ac\ub791\ud574 #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/h2bKVWKCIM8\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYTCBbKGUwDw==&rs=AOn4CLBbfxCgAVuA9fBMJkfoXd7kodgVOQ",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/h2bKVWKCIM8\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYTCBbKGUwDw==&rs=AOn4CLCfjYKHIUdDMw-2cfV_H3NFsw4TtQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "2 weeks ago",
"duration": 55,
"views": 496421,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "FvFQBZx-Tng"
},
"snippet": {
"channelId": "UC8JgsopXE9NdHnjvE4C6Y_w",
"title": "\uc7ac\ud310\uc9c0\uace0 \uc5ec\uc790 \ubcc0\ud638\uc0ac\ud55c\ud14c \ud654\ud480\uc774\ud558\ub294 \uc9c4\uc0c1 \uace0\uac1d #\uad7f\ud30c\ud2b8\ub108",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/FvFQBZx-Tng\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKFYwDw==&rs=AOn4CLBjyGZlnciFWRT7nJxyJn7Ykc8TIQ",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/FvFQBZx-Tng\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKFYwDw==&rs=AOn4CLDLE_K76BGJ2-2yfkw9vaZwCPkxkA",
"width": 720,
"height": 404
}
],
"channelTitle": "\ub4dc\ub77c\ub9c8\ub77c",
"channelHandle": "@drama-mara",
"timestamp": "2 months ago",
"duration": 56,
"views": 1200435,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/VEb_2KKoCp7r5xzX_1e952I2yOCRIDi7V335K89S-j2z9TmVY-htuK3ypbiTn8pX9z6EZn8yeOM=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "shorts #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\uc720\ub098 #\uc815\uc7ac\uc131 #\uae40\ubbf8\ud654."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "VtYAU2_1jbE"
},
"snippet": {
"channelId": "UCepnK54VE5Qu5KG1uJqfPTA",
"title": "[\uad7f\ud30c\ud2b8\ub108 15\ud654]\uc740\uacbd \ubcf4\ub294 \ub208\uc5d0\uc11c \uafc0\ub5a8\uc5b4\uc9c0\ub294 \uc815\uc6b0\uc9c4! \uad7f\ud30c\ud2b8\ub108 \ub9c8\uc9c0\ub9c9\ud68c\uc5d0\uc11c \uc5f0\uc778\ub420\uae4c? #\uad7f\ud30c\ud2b8\ub108 #\uc7a5\ub098\ub77c #\uae40\uc900\ud55c #\ub0a8\uc9c0\ud604",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/VtYAU2_1jbE\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEQwDw==&rs=AOn4CLCeozWPhIu2JAlSfZHFlKsBH41P6A",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/VtYAU2_1jbE\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEQwDw==&rs=AOn4CLCL7_z1oGrBgm1tPDlCTfSQkBDLrg",
"width": 720,
"height": 404
}
],
"channelTitle": "\ub4dc\ub77c\ub9c8\uc704\ub4dc\uc720",
"channelHandle": "@%EB%93%9C%EB%9D%BC%EB%A7%88%EC%9C%84%EB%93%9C%EC%9C%A0",
"timestamp": "23 hours ago",
"duration": 39,
"views": 8106,
"badges": [
"New"
],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/9WgWsEp-HN6RRTmmB4nTsyua12tcf1t1eitrPchzipJlmpI3UP6VhuReqYReEm9tVMaSeUYa=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": null,
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "ByYBhtYRlVQ"
},
"snippet": {
"channelId": "UCLzu0D0DXZNUOiuny1QkMNg",
"title": "[\uad7f\ud30c\ud2b8\ub108] - 150 \ucc9c\ud658\uc11c \uc790\ubc31 \uc720\ub3c4\ud558\ub2e4 \ud611\ubc15\ub2f9\ud55c \ucc28\uc740\uacbd #\uc7a5\ub098\ub77c #\uad7f\ud30c\ud2b8\ub108 #goodpartner #shorts",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/ByYBhtYRlVQ\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYUSBgKGUwDw==&rs=AOn4CLA317UeiAwKo1BAr37fsO5Ud7Yj3g",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/ByYBhtYRlVQ\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYUSBgKGUwDw==&rs=AOn4CLCbKukM7n4sZYnU8_qFrmGrrZ4_rw",
"width": 720,
"height": 404
}
],
"channelTitle": "\uc20f\uce20\ub77c\ub9c8(\uc20f\uce20\ub4dc\ub77c\ub9c8)",
"channelHandle": "@KrShortsRama",
"timestamp": "1 day ago",
"duration": 60,
"views": 83,
"badges": [
"New",
"4K"
],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/OVjTn4UPd-ksV7qXCYOmG42cBHNbe7Xxlpts19a7JhQ2w3FKwdk-8o1JFrDfVV_5eq9ituV3=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "["
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "] - 150 \ucc9c\ud658\uc11c \uc790\ubc31 \uc720\ub3c4\ud558\ub2e4 \ud611\ubc15\ub2f9\ud55c \ucc28\uc740\uacbd \uc7a5\ub098\ub77cX\ub0a8\uc9c0\ud604X\uae40\uc900\ud55cX\ud45c\uc9c0\ud6c8\uc774 \uc54c\ub824\uc8fc\ub294 \uc9c4\uc9dc \uc774\ud63c\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \uac83 4\uc778\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "engeB_cPsHw"
},
"snippet": {
"channelId": "UCgY-llYKjbnusFuOivE3xmA",
"title": "[\uad7f\ud30c\ud2b8\ub108 16\ud654 \uc608\uace0] \ucc28\uc740\uacbd\uc758 \ud574\uace0\ub294 \uc624\ub300\uaddc\uc758 \uacc4\ud68d\uc774\uc600\ub2e4 #\uad7f\ud30c\ud2b8\ub108",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/engeB_cPsHw\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBCKDkwDw==&rs=AOn4CLBv0fmne3gsdmSJyHo9uGIt97CY1w",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/engeB_cPsHw\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBCKDkwDw==&rs=AOn4CLCJonMXPlWzCSXrNPk2yi2wbbuOfg",
"width": 720,
"height": 404
}
],
"channelTitle": "\ub775\uc3d8\uad7f\ub4dc\ub77c\ub9c8_Think so Good Drama",
"channelHandle": "@%EB%9D%B5%EC%8F%98%EA%B5%BF%EB%93%9C%EB%9D%BC%EB%A7%88",
"timestamp": "4 days ago",
"duration": 59,
"views": 9760,
"badges": [
"New"
],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/hC4MCvU1g_NnKP35tnlN4ZYGfEfR4FqAQg9tsatjsj_QsK3znSYd-lDtK1VbDMM3HAL7W3mR=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #goodpartner #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\ud53c\uc624 #sbs\ub4dc\ub77c\ub9c8 #\ub137\ud50c\ub9ad\uc2a4 #\uc6e8\uc774\ube0c #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "14\ud654 #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "15\ud654 #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "16\ud654\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "KJBP1Ej1bgQ"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\ucc28\uc740\uacbd \uac74\ub4e4\uba74 \uc815\uc6b0\uc9c4\uc740 \ucc38\uc9c0 \uc54a\uc544(\ucd5c\uc0ac\ub77c \ucc38\uad50\uc721\ud558\uae30) #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/KJBP1Ej1bgQ\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYWSBjKGUwDw==&rs=AOn4CLCKCW0yxvNsJzp6sweVvIyZ6S4YPA",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/KJBP1Ej1bgQ\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYWSBjKGUwDw==&rs=AOn4CLCXdDYGQON1qpWoUwRqua0ntaVKuQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "1 month ago",
"duration": 56,
"views": 328820,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "pUv5XQwYpYc"
},
"snippet": {
"channelId": "UC8JgsopXE9NdHnjvE4C6Y_w",
"title": "\uc678\ub3c4\uac00 \uc758\uc2ec\uac00\ub3c4 \uc808\ub300 \ud574\uc11c\ub294 \uc548\ub418\ub294 \uc9c8\ubb38 #\uad7f\ud30c\ud2b8\ub108",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/pUv5XQwYpYc\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBkKFAwDw==&rs=AOn4CLBDelGP9MhrIvW7VTiA7GHE6eywog",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/pUv5XQwYpYc\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBkKFAwDw==&rs=AOn4CLBnpL501FO2C5a8QiOTd5dho9Yd0A",
"width": 720,
"height": 404
}
],
"channelTitle": "\ub4dc\ub77c\ub9c8\ub77c",
"channelHandle": "@drama-mara",
"timestamp": "2 months ago",
"duration": 50,
"views": 640486,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/VEb_2KKoCp7r5xzX_1e952I2yOCRIDi7V335K89S-j2z9TmVY-htuK3ypbiTn8pX9z6EZn8yeOM=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "shorts #"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\uc720\ub098 #\uc815\uc7ac\uc131 #\uae40\ubbf8\ud654."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "ftNZ-A5fRe4"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\uc774\ub7f0 \uac83\uae4c\uc9c0 \uc54c\ub824\uc918\uc57c \ub3fc?!(\uc88b\uc74c)\uc7ac\ud76c \uae30\ubd84 \uc88b\uc544\uc694. #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/ftNZ-A5fRe4\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBbKEcwDw==&rs=AOn4CLBoJgESAJyaOHOpiNxss7SXauU5Sw",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/ftNZ-A5fRe4\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBbKEcwDw==&rs=AOn4CLBktPNtWXrf5kfK_JMy1RHoQGv2ng",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "1 month ago",
"duration": 49,
"views": 182162,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uc720\ub098 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "wHrGf1u4OVs"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\uc740\uacbd\uc740 \uc9c0\uae08...\uc77c\ub9cc \uc544\ub294 \uc5c4\ub9c8\uc5d0\uc11c \ubc97\uc5b4\ub098\uae30 \ud504\ub85c\uc81d\ud2b8 \uc911 #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/wHrGf1u4OVs\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBlKGUwDw==&rs=AOn4CLAgrMONqSTxFh1cUQYdzYv24xrRAw",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/wHrGf1u4OVs\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBlKGUwDw==&rs=AOn4CLDlG7xDFTrW0s0nXUQu5BFwwfkELA",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "1 month ago",
"duration": 60,
"views": 264224,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "YGfSYWJLB5w"
},
"snippet": {
"channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
"title": "\uc544\ub2c8? \ub098 \uc790\ub824\uace0 \ud588\ub294\ub370?(\uc5c4\ub9c8 \uae30\ub2e4\ub9bc) #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/YGfSYWJLB5w\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBcKEswDw==&rs=AOn4CLDAsh6Lvwg7L71lEzu3k66L7DzxRA",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/YGfSYWJLB5w\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBcKEswDw==&rs=AOn4CLDzoc2YQrkoXXVs_js6hbYhS5s12Q",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Drama",
"channelHandle": "@SBSdrama.official",
"timestamp": "1 month ago",
"duration": 50,
"views": 353895,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uc720\ub098 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "cpq6lfTWtn0"
},
"snippet": {
"channelId": "UCcOYEm78CpaZQvPE6LtoSeA",
"title": "[9\ud68c \uc5d4\ub529] \"\uc5c4\ub9c8\uac00 \ubbf8\uc548\ud574\" \ub4dc\ub514\uc5b4 \uc804\ud558\ub294 \uc740\uacbd\uacfc \uc7ac\ud76c\uc758 \uc9c4\uc2ec\ud83d\ude22 #Shorts | \uad7f\ud30c\ud2b8\ub108 | SBS",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/cpq6lfTWtn0\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAK4CIoCDAgAEAEYQCBYKHIwDw==&rs=AOn4CLDr3jN6Kx_LWTjHxZHpjxnVvg6z6Q",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/cpq6lfTWtn0\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAK4CIoCDAgAEAEYQCBYKHIwDw==&rs=AOn4CLBbzDfd_Yv0HGdgGostNSSVLlEqnQ",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS ",
"channelHandle": "@SBSNOW",
"timestamp": "3 weeks ago",
"duration": 56,
"views": 96005,
"badges": [],
"channelApproval": null,
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/Zo2b8wKRyymppEmpCvesR0V2BbKKLH8pfXN-bgvTf4TSEPYuEYwX_knOvqwd7droOujdwx6B=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "\uc774\ud63c\uc774 '\ucc9c\uc9c1'\uc778 \uc2a4\ud0c0 \ubcc0\ud638\uc0ac \ucc28\uc740\uacbd\uacfc \uc774\ud63c\uc740 '\ucc98\uc74c'\uc778 \uc2e0\uc785 \ubcc0\ud638\uc0ac \ud55c\uc720\ub9ac\uc758 \ucc28\uac11\uace0 \ub728\uac70\uc6b4 \ud734\uba3c \ubc95\uc815 \uc624\ud53c\uc2a4 \ub4dc\ub77c\ub9c8 #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604\u00a0..."
}
],
"chapters": []
}
},
{
"kind": "youtube#searchResult",
"etag": "NotImplemented",
"id": {
"kind": "youtube#video",
"videoId": "qKBAFvqcalg"
},
"snippet": {
"channelId": "UC3re3ueOE_6VZK85zlEUWFA",
"title": "\ub0a8\ud3b8 \uaf2c\uc2e0 \ud68c\uc0ac \ub3d9\ub8cc \ubcc0\ud638\uc0ac \ubcf8\uc5c5\uc73c\ub85c \ucc38\uad50\uc721\ud558\uae30! #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
"thumbnails": [
{
"url": "https:\/\/i.ytimg.com\/vi\/qKBAFvqcalg\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBgKFQwDw==&rs=AOn4CLB9M858rVdP9JnTb-hywfzbhYqH3g",
"width": 360,
"height": 202
},
{
"url": "https:\/\/i.ytimg.com\/vi\/qKBAFvqcalg\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBgKFQwDw==&rs=AOn4CLCeie59JOuFI11ADvusPxawBme57Q",
"width": 720,
"height": 404
}
],
"channelTitle": "SBS Catch",
"channelHandle": "@SBSCatch",
"timestamp": "1 month ago",
"duration": 60,
"views": 1223891,
"badges": [],
"channelApproval": "Verified",
"channelThumbnails": [
{
"url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
"width": 68,
"height": 68
}
],
"detailedMetadataSnippet": [
{
"text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
},
{
"text": "\uad7f\ud30c\ud2b8\ub108",
"bold": true
},
{
"text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \ub0a8\ud3b8 \uaf2c\uc2e0 \ud68c\uc0ac \ub3d9\ub8cc \ubcc0\ud638\uc0ac \ubcf8\uc5c5\uc73c\ub85c \ucc38\uad50\uc721\ud558\uae30!"
}
],
"chapters": []
}
}
]
} |
Everything is working fine now! Thank you! |
Hello, I have been using your API in South Korea. Until a few weeks ago, I was able to search and retrieve shorts of Korean works without any issues, but at some point, the results started coming back as
null
. Could you please take a look when you have a chance?url : https://yt.lemnoslife.com/search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short
The text was updated successfully, but these errors were encountered: