Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add _tryGetArticleFromEhentai #270

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions lib/component/hentai.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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);
Expand Down
46 changes: 43 additions & 3 deletions lib/pages/bookmark/group/group_article_list_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -83,6 +87,10 @@ class _GroupArticleListPageState extends State<GroupArticleListPage> {
'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),
Expand All @@ -91,6 +99,32 @@ class _GroupArticleListPageState extends State<GroupArticleListPage> {
};
return QueryResult(result: meta);
}
Future<QueryResult> _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<void> _loadBookmarkAlignType() async {
final prefs = await SharedPreferences.getInstance();
Expand Down Expand Up @@ -128,11 +162,17 @@ class _GroupArticleListPageState extends State<GroupArticleListPage> {

// 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();
Expand Down
Loading