Benjamin-Loison / YouTube-operational-API

YouTube operational API works when YouTube Data API v3 fails.
397 stars 50 forks source link

The `search` for Korean `short`s is no more working! #300

Closed KimHyeonGyeom closed 1 month ago

KimHyeonGyeom commented 2 months ago

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

image

Benjamin-Loison commented 2 months ago

As someone figured out on Discord, it does not work for English searches as well. I am investigating the issue.

Benjamin-Loison commented 2 months ago
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: - http://localhost/YouTube-operational-API/search?part=snippet&q=test&type=short - http://localhost/YouTube-operational-API/search?part=snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short 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. ```bash getJSONPathFromKey results | grep 'Can you pass the dumb test' ``` ``` 184 /contents/twoColumnSearchResultsRenderer/primaryContents/sectionListRenderer/contents/0/itemSectionRenderer/contents/2/reelShelfRenderer/items/1/shortsLockupViewModel/accessibilityText Can you pass the dumb test?, 2.2 million views - play Short 202 /contents/twoColumnSearchResultsRenderer/primaryContents/sectionListRenderer/contents/0/itemSectionRenderer/contents/2/reelShelfRenderer/items/1/shortsLockupViewModel/overlayMetadata/primaryText/content Can you pass the dumb test? ``` The *Shorts* tab look more specific hence better. At least it returns 279 entries. ```bash getJSONPathFromKey a | grep -i 'The 15 second personality' ``` ``` 221 /onResponseReceivedCommands/0/reloadContinuationItemsCommand/continuationItems/0/twoColumnSearchResultsRenderer/primaryContents/sectionListRenderer/contents/0/itemSectionRenderer/contents/0/videoRenderer/title/runs/0/text The 15 second personality test 247 /onResponseReceivedCommands/0/reloadContinuationItemsCommand/continuationItems/0/twoColumnSearchResultsRenderer/primaryContents/sectionListRenderer/contents/0/itemSectionRenderer/contents/0/videoRenderer/title/accessibility/accessibilityData/label The 15 second personality test by Sambucha 10,187,348 views 2 years ago 46 seconds - play Short ``` 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 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.
Benjamin-Loison commented 1 month ago

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.

KimHyeonGyeom commented 1 month ago

I’m sorry for the delayed response. I am relying solely on the instance of https://yt.lemnoslife.com!

KimHyeonGyeom commented 1 month ago

@Benjamin-Loison Sorry, is this going to take longer to resolve?

Benjamin-Loison commented 1 month ago

I am still working on #303 but it should not take me more than today, hence I will work on your issue today.

Benjamin-Loison commented 1 month ago
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: ```python 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)) ```
```python 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. `"seen_repeated": True,` and huge Protobuf leads to *The field_order list does not match the fields from _encode_message_field* warning which leads to different Protobuf Base64 and does not return only shorts anymore. 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](https://github.com/menmob/innertube-documentation/issues/1#issuecomment-1688923923), however, `3` seems to match the regenerated one... Maybe have to particularly pay attention to `altchars`. It solved matching issue.
Minimized Python script: ```python 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 `message`s in a single file? ```bash ls proto/prototypes/ ``` ``` browse.proto ```
proto/prototypes/browse.proto: ```protobuf syntax = "proto3"; message SubBrowse { string postId = 22; } message Browse { string endpoint = 2; SubBrowse subBrowse = 25; } ```
```bash ls proto/php/ ``` does not return anything. ```bash protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) ``` does not return anything. ```bash ls proto/php/ ``` ``` Browse.php GPBMetadata SubBrowse.php ``` `community?part=snippet&id=UgwSoAm2bGLaJM44UTZ4AaABCQ&channelId=UCQxJsAlqmBPAbR_0syDi9mg` still works as before, so there is no need to make a file per level. What would be nice is to not have to name each level then. DuckDuckGo and Google first pages of result for *Protobuf PHP unnamed message*, *Protobuf PHP message in message* and *Protobuf PHP unnamed message in message* do not seem to help. The order does not matter we can declare children `message`s after parent ones. Could make an algorithm for generating `.proto` from Python `blackboxprotobuf`, maybe it already includes this feature. Then make an algorithm to load PHP Protobuf structure with rewriting in another form than the wanted simplist array. ```php $subBrowse = new \SubBrowse()->setPostId($postId); ``` does not work contrarily to: ```php $subBrowse = new \SubBrowse(); $subBrowse->setPostId($postId); ``` ``` [Sun Sep 15 20:00:21.152722 2024] [php:error] [pid 10735] [client 127.0.0.1:36542] PHP Parse error: syntax error, unexpected token "->" in /var/www/html/YouTube-operational-API/community.php on line 61 ``` However: ```php $subBrowse = (new \SubBrowse())->setPostId($postId); ``` works fine. Encoding empty `dict` returns empty string. Debugging to see where Base64 Protobuf string starts differing takes time, more than in Python. In Python can we get rid of some stuff like `field_order` when there is a single entry?
Benjamin-Loison commented 1 month ago

@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.
Benjamin-Loison commented 1 month ago
Personal notes:
Diff showing debugging: ```diff 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 `Sub4_9BrowseShorts` really necessary?
browse_shorts.proto: ```protobuf syntax = "proto3"; message BrowseShorts { Sub0BrowseShorts two = 2; int32 three = 3; string four = 4; } message Sub0BrowseShorts { string two = 2; string three = 3; int32 eighteen = 18; } message Sub1BrowseShorts { Sub2BrowseShorts two = 2; } message Sub2BrowseShorts { Sub3BrowseShorts eighteen = 18; } message Sub3BrowseShorts { Sub4_7BrowseShorts seven = 7; Sub4_9BrowseShorts nine = 9; } message Sub4_7BrowseShorts { int32 twelve = 12; } message Sub4_9BrowseShorts { } ```
Cleaned diff: ```diff diff --git a/search.php b/search.php index 25210bd..1d2b8e9 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,33 @@ function getAPI($id, $order, $continuationToken) 'clientVersion' => MUSIC_VERSION ] ], - 'query' => str_replace('"', '\"', $_GET['q']) ]; + if(isset($_GET['type']) && $_GET['type'] === 'short') { + $sub1BrowseShorts = (new \Sub1BrowseShorts()) + ->setTwo((new \Sub2BrowseShorts()) + ->setEighteen((new \Sub3BrowseShorts()) + ->setSeven((new \Sub4_7BrowseShorts()) + ->setTwelve(26)) + ->setNine(new \Sub4_9BrowseShorts()))); + $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()); + $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,6 +157,7 @@ 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']; ```
I asked myself if it was time to switch to Python with such a bad coding pattern.
KimHyeonGyeom commented 1 month ago

@KimHyeonGyeom처음 20개 결과가 괜찮은가요, 아니면 더 필요한가요?

개인적인 메모:

PHP의 JSON과 YouTube UI에서 모두 검색된 개수입니다.

20 is plenty!

Benjamin-Loison commented 1 month ago
Personal notes: When just pass *굿파트너* to `q`, it does not seem to return shorts. ```bash echo 'EvIREgzqtb_tjIztirjrhIga3hFFcDhOa2dHYkRUcVZBUktPQVNoaElIbHZkWFIxWW1WZmMyaHZjblJ6WDJWc2FXZHBZbXhsSURwMGVYQmxPbklnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5d2NtVnRhV1Z5WlY5MmFXUmxiMTl0WlhSaFpHRjBZVDB4SURwMGVYQmxPbklwSUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU2s0QVdBYVNvQU1DaTRLRE9xMXYtMk1qTzJLdU91RWlPb0JEd29OV2dzS0J3aUdBUklBR0FzWVlmSUJCUW9EUVd4czJBSUJ1QU5oQ3JVQjZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYThnRUlDZ1pUYUc5eWRIUENBbzRCS0dFZ2VXOTFkSFZpWlY5emFHOXlkSE5mWld4cFoybGliR1VnT25SNWNHVTZjaUFvYmlCNWIzVjBkV0psWDJac1lXZGZhR0Z6WDNCeVpXMXBaWEpsWDNacFpHVnZYMjFsZEdGa1lYUmhQVEVnT25SNWNHVTZjaWtnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5c2FYWmxYM04wY21WaGJWOXRaWFJoWkdGMFlUMHhJRHAwZVhCbE9uSXBLZmdDQWJnREdncE02Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4aEk4Z0VJQ2daV2FXUmxiM1BDQWhwNWIzVjBkV0psWDNacFpHVnZYM0JoWjJVZ09uUjVjR1U2Y3VnQ0FhZ0RBYmdEU01BREFjZ0RBZEFEQVFvbzZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYzhnRUxDZ2xWYm5kaGRHTm9aV1RLQWdJSUFiZ0RIQW9tNmdFUENnMWFDd29IQ0lZQkVnQVlDeGhLOGdFSkNnZFhZWFJqYUdWa3lnSUNHQUs0QTBvS0xXQUg2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0g4Z0VUQ2hGU1pXTmxiblJzZVNCMWNHeHZZV1JsWkxnREJ3cEw2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0U4Z0VHQ2dSTWFYWmx3Z0luZVc5MWRIVmlaVjlzYVhabFgySnliMkZrWTJGemRGOXpkR0YwZFhNOU1DQTZkSGx3WlRweTZBSUJ1QU1FQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RycHF6cnQ3RHFBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnJwcXpydDdEeUFRZ0tCdXVtck91M3NBcEJDaGJxdGJfdGpJenRpcmpyaElnZzdLQ1Y3SnF3N0tlRTZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdLQ1Y3SnF3N0tlRThnRUxDZ25zb0pYc21yRHNwNFFLV3dvZTZyV183WXlNN1lxNDY0U0lNVEx0bW93ZzY0dWs3SXVjNjdPMDZyaXc2Z0VoQ2g5YUhRb0hDSVlCRWdBWUN4SVNNVEx0bW94ZjY0dWs3SXVjNjdPMDZyaXc4Z0VVQ2hJeE11MmFqQ0RyaTZUc2k1enJzN1RxdUxBS1FRb1c2cldfN1l5TTdZcTQ2NFNJSU9xenZleUxuT3lXa2VvQkdBb1dXaFFLQndpR0FSSUFHQXNTQ2VxenZleUxuT3lXa2ZJQkN3b0o2ck85N0l1YzdKYVJDaXdLRC1xMXYtMk1qTzJLdU91RWlDQXhNZW9CRVFvUFdnMEtCd2lHQVJJQUdBc1NBakV4OGdFRUNnSXhNUW9zQ2dfcXRiX3RqSXp0aXJqcmhJZ2dNVERxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TVBJQkJBb0NNVEFLS3dvTzZyV183WXlNN1lxNDY0U0lNVFBxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TV9JQkJBb0NNVE1LTlFvUzZyV183WXlNN1lxNDY0U0lJREV6N1ptVTZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRk1UUHRtWlR5QVFjS0JURXo3Wm1VQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RzbXBUc2xiM3FBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnNtcFRzbGIzeUFRZ0tCdXlhbE95VnZRbzlDaFRxdGJfdGpJenRpcmpyaElneE5PeVlpT3F6b09vQkZ3b1ZXaE1LQndpR0FSSUFHQXNTQ0RFMDdKaUk2ck9nOGdFS0NnZ3hOT3lZaU9xem9BcEJDaGJxdGJfdGpJenRpcmpyaElnZzdJU2c2ck8xNnJDYzZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdJU2c2ck8xNnJDYzhnRUxDZ25zaEtEcXM3WHFzSndLU2dvWjZyV183WXlNN1lxNDY0U0lJREV5N1ptVUlPeVlpT3F6b09vQkd3b1pXaGNLQndpR0FSSUFHQXNTRERFeTdabVVYLXlZaU9xem9QSUJEZ29NTVRMdG1aUWc3SmlJNnJPZ0NudnFBUThLRFZvTENnY0loZ0VTQUJnTEdFenlBUTBLQzFWdVpHVnlJRFFnYldsdXdnSlRLR0VnZVc5MWRIVmlaVjl6YUc5eWRGOTJhV1JsYnlBNmRIbHdaVHB5SUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU200QTB3S1Etb0JEd29OV2dzS0J3aUdBUklBR0FzWVRmSUJEQW9LTkNBdElESXdJRzFwYnNJQ0hIbHZkWFIxWW1WZmJXVmthWFZ0WDNacFpHVnZJRHAwZVhCbE9uSzRBMDBLUXVvQkR3b05XZ3NLQndpR0FSSUFHQXNZVHZJQkRRb0xUM1psY2lBeU1DQnRhVzdDQWhwNWIzVjBkV0psWDJ4dmJtZGZkbWxrWlc4Z09uUjVjR1U2Y3JnRFRoZ0xXZzBLQ3dnRUtnY0loZ0VTQUJnTGVBQSUzRJABARiB4OgYIgtzZWFyY2gtcGFnZQ==' | base64url -d | protoc --decode_raw ```
Output: ``` 2 { 2: "\352\265\277\355\214\214\355\212\270\353\204\210" 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" ```
```python b'\352\265\277\355\214\214\355\212\270\353\204\210'.decode('utf-8') ``` ``` '굿파트너' ``` Source: [the Stack Overflow answer 20210262](https://stackoverflow.com/a/20210262) ```php $browseShorts = (new \Sub0BrowseShorts()) ->setTwo($_GET['q']); $continuation = base64_encode($browseShorts->serializeToString()); die($continuation); ``` ```bash echo 'Egzqtb/tjIztirjrhIg=' | base64 -d ``` ``` 굿파트너 ``` ```bash echo 'Egzqtb/tjIztirjrhIg=' | base64 -d | protoc --decode_raw ``` ``` 2: "\352\265\277\355\214\214\355\212\270\353\204\210" ```
Python script focusing on Korean: ```python 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: ```python 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 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'], ```
Benjamin-Loison commented 1 month ago

Fix deployed, let me know if you have issues.

Thanks for having reported this issue.

Benjamin-Loison commented 1 month ago
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.
KimHyeonGyeom commented 1 month ago

@Benjamin-Loison Can't you use it locally? I'm using docker with the main branch and have the same problem as before.

Benjamin-Loison commented 1 month ago

@KimHyeonGyeom

work fine.

I believe that your Docker container/image (I forgot how all that work) is not up-to-date.

Benjamin-Loison commented 1 month ago

Note that the homepage of the YouTube operational API instance shows the commit used:

This instance (yt5.lemnoslife.com) uses version: fa0b1f6a9c713793490830a159820a9241a19ae6

Source: https://yt.lemnoslife.com

KimHyeonGyeom commented 1 month ago

Let me try again

KimHyeonGyeom commented 1 month ago

“When running locally with Docker, the search request returns a 500 error, and calling videos? shows a warning like in the image. Is there an additional configuration I need to set up?”

image [19/Sep/2024: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"

image image

Benjamin-Loison commented 1 month ago

@KimHyeonGyeom Is there an error in logs when fetching /search?part=snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short?

KimHyeonGyeom commented 1 month ago

@KimHyeonGyeom가져올 때 로그에 오류가 있나요 /search?part=snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short?

“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"

Benjamin-Loison commented 1 month ago

What you sent me are access logs (/var/log/apache2/access.log on my Linux Mint 22 Cinnamon) I am asking for error logs (/var/log/apache2/error.log on my Linux Mint 22 Cinnamon).

What commit is shown on your instance homepage, as I mentioned in #issuecomment-2359738845?

Benjamin-Loison commented 1 month ago

About #issuecomment-2359809058, concerning warnings you can get rid of tests like:

https://github.com/Benjamin-Loison/YouTube-operational-API/blob/0ddadb17ef58624da1b87cf0eee9592db4a5055d/videos.php#L5-L34

Related to #23.

KimHyeonGyeom commented 1 month ago

I’m sorry, I didn’t understand what I need to check.

Benjamin-Loison commented 1 month ago

Send here the result of curl http://localhost:8081.

KimHyeonGyeom commented 1 month ago
```html YouTube operational API

YouTube operational API works when YouTube Data API v3 fails.

Current implemented features:

Based on Channels: list: 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)

Based on CommentThreads: list: http://localhost:8081/commentThreads?part=snippet,replies&id=COMMENT_ID&videoId=VIDEO_ID&order=relevance,time(&pageToken=PAGE_TOKEN)

Based on Playlists: list: http://localhost:8081/playlists?part=snippet,statistics&id=PLAYLIST_ID

Based on PlaylistItems: list: http://localhost:8081/playlistItems?part=snippet&playlistId=PLAYLIST_ID(&pageToken=PAGE_TOKEN)

Based on Search: list: 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)

Based on Videos: list: 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/community?part=snippet&id=POST_ID&channelId=CHANNEL_ID&order=relevance,time

http://localhost:8081/lives?part=donations,sponsorshipGifts,memberships,poll&id=VIDEO_ID

http://localhost:8081/liveChats?part=snippet,participants&id=VIDEO_ID&time=TIME_MS

Make YouTube Data API v3 request WITHOUT ANY KEY:

To make ANY YouTube Data API v3 request WITHOUT ANY KEY/USING YOUR QUOTA, you can use: http://localhost:8081/noKey/YOUR_REQUEST

For instance you can use: http://localhost:8081/noKey/videos?part=snippet&id=VIDEO_ID instead of https://www.googleapis.com/youtube/v3/videos?part=snippet&id=VIDEO_ID

I may add in the future limitation per IP etc if the quota need to be better shared among the persons using this API.

Currently this service is powered by 0 keys.

Share your YouTube Data API v3 key to power the no-key service:

Open-source:

The source code is available on GitHub: https://github.com/Benjamin-Loison/YouTube-operational-API

Contact:

If a feature you are looking for which isn't working on YouTube Data API v3, ask kindly with the below contact:
- Matrix
- Discord

This instance (my instance) uses version: 0ddadb17ef58624da1b87cf0eee9592db4a5055d ```

The result is as shown above.

Benjamin-Loison commented 1 month ago

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?

KimHyeonGyeom commented 1 month ago

Yes, I followed the official guide exactly.

Benjamin-Loison commented 1 month ago
Personal notes: On my Linux Mint 22 Cinnamon Framework 13: ```bash docker container ls ``` ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` ```bash docker image ls ```
Output: ``` REPOSITORY TAG IMAGE ID CREATED SIZE ... php 8.2-cli 36ed67830a2e 9 months ago 529MB ... ```
```bash docker ```
Output: ``` Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Common Commands: run Create and run a new container from an image exec Execute a command in a running container ps List containers build Build an image from a Dockerfile pull Download an image from a registry push Upload an image to a registry images List images login Log in to a registry logout Log out from a registry search Search Docker Hub for images version Show the Docker version information info Display system-wide information Management Commands: builder Manage builds container Manage containers context Manage contexts image Manage images manifest Manage Docker image manifests and manifest lists network Manage networks plugin Manage plugins system Manage Docker trust Manage trust on Docker images volume Manage volumes Swarm Commands: swarm Manage Swarm Commands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server export Export a container's filesystem as a tar archive history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes Global Options: --config string Location of client config files (default "/home/benjamin/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket to connect to -l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/home/benjamin/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/home/benjamin/.docker/cert.pem") --tlskey string Path to TLS key file (default "/home/benjamin/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Run 'docker COMMAND --help' for more information on a command. For more help on how to use Docker, head to https://docs.docker.com/go/guides/ ```
```bash git status ```
Output: ``` On branch main Your branch is up to date with 'origin/main'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: community.php Untracked files: (use "git add ..." to include in what will be committed) composer.json composer.lock notes.txt proto/prototypes/four_four_string.proto proto/prototypes/four_string.proto proto/prototypes/two_string.proto proto/prototypes/video_comments.proto test.py vendor/ ytPrivate/tests/ no changes added to commit (use "git add" and/or "git commit -a") ```
```bash ls -l .env{,.sample} ```
Output: ``` -rwxrwx--- 1 benjamin www-data 22 Aug 22 2023 .env -rw-r--r-- 1 benjamin www-data 22 Feb 9 2023 .env.sample ```
.env: ``` EXPOSED_HTTP_PORT=8080 ```
.env.sample: ``` EXPOSED_HTTP_PORT=8080 ```
```bash docker-compose up ```
Output: ``` Traceback (most recent call last): File "/usr/lib/python3/dist-packages/docker/api/client.py", line 214, in _retrieve_server_version return self.version(api_version=False)["ApiVersion"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/daemon.py", line 181, in version return self._result(self._get(url), json=True) ^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/utils/decorators.py", line 46, in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/client.py", line 237, in _get return self.get(url, **self._set_request_timeout(kwargs)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 602, in get return self.request("GET", url, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 703, in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/adapters.py", line 486, in send resp = conn.urlopen( ^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 791, in urlopen response = self._make_request( ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 497, in _make_request conn.request( TypeError: HTTPConnection.request() got an unexpected keyword argument 'chunked' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/bin/docker-compose", line 33, in sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main command_func() File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 200, in perform_command project = project_from_options('.', options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 60, in project_from_options return get_project( ^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 152, in get_project client = get_client( ^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 41, in get_client client = docker_client( ^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 170, in docker_client client = APIClient(use_ssh_client=not use_paramiko_ssh, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/client.py", line 197, in __init__ self._version = self._retrieve_server_version() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/client.py", line 221, in _retrieve_server_version raise DockerException( docker.errors.DockerException: Error while fetching server API version: HTTPConnection.request() got an unexpected keyword argument 'chunked' ```
Searching DuckDuckGo and Google for `"docker.errors.DockerException: Error while fetching server API version: HTTPConnection.request() got an unexpected keyword argument 'chunked'"`. [docker-minecraft-server/issues/2578#issuecomment-1879766813](https://github.com/itzg/docker-minecraft-server/issues/2578#issuecomment-1879766813) ```bash docker-compose -v ``` ``` docker-compose version 1.29.2, build unknown ``` ```bash docker -v ``` ``` Docker version 24.0.7, build 24.0.7-0ubuntu4.1 ``` ```bash docker compose ```
Output: ``` docker: 'compose' is not a docker command. See 'docker --help' ```
I verified with `sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y` that my laptop is up to date. On my Linux Mint 22 Cinnamon Framework 13 VirtualBox *Test Travian Debian 12 (Actually fresh up to date)* virtual machine: ```bash git clone --depth 1 https://github.com/Benjamin-Loison/YouTube-operational-API ```
Output: ``` Cloning into 'YouTube-operational-API'... remote: Enumerating objects: 43, done. remote: Counting objects: 100% (43/43), done. remote: Compressing objects: 100% (40/40), done. remote: Total 43 (delta 0), reused 22 (delta 0), pack-reused 0 (from 0) Receiving objects: 100% (43/43), 50.64 KiB | 1.75 MiB/s, done. ```
```bash cp .env{.sample,} ``` ```bash docker-compose ``` ``` bash: docker-compose: command not found ``` ```bash docker ``` ``` bash: docker: command not found ``` ```bash apt show docker ```
Output: ``` Package: docker Version: 1.5-2 Priority: optional Section: x11 Maintainer: Paul Tagliamonte Installed-Size: 9,216 B Depends: wmdocker Tag: implemented-in::c++, interface::graphical, interface::x11, role::program, scope::utility, suite::gnome, suite::gnustep, suite::kde, uitoolkit::gtk, uitoolkit::qt, uitoolkit::xlib, x11::applet, x11::application Download-Size: 2,556 B APT-Sources: http://deb.debian.org/debian bookworm/main amd64 Packages Description: transitional package This is a transitional package for system tray docking application. It can safely be removed. ```
```bash apt show docker.io ```
Output: ``` Package: docker.io Version: 20.10.24+dfsg1-1+b3 Built-Using: containerd (= 1.6.20~ds1-1), continuity (= 0.3.0-1), docker-libkv (= 0.2.1-3), docker-registry (= 2.8.2+ds1-1), etcd (= 3.4.23-4), glibc (= 2.36-9), go-md2man-v2 (= 2.0.2+ds1-1), golang-1.19 (= 1.19.8-2), golang-blackfriday-v2 (= 2.1.0-1), golang-dbus (= 5.1.0-1), golang-fsnotify (= 1.6.0-2), golang-github-armon-circbuf (= 0.0~git20190214.5111143-1), golang-github-armon-go-metrics (= 0.3.4-1), golang-github-aws-aws-sdk-go (= 1.44.133-1), golang-github-beorn7-perks (= 1.0.1-1), golang-github-bsphere-le-go (= 0.0~git20170215.0.7a984a8-1.1), golang-github-cespare-xxhash (= 2.1.1-2), golang-github-cilium-ebpf (= 0.9.1-1), golang-github-cloudflare-cfssl (= 1.2.0+git20160825.89.7fb22c8-3.1), golang-github-containerd-cgroups (= 1.0.4-1), golang-github-containerd-console (= 1.0.3-1), golang-github-containerd-fifo (= 1.1.0-1), golang-github-containerd-go-runc (= 1.0.0-1), golang-github-containerd-typeurl (= 1.0.2-1), golang-github-coreos-bbolt (= 1.3.6-2), golang-github-coreos-go-systemd (= 22.3.2-1), golang-github-coreos-pkg (= 4-3), golang-github-coreos-semver (= 0.3.0-1), golang-github-cyphar-filepath-securejoin (= 0.2.3-1), golang-github-davecgh-go-spew (= 1.1.1-3), golang-github-deckarep-golang-set (= 1.5-2), golang-github-docker-docker-credential-helpers (= 0.6.4+ds1-1), golang-github-docker-go (= 0.0~git20160303.0.d30aec9-3.1), golang-github-docker-go-connections (= 0.4.0-4), golang-github-docker-go-events (= 0.0~git20190806.e31b211-4), golang-github-docker-go-metrics (= 0.0.1-2), golang-github-docker-go-units (= 0.4.0-4), golang-github-docker-libtrust (= 0.0~git20150526.0.9cbd2a1-3.1), golang-github-dustin-go-humanize (= 1.0.0-3), golang-github-fernet-fernet-go (= 0.0~git20180830.9eac43b-2), golang-github-fluent-fluent-logger-golang (= 1.9.0-1), golang-github-fvbommel-sortorder (= 1.0.2-3), golang-github-gofrs-flock (= 0.8.1-1), golang-github-gogo-googleapis (= 1.4.0-2), golang-github-golang-groupcache (= 0.0~git20200121.8c9f03a-2), golang-github-golang-protobuf-1-3 (= 1.3.5-4), golang-github-google-btree (= 1.0.0-1), golang-github-google-certificate-transparency (= 0.0~git20160709.0.0f6e3d1~ds1-3), golang-github-google-go-cmp (= 0.5.9-1), golang-github-google-gofuzz (= 1.2.0-1), golang-github-google-shlex (= 0.0~git20191202.e7afc7f-1), golang-github-google-uuid (= 1.3.0-1), golang-github-googleapis-gax-go (= 2.0.5-4), golang-github-googleapis-gnostic (= 0.2.0-4), golang-github-gorilla-mux (= 1.8.0-1), golang-github-graylog2-go-gelf (= 0.0+git20191017.1550ee6-1), golang-github-grpc-ecosystem-go-grpc-middleware (= 1.3.0-1), golang-github-grpc-ecosystem-go-grpc-prometheus (= 1.2.0+git20191002.6af20e3-3), golang-github-grpc-ecosystem-grpc-opentracing (= 0.0~git20180507.8e809c8-2), golang-github-hashicorp-errwrap (= 1.1.0-1), golang-github-hashicorp-go-immutable-radix (= 1.3.1-3), golang-github-hashicorp-go-memdb (= 1.2.1-1), golang-github-hashicorp-go-msgpack (= 0.5.5-1), golang-github-hashicorp-go-multierror (= 1.1.1-2), golang-github-hashicorp-go-sockaddr (= 1.0.2-2), golang-github-hashicorp-golang-lru (= 0.5.4-2), golang-github-hashicorp-memberlist (= 0.2.2-2), golang-github-hashicorp-serf (= 0.9.4~ds1-1), golang-github-imdario-mergo (= 0.3.12-1), golang-github-ishidawataru-sctp (= 0.0+git20210707.9a39160-1), golang-github-jmespath-go-jmespath (= 0.4.0-2), golang-github-json-iterator-go (= 1.1.12-1), golang-github-klauspost-compress (= 1.15.12+ds1-3), golang-github-miekg-dns (= 1.1.50-2), golang-github-mitchellh-hashstructure (= 1.1.0-1), golang-github-mitchellh-mapstructure (= 1.5.0-2), golang-github-moby-locker (= 1.0.1-3), golang-github-moby-sys (= 0.0~git20220606.416188a-1), golang-github-moby-term (= 0.0~git20221120.abb1982-1), golang-github-modern-go-concurrent (= 1.0.3-1.1), golang-github-modern-go-reflect2 (= 1.0.2-2), golang-github-morikuni-aec (= 1.0.0-3), golang-github-opencontainers-go-digest (= 1.0.0-2), golang-github-opencontainers-image-spec (= 1.1.0~rc2-3), golang-github-opencontainers-selinux (= 1.10.0+ds1-1), golang-github-opencontainers-specs (= 1.0.2.118.g5cfc4c3-1), golang-github-opentracing-contrib-go-stdlib (= 1.0.0-2), golang-github-opentracing-opentracing-go (= 1.2.0-2), golang-github-pelletier-go-toml (= 1.9.4-1), golang-github-philhofer-fwd (= 1.1.1-1), golang-github-pkg-errors (= 0.9.1-2), golang-github-pmezard-go-difflib (= 1.0.0-3), golang-github-prometheus-client-golang (= 1.14.0-3), golang-github-prometheus-client-model (= 0.3.0-3), golang-github-prometheus-common (= 0.39.0-2), golang-github-prometheus-procfs (= 0.8.0-3), golang-github-racksec-srslog (= 0.0~git20180709.a4725f0-2), golang-github-rcrowley-go-metrics (= 0.0~git20180125.8732c61-3), golang-github-samuel-go-zookeeper (= 0.0~git20180130.c4fab1a-1), golang-github-spf13-cobra (= 1.6.1-1), golang-github-spf13-pflag (= 1.0.6~git20210604-d5e0c0615ace-1), golang-github-tinylib-msgp (= 1.1.6-1), golang-github-tonistiigi-units (= 0.0~git20180711.6950e57-2), golang-github-urfave-cli (= 1.22.9-2), golang-github-vbatts-tar-split (= 0.11.2+ds1-1), golang-github-vishvananda-netlink (= 1.1.0.125.gf243826-4), golang-github-vishvananda-netns (= 0.0~git20211101.5004558-1), golang-github-xeipuuv-gojsonpointer (= 0.0~git20190905.02993c4-3), golang-github-xeipuuv-gojsonreference (= 0.0~git20180127.bd5ef7b-3), golang-github-xeipuuv-gojsonschema (= 1.2.0-3), golang-go-patricia (= 2.3.1-1), golang-go-zfs (= 3.0.0-1), golang-go.crypto (= 1:0.4.0-1), golang-go.opencensus (= 0.24.0-1), golang-gocapability-dev (= 0.0+git20200815.42c35b4-2), golang-gogoprotobuf (= 1.3.2-3), golang-gogottrpc (= 1.1.1-1), golang-golang-x-net (= 1:0.7.0+dfsg-1), golang-golang-x-oauth2 (= 0.3.0-1), golang-golang-x-sync (= 0.1.0-1), golang-golang-x-sys (= 0.3.0-1), golang-golang-x-term (= 0.3.0-1), golang-golang-x-text (= 0.7.0-1), golang-golang-x-time (= 0.3.0-1), golang-google-api (= 0.61.0-1), golang-google-cloud (= 0.56.0-3), golang-google-genproto (= 0.0~git20200413.b5235f6-3), golang-google-grpc (= 1.33.3-2), golang-google-protobuf (= 1.28.1-3), golang-gopkg-inf.v0 (= 0.9.1-2), golang-gopkg-yaml.v3 (= 3.0.1-3), golang-k8s-sigs-yaml (= 1.3.0-1), golang-logrus (= 1.9.0-1), golang-protobuf-extensions (= 1.0.1-3), golang-testify (= 1.8.1-1), golang-toml (= 1.2.0-2), golang-yaml.v2 (= 2.4.0-4), gotest.tools (= 3.0.3-1), notary (= 0.7.0+ds1-2), runc (= 1.1.5+ds1-1) Priority: optional Section: admin Source: docker.io (20.10.24+dfsg1-1) Maintainer: Debian Go Packaging Team Installed-Size: 151 MB Pre-Depends: init-system-helpers (>= 1.54~) Depends: libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.97), libsystemd0, adduser, containerd (>= 1.4~), iptables, lsb-base, runc (>= 1.0.0~rc8~), tini Recommends: apparmor, ca-certificates, cgroupfs-mount, git, needrestart (>= 3.1~), xz-utils Suggests: docker-doc, aufs-tools, btrfs-progs, debootstrap, e2fsprogs, rinse, rootlesskit, xfsprogs, zfs-fuse | zfsutils-linux Conflicts: docker-ce, docker-ce-cli, docker-ce-rootless-extras Homepage: https://mobyproject.org Download-Size: 36.2 MB APT-Sources: http://deb.debian.org/debian bookworm/main amd64 Packages Description: Linux container runtime Docker complements kernel namespacing with a high-level API which operates at the process level. It runs unix processes with strong guarantees of isolation and repeatability across servers. . Docker is a great building block for automating distributed systems: large-scale web deployments, database clusters, continuous deployment systems, private PaaS, service-oriented architectures, etc. . This package contains the daemon and client. Using docker.io on non-amd64 hosts is not supported at this time. Please be careful when using it on anything besides amd64. . Also, note that kernel version 3.8 or above is required for proper operation of the daemon process, and that any lower versions may have subtle and/or glaring issues. ```
```bash sudo apt install -y docker.io ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: cgroupfs-mount containerd criu libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libnet1 libproc-processtable-perl libsort-naturally-perl needrestart python3-protobuf runc tini Suggested packages: containernetworking-plugins docker-doc aufs-tools btrfs-progs rinse rootlesskit xfsprogs zfs-fuse | zfsutils-linux needrestart-session | libnotify-bin The following NEW packages will be installed: cgroupfs-mount containerd criu docker.io libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libnet1 libproc-processtable-perl libsort-naturally-perl needrestart python3-protobuf runc tini 0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded. Need to get 67.0 MB of archives. After this operation, 270 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian bookworm/main amd64 runc amd64 1.1.5+ds1-1+deb12u1 [2,710 kB] Get:2 http://deb.debian.org/debian bookworm/main amd64 containerd amd64 1.6.20~ds1-1+b1 [25.9 MB] Get:3 http://deb.debian.org/debian bookworm/main amd64 tini amd64 0.19.0-1 [255 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 docker.io amd64 20.10.24+dfsg1-1+b3 [36.2 MB] Get:5 http://deb.debian.org/debian bookworm/main amd64 cgroupfs-mount all 1.4 [6,276 B] Get:6 http://deb.debian.org/debian bookworm/main amd64 python3-protobuf amd64 3.21.12-3 [245 kB] Get:7 http://deb.debian.org/debian bookworm/main amd64 libnet1 amd64 1.1.6+dfsg-3.2 [60.3 kB] Get:8 http://deb.debian.org/debian bookworm/main amd64 criu amd64 3.17.1-2 [665 kB] Get:9 http://deb.debian.org/debian bookworm/main amd64 libintl-perl all 1.33-1 [720 kB] Get:10 http://deb.debian.org/debian bookworm/main amd64 libintl-xs-perl amd64 1.33-1 [15.6 kB] Get:11 http://deb.debian.org/debian bookworm/main amd64 libmodule-find-perl all 0.16-2 [10.6 kB] Get:12 http://deb.debian.org/debian bookworm/main amd64 libmodule-scandeps-perl all 1.31-2 [41.7 kB] Get:13 http://deb.debian.org/debian bookworm/main amd64 libproc-processtable-perl amd64 0.634-1+b2 [43.1 kB] Get:14 http://deb.debian.org/debian bookworm/main amd64 libsort-naturally-perl all 1.03-4 [13.1 kB] Get:15 http://deb.debian.org/debian bookworm/main amd64 needrestart all 3.6-4+deb12u1 [59.8 kB] Fetched 67.0 MB in 9s (7,596 kB/s) Selecting previously unselected package runc. (Reading database ... 156277 files and directories currently installed.) Preparing to unpack .../00-runc_1.1.5+ds1-1+deb12u1_amd64.deb ... Unpacking runc (1.1.5+ds1-1+deb12u1) ... Selecting previously unselected package containerd. Preparing to unpack .../01-containerd_1.6.20~ds1-1+b1_amd64.deb ... Unpacking containerd (1.6.20~ds1-1+b1) ... Selecting previously unselected package tini. Preparing to unpack .../02-tini_0.19.0-1_amd64.deb ... Unpacking tini (0.19.0-1) ... Selecting previously unselected package docker.io. Preparing to unpack .../03-docker.io_20.10.24+dfsg1-1+b3_amd64.deb ... Unpacking docker.io (20.10.24+dfsg1-1+b3) ... Selecting previously unselected package cgroupfs-mount. Preparing to unpack .../04-cgroupfs-mount_1.4_all.deb ... Unpacking cgroupfs-mount (1.4) ... Selecting previously unselected package python3-protobuf. Preparing to unpack .../05-python3-protobuf_3.21.12-3_amd64.deb ... Unpacking python3-protobuf (3.21.12-3) ... Selecting previously unselected package libnet1:amd64. Preparing to unpack .../06-libnet1_1.1.6+dfsg-3.2_amd64.deb ... Unpacking libnet1:amd64 (1.1.6+dfsg-3.2) ... Selecting previously unselected package criu. Preparing to unpack .../07-criu_3.17.1-2_amd64.deb ... Unpacking criu (3.17.1-2) ... Selecting previously unselected package libintl-perl. Preparing to unpack .../08-libintl-perl_1.33-1_all.deb ... Unpacking libintl-perl (1.33-1) ... Selecting previously unselected package libintl-xs-perl. Preparing to unpack .../09-libintl-xs-perl_1.33-1_amd64.deb ... Unpacking libintl-xs-perl (1.33-1) ... Selecting previously unselected package libmodule-find-perl. Preparing to unpack .../10-libmodule-find-perl_0.16-2_all.deb ... Unpacking libmodule-find-perl (0.16-2) ... Selecting previously unselected package libmodule-scandeps-perl. Preparing to unpack .../11-libmodule-scandeps-perl_1.31-2_all.deb ... Unpacking libmodule-scandeps-perl (1.31-2) ... Selecting previously unselected package libproc-processtable-perl:amd64. Preparing to unpack .../12-libproc-processtable-perl_0.634-1+b2_amd64.deb ... Unpacking libproc-processtable-perl:amd64 (0.634-1+b2) ... Selecting previously unselected package libsort-naturally-perl. Preparing to unpack .../13-libsort-naturally-perl_1.03-4_all.deb ... Unpacking libsort-naturally-perl (1.03-4) ... Selecting previously unselected package needrestart. Preparing to unpack .../14-needrestart_3.6-4+deb12u1_all.deb ... Unpacking needrestart (3.6-4+deb12u1) ... Setting up libnet1:amd64 (1.1.6+dfsg-3.2) ... Setting up runc (1.1.5+ds1-1+deb12u1) ... Setting up libmodule-find-perl (0.16-2) ... Setting up tini (0.19.0-1) ... Setting up libproc-processtable-perl:amd64 (0.634-1+b2) ... Setting up libintl-perl (1.33-1) ... Setting up cgroupfs-mount (1.4) ... Setting up python3-protobuf (3.21.12-3) ... Setting up containerd (1.6.20~ds1-1+b1) ... Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/ containerd.service. Setting up libsort-naturally-perl (1.03-4) ... Setting up libmodule-scandeps-perl (1.31-2) ... Setting up needrestart (3.6-4+deb12u1) ... Setting up docker.io (20.10.24+dfsg1-1+b3) ... Adding group `docker' (GID 127) ... Done. Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/dock er.service. Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.s ocket. Setting up libintl-xs-perl (1.33-1) ... Setting up criu (3.17.1-2) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... ```
```bash docker compose up ```
Output: ``` docker: 'compose' is not a docker command. See 'docker --help' ```
```bash docker -v ``` ``` Docker version 20.10.24+dfsg1, build 297e128 ``` ```bash docker-compose ``` ``` bash: docker-compose: command not found ``` ```bash sudo apt install -y docker-compose ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: python3-attr python3-distutils python3-docker python3-dockerpty python3-docopt python3-dotenv python3-json-pointer python3-jsonschema python3-lib2to3 python3-pyrsistent python3-rfc3987 python3-texttable python3-uritemplate python3-webcolors python3-websocket python3-yaml Suggested packages: python-attr-doc python-jsonschema-doc The following NEW packages will be installed: docker-compose python3-attr python3-distutils python3-docker python3-dockerpty python3-docopt python3-dotenv python3-json-pointer python3-jsonschema python3-lib2to3 python3-pyrsistent python3-rfc3987 python3-texttable python3-uritemplate python3-webcolors python3-websocket python3-yaml 0 upgraded, 17 newly installed, 0 to remove and 0 not upgraded. Need to get 895 kB of archives. After this operation, 4,328 kB of additional disk space will be used. Get:1 http://deb.debian.org/debian bookworm/main amd64 python3-lib2to3 all 3.11.2-3 [76.3 kB] Get:2 http://deb.debian.org/debian bookworm/main amd64 python3-distutils all 3.11.2-3 [131 kB] Get:3 http://deb.debian.org/debian bookworm/main amd64 python3-websocket all 1.2.3-1 [40.4 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 python3-docker all 5.0.3-1 [90.2 kB] Get:5 http://deb.debian.org/debian bookworm/main amd64 python3-dockerpty all 0.4.1-4 [11.4 kB] Get:6 http://deb.debian.org/debian bookworm/main amd64 python3-docopt all 0.6.2-4.1 [26.2 kB] Get:7 http://deb.debian.org/debian bookworm/main amd64 python3-dotenv all 0.21.0-1 [24.9 kB] Get:8 http://deb.debian.org/debian bookworm/main amd64 python3-attr all 22.2.0-1 [65.4 kB] Get:9 http://deb.debian.org/debian bookworm/main amd64 python3-pyrsistent amd64 0.18.1-1+b3 [60.0 kB] Get:10 http://deb.debian.org/debian bookworm/main amd64 python3-jsonschema all 4.10.3-1 [67.9 kB] Get:11 http://deb.debian.org/debian bookworm/main amd64 python3-texttable all 1.6.7-1 [11.9 kB] Get:12 http://deb.debian.org/debian bookworm/main amd64 python3-yaml amd64 6.0-3+b2 [119 kB] Get:13 http://deb.debian.org/debian bookworm/main amd64 docker-compose all 1.29.2-3 [123 kB] Get:14 http://deb.debian.org/debian bookworm/main amd64 python3-json-pointer all 2.3-2 [15.1 kB] Get:15 http://deb.debian.org/debian bookworm/main amd64 python3-rfc3987 all 1.3.8-2 [8,816 B] Get:16 http://deb.debian.org/debian bookworm/main amd64 python3-uritemplate all 4.1.1-2 [10.9 kB] Get:17 http://deb.debian.org/debian bookworm/main amd64 python3-webcolors all 1.11.1-1 [12.7 kB] Fetched 895 kB in 0s (3,477 kB/s) Selecting previously unselected package python3-lib2to3. (Reading database ... 157292 files and directories currently installed.) Preparing to unpack .../00-python3-lib2to3_3.11.2-3_all.deb ... Unpacking python3-lib2to3 (3.11.2-3) ... Selecting previously unselected package python3-distutils. Preparing to unpack .../01-python3-distutils_3.11.2-3_all.deb ... Unpacking python3-distutils (3.11.2-3) ... Selecting previously unselected package python3-websocket. Preparing to unpack .../02-python3-websocket_1.2.3-1_all.deb ... Unpacking python3-websocket (1.2.3-1) ... Selecting previously unselected package python3-docker. Preparing to unpack .../03-python3-docker_5.0.3-1_all.deb ... Unpacking python3-docker (5.0.3-1) ... Selecting previously unselected package python3-dockerpty. Preparing to unpack .../04-python3-dockerpty_0.4.1-4_all.deb ... Unpacking python3-dockerpty (0.4.1-4) ... Selecting previously unselected package python3-docopt. Preparing to unpack .../05-python3-docopt_0.6.2-4.1_all.deb ... Unpacking python3-docopt (0.6.2-4.1) ... Selecting previously unselected package python3-dotenv. Preparing to unpack .../06-python3-dotenv_0.21.0-1_all.deb ... Unpacking python3-dotenv (0.21.0-1) ... Selecting previously unselected package python3-attr. Preparing to unpack .../07-python3-attr_22.2.0-1_all.deb ... Unpacking python3-attr (22.2.0-1) ... Selecting previously unselected package python3-pyrsistent:amd64. Preparing to unpack .../08-python3-pyrsistent_0.18.1-1+b3_amd64.deb ... Unpacking python3-pyrsistent:amd64 (0.18.1-1+b3) ... Selecting previously unselected package python3-jsonschema. Preparing to unpack .../09-python3-jsonschema_4.10.3-1_all.deb ... Unpacking python3-jsonschema (4.10.3-1) ... Selecting previously unselected package python3-texttable. Preparing to unpack .../10-python3-texttable_1.6.7-1_all.deb ... Unpacking python3-texttable (1.6.7-1) ... Selecting previously unselected package python3-yaml. Preparing to unpack .../11-python3-yaml_6.0-3+b2_amd64.deb ... Unpacking python3-yaml (6.0-3+b2) ... Selecting previously unselected package docker-compose. Preparing to unpack .../12-docker-compose_1.29.2-3_all.deb ... Unpacking docker-compose (1.29.2-3) ... Selecting previously unselected package python3-json-pointer. Preparing to unpack .../13-python3-json-pointer_2.3-2_all.deb ... Unpacking python3-json-pointer (2.3-2) ... Selecting previously unselected package python3-rfc3987. Preparing to unpack .../14-python3-rfc3987_1.3.8-2_all.deb ... Unpacking python3-rfc3987 (1.3.8-2) ... Selecting previously unselected package python3-uritemplate. Preparing to unpack .../15-python3-uritemplate_4.1.1-2_all.deb ... Unpacking python3-uritemplate (4.1.1-2) ... Selecting previously unselected package python3-webcolors. Preparing to unpack .../16-python3-webcolors_1.11.1-1_all.deb ... Unpacking python3-webcolors (1.11.1-1) ... Setting up python3-dotenv (0.21.0-1) ... Setting up python3-attr (22.2.0-1) ... Setting up python3-texttable (1.6.7-1) ... Setting up python3-docopt (0.6.2-4.1) ... Setting up python3-yaml (6.0-3+b2) ... Setting up python3-uritemplate (4.1.1-2) ... Setting up python3-webcolors (1.11.1-1) ... Setting up python3-rfc3987 (1.3.8-2) ... Setting up python3-pyrsistent:amd64 (0.18.1-1+b3) ... Setting up python3-json-pointer (2.3-2) ... Setting up python3-lib2to3 (3.11.2-3) ... Setting up python3-websocket (1.2.3-1) ... Setting up python3-dockerpty (0.4.1-4) ... Setting up python3-distutils (3.11.2-3) ... Setting up python3-docker (5.0.3-1) ... Setting up python3-jsonschema (4.10.3-1) ... Setting up docker-compose (1.29.2-3) ... Processing triggers for man-db (2.11.2-2) ... Scanning processes... Scanning linux images... Running kernel seems to be up-to-date. No services need to be restarted. No containers need to be restarted. No user sessions are running outdated binaries. No VM guests are running outdated hypervisor (qemu) binaries on this host. ```
```bash docker-compose up ```
Output: ``` Traceback (most recent call last): File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 704, in urlopen httplib_response = self._make_request( ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 399, in _make_request conn.request(method, url, **httplib_request_kw) File "/usr/lib/python3.11/http/client.py", line 1282, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1328, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1277, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1037, in _send_output self.send(msg) File "/usr/lib/python3.11/http/client.py", line 975, in send self.connect() File "/usr/lib/python3/dist-packages/docker/transport/unixconn.py", line 30, in connect sock.connect(self.unix_socket) PermissionError: [Errno 13] Permission denied During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/requests/adapters.py", line 489, in send resp = conn.urlopen( ^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 788, in urlopen retries = retries.increment( ^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 550, in increment raise six.reraise(type(error), error, _stacktrace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/six.py", line 718, in reraise raise value.with_traceback(tb) File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 704, in urlopen httplib_response = self._make_request( ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 399, in _make_request conn.request(method, url, **httplib_request_kw) File "/usr/lib/python3.11/http/client.py", line 1282, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1328, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1277, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1037, in _send_output self.send(msg) File "/usr/lib/python3.11/http/client.py", line 975, in send self.connect() File "/usr/lib/python3/dist-packages/docker/transport/unixconn.py", line 30, in connect sock.connect(self.unix_socket) urllib3.exceptions.ProtocolError: ('Connection aborted.', PermissionError(13, 'Permission denied')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/docker/api/client.py", line 214, in _retrieve_server_version return self.version(api_version=False)["ApiVersion"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/daemon.py", line 181, in version return self._result(self._get(url), json=True) ^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/utils/decorators.py", line 46, in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/client.py", line 237, in _get return self.get(url, **self._set_request_timeout(kwargs)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 600, in get return self.request("GET", url, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 587, in request resp = self.send(prep, **send_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/sessions.py", line 701, in send r = adapter.send(request, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/requests/adapters.py", line 547, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', PermissionError(13, 'Permission denied')) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/bin/docker-compose", line 33, in sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main command_func() File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 200, in perform_command project = project_from_options('.', options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 60, in project_from_options return get_project( ^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 152, in get_project client = get_client( ^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 41, in get_client client = docker_client( ^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/compose/cli/docker_client.py", line 170, in docker_client client = APIClient(use_ssh_client=not use_paramiko_ssh, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/client.py", line 197, in __init__ self._version = self._retrieve_server_version() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/docker/api/client.py", line 221, in _retrieve_server_version raise DockerException( docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', PermissionError(13, 'Permission denied')) ```
```bash sudo docker-compose up ```
Output: ``` Creating network "youtube-operational-api_default" with the default driver Building api Sending build context to Docker daemon 318.5kB Step 1/5 : FROM php:apache apache: Pulling from library/php a2318d6c47ec: Pull complete c335a1cecf20: Pull complete 9f1356d24f26: Pull complete 93a67f8d1dfc: Pull complete 773d8e2be6c6: Pull complete b874a8bbb522: Pull complete 395851b4c00b: Pull complete ca8ceff00491: Pull complete a536a22fc4b9: Pull complete 5391caed04b1: Pull complete 267696056425: Pull complete f8945584c4c0: Pull complete cc7b1f3f4638: Pull complete Digest: sha256:93ac377d33f857707c7684416504d23fe05da32dc9452789a02d382ec5d13184 Status: Downloaded newer image for php:apache ---> 568a8e52fddf Step 2/5 : RUN a2enmod rewrite ---> Running in 5dda05f781a7 Enabling module rewrite. To activate the new configuration, you need to run: service apache2 restart Removing intermediate container 5dda05f781a7 ---> bd8fe34f6660 Step 3/5 : COPY . /var/www/html/ ---> 21fd944b69f4 Step 4/5 : RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf ---> Running in eeeb3ff83284 Removing intermediate container eeeb3ff83284 ---> 1ce6a485ec7e Step 5/5 : CMD apachectl -D FOREGROUND ---> Running in 20fd4b1272df Removing intermediate container 20fd4b1272df ---> d6ad7c455bed Successfully built d6ad7c455bed Successfully tagged youtube-operational-api:latest WARNING: Image for service api was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating youtube-operational-api_api_1 ... done Attaching to youtube-operational-api_api_1 api_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message api_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message api_1 | [Thu Sep 19 02:54:19.380674 2024] [mpm_prefork:notice] [pid 8:tid 8] AH00163: Apache/2.4.62 (Debian) PHP/8.3.11 configured -- resuming normal operations api_1 | [Thu Sep 19 02:54:19.380729 2024] [core:notice] [pid 8:tid 8] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND' api_1 | 172.18.0.1 - - [19/Sep/2024:03:03:17 +0000] "GET / HTTP/1.1" 200 6986 "-" "curl/7.88.1" api_1 | 172.18.0.1 - - [19/Sep/2024:03:03:27 +0000] "GET /channels?handle=@WHO HTTP/1.1" 200 421 "-" "curl/7.88.1" api_1 | 172.18.0.1 - - [19/Sep/2024:03:03:51 +0000] "GET //search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short HTTP/1.1" 500 218 "-" "curl/7.88.1" ```
```bash curl 'http://localhost:8080//search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short' ``` does not return anything. It seems clear to me that I have not done the necessary for Protobuf to work from within Docker. ```bash sudo docker container ls ```
Output: ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 069b1d8ac8bb youtube-operational-api "docker-php-entrypoi…" 12 minutes ago Up 12 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp youtube-operational-api_api_1 ```
```bash sudo docker image ls ```
Output: ``` REPOSITORY TAG IMAGE ID CREATED SIZE youtube-operational-api latest d6ad7c455bed 12 minutes ago 507MB php apache 568a8e52fddf 2 weeks ago 507MB ```
```bash docker logs -f --details youtube-operational-api ``` ``` permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/youtube-operational-api/json": dial unix /var/run/docker.sock: connect: permission denied ``` ```bash sudo docker logs -f --details youtube-operational-api ``` ``` Error: No such container: youtube-operational-api ``` ```bash sudo docker logs -f --details 069b1d8ac8bb ``` Source: [the Stack Overflow answer 45839387](https://stackoverflow.com/a/45839387) only provides *access*. ```bash sudo docker exec -it 069b1d8ac8bb /bin/bash -c 'ls -lh /var/log/apache2/' ```
Output: ``` total 0 lrwxrwxrwx 1 www-data www-data 11 Sep 4 23:28 access.log -> /dev/stdout lrwxrwxrwx 1 www-data www-data 11 Sep 4 23:28 error.log -> /dev/stderr lrwxrwxrwx 1 www-data www-data 11 Sep 4 23:28 other_vhosts_access.log -> /dev/stdout ```
Source: [the Server Fault answer 763932](https://serverfault.com/a/763932) so there is no error logs it seems. ```bash sudo docker exec -it 069b1d8ac8bb /bin/bash ``` ```bash apt install -y composer protobuf-compiler ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable to locate package composer E: Unable to locate package protobuf-compiler ```
```bash apt update ```
Output: ``` Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB] Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8787 kB] Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2468 B] Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [182 kB] Fetched 9226 kB in 3s (2681 kB/s) Reading package lists... Done Building dependency tree... Done Reading state information... Done 1 package can be upgraded. Run 'apt list --upgradable' to see it. ```
```bash apt install -y composer protobuf-compiler ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: composer : Depends: php-cli Depends: php-common but it is not installable Depends: php-composer-ca-bundle (>= 1.0) but it is not installable Depends: php-composer-ca-bundle (< 2~~) but it is not installable Depends: php-composer-class-map-generator (>= 1.0) but it is not installable Depends: php-composer-class-map-generator (< 2~~) but it is not installable Depends: php-composer-metadata-minifier (>= 1.0) but it is not installable Depends: php-composer-metadata-minifier (< 2~~) but it is not installable Depends: php-composer-semver (>= 3.0) but it is not installable Depends: php-composer-semver (< 4~~) but it is not installable Depends: php-composer-spdx-licenses (>= 1.5.7) but it is not installable Depends: php-composer-spdx-licenses (< 2~~) but it is not installable Depends: php-composer-xdebug-handler (> 2.0.2) but it is not installable Depends: php-json-schema (>= 5.2.11) but it is not installable Depends: php-json-schema (< 6~~) but it is not installable Depends: php-psr-log but it is not installable Depends: jsonlint (>= 1.4) but it is not going to be installed Depends: jsonlint (< 2~~) but it is not going to be installed Depends: php-symfony-console (> 5.4.11) but it is not installable Depends: php-symfony-filesystem (> 5.4) but it is not installable Depends: php-symfony-finder (> 5.4) but it is not installable Depends: php-symfony-process (> 5.4) but it is not installable Depends: php-react-promise (>= 2.8) but it is not installable Depends: php-react-promise (< 3~~) but it is not installable Depends: php-composer-pcre (> 2.1) but it is not installable Depends: php-seld-signal-handler (>= 2.0) but it is not installable Depends: php-seld-signal-handler (< 3~~) but it is not installable Recommends: git but it is not going to be installed Recommends: unzip but it is not going to be installed E: Unable to correct problems, you have held broken packages. ```
```bash apt upgrade -y ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done The following packages will be upgraded: libexpat1 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 98.9 kB of archives. After this operation, 0 B of additional disk space will be used. Get:1 http://deb.debian.org/debian-security bookworm-security/main amd64 libexpat1 amd64 2.5.0-1+deb12u1 [98.9 kB] Fetched 98.9 kB in 0s (948 kB/s) debconf: delaying package configuration, since apt-utils is not installed (Reading database ... 14157 files and directories currently installed.) Preparing to unpack .../libexpat1_2.5.0-1+deb12u1_amd64.deb ... Unpacking libexpat1:amd64 (2.5.0-1+deb12u1) over (2.5.0-1) ... Setting up libexpat1:amd64 (2.5.0-1+deb12u1) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... ```
```bash apt auto-remove ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ```
and ```bash apt dist-upgrade ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done Calculating upgrade... Done 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. ```
do not help. I believe that only `composer` is to blame as shows: ```bash sudo apt install -y protobuf-compiler ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: libprotobuf-dev libprotobuf-lite32 libprotobuf32 libprotoc32 zlib1g-dev Suggested packages: protobuf-mode-el The following NEW packages will be installed: libprotobuf-dev libprotobuf-lite32 libprotobuf32 libprotoc32 protobuf-compiler zlib1g-dev 0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. Need to get 4306 kB of archives. After this operation, 21.0 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian bookworm/main amd64 zlib1g-dev amd64 1:1.2.13.dfsg-1 [916 kB] Get:2 http://deb.debian.org/debian bookworm/main amd64 libprotobuf32 amd64 3.21.12-3 [932 kB] Get:3 http://deb.debian.org/debian bookworm/main amd64 libprotobuf-lite32 amd64 3.21.12-3 [261 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 libprotobuf-dev amd64 3.21.12-3 [1283 kB] Get:5 http://deb.debian.org/debian bookworm/main amd64 libprotoc32 amd64 3.21.12-3 [829 kB] Get:6 http://deb.debian.org/debian bookworm/main amd64 protobuf-compiler amd64 3.21.12-3 [83.9 kB] Fetched 4306 kB in 2s (2267 kB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package zlib1g-dev:amd64. (Reading database ... 14157 files and directories currently installed.) Preparing to unpack .../0-zlib1g-dev_1%3a1.2.13.dfsg-1_amd64.deb ... Unpacking zlib1g-dev:amd64 (1:1.2.13.dfsg-1) ... Selecting previously unselected package libprotobuf32:amd64. Preparing to unpack .../1-libprotobuf32_3.21.12-3_amd64.deb ... Unpacking libprotobuf32:amd64 (3.21.12-3) ... Selecting previously unselected package libprotobuf-lite32:amd64. Preparing to unpack .../2-libprotobuf-lite32_3.21.12-3_amd64.deb ... Unpacking libprotobuf-lite32:amd64 (3.21.12-3) ... Selecting previously unselected package libprotobuf-dev:amd64. Preparing to unpack .../3-libprotobuf-dev_3.21.12-3_amd64.deb ... Unpacking libprotobuf-dev:amd64 (3.21.12-3) ... Selecting previously unselected package libprotoc32:amd64. Preparing to unpack .../4-libprotoc32_3.21.12-3_amd64.deb ... Unpacking libprotoc32:amd64 (3.21.12-3) ... Selecting previously unselected package protobuf-compiler. Preparing to unpack .../5-protobuf-compiler_3.21.12-3_amd64.deb ... Unpacking protobuf-compiler (3.21.12-3) ... Setting up zlib1g-dev:amd64 (1:1.2.13.dfsg-1) ... Setting up libprotobuf32:amd64 (3.21.12-3) ... Setting up libprotobuf-lite32:amd64 (3.21.12-3) ... Setting up libprotoc32:amd64 (3.21.12-3) ... Setting up protobuf-compiler (3.21.12-3) ... Setting up libprotobuf-dev:amd64 (3.21.12-3) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... ```
```bash apt install -y composer ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: composer : Depends: php-cli Depends: php-common but it is not installable Depends: php-composer-ca-bundle (>= 1.0) but it is not installable Depends: php-composer-ca-bundle (< 2~~) but it is not installable Depends: php-composer-class-map-generator (>= 1.0) but it is not installable Depends: php-composer-class-map-generator (< 2~~) but it is not installable Depends: php-composer-metadata-minifier (>= 1.0) but it is not installable Depends: php-composer-metadata-minifier (< 2~~) but it is not installable Depends: php-composer-semver (>= 3.0) but it is not installable Depends: php-composer-semver (< 4~~) but it is not installable Depends: php-composer-spdx-licenses (>= 1.5.7) but it is not installable Depends: php-composer-spdx-licenses (< 2~~) but it is not installable Depends: php-composer-xdebug-handler (> 2.0.2) but it is not installable Depends: php-json-schema (>= 5.2.11) but it is not installable Depends: php-json-schema (< 6~~) but it is not installable Depends: php-psr-log but it is not installable Depends: jsonlint (>= 1.4) but it is not going to be installed Depends: jsonlint (< 2~~) but it is not going to be installed Depends: php-symfony-console (> 5.4.11) but it is not installable Depends: php-symfony-filesystem (> 5.4) but it is not installable Depends: php-symfony-finder (> 5.4) but it is not installable Depends: php-symfony-process (> 5.4) but it is not installable Depends: php-react-promise (>= 2.8) but it is not installable Depends: php-react-promise (< 3~~) but it is not installable Depends: php-composer-pcre (> 2.1) but it is not installable Depends: php-seld-signal-handler (>= 2.0) but it is not installable Depends: php-seld-signal-handler (< 3~~) but it is not installable Recommends: git but it is not going to be installed Recommends: unzip but it is not going to be installed E: Unable to correct problems, you have held broken packages. ```
```bash apt install php-composer ```
Output: ``` Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable to locate package php-composer ```
```bash composer ``` ``` bash: composer: command not found ``` Searching on DuckDuckGo and Google `"FROM php:apache" "composer"`. https://www.koyeb.com/docs/deploy/php#create-the-php-app -> https://getcomposer.org/download/ https://www.alexandre-hublau.com/en/posts/it/code-share-docker-apache-mysql-php/ ```dockerfile COPY --from=composer /usr/bin/composer /usr/bin/composer # Install composer in the container ``` https://www.reddit.com/r/docker/comments/19ab8im/dockercompose_phpapache_amp_composer/ https://getcomposer.org/doc/00-intro.md#docker-image When ctrl + c ```bash docker-compose up ``` get: ```bash sudo docker container ls ``` ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` ```bash sudo docker image ls ```
Output: ``` REPOSITORY TAG IMAGE ID CREATED SIZE youtube-operational-api latest d6ad7c455bed 9 hours ago 507MB php apache 568a8e52fddf 2 weeks ago 507MB ```
```bash sudo docker image rm youtube-operational-api ``` ``` Error response from daemon: conflict: unable to remove repository reference "youtube-operational-api" (must force) - container 069b1d8ac8bb is using its referenced image d6ad7c455bed ``` ```bash sudo docker image rm --force youtube-operational-api ```
Output: ``` Untagged: youtube-operational-api:latest Deleted: sha256:d6ad7c455bedd691572b060b5b01eac80e0b374354553c81f074810784e56499 Deleted: sha256:1ce6a485ec7e8742e446e2b956380f17e17ea0ac29af9844ede575ba2680d858 Deleted: sha256:21fd944b69f4236281b1b2985f3266c78dbd6ac97533ecb2d2682c1ea50fb9a9 Deleted: sha256:bd8fe34f6660af77126637ba606e1053319fb3140419d89832bff1784dd3b43b ```
```bash sudo docker image ls ```
Output: ``` REPOSITORY TAG IMAGE ID CREATED SIZE php apache 568a8e52fddf 2 weeks ago 507MB ```
```bash sudo docker image ls ```
Output: ``` REPOSITORY TAG IMAGE ID CREATED SIZE youtube-operational-api latest fb4bb233fa26 About a minute ago 510MB composer/composer latest-bin fd12e9642866 2 weeks ago 3.02MB php apache 568a8e52fddf 2 weeks ago 507MB
`Dockerfile` > `pwd` is `/var/www/html`. ```bash git diff ```
Output: ```diff diff --git a/Dockerfile b/Dockerfile index 7b37789..64069e5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,8 @@ COPY . /var/www/html/ # Replace `AllowOverride None` with `AllowOverride All` in `` in `/etc/apache2/apache2.conf`. RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf +COPY --from=composer/composer:latest-bin /composer /usr/bin/composer +RUN composer require google/protobuf +RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) + CMD apachectl -D FOREGROUND ```
```bash sudo docker-compose up ```
Output: ``` Building api Sending build context to Docker daemon 319kB Step 1/8 : FROM php:apache ---> 568a8e52fddf Step 2/8 : RUN a2enmod rewrite ---> Running in c37066d103f5 Enabling module rewrite. To activate the new configuration, you need to run: service apache2 restart Removing intermediate container c37066d103f5 ---> ffa08fa4a663 Step 3/8 : COPY . /var/www/html/ ---> 86b9a8c186ab Step 4/8 : RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf ---> Running in 697ccb366700 Removing intermediate container 697ccb366700 ---> c57985c4688f Step 5/8 : COPY --from=composer/composer:latest-bin /composer /usr/bin/composer ---> 8f27e2aee0dd Step 6/8 : RUN composer require google/protobuf ---> Running in b42f8bbb2364 ./composer.json has been created Running composer update google/protobuf Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking google/protobuf (v4.28.2) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals Failed to download google/protobuf from dist: The zip extension and unzip/7z commands are both missing, skipping. The php.ini used by your command-line PHP is: /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini Now trying to download from source In GitDownloader.php line 82: git was not found in your PATH, skipping source download require [--dev] [--dry-run] [--prefer-source] [--prefer-dist] [--prefer-install PREFER-INSTALL] [--fixed] [--no-suggest] [--no-progress] [--no-update] [--no-install] [--no-audit] [--audit-format AUDIT-FORMAT] [--update-no-dev] [-w|--update-with-dependencies] [-W|--update-with-all-dependencies] [--with-dependencies] [--with-all-dependencies] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [-m|--minimal-changes] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--] [...] The command '/bin/sh -c composer require google/protobuf' returned a non-zero code: 1 ERROR: Service 'api' failed to build : Build failed ```
```bash git diff ```
Output: ```diff diff --git a/Dockerfile b/Dockerfile index 7b37789..3de253a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,10 @@ COPY . /var/www/html/ # Replace `AllowOverride None` with `AllowOverride All` in `` in `/etc/apache2/apache2.conf`. RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf +COPY --from=composer/composer:latest-bin /composer /usr/bin/composer +RUN apt install -y git +RUN composer require google/protobuf +RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) + CMD apachectl -D FOREGROUND ```
```bash sudo docker-compose up ```
Output: ``` Building api Sending build context to Docker daemon 319kB Step 1/9 : FROM php:apache ---> 568a8e52fddf Step 2/9 : RUN a2enmod rewrite ---> Running in 24ee89e1aa37 Enabling module rewrite. To activate the new configuration, you need to run: service apache2 restart Removing intermediate container 24ee89e1aa37 ---> 019a46718b24 Step 3/9 : COPY . /var/www/html/ ---> 4906e47f5989 Step 4/9 : RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf ---> Running in 8844d71fc5ff Removing intermediate container 8844d71fc5ff ---> 4d01ae7c7192 Step 5/9 : COPY --from=composer/composer:latest-bin /composer /usr/bin/composer ---> 4a2ee82dd6b3 Step 6/9 : RUN apt install -y git ---> Running in 03a305f5e999 WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Reading package lists... Building dependency tree... Reading state information... Package git is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source E: Package 'git' has no installation candidate The command '/bin/sh -c apt install -y git' returned a non-zero code: 100 ERROR: Service 'api' failed to build : Build failed ```
```bash git diff ```
Output: ```diff diff --git a/Dockerfile b/Dockerfile index 7b37789..3de253a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,10 @@ COPY . /var/www/html/ # Replace `AllowOverride None` with `AllowOverride All` in `` in `/etc/apache2/apache2.conf`. RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf +COPY --from=composer/composer:latest-bin /composer /usr/bin/composer +RUN apt update +RUN apt install -y git +RUN composer require google/protobuf +RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) + CMD apachectl -D FOREGROUND ```
```bash sudo docker-compose up ```
Output: ``` Building api Sending build context to Docker daemon 319kB Step 1/10 : FROM php:apache ---> 568a8e52fddf Step 2/10 : RUN a2enmod rewrite ---> Running in 86a999604d91 Enabling module rewrite. To activate the new configuration, you need to run: service apache2 restart Removing intermediate container 86a999604d91 ---> f9a2ccca14e8 Step 3/10 : COPY . /var/www/html/ ---> 301737d02b2e Step 4/10 : RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf ---> Running in 3b8835c72a5f Removing intermediate container 3b8835c72a5f ---> 1a4c92069380 Step 5/10 : COPY --from=composer/composer:latest-bin /composer /usr/bin/composer ---> 2326ed4ba92c Step 6/10 : RUN apt update ---> Running in 2c794063492b WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB] Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8787 kB] Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2468 B] Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [182 kB] Fetched 9226 kB in 4s (2464 kB/s) Reading package lists... Building dependency tree... Reading state information... 1 package can be upgraded. Run 'apt list --upgradable' to see it. Removing intermediate container 2c794063492b ---> 316e1554db71 Step 7/10 : RUN apt install -y git ---> Running in f1dda4a86145 WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: git-man less libbsd0 libcbor0.8 libcurl3-gnutls libedit2 liberror-perl libfido2-1 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client xauth Suggested packages: gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn keychain libpam-ssh monkeysphere ssh-askpass The following NEW packages will be installed: git git-man less libbsd0 libcbor0.8 libcurl3-gnutls libedit2 liberror-perl libfido2-1 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client xauth 0 upgraded, 18 newly installed, 0 to remove and 1 not upgraded. Need to get 12.5 MB of archives. After this operation, 60.0 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian bookworm/main amd64 less amd64 590-2.1~deb12u2 [132 kB] Get:2 http://deb.debian.org/debian bookworm/main amd64 libbsd0 amd64 0.11.7-2 [117 kB] Get:3 http://deb.debian.org/debian bookworm/main amd64 libedit2 amd64 3.1-20221030-2 [93.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 libcbor0.8 amd64 0.8.0-2+b1 [27.4 kB] Get:5 http://deb.debian.org/debian bookworm/main amd64 libfido2-1 amd64 1.12.0-2+b1 [77.2 kB] Get:6 http://deb.debian.org/debian bookworm/main amd64 openssh-client amd64 1:9.2p1-2+deb12u3 [991 kB] Get:7 http://deb.debian.org/debian bookworm/main amd64 libcurl3-gnutls amd64 7.88.1-10+deb12u7 [385 kB] Get:8 http://deb.debian.org/debian bookworm/main amd64 liberror-perl all 0.17029-2 [29.0 kB] Get:9 http://deb.debian.org/debian-security bookworm-security/main amd64 git-man all 1:2.39.5-0+deb12u1 [2054 kB] Get:10 http://deb.debian.org/debian-security bookworm-security/main amd64 git amd64 1:2.39.5-0+deb12u1 [7256 kB] Get:11 http://deb.debian.org/debian bookworm/main amd64 libxau6 amd64 1:1.0.9-1 [19.7 kB] Get:12 http://deb.debian.org/debian bookworm/main amd64 libxdmcp6 amd64 1:1.1.2-3 [26.3 kB] Get:13 http://deb.debian.org/debian bookworm/main amd64 libxcb1 amd64 1.15-1 [144 kB] Get:14 http://deb.debian.org/debian bookworm/main amd64 libx11-data all 2:1.8.4-2+deb12u2 [292 kB] Get:15 http://deb.debian.org/debian bookworm/main amd64 libx11-6 amd64 2:1.8.4-2+deb12u2 [760 kB] Get:16 http://deb.debian.org/debian bookworm/main amd64 libxext6 amd64 2:1.3.4-1+b1 [52.9 kB] Get:17 http://deb.debian.org/debian bookworm/main amd64 libxmuu1 amd64 2:1.1.3-3 [23.9 kB] Get:18 http://deb.debian.org/debian bookworm/main amd64 xauth amd64 1:1.1.2-1 [36.0 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 12.5 MB in 4s (3308 kB/s) Selecting previously unselected package less. (Reading database ... 14157 files and directories currently installed.) Preparing to unpack .../00-less_590-2.1~deb12u2_amd64.deb ... Unpacking less (590-2.1~deb12u2) ... Selecting previously unselected package libbsd0:amd64. Preparing to unpack .../01-libbsd0_0.11.7-2_amd64.deb ... Unpacking libbsd0:amd64 (0.11.7-2) ... Selecting previously unselected package libedit2:amd64. Preparing to unpack .../02-libedit2_3.1-20221030-2_amd64.deb ... Unpacking libedit2:amd64 (3.1-20221030-2) ... Selecting previously unselected package libcbor0.8:amd64. Preparing to unpack .../03-libcbor0.8_0.8.0-2+b1_amd64.deb ... Unpacking libcbor0.8:amd64 (0.8.0-2+b1) ... Selecting previously unselected package libfido2-1:amd64. Preparing to unpack .../04-libfido2-1_1.12.0-2+b1_amd64.deb ... Unpacking libfido2-1:amd64 (1.12.0-2+b1) ... Selecting previously unselected package openssh-client. Preparing to unpack .../05-openssh-client_1%3a9.2p1-2+deb12u3_amd64.deb ... Unpacking openssh-client (1:9.2p1-2+deb12u3) ... Selecting previously unselected package libcurl3-gnutls:amd64. Preparing to unpack .../06-libcurl3-gnutls_7.88.1-10+deb12u7_amd64.deb ... Unpacking libcurl3-gnutls:amd64 (7.88.1-10+deb12u7) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../07-liberror-perl_0.17029-2_all.deb ... Unpacking liberror-perl (0.17029-2) ... Selecting previously unselected package git-man. Preparing to unpack .../08-git-man_1%3a2.39.5-0+deb12u1_all.deb ... Unpacking git-man (1:2.39.5-0+deb12u1) ... Selecting previously unselected package git. Preparing to unpack .../09-git_1%3a2.39.5-0+deb12u1_amd64.deb ... Unpacking git (1:2.39.5-0+deb12u1) ... Selecting previously unselected package libxau6:amd64. Preparing to unpack .../10-libxau6_1%3a1.0.9-1_amd64.deb ... Unpacking libxau6:amd64 (1:1.0.9-1) ... Selecting previously unselected package libxdmcp6:amd64. Preparing to unpack .../11-libxdmcp6_1%3a1.1.2-3_amd64.deb ... Unpacking libxdmcp6:amd64 (1:1.1.2-3) ... Selecting previously unselected package libxcb1:amd64. Preparing to unpack .../12-libxcb1_1.15-1_amd64.deb ... Unpacking libxcb1:amd64 (1.15-1) ... Selecting previously unselected package libx11-data. Preparing to unpack .../13-libx11-data_2%3a1.8.4-2+deb12u2_all.deb ... Unpacking libx11-data (2:1.8.4-2+deb12u2) ... Selecting previously unselected package libx11-6:amd64. Preparing to unpack .../14-libx11-6_2%3a1.8.4-2+deb12u2_amd64.deb ... Unpacking libx11-6:amd64 (2:1.8.4-2+deb12u2) ... Selecting previously unselected package libxext6:amd64. Preparing to unpack .../15-libxext6_2%3a1.3.4-1+b1_amd64.deb ... Unpacking libxext6:amd64 (2:1.3.4-1+b1) ... Selecting previously unselected package libxmuu1:amd64. Preparing to unpack .../16-libxmuu1_2%3a1.1.3-3_amd64.deb ... Unpacking libxmuu1:amd64 (2:1.1.3-3) ... Selecting previously unselected package xauth. Preparing to unpack .../17-xauth_1%3a1.1.2-1_amd64.deb ... Unpacking xauth (1:1.1.2-1) ... Setting up libxau6:amd64 (1:1.0.9-1) ... Setting up libcbor0.8:amd64 (0.8.0-2+b1) ... Setting up less (590-2.1~deb12u2) ... Setting up libcurl3-gnutls:amd64 (7.88.1-10+deb12u7) ... Setting up liberror-perl (0.17029-2) ... Setting up libx11-data (2:1.8.4-2+deb12u2) ... Setting up git-man (1:2.39.5-0+deb12u1) ... Setting up libfido2-1:amd64 (1.12.0-2+b1) ... Setting up libbsd0:amd64 (0.11.7-2) ... Setting up libxdmcp6:amd64 (1:1.1.2-3) ... Setting up libxcb1:amd64 (1.15-1) ... Setting up libedit2:amd64 (3.1-20221030-2) ... Setting up git (1:2.39.5-0+deb12u1) ... Setting up libx11-6:amd64 (2:1.8.4-2+deb12u2) ... Setting up libxmuu1:amd64 (2:1.1.3-3) ... Setting up openssh-client (1:9.2p1-2+deb12u3) ... Setting up libxext6:amd64 (2:1.3.4-1+b1) ... Setting up xauth (1:1.1.2-1) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... Removing intermediate container f1dda4a86145 ---> 72aca5e9857c Step 8/10 : RUN composer require google/protobuf ---> Running in 7db0ca5fc728 ./composer.json has been created Running composer update google/protobuf Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking google/protobuf (v4.28.2) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals Failed to download google/protobuf from dist: The zip extension and unzip/7z commands are both missing, skipping. The php.ini used by your command-line PHP is: /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini Now trying to download from source - Syncing google/protobuf (v4.28.2) into cache - Installing google/protobuf (v4.28.2): Cloning 96021a9a8a from cache 1 package suggestions were added by new dependencies, use `composer suggest` to see details. Generating autoload files No security vulnerability advisories found. Using version ^4.28 for google/protobuf Removing intermediate container 7db0ca5fc728 ---> fb59c06039cb Step 9/10 : RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) ---> Running in 408b3442c595 /bin/sh: 1: protoc: not found The command '/bin/sh -c protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f)' returned a non-zero code: 127 ERROR: Service 'api' failed to build : Build failed ```
```bash diff --git a/Dockerfile b/Dockerfile ```
Output: ```diff index 7b37789..a63733d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,10 @@ COPY . /var/www/html/ # Replace `AllowOverride None` with `AllowOverride All` in `` in `/etc/apache2/apache2.conf`. RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf +COPY --from=composer/composer:latest-bin /composer /usr/bin/composer +RUN apt update +RUN apt install -y git protobuf-compiler +RUN composer require google/protobuf +RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) + CMD apachectl -D FOREGROUND ```
```bash sudo docker-compose up ```
Output: ``` Building api Sending build context to Docker daemon 319kB Step 1/10 : FROM php:apache ---> 568a8e52fddf Step 2/10 : RUN a2enmod rewrite ---> Running in fedaaeeed275 Enabling module rewrite. To activate the new configuration, you need to run: service apache2 restart Removing intermediate container fedaaeeed275 ---> 9e5a55b174d9 Step 3/10 : COPY . /var/www/html/ ---> 1c340d212b0b Step 4/10 : RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf ---> Running in bd572a92348f Removing intermediate container bd572a92348f ---> 60e881253576 Step 5/10 : COPY --from=composer/composer:latest-bin /composer /usr/bin/composer ---> 4e6b020b5863 Step 6/10 : RUN apt update ---> Running in 034ab5975c46 WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB] Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8787 kB] Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2468 B] Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [182 kB] Fetched 9226 kB in 5s (2008 kB/s) Reading package lists... Building dependency tree... Reading state information... 1 package can be upgraded. Run 'apt list --upgradable' to see it. Removing intermediate container 034ab5975c46 ---> 55823f3215d5 Step 7/10 : RUN apt install -y git protobuf-compiler ---> Running in 7f15c660223a WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: git-man less libbsd0 libcbor0.8 libcurl3-gnutls libedit2 liberror-perl libfido2-1 libprotobuf-dev libprotobuf-lite32 libprotobuf32 libprotoc32 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client xauth zlib1g-dev Suggested packages: gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn keychain libpam-ssh monkeysphere ssh-askpass protobuf-mode-el The following NEW packages will be installed: git git-man less libbsd0 libcbor0.8 libcurl3-gnutls libedit2 liberror-perl libfido2-1 libprotobuf-dev libprotobuf-lite32 libprotobuf32 libprotoc32 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client protobuf-compiler xauth zlib1g-dev 0 upgraded, 24 newly installed, 0 to remove and 1 not upgraded. Need to get 16.8 MB of archives. After this operation, 81.0 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian bookworm/main amd64 less amd64 590-2.1~deb12u2 [132 kB] Get:2 http://deb.debian.org/debian bookworm/main amd64 libbsd0 amd64 0.11.7-2 [117 kB] Get:3 http://deb.debian.org/debian bookworm/main amd64 libedit2 amd64 3.1-20221030-2 [93.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 libcbor0.8 amd64 0.8.0-2+b1 [27.4 kB] Get:5 http://deb.debian.org/debian bookworm/main amd64 libfido2-1 amd64 1.12.0-2+b1 [77.2 kB] Get:6 http://deb.debian.org/debian bookworm/main amd64 openssh-client amd64 1:9.2p1-2+deb12u3 [991 kB] Get:7 http://deb.debian.org/debian bookworm/main amd64 libcurl3-gnutls amd64 7.88.1-10+deb12u7 [385 kB] Get:8 http://deb.debian.org/debian bookworm/main amd64 liberror-perl all 0.17029-2 [29.0 kB] Get:9 http://deb.debian.org/debian-security bookworm-security/main amd64 git-man all 1:2.39.5-0+deb12u1 [2054 kB] Get:10 http://deb.debian.org/debian-security bookworm-security/main amd64 git amd64 1:2.39.5-0+deb12u1 [7256 kB] Get:11 http://deb.debian.org/debian bookworm/main amd64 zlib1g-dev amd64 1:1.2.13.dfsg-1 [916 kB] Get:12 http://deb.debian.org/debian bookworm/main amd64 libprotobuf32 amd64 3.21.12-3 [932 kB] Get:13 http://deb.debian.org/debian bookworm/main amd64 libprotobuf-lite32 amd64 3.21.12-3 [261 kB] Get:14 http://deb.debian.org/debian bookworm/main amd64 libprotobuf-dev amd64 3.21.12-3 [1283 kB] Get:15 http://deb.debian.org/debian bookworm/main amd64 libprotoc32 amd64 3.21.12-3 [829 kB] Get:16 http://deb.debian.org/debian bookworm/main amd64 libxau6 amd64 1:1.0.9-1 [19.7 kB] Get:17 http://deb.debian.org/debian bookworm/main amd64 libxdmcp6 amd64 1:1.1.2-3 [26.3 kB] Get:18 http://deb.debian.org/debian bookworm/main amd64 libxcb1 amd64 1.15-1 [144 kB] Get:19 http://deb.debian.org/debian bookworm/main amd64 libx11-data all 2:1.8.4-2+deb12u2 [292 kB] Get:20 http://deb.debian.org/debian bookworm/main amd64 libx11-6 amd64 2:1.8.4-2+deb12u2 [760 kB] Get:21 http://deb.debian.org/debian bookworm/main amd64 libxext6 amd64 2:1.3.4-1+b1 [52.9 kB] Get:22 http://deb.debian.org/debian bookworm/main amd64 libxmuu1 amd64 2:1.1.3-3 [23.9 kB] Get:23 http://deb.debian.org/debian bookworm/main amd64 protobuf-compiler amd64 3.21.12-3 [83.9 kB] Get:24 http://deb.debian.org/debian bookworm/main amd64 xauth amd64 1:1.1.2-1 [36.0 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 16.8 MB in 6s (2595 kB/s) Selecting previously unselected package less. (Reading database ... 14157 files and directories currently installed.) Preparing to unpack .../00-less_590-2.1~deb12u2_amd64.deb ... Unpacking less (590-2.1~deb12u2) ... Selecting previously unselected package libbsd0:amd64. Preparing to unpack .../01-libbsd0_0.11.7-2_amd64.deb ... Unpacking libbsd0:amd64 (0.11.7-2) ... Selecting previously unselected package libedit2:amd64. Preparing to unpack .../02-libedit2_3.1-20221030-2_amd64.deb ... Unpacking libedit2:amd64 (3.1-20221030-2) ... Selecting previously unselected package libcbor0.8:amd64. Preparing to unpack .../03-libcbor0.8_0.8.0-2+b1_amd64.deb ... Unpacking libcbor0.8:amd64 (0.8.0-2+b1) ... Selecting previously unselected package libfido2-1:amd64. Preparing to unpack .../04-libfido2-1_1.12.0-2+b1_amd64.deb ... Unpacking libfido2-1:amd64 (1.12.0-2+b1) ... Selecting previously unselected package openssh-client. Preparing to unpack .../05-openssh-client_1%3a9.2p1-2+deb12u3_amd64.deb ... Unpacking openssh-client (1:9.2p1-2+deb12u3) ... Selecting previously unselected package libcurl3-gnutls:amd64. Preparing to unpack .../06-libcurl3-gnutls_7.88.1-10+deb12u7_amd64.deb ... Unpacking libcurl3-gnutls:amd64 (7.88.1-10+deb12u7) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../07-liberror-perl_0.17029-2_all.deb ... Unpacking liberror-perl (0.17029-2) ... Selecting previously unselected package git-man. Preparing to unpack .../08-git-man_1%3a2.39.5-0+deb12u1_all.deb ... Unpacking git-man (1:2.39.5-0+deb12u1) ... Selecting previously unselected package git. Preparing to unpack .../09-git_1%3a2.39.5-0+deb12u1_amd64.deb ... Unpacking git (1:2.39.5-0+deb12u1) ... Selecting previously unselected package zlib1g-dev:amd64. Preparing to unpack .../10-zlib1g-dev_1%3a1.2.13.dfsg-1_amd64.deb ... Unpacking zlib1g-dev:amd64 (1:1.2.13.dfsg-1) ... Selecting previously unselected package libprotobuf32:amd64. Preparing to unpack .../11-libprotobuf32_3.21.12-3_amd64.deb ... Unpacking libprotobuf32:amd64 (3.21.12-3) ... Selecting previously unselected package libprotobuf-lite32:amd64. Preparing to unpack .../12-libprotobuf-lite32_3.21.12-3_amd64.deb ... Unpacking libprotobuf-lite32:amd64 (3.21.12-3) ... Selecting previously unselected package libprotobuf-dev:amd64. Preparing to unpack .../13-libprotobuf-dev_3.21.12-3_amd64.deb ... Unpacking libprotobuf-dev:amd64 (3.21.12-3) ... Selecting previously unselected package libprotoc32:amd64. Preparing to unpack .../14-libprotoc32_3.21.12-3_amd64.deb ... Unpacking libprotoc32:amd64 (3.21.12-3) ... Selecting previously unselected package libxau6:amd64. Preparing to unpack .../15-libxau6_1%3a1.0.9-1_amd64.deb ... Unpacking libxau6:amd64 (1:1.0.9-1) ... Selecting previously unselected package libxdmcp6:amd64. Preparing to unpack .../16-libxdmcp6_1%3a1.1.2-3_amd64.deb ... Unpacking libxdmcp6:amd64 (1:1.1.2-3) ... Selecting previously unselected package libxcb1:amd64. Preparing to unpack .../17-libxcb1_1.15-1_amd64.deb ... Unpacking libxcb1:amd64 (1.15-1) ... Selecting previously unselected package libx11-data. Preparing to unpack .../18-libx11-data_2%3a1.8.4-2+deb12u2_all.deb ... Unpacking libx11-data (2:1.8.4-2+deb12u2) ... Selecting previously unselected package libx11-6:amd64. Preparing to unpack .../19-libx11-6_2%3a1.8.4-2+deb12u2_amd64.deb ... Unpacking libx11-6:amd64 (2:1.8.4-2+deb12u2) ... Selecting previously unselected package libxext6:amd64. Preparing to unpack .../20-libxext6_2%3a1.3.4-1+b1_amd64.deb ... Unpacking libxext6:amd64 (2:1.3.4-1+b1) ... Selecting previously unselected package libxmuu1:amd64. Preparing to unpack .../21-libxmuu1_2%3a1.1.3-3_amd64.deb ... Unpacking libxmuu1:amd64 (2:1.1.3-3) ... Selecting previously unselected package protobuf-compiler. Preparing to unpack .../22-protobuf-compiler_3.21.12-3_amd64.deb ... Unpacking protobuf-compiler (3.21.12-3) ... Selecting previously unselected package xauth. Preparing to unpack .../23-xauth_1%3a1.1.2-1_amd64.deb ... Unpacking xauth (1:1.1.2-1) ... Setting up libxau6:amd64 (1:1.0.9-1) ... Setting up libcbor0.8:amd64 (0.8.0-2+b1) ... Setting up less (590-2.1~deb12u2) ... Setting up libcurl3-gnutls:amd64 (7.88.1-10+deb12u7) ... Setting up liberror-perl (0.17029-2) ... Setting up libx11-data (2:1.8.4-2+deb12u2) ... Setting up zlib1g-dev:amd64 (1:1.2.13.dfsg-1) ... Setting up libprotobuf32:amd64 (3.21.12-3) ... Setting up libprotobuf-lite32:amd64 (3.21.12-3) ... Setting up git-man (1:2.39.5-0+deb12u1) ... Setting up libfido2-1:amd64 (1.12.0-2+b1) ... Setting up libbsd0:amd64 (0.11.7-2) ... Setting up libprotoc32:amd64 (3.21.12-3) ... Setting up libxdmcp6:amd64 (1:1.1.2-3) ... Setting up libxcb1:amd64 (1.15-1) ... Setting up protobuf-compiler (3.21.12-3) ... Setting up libedit2:amd64 (3.1-20221030-2) ... Setting up libprotobuf-dev:amd64 (3.21.12-3) ... Setting up git (1:2.39.5-0+deb12u1) ... Setting up libx11-6:amd64 (2:1.8.4-2+deb12u2) ... Setting up libxmuu1:amd64 (2:1.1.3-3) ... Setting up openssh-client (1:9.2p1-2+deb12u3) ... Setting up libxext6:amd64 (2:1.3.4-1+b1) ... Setting up xauth (1:1.1.2-1) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... Removing intermediate container 7f15c660223a ---> 32ef7fdab1be Step 8/10 : RUN composer require google/protobuf ---> Running in aae2e33c85f5 ./composer.json has been created Running composer update google/protobuf Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking google/protobuf (v4.28.2) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals Failed to download google/protobuf from dist: The zip extension and unzip/7z commands are both missing, skipping. The php.ini used by your command-line PHP is: /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini Now trying to download from source - Syncing google/protobuf (v4.28.2) into cache - Installing google/protobuf (v4.28.2): Cloning 96021a9a8a from cache 1 package suggestions were added by new dependencies, use `composer suggest` to see details. Generating autoload files No security vulnerability advisories found. Using version ^4.28 for google/protobuf Removing intermediate container aae2e33c85f5 ---> 67a6dd8f2e9b Step 9/10 : RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) ---> Running in 6cc8a0adcc33 Removing intermediate container 6cc8a0adcc33 ---> bb918a5b83c9 Step 10/10 : CMD apachectl -D FOREGROUND ---> Running in 0fa7fdda303a Removing intermediate container 0fa7fdda303a ---> c5a00a3f1870 Successfully built c5a00a3f1870 Successfully tagged youtube-operational-api:latest WARNING: Image for service api was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Recreating youtube-operational-api_api_1 ... error ERROR: for youtube-operational-api_api_1 no such image: sha256:fb4bb233fa268043da6b3194b16e5776f2d1c558024cdff8be0d75bec859a0b2: No such image: sha256:fb4bb233fa268043da6b3194b16e5776f2d1c558024cdff8be0d75bec859a0b2 ERROR: for api no such image: sha256:fb4bb233fa268043da6b3194b16e5776f2d1c558024cdff8be0d75bec859a0b2: No such image: sha256:fb4bb233fa268043da6b3194b16e5776f2d1c558024cdff8be0d75bec859a0b2 ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing. Continue with the new image? [yN]y Recreating d48d81b79599_youtube-operational-api_api_1 ... done Attaching to youtube-operational-api_api_1 api_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message api_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message api_1 | [Thu Sep 19 12:48:11.967012 2024] [mpm_prefork:notice] [pid 9:tid 9] AH00163: Apache/2.4.62 (Debian) PHP/8.3.11 configured -- resuming normal operations api_1 | [Thu Sep 19 12:48:11.967044 2024] [core:notice] [pid 9:tid 9] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND' api_1 | 172.18.0.1 - - [19/Sep/2024:12:48:20 +0000] "GET //search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short HTTP/1.1" 200 51550 "-" "curl/7.88.1" ```
```bash curl 'http://localhost:8080//search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short' ```
Output: ```json { "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": 134325, "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": 241564, "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": "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": 186100, "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": "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": 143690, "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": "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": 8041, "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": "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": "4 hours ago", "duration": 55, "views": 3907, "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": "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": 12085, "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": "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": "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": 242229, "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": "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": 496390, "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": "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": 328818, "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": "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": "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": 640464, "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": 182147, "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": "b0n4vvnX1Po" }, "snippet": { "channelId": "UC_MgraPyUuxLm6vV9imkCLw", "title": "\ubd80\uc871\ud55c \ubd80\ubaa8\uac00 \ucc38 \ub9ce\uac70\ub4e0\u2026.\ud83d\ude2d kdrama #\uad7f\ud30c\ud2b8\ub108 #\uc774\ud63c\ubcc0\ud638\uc0ac #\uc774\ud63c #\ubcc0\ud638\uc0ac #\uc7a5\ub098\ub77c #\ud53c\uc624 #\ub0a8\uc9c0\ud604 #goodpartner #\ubd88\ub95c", "thumbnails": [ { "url": "https:\/\/i.ytimg.com\/vi\/b0n4vvnX1Po\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYRiBjKGUwDw==&rs=AOn4CLBz_4FxA-2PkKSKSalwYrFqohtaLg", "width": 360, "height": 202 }, { "url": "https:\/\/i.ytimg.com\/vi\/b0n4vvnX1Po\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYRiBjKGUwDw==&rs=AOn4CLDEimgqtGXNcYCixO3IgBZeJnEgEg", "width": 720, "height": 404 } ], "channelTitle": "SpotShorts", "channelHandle": "@SpotShorts_kdrama", "timestamp": "4 hours ago", "duration": 60, "views": 1732, "badges": [ "New" ], "channelApproval": null, "channelThumbnails": [ { "url": "https:\/\/yt3.ggpht.com\/HOwUdZzgRx66cOwaze_py4sqCAM_XYeGHYio4Zk052e61QWloCxrZ6AZPir0Rc-xXA_YC0a9=s68-c-k-c0x00ffffff-no-rj", "width": 68, "height": 68 } ], "detailedMetadataSnippet": null, "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": 1223864, "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": [] } } ] } ```
So it works fine.
Benjamin-Loison commented 1 month ago

@KimHyeonGyeom On what OS are you?

KimHyeonGyeom commented 1 month ago

I’m using Ubuntu.

Benjamin-Loison commented 1 month ago

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.

Benjamin-Loison commented 1 month ago

Let me know if with the new commit you still have the issue.

Personal notes: ```bash sudo docker image ls ``` ``` REPOSITORY TAG IMAGE ID CREATED SIZE ``` ```bash sudo docker container ls ``` ``` CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` ```bash git log | head -n 5 ```
Output: ``` commit 4557d9aef14a528a805baf474ba5f4ec27de9f03 Author: Benjamin Loison <12752145+Benjamin-Loison@users.noreply.github.com> Date: Thu Sep 19 14:54:28 2024 +0200 Fix #300: Add Protobuf support to Docker (#265) ```
```bash sudo docker-compose up ```
Output: ``` Building api Sending build context to Docker daemon 328.2kB Step 1/10 : FROM php:apache apache: Pulling from library/php a2318d6c47ec: Already exists c335a1cecf20: Already exists 9f1356d24f26: Already exists 93a67f8d1dfc: Already exists 773d8e2be6c6: Already exists b874a8bbb522: Already exists 395851b4c00b: Already exists ca8ceff00491: Already exists a536a22fc4b9: Already exists 5391caed04b1: Already exists 267696056425: Already exists f8945584c4c0: Already exists cc7b1f3f4638: Already exists Digest: sha256:93ac377d33f857707c7684416504d23fe05da32dc9452789a02d382ec5d13184 Status: Downloaded newer image for php:apache ---> 568a8e52fddf Step 2/10 : RUN a2enmod rewrite ---> Running in 3463a8787972 Enabling module rewrite. To activate the new configuration, you need to run: service apache2 restart Removing intermediate container 3463a8787972 ---> d84be6f14beb Step 3/10 : COPY . /var/www/html/ ---> 53a0400764b3 Step 4/10 : RUN sed -ri -e 'N;N;N;s/(\n)(.*\n)(.*)AllowOverride None/\1\2\3AllowOverride All/;p;d;' /etc/apache2/apache2.conf ---> Running in e90e07468cf9 Removing intermediate container e90e07468cf9 ---> 8da89eedad0b Step 5/10 : COPY --from=composer/composer:latest-bin /composer /usr/bin/composer latest-bin: Pulling from composer/composer a22b09689e8e: Pull complete Digest: sha256:16b920d0d55d162e3f624a6c4de2ad444a985318ac38566351d31958cbcf382b Status: Downloaded newer image for composer/composer:latest-bin ---> e214006649d9 Step 6/10 : RUN apt update ---> Running in 57ac48a5ed6c WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB] Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 Packages [8787 kB] Get:5 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2468 B] Get:6 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [182 kB] Fetched 9226 kB in 4s (2231 kB/s) Reading package lists... Building dependency tree... Reading state information... 1 package can be upgraded. Run 'apt list --upgradable' to see it. Removing intermediate container 57ac48a5ed6c ---> 5b88c12bdd6a Step 7/10 : RUN apt install -y git protobuf-compiler ---> Running in ad314378bcd1 WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: git-man less libbsd0 libcbor0.8 libcurl3-gnutls libedit2 liberror-perl libfido2-1 libprotobuf-dev libprotobuf-lite32 libprotobuf32 libprotoc32 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client xauth zlib1g-dev Suggested packages: gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn keychain libpam-ssh monkeysphere ssh-askpass protobuf-mode-el The following NEW packages will be installed: git git-man less libbsd0 libcbor0.8 libcurl3-gnutls libedit2 liberror-perl libfido2-1 libprotobuf-dev libprotobuf-lite32 libprotobuf32 libprotoc32 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client protobuf-compiler xauth zlib1g-dev 0 upgraded, 24 newly installed, 0 to remove and 1 not upgraded. Need to get 16.8 MB of archives. After this operation, 81.0 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian bookworm/main amd64 less amd64 590-2.1~deb12u2 [132 kB] Get:2 http://deb.debian.org/debian bookworm/main amd64 libbsd0 amd64 0.11.7-2 [117 kB] Get:3 http://deb.debian.org/debian bookworm/main amd64 libedit2 amd64 3.1-20221030-2 [93.0 kB] Get:4 http://deb.debian.org/debian bookworm/main amd64 libcbor0.8 amd64 0.8.0-2+b1 [27.4 kB] Get:5 http://deb.debian.org/debian bookworm/main amd64 libfido2-1 amd64 1.12.0-2+b1 [77.2 kB] Get:6 http://deb.debian.org/debian bookworm/main amd64 openssh-client amd64 1:9.2p1-2+deb12u3 [991 kB] Get:7 http://deb.debian.org/debian bookworm/main amd64 libcurl3-gnutls amd64 7.88.1-10+deb12u7 [385 kB] Get:8 http://deb.debian.org/debian bookworm/main amd64 liberror-perl all 0.17029-2 [29.0 kB] Get:9 http://deb.debian.org/debian-security bookworm-security/main amd64 git-man all 1:2.39.5-0+deb12u1 [2054 kB] Get:10 http://deb.debian.org/debian-security bookworm-security/main amd64 git amd64 1:2.39.5-0+deb12u1 [7256 kB] Get:11 http://deb.debian.org/debian bookworm/main amd64 zlib1g-dev amd64 1:1.2.13.dfsg-1 [916 kB] Get:12 http://deb.debian.org/debian bookworm/main amd64 libprotobuf32 amd64 3.21.12-3 [932 kB] Get:13 http://deb.debian.org/debian bookworm/main amd64 libprotobuf-lite32 amd64 3.21.12-3 [261 kB] Get:14 http://deb.debian.org/debian bookworm/main amd64 libprotobuf-dev amd64 3.21.12-3 [1283 kB] Get:15 http://deb.debian.org/debian bookworm/main amd64 libprotoc32 amd64 3.21.12-3 [829 kB] Get:16 http://deb.debian.org/debian bookworm/main amd64 libxau6 amd64 1:1.0.9-1 [19.7 kB] Get:17 http://deb.debian.org/debian bookworm/main amd64 libxdmcp6 amd64 1:1.1.2-3 [26.3 kB] Get:18 http://deb.debian.org/debian bookworm/main amd64 libxcb1 amd64 1.15-1 [144 kB] Get:19 http://deb.debian.org/debian bookworm/main amd64 libx11-data all 2:1.8.4-2+deb12u2 [292 kB] Get:20 http://deb.debian.org/debian bookworm/main amd64 libx11-6 amd64 2:1.8.4-2+deb12u2 [760 kB] Get:21 http://deb.debian.org/debian bookworm/main amd64 libxext6 amd64 2:1.3.4-1+b1 [52.9 kB] Get:22 http://deb.debian.org/debian bookworm/main amd64 libxmuu1 amd64 2:1.1.3-3 [23.9 kB] Get:23 http://deb.debian.org/debian bookworm/main amd64 protobuf-compiler amd64 3.21.12-3 [83.9 kB] Get:24 http://deb.debian.org/debian bookworm/main amd64 xauth amd64 1:1.1.2-1 [36.0 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 16.8 MB in 6s (2861 kB/s) Selecting previously unselected package less. (Reading database ... 14157 files and directories currently installed.) Preparing to unpack .../00-less_590-2.1~deb12u2_amd64.deb ... Unpacking less (590-2.1~deb12u2) ... Selecting previously unselected package libbsd0:amd64. Preparing to unpack .../01-libbsd0_0.11.7-2_amd64.deb ... Unpacking libbsd0:amd64 (0.11.7-2) ... Selecting previously unselected package libedit2:amd64. Preparing to unpack .../02-libedit2_3.1-20221030-2_amd64.deb ... Unpacking libedit2:amd64 (3.1-20221030-2) ... Selecting previously unselected package libcbor0.8:amd64. Preparing to unpack .../03-libcbor0.8_0.8.0-2+b1_amd64.deb ... Unpacking libcbor0.8:amd64 (0.8.0-2+b1) ... Selecting previously unselected package libfido2-1:amd64. Preparing to unpack .../04-libfido2-1_1.12.0-2+b1_amd64.deb ... Unpacking libfido2-1:amd64 (1.12.0-2+b1) ... Selecting previously unselected package openssh-client. Preparing to unpack .../05-openssh-client_1%3a9.2p1-2+deb12u3_amd64.deb ... Unpacking openssh-client (1:9.2p1-2+deb12u3) ... Selecting previously unselected package libcurl3-gnutls:amd64. Preparing to unpack .../06-libcurl3-gnutls_7.88.1-10+deb12u7_amd64.deb ... Unpacking libcurl3-gnutls:amd64 (7.88.1-10+deb12u7) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../07-liberror-perl_0.17029-2_all.deb ... Unpacking liberror-perl (0.17029-2) ... Selecting previously unselected package git-man. Preparing to unpack .../08-git-man_1%3a2.39.5-0+deb12u1_all.deb ... Unpacking git-man (1:2.39.5-0+deb12u1) ... Selecting previously unselected package git. Preparing to unpack .../09-git_1%3a2.39.5-0+deb12u1_amd64.deb ... Unpacking git (1:2.39.5-0+deb12u1) ... Selecting previously unselected package zlib1g-dev:amd64. Preparing to unpack .../10-zlib1g-dev_1%3a1.2.13.dfsg-1_amd64.deb ... Unpacking zlib1g-dev:amd64 (1:1.2.13.dfsg-1) ... Selecting previously unselected package libprotobuf32:amd64. Preparing to unpack .../11-libprotobuf32_3.21.12-3_amd64.deb ... Unpacking libprotobuf32:amd64 (3.21.12-3) ... Selecting previously unselected package libprotobuf-lite32:amd64. Preparing to unpack .../12-libprotobuf-lite32_3.21.12-3_amd64.deb ... Unpacking libprotobuf-lite32:amd64 (3.21.12-3) ... Selecting previously unselected package libprotobuf-dev:amd64. Preparing to unpack .../13-libprotobuf-dev_3.21.12-3_amd64.deb ... Unpacking libprotobuf-dev:amd64 (3.21.12-3) ... Selecting previously unselected package libprotoc32:amd64. Preparing to unpack .../14-libprotoc32_3.21.12-3_amd64.deb ... Unpacking libprotoc32:amd64 (3.21.12-3) ... Selecting previously unselected package libxau6:amd64. Preparing to unpack .../15-libxau6_1%3a1.0.9-1_amd64.deb ... Unpacking libxau6:amd64 (1:1.0.9-1) ... Selecting previously unselected package libxdmcp6:amd64. Preparing to unpack .../16-libxdmcp6_1%3a1.1.2-3_amd64.deb ... Unpacking libxdmcp6:amd64 (1:1.1.2-3) ... Selecting previously unselected package libxcb1:amd64. Preparing to unpack .../17-libxcb1_1.15-1_amd64.deb ... Unpacking libxcb1:amd64 (1.15-1) ... Selecting previously unselected package libx11-data. Preparing to unpack .../18-libx11-data_2%3a1.8.4-2+deb12u2_all.deb ... Unpacking libx11-data (2:1.8.4-2+deb12u2) ... Selecting previously unselected package libx11-6:amd64. Preparing to unpack .../19-libx11-6_2%3a1.8.4-2+deb12u2_amd64.deb ... Unpacking libx11-6:amd64 (2:1.8.4-2+deb12u2) ... Selecting previously unselected package libxext6:amd64. Preparing to unpack .../20-libxext6_2%3a1.3.4-1+b1_amd64.deb ... Unpacking libxext6:amd64 (2:1.3.4-1+b1) ... Selecting previously unselected package libxmuu1:amd64. Preparing to unpack .../21-libxmuu1_2%3a1.1.3-3_amd64.deb ... Unpacking libxmuu1:amd64 (2:1.1.3-3) ... Selecting previously unselected package protobuf-compiler. Preparing to unpack .../22-protobuf-compiler_3.21.12-3_amd64.deb ... Unpacking protobuf-compiler (3.21.12-3) ... Selecting previously unselected package xauth. Preparing to unpack .../23-xauth_1%3a1.1.2-1_amd64.deb ... Unpacking xauth (1:1.1.2-1) ... Setting up libxau6:amd64 (1:1.0.9-1) ... Setting up libcbor0.8:amd64 (0.8.0-2+b1) ... Setting up less (590-2.1~deb12u2) ... Setting up libcurl3-gnutls:amd64 (7.88.1-10+deb12u7) ... Setting up liberror-perl (0.17029-2) ... Setting up libx11-data (2:1.8.4-2+deb12u2) ... Setting up zlib1g-dev:amd64 (1:1.2.13.dfsg-1) ... Setting up libprotobuf32:amd64 (3.21.12-3) ... Setting up libprotobuf-lite32:amd64 (3.21.12-3) ... Setting up git-man (1:2.39.5-0+deb12u1) ... Setting up libfido2-1:amd64 (1.12.0-2+b1) ... Setting up libbsd0:amd64 (0.11.7-2) ... Setting up libprotoc32:amd64 (3.21.12-3) ... Setting up libxdmcp6:amd64 (1:1.1.2-3) ... Setting up libxcb1:amd64 (1.15-1) ... Setting up protobuf-compiler (3.21.12-3) ... Setting up libedit2:amd64 (3.1-20221030-2) ... Setting up libprotobuf-dev:amd64 (3.21.12-3) ... Setting up git (1:2.39.5-0+deb12u1) ... Setting up libx11-6:amd64 (2:1.8.4-2+deb12u2) ... Setting up libxmuu1:amd64 (2:1.1.3-3) ... Setting up openssh-client (1:9.2p1-2+deb12u3) ... Setting up libxext6:amd64 (2:1.3.4-1+b1) ... Setting up xauth (1:1.1.2-1) ... Processing triggers for libc-bin (2.36-9+deb12u8) ... Removing intermediate container ad314378bcd1 ---> b5c0f015a484 Step 8/10 : RUN composer require google/protobuf ---> Running in 79ee424a6bd7 ./composer.json has been created Running composer update google/protobuf Loading composer repositories with package information Updating dependencies Lock file operations: 1 install, 0 updates, 0 removals - Locking google/protobuf (v4.28.2) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 1 install, 0 updates, 0 removals Failed to download google/protobuf from dist: The zip extension and unzip/7z commands are both missing, skipping. The php.ini used by your command-line PHP is: /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini Now trying to download from source - Syncing google/protobuf (v4.28.2) into cache - Installing google/protobuf (v4.28.2): Cloning 96021a9a8a from cache 1 package suggestions were added by new dependencies, use `composer suggest` to see details. Generating autoload files No security vulnerability advisories found. Using version ^4.28 for google/protobuf Removing intermediate container 79ee424a6bd7 ---> e6ce3a0072a7 Step 9/10 : RUN protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f) ---> Running in 723fb11be7e4 Removing intermediate container 723fb11be7e4 ---> 7ba4e6db8312 Step 10/10 : CMD apachectl -D FOREGROUND ---> Running in 71536ac2f02e Removing intermediate container 71536ac2f02e ---> 695b352fc0a7 Successfully built 695b352fc0a7 Successfully tagged youtube-operational-api:latest WARNING: Image for service api was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Recreating youtube-operational-api_api_1 ... error ERROR: for youtube-operational-api_api_1 no such image: sha256:c5a00a3f18708c3768d0bf4daea3dec5cc1ef6f8e2e30bfe6a961586ac1310b6: No such image: sha256:c5a00a3f18708c3768d0bf4daea3dec5cc1ef6f8e2e30bfe6a961586ac1310b6 ERROR: for api no such image: sha256:c5a00a3f18708c3768d0bf4daea3dec5cc1ef6f8e2e30bfe6a961586ac1310b6: No such image: sha256:c5a00a3f18708c3768d0bf4daea3dec5cc1ef6f8e2e30bfe6a961586ac1310b6 ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing. Continue with the new image? [yN]y Recreating d78dbc9d6a25_youtube-operational-api_api_1 ... done Attaching to youtube-operational-api_api_1 api_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message api_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.2. Set the 'ServerName' directive globally to suppress this message api_1 | [Thu Sep 19 13:00:58.084105 2024] [mpm_prefork:notice] [pid 9:tid 9] AH00163: Apache/2.4.62 (Debian) PHP/8.3.11 configured -- resuming normal operations api_1 | [Thu Sep 19 13:00:58.084150 2024] [core:notice] [pid 9:tid 9] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND' api_1 | 172.18.0.1 - - [19/Sep/2024:13:01:26 +0000] "GET //search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short HTTP/1.1" 200 50973 "-" "curl/7.88.1" ```
```bash curl 'http://localhost:8080//search?part=id,snippet&q=굿파트너&type=short' ``` ![image](https://github.com/user-attachments/assets/48800245-5824-49b6-98d0-97270dd501bf) on Debian 12 GNOME. ```bash curl 'http://localhost:8080//search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short' ```
Output: ```json { "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": [] } } ] } ```
KimHyeonGyeom commented 1 month ago

Everything is working fine now! Thank you!