Files
main/Tweaks/iSponsorBlock/SponsorBlockRequest.m
2023-06-27 09:54:41 +02:00

157 lines
9.7 KiB
Objective-C

#import "Headers/SponsorBlockRequest.h"
#import "Headers/Localization.h"
@implementation SponsorBlockRequest
+ (void)getSponsorTimes:(NSString *)videoID completionTarget:(id)target completionSelector:(SEL)sel apiInstance:(NSString *)apiInstance {
__block NSMutableArray *skipSegments = [NSMutableArray array];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
NSString *categories = @"[%22sponsor%22,%20%22intro%22,%20%22outro%22,%20%22interaction%22,%20%22selfpromo%22,%20%22music_offtopic%22]";
//NSString *categories = @"[%22sponsor%22,%20%22intro%22,%20%22outro%22,%20%22interaction%22,%20%22selfpromo%22,%20%22music_offtopic%22,%20%22preview%22,%20%22filler%22]";
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/skipSegments?videoID=%@&categories=%@", apiInstance, videoID, categories]]];
request.HTTPMethod = @"GET";
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data != nil && error == nil) {
NSArray *jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSMutableArray *segments = [NSMutableArray array];
for (NSDictionary *dict in jsonData) {
SponsorSegment *segment = [[SponsorSegment alloc] initWithStartTime:[[dict objectForKey:@"segment"][0] floatValue] endTime:[[dict objectForKey:@"segment"][1] floatValue] category:(NSString *)[dict objectForKey:@"category"] UUID:(NSString *)[dict objectForKey:@"UUID"]];
[segments addObject:segment];
}
skipSegments = [segments sortedArrayUsingComparator:^NSComparisonResult(SponsorSegment *a, SponsorSegment *b) {
NSNumber *first = @(a.startTime);
NSNumber *second = @(b.startTime);
return [first compare:second];
}].mutableCopy;
NSMutableArray *seekBarSegments = skipSegments.mutableCopy;
for (SponsorSegment *segment in skipSegments.copy) {
NSInteger setting = [[kCategorySettings objectForKey:segment.category] intValue];
switch (setting) {
case 0:
[skipSegments removeObject:segment];
[seekBarSegments removeObject:segment];
break;
case 2:
[skipSegments removeObject:segment];
break;
//only leaves the object in seekBarSegments so it appears in the seek bar but doesn't get skipped
default:
break;
}
if (segment.endTime - segment.startTime < kMinimumDuration) {
[skipSegments removeObject:segment];
[seekBarSegments removeObject:segment];
}
}
[target performSelectorOnMainThread:sel withObject:skipSegments waitUntilDone:NO];
if ([target isKindOfClass:objc_getClass("YTPlayerViewController")]) {
YTPlayerViewController *playerViewController = (YTPlayerViewController *)target;
YTPlayerView *playerView = (YTPlayerView *)playerViewController.view;
YTMainAppVideoPlayerOverlayView *overlayView = (YTMainAppVideoPlayerOverlayView *)playerView.overlayView;
if ([overlayView isKindOfClass:objc_getClass("YTMainAppVideoPlayerOverlayView")]) {
if (overlayView.playerBar.playerBar) {
[overlayView.playerBar.playerBar performSelectorOnMainThread:@selector(setSkipSegments:) withObject:seekBarSegments waitUntilDone:NO];
}
else {
[overlayView.playerBar.segmentablePlayerBar performSelectorOnMainThread:@selector(setSkipSegments:) withObject:seekBarSegments waitUntilDone:NO];
}
}
}
}
}];
[dataTask resume];
}
+ (void)postSponsorTimes:(NSString *)videoID sponsorSegments:(NSArray <SponsorSegment *> *)segments userID:(NSString *)userID withViewController:(UIViewController *)viewController {
for (SponsorSegment *segment in segments) {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://sponsor.ajay.app/api/skipSegments?videoID=%@&startTime=%f&endTime=%f&category=%@&userID=%@", videoID, segment.startTime, segment.endTime, segment.category, userID]]];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *URLResponse = (NSHTTPURLResponse *)response;
if (URLResponse.statusCode != 200) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:LOC(@"Error") message:[NSString stringWithFormat:@"%@: %ld %@", LOC(@"ErrorCode"), URLResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:URLResponse.statusCode]] preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:LOC(@"OK") style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[viewController presentViewController:alert animated:YES completion:nil];
});
return;
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:LOC(@"Success") message:LOC(@"SuccessfullySubmittedSegments") preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:LOC(@"OK") style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[viewController presentViewController:alert animated:YES completion:nil];
});
}
}];
[dataTask resume];
}
}
+ (void)normalVoteForSegment:(SponsorSegment *)segment userID:(NSString *)userID type:(BOOL)type withViewController:(UIViewController *)viewController {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://sponsor.ajay.app/api/voteOnSponsorTime?UUID=%@&userID=%@&type=%d", segment.UUID, userID, type]]];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *URLResponse = (NSHTTPURLResponse *)response;
NSString *title;
CGFloat delay;
if (URLResponse.statusCode != 200) {
title = [NSString stringWithFormat:@"%@: (%ld %@)", LOC(@"ErrorVoting"), URLResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:URLResponse.statusCode]];
delay = 3.0f;
}
else {
title = LOC(@"SuccessfullyVoted");
delay = 1.0f;
}
dispatch_async(dispatch_get_main_queue(), ^{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:viewController.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.label.text = title;
hud.offset = CGPointMake(0.f, 50);
[hud hideAnimated:YES afterDelay:delay];
});
}];
[dataTask resume];
}
+ (void)categoryVoteForSegment:(SponsorSegment *)segment userID:(NSString *)userID category:(NSString *)category withViewController:(UIViewController *)viewController {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://sponsor.ajay.app/api/voteOnSponsorTime?UUID=%@&userID=%@&category=%@", segment.UUID, userID, category]]];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *URLResponse = (NSHTTPURLResponse *)response;
NSString *title;
CGFloat delay;
if (URLResponse.statusCode != 200) {
title = [NSString stringWithFormat:@"%@: (%ld %@)", LOC(@"ErrorVoting"), URLResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:URLResponse.statusCode]];
delay = 3.0f;
}
else {
title = LOC(@"SuccessfullyVoted");
delay = 1.0f;
}
dispatch_async(dispatch_get_main_queue(), ^{
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:viewController.view animated:YES];
hud.mode = MBProgressHUDModeText;
hud.label.text = title;
hud.offset = CGPointMake(0.f, 50);
[hud hideAnimated:YES afterDelay:delay];
});
}];
[dataTask resume];
}
+ (void)viewedVideoSponsorTime:(SponsorSegment *)segment {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://sponsor.ajay.app/api/viewedVideoSponsorTime?UUID=%@", segment.UUID]]];
request.HTTPMethod = @"POST";
NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
}];
[dataTask resume];
}
@end