Skip to content

Commit 2ace07d

Browse files
committed
chore(YouTube - Announcements): Use API v4 to get announcements (#3869)
1 parent ae160a3 commit 2ace07d

File tree

2 files changed

+63
-29
lines changed

2 files changed

+63
-29
lines changed

extensions/shared/src/main/java/app/revanced/extension/youtube/patches/announcements/AnnouncementsPatch.java

+60-23
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import static android.text.Html.FROM_HTML_MODE_COMPACT;
44
import static app.revanced.extension.shared.StringRef.str;
5-
import static app.revanced.extension.youtube.patches.announcements.requests.AnnouncementsRoutes.GET_LATEST_ANNOUNCEMENT;
5+
import static app.revanced.extension.youtube.patches.announcements.requests.AnnouncementsRoutes.GET_LATEST_ANNOUNCEMENTS;
6+
import static app.revanced.extension.youtube.patches.announcements.requests.AnnouncementsRoutes.GET_LATEST_ANNOUNCEMENT_IDS;
67

78
import android.app.Activity;
89
import android.app.AlertDialog;
@@ -13,11 +14,14 @@
1314

1415
import androidx.annotation.RequiresApi;
1516

17+
import org.json.JSONArray;
1618
import org.json.JSONObject;
1719

1820
import java.io.IOException;
1921
import java.net.HttpURLConnection;
22+
import java.time.LocalDateTime;
2023
import java.util.Locale;
24+
import java.util.logging.Level;
2125

2226
import app.revanced.extension.shared.Logger;
2327
import app.revanced.extension.shared.Utils;
@@ -30,6 +34,45 @@ public final class AnnouncementsPatch {
3034
private AnnouncementsPatch() {
3135
}
3236

37+
@RequiresApi(api = Build.VERSION_CODES.O)
38+
private static boolean isLatestAlready() throws IOException {
39+
HttpURLConnection connection =
40+
AnnouncementsRoutes.getAnnouncementsConnectionFromRoute(GET_LATEST_ANNOUNCEMENT_IDS);
41+
42+
Logger.printDebug(() -> "Get latest announcement IDs route connection url: " + connection.getURL());
43+
44+
try {
45+
// Do not show the announcement if the request failed.
46+
if (connection.getResponseCode() != 200) {
47+
if (Settings.ANNOUNCEMENT_LAST_ID.isSetToDefault())
48+
return true;
49+
50+
Settings.ANNOUNCEMENT_LAST_ID.resetToDefault();
51+
Utils.showToastLong(str("revanced_announcements_connection_failed"));
52+
53+
return true;
54+
}
55+
} catch (IOException ex) {
56+
Logger.printException(() -> "Could not connect to announcements provider", ex);
57+
return true;
58+
}
59+
60+
var jsonString = Requester.parseStringAndDisconnect(connection);
61+
62+
// Parse the ID. Fall-back to raw string if it fails.
63+
int id = Settings.ANNOUNCEMENT_LAST_ID.defaultValue;
64+
try {
65+
final var announcementIds = new JSONArray(jsonString);
66+
id = announcementIds.getJSONObject(0).getInt("id");
67+
68+
} catch (Throwable ex) {
69+
Logger.printException(() -> "Failed to parse announcement IDs", ex);
70+
}
71+
72+
// Do not show the announcement, if the last announcement id is the same as the current one.
73+
return Settings.ANNOUNCEMENT_LAST_ID.get() == id;
74+
}
75+
3376
@RequiresApi(api = Build.VERSION_CODES.O)
3477
public static void showAnnouncement(final Activity context) {
3578
if (!Settings.ANNOUNCEMENTS.get()) return;
@@ -39,51 +82,45 @@ public static void showAnnouncement(final Activity context) {
3982

4083
Utils.runOnBackgroundThread(() -> {
4184
try {
42-
HttpURLConnection connection = AnnouncementsRoutes.getAnnouncementsConnectionFromRoute(
43-
GET_LATEST_ANNOUNCEMENT, Locale.getDefault().toLanguageTag());
44-
45-
Logger.printDebug(() -> "Get latest announcement route connection url: " + connection.getURL());
85+
if (isLatestAlready()) return;
4686

47-
try {
48-
// Do not show the announcement if the request failed.
49-
if (connection.getResponseCode() != 200) {
50-
if (Settings.ANNOUNCEMENT_LAST_ID.isSetToDefault())
51-
return;
87+
HttpURLConnection connection = AnnouncementsRoutes.getAnnouncementsConnectionFromRoute(
88+
GET_LATEST_ANNOUNCEMENTS, Locale.getDefault().toLanguageTag());
5289

53-
Settings.ANNOUNCEMENT_LAST_ID.resetToDefault();
54-
Utils.showToastLong(str("revanced_announcements_connection_failed"));
55-
56-
return;
57-
}
58-
} catch (IOException ex) {
59-
Logger.printException(() -> "Could not connect to announcements provider", ex);
60-
return;
61-
}
90+
Logger.printDebug(() -> "Get latest announcements route connection url: " + connection.getURL());
6291

6392
var jsonString = Requester.parseStringAndDisconnect(connection);
6493

6594
// Parse the announcement. Fall-back to raw string if it fails.
6695
int id = Settings.ANNOUNCEMENT_LAST_ID.defaultValue;
6796
String title;
6897
String message;
98+
LocalDateTime archivedAt = LocalDateTime.MAX;
6999
Level level = Level.INFO;
70100
try {
71101
final var announcement = new JSONObject(jsonString);
72102

73103
id = announcement.getInt("id");
74104
title = announcement.getString("title");
75105
message = announcement.getJSONObject("content").getString("message");
76-
if (!announcement.isNull("level")) level = Level.fromInt(announcement.getInt("level"));
77-
106+
if (!announcement.isNull("archived_at")) {
107+
archivedAt = LocalDateTime.parse(announcement.getString("archived_at"));
108+
}
109+
if (!announcement.isNull("level")) {
110+
level = Level.fromInt(announcement.getInt("level"));
111+
}
78112
} catch (Throwable ex) {
79113
Logger.printException(() -> "Failed to parse announcement. Fall-backing to raw string", ex);
80114

81115
title = "Announcement";
82116
message = jsonString;
83117
}
84118

85-
// Do not show the announcement, if the last announcement id is the same as the current one.
86-
if (Settings.ANNOUNCEMENT_LAST_ID.get() == id) return;
119+
// If the announcement is archived, do not show it.
120+
if (archivedAt.isBefore(LocalDateTime.now())) {
121+
Settings.ANNOUNCEMENT_LAST_ID.save(id);
122+
return;
123+
}
87124

88125
int finalId = id;
89126
final var finalTitle = title;

extensions/shared/src/main/java/app/revanced/extension/youtube/patches/announcements/requests/AnnouncementsRoutes.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,9 @@
99
import static app.revanced.extension.youtube.requests.Route.Method.GET;
1010

1111
public class AnnouncementsRoutes {
12-
private static final String ANNOUNCEMENTS_PROVIDER = "https://api.revanced.app/v2";
13-
14-
/**
15-
* 'language' parameter is IETF format (for USA it would be 'en-us').
16-
*/
17-
public static final Route GET_LATEST_ANNOUNCEMENT = new Route(GET, "/announcements/youtube/latest?language={language}");
12+
public static final Route GET_LATEST_ANNOUNCEMENTS = new Route(GET, "/announcements/latest?tag=youtube");
13+
public static final Route GET_LATEST_ANNOUNCEMENT_IDS = new Route(GET, "/announcements/latest/id?tag=youtube");
14+
private static final String ANNOUNCEMENTS_PROVIDER = "https://api.revanced.app/v4";
1815

1916
private AnnouncementsRoutes() {
2017
}

0 commit comments

Comments
 (0)