Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The search for Korean shorts is no more working! #300

Closed
KimHyeonGyeom opened this issue Sep 10, 2024 · 33 comments
Closed

The search for Korean shorts is no more working! #300

KimHyeonGyeom opened this issue Sep 10, 2024 · 33 comments
Assignees
Labels
bug Something isn't working epic A task that is going to take more than a day to complete. medium priority A high-priority issue noticeable by the user but he can still work around it.

Comments

@KimHyeonGyeom
Copy link

KimHyeonGyeom commented Sep 10, 2024

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 Benjamin-Loison self-assigned this Sep 10, 2024
@Benjamin-Loison Benjamin-Loison added enhancement New feature or request medium priority A high-priority issue noticeable by the user but he can still work around it. quick A task that should take less than two hours to complete. labels Sep 10, 2024
@Benjamin-Loison
Copy link
Owner

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

@Benjamin-Loison Benjamin-Loison changed the title The search for Korean works in shorts is not working! The search for Korean works in shorts is not working! Sep 10, 2024
@Benjamin-Loison Benjamin-Loison changed the title The search for Korean works in shorts is not working! The search for Korean works in shorts is no more working! Sep 10, 2024
@Benjamin-Loison Benjamin-Loison changed the title The search for Korean works in shorts is no more working! The search for Korean shorts is no more working! Sep 10, 2024
@Benjamin-Loison
Copy link
Owner

Benjamin-Loison commented Sep 10, 2024

Personal notes:

In Firefox %EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88 turns into 굿파트너.

I confirm the issue on local instance:

Related to #24.

It seems that https://www.youtube.com/results?search_query=test have 2 carousels to some extent redundant and provide a limited number of entries. 40 entries for the first one and the other one being of 10 entries.

getJSONPathFromKey results | grep 'Can you pass the dumb test'
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.

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 --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
Copy link
Owner

Benjamin-Loison commented Sep 11, 2024

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.

@Benjamin-Loison Benjamin-Loison added medium A task that should take less than a day to complete. bug Something isn't working and removed quick A task that should take less than two hours to complete. enhancement New feature or request labels Sep 11, 2024
@KimHyeonGyeom
Copy link
Author

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

@KimHyeonGyeom
Copy link
Author

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

@Benjamin-Loison
Copy link
Owner

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
Copy link
Owner

Benjamin-Loison commented Sep 15, 2024

Personal notes:

#265 solved.

Just verifying that a short video id is part of the response is incorrect as it may be part of a carousel, precising that it should be the first video return is incorrect too as it is not deterministic, so here are versions verifying that all videos returned (and check that there are some) are shorts:

Verify despite not determinism:
import requests
import json
import base64
import blackboxprotobuf

def getBase64Protobuf(message, typedef):
    data = blackboxprotobuf.encode_message(message, typedef)
    return base64.b64encode(data).decode('ascii')

URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
    'Content-Type': 'application/json',
    #'User-Agent': 'curl/8.5.0',
}

message = {
    "2": {
        "2": "test",
        "3": "ErEKkgGtCjqVARKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSk4AWAaSpIJCiYKBHRlc3TqAQ8KDVoLCgcIhgESABgLGGHyAQUKA0FsbNgCAbgDYQq1AeoBDwoNWgsKBwiGARIAGAsYGvIBCAoGU2hvcnRzwgKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSn4AgG4AxoKTOoBDwoNWgsKBwiGARIAGAsYSPIBCAoGVmlkZW9zwgIaeW91dHViZV92aWRlb19wYWdlIDp0eXBlOnLoAgGoAwG4A0jAAwHIAwHQAwEKKOoBDwoNWgsKBwiGARIAGAsYHPIBCwoJVW53YXRjaGVkygICCAG4AxwKJuoBDwoNWgsKBwiGARIAGAsYSvIBCQoHV2F0Y2hlZMoCAhgCuANKCi1gB-oBDwoNWgsKBwiGARIAGAsYB_IBEwoRUmVjZW50bHkgdXBsb2FkZWS4AwcKS-oBDwoNWgsKBwiGARIAGAsYBPIBBgoETGl2ZcICJ3lvdXR1YmVfbGl2ZV9icm9hZGNhc3Rfc3RhdHVzPTAgOnR5cGU6cugCAbgDBApOChVjeWJlcnRydWNrIGNyYXNoIHRlc3TqAR8KHVobCgcIhgESABgLEhBjeWJlcnRydWNrX2NyYXNo8gESChBDeWJlcnRydWNrIGNyYXNoCj8KEHZvbHZvIGNyYXNoIHRlc3TqARoKGFoWCgcIhgESABgLEgt2b2x2b19jcmFzaPIBDQoLVm9sdm8gY3Jhc2gKPwoQcGVyc29uYWxpdHkgdGVzdOoBGgoYWhYKBwiGARIAGAsSC3BlcnNvbmFsaXR58gENCgtQZXJzb25hbGl0eQozCgx0ZXN0IGNyaWNrZXTqARYKFFoSCgcIhgESABgLEgdjcmlja2V08gEJCgdDcmlja2V0Ci0KCnRlc3QgbXVzaWPqARQKEloQCgcIhgESABgLEgVtdXNpY_IBBwoFTXVzaWMKPwoQdGVzbGEgY3Jhc2ggdGVzdOoBGgoYWhYKBwiGARIAGAsSC3Rlc2xhX2NyYXNo8gENCgtUZXNsYSBjcmFzaAotCgp0ZXN0IGF1ZGlv6gEUChJaEAoHCIYBEgAYCxIFYXVkaW_yAQcKBUF1ZGlvCigKBXRlc3Rv6gEUChJaEAoHCIYBEgAYCxIFdGVzdG_yAQcKBVRlc3RvCi0KCnRlc3QgZHJpdmXqARQKEloQCgcIhgESABgLEgVkcml2ZfIBBwoFRHJpdmUKKAoFdGVzdHPqARQKEloQCgcIhgESABgLEgV0ZXN0c_IBBwoFVGVzdHMKJAoHdGVzdCBtZeoBEQoPWg0KBwiGARIAGAsSAm1l8gEECgJNZQo0Cgl0ZXN0IHRlc3TqARgKFloUCgcIhgESABgLEgl0ZXN0X3Rlc3TyAQsKCVRlc3QgdGVzdBgLWg0KCwgEKgcIhgESABgLeAA%3D",
        "18": 1
    },
    "3": 52047873,
    "4": "search-page"
}

typedef = {
    "2": {
        "field_order": [
            "2",
            "3",
            "18"
        ],
        "message_typedef": {
            "2": {
                "type": "string"
            },
            "3": {
                "type": "string"
            },
            "18": {
                "type": "int"
            }
        },
        "type": "message"
    },
    "3": {
        "type": "int"
    },
    "4": {
        "type": "string"
    }
}

continuation = getBase64Protobuf(message, typedef)

DATA = {
    'context': {
        'client': {
            'clientName': 'WEB',
            'clientVersion': '2.20240913.01.00',
        }
    },
    'continuation': continuation#"EoIOEgR0ZXN0GvYNRXJFS2tnR3RDanFWQVJLT0FTaGhJSGx2ZFhSMVltVmZjMmh2Y25SelgyVnNhV2RwWW14bElEcDBlWEJsT25JZ0tHNGdlVzkxZEhWaVpWOW1iR0ZuWDJoaGMxOXdjbVZ0YVdWeVpWOTJhV1JsYjE5dFpYUmhaR0YwWVQweElEcDBlWEJsT25JcElDaHVJSGx2ZFhSMVltVmZabXhoWjE5b1lYTmZiR2wyWlY5emRISmxZVzFmYldWMFlXUmhkR0U5TVNBNmRIbHdaVHB5S1NrNEFXQWFTcElKQ2lZS0JIUmxjM1RxQVE4S0RWb0xDZ2NJaGdFU0FCZ0xHR0h5QVFVS0EwRnNiTmdDQWJnRFlRcTFBZW9CRHdvTldnc0tCd2lHQVJJQUdBc1lHdklCQ0FvR1UyaHZjblJ6d2dLT0FTaGhJSGx2ZFhSMVltVmZjMmh2Y25SelgyVnNhV2RwWW14bElEcDBlWEJsT25JZ0tHNGdlVzkxZEhWaVpWOW1iR0ZuWDJoaGMxOXdjbVZ0YVdWeVpWOTJhV1JsYjE5dFpYUmhaR0YwWVQweElEcDBlWEJsT25JcElDaHVJSGx2ZFhSMVltVmZabXhoWjE5b1lYTmZiR2wyWlY5emRISmxZVzFmYldWMFlXUmhkR0U5TVNBNmRIbHdaVHB5S1NuNEFnRzRBeG9LVE9vQkR3b05XZ3NLQndpR0FSSUFHQXNZU1BJQkNBb0dWbWxrWlc5endnSWFlVzkxZEhWaVpWOTJhV1JsYjE5d1lXZGxJRHAwZVhCbE9uTG9BZ0dvQXdHNEEwakFBd0hJQXdIUUF3RUtLT29CRHdvTldnc0tCd2lHQVJJQUdBc1lIUElCQ3dvSlZXNTNZWFJqYUdWa3lnSUNDQUc0QXh3S0p1b0JEd29OV2dzS0J3aUdBUklBR0FzWVN2SUJDUW9IVjJGMFkyaGxaTW9DQWhnQ3VBTktDaTFnQi1vQkR3b05XZ3NLQndpR0FSSUFHQXNZQl9JQkV3b1JVbVZqWlc1MGJIa2dkWEJzYjJGa1pXUzRBd2NLUy1vQkR3b05XZ3NLQndpR0FSSUFHQXNZQlBJQkJnb0VUR2wyWmNJQ0ozbHZkWFIxWW1WZmJHbDJaVjlpY205aFpHTmhjM1JmYzNSaGRIVnpQVEFnT25SNWNHVTZjdWdDQWJnREJBcE9DaFZqZVdKbGNuUnlkV05ySUdOeVlYTm9JSFJsYzNUcUFSOEtIVm9iQ2djSWhnRVNBQmdMRWhCamVXSmxjblJ5ZFdOclgyTnlZWE5vOGdFU0NoQkRlV0psY25SeWRXTnJJR055WVhOb0NqOEtFSFp2YkhadklHTnlZWE5vSUhSbGMzVHFBUm9LR0ZvV0NnY0loZ0VTQUJnTEVndDJiMngyYjE5amNtRnphUElCRFFvTFZtOXNkbThnWTNKaGMyZ0tQd29RY0dWeWMyOXVZV3hwZEhrZ2RHVnpkT29CR2dvWVdoWUtCd2lHQVJJQUdBc1NDM0JsY25OdmJtRnNhWFI1OGdFTkNndFFaWEp6YjI1aGJHbDBlUW96Q2d4MFpYTjBJR055YVdOclpYVHFBUllLRkZvU0NnY0loZ0VTQUJnTEVnZGpjbWxqYTJWMDhnRUpDZ2REY21samEyVjBDaTBLQ25SbGMzUWdiWFZ6YVdQcUFSUUtFbG9RQ2djSWhnRVNBQmdMRWdWdGRYTnBZX0lCQndvRlRYVnphV01LUHdvUWRHVnpiR0VnWTNKaGMyZ2dkR1Z6ZE9vQkdnb1lXaFlLQndpR0FSSUFHQXNTQzNSbGMyeGhYMk55WVhObzhnRU5DZ3RVWlhOc1lTQmpjbUZ6YUFvdENncDBaWE4wSUdGMVpHbHY2Z0VVQ2hKYUVBb0hDSVlCRWdBWUN4SUZZWFZrYVdfeUFRY0tCVUYxWkdsdkNpZ0tCWFJsYzNSdjZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRmRHVnpkR195QVFjS0JWUmxjM1J2Q2kwS0NuUmxjM1FnWkhKcGRtWHFBUlFLRWxvUUNnY0loZ0VTQUJnTEVnVmtjbWwyWmZJQkJ3b0ZSSEpwZG1VS0tBb0ZkR1Z6ZEhQcUFSUUtFbG9RQ2djSWhnRVNBQmdMRWdWMFpYTjBjX0lCQndvRlZHVnpkSE1LSkFvSGRHVnpkQ0J0WmVvQkVRb1BXZzBLQndpR0FSSUFHQXNTQW0xbDhnRUVDZ0pOWlFvMENnbDBaWE4wSUhSbGMzVHFBUmdLRmxvVUNnY0loZ0VTQUJnTEVnbDBaWE4wWDNSbGMzVHlBUXNLQ1ZSbGMzUWdkR1Z6ZEJnTFdnMEtDd2dFS2djSWhnRVNBQmdMZUFBJTNEkAEBGIHg6BgiC3NlYXJjaC1wYWdl",
}

PARAMS = {
    'prettyPrint': 'false',
}

##

response = requests.post(URL, params = PARAMS, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)

def isDataOnlyContainingShorts(data):
    verificationParams = {
        'part': 'short',
    }

    try:
        videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
        for video in videos:
            #print(json.dumps(video, indent = 4))
            #try:
            videoId = video['videoRenderer']['videoId']
            # *No results found*
            #except KeyError:
            #    return False
            #print(videoId)
            verificationUrl = 'http://localhost/YouTube-operational-API/videos'
            verificationParams['id'] = videoId
            if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
                return False
    except:
        return False
    return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data))
def isRequestStillFine(httpMethod, url, params, headers, data, needle):
    data = httpMethod(url, params = params, headers = headers, json = data).json()
    dataStr = json.dumps(data, indent = 4)
    #print(dataStr)
    return isDataOnlyContainingShorts(data)

So need Protobuf recursive minimization.

"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, however, 3 seems to match the regenerated one...

Maybe have to particularly pay attention to altchars. It solved matching issue.

Minimized Python script:
import requests
import json
import base64
import blackboxprotobuf

def getBase64Protobuf(message, typedef):
    data = blackboxprotobuf.encode_message(message, typedef)
    return base64.b64encode(data, altchars = b'-_').decode('ascii')

URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
    'Content-Type': 'application/json',
    #'User-Agent': 'curl/8.5.0',
}

message = {
    '2': {
        '18': {
            '7': {
                '12': 26
            },
            '9': {
            }
        }
    },
}

typedef = {
    '2': {
        'field_order': [
            '18'
        ],
        'message_typedef': {
            '18': {
                'field_order': [
                    '7',
                    '9'
                ],
                'message_typedef': {
                    '7': {
                        'field_order': [
                            '12'
                        ],
                        'message_typedef': {
                            '12': {
                                'type': 'int'
                            }
                        },
                        'type': 'message'
                    },
                    '9': {
                        'message_typedef': {},
                        'type': 'message'
                    }
                },
                'type': 'message'
            }
        },
        'type': 'message'
    },
    '15': {
        'type': 'int'
    }
}

three = getBase64Protobuf(message, typedef)

message = {
    '2': {
        '2': 'test',
        '3': three,
        '18': 1
    },
    '3': 52047873,
    '4': 'search-page'
}

typedef = {
    '2': {
        'field_order': [
            '2',
            '3',
            '18'
        ],
        'message_typedef': {
            '2': {
                'type': 'string'
            },
            '3': {
                'type': 'string'
            },
            '18': {
                'type': 'int'
            }
        },
        'type': 'message'
    },
    '3': {
        'type': 'int'
    },
    '4': {
        'type': 'string'
    }
}

continuation = getBase64Protobuf(message, typedef)

DATA = {
    'context': {
        'client': {
            'clientName': 'WEB',
            'clientVersion': '2.20240913.01.00',
        }
    },
    'continuation': continuation,
}

##

response = requests.post(URL, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)

def isDataOnlyContainingShorts(data):
    verificationParams = {
        'part': 'short',
    }

    try:
        videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
        for video in videos:
            #print(json.dumps(video, indent = 4))
            #try:
            videoId = video['videoRenderer']['videoId']
            # *No results found*
            #except KeyError:
            #    return False
            #print(videoId)
            verificationUrl = 'http://localhost/YouTube-operational-API/videos'
            verificationParams['id'] = videoId
            if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
                print(videoId)
                return False
    except:
        return False
    return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data))

seems minimized.

Some R&D about not ending up with 6 files seems needed. Can we put multiple messages in a single file?

ls proto/prototypes/
browse.proto
proto/prototypes/browse.proto:
syntax = "proto3";

message SubBrowse {
  string postId = 22;
}

message Browse {
  string endpoint = 2;
  SubBrowse subBrowse = 25;
}
ls proto/php/

does not return anything.

protoc --php_out=proto/php/ --proto_path=proto/prototypes/ $(find proto/prototypes/ -type f)

does not return anything.

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 messages 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.

$subBrowse = new \SubBrowse()->setPostId($postId);

does not work contrarily to:

$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:

$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
Copy link
Owner

Benjamin-Loison commented Sep 15, 2024

@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
Copy link
Owner

Benjamin-Loison commented Sep 15, 2024

Personal notes:
Diff showing debugging:
diff --git a/search.php b/search.php
index 25210bd..4fa189f 100644
--- a/search.php
+++ b/search.php
@@ -13,6 +13,16 @@
 
 include_once 'common.php';
 
+includeOnceProtos([
+    'BrowseShorts',
+    'Sub0BrowseShorts',
+    'Sub1BrowseShorts',
+    'Sub2BrowseShorts',
+    'Sub3BrowseShorts',
+    'Sub4_7BrowseShorts',
+    'Sub4_9BrowseShorts',
+]);
+
 $realOptions = [
     'id',
     'snippet',
@@ -112,14 +122,58 @@ function getAPI($id, $order, $continuationToken)
                     'clientVersion' => MUSIC_VERSION
                 ]
             ],
-            'query' => str_replace('"', '\"', $_GET['q'])
         ];
+        if(isset($_GET['type']) && $_GET['type'] === 'short') {
+            /*
+            $browseShorts = (new \Sub3BrowseShorts())
+                                ->setSeven((new \Sub4_7BrowseShorts())
+                                    ->setTwelve(26));
+            $continuation = base64_encode($browseShorts->serializeToString());
+            die("!$continuation!"); // matches Python
+            $browseShorts = ((new \Sub4_7BrowseShorts())
+                                    ->setTwelve(26));
+            $continuation = base64_encode($browseShorts->serializeToString());
+            die("!$continuation!"); // matches Python
+            $browseShorts = (new \Sub3BrowseShorts())->setNine(new \Sub4_9BrowseShorts());
+            $continuation = base64_encode($browseShorts->serializeToString());
+            die("!$continuation!"); // matches Python
+            $browseShorts = new \Sub4_9BrowseShorts();
+            $continuation = base64_encode($browseShorts->serializeToString());
+            die("!$continuation!");*/
+            // three differs with Python
+            $sub1BrowseShorts = (new \Sub1BrowseShorts())
+                        ->setTwo((new \Sub2BrowseShorts())
+                            ->setEighteen((new \Sub3BrowseShorts())
+                                ->setSeven((new \Sub4_7BrowseShorts())
+                                    ->setTwelve(26))
+                                ->setNine(new \Sub4_9BrowseShorts())));
+            /*$continuation = base64_encode($browseShorts->serializeToString());
+            die($continuation);*/ // matches Python
+            /*$browseShorts = (new \Sub0BrowseShorts())
+                    ->setThree(base64_encode($sub1BrowseShorts->serializeToString()));
+            $continuation = base64_encode($browseShorts->serializeToString());
+            die($continuation);*/
+            // The following does not only return shorts no matter if comment `setNine`
+            $browseShorts = (new \BrowseShorts())
+                ->setTwo((new \Sub0BrowseShorts())
+                    ->setTwo('test')
+                    ->setThree(base64_encode($sub1BrowseShorts->serializeToString()))
+                    ->setEighteen(1))
+                ->setThree(52047873)
+                ->setFour('search-page');
+
+            $continuation = base64_encode($browseShorts->serializeToString());
+            //die($continuation);
+            $rawData['continuation'] = $continuation;
+        } else {
+            $rawData['query'] = str_replace('"', '\"', $_GET['q']);
+            if($typeBase64 !== '') {
+                $rawData['params'] = $typeBase64;
+            }
+        }
         if($continuationTokenProvided) {
             $rawData['continuation'] = $continuationToken;
         }
-        if($typeBase64 !== '') {
-            $rawData['params'] = $typeBase64;
-        }
         $opts = [
                'http' => [
                    'method' => 'POST',
@@ -127,7 +181,9 @@ function getAPI($id, $order, $continuationToken)
                    'content' => json_encode($rawData),
                ]
         ];
+        //$json = getJSON('http://localhost/https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
         $json = getJSON('https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
+        die(json_encode($json));
         if(isset($_GET['type']) && $_GET['type'] === 'short')
         {
             $contents = $json['contents']['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents'];

The first retrieved video is as wanted a short.

Is Sub4_9BrowseShorts really necessary?

browse_shorts.proto:
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 --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.

@Benjamin-Loison Benjamin-Loison added epic A task that is going to take more than a day to complete. and removed medium A task that should take less than a day to complete. labels Sep 15, 2024
@KimHyeonGyeom
Copy link
Author

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

개인적인 메모:

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

20 is plenty!

@Benjamin-Loison
Copy link
Owner

Benjamin-Loison commented Sep 16, 2024

Personal notes:

When just pass 굿파트너 to q, it does not seem to return shorts.

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"
b'\352\265\277\355\214\214\355\212\270\353\204\210'.decode('utf-8')
'굿파트너'

Source: the Stack Overflow answer 20210262

$browseShorts = (new \Sub0BrowseShorts())
    ->setTwo($_GET['q']);
$continuation = base64_encode($browseShorts->serializeToString());
die($continuation);
echo 'Egzqtb/tjIztirjrhIg=' | base64 -d
굿파트너
echo 'Egzqtb/tjIztirjrhIg=' | base64 -d | protoc --decode_raw
2: "\352\265\277\355\214\214\355\212\270\353\204\210"
Python script focusing on Korean:
import requests
import json
import base64
import blackboxprotobuf

def getBase64Protobuf(message, typedef):
    data = blackboxprotobuf.encode_message(message, typedef)
    return base64.b64encode(data).decode('ascii')

URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
    'Content-Type': 'application/json',
    #'User-Agent': 'curl/8.5.0',
}

message = {
    "2": {
        "2": "\uad7f\ud30c\ud2b8\ub108",
        "3": "Ep8NkgGbDTqVARKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSk4AWAaSoAMCi4KDOq1v-2MjO2KuOuEiOoBDwoNWgsKBwiGARIAGAsYYfIBBQoDQWxs2AIBuANhCrUB6gEPCg1aCwoHCIYBEgAYCxga8gEICgZTaG9ydHPCAo4BKGEgeW91dHViZV9zaG9ydHNfZWxpZ2libGUgOnR5cGU6ciAobiB5b3V0dWJlX2ZsYWdfaGFzX3ByZW1pZXJlX3ZpZGVvX21ldGFkYXRhPTEgOnR5cGU6cikgKG4geW91dHViZV9mbGFnX2hhc19saXZlX3N0cmVhbV9tZXRhZGF0YT0xIDp0eXBlOnIpKfgCAbgDGgpM6gEPCg1aCwoHCIYBEgAYCxhI8gEICgZWaWRlb3PCAhp5b3V0dWJlX3ZpZGVvX3BhZ2UgOnR5cGU6cugCAagDAbgDSMADAcgDAdADAQoo6gEPCg1aCwoHCIYBEgAYCxgc8gELCglVbndhdGNoZWTKAgIIAbgDHAom6gEPCg1aCwoHCIYBEgAYCxhK8gEJCgdXYXRjaGVkygICGAK4A0oKLWAH6gEPCg1aCwoHCIYBEgAYCxgH8gETChFSZWNlbnRseSB1cGxvYWRlZLgDBwpL6gEPCg1aCwoHCIYBEgAYCxgE8gEGCgRMaXZlwgIneW91dHViZV9saXZlX2Jyb2FkY2FzdF9zdGF0dXM9MCA6dHlwZTpy6AIBuAMECjgKE-q1v-2MjO2KuOuEiCDrpqzrt7DqARUKE1oRCgcIhgESABgLEgbrpqzrt7DyAQgKBuumrOu3sApBChbqtb_tjIztirjrhIgg7KCV7Jqw7KeE6gEYChZaFAoHCIYBEgAYCxIJ7KCV7Jqw7KeE8gELCgnsoJXsmrDsp4QKWwoe6rW_7YyM7Yq464SIMTLtmowg64uk7Iuc67O06riw6gEhCh9aHQoHCIYBEgAYCxISMTLtmoxf64uk7Iuc67O06riw8gEUChIxMu2ajCDri6Tsi5zrs7TquLAKQQoW6rW_7YyM7Yq464SIIOqzveyLnOyWkeoBGAoWWhQKBwiGARIAGAsSCeqzveyLnOyWkfIBCwoJ6rO97Iuc7JaRCiwKD-q1v-2MjO2KuOuEiCAxMeoBEQoPWg0KBwiGARIAGAsSAjEx8gEECgIxMQosCg_qtb_tjIztirjrhIggMTDqAREKD1oNCgcIhgESABgLEgIxMPIBBAoCMTAKKwoO6rW_7YyM7Yq464SIMTPqAREKD1oNCgcIhgESABgLEgIxM_IBBAoCMTMKNQoS6rW_7YyM7Yq464SIIDEz7ZmU6gEUChJaEAoHCIYBEgAYCxIFMTPtmZTyAQcKBTEz7ZmUCjgKE-q1v-2MjO2KuOuEiCDsmpTslb3qARUKE1oRCgcIhgESABgLEgbsmpTslb3yAQgKBuyalOyVvQo9ChTqtb_tjIztirjrhIgxNOyYiOqzoOoBFwoVWhMKBwiGARIAGAsSCDE07JiI6rOg8gEKCggxNOyYiOqzoApBChbqtb_tjIztirjrhIgg7ISg6rO16rCc6gEYChZaFAoHCIYBEgAYCxIJ7ISg6rO16rCc8gELCgnshKDqs7XqsJwKSgoZ6rW_7YyM7Yq464SIIDEy7ZmUIOyYiOqzoOoBGwoZWhcKBwiGARIAGAsSDDEy7ZmUX-yYiOqzoPIBDgoMMTLtmZQg7JiI6rOgCnvqAQ8KDVoLCgcIhgESABgLGEzyAQ0KC1VuZGVyIDQgbWluwgJTKGEgeW91dHViZV9zaG9ydF92aWRlbyA6dHlwZTpyIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSm4A0wKQ-oBDwoNWgsKBwiGARIAGAsYTfIBDAoKNCAtIDIwIG1pbsICHHlvdXR1YmVfbWVkaXVtX3ZpZGVvIDp0eXBlOnK4A00KQuoBDwoNWgsKBwiGARIAGAsYTvIBDQoLT3ZlciAyMCBtaW7CAhp5b3V0dWJlX2xvbmdfdmlkZW8gOnR5cGU6crgDThgLWg0KCwgEKgcIhgESABgLeAA%3D",
        "18": 1
    },
    "3": 52047873,
    "4": "search-page"
}

typedef = {
    "2": {
        "field_order": [
            "2",
            "3",
            "18"
        ],
        "message_typedef": {
            "2": {
                "type": "string"
            },
            "3": {
                "type": "string"
            },
            "18": {
                "type": "int"
            }
        },
        "type": "message"
    },
    "3": {
        "type": "int"
    },
    "4": {
        "type": "string"
    }
}

continuation = getBase64Protobuf(message, typedef)

DATA = {
    'context': {
        'client': {
            'clientName': 'WEB',
            'clientVersion': '2.20240913.01.00',
        }
    },
    'continuation': continuation#"EvIREgzqtb_tjIztirjrhIga3hFFcDhOa2dHYkRUcVZBUktPQVNoaElIbHZkWFIxWW1WZmMyaHZjblJ6WDJWc2FXZHBZbXhsSURwMGVYQmxPbklnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5d2NtVnRhV1Z5WlY5MmFXUmxiMTl0WlhSaFpHRjBZVDB4SURwMGVYQmxPbklwSUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU2s0QVdBYVNvQU1DaTRLRE9xMXYtMk1qTzJLdU91RWlPb0JEd29OV2dzS0J3aUdBUklBR0FzWVlmSUJCUW9EUVd4czJBSUJ1QU5oQ3JVQjZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYThnRUlDZ1pUYUc5eWRIUENBbzRCS0dFZ2VXOTFkSFZpWlY5emFHOXlkSE5mWld4cFoybGliR1VnT25SNWNHVTZjaUFvYmlCNWIzVjBkV0psWDJac1lXZGZhR0Z6WDNCeVpXMXBaWEpsWDNacFpHVnZYMjFsZEdGa1lYUmhQVEVnT25SNWNHVTZjaWtnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5c2FYWmxYM04wY21WaGJWOXRaWFJoWkdGMFlUMHhJRHAwZVhCbE9uSXBLZmdDQWJnREdncE02Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4aEk4Z0VJQ2daV2FXUmxiM1BDQWhwNWIzVjBkV0psWDNacFpHVnZYM0JoWjJVZ09uUjVjR1U2Y3VnQ0FhZ0RBYmdEU01BREFjZ0RBZEFEQVFvbzZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYzhnRUxDZ2xWYm5kaGRHTm9aV1RLQWdJSUFiZ0RIQW9tNmdFUENnMWFDd29IQ0lZQkVnQVlDeGhLOGdFSkNnZFhZWFJqYUdWa3lnSUNHQUs0QTBvS0xXQUg2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0g4Z0VUQ2hGU1pXTmxiblJzZVNCMWNHeHZZV1JsWkxnREJ3cEw2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0U4Z0VHQ2dSTWFYWmx3Z0luZVc5MWRIVmlaVjlzYVhabFgySnliMkZrWTJGemRGOXpkR0YwZFhNOU1DQTZkSGx3WlRweTZBSUJ1QU1FQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RycHF6cnQ3RHFBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnJwcXpydDdEeUFRZ0tCdXVtck91M3NBcEJDaGJxdGJfdGpJenRpcmpyaElnZzdLQ1Y3SnF3N0tlRTZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdLQ1Y3SnF3N0tlRThnRUxDZ25zb0pYc21yRHNwNFFLV3dvZTZyV183WXlNN1lxNDY0U0lNVEx0bW93ZzY0dWs3SXVjNjdPMDZyaXc2Z0VoQ2g5YUhRb0hDSVlCRWdBWUN4SVNNVEx0bW94ZjY0dWs3SXVjNjdPMDZyaXc4Z0VVQ2hJeE11MmFqQ0RyaTZUc2k1enJzN1RxdUxBS1FRb1c2cldfN1l5TTdZcTQ2NFNJSU9xenZleUxuT3lXa2VvQkdBb1dXaFFLQndpR0FSSUFHQXNTQ2VxenZleUxuT3lXa2ZJQkN3b0o2ck85N0l1YzdKYVJDaXdLRC1xMXYtMk1qTzJLdU91RWlDQXhNZW9CRVFvUFdnMEtCd2lHQVJJQUdBc1NBakV4OGdFRUNnSXhNUW9zQ2dfcXRiX3RqSXp0aXJqcmhJZ2dNVERxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TVBJQkJBb0NNVEFLS3dvTzZyV183WXlNN1lxNDY0U0lNVFBxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TV9JQkJBb0NNVE1LTlFvUzZyV183WXlNN1lxNDY0U0lJREV6N1ptVTZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRk1UUHRtWlR5QVFjS0JURXo3Wm1VQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RzbXBUc2xiM3FBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnNtcFRzbGIzeUFRZ0tCdXlhbE95VnZRbzlDaFRxdGJfdGpJenRpcmpyaElneE5PeVlpT3F6b09vQkZ3b1ZXaE1LQndpR0FSSUFHQXNTQ0RFMDdKaUk2ck9nOGdFS0NnZ3hOT3lZaU9xem9BcEJDaGJxdGJfdGpJenRpcmpyaElnZzdJU2c2ck8xNnJDYzZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdJU2c2ck8xNnJDYzhnRUxDZ25zaEtEcXM3WHFzSndLU2dvWjZyV183WXlNN1lxNDY0U0lJREV5N1ptVUlPeVlpT3F6b09vQkd3b1pXaGNLQndpR0FSSUFHQXNTRERFeTdabVVYLXlZaU9xem9QSUJEZ29NTVRMdG1aUWc3SmlJNnJPZ0NudnFBUThLRFZvTENnY0loZ0VTQUJnTEdFenlBUTBLQzFWdVpHVnlJRFFnYldsdXdnSlRLR0VnZVc5MWRIVmlaVjl6YUc5eWRGOTJhV1JsYnlBNmRIbHdaVHB5SUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU200QTB3S1Etb0JEd29OV2dzS0J3aUdBUklBR0FzWVRmSUJEQW9LTkNBdElESXdJRzFwYnNJQ0hIbHZkWFIxWW1WZmJXVmthWFZ0WDNacFpHVnZJRHAwZVhCbE9uSzRBMDBLUXVvQkR3b05XZ3NLQndpR0FSSUFHQXNZVHZJQkRRb0xUM1psY2lBeU1DQnRhVzdDQWhwNWIzVjBkV0psWDJ4dmJtZGZkbWxrWlc4Z09uUjVjR1U2Y3JnRFRoZ0xXZzBLQ3dnRUtnY0loZ0VTQUJnTGVBQSUzRJABARiB4OgYIgtzZWFyY2gtcGFnZQ==",
}

PARAMS = {
    'prettyPrint': 'false',
}

##

response = requests.post(URL, params = PARAMS, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)

def isDataOnlyContainingShorts(data):
    verificationParams = {
        'part': 'short',
    }

    try:
        videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
        for video in videos:
            #print(json.dumps(video, indent = 4))
            #try:
            videoId = video['videoRenderer']['videoId']
            # *No results found*
            #except KeyError:
            #    return False
            #print(videoId)
            verificationUrl = 'http://localhost/YouTube-operational-API/videos'
            verificationParams['id'] = videoId
            if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
                return False
    except:
        return False
    return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data) and 'SBS Drama' in dataStr)

https://www.php.net/manual/en/function.base64-encode.php#103849

More simplified Python script Korean compatible:
import requests
import json
import base64
import blackboxprotobuf

def getBase64Protobuf(message, typedef):
    data = blackboxprotobuf.encode_message(message, typedef)
    return base64.b64encode(data, altchars = b'-_').decode('ascii')

URL = 'https://www.youtube.com/youtubei/v1/search'
HEADERS = {
    'Content-Type': 'application/json',
    #'User-Agent': 'curl/8.5.0',
}

message = {
    '2': {
        '18': {
            '7': {
                '12': 26
            },
            '9': {
            }
        }
    },
}

typedef = {
    '2': {
        'field_order': [
            '18'
        ],
        'message_typedef': {
            '18': {
                'field_order': [
                    '7',
                    '9'
                ],
                'message_typedef': {
                    '7': {
                        'field_order': [
                            '12'
                        ],
                        'message_typedef': {
                            '12': {
                                'type': 'int'
                            }
                        },
                        'type': 'message'
                    },
                    '9': {
                        'message_typedef': {},
                        'type': 'message'
                    }
                },
                'type': 'message'
            }
        },
        'type': 'message'
    },
    '15': {
        'type': 'int'
    }
}

three = getBase64Protobuf(message, typedef)

message = {
    "2": {
        "2": "\uad7f\ud30c\ud2b8\ub108",
        "3": three#"Ep8NkgGbDTqVARKOAShhIHlvdXR1YmVfc2hvcnRzX2VsaWdpYmxlIDp0eXBlOnIgKG4geW91dHViZV9mbGFnX2hhc19wcmVtaWVyZV92aWRlb19tZXRhZGF0YT0xIDp0eXBlOnIpIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSk4AWAaSoAMCi4KDOq1v-2MjO2KuOuEiOoBDwoNWgsKBwiGARIAGAsYYfIBBQoDQWxs2AIBuANhCrUB6gEPCg1aCwoHCIYBEgAYCxga8gEICgZTaG9ydHPCAo4BKGEgeW91dHViZV9zaG9ydHNfZWxpZ2libGUgOnR5cGU6ciAobiB5b3V0dWJlX2ZsYWdfaGFzX3ByZW1pZXJlX3ZpZGVvX21ldGFkYXRhPTEgOnR5cGU6cikgKG4geW91dHViZV9mbGFnX2hhc19saXZlX3N0cmVhbV9tZXRhZGF0YT0xIDp0eXBlOnIpKfgCAbgDGgpM6gEPCg1aCwoHCIYBEgAYCxhI8gEICgZWaWRlb3PCAhp5b3V0dWJlX3ZpZGVvX3BhZ2UgOnR5cGU6cugCAagDAbgDSMADAcgDAdADAQoo6gEPCg1aCwoHCIYBEgAYCxgc8gELCglVbndhdGNoZWTKAgIIAbgDHAom6gEPCg1aCwoHCIYBEgAYCxhK8gEJCgdXYXRjaGVkygICGAK4A0oKLWAH6gEPCg1aCwoHCIYBEgAYCxgH8gETChFSZWNlbnRseSB1cGxvYWRlZLgDBwpL6gEPCg1aCwoHCIYBEgAYCxgE8gEGCgRMaXZlwgIneW91dHViZV9saXZlX2Jyb2FkY2FzdF9zdGF0dXM9MCA6dHlwZTpy6AIBuAMECjgKE-q1v-2MjO2KuOuEiCDrpqzrt7DqARUKE1oRCgcIhgESABgLEgbrpqzrt7DyAQgKBuumrOu3sApBChbqtb_tjIztirjrhIgg7KCV7Jqw7KeE6gEYChZaFAoHCIYBEgAYCxIJ7KCV7Jqw7KeE8gELCgnsoJXsmrDsp4QKWwoe6rW_7YyM7Yq464SIMTLtmowg64uk7Iuc67O06riw6gEhCh9aHQoHCIYBEgAYCxISMTLtmoxf64uk7Iuc67O06riw8gEUChIxMu2ajCDri6Tsi5zrs7TquLAKQQoW6rW_7YyM7Yq464SIIOqzveyLnOyWkeoBGAoWWhQKBwiGARIAGAsSCeqzveyLnOyWkfIBCwoJ6rO97Iuc7JaRCiwKD-q1v-2MjO2KuOuEiCAxMeoBEQoPWg0KBwiGARIAGAsSAjEx8gEECgIxMQosCg_qtb_tjIztirjrhIggMTDqAREKD1oNCgcIhgESABgLEgIxMPIBBAoCMTAKKwoO6rW_7YyM7Yq464SIMTPqAREKD1oNCgcIhgESABgLEgIxM_IBBAoCMTMKNQoS6rW_7YyM7Yq464SIIDEz7ZmU6gEUChJaEAoHCIYBEgAYCxIFMTPtmZTyAQcKBTEz7ZmUCjgKE-q1v-2MjO2KuOuEiCDsmpTslb3qARUKE1oRCgcIhgESABgLEgbsmpTslb3yAQgKBuyalOyVvQo9ChTqtb_tjIztirjrhIgxNOyYiOqzoOoBFwoVWhMKBwiGARIAGAsSCDE07JiI6rOg8gEKCggxNOyYiOqzoApBChbqtb_tjIztirjrhIgg7ISg6rO16rCc6gEYChZaFAoHCIYBEgAYCxIJ7ISg6rO16rCc8gELCgnshKDqs7XqsJwKSgoZ6rW_7YyM7Yq464SIIDEy7ZmUIOyYiOqzoOoBGwoZWhcKBwiGARIAGAsSDDEy7ZmUX-yYiOqzoPIBDgoMMTLtmZQg7JiI6rOgCnvqAQ8KDVoLCgcIhgESABgLGEzyAQ0KC1VuZGVyIDQgbWluwgJTKGEgeW91dHViZV9zaG9ydF92aWRlbyA6dHlwZTpyIChuIHlvdXR1YmVfZmxhZ19oYXNfbGl2ZV9zdHJlYW1fbWV0YWRhdGE9MSA6dHlwZTpyKSm4A0wKQ-oBDwoNWgsKBwiGARIAGAsYTfIBDAoKNCAtIDIwIG1pbsICHHlvdXR1YmVfbWVkaXVtX3ZpZGVvIDp0eXBlOnK4A00KQuoBDwoNWgsKBwiGARIAGAsYTvIBDQoLT3ZlciAyMCBtaW7CAhp5b3V0dWJlX2xvbmdfdmlkZW8gOnR5cGU6crgDThgLWg0KCwgEKgcIhgESABgLeAA=",
    },
    "3": 52047873,
    "4": "search-page"
}

typedef = {
    "2": {
        "field_order": [
            "2",
            "3",
            "18"
        ],
        "message_typedef": {
            "2": {
                "type": "string"
            },
            "3": {
                "type": "string"
            },
            "18": {
                "type": "int"
            }
        },
        "type": "message"
    },
    "3": {
        "type": "int"
    },
    "4": {
        "type": "string"
    }
}

continuation = getBase64Protobuf(message, typedef)

DATA = {
    'context': {
        'client': {
            'clientName': 'WEB',
            'clientVersion': '2.20240913.01.00',
        }
    },
    'continuation': continuation#"EvIREgzqtb_tjIztirjrhIga3hFFcDhOa2dHYkRUcVZBUktPQVNoaElIbHZkWFIxWW1WZmMyaHZjblJ6WDJWc2FXZHBZbXhsSURwMGVYQmxPbklnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5d2NtVnRhV1Z5WlY5MmFXUmxiMTl0WlhSaFpHRjBZVDB4SURwMGVYQmxPbklwSUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU2s0QVdBYVNvQU1DaTRLRE9xMXYtMk1qTzJLdU91RWlPb0JEd29OV2dzS0J3aUdBUklBR0FzWVlmSUJCUW9EUVd4czJBSUJ1QU5oQ3JVQjZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYThnRUlDZ1pUYUc5eWRIUENBbzRCS0dFZ2VXOTFkSFZpWlY5emFHOXlkSE5mWld4cFoybGliR1VnT25SNWNHVTZjaUFvYmlCNWIzVjBkV0psWDJac1lXZGZhR0Z6WDNCeVpXMXBaWEpsWDNacFpHVnZYMjFsZEdGa1lYUmhQVEVnT25SNWNHVTZjaWtnS0c0Z2VXOTFkSFZpWlY5bWJHRm5YMmhoYzE5c2FYWmxYM04wY21WaGJWOXRaWFJoWkdGMFlUMHhJRHAwZVhCbE9uSXBLZmdDQWJnREdncE02Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4aEk4Z0VJQ2daV2FXUmxiM1BDQWhwNWIzVjBkV0psWDNacFpHVnZYM0JoWjJVZ09uUjVjR1U2Y3VnQ0FhZ0RBYmdEU01BREFjZ0RBZEFEQVFvbzZnRVBDZzFhQ3dvSENJWUJFZ0FZQ3hnYzhnRUxDZ2xWYm5kaGRHTm9aV1RLQWdJSUFiZ0RIQW9tNmdFUENnMWFDd29IQ0lZQkVnQVlDeGhLOGdFSkNnZFhZWFJqYUdWa3lnSUNHQUs0QTBvS0xXQUg2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0g4Z0VUQ2hGU1pXTmxiblJzZVNCMWNHeHZZV1JsWkxnREJ3cEw2Z0VQQ2cxYUN3b0hDSVlCRWdBWUN4Z0U4Z0VHQ2dSTWFYWmx3Z0luZVc5MWRIVmlaVjlzYVhabFgySnliMkZrWTJGemRGOXpkR0YwZFhNOU1DQTZkSGx3WlRweTZBSUJ1QU1FQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RycHF6cnQ3RHFBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnJwcXpydDdEeUFRZ0tCdXVtck91M3NBcEJDaGJxdGJfdGpJenRpcmpyaElnZzdLQ1Y3SnF3N0tlRTZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdLQ1Y3SnF3N0tlRThnRUxDZ25zb0pYc21yRHNwNFFLV3dvZTZyV183WXlNN1lxNDY0U0lNVEx0bW93ZzY0dWs3SXVjNjdPMDZyaXc2Z0VoQ2g5YUhRb0hDSVlCRWdBWUN4SVNNVEx0bW94ZjY0dWs3SXVjNjdPMDZyaXc4Z0VVQ2hJeE11MmFqQ0RyaTZUc2k1enJzN1RxdUxBS1FRb1c2cldfN1l5TTdZcTQ2NFNJSU9xenZleUxuT3lXa2VvQkdBb1dXaFFLQndpR0FSSUFHQXNTQ2VxenZleUxuT3lXa2ZJQkN3b0o2ck85N0l1YzdKYVJDaXdLRC1xMXYtMk1qTzJLdU91RWlDQXhNZW9CRVFvUFdnMEtCd2lHQVJJQUdBc1NBakV4OGdFRUNnSXhNUW9zQ2dfcXRiX3RqSXp0aXJqcmhJZ2dNVERxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TVBJQkJBb0NNVEFLS3dvTzZyV183WXlNN1lxNDY0U0lNVFBxQVJFS0Qxb05DZ2NJaGdFU0FCZ0xFZ0l4TV9JQkJBb0NNVE1LTlFvUzZyV183WXlNN1lxNDY0U0lJREV6N1ptVTZnRVVDaEphRUFvSENJWUJFZ0FZQ3hJRk1UUHRtWlR5QVFjS0JURXo3Wm1VQ2pnS0UtcTF2LTJNak8yS3VPdUVpQ0RzbXBUc2xiM3FBUlVLRTFvUkNnY0loZ0VTQUJnTEVnYnNtcFRzbGIzeUFRZ0tCdXlhbE95VnZRbzlDaFRxdGJfdGpJenRpcmpyaElneE5PeVlpT3F6b09vQkZ3b1ZXaE1LQndpR0FSSUFHQXNTQ0RFMDdKaUk2ck9nOGdFS0NnZ3hOT3lZaU9xem9BcEJDaGJxdGJfdGpJenRpcmpyaElnZzdJU2c2ck8xNnJDYzZnRVlDaFphRkFvSENJWUJFZ0FZQ3hJSjdJU2c2ck8xNnJDYzhnRUxDZ25zaEtEcXM3WHFzSndLU2dvWjZyV183WXlNN1lxNDY0U0lJREV5N1ptVUlPeVlpT3F6b09vQkd3b1pXaGNLQndpR0FSSUFHQXNTRERFeTdabVVYLXlZaU9xem9QSUJEZ29NTVRMdG1aUWc3SmlJNnJPZ0NudnFBUThLRFZvTENnY0loZ0VTQUJnTEdFenlBUTBLQzFWdVpHVnlJRFFnYldsdXdnSlRLR0VnZVc5MWRIVmlaVjl6YUc5eWRGOTJhV1JsYnlBNmRIbHdaVHB5SUNodUlIbHZkWFIxWW1WZlpteGhaMTlvWVhOZmJHbDJaVjl6ZEhKbFlXMWZiV1YwWVdSaGRHRTlNU0E2ZEhsd1pUcHlLU200QTB3S1Etb0JEd29OV2dzS0J3aUdBUklBR0FzWVRmSUJEQW9LTkNBdElESXdJRzFwYnNJQ0hIbHZkWFIxWW1WZmJXVmthWFZ0WDNacFpHVnZJRHAwZVhCbE9uSzRBMDBLUXVvQkR3b05XZ3NLQndpR0FSSUFHQXNZVHZJQkRRb0xUM1psY2lBeU1DQnRhVzdDQWhwNWIzVjBkV0psWDJ4dmJtZGZkbWxrWlc4Z09uUjVjR1U2Y3JnRFRoZ0xXZzBLQ3dnRUtnY0loZ0VTQUJnTGVBQSUzRJABARiB4OgYIgtzZWFyY2gtcGFnZQ==",
}

PARAMS = {
    'prettyPrint': 'false',
}

##

response = requests.post(URL, params = PARAMS, headers = HEADERS, json = DATA)
#print(response.text)
data = response.json()
dataStr = json.dumps(data, indent = 4)

def isDataOnlyContainingShorts(data):
    verificationParams = {
        'part': 'short',
    }

    try:
        videos = data['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents']
        for video in videos:
            #print(json.dumps(video, indent = 4))
            #try:
            videoId = video['videoRenderer']['videoId']
            # *No results found*
            #except KeyError:
            #    return False
            #print(videoId)
            verificationUrl = 'http://localhost/YouTube-operational-API/videos'
            verificationParams['id'] = videoId
            if not requests.get(verificationUrl, verificationParams).json()['items'][0]['short']['available']:
                return False
    except:
        return False
    return True
#print(dataStr)
#print('"continuationItems":[{"twoColumnSearchResultsRenderer":{"primaryContents":{"sectionListRenderer":{"contents":[{"itemSectionRenderer":{"contents":[{"videoRenderer":{"videoId":"MzUN2J3e1o0"' in response.text)
print(isDataOnlyContainingShorts(data) and 'SBS Drama' in dataStr)
Diff with debugging:
diff --git a/search.php b/search.php
index 25210bd..cb57988 100644
--- a/search.php
+++ b/search.php
@@ -13,6 +13,16 @@
 
 include_once 'common.php';
 
+includeOnceProtos([
+    'BrowseShorts',
+    'Sub0BrowseShorts',
+    'Sub1BrowseShorts',
+    'Sub2BrowseShorts',
+    'Sub3BrowseShorts',
+    'Sub4_7BrowseShorts',
+    'Sub4_9BrowseShorts',
+]);
+
 $realOptions = [
     'id',
     'snippet',
@@ -112,14 +122,40 @@ function getAPI($id, $order, $continuationToken)
                     'clientVersion' => MUSIC_VERSION
                 ]
             ],
-            'query' => str_replace('"', '\"', $_GET['q'])
         ];
+        if(isset($_GET['type']) && $_GET['type'] === 'short') {
+            /*$browseShorts = (new \Sub0BrowseShorts())
+                    ->setTwo($_GET['q']);
+            $continuation = base64_encode($browseShorts->serializeToString());
+            die($continuation);*/
+            $sub1BrowseShorts = (new \Sub1BrowseShorts())
+                        ->setTwo((new \Sub2BrowseShorts())
+                            ->setEighteen((new \Sub3BrowseShorts())
+                                ->setSeven((new \Sub4_7BrowseShorts())
+                                    ->setTwelve(26))
+                                    ->setNine(new \Sub4_9BrowseShorts())));
+            //die(base64_encode($sub1BrowseShorts->serializeToString()));
+            $browseShorts = (new \BrowseShorts())
+                ->setTwo((new \Sub0BrowseShorts())
+                    ->setTwo($_GET['q'])
+                    ->setThree(base64_encode($sub1BrowseShorts->serializeToString())))
+                ->setThree(52047873)
+                ->setFour('search-page');
+            //$browseShorts = (new \Sub0BrowseShorts())
+            //        ->setTwo($_GET['q']);
+
+            $continuation = base64url_encode($browseShorts->serializeToString());
+            //die($continuation);
+            $rawData['continuation'] = $continuation;
+        } else {
+            $rawData['query'] = str_replace('"', '\"', $_GET['q']);
+            if($typeBase64 !== '') {
+                $rawData['params'] = $typeBase64;
+            }
+        }
         if($continuationTokenProvided) {
             $rawData['continuation'] = $continuationToken;
         }
-        if($typeBase64 !== '') {
-            $rawData['params'] = $typeBase64;
-        }
         $opts = [
                'http' => [
                    'method' => 'POST',
@@ -128,17 +164,10 @@ function getAPI($id, $order, $continuationToken)
                ]
         ];
         $json = getJSON('https://www.youtube.com/youtubei/v1/search?key=' . UI_KEY, $opts);
+        //die(json_encode($json));
         if(isset($_GET['type']) && $_GET['type'] === 'short')
         {
-            $contents = $json['contents']['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents'];
-            foreach($contents as $content)
-            {
-                if(array_key_exists('reelShelfRenderer', $content))
-                {
-                    $items = $content['reelShelfRenderer']['items'];
-                    break;
-                }
-            }
+            $items = $json['onResponseReceivedCommands'][0]['reloadContinuationItemsCommand']['continuationItems'][0]['twoColumnSearchResultsRenderer']['primaryContents']['sectionListRenderer']['contents'][0]['itemSectionRenderer']['contents'];
         }
         else
         {
@@ -178,13 +207,13 @@ function getAPI($id, $order, $continuationToken)
     for ($itemsIndex = 0; $itemsIndex < $itemsCount - ($continuationTokenProvided || $_GET['hashtag'] ? 1 : 0); $itemsIndex++) { // check upper bound for hashtags
         $item = $items[$itemsIndex];
         $path = '';
-        $isShort = isset($_GET['type']) && $_GET['type'] === 'short';
+        //die(json_encode($item));
         if (isset($_GET['hashtag'])) {
             $path = 'richItemRenderer/content/videoRenderer';
         } elseif (isset($_GET['q'])) {
-            $path = $isShort ? 'reelItemRenderer' : 'videoRenderer';
+            $path = 'videoRenderer';
             // Skip `People also watched`.
-            if(!$isShort && !array_key_exists($path, $item)) {
+            if(!array_key_exists($path, $item)) {
                 continue;
             }
         } else {
@@ -203,11 +232,11 @@ function getAPI($id, $order, $continuationToken)
             ];
         }
         if ($options['snippet']) {
-            $title = $isShort ? $gridVideoRenderer['headline']['simpleText'] : $gridVideoRenderer['title']['runs'][0]['text'];
+            $title = $gridVideoRenderer['title']['runs'][0]['text'];
             $run = $gridVideoRenderer['ownerText']['runs'][0];
             $browseEndpoint = $run['navigationEndpoint']['browseEndpoint'];
             $channelId = $browseEndpoint['browseId'];
-            $views = call_user_func($isShort ? 'getIntValue' : 'getIntFromViewCount', $gridVideoRenderer['viewCountText']['simpleText'], 'view');
+            $views = getIntFromViewCount($gridVideoRenderer['viewCountText']['simpleText']);
             $badges = $gridVideoRenderer['badges'];
             $badges = !empty($badges) ? array_map(fn($badge) => $badge['metadataBadgeRenderer']['label'], $badges) : [];
             $chapters = $gridVideoRenderer['expandableMetadata']['expandableMetadataRenderer']['expandedContent']['horizontalCardListRenderer']['cards'];
@@ -226,7 +255,7 @@ function getAPI($id, $order, $continuationToken)
                 'channelTitle' => $run['text'],
                 'channelHandle' => $channelHandle[0] === '@' ? $channelHandle : null,
                 'timestamp' => $gridVideoRenderer['publishedTimeText']['simpleText'],
-                'duration' => $isShort ? getIntValue(end(explode('- ', str_replace(' - play video', '', $gridVideoRenderer['accessibility']['accessibilityData']['label']))), 'second') : getIntFromDuration($gridVideoRenderer['lengthText']['simpleText']),
+                'duration' => getIntFromDuration($gridVideoRenderer['lengthText']['simpleText']),
                 'views' => $views,
                 'badges' => $badges,
                 'channelApproval' => $gridVideoRenderer['ownerBadges'][0]['metadataBadgeRenderer']['tooltip'],

@Benjamin-Loison
Copy link
Owner

Benjamin-Loison commented Sep 16, 2024

Fix deployed, let me know if you have issues.

Thanks for having reported this issue.

@Benjamin-Loison
Copy link
Owner

Benjamin-Loison commented Sep 16, 2024

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
Copy link
Author

@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
Copy link
Owner

@Benjamin-Loison
Copy link
Owner

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
Copy link
Author

Let me try again

@KimHyeonGyeom
Copy link
Author

“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
Copy link
Owner

@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
Copy link
Author

@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
Copy link
Owner

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
Copy link
Owner

Benjamin-Loison commented Sep 19, 2024

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

$videosTests = [
['part=id&clipId=UgkxU2HSeGL_NvmDJ-nQJrlLwllwMDBdGZFs', 'items/0/videoId', 'NiXD4xVJM5Y'],
['part=clip&clipId=UgkxU2HSeGL_NvmDJ-nQJrlLwllwMDBdGZFs', 'items/0/clip', json_decode(file_get_contents('tests/part=clip&clipId=UgkxU2HSeGL_NvmDJ-nQJrlLwllwMDBdGZFs.json'), true)],
['part=contentDetails&id=g5xNzUA5Qf8', 'items/0/contentDetails/duration', 213],
['part=status&id=J8ZVxDK11Jo', 'items/0/status/embeddable', false],
['part=status&id=g5xNzUA5Qf8', 'items/0/status/embeddable', true], // could allow subarray for JSON check in response that way in a single request can check several features
['part=short&id=NiXD4xVJM5Y', 'items/0/short/available', false],
['part=short&id=ydPkyvWtmg4', 'items/0/short/available', true],
['part=musics&id=DUT5rEU6pqM', 'items/0/musics/0', json_decode(file_get_contents('tests/part=musics&id=DUT5rEU6pqM.json'), true)],
['part=musics&id=4sC3mbkP_x8', 'items/0/musics', json_decode(file_get_contents('tests/part=musics&id=4sC3mbkP_x8.json'), true)],
['part=music&id=FliCdfxdtTI', 'items/0/music/available', false],
['part=music&id=ntG3GQdY_Ok', 'items/0/music/available', true],
['part=isPaidPromotion&id=Q6gtj1ynstU', 'items/0/isPaidPromotion', false],
['part=isPaidPromotion&id=PEorJqo2Qaw', 'items/0/isPaidPromotion', true],
['part=isMemberOnly&id=Q6gtj1ynstU', 'items/0/isMemberOnly', false],
['part=isMemberOnly&id=Ln9yZDtfcWg', 'items/0/isMemberOnly', true],
['part=qualities&id=IkXH9H2ofa0', 'items/0/qualities', json_decode(file_get_contents('tests/part=qualities&id=IkXH9H2ofa0.json'), true)],
['part=chapters&id=n8vmXvoVjZw', 'items/0/chapters', json_decode(file_get_contents('tests/part=chapters&id=n8vmXvoVjZw.json'), true)],
['part=isOriginal&id=FliCdfxdtTI', 'items/0/isOriginal', false],
['part=isOriginal&id=iqKdEhx-dD4', 'items/0/isOriginal', true],
['part=isPremium&id=FliCdfxdtTI', 'items/0/isPremium', false],
['part=isPremium&id=dNJMI92NZJ0', 'items/0/isPremium', true],
['part=isRestricted&id=IkXH9H2ofa0', 'items/0/isRestricted', false],
['part=isRestricted&id=ORdWE_ffirg', 'items/0/isRestricted', true],
['part=snippet&id=IkXH9H2ofa0', 'items/0/snippet', json_decode(file_get_contents('tests/part=snippet&id=IkXH9H2ofa0.json'), true)],
['part=activity&id=V6z0qF54RZ4', 'items/0/activity', json_decode(file_get_contents('tests/part=activity&id=V6z0qF54RZ4.json'), true)],
['part=mostReplayed&id=XiCrniLQGYc', 'items/0/mostReplayed/markers/0/intensityScoreNormalized', 1],
['part=explicitLyrics&id=Ehoe35hTbuY', 'items/0/explicitLyrics', false],
['part=explicitLyrics&id=PvM79DJ2PmM', 'items/0/explicitLyrics', true],
];

Related to #23.

@KimHyeonGyeom
Copy link
Author

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

@Benjamin-Loison
Copy link
Owner

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

@KimHyeonGyeom
Copy link
Author

KimHyeonGyeom commented Sep 19, 2024

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>YouTube operational API</title>
        <style>
            body {
                max-width: 73%;
                margin: 5% auto;
                font-family: sans-serif;
                color: #444;
                padding: 0;
            }
            h1,
            h2,
            h3 {
                line-height: 1.2;
            }
            p {
                word-break: break-word;
            }
            @media (prefers-color-scheme: dark) {
                body {
                    color: #c9d1d9;
                    background: #0d1117;
                }
                a:link {
                    color: #58a6ff;
                }
                a:visited {
                    color: #8e96f0;
                }
            }
        </style>
    </head>
    <body>

<h1>YouTube operational API works when <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a> fails.</h1>

<h2>Current implemented features:</h2>
<p>Based on <a href="https://developers.google.com/youtube/v3/docs/channels/list">Channels: list</a>: <a href="http://localhost:8081/channels?part=status,upcomingEvents,shorts,community,channels,about,approval,playlists,snippet,membership,popular,recent,letsPlay&cId=C_ID&id=CHANNEL_ID&handle=HANDLE&forUsername=USERNAME&raw=RAW&order=viewCount(&pageToken=PAGE_TOKEN)">http://localhost:8081/channels?part=status,upcomingEvents,shorts,community,channels,about,approval,playlists,snippet,membership,popular,recent,letsPlay&cId=C_ID&id=CHANNEL_ID&handle=HANDLE&forUsername=USERNAME&raw=RAW&order=viewCount(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/commentThreads/list">CommentThreads: list</a>: <a href="http://localhost:8081/commentThreads?part=snippet,replies&id=COMMENT_ID&videoId=VIDEO_ID&order=relevance,time(&pageToken=PAGE_TOKEN)">http://localhost:8081/commentThreads?part=snippet,replies&id=COMMENT_ID&videoId=VIDEO_ID&order=relevance,time(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/playlists/list">Playlists: list</a>: <a href="http://localhost:8081/playlists?part=snippet,statistics&id=PLAYLIST_ID">http://localhost:8081/playlists?part=snippet,statistics&id=PLAYLIST_ID</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/playlistItems/list">PlaylistItems: list</a>: <a href="http://localhost:8081/playlistItems?part=snippet&playlistId=PLAYLIST_ID(&pageToken=PAGE_TOKEN)">http://localhost:8081/playlistItems?part=snippet&playlistId=PLAYLIST_ID(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/search/list">Search: list</a>: <a href="http://localhost:8081/search?part=id,snippet&q=QUERY&channelId=CHANNEL_ID&eventType=upcoming&hashtag=HASH_TAG&type=video,short&order=viewCount,relevance(&pageToken=PAGE_TOKEN)">http://localhost:8081/search?part=id,snippet&q=QUERY&channelId=CHANNEL_ID&eventType=upcoming&hashtag=HASH_TAG&type=video,short&order=viewCount,relevance(&pageToken=PAGE_TOKEN)</a></p><p>Based on <a href="https://developers.google.com/youtube/v3/docs/videos/list">Videos: list</a>: <a href="http://localhost:8081/videos?part=id,status,contentDetails,music,short,impressions,musics,isPaidPromotion,isPremium,isMemberOnly,mostReplayed,qualities,chapters,isOriginal,isRestricted,snippet,clip,activity,explicitLyrics,statistics&id=VIDEO_ID&clipId=CLIP_ID&SAPISIDHASH=YOUR_SAPISIDHASH">http://localhost:8081/videos?part=id,status,contentDetails,music,short,impressions,musics,isPaidPromotion,isPremium,isMemberOnly,mostReplayed,qualities,chapters,isOriginal,isRestricted,snippet,clip,activity,explicitLyrics,statistics&id=VIDEO_ID&clipId=CLIP_ID&SAPISIDHASH=YOUR_SAPISIDHASH</a></p><p><a href="http://localhost:8081/community?part=snippet&id=POST_ID&channelId=CHANNEL_ID&order=relevance,time">http://localhost:8081/community?part=snippet&id=POST_ID&channelId=CHANNEL_ID&order=relevance,time</a></p><p><a href="http://localhost:8081/lives?part=donations,sponsorshipGifts,memberships,poll&id=VIDEO_ID">http://localhost:8081/lives?part=donations,sponsorshipGifts,memberships,poll&id=VIDEO_ID</a></p><p><a href="http://localhost:8081/liveChats?part=snippet,participants&id=VIDEO_ID&time=TIME_MS">http://localhost:8081/liveChats?part=snippet,participants&id=VIDEO_ID&time=TIME_MS</a></p>
<h2>Make <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a> request WITHOUT ANY KEY:</h2>

<p>To make <strong>ANY <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a> request WITHOUT ANY KEY/USING YOUR QUOTA</strong>, you can use: <a href="http://localhost:8081/noKey/YOUR_REQUEST">http://localhost:8081/noKey/YOUR_REQUEST</a></p>
<p>For instance you can use: <a href="http://localhost:8081/noKey/videos?part=snippet&id=VIDEO_ID">http://localhost:8081/noKey/videos?part=snippet&id=VIDEO_ID</a> instead of <a href="https://www.googleapis.com/youtube/v3/videos?part=snippet&id=VIDEO_ID">https://www.googleapis.com/youtube/v3/videos?part=snippet&id=VIDEO_ID</a></p>
<p>I may add in the future limitation per IP etc if the quota need to be better shared among the persons using this API.</p>
<p>Currently this service is <a href='keys.php'>powered by 0 keys</a>.</p>
<script>

function share() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            alert(xhttp.responseText);
            youtubeDataAPIV3KeyInput.value = '';
        }
    };
    var youtubeDataAPIV3KeyInput = document.getElementById('youtubeDataAPIV3Key');
    const key = youtubeDataAPIV3KeyInput.value;
    xhttp.open('GET', `addKey.php?key=${key}`);
    xhttp.send();
}

</script>

Share your YouTube Data API v3 key to power the no-key service: <input type="text" id="youtubeDataAPIV3Key" placeholder="AIzaSy..." minlength="39" maxlength="39" size="39"><button type="button" onClick="share()">share</button>

<h2>Open-source:</h2>
The source code is available on GitHub: <a href="https://github.com/Benjamin-Loison/YouTube-operational-API">https://github.com/Benjamin-Loison/YouTube-operational-API</a>
<h2>Contact:</h2>
If a feature you are looking for which isn't working on <a href="https://developers.google.com/youtube/v3">YouTube Data API v3</a>, ask kindly with the below contact:<br/>
- <a href="https://yt.lemnoslife.com/matrix">Matrix</a><br/>
- <a href="https://yt.lemnoslife.com/discord">Discord</a>
<br/><br/>This instance (my instance) uses version: <a href="https://github.com/Benjamin-Loison/YouTube-operational-API/commit/0ddadb17ef58624da1b87cf0eee9592db4a5055d
">0ddadb17ef58624da1b87cf0eee9592db4a5055d
</a>
    </body>
</html>

The result is as shown above.

@Benjamin-Loison
Copy link
Owner

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
Copy link
Author

Yes, I followed the official guide exactly.

@Benjamin-Loison
Copy link
Owner

Benjamin-Loison commented Sep 19, 2024

Personal notes:

On my Linux Mint 22 Cinnamon Framework 13:

docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
docker image ls
Output:
REPOSITORY                      TAG       IMAGE ID       CREATED         SIZE
...
php                             8.2-cli   36ed67830a2e   9 months ago    529MB
...
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/
git status
Output:
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   community.php

Untracked files:
  (use "git add <file>..." 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")
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
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 <module>
    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

docker-compose -v
docker-compose version 1.29.2, build unknown
docker -v
Docker version 24.0.7, build 24.0.7-0ubuntu4.1
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:

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.
cp .env{.sample,}
docker-compose
bash: docker-compose: command not found
docker
bash: docker: command not found
apt show docker
Output:
Package: docker
Version: 1.5-2
Priority: optional
Section: x11
Maintainer: Paul Tagliamonte <[email protected]>
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.
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 <[email protected]>
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.
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) ...
docker compose up
Output:
docker: 'compose' is not a docker command.
See 'docker --help'
docker -v
Docker version 20.10.24+dfsg1, build 297e128
docker-compose
bash: docker-compose: command not found
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.
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 <module>
    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'))
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/(<Directory \/var\/www\/>\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"
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.

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
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
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
sudo docker logs -f --details youtube-operational-api
Error: No such container: youtube-operational-api
sudo docker logs -f --details 069b1d8ac8bb

Source: the Stack Overflow answer 45839387

only provides access.

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

so there is no error logs it seems.

sudo docker exec -it 069b1d8ac8bb /bin/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
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.
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.
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) ...
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

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:

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) ...
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.
apt install php-composer
Output:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package php-composer
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/

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

docker-compose up

get:

sudo docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
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
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
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
sudo docker image ls
Output:
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
php          apache    568a8e52fddf   2 weeks ago   507MB
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
</details>

`Dockerfile` > `pwd` is `/var/www/html`.

```bash
git diff
Output:
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 `<Directory /var/www/>` in `/etc/apache2/apache2.conf`.
 RUN sed -ri -e 'N;N;N;s/(<Directory \/var\/www\/>\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
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/(<Directory \/var\/www\/>\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] [--] [<packages>...]

The command '/bin/sh -c composer require google/protobuf' returned a non-zero code: 1
ERROR: Service 'api' failed to build : Build failed
git diff
Output:
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 `<Directory /var/www/>` in `/etc/apache2/apache2.conf`.
 RUN sed -ri -e 'N;N;N;s/(<Directory \/var\/www\/>\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
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/(<Directory \/var\/www\/>\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
git diff
Output:
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 `<Directory /var/www/>` in `/etc/apache2/apache2.conf`.
 RUN sed -ri -e 'N;N;N;s/(<Directory \/var\/www\/>\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
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/(<Directory \/var\/www\/>\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
diff --git a/Dockerfile b/Dockerfile
Output:
index 7b37789..a63733d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,4 +8,10 @@ COPY . /var/www/html/
 # Replace `AllowOverride None` with `AllowOverride All` in `<Directory /var/www/>` in `/etc/apache2/apache2.conf`.
 RUN sed -ri -e 'N;N;N;s/(<Directory \/var\/www\/>\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
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/(<Directory \/var\/www\/>\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"
curl 'http://localhost:8080//search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short'
Output:
{
    "kind": "youtube#searchListResponse",
    "etag": "NotImplemented",
    "items": [
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "9YgbJerHZx8"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc601\uc5c5\ub825 \uc788\ub294 \ubcc0\ud638\uc0ac? \ub450\ub465 \uc804\uc740\ud638 \ub4f1\uc7a5. #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/9YgbJerHZx8\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBgKEQwDw==&rs=AOn4CLAI7Q0hsYbvwmE0a5lbPQCz3o8y6g",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/9YgbJerHZx8\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBgKEQwDw==&rs=AOn4CLBMSoL2mcESeSl87Q6F4GjYirByAQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "4 days ago",
                "duration": 59,
                "views": 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
Copy link
Owner

@KimHyeonGyeom On what OS are you?

@KimHyeonGyeom
Copy link
Author

I’m using Ubuntu.

@Benjamin-Loison
Copy link
Owner

Benjamin-Loison commented Sep 19, 2024

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
Copy link
Owner

Benjamin-Loison commented Sep 19, 2024

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

Personal notes:
sudo docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
sudo docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
git log | head -n 5
Output:
commit 4557d9aef14a528a805baf474ba5f4ec27de9f03
Author: Benjamin Loison <[email protected]>
Date:   Thu Sep 19 14:54:28 2024 +0200

    Fix #300: Add Protobuf support to Docker (#265)
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/(<Directory \/var\/www\/>\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"
curl 'http://localhost:8080//search?part=id,snippet&q=굿파트너&type=short'

image

on Debian 12 GNOME.

curl 'http://localhost:8080//search?part=id,snippet&q=%EA%B5%BF%ED%8C%8C%ED%8A%B8%EB%84%88&type=short'
Output:
{
    "kind": "youtube#searchListResponse",
    "etag": "NotImplemented",
    "items": [
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "9YgbJerHZx8"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc601\uc5c5\ub825 \uc788\ub294 \ubcc0\ud638\uc0ac? \ub450\ub465 \uc804\uc740\ud638 \ub4f1\uc7a5. #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/9YgbJerHZx8\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBgKEQwDw==&rs=AOn4CLAI7Q0hsYbvwmE0a5lbPQCz3o8y6g",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/9YgbJerHZx8\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBgKEQwDw==&rs=AOn4CLBMSoL2mcESeSl87Q6F4GjYirByAQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "4 days ago",
                "duration": 59,
                "views": 134484,
                "badges": [
                    "New"
                ],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790\ud0a4\ud0a4 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "Q8vta107MoU"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\ubd88\ub95c\ub0a8\ub140\uc758 \ub05d #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/Q8vta107MoU\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEIwDw==&rs=AOn4CLDcistRGOPiQXud9eOSsm8_-2H1AQ",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/Q8vta107MoU\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEIwDw==&rs=AOn4CLB8mZ2sAUyBOGypeQYW65_5N_GjNQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "2 weeks ago",
                "duration": 60,
                "views": 241644,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\ud3b8\uc9d1\uc790_\ub3d9\ub3d9 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "1GLbAwu-myM"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc8c4\uc218\ubc88\ud638\uac00 \uc801\ud78c \uc18c\uc911\ud55c \ucabd\uc9c0 #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/1GLbAwu-myM\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYSyBjKGUwDw==&rs=AOn4CLANn7G_ouY--jd8c-MRm__9Cgy_BQ",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/1GLbAwu-myM\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYSyBjKGUwDw==&rs=AOn4CLBqPyJUpALw4oOytbHFhzQTiiMuJA",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "5 days ago",
                "duration": 57,
                "views": 143736,
                "badges": [
                    "New"
                ],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\ud3b8\uc9d1\uc790_\ub3d9\ub3d9 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "tYpVf1A6tWM"
            },
            "snippet": {
                "channelId": "UCcMdp-Z4XPzhFthAbkp_jSQ",
                "title": "\uc138\uc0c1 \ubaa8\ub4e0 \ub0b4\uc5f0\ub0a8\ub140\uac00 \uba85\uc2ec\ud574\uc57c\ud558\ub294 \ub9d0 #\uad7f\ud30c\ud2b8\ub108",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/tYpVf1A6tWM\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBYKEYwDw==&rs=AOn4CLC5Vc5d4a7Nl1etzkeNUopftqq8Gg",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/tYpVf1A6tWM\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBYKEYwDw==&rs=AOn4CLDemiMYs0w7uW28QK-P6hGmeL_Ogg",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\uc20f\ud504\ub808\uc18c",
                "channelHandle": "@%EC%88%8F%ED%94%84%EB%A0%88%EC%86%8C",
                "timestamp": "2 weeks ago",
                "duration": 54,
                "views": 186111,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/RFR7XM93qv2h7thob-OEnmxZb4rKbV0wDqpmDneBgG9bk7Nyt12IBO2TG6X5dPlUVRdxISmR=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\ub4dc\ub77c\ub9c8 #\ud55c\uc7ac\uc774 #\uc9c0\uc2b9\ud604."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "XtYLaOBwA98"
            },
            "snippet": {
                "channelId": "UC3re3ueOE_6VZK85zlEUWFA",
                "title": "\uc8fc\uc81c \ud30c\uc545 \uc2e4\ud328\ud55c \uc0c1\uac04\ub140 #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/XtYLaOBwA98\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYTCBeKGUwDw==&rs=AOn4CLCwuSCmo3mbnKfo0cND2y-5Gll58g",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/XtYLaOBwA98\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYTCBeKGUwDw==&rs=AOn4CLAlFFo23NuxUr7S3gPfT9xSyjTrkQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Catch",
                "channelHandle": "@SBSCatch",
                "timestamp": "1 month ago",
                "duration": 60,
                "views": 242254,
                "badges": [],
                "channelApproval": "Verified",
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \uc8fc\uc81c \ud30c\uc545 \uc2e4\ud328\ud55c \uc0c1\uac04\ub140 #SBS #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "JOH0uHfKsi8"
            },
            "snippet": {
                "channelId": "UC3re3ueOE_6VZK85zlEUWFA",
                "title": "\"\ub0b4 \uc544\uc774 \ub9de\uc544??\" \ubed4\ubed4\ud574\uc9c4 \uc0c1\uac04\ub0a8\uc758 \uc5ed\ub300\uae09 \ub9dd\uc5b8 #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/JOH0uHfKsi8\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBaKEcwDw==&rs=AOn4CLAMibRKw88SdEX-Cs6Yv-8RsDYYyw",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/JOH0uHfKsi8\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBaKEcwDw==&rs=AOn4CLAhSPO74p1-1mt810-TAmx4yxt1fQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Catch",
                "channelHandle": "@SBSCatch",
                "timestamp": "3 weeks ago",
                "duration": 60,
                "views": 205384,
                "badges": [],
                "channelApproval": "Verified",
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \"\ub0b4 \uc544\uc774 \ub9de\uc544??\" \ubed4\ubed4\ud574\uc9c4 \uc0c1\uac04\ub0a8\uc758 \uc5ed\ub300\uae09 \ub9dd\uc5b8\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "tte-E687fPQ"
            },
            "snippet": {
                "channelId": "UC3re3ueOE_6VZK85zlEUWFA",
                "title": "\uc378\ub0a8\uc758 \ube48\uc790\ub9ac\uac00 \ub108\ubb34 \ud06c\ub2e4.. #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/tte-E687fPQ\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBUKDgwDw==&rs=AOn4CLA9_nCyHDKiOiNOReGe2XBLFOc9VA",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/tte-E687fPQ\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBUKDgwDw==&rs=AOn4CLAD7SGRbZlXOhmjPlFQdls5ofm4vw",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Catch",
                "channelHandle": "@SBSCatch",
                "timestamp": "2 days ago",
                "duration": 59,
                "views": 12097,
                "badges": [
                    "New"
                ],
                "channelApproval": "Verified",
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \uc378\ub0a8\uc758 \ube48\uc790\ub9ac\uac00 \ub108\ubb34 \ud06c\ub2e4.. #SBS #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "z5480SgvtIU"
            },
            "snippet": {
                "channelId": "UCvueSxhMPghtEnVNATsErnw",
                "title": "\ubc30\uc6b4\uac70 \uadf8\ub300\ub85c \uc368\uba39\ub294 \ud55c\uc720\ub9ac\ubcc0\ud638\uc0ac#shorts #\ub4dc\ub77c\ub9c8 #\uad7f\ud30c\ud2b8\ub108",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/z5480SgvtIU\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYNiBaKHIwDw==&rs=AOn4CLCBeRW6WPhRAse1ApDhgU2VHB2Jew",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/z5480SgvtIU\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYNiBaKHIwDw==&rs=AOn4CLBCWkdlitPgeXEa7G223w7z9LMq_w",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\uc1fc\ud06c\ub77c\ud14c\uce20",
                "channelHandle": "@syokeulatecheu",
                "timestamp": "5 hours ago",
                "duration": 55,
                "views": 4064,
                "badges": [
                    "New"
                ],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/32q44vAEY4mOd70dcYWOj4nO5dOUSRUv_Rz4pfrwRPajigkYjnewRyb8EMcPYUyyLD0qowBGCw=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": null,
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "h2bKVWKCIM8"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc65c \ub098\ud55c\ud14c\ub294 \uc548 \ub9d0\ud574\uc918 \uc789\uc789!!!! \uc18d\uc0c1\ud574 \uadf8\uce58\ub9cc \uc0ac\ub791\ud574 #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/h2bKVWKCIM8\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYTCBbKGUwDw==&rs=AOn4CLBbfxCgAVuA9fBMJkfoXd7kodgVOQ",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/h2bKVWKCIM8\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYTCBbKGUwDw==&rs=AOn4CLCfjYKHIUdDMw-2cfV_H3NFsw4TtQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "2 weeks ago",
                "duration": 55,
                "views": 496421,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "FvFQBZx-Tng"
            },
            "snippet": {
                "channelId": "UC8JgsopXE9NdHnjvE4C6Y_w",
                "title": "\uc7ac\ud310\uc9c0\uace0 \uc5ec\uc790 \ubcc0\ud638\uc0ac\ud55c\ud14c \ud654\ud480\uc774\ud558\ub294 \uc9c4\uc0c1 \uace0\uac1d #\uad7f\ud30c\ud2b8\ub108",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/FvFQBZx-Tng\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKFYwDw==&rs=AOn4CLBjyGZlnciFWRT7nJxyJn7Ykc8TIQ",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/FvFQBZx-Tng\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKFYwDw==&rs=AOn4CLDLE_K76BGJ2-2yfkw9vaZwCPkxkA",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\ub4dc\ub77c\ub9c8\ub77c",
                "channelHandle": "@drama-mara",
                "timestamp": "2 months ago",
                "duration": 56,
                "views": 1200435,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/VEb_2KKoCp7r5xzX_1e952I2yOCRIDi7V335K89S-j2z9TmVY-htuK3ypbiTn8pX9z6EZn8yeOM=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "shorts #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\uc720\ub098 #\uc815\uc7ac\uc131 #\uae40\ubbf8\ud654."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "VtYAU2_1jbE"
            },
            "snippet": {
                "channelId": "UCepnK54VE5Qu5KG1uJqfPTA",
                "title": "[\uad7f\ud30c\ud2b8\ub108 15\ud654]\uc740\uacbd \ubcf4\ub294 \ub208\uc5d0\uc11c \uafc0\ub5a8\uc5b4\uc9c0\ub294 \uc815\uc6b0\uc9c4! \uad7f\ud30c\ud2b8\ub108 \ub9c8\uc9c0\ub9c9\ud68c\uc5d0\uc11c \uc5f0\uc778\ub420\uae4c? #\uad7f\ud30c\ud2b8\ub108 #\uc7a5\ub098\ub77c #\uae40\uc900\ud55c #\ub0a8\uc9c0\ud604",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/VtYAU2_1jbE\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEQwDw==&rs=AOn4CLCeozWPhIu2JAlSfZHFlKsBH41P6A",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/VtYAU2_1jbE\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBXKEQwDw==&rs=AOn4CLCL7_z1oGrBgm1tPDlCTfSQkBDLrg",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\ub4dc\ub77c\ub9c8\uc704\ub4dc\uc720",
                "channelHandle": "@%EB%93%9C%EB%9D%BC%EB%A7%88%EC%9C%84%EB%93%9C%EC%9C%A0",
                "timestamp": "23 hours ago",
                "duration": 39,
                "views": 8106,
                "badges": [
                    "New"
                ],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/9WgWsEp-HN6RRTmmB4nTsyua12tcf1t1eitrPchzipJlmpI3UP6VhuReqYReEm9tVMaSeUYa=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": null,
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "ByYBhtYRlVQ"
            },
            "snippet": {
                "channelId": "UCLzu0D0DXZNUOiuny1QkMNg",
                "title": "[\uad7f\ud30c\ud2b8\ub108] - 150 \ucc9c\ud658\uc11c \uc790\ubc31 \uc720\ub3c4\ud558\ub2e4 \ud611\ubc15\ub2f9\ud55c \ucc28\uc740\uacbd  #\uc7a5\ub098\ub77c #\uad7f\ud30c\ud2b8\ub108 #goodpartner #shorts",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/ByYBhtYRlVQ\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYUSBgKGUwDw==&rs=AOn4CLA317UeiAwKo1BAr37fsO5Ud7Yj3g",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/ByYBhtYRlVQ\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYUSBgKGUwDw==&rs=AOn4CLCbKukM7n4sZYnU8_qFrmGrrZ4_rw",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\uc20f\uce20\ub77c\ub9c8(\uc20f\uce20\ub4dc\ub77c\ub9c8)",
                "channelHandle": "@KrShortsRama",
                "timestamp": "1 day ago",
                "duration": 60,
                "views": 83,
                "badges": [
                    "New",
                    "4K"
                ],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/OVjTn4UPd-ksV7qXCYOmG42cBHNbe7Xxlpts19a7JhQ2w3FKwdk-8o1JFrDfVV_5eq9ituV3=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "["
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "] - 150 \ucc9c\ud658\uc11c \uc790\ubc31 \uc720\ub3c4\ud558\ub2e4 \ud611\ubc15\ub2f9\ud55c \ucc28\uc740\uacbd \uc7a5\ub098\ub77cX\ub0a8\uc9c0\ud604X\uae40\uc900\ud55cX\ud45c\uc9c0\ud6c8\uc774 \uc54c\ub824\uc8fc\ub294 \uc9c4\uc9dc \uc774\ud63c\uc5d0 \ub300\ud55c \ubaa8\ub4e0 \uac83   4\uc778\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "engeB_cPsHw"
            },
            "snippet": {
                "channelId": "UCgY-llYKjbnusFuOivE3xmA",
                "title": "[\uad7f\ud30c\ud2b8\ub108 16\ud654 \uc608\uace0] \ucc28\uc740\uacbd\uc758 \ud574\uace0\ub294 \uc624\ub300\uaddc\uc758 \uacc4\ud68d\uc774\uc600\ub2e4        #\uad7f\ud30c\ud2b8\ub108",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/engeB_cPsHw\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYciBCKDkwDw==&rs=AOn4CLBv0fmne3gsdmSJyHo9uGIt97CY1w",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/engeB_cPsHw\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYciBCKDkwDw==&rs=AOn4CLCJonMXPlWzCSXrNPk2yi2wbbuOfg",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\ub775\uc3d8\uad7f\ub4dc\ub77c\ub9c8_Think so Good Drama",
                "channelHandle": "@%EB%9D%B5%EC%8F%98%EA%B5%BF%EB%93%9C%EB%9D%BC%EB%A7%88",
                "timestamp": "4 days ago",
                "duration": 59,
                "views": 9760,
                "badges": [
                    "New"
                ],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/hC4MCvU1g_NnKP35tnlN4ZYGfEfR4FqAQg9tsatjsj_QsK3znSYd-lDtK1VbDMM3HAL7W3mR=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #goodpartner #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\ud53c\uc624 #sbs\ub4dc\ub77c\ub9c8 #\ub137\ud50c\ub9ad\uc2a4 #\uc6e8\uc774\ube0c #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "14\ud654 #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "15\ud654 #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "16\ud654\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "KJBP1Ej1bgQ"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\ucc28\uc740\uacbd \uac74\ub4e4\uba74 \uc815\uc6b0\uc9c4\uc740 \ucc38\uc9c0 \uc54a\uc544(\ucd5c\uc0ac\ub77c \ucc38\uad50\uc721\ud558\uae30) #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/KJBP1Ej1bgQ\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYWSBjKGUwDw==&rs=AOn4CLCKCW0yxvNsJzp6sweVvIyZ6S4YPA",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/KJBP1Ej1bgQ\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYWSBjKGUwDw==&rs=AOn4CLCXdDYGQON1qpWoUwRqua0ntaVKuQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "1 month ago",
                "duration": 56,
                "views": 328820,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "pUv5XQwYpYc"
            },
            "snippet": {
                "channelId": "UC8JgsopXE9NdHnjvE4C6Y_w",
                "title": "\uc678\ub3c4\uac00 \uc758\uc2ec\uac00\ub3c4 \uc808\ub300 \ud574\uc11c\ub294 \uc548\ub418\ub294 \uc9c8\ubb38 #\uad7f\ud30c\ud2b8\ub108",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/pUv5XQwYpYc\/hq720.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBkKFAwDw==&rs=AOn4CLBDelGP9MhrIvW7VTiA7GHE6eywog",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/pUv5XQwYpYc\/hq720.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBkKFAwDw==&rs=AOn4CLBnpL501FO2C5a8QiOTd5dho9Yd0A",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "\ub4dc\ub77c\ub9c8\ub77c",
                "channelHandle": "@drama-mara",
                "timestamp": "2 months ago",
                "duration": 50,
                "views": 640486,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/VEb_2KKoCp7r5xzX_1e952I2yOCRIDi7V335K89S-j2z9TmVY-htuK3ypbiTn8pX9z6EZn8yeOM=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "shorts #"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\uc9c0\uc2b9\ud604 #\ud55c\uc7ac\uc774 #\uc720\ub098 #\uc815\uc7ac\uc131 #\uae40\ubbf8\ud654."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "ftNZ-A5fRe4"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc774\ub7f0 \uac83\uae4c\uc9c0 \uc54c\ub824\uc918\uc57c \ub3fc?!(\uc88b\uc74c)\uc7ac\ud76c \uae30\ubd84 \uc88b\uc544\uc694. #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/ftNZ-A5fRe4\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBbKEcwDw==&rs=AOn4CLBoJgESAJyaOHOpiNxss7SXauU5Sw",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/ftNZ-A5fRe4\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBbKEcwDw==&rs=AOn4CLBktPNtWXrf5kfK_JMy1RHoQGv2ng",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "1 month ago",
                "duration": 49,
                "views": 182162,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uc720\ub098 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "wHrGf1u4OVs"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc740\uacbd\uc740 \uc9c0\uae08...\uc77c\ub9cc \uc544\ub294 \uc5c4\ub9c8\uc5d0\uc11c \ubc97\uc5b4\ub098\uae30 \ud504\ub85c\uc81d\ud2b8 \uc911 #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/wHrGf1u4OVs\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBlKGUwDw==&rs=AOn4CLAgrMONqSTxFh1cUQYdzYv24xrRAw",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/wHrGf1u4OVs\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBlKGUwDw==&rs=AOn4CLDlG7xDFTrW0s0nXUQu5BFwwfkELA",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "1 month ago",
                "duration": 60,
                "views": 264224,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\ubc29\uc1a1\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "YGfSYWJLB5w"
            },
            "snippet": {
                "channelId": "UC6erIDuvbOaAO-OT5rB2Xew",
                "title": "\uc544\ub2c8? \ub098 \uc790\ub824\uace0 \ud588\ub294\ub370?(\uc5c4\ub9c8 \uae30\ub2e4\ub9bc) #shorts #\uad7f\ud30c\ud2b8\ub108 #goodpartner",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/YGfSYWJLB5w\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBcKEswDw==&rs=AOn4CLDAsh6Lvwg7L71lEzu3k66L7DzxRA",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/YGfSYWJLB5w\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBcKEswDw==&rs=AOn4CLDzoc2YQrkoXXVs_js6hbYhS5s12Q",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Drama",
                "channelHandle": "@SBSdrama.official",
                "timestamp": "1 month ago",
                "duration": 50,
                "views": 353895,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/MeeX0Q3PhPqEUaq26tnCx679PlaB8EvenKbtovx3txazfJBOA4KMbtdrdy8qqCUy5hkPSe5Y=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": " #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604 #\uc720\ub098 #\uae40\uc900\ud55c #\ud45c\uc9c0\ud6c8 #\ud3b8\uc9d1\uc790_\uc778\uc790\uae30 SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "(goodpartner)' \u261e \uae08, \ud1a0 \ubc24 10\uc2dc \ubcf8\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "cpq6lfTWtn0"
            },
            "snippet": {
                "channelId": "UCcOYEm78CpaZQvPE6LtoSeA",
                "title": "[9\ud68c \uc5d4\ub529] \"\uc5c4\ub9c8\uac00 \ubbf8\uc548\ud574\" \ub4dc\ub514\uc5b4 \uc804\ud558\ub294 \uc740\uacbd\uacfc \uc7ac\ud76c\uc758 \uc9c4\uc2ec\ud83d\ude22 #Shorts | \uad7f\ud30c\ud2b8\ub108 | SBS",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/cpq6lfTWtn0\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAK4CIoCDAgAEAEYQCBYKHIwDw==&rs=AOn4CLDr3jN6Kx_LWTjHxZHpjxnVvg6z6Q",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/cpq6lfTWtn0\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAK4CIoCDAgAEAEYQCBYKHIwDw==&rs=AOn4CLBbzDfd_Yv0HGdgGostNSSVLlEqnQ",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS ",
                "channelHandle": "@SBSNOW",
                "timestamp": "3 weeks ago",
                "duration": 56,
                "views": 96005,
                "badges": [],
                "channelApproval": null,
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/Zo2b8wKRyymppEmpCvesR0V2BbKKLH8pfXN-bgvTf4TSEPYuEYwX_knOvqwd7droOujdwx6B=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "\uc774\ud63c\uc774 '\ucc9c\uc9c1'\uc778 \uc2a4\ud0c0 \ubcc0\ud638\uc0ac \ucc28\uc740\uacbd\uacfc \uc774\ud63c\uc740 '\ucc98\uc74c'\uc778 \uc2e0\uc785 \ubcc0\ud638\uc0ac \ud55c\uc720\ub9ac\uc758 \ucc28\uac11\uace0 \ub728\uac70\uc6b4 \ud734\uba3c \ubc95\uc815 \uc624\ud53c\uc2a4 \ub4dc\ub77c\ub9c8 #\uc7a5\ub098\ub77c #\ub0a8\uc9c0\ud604\u00a0..."
                    }
                ],
                "chapters": []
            }
        },
        {
            "kind": "youtube#searchResult",
            "etag": "NotImplemented",
            "id": {
                "kind": "youtube#video",
                "videoId": "qKBAFvqcalg"
            },
            "snippet": {
                "channelId": "UC3re3ueOE_6VZK85zlEUWFA",
                "title": "\ub0a8\ud3b8 \uaf2c\uc2e0 \ud68c\uc0ac \ub3d9\ub8cc \ubcc0\ud638\uc0ac \ubcf8\uc5c5\uc73c\ub85c \ucc38\uad50\uc721\ud558\uae30! #Shorts #\uad7f\ud30c\ud2b8\ub108 #Goodpartner #SBSCatch",
                "thumbnails": [
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/qKBAFvqcalg\/hq720_2.jpg?sqp=-oaymwE9COgCEMoBSFryq4qpAy8IARUAAAAAGAAlAADIQj0AgKJDeAHwAQH4AbYIgAKAD4oCDAgAEAEYZSBgKFQwDw==&rs=AOn4CLB9M858rVdP9JnTb-hywfzbhYqH3g",
                        "width": 360,
                        "height": 202
                    },
                    {
                        "url": "https:\/\/i.ytimg.com\/vi\/qKBAFvqcalg\/hq720_2.jpg?sqp=-oaymwExCNAFEJQDSFryq4qpAyMIARUAAIhCGADwAQH4AbYIgAKAD4oCDAgAEAEYZSBgKFQwDw==&rs=AOn4CLCeie59JOuFI11ADvusPxawBme57Q",
                        "width": 720,
                        "height": 404
                    }
                ],
                "channelTitle": "SBS Catch",
                "channelHandle": "@SBSCatch",
                "timestamp": "1 month ago",
                "duration": 60,
                "views": 1223891,
                "badges": [],
                "channelApproval": "Verified",
                "channelThumbnails": [
                    {
                        "url": "https:\/\/yt3.ggpht.com\/ytc\/AIdro_mSBgktCpsMV1-HewdlDqnU0624zXDuTidJ36Y4_7LQa_k=s68-c-k-c0x00ffffff-no-rj",
                        "width": 68,
                        "height": 68
                    }
                ],
                "detailedMetadataSnippet": [
                    {
                        "text": "SBS \uae08\ud1a0\ub4dc\ub77c\ub9c8 '"
                    },
                    {
                        "text": "\uad7f\ud30c\ud2b8\ub108",
                        "bold": true
                    },
                    {
                        "text": "' \ucd9c\uc5f0 : \uc7a5\ub098\ub77c, \ub0a8\uc9c0\ud604, \uae40\uc900\ud55c, \ud45c\uc9c0\ud6c8, \uc9c0\uc2b9\ud604, \ud55c\uc7ac\uc774 \ub0a8\ud3b8 \uaf2c\uc2e0 \ud68c\uc0ac \ub3d9\ub8cc \ubcc0\ud638\uc0ac \ubcf8\uc5c5\uc73c\ub85c \ucc38\uad50\uc721\ud558\uae30!"
                    }
                ],
                "chapters": []
            }
        }
    ]
}

@KimHyeonGyeom
Copy link
Author

Everything is working fine now! Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working epic A task that is going to take more than a day to complete. medium priority A high-priority issue noticeable by the user but he can still work around it.
Projects
None yet
Development

No branches or pull requests

2 participants