Fix YouTube likes + dislikes
This commit is contained in:
parent
5028396405
commit
c4eca91be9
1 changed files with 43 additions and 25 deletions
|
@ -337,19 +337,33 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||
@Override
|
||||
public long getLikeCount() throws ParsingException {
|
||||
assertPageFetched();
|
||||
String likesString = "";
|
||||
try {
|
||||
String likesString = null;
|
||||
try {
|
||||
likesString = getVideoPrimaryInfoRenderer().getObject("sentimentBar")
|
||||
.getObject("sentimentBarRenderer").getString("tooltip").split("/")[0];
|
||||
} catch (final NullPointerException e) {
|
||||
.getObject("sentimentBarRenderer").getString("tooltip");
|
||||
if (likesString != null && likesString.contains("/")) {
|
||||
likesString = likesString.split("/")[0];
|
||||
} else {
|
||||
likesString = getVideoPrimaryInfoRenderer()
|
||||
.getObject("videoActions")
|
||||
.getObject("menuRenderer")
|
||||
.getArray("topLevelButtons")
|
||||
.getObject(0)
|
||||
.getObject("toggleButtonRenderer")
|
||||
.getObject("defaultText")
|
||||
.getObject("accessibility")
|
||||
.getObject("accessibilityData")
|
||||
.getString("label");
|
||||
}
|
||||
|
||||
if (likesString == null) {
|
||||
// If this kicks in our button has no content and therefore ratings must be disabled
|
||||
if (playerResponse.getObject("videoDetails").getBoolean("allowRatings")) {
|
||||
throw new ParsingException(
|
||||
"Ratings are enabled even though the like button is missing", e);
|
||||
throw new ParsingException("Ratings are enabled even though the like button is missing");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
return Integer.parseInt(Utils.removeNonDigitCharacters(likesString));
|
||||
} catch (final NumberFormatException nfe) {
|
||||
throw new ParsingException("Could not parse \"" + likesString + "\" as an Integer",
|
||||
|
@ -366,30 +380,34 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||
public long getDislikeCount() throws ParsingException {
|
||||
assertPageFetched();
|
||||
|
||||
String dislikesString = "";
|
||||
try {
|
||||
String dislikesString = null;
|
||||
try {
|
||||
dislikesString = getVideoPrimaryInfoRenderer().getObject("sentimentBar")
|
||||
.getObject("sentimentBarRenderer").getString("tooltip").split("/")[1];
|
||||
} catch (final NullPointerException e) {
|
||||
// If this kicks in our button has no content and therefore ratings must be disabled
|
||||
if (playerResponse.getObject("videoDetails").getBoolean("allowRatings")) {
|
||||
throw new ParsingException(
|
||||
"Ratings are enabled even though the dislike button is missing", e);
|
||||
.getObject("sentimentBarRenderer").getString("tooltip");
|
||||
if (dislikesString != null && dislikesString.contains("/")) {
|
||||
dislikesString = dislikesString.split("/")[1];
|
||||
} else {
|
||||
// Calculate dislike with average rating and like count
|
||||
long likes = getLikeCount();
|
||||
double averageRating = playerResponse.getObject("videoDetails").getDouble("averageRating");
|
||||
|
||||
if (likes != -1 && averageRating > 1) {
|
||||
// If averageRating can't be gathered, it will be 0,
|
||||
// but we also can't divide by 0 so we need > 1
|
||||
return Math.round(likes * ((5 - averageRating) / (averageRating - 1)));
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (dislikesString != null) {
|
||||
return Integer.parseInt(Utils.removeNonDigitCharacters(dislikesString));
|
||||
} catch (final NumberFormatException nfe) {
|
||||
throw new ParsingException("Could not parse \"" + dislikesString + "\" as an Integer",
|
||||
nfe);
|
||||
}
|
||||
|
||||
} catch (final Exception e) {
|
||||
if (getAgeLimit() == NO_AGE_LIMIT) {
|
||||
throw new ParsingException("Could not get dislike count", e);
|
||||
}
|
||||
// Silently fail as YouTube is "gradually rolling out" removing dislike count
|
||||
// https://blog.youtube/news-and-events/update-to-youtube/
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue