Skip to content

Commit

Permalink
Merge pull request NO-ob#219 from NO-ob/idolFavouriteUpdate
Browse files Browse the repository at this point in the history
add idol favourites update, change booru update mode to an enum
  • Loading branch information
NANI-SORE authored Aug 10, 2023
2 parents e1e4a48 + e347974 commit 9ba50b0
Show file tree
Hide file tree
Showing 11 changed files with 996 additions and 819 deletions.
6 changes: 4 additions & 2 deletions lib/src/boorus/booru_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ enum BooruType {
Gelbooru,
GelbooruV1,
Hydrus,
IdolSankaku,
InkBunny,
Moebooru,
NyanPals,
Philomena,
Rainbooru,
R34Hentai,
Sankaku,
IdolSankaku,
Shimmie,
Szurubooru,
WildCritters,
World,

// Special
// [Special types]
GelbooruAlike,
Merge,
Favourites;
Expand All @@ -48,6 +48,8 @@ enum BooruType {
switch (this) {
case World:
return 'World/XYZ';
case IdolSankaku:
return 'Sankaku Idol';
default:
return name;
}
Expand Down
60 changes: 30 additions & 30 deletions lib/src/boorus/idol_sankaku_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,31 @@ class IdolSankakuHandler extends SankakuHandler {

@override
List parseListFromResponse(response) {
List<dynamic> parsedResponse = response.data;
final List<dynamic> parsedResponse = response.data;
return parsedResponse;
}

@override
BooruItem? parseItemFromResponse(responseItem, int index) {
var current = responseItem;
List<String> tags = [];
Map<TagType, List<String>> tagMap = {};
for (int x = 0; x < current["tags"].length; x++) {
tags.add(current["tags"][x]["name"].toString());
String typeStr = current["tags"][x]["type"].toString();
TagType type = tagTypeMap[typeStr] ?? TagType.none;
final current = responseItem;
final List<String> tags = [];
final Map<TagType, List<String>> tagMap = {};
for (int x = 0; x < current['tags'].length; x++) {
tags.add(current['tags'][x]['name'].toString());
final String typeStr = current['tags'][x]['type'].toString();
final TagType type = tagTypeMap[typeStr] ?? TagType.none;
if (tagMap.containsKey(type)) {
tagMap[type]?.add(current["tags"][x]["name"].toString());
tagMap[type]?.add(current['tags'][x]['name'].toString());
} else {
tagMap[type] = [current["tags"][x]["name"].toString()];
tagMap[type] = [current['tags'][x]['name'].toString()];
}
}
if (current['file_url'] != null) {
for (int i = 0; i < tagMap.entries.length; i++) {
addTagsWithType(tagMap.entries.elementAt(i).value, tagMap.entries.elementAt(i).key);
}
String protocol = 'https:';
BooruItem item = BooruItem(
const String protocol = 'https:';
final BooruItem item = BooruItem(
fileURL: protocol + current['file_url'],
sampleURL: protocol + current['sample_url'],
thumbnailURL: protocol + current['preview_url'],
Expand All @@ -47,14 +47,14 @@ class IdolSankakuHandler extends SankakuHandler {
previewWidth: current['preview_width'].toDouble(),
previewHeight: current['preview_height'].toDouble(),
hasNotes: current['has_notes'],
hasComments: current["has_comments"],
hasComments: current['has_comments'],
serverId: current['id'].toString(),
rating: current['rating'],
score: current['total_score'].toString(),
sources: [current['source']],
md5String: current['md5'],
postDate: current['created_at']['s'].toString(), // unix time without in seconds (need to x1000?)
postDateFormat: "unix",
postDateFormat: 'unix',
);

return item;
Expand All @@ -65,50 +65,50 @@ class IdolSankakuHandler extends SankakuHandler {

@override
String makePostURL(String id) {
return "https://idol.sankakucomplex.com/post/show/$id";
return 'https://idol.sankakucomplex.com/post/show/$id';
}

@override
String makeURL(String tags) {
return "${booru.baseURL}/post/index.json?tags=$tags&limit=${limit.toString()}&page=${pageNum.toString()}";
return '${booru.baseURL}/post/index.json?tags=$tags&limit=${limit.toString()}&page=${pageNum.toString()}';
}

@override
String makeTagURL(String input) {
return "${booru.baseURL}/tag/index.json?name=$input*&limit=10";
return '${booru.baseURL}/tag/index.json?name=$input*&limit=10';
}

@override
String makeCommentsURL(String postID, int pageNum) {
// EXAMPLE: https://iapi.sankakucomplex.com/comment/index.json?post_id=$post_id
return "${booru.baseURL}/comment/index.json?post_id=$postID";
return '${booru.baseURL}/comment/index.json?post_id=$postID';
}

@override
List parseCommentsList(response) {
List<dynamic> parsedResponse = response.data;
final List<dynamic> parsedResponse = response.data;
return parsedResponse;
}

@override
CommentItem? parseComment(responseItem, int index) {
var current = responseItem;
final current = responseItem;
return CommentItem(
id: current["id"].toString(),
title: current["post_id"].toString(),
content: current["body"].toString(),
authorID: current["creator_id"].toString(),
authorName: current["creator"].toString(),
avatarUrl: current["creator_avatar"]?.toString().replaceFirst('//', 'https://'),
score: current["score"],
postID: current["post_id"].toString(),
id: current['id'].toString(),
title: current['post_id'].toString(),
content: current['body'].toString(),
authorID: current['creator_id'].toString(),
authorName: current['creator'].toString(),
avatarUrl: current['creator_avatar']?.toString().replaceFirst('//', 'https://'),
score: current['score'],
postID: current['post_id'].toString(),
createDate: current['created_at'].toString(), // 2021-11-15 12:09
createDateFormat: "yyyy-MM-dd HH:mm",
createDateFormat: 'yyyy-MM-dd HH:mm',
);
}

@override
String makeNotesURL(String postID) {
return "${booru.baseURL}/note/index.json?post_id=$postID";
return '${booru.baseURL}/note/index.json?post_id=$postID';
}
}
54 changes: 27 additions & 27 deletions lib/src/boorus/sankaku_handler.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';

import 'package:dio/dio.dart';

import 'package:lolisnatcher/src/data/booru.dart';
import 'package:lolisnatcher/src/data/booru_item.dart';
import 'package:lolisnatcher/src/data/comment_item.dart';
Expand Down Expand Up @@ -35,7 +36,6 @@ class SankakuHandler extends BooruHandler {
@override
bool hasNotesSupport = true;

@override
bool hasItemUpdateSupport = true;

@override
Expand All @@ -59,16 +59,16 @@ class SankakuHandler extends BooruHandler {

@override
List parseListFromResponse(response) {
List<dynamic> parsedResponse = response.data;
final List<dynamic> parsedResponse = response.data;
return parsedResponse;
}

@override
BooruItem? parseItemFromResponse(responseItem, int index) {
final dynamic current = responseItem;

List<String> tags = [];
Map<TagType, List<String>> tagMap = {};
final List<String> tags = [];
final Map<TagType, List<String>> tagMap = {};

for (int x = 0; x < current['tags'].length; x++) {
tags.add(current['tags'][x]['name'].toString());
Expand Down Expand Up @@ -117,16 +117,20 @@ class SankakuHandler extends BooruHandler {
}

@override
Future<List> loadItem(BooruItem item) async {
Future<List> loadItem({required BooruItem item, CancelToken? cancelToken}) async {
try {
if (authToken == '' && booru.userID?.isNotEmpty == true && booru.apiKey?.isNotEmpty == true) {
authToken = await getAuthToken();
}
final response = await DioNetwork.get(makeApiPostURL(item.postURL.split('/').last), headers: getHeaders());
final response = await DioNetwork.get(
makeApiPostURL(item.postURL.split('/').last),
headers: getHeaders(),
cancelToken: cancelToken,
);
if (response.statusCode != 200) {
return [item, false, 'Invalid status code ${response.statusCode}'];
} else {
Map<String, dynamic> current = response.data;
final Map<String, dynamic> current = response.data;
Logger.Inst().log(current.toString(), className, 'updateFavourite', LogTypes.booruHandlerRawFetched);
if (current['file_url'] != null) {
item.fileURL = current['file_url'];
Expand All @@ -135,29 +139,25 @@ class SankakuHandler extends BooruHandler {
}
}
} catch (e) {
if(e is DioException && e.type == DioExceptionType.cancel) {
return [item, null, 'Cancelled'];
}

return [item, false, e.toString()];
}
return [item, true, null];
}

@override
Map<String, String> getHeaders() {
return authToken.isEmpty
? {
'Content-Type': 'application/json',
'Accept': 'application/json',
'User-Agent': Constants.defaultBrowserUserAgent,
'Referer': 'https://beta.sankakucomplex.com/',
'Origin': 'https://beta.sankakucomplex.com/'
}
: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': authToken,
'User-Agent': Constants.defaultBrowserUserAgent,
'Referer': 'https://beta.sankakucomplex.com/',
'Origin': 'https://beta.sankakucomplex.com/'
};
return {
'Accept': 'application/vnd.sankaku.api+json;v=2',
if(authToken.isNotEmpty) 'Authorization': authToken,
// 'User-Agent': 'SCChannelApp/4.0',
'User-Agent': Constants.defaultBrowserUserAgent,
'Referer': 'https://sankaku.app/',
'Origin': 'https://sankaku.app'
};
}

@override
Expand Down Expand Up @@ -188,7 +188,7 @@ class SankakuHandler extends BooruHandler {
);

if (response.statusCode == 200) {
Map<String, dynamic> parsedResponse = response.data;
final Map<String, dynamic> parsedResponse = response.data;
if (parsedResponse['success']) {
Logger.Inst().log('Sankaku auth token loaded', className, 'getAuthToken', LogTypes.booruHandlerInfo);
token = "${parsedResponse["token_type"]} ${parsedResponse["access_token"]}";
Expand All @@ -208,7 +208,7 @@ class SankakuHandler extends BooruHandler {

@override
List parseTagSuggestionsList(response) {
List<dynamic> parsedResponse = response.data;
final List<dynamic> parsedResponse = response.data;
return parsedResponse;
}

Expand Down Expand Up @@ -236,7 +236,7 @@ class SankakuHandler extends BooruHandler {

@override
List parseCommentsList(response) {
List<dynamic> parsedResponse = response.data;
final List<dynamic> parsedResponse = response.data;
return parsedResponse;
}

Expand Down Expand Up @@ -264,7 +264,7 @@ class SankakuHandler extends BooruHandler {

@override
List parseNotesList(response) {
List<dynamic> parsedResponse = response.data;
final List<dynamic> parsedResponse = response.data;
return parsedResponse;
}

Expand Down
2 changes: 1 addition & 1 deletion lib/src/handlers/booru_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ abstract class BooruHandler {
// TODO fetch and overwrite current item data when entering tag view with a newer / more complete data
bool shouldUpdateIteminTagView = false;

Future loadItem(BooruItem item) async {
Future loadItem({required BooruItem item, CancelToken? cancelToken}) async {
return null;
}

Expand Down
Loading

0 comments on commit 9ba50b0

Please sign in to comment.