5 Commits

6 changed files with 83 additions and 52 deletions

View File

@ -219,8 +219,7 @@ class AnnasArchieve {
'info': 'info':
main?.querySelector('div[class="text-sm text-gray-500"]')?.text ?? '', main?.querySelector('div[class="text-sm text-gray-500"]')?.text ?? '',
'description': main 'description': main
?.querySelector( ?.querySelector('div[class="mb-1"]')
'div[class="mt-4 line-clamp-[8] js-md5-top-box-description"]')
?.text ?.text
.replaceFirst("description", '') ?? .replaceFirst("description", '') ??
" " " "

View File

@ -8,9 +8,31 @@ class TrendingBookData {
TrendingBookData({this.title, this.thumbnail}); TrendingBookData({this.title, this.thumbnail});
} }
class OpenLibrary { abstract class TrendingBooksImpl {
String url = "https://openlibrary.org/trending/daily"; String url = '';
int timeOutDuration = 20;
List<TrendingBookData> _parser(dynamic data);
Future<List<TrendingBookData>> trendingBooks() async {
try {
final dio = Dio();
final response = await dio.get(url,
options: Options(
sendTimeout: Duration(seconds: timeOutDuration),
receiveTimeout: Duration(seconds: timeOutDuration)));
return _parser(response.data.toString());
} on DioException catch (e) {
return [];
}
}
}
class OpenLibrary extends TrendingBooksImpl {
OpenLibrary() {
super.url = "https://openlibrary.org/trending/daily";
}
@override
List<TrendingBookData> _parser(data) { List<TrendingBookData> _parser(data) {
var document = parse(data.toString()); var document = parse(data.toString());
var bookList = document.querySelectorAll('li[class="searchResultItem"]'); var bookList = document.querySelectorAll('li[class="searchResultItem"]');
@ -32,31 +54,33 @@ class OpenLibrary {
return trendingBooks; return trendingBooks;
} }
@override
Future<List<TrendingBookData>> trendingBooks() async { Future<List<TrendingBookData>> trendingBooks() async {
try { try {
final dio = Dio(); final dio = Dio();
const timeOutDuration = 5;
final response = await dio.get(url, final response = await dio.get(url,
options: Options( options: Options(
sendTimeout: const Duration(seconds: 20), sendTimeout: const Duration(seconds: timeOutDuration),
receiveTimeout: const Duration(seconds: 20))); receiveTimeout: const Duration(seconds: timeOutDuration)));
final response2 = await dio.get( final response2 = await dio.get(
"https://openlibrary.org/trending/daily?page=2", "https://openlibrary.org/trending/daily?page=2",
options: Options( options: Options(
sendTimeout: const Duration(seconds: 20), sendTimeout: const Duration(seconds: timeOutDuration),
receiveTimeout: const Duration(seconds: 20))); receiveTimeout: const Duration(seconds: timeOutDuration)));
return _parser('${response.data.toString()}${response2.data.toString()}'); return _parser('${response.data.toString()}${response2.data.toString()}');
} on DioException catch (e) { } on DioException catch (e) {
if (e.type == DioExceptionType.unknown) { return [];
throw "socketException";
}
rethrow;
} }
} }
} }
class GoodReads { class GoodReads extends TrendingBooksImpl {
String url = "https://www.goodreads.com/shelf/show/trending"; GoodReads() {
super.url = "https://www.goodreads.com/shelf/show/trending";
}
@override
List<TrendingBookData> _parser(data) { List<TrendingBookData> _parser(data) {
var document = parse(data.toString()); var document = parse(data.toString());
var bookList = document.querySelectorAll('div[class="elementList"]'); var bookList = document.querySelectorAll('div[class="elementList"]');
@ -84,28 +108,15 @@ class GoodReads {
} }
return trendingBooks; return trendingBooks;
} }
Future<List<TrendingBookData>> trendingBooks() async {
try {
final dio = Dio();
final response = await dio.get(url,
options: Options(
sendTimeout: const Duration(seconds: 20),
receiveTimeout: const Duration(seconds: 20)));
return _parser(response.data.toString());
} on DioException catch (e) {
if (e.type == DioExceptionType.unknown) {
throw "socketException";
}
rethrow;
}
}
} }
class PenguinRandomHouse { class PenguinRandomHouse extends TrendingBooksImpl {
String url = PenguinRandomHouse() {
"https://www.penguinrandomhouse.com/ajaxc/categories/books/?from=0&to=50&contentId=&elClass=book&dataType=html&catFilter=best-sellers"; super.url =
"https://www.penguinrandomhouse.com/ajaxc/categories/books/?from=0&to=50&contentId=&elClass=book&dataType=html&catFilter=best-sellers";
}
@override
List<TrendingBookData> _parser(data) { List<TrendingBookData> _parser(data) {
var document = parse(data.toString()); var document = parse(data.toString());
var bookList = document.querySelectorAll('div[class="book"]'); var bookList = document.querySelectorAll('div[class="book"]');
@ -132,20 +143,34 @@ class PenguinRandomHouse {
} }
return trendingBooks; return trendingBooks;
} }
}
Future<List<TrendingBookData>> trendingBooks() async { class BookDigits extends TrendingBooksImpl {
try { BookDigits() {
final dio = Dio(); super.url = "https://bookdigits.com/fresh";
final response = await dio.get(url, }
options: Options(
sendTimeout: const Duration(seconds: 20), @override
receiveTimeout: const Duration(seconds: 20))); List<TrendingBookData> _parser(data) {
return _parser(response.data.toString()); var document = parse(data.toString());
} on DioException catch (e) { var bookList = document.querySelectorAll('div[class="list-row"]');
if (e.type == DioExceptionType.unknown) { List<TrendingBookData> trendingBooks = [];
throw "socketException"; for (var element in bookList) {
if (element.querySelector('div[class="list-title link-reg"]')?.text !=
null &&
element.querySelector('img')?.attributes['src'] != null) {
String? thumbnail = element.querySelector('img')?.attributes['src'];
trendingBooks.add(
TrendingBookData(
title: element
.querySelector('div[class="list-title link-reg"]')
?.text
.toString()
.trim(),
thumbnail: thumbnail.toString()),
);
} }
rethrow;
} }
return trendingBooks;
} }
} }

View File

@ -72,17 +72,22 @@ final searchQueryProvider = StateProvider<String>((ref) => "");
//Provider for Trending Books //Provider for Trending Books
final getTrendingBooks = FutureProvider<List<TrendingBookData>>((ref) async { final getTrendingBooks = FutureProvider<List<TrendingBookData>>((ref) async {
OpenLibrary openLibrary = OpenLibrary(); // OpenLibrary openLibrary = OpenLibrary();
GoodReads goodReads = GoodReads(); GoodReads goodReads = GoodReads();
PenguinRandomHouse penguinTrending = PenguinRandomHouse(); PenguinRandomHouse penguinTrending = PenguinRandomHouse();
BookDigits bookDigits = BookDigits();
List<TrendingBookData> trendingBooks = List<TrendingBookData> trendingBooks =
await Future.wait<List<TrendingBookData>>([ await Future.wait<List<TrendingBookData>>([
openLibrary.trendingBooks(),
goodReads.trendingBooks(), goodReads.trendingBooks(),
penguinTrending.trendingBooks() penguinTrending.trendingBooks(),
// openLibrary.trendingBooks(),
bookDigits.trendingBooks(),
]).then((List<List<TrendingBookData>> listOfData) => ]).then((List<List<TrendingBookData>> listOfData) =>
listOfData.expand((element) => element).toList()); listOfData.expand((element) => element).toList());
if (trendingBooks.isEmpty) {
throw 'Nothing Trending Today :(';
}
trendingBooks.shuffle(); trendingBooks.shuffle();
return trendingBooks; return trendingBooks;
}); });

View File

@ -13,6 +13,8 @@ class AboutPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
const version = "1.0.9";
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.background, backgroundColor: Theme.of(context).colorScheme.background,
@ -47,7 +49,7 @@ class AboutPage extends StatelessWidget {
Padding( Padding(
padding: EdgeInsets.only(left: 7, right: 7, top: 5), padding: EdgeInsets.only(left: 7, right: 7, top: 5),
child: Text( child: Text(
"1.0.7", version,
style: TextStyle( style: TextStyle(
fontSize: 15, fontSize: 15,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,

View File

@ -52,7 +52,7 @@ class _WebviewState extends ConsumerState<Webview> {
onLoadStart: (controller, url) {}, onLoadStart: (controller, url) {},
onLoadStop: (controller, url) async { onLoadStop: (controller, url) async {
String query = String query =
"""document.querySelector('a[class="font-bold"]').href"""; """var paragraphTag=document.querySelector('p[class="mb-4 text-xl font-bold"]');var anchorTagHref=paragraphTag.querySelector('a').href;var url=()=>{return anchorTagHref};url();""";
String? mirrorLink = await webViewController String? mirrorLink = await webViewController
?.evaluateJavascript(source: query); ?.evaluateJavascript(source: query);
// final ipfsUrl = widget.url // final ipfsUrl = widget.url
@ -62,7 +62,6 @@ class _WebviewState extends ConsumerState<Webview> {
// await webViewController?.loadUrl( // await webViewController?.loadUrl(
// urlRequest: URLRequest( // urlRequest: URLRequest(
// url: WebUri('https://example.com/new-page'))); // url: WebUri('https://example.com/new-page')));
if (mirrorLink != null) { if (mirrorLink != null) {
Future.delayed(const Duration(milliseconds: 70), () { Future.delayed(const Duration(milliseconds: 70), () {
// ignore: use_build_context_synchronously // ignore: use_build_context_synchronously

View File

@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.0.7+1 version: 1.0.9+12
environment: environment:
sdk: ">=3.3.0 <4.0.0" sdk: ">=3.3.0 <4.0.0"
@ -36,6 +36,7 @@ dependencies:
flutter_pdfview: ^1.2.7 flutter_pdfview: ^1.2.7
epub_view: ^3.2.0 epub_view: ^3.2.0
# vocsy_epub_viewer: ^3.0.0
# syncfusion_flutter_pdfviewer: ^22.2.5 # syncfusion_flutter_pdfviewer: ^22.2.5
# pdfx: ^2.4.0 # pdfx: ^2.4.0