diff --git a/lib/component/hentai.dart b/lib/component/hentai.dart index 401d48eab..e5265ac55 100644 --- a/lib/component/hentai.dart +++ b/lib/component/hentai.dart @@ -1,6 +1,7 @@ // This source code is a part of Project Violet. // Copyright (C) 2020-2023. violet-team. Licensed under the Apache-2.0 License. +import 'package:html/parser.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:violet/component/eh/eh_headers.dart'; import 'package:violet/component/eh/eh_parser.dart'; @@ -94,6 +95,33 @@ class HentaiManager { } catch (e, st) { Logger.error('[hentai-idSearch] E: $e\n' '$st'); + try { + late var gallery_url,gallery_token; + var list_html = await EHSession.requestString( + 'https://e-hentai.org/?next=${(no + 1)}' + ); + parse(list_html) + .querySelector('a[href*="/g/$no/"]') + ?.attributes.forEach((key, value) { + if(key == 'href'){ + gallery_url = value; + gallery_token = value.split('/').lastWhere((element) => element.isNotEmpty); + } + }); + var html = await EHSession.requestString('https://e-hentai.org/g/${no}/${gallery_token}/?p=0&inline_set=ts_m'); + var article_eh = EHParser.parseArticleData(html); + var meta = { + 'Id': no, + 'Title': article_eh.title, + 'EHash': gallery_token, + 'Artists': article_eh.artist == null ? 'N/A' : article_eh.artist?.join('|'), + 'Language': article_eh.language, + }; + return SearchResult(results: [QueryResult(result: meta)], offset: -1); + } catch(e1,st1){ + Logger.error('[hentai-idSearch] E: $e\n' + '$st'); + } } return const SearchResult(results: [], offset: -1); diff --git a/lib/pages/bookmark/group/group_article_list_page.dart b/lib/pages/bookmark/group/group_article_list_page.dart index 1f2499260..b3c289dbc 100644 --- a/lib/pages/bookmark/group/group_article_list_page.dart +++ b/lib/pages/bookmark/group/group_article_list_page.dart @@ -3,14 +3,18 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:html/parser.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uuid/uuid.dart'; +import 'package:violet/component/eh/eh_headers.dart'; +import 'package:violet/component/eh/eh_parser.dart'; import 'package:violet/component/hitomi/hitomi_parser.dart'; import 'package:violet/database/query.dart'; import 'package:violet/database/user/bookmark.dart'; import 'package:violet/locale/locale.dart'; +import 'package:violet/log/log.dart'; import 'package:violet/model/article_list_item.dart'; import 'package:violet/network/wrapper.dart' as http; import 'package:violet/other/dialogs.dart'; @@ -83,6 +87,10 @@ class _GroupArticleListPageState extends State { 'https://ltn.hitomi.la/galleryblock/$id.html', headers: headers, ); + if(hh.body == null) { + Logger.warning('[_tryGetArticleFromHitomi] body was null'); + throw Error(); + } var article = await HitomiParser.parseGalleryBlock(hh.body); var meta = { 'Id': int.parse(id), @@ -91,6 +99,32 @@ class _GroupArticleListPageState extends State { }; return QueryResult(result: meta); } + Future _tryGetArticleFromEhentai(String id) async { + late var gallery_url,gallery_token,gallery_id; + var list_html = await EHSession.requestString( + 'https://e-hentai.org/?next=${(int.parse(id) + 1)}' + ); + parse(list_html) + .querySelector('a[href*="/g/$id/"]') + !.attributes.forEach((key, value) { + if(key == 'href'){ + if(value.contains('/g/$id/')){ + gallery_url = value; + gallery_token = value.split('/').lastWhere((element) => element.isNotEmpty); + gallery_id = id; + } + } + }); + var html = await EHSession.requestString('https://e-hentai.org/g/${gallery_id}/${gallery_token}/?p=0&inline_set=ts_m'); + var article_eh = EHParser.parseArticleData(html); + var meta = { + 'Id': int.parse(gallery_id), + 'EHash': gallery_token, + 'Title': article_eh.title, + 'Artists': article_eh.artist == null ? 'N/A' : article_eh.artist?.join('|'), + }; + return QueryResult(result: meta); + } Future _loadBookmarkAlignType() async { final prefs = await SharedPreferences.getInstance(); @@ -128,11 +162,17 @@ class _GroupArticleListPageState extends State { // TODO: fix this hack // ignore: avoid_function_literals_in_foreach_calls - articleList.forEach((element) async { + // articleList.forEach((element) async { + for(var element in articleList){ var article = qr[element.article()]; - article ??= await _tryGetArticleFromHitomi(element.article()); + try { + article ??= await _tryGetArticleFromHitomi(element.article()); + } catch(_){ + article ??= await _tryGetArticleFromEhentai(element.article()); + } result.add(article); - }); + } + // }); queryResult = result; _applyFilter();