Repository: yt-dlp/yt-dlp

Issue:
[YouTube] Comment extraction is missing is_favorited key, aka creator-heart
### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field

### Checklist

- [X] I'm reporting that yt-dlp is broken on a **supported** site
- [X] I've verified that I'm running yt-dlp version **2023.06.22** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [ ] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

_No response_

### Provide a description that is worded well enough to be understood

Newest release looks like is not extracting the `is_favorited` key from the comments: 
```
* "is_favorited" - Whether the comment is marked as
                   favorite by the video uploader
```

I'm guessing that happened with the change here: https://github.com/yt-dlp/yt-dlp/commit/c35448b7b14113b35c4415dbfbf488c4731f006f. Assuming something to do with how `traverse_obj` is called?

### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [ ] If using API, add `'verbose': True` to `YoutubeDL` params instead
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
❯ yt-dlp -vU --get-comments --no-download --print "%(comments)j" --extractor-args "youtube:max_comments=all,2,all,0;comment_sort=top" "https://www.youtube.com/watch?v=5-DD4AvtuyU"
[debug] Command-line config: ['-vU', '--get-comments', '--no-download', '--print', '%(comments)j', '--extractor-args', 'youtube:max_comments=all,2,all,0;comment_sort=top', 'https://www.youtube.com/watch?v=5-DD4AvtuyU']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2023.06.22 [812cdfa06] (source)
[debug] Lazy loading extractors is disabled
[debug] Git HEAD: de4cf77ec
[debug] Python 3.11.3 (CPython x86_64 64bit) - Linux-6.3.8-arch1-1-x86_64-with-glibc2.37 (OpenSSL 3.1.1 30 May 2023, glibc 2.37)
[debug] exe versions: ffmpeg 6.0 (setts), ffprobe 6.0
[debug] Optional libraries: certifi-2023.05.07, sqlite3-2.6.0
[debug] Proxy map: {}
[debug] Loaded 1851 extractors
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Available version: stable@2023.06.22, Current version: stable@2023.06.22
yt-dlp is up to date (stable@2023.06.22)
[youtube] Extracting URL: https://www.youtube.com/watch?v=5-DD4AvtuyU
[youtube] 5-DD4AvtuyU: Downloading webpage
[youtube] 5-DD4AvtuyU: Downloading ios player API JSON
[youtube] 5-DD4AvtuyU: Downloading android player API JSON
[debug] Loading youtube-nsig.6ed0d907 from cache
[debug] [youtube] Decrypted nsig mxIsF5naa9aZ0yJ => ui9HGso6Nig-hw
[youtube] 5-DD4AvtuyU: Downloading m3u8 information
[debug] Sort order given by extractor: quality, res, fps, hdr:12, source, vcodec:vp9.2, channels, acodec, lang, proto
[debug] Formats sorted by: hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec:vp9.2(10), channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id
[youtube] Downloading comment section API JSON
[youtube] Downloading ~870 comments
[youtube] Sorting comments by top comments
[youtube] Downloading comment API JSON page 1 (0/~870)
[youtube] Extracted 2 comments
[debug] Default format spec: bestvideo*+bestaudio/best
[info] 5-DD4AvtuyU: Downloading 1 format(s): 303+251
[{
    "id": "Ugzyl3X9K-JsHYEoFjd4AaABAg",
    "text": "Download Safing's Portmaster and take control of your network traffic: https://safing.io",
    "like_count": 30,
    "author_id": "UC5UAwBUum7CPN5buc-_N1Fw",
    "author": "@TheLinuxEXP",
    "author_thumbnail": "https://yt3.ggpht.com/ytc/AGIKgqNGLy645LbRXqj20JAnbfQd2Lj1dwHk893_WRs8Ug=s176-c-k-c0x00ffffff-no-rj",
    "parent": "root",
    "_time_text": "9 days ago",
    "timestamp": 1686700800,
    "author_url": "https://www.youtube.com/channel/UC5UAwBUum7CPN5buc-_N1Fw",
    "author_is_uploader": true,
    "author_is_verified": true,
    "is_pinned": true
}, {
    "id": "Ugw_y8ejSsqPldp7Cvt4AaABAg",
    "text": "I would also like to add that there's still no system monitor that comes even close to Task Manager's usefulness, power and accessibility. The mere fact that by default it groups processes by main task and gives them readable names/window names instead of just displaying the binary's filename is already enough to give it the crown over everything else on linux DEs. It's so easy to parse stuff in it",
    "like_count": 492,
    "author_id": "UCeachVpiQKxIUsJkdg4hZLA",
    "author": "@mat_max",
    "author_thumbnail": "https://yt3.ggpht.com/ytc/AGIKgqM2rnkbArY47LV0sd-p3qBN5BtAAocChsa85jBu=s176-c-k-c0x00ffffff-no-rj",
    "parent": "root",
    "_time_text": "8 days ago",
    "timestamp": 1686787200,
    "author_url": "https://www.youtube.com/channel/UCeachVpiQKxIUsJkdg4hZLA",
    "author_is_uploader": false
}]

# JSON output is beautified by me for easy reading.
# Note that the second comment should have `is_favorited` set to `true`.
```



Discussion:
looks like it was just a typo
```diff
diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
index f1c8df141..51a442e81 100644
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -3356,7 +3356,7 @@ def _extract_comment(self, comment_renderer, parent=None):
             info['author_is_uploader'] = author_is_uploader
 
         comment_abr = traverse_obj(
-            comment_renderer, ('actionsButtons', 'commentActionButtonsRenderer'), expected_type=dict)
+            comment_renderer, ('actionButtons', 'commentActionButtonsRenderer'), expected_type=dict)
         if comment_abr is not None:
             info['is_favorited'] = 'creatorHeart' in comment_abr
 
```

Resolving patch:
diff --git a/yt_dlp/extractor/youtube.py b/yt_dlp/extractor/youtube.py
--- a/yt_dlp/extractor/youtube.py
+++ b/yt_dlp/extractor/youtube.py
@@ -3356,7 +3356,7 @@ def _extract_comment(self, comment_renderer, parent=None):
             info['author_is_uploader'] = author_is_uploader
 
         comment_abr = traverse_obj(
-            comment_renderer, ('actionsButtons', 'commentActionButtonsRenderer'), expected_type=dict)
+            comment_renderer, ('actionButtons', 'commentActionButtonsRenderer'), expected_type=dict)
         if comment_abr is not None:
             info['is_favorited'] = 'creatorHeart' in comment_abr
 


Test patch: