Skip to content

Commit c295248

Browse files
committed
fix: fix channel extraction in MoreVideoInfosResponse for multichannel videos and improve performance
1 parent b83e0d3 commit c295248

5 files changed

Lines changed: 14 additions & 6 deletions

File tree

Sources/YouTubeKit/BaseStructs/YTPlaylist.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public struct YTPlaylist: YTSearchResult, Sendable {
100100

101101
mainLoop: for thumbnailOverlay in json["contentImage", "collectionThumbnailViewModel", "primaryThumbnail", "thumbnailViewModel", "overlays"].arrayValue {
102102
for thumbnailBadge in thumbnailOverlay["thumbnailOverlayBadgeViewModel", "thumbnailBadges"].arrayValue {
103-
if thumbnailBadge["thumbnailBadgeViewModel", "icon", "sources"].arrayValue.first?["clientResource", "imageName"].string == "PLAYLISTS", let text = thumbnailBadge["thumbnailBadgeViewModel", "text"].string {
103+
if thumbnailBadge["thumbnailBadgeViewModel", "icon", "sources", 0, "clientResource", "imageName"].string == "PLAYLISTS", let text = thumbnailBadge["thumbnailBadgeViewModel", "text"].string {
104104
playlist.videoCount = text
105105
break mainLoop
106106
}

Sources/YouTubeKit/YouTubeResponseTypes/AuthenticatedResponses/HistoryActions/HistoryResponse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public struct HistoryResponse: AuthenticatedContinuableResponse {
8282
for shortJSON in videoJSON["reelShelfRenderer", "items"].arrayValue {
8383
if let short = YTVideo.decodeShortFromJSON(json: shortJSON["reelItemRenderer"]) ?? YTVideo.decodeShortFromLockupJSON(json: shortJSON["shortsLockupViewModel"]) {
8484
block.shorts.append(short)
85-
block.suppressTokens.append(shortJSON["reelItemRenderer", "menu", "menuRenderer", "items"].arrayValue.first?["menuServiceItemRenderer", "serviceEndpoint", "feedbackEndpoint", "feedbackToken"].string)
85+
block.suppressTokens.append(shortJSON["reelItemRenderer", "menu", "menuRenderer", "items", 0, "menuServiceItemRenderer", "serviceEndpoint", "feedbackEndpoint", "feedbackToken"].string)
8686
}
8787
}
8888
toAppend.contentsArray.append(block)

Sources/YouTubeKit/YouTubeResponseTypes/AuthenticatedResponses/HistoryActions/RemoveVideoFromHistroryResponse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public struct RemoveVideoFromHistroryResponse: SimpleActionAuthenticatedResponse
2424
guard !(json["responseContext", "mainAppWebResponseContext", "loggedOut"].bool ?? true) else { return toReturn }
2525

2626
toReturn.isDisconnected = false
27-
toReturn.success = json["feedbackResponses"].arrayValue.first?["isProcessed"].bool == true
27+
toReturn.success = json["feedbackResponses", 0, "isProcessed"].bool == true
2828

2929
return toReturn
3030
}

Sources/YouTubeKit/YouTubeResponseTypes/ChannelInfos/ChannelInfosResponse.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public struct ChannelInfosResponse: YouTubeResponse {
281281

282282
// TODO: implement badges extraction via dynamicTextViewModel -> text -> attachmentRuns
283283

284-
self.subscriberCount = !metadataRows.arrayValue.isEmpty ? metadataRows.arrayValue.last!["metadataParts"].arrayValue.first?["text", "content"].string : nil
284+
self.subscriberCount = !metadataRows.arrayValue.isEmpty ? metadataRows.arrayValue.last!["metadataParts", 0 "text", "content"].string : nil
285285

286286
self.videoCount = !metadataRows.arrayValue.isEmpty ? metadataRows.arrayValue.last!["metadataParts"].arrayValue.count > 1 ? metadataRows.arrayValue.last!["metadataParts"].arrayValue[1]["text", "content"].string : nil : nil
287287

Sources/YouTubeKit/YouTubeResponseTypes/VideoInfos/MoreVideoInfosResponse.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,20 @@ public struct MoreVideoInfosResponse: YouTubeResponse {
158158
let videoSecondaryInfos = contentPart["videoSecondaryInfoRenderer"]
159159
if videoSecondaryInfos["owner"].exists() {
160160
let channel = videoSecondaryInfos["owner", "videoOwnerRenderer"]
161-
if let channelId = channel["title", "runs"].arrayValue.first?["navigationEndpoint", "browseEndpoint", "browseId"].string {
161+
if let channelId = channel["title", "runs", 0, "navigationEndpoint", "browseEndpoint", "browseId"].string {
162162
var videoChannel = YTChannel(channelId: channelId)
163-
videoChannel.name = channel["title", "runs"].arrayValue.first?["text"].string
163+
videoChannel.name = channel["title", "runs", 0, "text"].string
164164
YTThumbnail.appendThumbnails(json: channel["thumbnail"], thumbnailList: &videoChannel.thumbnails)
165165
videoChannel.subscriberCount = channel["subscriberCountText", "simpleText"].string
166166
toReturn.channel = videoChannel
167+
} else if let channelId = videoSecondaryInfos["owner", "videoOwnerRenderer", "title", "runs", 0, "navigationEndpoint", "showDialogCommand", "panelLoadingStrategy", "inlineContent", "dialogViewModel", "customContent", "listViewModel", "listItems", 0, "listItemViewModel", "title", "commandRuns", 0, "onTap", "innertubeCommand", "browseEndpoint", "browseId"].string {
168+
// case where there's mutliple collaborators on a video
169+
// TODO: support mutliple channels
170+
let channelContent = videoSecondaryInfos["owner", "videoOwnerRenderer", "title", "runs", 0, "navigationEndpoint", "showDialogCommand", "panelLoadingStrategy", "inlineContent", "dialogViewModel", "customContent", "listViewModel", "listItems", 0, "listItemViewModel"]
171+
var channel = YTChannel(name: channelContent["title", "content"].string, channelId: channelId)
172+
YTThumbnail.appendThumbnails(json: channelContent["leadingAccessory", "avatarViewModel"], thumbnailList: &channel.thumbnails)
173+
174+
toReturn.channel = channel
167175
}
168176
}
169177
if isAccountConnected {

0 commit comments

Comments
 (0)