Skip to content

Commit 67548a2

Browse files
committed
Handle situations where there are multiple uploaders
1 parent 7eddf9a commit 67548a2

1 file changed

Lines changed: 38 additions & 5 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemLockupExtractor.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,45 @@ public String getUploaderName() throws ParsingException {
165165

166166
@Override
167167
public String getUploaderUrl() throws ParsingException {
168-
final String channelId = JsonUtils.getString(lockupViewModel,
169-
"metadata.lockupMetadataViewModel.image.decoratedAvatarViewModel"
170-
+ ".rendererContext.commandContext.onTap"
171-
+ ".innertubeCommand.browseEndpoint.browseId");
168+
final List<ParsingException> reportedExceptions = new ArrayList<>();
169+
170+
String channelId = null;
171+
try {
172+
channelId = JsonUtils.getString(lockupViewModel,
173+
"metadata.lockupMetadataViewModel.image.decoratedAvatarViewModel"
174+
+ ".rendererContext.commandContext.onTap"
175+
+ ".innertubeCommand.browseEndpoint.browseId");
176+
} catch (final ParsingException e) {
177+
reportedExceptions.add(e);
178+
179+
// This might happen when a video has MULTIPLE uploaders -> Select first
180+
try {
181+
channelId = JsonUtils.getArray(lockupViewModel,
182+
"metadata.lockupMetadataViewModel.image.avatarStackViewModel"
183+
+ ".rendererContext.commandContext.onTap.innertubeCommand"
184+
+ ".showDialogCommand.panelLoadingStrategy.inlineContent"
185+
+ ".dialogViewModel.customContent.listViewModel.listItems")
186+
.streamAsJsonObjects()
187+
.map(listItem -> listItem
188+
.getObject("listItemViewModel")
189+
.getObject("rendererContext")
190+
.getObject("commandContext")
191+
.getObject("onTap")
192+
.getObject("innertubeCommand")
193+
.getObject("browseEndpoint")
194+
.getString("browseId"))
195+
.findFirst()
196+
.orElse(null);
197+
} catch (final ParsingException e2) {
198+
reportedExceptions.add(e2);
199+
}
200+
}
201+
172202
if (isNullOrEmpty(channelId)) {
173-
throw new ParsingException("Could not get uploader url");
203+
final ParsingException parsingException =
204+
new ParsingException("Could not get uploader url");
205+
reportedExceptions.forEach(parsingException::addSuppressed);
206+
throw parsingException;
174207
}
175208
return YoutubeChannelLinkHandlerFactory.getInstance().getUrl(channelId);
176209
}

0 commit comments

Comments
 (0)