@@ -8,9 +8,31 @@ class TrendingBookData {
88 TrendingBookData ({this .title, this .thumbnail});
99}
1010
11- class OpenLibrary {
12- String url = "https://openlibrary.org/trending/daily" ;
11+ abstract class TrendingBooksImpl {
12+ String url = '' ;
13+ int timeOutDuration = 20 ;
14+ List <TrendingBookData > _parser (dynamic data);
1315
16+ Future <List <TrendingBookData >> trendingBooks () async {
17+ try {
18+ final dio = Dio ();
19+ final response = await dio.get (url,
20+ options: Options (
21+ sendTimeout: Duration (seconds: timeOutDuration),
22+ receiveTimeout: Duration (seconds: timeOutDuration)));
23+ return _parser (response.data.toString ());
24+ } on DioException catch (e) {
25+ return [];
26+ }
27+ }
28+ }
29+
30+ class OpenLibrary extends TrendingBooksImpl {
31+ OpenLibrary () {
32+ super .url = "https://openlibrary.org/trending/daily" ;
33+ }
34+
35+ @override
1436 List <TrendingBookData > _parser (data) {
1537 var document = parse (data.toString ());
1638 var bookList = document.querySelectorAll ('li[class="searchResultItem"]' );
@@ -32,32 +54,33 @@ class OpenLibrary {
3254 return trendingBooks;
3355 }
3456
57+ @override
3558 Future <List <TrendingBookData >> trendingBooks () async {
3659 try {
3760 final dio = Dio ();
61+ const timeOutDuration = 5 ;
3862 final response = await dio.get (url,
3963 options: Options (
40- sendTimeout: const Duration (seconds: 20 ),
41- receiveTimeout: const Duration (seconds: 20 )));
64+ sendTimeout: const Duration (seconds: timeOutDuration ),
65+ receiveTimeout: const Duration (seconds: timeOutDuration )));
4266 final response2 = await dio.get (
4367 "https://openlibrary.org/trending/daily?page=2" ,
4468 options: Options (
45- sendTimeout: const Duration (seconds: 20 ),
46- receiveTimeout: const Duration (seconds: 20 )));
69+ sendTimeout: const Duration (seconds: timeOutDuration ),
70+ receiveTimeout: const Duration (seconds: timeOutDuration )));
4771 return _parser ('${response .data .toString ()}${response2 .data .toString ()}' );
4872 } on DioException catch (e) {
4973 return [];
50- // if (e.type == DioExceptionType.unknown) {
51- // throw "socketException";
52- // }
53- // rethrow;
5474 }
5575 }
5676}
5777
58- class GoodReads {
59- String url = "https://www.goodreads.com/shelf/show/trending" ;
78+ class GoodReads extends TrendingBooksImpl {
79+ GoodReads () {
80+ super .url = "https://www.goodreads.com/shelf/show/trending" ;
81+ }
6082
83+ @override
6184 List <TrendingBookData > _parser (data) {
6285 var document = parse (data.toString ());
6386 var bookList = document.querySelectorAll ('div[class="elementList"]' );
@@ -85,29 +108,15 @@ class GoodReads {
85108 }
86109 return trendingBooks;
87110 }
88-
89- Future <List <TrendingBookData >> trendingBooks () async {
90- try {
91- final dio = Dio ();
92- final response = await dio.get (url,
93- options: Options (
94- sendTimeout: const Duration (seconds: 20 ),
95- receiveTimeout: const Duration (seconds: 20 )));
96- return _parser (response.data.toString ());
97- } on DioException catch (e) {
98- return [];
99- // if (e.type == DioExceptionType.unknown) {
100- // throw "socketException";
101- // }
102- // rethrow;
103- }
104- }
105111}
106112
107- class PenguinRandomHouse {
108- String url =
109- "https://www.penguinrandomhouse.com/ajaxc/categories/books/?from=0&to=50&contentId=&elClass=book&dataType=html&catFilter=best-sellers" ;
113+ class PenguinRandomHouse extends TrendingBooksImpl {
114+ PenguinRandomHouse () {
115+ super .url =
116+ "https://www.penguinrandomhouse.com/ajaxc/categories/books/?from=0&to=50&contentId=&elClass=book&dataType=html&catFilter=best-sellers" ;
117+ }
110118
119+ @override
111120 List <TrendingBookData > _parser (data) {
112121 var document = parse (data.toString ());
113122 var bookList = document.querySelectorAll ('div[class="book"]' );
@@ -134,21 +143,34 @@ class PenguinRandomHouse {
134143 }
135144 return trendingBooks;
136145 }
146+ }
137147
138- Future <List <TrendingBookData >> trendingBooks () async {
139- try {
140- final dio = Dio ();
141- final response = await dio.get (url,
142- options: Options (
143- sendTimeout: const Duration (seconds: 20 ),
144- receiveTimeout: const Duration (seconds: 20 )));
145- return _parser (response.data.toString ());
146- } on DioException catch (e) {
147- return [];
148- // if (e.type == DioExceptionType.unknown) {
149- // throw "socketException";
150- // }
151- // rethrow;
148+ class BookDigits extends TrendingBooksImpl {
149+ BookDigits () {
150+ super .url = "https://bookdigits.com/fresh" ;
151+ }
152+
153+ @override
154+ List <TrendingBookData > _parser (data) {
155+ var document = parse (data.toString ());
156+ var bookList = document.querySelectorAll ('div[class="list-row"]' );
157+ List <TrendingBookData > trendingBooks = [];
158+ for (var element in bookList) {
159+ if (element.querySelector ('div[class="list-title link-reg"]' )? .text !=
160+ null &&
161+ element.querySelector ('img' )? .attributes['src' ] != null ) {
162+ String ? thumbnail = element.querySelector ('img' )? .attributes['src' ];
163+ trendingBooks.add (
164+ TrendingBookData (
165+ title: element
166+ .querySelector ('div[class="list-title link-reg"]' )
167+ ? .text
168+ .toString ()
169+ .trim (),
170+ thumbnail: thumbnail.toString ()),
171+ );
172+ }
152173 }
174+ return trendingBooks;
153175 }
154176}
0 commit comments