mirror of
https://github.com/YTVanced/Integrations
synced 2024-10-31 16:32:39 +00:00
initial cleanup
This commit is contained in:
parent
ab66defa98
commit
402571a3b8
8 changed files with 410 additions and 318 deletions
|
@ -21,6 +21,8 @@ import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import fi.vanced.libraries.youtube.player.VideoInformation;
|
import fi.vanced.libraries.youtube.player.VideoInformation;
|
||||||
|
import pl.jakubweg.objects.SponsorSegment;
|
||||||
|
import pl.jakubweg.requests.Requester;
|
||||||
|
|
||||||
@SuppressLint({"LongLogTag"})
|
@SuppressLint({"LongLogTag"})
|
||||||
public class PlayerController {
|
public class PlayerController {
|
||||||
|
@ -38,12 +40,9 @@ public class PlayerController {
|
||||||
private static String currentVideoId;
|
private static String currentVideoId;
|
||||||
private static long currentVideoLength = 1L;
|
private static long currentVideoLength = 1L;
|
||||||
private static long lastKnownVideoTime = -1L;
|
private static long lastKnownVideoTime = -1L;
|
||||||
private static final Runnable findAndSkipSegmentRunnable = new Runnable() {
|
private static final Runnable findAndSkipSegmentRunnable = () -> {
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// Log.d(TAG, "findAndSkipSegmentRunnable");
|
// Log.d(TAG, "findAndSkipSegmentRunnable");
|
||||||
findAndSkipSegment(false);
|
findAndSkipSegment(false);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
private static float sponsorBarLeft = 1f;
|
private static float sponsorBarLeft = 1f;
|
||||||
private static float sponsorBarRight = 1f;
|
private static float sponsorBarRight = 1f;
|
||||||
|
@ -121,7 +120,7 @@ public class PlayerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void executeDownloadSegments(String videoId) {
|
public static void executeDownloadSegments(String videoId) {
|
||||||
SponsorSegment[] segments = SponsorBlockUtils.getSegmentsForVideo(videoId);
|
SponsorSegment[] segments = Requester.getSegments(videoId);
|
||||||
Arrays.sort(segments);
|
Arrays.sort(segments);
|
||||||
|
|
||||||
if (VERBOSE)
|
if (VERBOSE)
|
||||||
|
@ -265,15 +264,12 @@ public class PlayerController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void sendViewRequestAsync(final long millis, final SponsorSegment segment) {
|
private static void sendViewRequestAsync(final long millis, final SponsorSegment segment) {
|
||||||
new Thread(new Runnable() {
|
new Thread(() -> {
|
||||||
@Override
|
if (SponsorBlockSettings.countSkips &&
|
||||||
public void run() {
|
segment.category != SponsorBlockSettings.SegmentInfo.Unsubmitted &&
|
||||||
if (SponsorBlockSettings.countSkips &&
|
millis - segment.start < 2000) {
|
||||||
segment.category != SponsorBlockSettings.SegmentInfo.Unsubmitted &&
|
// Only skips from the start should count as a view
|
||||||
millis - segment.start < 2000) {
|
Requester.sendViewCountRequest(segment);
|
||||||
// Only skips from the start should count as a view
|
|
||||||
SponsorBlockUtils.sendViewCountRequest(segment);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
@ -371,13 +367,10 @@ public class PlayerController {
|
||||||
if (VERBOSE)
|
if (VERBOSE)
|
||||||
Log.d(TAG, "addSkipSponsorView15: view=" + view.toString());
|
Log.d(TAG, "addSkipSponsorView15: view=" + view.toString());
|
||||||
|
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
@Override
|
final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) view).getChildAt(2);
|
||||||
public void run() {
|
Activity context = ((Activity) viewGroup.getContext());
|
||||||
final ViewGroup viewGroup = (ViewGroup) ((ViewGroup) view).getChildAt(2);
|
NewSegmentHelperLayout.context = context;
|
||||||
Activity context = ((Activity) viewGroup.getContext());
|
|
||||||
NewSegmentHelperLayout.context = context;
|
|
||||||
}
|
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,13 +378,10 @@ public class PlayerController {
|
||||||
playerActivity = new WeakReference<>((Activity) view.getContext());
|
playerActivity = new WeakReference<>((Activity) view.getContext());
|
||||||
if (VERBOSE)
|
if (VERBOSE)
|
||||||
Log.d(TAG, "addSkipSponsorView14: view=" + view.toString());
|
Log.d(TAG, "addSkipSponsorView14: view=" + view.toString());
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||||||
@Override
|
final ViewGroup viewGroup = (ViewGroup) view.getParent();
|
||||||
public void run() {
|
Activity activity = (Activity) viewGroup.getContext();
|
||||||
final ViewGroup viewGroup = (ViewGroup) view.getParent();
|
NewSegmentHelperLayout.context = activity;
|
||||||
Activity activity = (Activity) viewGroup.getContext();
|
|
||||||
NewSegmentHelperLayout.context = activity;
|
|
||||||
}
|
|
||||||
}, 500);
|
}, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,18 +445,15 @@ public class PlayerController {
|
||||||
Log.d(TAG, String.format("Requesting skip to millis=%d on thread %s", millisecond, Thread.currentThread().toString()));
|
Log.d(TAG, String.format("Requesting skip to millis=%d on thread %s", millisecond, Thread.currentThread().toString()));
|
||||||
|
|
||||||
final long finalMillisecond = millisecond;
|
final long finalMillisecond = millisecond;
|
||||||
new Handler(Looper.getMainLooper()).post(new Runnable() {
|
new Handler(Looper.getMainLooper()).post(() -> {
|
||||||
@Override
|
try {
|
||||||
public void run() {
|
if (VERBOSE)
|
||||||
try {
|
Log.i(TAG, "Skipping to millis=" + finalMillisecond);
|
||||||
if (VERBOSE)
|
lastKnownVideoTime = finalMillisecond;
|
||||||
Log.i(TAG, "Skipping to millis=" + finalMillisecond);
|
VideoInformation.lastKnownVideoTime = lastKnownVideoTime;
|
||||||
lastKnownVideoTime = finalMillisecond;
|
setMillisecondMethod.invoke(currentObj, finalMillisecond);
|
||||||
VideoInformation.lastKnownVideoTime = lastKnownVideoTime;
|
} catch (Exception e) {
|
||||||
setMillisecondMethod.invoke(currentObj, finalMillisecond);
|
Log.e(TAG, "Cannot skip to millisecond", e);
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e(TAG, "Cannot skip to millisecond", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ import android.widget.Toast;
|
||||||
|
|
||||||
import com.google.android.apps.youtube.app.YouTubeTikTokRoot_Application;
|
import com.google.android.apps.youtube.app.YouTubeTikTokRoot_Application;
|
||||||
|
|
||||||
|
import pl.jakubweg.objects.SponsorSegment;
|
||||||
|
|
||||||
import static fi.vanced.libraries.youtube.sponsors.player.ui.SponsorBlockView.hideSkipButton;
|
import static fi.vanced.libraries.youtube.sponsors.player.ui.SponsorBlockView.hideSkipButton;
|
||||||
import static fi.vanced.libraries.youtube.sponsors.player.ui.SponsorBlockView.showSkipButton;
|
import static fi.vanced.libraries.youtube.sponsors.player.ui.SponsorBlockView.showSkipButton;
|
||||||
import static pl.jakubweg.PlayerController.VERBOSE;
|
import static pl.jakubweg.PlayerController.VERBOSE;
|
||||||
|
|
|
@ -25,10 +25,6 @@ public class SponsorBlockSettings {
|
||||||
public static final String PREFERENCES_KEY_SEEN_GUIDELINES = "sb-seen-gl";
|
public static final String PREFERENCES_KEY_SEEN_GUIDELINES = "sb-seen-gl";
|
||||||
public static final String PREFERENCES_KEY_NEW_SEGMENT_ENABLED = "sb-new-segment-enabled";
|
public static final String PREFERENCES_KEY_NEW_SEGMENT_ENABLED = "sb-new-segment-enabled";
|
||||||
public static final String PREFERENCES_KEY_VOTING_ENABLED = "sb-voting-enabled";
|
public static final String PREFERENCES_KEY_VOTING_ENABLED = "sb-voting-enabled";
|
||||||
public static final String sponsorBlockSkipSegmentsUrl = "https://sponsor.ajay.app/api/skipSegments";
|
|
||||||
public static final String sponsorBlockViewedUrl = "https://sponsor.ajay.app/api/viewedVideoSponsorTime";
|
|
||||||
public static final String sponsorBlockVoteUrl = "https://sponsor.ajay.app/api/voteOnSponsorTime";
|
|
||||||
|
|
||||||
|
|
||||||
public static final SegmentBehaviour DefaultBehaviour = SegmentBehaviour.SkipAutomatically;
|
public static final SegmentBehaviour DefaultBehaviour = SegmentBehaviour.SkipAutomatically;
|
||||||
|
|
||||||
|
@ -48,22 +44,6 @@ public class SponsorBlockSettings {
|
||||||
Log.e("jakubweg.Settings", "Do not call SponsorBlockSettings constructor!");
|
Log.e("jakubweg.Settings", "Do not call SponsorBlockSettings constructor!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSponsorBlockUrlWithCategories(String videoId) {
|
|
||||||
return sponsorBlockSkipSegmentsUrl + "?videoID=" + videoId + "&categories=" + sponsorBlockUrlCategories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getSponsorBlockViewedUrl(String UUID) {
|
|
||||||
return sponsorBlockViewedUrl + "?UUID=" + UUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getSponsorBlockVoteUrl(String uuid, String userId, int type) {
|
|
||||||
return sponsorBlockVoteUrl + "?UUID=" + uuid + "&userID=" + userId + "&type=" + type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getSponsorBlockVoteUrl(String uuid, String userId, String category) {
|
|
||||||
return sponsorBlockVoteUrl + "?UUID=" + uuid + "&userID=" + userId + "&category=" + category;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SharedPreferences getPreferences(Context context) {
|
public static SharedPreferences getPreferences(Context context) {
|
||||||
return context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
|
return context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,9 @@ import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
import pl.jakubweg.objects.SponsorSegment;
|
||||||
|
import pl.jakubweg.requests.Requester;
|
||||||
|
|
||||||
import static android.view.View.GONE;
|
import static android.view.View.GONE;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
import static fi.razerman.youtube.XGlobals.debug;
|
import static fi.razerman.youtube.XGlobals.debug;
|
||||||
|
@ -39,10 +42,9 @@ import static pl.jakubweg.PlayerController.VERBOSE;
|
||||||
import static pl.jakubweg.PlayerController.getCurrentVideoId;
|
import static pl.jakubweg.PlayerController.getCurrentVideoId;
|
||||||
import static pl.jakubweg.PlayerController.getLastKnownVideoTime;
|
import static pl.jakubweg.PlayerController.getLastKnownVideoTime;
|
||||||
import static pl.jakubweg.PlayerController.sponsorSegmentsOfCurrentVideo;
|
import static pl.jakubweg.PlayerController.sponsorSegmentsOfCurrentVideo;
|
||||||
import static pl.jakubweg.SponsorBlockSettings.getSponsorBlockVoteUrl;
|
|
||||||
import static pl.jakubweg.SponsorBlockSettings.sponsorBlockSkipSegmentsUrl;
|
|
||||||
import static pl.jakubweg.SponsorBlockSettings.uuid;
|
import static pl.jakubweg.SponsorBlockSettings.uuid;
|
||||||
import static pl.jakubweg.StringRef.str;
|
import static pl.jakubweg.StringRef.str;
|
||||||
|
import static pl.jakubweg.requests.Requester.voteForSegment;
|
||||||
|
|
||||||
@SuppressWarnings({"LongLogTag"})
|
@SuppressWarnings({"LongLogTag"})
|
||||||
public abstract class SponsorBlockUtils {
|
public abstract class SponsorBlockUtils {
|
||||||
|
@ -51,23 +53,17 @@ public abstract class SponsorBlockUtils {
|
||||||
@SuppressLint("SimpleDateFormat")
|
@SuppressLint("SimpleDateFormat")
|
||||||
public static final SimpleDateFormat dateFormatter = new SimpleDateFormat(DATE_FORMAT);
|
public static final SimpleDateFormat dateFormatter = new SimpleDateFormat(DATE_FORMAT);
|
||||||
private static final int sponsorBtnId = 1234;
|
private static final int sponsorBtnId = 1234;
|
||||||
public static final View.OnClickListener sponsorBlockBtnListener = new View.OnClickListener() {
|
public static final View.OnClickListener sponsorBlockBtnListener = v -> {
|
||||||
@Override
|
if (debug) {
|
||||||
public void onClick(View v) {
|
Log.d(TAG, "Shield button clicked");
|
||||||
if (debug) {
|
|
||||||
Log.d(TAG, "Shield button clicked");
|
|
||||||
}
|
|
||||||
NewSegmentHelperLayout.toggle();
|
|
||||||
}
|
}
|
||||||
|
NewSegmentHelperLayout.toggle();
|
||||||
};
|
};
|
||||||
public static final View.OnClickListener voteButtonListener = new View.OnClickListener() {
|
public static final View.OnClickListener voteButtonListener = v -> {
|
||||||
@Override
|
if (debug) {
|
||||||
public void onClick(View v) {
|
Log.d(TAG, "Vote button clicked");
|
||||||
if (debug) {
|
|
||||||
Log.d(TAG, "Vote button clicked");
|
|
||||||
}
|
|
||||||
SponsorBlockUtils.onVotingClicked(v.getContext());
|
|
||||||
}
|
}
|
||||||
|
SponsorBlockUtils.onVotingClicked(v.getContext());
|
||||||
};
|
};
|
||||||
private static int shareBtnId = -1;
|
private static int shareBtnId = -1;
|
||||||
private static long newSponsorSegmentDialogShownMillis;
|
private static long newSponsorSegmentDialogShownMillis;
|
||||||
|
@ -158,134 +154,88 @@ public abstract class SponsorBlockUtils {
|
||||||
new Thread(submitRunnable).start();
|
new Thread(submitRunnable).start();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
private static String messageToToast = "";
|
public static String messageToToast = "";
|
||||||
private static EditByHandSaveDialogListener editByHandSaveDialogListener = new EditByHandSaveDialogListener();
|
private static final EditByHandSaveDialogListener editByHandSaveDialogListener = new EditByHandSaveDialogListener();
|
||||||
private static final DialogInterface.OnClickListener editByHandDialogListener = new DialogInterface.OnClickListener() {
|
private static final DialogInterface.OnClickListener editByHandDialogListener = (dialog, which) -> {
|
||||||
@SuppressLint("DefaultLocale")
|
Context context = ((AlertDialog) dialog).getContext();
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
Context context = ((AlertDialog) dialog).getContext();
|
|
||||||
|
|
||||||
final boolean isStart = DialogInterface.BUTTON_NEGATIVE == which;
|
final boolean isStart = DialogInterface.BUTTON_NEGATIVE == which;
|
||||||
|
|
||||||
final EditText textView = new EditText(context);
|
final EditText textView = new EditText(context);
|
||||||
textView.setHint(DATE_FORMAT);
|
textView.setHint(DATE_FORMAT);
|
||||||
if (isStart) {
|
if (isStart) {
|
||||||
if (newSponsorSegmentStartMillis >= 0)
|
if (newSponsorSegmentStartMillis >= 0)
|
||||||
textView.setText(dateFormatter.format(new Date(newSponsorSegmentStartMillis)));
|
textView.setText(dateFormatter.format(new Date(newSponsorSegmentStartMillis)));
|
||||||
} else {
|
} else {
|
||||||
if (newSponsorSegmentEndMillis >= 0)
|
if (newSponsorSegmentEndMillis >= 0)
|
||||||
textView.setText(dateFormatter.format(new Date(newSponsorSegmentEndMillis)));
|
textView.setText(dateFormatter.format(new Date(newSponsorSegmentEndMillis)));
|
||||||
}
|
|
||||||
|
|
||||||
editByHandSaveDialogListener.settingStart = isStart;
|
|
||||||
editByHandSaveDialogListener.editText = new WeakReference<>(textView);
|
|
||||||
new AlertDialog.Builder(context)
|
|
||||||
.setTitle(str(isStart ? "new_segment_time_start" : "new_segment_time_end"))
|
|
||||||
.setView(textView)
|
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
|
||||||
.setNeutralButton(str("new_segment_now"), editByHandSaveDialogListener)
|
|
||||||
.setPositiveButton(android.R.string.ok, editByHandSaveDialogListener)
|
|
||||||
.show();
|
|
||||||
|
|
||||||
dialog.dismiss();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editByHandSaveDialogListener.settingStart = isStart;
|
||||||
|
editByHandSaveDialogListener.editText = new WeakReference<>(textView);
|
||||||
|
new AlertDialog.Builder(context)
|
||||||
|
.setTitle(str(isStart ? "new_segment_time_start" : "new_segment_time_end"))
|
||||||
|
.setView(textView)
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.setNeutralButton(str("new_segment_now"), editByHandSaveDialogListener)
|
||||||
|
.setPositiveButton(android.R.string.ok, editByHandSaveDialogListener)
|
||||||
|
.show();
|
||||||
|
|
||||||
|
dialog.dismiss();
|
||||||
};
|
};
|
||||||
private static final DialogInterface.OnClickListener segmentVoteClickListener = new DialogInterface.OnClickListener() {
|
private static final Runnable toastRunnable = () -> {
|
||||||
@Override
|
Context context = appContext.get();
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
if (context != null && messageToToast != null)
|
||||||
final Context context = ((AlertDialog) dialog).getContext();
|
Toast.makeText(context, messageToToast, Toast.LENGTH_LONG).show();
|
||||||
final SponsorSegment segment = sponsorSegmentsOfCurrentVideo[which];
|
|
||||||
|
|
||||||
final VoteOption[] voteOptions = VoteOption.values();
|
|
||||||
String[] items = new String[voteOptions.length];
|
|
||||||
|
|
||||||
for (int i = 0; i < voteOptions.length; i++) {
|
|
||||||
items[i] = voteOptions[i].title;
|
|
||||||
}
|
|
||||||
|
|
||||||
new AlertDialog.Builder(context)
|
|
||||||
.setItems(items, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
appContext = new WeakReference<>(context.getApplicationContext());
|
|
||||||
switch (voteOptions[which]) {
|
|
||||||
case UPVOTE:
|
|
||||||
voteForSegment(segment, VoteOption.UPVOTE);
|
|
||||||
break;
|
|
||||||
case DOWNVOTE:
|
|
||||||
voteForSegment(segment, VoteOption.DOWNVOTE);
|
|
||||||
break;
|
|
||||||
case CATEGORY_CHANGE:
|
|
||||||
onNewCategorySelect(segment, context);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.show();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
private static Runnable toastRunnable = new Runnable() {
|
private static final DialogInterface.OnClickListener segmentVoteClickListener = (dialog, which) -> {
|
||||||
@Override
|
final Context context = ((AlertDialog) dialog).getContext();
|
||||||
public void run() {
|
final SponsorSegment segment = sponsorSegmentsOfCurrentVideo[which];
|
||||||
Context context = appContext.get();
|
|
||||||
if (context != null && messageToToast != null)
|
final VoteOption[] voteOptions = VoteOption.values();
|
||||||
Toast.makeText(context, messageToToast, Toast.LENGTH_LONG).show();
|
String[] items = new String[voteOptions.length];
|
||||||
|
|
||||||
|
for (int i = 0; i < voteOptions.length; i++) {
|
||||||
|
items[i] = voteOptions[i].title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
new AlertDialog.Builder(context)
|
||||||
|
.setItems(items, (dialog1, which1) -> {
|
||||||
|
appContext = new WeakReference<>(context.getApplicationContext());
|
||||||
|
switch (voteOptions[which1]) {
|
||||||
|
case UPVOTE:
|
||||||
|
voteForSegment(segment, VoteOption.UPVOTE, appContext.get(), toastRunnable);
|
||||||
|
break;
|
||||||
|
case DOWNVOTE:
|
||||||
|
voteForSegment(segment, VoteOption.DOWNVOTE, appContext.get(), toastRunnable);
|
||||||
|
break;
|
||||||
|
case CATEGORY_CHANGE:
|
||||||
|
onNewCategorySelect(segment, context);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();
|
||||||
};
|
};
|
||||||
private static final Runnable submitRunnable = new Runnable() {
|
private static final Runnable submitRunnable = () -> {
|
||||||
@Override
|
messageToToast = null;
|
||||||
public void run() {
|
final String uuid = SponsorBlockSettings.uuid;
|
||||||
messageToToast = null;
|
final long start = newSponsorSegmentStartMillis;
|
||||||
final String uuid = SponsorBlockSettings.uuid;
|
final long end = newSponsorSegmentEndMillis;
|
||||||
final long start = newSponsorSegmentStartMillis;
|
final String videoId = getCurrentVideoId();
|
||||||
final long end = newSponsorSegmentEndMillis;
|
final SponsorBlockSettings.SegmentInfo segmentType = SponsorBlockUtils.newSponsorBlockSegmentType;
|
||||||
final String videoId = getCurrentVideoId();
|
try {
|
||||||
final SponsorBlockSettings.SegmentInfo segmentType = SponsorBlockUtils.newSponsorBlockSegmentType;
|
if (start < 0 || end < 0 || start >= end || segmentType == null || videoId == null || uuid == null) {
|
||||||
try {
|
Log.e(TAG, "Unable to submit times, invalid parameters");
|
||||||
|
return;
|
||||||
if (start < 0 || end < 0 || start >= end || segmentType == null || videoId == null || uuid == null) {
|
|
||||||
Log.e(TAG, "Unable to submit times, invalid parameters");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
URL url = new URL(String.format(Locale.US,
|
|
||||||
sponsorBlockSkipSegmentsUrl + "?videoID=%s&userID=%s&startTime=%.3f&endTime=%.3f&category=%s",
|
|
||||||
videoId, uuid, ((float) start) / 1000f, ((float) end) / 1000f, segmentType.key));
|
|
||||||
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
||||||
connection.setRequestMethod("POST");
|
|
||||||
switch (connection.getResponseCode()) {
|
|
||||||
default:
|
|
||||||
messageToToast = String.format(str("submit_failed_unknown_error"), connection.getResponseCode(), connection.getResponseMessage());
|
|
||||||
break;
|
|
||||||
case 429:
|
|
||||||
messageToToast = str("submit_failed_rate_limit");
|
|
||||||
break;
|
|
||||||
case 403:
|
|
||||||
messageToToast = str("submit_failed_forbidden");
|
|
||||||
break;
|
|
||||||
case 409:
|
|
||||||
messageToToast = str("submit_failed_duplicate");
|
|
||||||
break;
|
|
||||||
case 200:
|
|
||||||
messageToToast = str("submit_succeeded");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.i(TAG, "Segment submitted with status: " + connection.getResponseCode() + ", " + messageToToast);
|
|
||||||
new Handler(Looper.getMainLooper()).post(toastRunnable);
|
|
||||||
|
|
||||||
connection.disconnect();
|
|
||||||
|
|
||||||
newSponsorSegmentEndMillis = newSponsorSegmentStartMillis = -1;
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e(TAG, "Unable to submit segment", e);
|
|
||||||
}
|
}
|
||||||
|
Requester.submitSegments(videoId, uuid, ((float) start) / 1000f, ((float) end) / 1000f, segmentType.key, toastRunnable);
|
||||||
if (videoId != null)
|
newSponsorSegmentEndMillis = newSponsorSegmentStartMillis = -1;
|
||||||
PlayerController.executeDownloadSegments(videoId);
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "Unable to submit segment", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (videoId != null)
|
||||||
|
PlayerController.executeDownloadSegments(videoId);
|
||||||
};
|
};
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
@ -398,12 +348,7 @@ public abstract class SponsorBlockUtils {
|
||||||
|
|
||||||
new AlertDialog.Builder(context)
|
new AlertDialog.Builder(context)
|
||||||
.setTitle(str("new_segment_choose_category"))
|
.setTitle(str("new_segment_choose_category"))
|
||||||
.setItems(titles, new DialogInterface.OnClickListener() {
|
.setItems(titles, (dialog, which) -> voteForSegment(segment, VoteOption.CATEGORY_CHANGE, appContext.get(), toastRunnable, values[which].key))
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
voteForSegment(segment, VoteOption.CATEGORY_CHANGE, values[which].key);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,121 +393,7 @@ public abstract class SponsorBlockUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized static SponsorSegment[] getSegmentsForVideo(String videoId) {
|
public enum VoteOption {
|
||||||
newSponsorSegmentEndMillis = newSponsorSegmentStartMillis = -1;
|
|
||||||
|
|
||||||
ArrayList<SponsorSegment> sponsorSegments = new ArrayList<>();
|
|
||||||
try {
|
|
||||||
if (VERBOSE)
|
|
||||||
Log.i(TAG, "Trying to download segments for videoId=" + videoId);
|
|
||||||
|
|
||||||
URL url = new URL(SponsorBlockSettings.getSponsorBlockUrlWithCategories(videoId));
|
|
||||||
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
||||||
switch (connection.getResponseCode()) {
|
|
||||||
default:
|
|
||||||
Log.e(TAG, "Unable to download segments: Status: " + connection.getResponseCode() + " " + connection.getResponseMessage());
|
|
||||||
break;
|
|
||||||
case 404:
|
|
||||||
Log.w(TAG, "No segments for this video (ERR404)");
|
|
||||||
break;
|
|
||||||
case 200:
|
|
||||||
if (VERBOSE)
|
|
||||||
Log.i(TAG, "Received status 200 OK, parsing response...");
|
|
||||||
|
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
|
||||||
String line;
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
stringBuilder.append(line);
|
|
||||||
}
|
|
||||||
connection.getInputStream().close();
|
|
||||||
|
|
||||||
|
|
||||||
JSONArray responseArray = new JSONArray(stringBuilder.toString());
|
|
||||||
int length = responseArray.length();
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
JSONObject obj = ((JSONObject) responseArray.get(i));
|
|
||||||
JSONArray segments = obj.getJSONArray("segment");
|
|
||||||
long start = (long) (segments.getDouble(0) * 1000);
|
|
||||||
long end = (long) (segments.getDouble(1) * 1000);
|
|
||||||
String category = obj.getString("category");
|
|
||||||
String UUID = obj.getString("UUID");
|
|
||||||
|
|
||||||
SponsorBlockSettings.SegmentInfo segmentCategory = SponsorBlockSettings.SegmentInfo.byCategoryKey(category);
|
|
||||||
if (segmentCategory != null && segmentCategory.behaviour.showOnTimeBar) {
|
|
||||||
SponsorSegment segment = new SponsorSegment(start, end, segmentCategory, UUID);
|
|
||||||
sponsorSegments.add(segment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VERBOSE)
|
|
||||||
Log.v(TAG, "Parsing done");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
connection.disconnect();
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e(TAG, "download segments failed", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return sponsorSegments.toArray(new SponsorSegment[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void sendViewCountRequest(SponsorSegment segment) {
|
|
||||||
try {
|
|
||||||
URL url = new URL(SponsorBlockSettings.getSponsorBlockViewedUrl(segment.UUID));
|
|
||||||
|
|
||||||
Log.d("sponsorblock", "requesting: " + url.getPath());
|
|
||||||
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
||||||
connection.setRequestMethod("POST");
|
|
||||||
connection.disconnect();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void voteForSegment(SponsorSegment segment, VoteOption voteOption, String... args) {
|
|
||||||
messageToToast = null;
|
|
||||||
try {
|
|
||||||
String voteUrl = voteOption == VoteOption.CATEGORY_CHANGE
|
|
||||||
? getSponsorBlockVoteUrl(segment.UUID, uuid, args[0])
|
|
||||||
: getSponsorBlockVoteUrl(segment.UUID, uuid, voteOption == VoteOption.UPVOTE ? 1 : 0);
|
|
||||||
URL url = new URL(voteUrl);
|
|
||||||
|
|
||||||
Toast.makeText(appContext.get(), str("vote_started"), Toast.LENGTH_SHORT).show();
|
|
||||||
Log.d("sponsorblock", "requesting: " + url.getPath());
|
|
||||||
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
||||||
connection.setRequestMethod("POST");
|
|
||||||
|
|
||||||
switch (connection.getResponseCode()) {
|
|
||||||
default:
|
|
||||||
messageToToast = String.format(str("vote_failed_unknown_error"), connection.getResponseCode(), connection.getResponseMessage());
|
|
||||||
break;
|
|
||||||
case 429:
|
|
||||||
messageToToast = str("vote_failed_rate_limit");
|
|
||||||
break;
|
|
||||||
case 403:
|
|
||||||
messageToToast = str("vote_failed_forbidden");
|
|
||||||
break;
|
|
||||||
case 200:
|
|
||||||
messageToToast = str("vote_succeeded");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.i(TAG, "Voted for segment with status: " + connection.getResponseCode() + ", " + messageToToast);
|
|
||||||
new Handler(Looper.getMainLooper()).post(toastRunnable);
|
|
||||||
|
|
||||||
connection.disconnect();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private enum VoteOption {
|
|
||||||
UPVOTE(str("vote_upvote")),
|
UPVOTE(str("vote_upvote")),
|
||||||
DOWNVOTE(str("vote_downvote")),
|
DOWNVOTE(str("vote_downvote")),
|
||||||
CATEGORY_CHANGE(str("vote_category"));
|
CATEGORY_CHANGE(str("vote_category"));
|
||||||
|
@ -606,4 +437,14 @@ public abstract class SponsorBlockUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int countMatches(CharSequence seq, char c)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < seq.length(); i++) {
|
||||||
|
if (seq.charAt(i) == c)
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
package pl.jakubweg;
|
package pl.jakubweg.objects;
|
||||||
|
|
||||||
|
import pl.jakubweg.SponsorBlockSettings;
|
||||||
|
|
||||||
public class SponsorSegment implements Comparable<SponsorSegment> {
|
public class SponsorSegment implements Comparable<SponsorSegment> {
|
||||||
public final long start;
|
public final long start;
|
31
app/src/main/java/pl/jakubweg/objects/UserStats.java
Normal file
31
app/src/main/java/pl/jakubweg/objects/UserStats.java
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package pl.jakubweg.objects;
|
||||||
|
|
||||||
|
public class UserStats {
|
||||||
|
private final String userName;
|
||||||
|
private final double minutesSaved;
|
||||||
|
private final int segmentCount;
|
||||||
|
private final int viewCount;
|
||||||
|
|
||||||
|
public UserStats(String userName, double minutesSaved, int segmentCount, int viewCount) {
|
||||||
|
this.userName = userName;
|
||||||
|
this.minutesSaved = minutesSaved;
|
||||||
|
this.segmentCount = segmentCount;
|
||||||
|
this.viewCount = viewCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getMinutesSaved() {
|
||||||
|
return minutesSaved;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSegmentCount() {
|
||||||
|
return segmentCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getViewCount() {
|
||||||
|
return viewCount;
|
||||||
|
}
|
||||||
|
}
|
176
app/src/main/java/pl/jakubweg/requests/Requester.java
Normal file
176
app/src/main/java/pl/jakubweg/requests/Requester.java
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
package pl.jakubweg.requests;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import pl.jakubweg.SponsorBlockSettings;
|
||||||
|
import pl.jakubweg.SponsorBlockUtils;
|
||||||
|
import pl.jakubweg.SponsorBlockUtils.VoteOption;
|
||||||
|
import pl.jakubweg.objects.SponsorSegment;
|
||||||
|
import pl.jakubweg.objects.UserStats;
|
||||||
|
|
||||||
|
import static pl.jakubweg.StringRef.str;
|
||||||
|
|
||||||
|
public class Requester {
|
||||||
|
private static final String SPONSORBLOCK_API_URL = "https://sponsor.ajay.app/api/";
|
||||||
|
private static final String TIME_TEMPLATE = "%.3f";
|
||||||
|
|
||||||
|
private Requester() {}
|
||||||
|
|
||||||
|
public static synchronized SponsorSegment[] getSegments(String videoId) {
|
||||||
|
List<SponsorSegment> segments = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
HttpURLConnection connection = getConnectionFromRoute(Route.GET_SEGMENTS, videoId);
|
||||||
|
int responseCode = connection.getResponseCode();
|
||||||
|
|
||||||
|
switch (responseCode) {
|
||||||
|
case 200:
|
||||||
|
JSONArray responseArray = new JSONArray(parseJson(connection));
|
||||||
|
int length = responseArray.length();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
JSONObject obj = ((JSONObject) responseArray.get(i));
|
||||||
|
JSONArray segment = obj.getJSONArray("segment");
|
||||||
|
long start = (long) (segment.getDouble(0) * 1000);
|
||||||
|
long end = (long) (segment.getDouble(1) * 1000);
|
||||||
|
String category = obj.getString("category");
|
||||||
|
String uuid = obj.getString("UUID");
|
||||||
|
|
||||||
|
SponsorBlockSettings.SegmentInfo segmentCategory = SponsorBlockSettings.SegmentInfo.byCategoryKey(category);
|
||||||
|
if (segmentCategory != null && segmentCategory.behaviour.showOnTimeBar) {
|
||||||
|
SponsorSegment sponsorSegment = new SponsorSegment(start, end, segmentCategory, uuid);
|
||||||
|
segments.add(sponsorSegment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 404:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return segments.toArray(new SponsorSegment[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void submitSegments(String videoId, String uuid, float startTime, float endTime, String category, Runnable toastRunnable) {
|
||||||
|
try {
|
||||||
|
String start = String.format(TIME_TEMPLATE, startTime);
|
||||||
|
String end = String.format(TIME_TEMPLATE, endTime);
|
||||||
|
HttpURLConnection connection = getConnectionFromRoute(Route.SUBMIT_SEGMENTS, videoId, uuid, start, end, category);
|
||||||
|
int responseCode = connection.getResponseCode();
|
||||||
|
|
||||||
|
switch (responseCode) {
|
||||||
|
case 200:
|
||||||
|
SponsorBlockUtils.messageToToast = str("submit_succeeded");
|
||||||
|
break;
|
||||||
|
case 409:
|
||||||
|
SponsorBlockUtils.messageToToast = str("submit_failed_duplicate");
|
||||||
|
break;
|
||||||
|
case 403:
|
||||||
|
SponsorBlockUtils.messageToToast = str("submit_failed_forbidden");
|
||||||
|
break;
|
||||||
|
case 429:
|
||||||
|
SponsorBlockUtils.messageToToast = str("submit_failed_rate_limit");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
new Handler(Looper.getMainLooper()).post(toastRunnable);
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendViewCountRequest(SponsorSegment segment) {
|
||||||
|
try {
|
||||||
|
HttpURLConnection connection = getConnectionFromRoute(Route.VIEWED_SEGMENT, segment.UUID);
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void voteForSegment(SponsorSegment segment, VoteOption voteOption, Context context, Runnable toastRunnable, String... args) {
|
||||||
|
try {
|
||||||
|
String segmentUuid = segment.UUID;
|
||||||
|
String uuid = SponsorBlockSettings.uuid;
|
||||||
|
String vote = Integer.toString(voteOption == VoteOption.UPVOTE ? 1 : 0);
|
||||||
|
|
||||||
|
Toast.makeText(context, str("vote_started"), Toast.LENGTH_SHORT).show();
|
||||||
|
|
||||||
|
HttpURLConnection connection = voteOption == VoteOption.CATEGORY_CHANGE
|
||||||
|
? getConnectionFromRoute(Route.VOTE_ON_SEGMENT_CATEGORY, segmentUuid, uuid, args[0])
|
||||||
|
: getConnectionFromRoute(Route.VOTE_ON_SEGMENT_QUALITY, segmentUuid, uuid, vote);
|
||||||
|
int responseCode = connection.getResponseCode();
|
||||||
|
|
||||||
|
switch (responseCode) {
|
||||||
|
case 200:
|
||||||
|
SponsorBlockUtils.messageToToast = str("vote_succeeded");
|
||||||
|
break;
|
||||||
|
case 403:
|
||||||
|
SponsorBlockUtils.messageToToast = str("vote_failed_forbidden");
|
||||||
|
break;
|
||||||
|
case 429:
|
||||||
|
SponsorBlockUtils.messageToToast = str("vote_failed_rate_limit");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SponsorBlockUtils.messageToToast = String.format(str("vote_failed_unknown_error"), responseCode, connection.getResponseMessage());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
new Handler(Looper.getMainLooper()).post(toastRunnable);
|
||||||
|
connection.disconnect();
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UserStats getUserStats() {
|
||||||
|
try {
|
||||||
|
HttpURLConnection connection = getConnectionFromRoute(Route.GET_USER_STATS, SponsorBlockSettings.uuid);
|
||||||
|
JSONObject json = new JSONObject(parseJson(connection));
|
||||||
|
connection.disconnect();
|
||||||
|
return new UserStats(json.getString("userName"), json.getDouble("minutesSaved"), json.getInt("segmentCount"),
|
||||||
|
json.getInt("viewCount"));
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
return new UserStats("", 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static HttpURLConnection getConnectionFromRoute(Route route, String... params) throws IOException {
|
||||||
|
String url = SPONSORBLOCK_API_URL + route.compile(params).getCompiledRoute();
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||||
|
connection.setRequestMethod(route.getMethod().name());
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String parseJson(HttpURLConnection connection) throws IOException {
|
||||||
|
StringBuilder jsonBuilder = new StringBuilder();
|
||||||
|
InputStream inputStream = connection.getInputStream();
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
jsonBuilder.append(line);
|
||||||
|
}
|
||||||
|
inputStream.close();
|
||||||
|
return jsonBuilder.toString();
|
||||||
|
}
|
||||||
|
}
|
73
app/src/main/java/pl/jakubweg/requests/Route.java
Normal file
73
app/src/main/java/pl/jakubweg/requests/Route.java
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
package pl.jakubweg.requests;
|
||||||
|
|
||||||
|
import pl.jakubweg.SponsorBlockUtils;
|
||||||
|
|
||||||
|
import static pl.jakubweg.requests.Route.Method.*;
|
||||||
|
|
||||||
|
public class Route {
|
||||||
|
public static final Route GET_SEGMENTS = new Route(GET, "skipSegments?videoID={video_id}&categories={categories}");
|
||||||
|
public static final Route VIEWED_SEGMENT = new Route(POST, "viewedVideoSponsorTime?UUID={segment_id}");
|
||||||
|
public static final Route GET_USER_STATS = new Route(GET, "userInfo");
|
||||||
|
public static final Route SUBMIT_SEGMENTS = new Route(POST, "skipSegments?videoID={video_id}&userID={user_id}&startTime={start_time}&endTime={end_time}&category={category}");
|
||||||
|
public static final Route VOTE_ON_SEGMENT_QUALITY = new Route(POST, "voteOnSponsorTime?UUID={segment_id}&userID={user_id}&type={type}");
|
||||||
|
public static final Route VOTE_ON_SEGMENT_CATEGORY = new Route(POST, "voteOnSponsorTime?UUID={segment_id}&userID={user_id}&category={category}");
|
||||||
|
|
||||||
|
private final String route;
|
||||||
|
private final Method method;
|
||||||
|
private final int paramCount;
|
||||||
|
|
||||||
|
private Route(Method method, String route) {
|
||||||
|
this.method = method;
|
||||||
|
this.route = route;
|
||||||
|
this.paramCount = SponsorBlockUtils.countMatches(route, '{');
|
||||||
|
|
||||||
|
if (paramCount != SponsorBlockUtils.countMatches(route, '}'))
|
||||||
|
throw new IllegalArgumentException("Not enough parameters");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Method getMethod() {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompiledRoute compile(String... params)
|
||||||
|
{
|
||||||
|
if (params.length != paramCount)
|
||||||
|
throw new IllegalArgumentException("Error Compiling Route: [" + route + "], incorrect amount of parameters provided." +
|
||||||
|
"Expected: " + paramCount + ", Provided: " + params.length);
|
||||||
|
|
||||||
|
StringBuilder compiledRoute = new StringBuilder(route);
|
||||||
|
for (int i = 0; i < paramCount; i++) {
|
||||||
|
int paramStart = compiledRoute.indexOf("{");
|
||||||
|
int paramEnd = compiledRoute.indexOf("}");
|
||||||
|
compiledRoute.replace(paramStart, paramEnd + 1, params[i]);
|
||||||
|
}
|
||||||
|
return new CompiledRoute(this, compiledRoute.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CompiledRoute {
|
||||||
|
private final Route baseRoute;
|
||||||
|
private final String compiledRoute;
|
||||||
|
|
||||||
|
private CompiledRoute(Route baseRoute, String compiledRoute) {
|
||||||
|
this.baseRoute = baseRoute;
|
||||||
|
this.compiledRoute = compiledRoute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Route getBaseRoute() {
|
||||||
|
return baseRoute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCompiledRoute() {
|
||||||
|
return compiledRoute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Method getMethod() {
|
||||||
|
return baseRoute.method;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Method {
|
||||||
|
GET,
|
||||||
|
POST
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue