Skip to content

Commit

Permalink
### 2023.9.6
Browse files Browse the repository at this point in the history
- add 更换音频播放器。增加系统状态栏标签,响应系统事件。
- fix 修复备份文件编码问题
- add 选取备份文件增添可以使用系统文件管理器
- 暂时移除搜索界面历史
- 规则和js文本编辑框添加撤销和重做(划掉。旧版flutter不支持)
- 目录分页加载
- 调试时多页目录只加载一页
  • Loading branch information
mabDc committed Sep 6, 2023
1 parent 0048e93 commit 32543e6
Show file tree
Hide file tree
Showing 8 changed files with 263 additions and 11 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
### 2023.9.6
- add 更换音频播放器。增加系统状态栏标签,响应系统事件。
- fix 修复备份文件编码问题
- add 选取备份文件增添可以使用系统文件管理器
- 暂时移除搜索界面历史
- 规则和js文本编辑框添加撤销和重做(划掉。旧版flutter不支持)
- 目录分页加载
- 调试时多页目录只加载一页

### 2023.4.22
- fix 书架分组自动保存
- fix 新发现瀑布流。标识符改成`@@DiscoverRule:`,其用来分隔js和json
Expand Down
121 changes: 119 additions & 2 deletions lib/api/api_from_rule.dart
Original file line number Diff line number Diff line change
Expand Up @@ -193,13 +193,129 @@ class APIFromRUle implements API {
return result;
}

String checkString(String s) => s != null && s.isNotEmpty ? s : null;
static String chapterNextUrl;

// page放进chapter里头
@override
Future<List<ChapterItem>> chapter(final String lastResult) async {
Future<List<ChapterItem>> chapter(final String lastResult, [int page]) async {
if (rule.chapterUrl == "正文") {
return [ChapterItem(url: lastResult, name: "正文")];
}
API.chapterUrl = null;
if (page != null) {
// 这里拦截再退出
final result = <ChapterItem>[];
final reversed = false; //rule.chapterList.startsWith("-"); //暂时关闭
if (page == 1) {
chapterNextUrl = null;
}
try {
final url =
checkString(chapterNextUrl) ?? checkString(rule.chapterUrl) ?? lastResult;
var chapterUrl = url;
API.chapterUrl = chapterUrl;
var body = '';
if (url != "null") {
final res = await AnalyzeUrl.urlRuleParser(
url,
rule,
result: lastResult,
page: page,
);
if (res != null) {
if (res.contentLength == 0) {
return result;
}
chapterUrl = res.request.url.toString();
API.chapterUrl = chapterUrl;
body = DecodeBody().decode(res.bodyBytes, res.headers["content-type"]);
}
}
if (page == 1) {
await JSEngine.setEnvironment(page, rule, "", chapterUrl, "", lastResult);
} else {
await JSEngine.evaluate(
"baseUrl = ${jsonEncode(chapterUrl)}; page = ${jsonEncode(page)};");
}
final bodyAnalyzer = AnalyzerManager(body);
if (rule.chapterNextUrl != null && rule.chapterNextUrl.isNotEmpty) {
chapterNextUrl = await bodyAnalyzer.getString(rule.chapterNextUrl);
}
if (rule.enableMultiRoads) {
final roads = await bodyAnalyzer.getElements(rule.chapterRoads);
if (roads.isEmpty) {
return result;
}
for (final road in roads) {
final roadAnalyzer = AnalyzerManager(road);
result.add(ChapterItem(
name: "@线路" + await roadAnalyzer.getString(rule.chapterRoadName),
));
final list = await roadAnalyzer
.getElements(reversed ? rule.chapterList.substring(1) : rule.chapterList);
if (list.isEmpty) {
break;
}
for (final item in (reversed ? list.reversed : list)) {
final analyzer = AnalyzerManager(item);
final lock = await analyzer.getString(rule.chapterLock);
// final unLock = await analyzer.getString(rule.chapterUnLock);
var name = (await analyzer.getString(rule.chapterName))
.trim()
.replaceAll(APIConst.largeSpaceRegExp, Global.fullSpace);
// if (unLock != null && unLock.isNotEmpty && unLock != "undefined" && unLock != "false") {
// name = "🔓" + name;
// }else
if (lock != null &&
lock.isNotEmpty &&
lock != "undefined" &&
lock != "false" &&
lock != "0") {
name = "🔒" + name;
}
result.add(ChapterItem(
cover: await analyzer.getString(rule.chapterCover),
name: name,
time: await analyzer.getString(rule.chapterTime),
url: await analyzer.getString(rule.chapterResult),
));
}
}
} else {
final list = await bodyAnalyzer
.getElements(reversed ? rule.chapterList.substring(1) : rule.chapterList);
if (list.isEmpty) {
return result;
}
for (final item in (reversed ? list.reversed : list)) {
final analyzer = AnalyzerManager(item);
final lock = await analyzer.getString(rule.chapterLock);
// final unLock = await analyzer.getString(rule.chapterUnLock);
var name = (await analyzer.getString(rule.chapterName))
.trim()
.replaceAll(APIConst.largeSpaceRegExp, Global.fullSpace);
// if (unLock != null && unLock.isNotEmpty && unLock != "undefined" && unLock != "false") {
// name = "🔓" + name;
// }else
if (lock != null &&
lock.isNotEmpty &&
lock != "undefined" &&
lock != "false" &&
lock != "0") {
name = "🔒" + name;
}
result.add(ChapterItem(
cover: await analyzer.getString(rule.chapterCover),
name: name,
time: await analyzer.getString(rule.chapterTime),
url: await analyzer.getString(rule.chapterResult),
));
}
}
} catch (e) {}
return result;
}
final result = <ChapterItem>[];
final reversed = rule.chapterList.startsWith("-");
final hasNextUrlRule = rule.chapterNextUrl != null && rule.chapterNextUrl.isNotEmpty;
Expand All @@ -223,7 +339,8 @@ class APIFromRUle implements API {
break;
}
try {
var chapterUrl = '';
var chapterUrl = chapterUrlRule;
API.chapterUrl = chapterUrl;
var body = '';
if (chapterUrlRule != 'null') {
final res = await AnalyzeUrl.urlRuleParser(
Expand Down
6 changes: 3 additions & 3 deletions lib/api/api_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import '../global.dart';
import 'api.dart';

class APIManager {
static Future<API> chooseAPI(String originTag) async {
static Future<APIFromRUle> chooseAPI(String originTag) async {
return APIFromRUle(await Global.ruleDao.findRuleById(originTag));
}

Expand All @@ -28,10 +28,10 @@ class APIManager {
return <SearchItem>[];
}

static Future<List<ChapterItem>> getChapter(String originTag, String url) async {
static Future<List<ChapterItem>> getChapter(String originTag, String url, [int page]) async {
if (originTag != null) {
final api = await chooseAPI(originTag);
if (api != null) return api.chapter(url);
if (api != null) return api.chapter(url, page);
}
return <ChapterItem>[];
}
Expand Down
52 changes: 50 additions & 2 deletions lib/model/chapter_page_provider.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:convert';
import 'dart:io';

import 'package:eso/api/api.dart';
Expand All @@ -11,6 +12,7 @@ import 'package:flutter/services.dart';
import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart';
import '../api/api_manager.dart';
import '../database/chapter_item.dart';
import '../database/search_item.dart';
import '../database/search_item_manager.dart';
import '../global.dart';
Expand Down Expand Up @@ -97,20 +99,64 @@ class ChapterPageProvider with ChangeNotifier {
notifyListeners();
}

int _page = -1;
int get page => _page;
String checkContent;

Future loadChpaterWithPage(int page) async {
if (_page == 1) {
_page++;
notifyListeners();
checkContent = buildCheck(searchItem.chapters);
}
await Duration(milliseconds: 500); // 随意休息一下
print("加载目录$page");
final durChapters =
await APIManager.getChapter(searchItem.originTag, searchItem.url, _page);
if (durChapters.isEmpty) {
_page = -page; // 结束
_isLoading = false;
notifyListeners();
return;
}
final _checkContent = buildCheck(durChapters);
if (checkContent == _checkContent) {
_page = -page; // 结束
_isLoading = false;
notifyListeners();
return;
}
searchItem.chapters.addAll(durChapters);
searchItem.chaptersCount = searchItem.chapters?.length ?? 0;
searchItem.chapter = searchItem.chapters?.last?.name;
_page++;
notifyListeners();
loadChpaterWithPage(_page);
}

String buildCheck(List<ChapterItem> chapters) {
return json.encode(chapters.first.toJson()) +
searchItem.chapters.length.toString() +
json.encode(chapters.last.toJson());
}

void initChapters() async {
_page = 1;
searchItem.chapters =
await APIManager.getChapter(searchItem.originTag, searchItem.url);
await APIManager.getChapter(searchItem.originTag, searchItem.url, page);
searchItem.chapterUrl = API.chapterUrl;
searchItem.durChapterIndex = 0;
searchItem.durContentIndex = 1;
if (searchItem.chapters.isEmpty) {
searchItem.durChapter = '';
searchItem.chaptersCount = 0;
searchItem.chapter = '';
_page = 0;
} else {
searchItem.durChapter = searchItem.chapters?.first?.name ?? '';
searchItem.chaptersCount = searchItem.chapters?.length ?? 0;
searchItem.chapter = searchItem.chapters?.last?.name;
loadChpaterWithPage(_page);
}
_isLoading = false;
notifyListeners();
Expand All @@ -128,8 +174,10 @@ class ChapterPageProvider with ChangeNotifier {
searchItem.chaptersCount = searchItem.chapters.length;
if (searchItem.chaptersCount > 0) {
searchItem.chapter = searchItem.chapters.last?.name;
_page = 1;
loadChpaterWithPage(_page);
} else {
searchItem.chapter = '';
_page = 0;
}
if (SearchItemManager.isFavorite(searchItem.originTag, searchItem.url)) {
await searchItem.save();
Expand Down
3 changes: 2 additions & 1 deletion lib/model/debug_rule_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -488,11 +488,12 @@ class DebugRuleProvider with ChangeNotifier {
return;
}
_beginEvent("目录");
_addContent("如果有分页,只尝试加载两页作为测试");
dynamic firstChapter;
String next;
String chapterUrlRule;
final hasNextUrlRule = rule.chapterNextUrl != null && rule.chapterNextUrl.isNotEmpty;
for (var page = 1;; page++) {
for (var page = 1; page < 3; page++) {
if (disposeFlag) return;
chapterUrlRule = null;
final url = rule.chapterUrl != null && rule.chapterUrl.isNotEmpty
Expand Down
66 changes: 65 additions & 1 deletion lib/page/chapter_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:eso/menu/menu.dart';
import 'package:eso/menu/menu_chapter.dart';
import 'package:eso/eso_theme.dart';
import 'package:eso/page/photo_view_page.dart';
import 'package:flutter/foundation.dart';
import 'package:text_composition/text_composition.dart';
import 'package:eso/ui/ui_image_item.dart';
import 'package:eso/utils.dart';
Expand All @@ -21,6 +22,47 @@ import '../model/chapter_page_provider.dart';
import 'content_page_manager.dart';
import 'langding_page.dart';

class NextPageAnimation extends StatefulWidget {
final String text;
const NextPageAnimation({Key key, this.text = "加载下一页。。。"}) : super(key: key);

@override
State<NextPageAnimation> createState() => _NextPageAnimationState();
}

class _NextPageAnimationState extends State<NextPageAnimation> {
int count = 0;

@override
void initState() {
start();
super.initState();
}

@override
void dispose() {
count = -1;
super.dispose();
}

void start() {
if (count == -1 || !mounted) return;
if (kDebugMode) {
print("播放动画 $count");
}
Future.delayed(const Duration(milliseconds: 200), start);
setState(() {
count++;
});
}

@override
Widget build(BuildContext context) {
final text = widget.text;
return Text(text.substring(0, count % (text.length + 1)));
}
}

class ChapterPage extends StatefulWidget {
final SearchItem searchItem;
final bool fromHistory;
Expand Down Expand Up @@ -89,13 +131,35 @@ class _ChapterPageState extends State<ChapterPage> {
height: topHeight,
);
},
)
),
buildPage(context),
],
)),
),
);
}

Widget buildPage(BuildContext context) {
final page = Provider.of<ChapterPageProvider>(context, listen: true).page;
print(page);
if (page > 0)
return Positioned(
right: 20,
bottom: 10,
child: Row(
children: [
Text("${Provider.of<ChapterPageProvider>(context).page}"),
NextPageAnimation(text: "页加载中")
],
),
);
return Positioned(
right: 20,
bottom: 10,
child: Card(child: Text("${-Provider.of<ChapterPageProvider>(context).page}页")),
);
}

//头部
Widget _buildAlphaAppbar(BuildContext context) {
final provider = Provider.of<ChapterPageProvider>(context, listen: false);
Expand Down
4 changes: 2 additions & 2 deletions lib/page/search_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ class SearchProvider with ChangeNotifier {
List<String> _history;
List<String> get history => _history;
bool _showHistory;
bool get showHistory => _showHistory;
bool get showHistory => false; //_showHistory;
SearchProvider({
int threadCount,
SearchOption searchOption,
Expand Down Expand Up @@ -584,7 +584,7 @@ class SearchProvider with ChangeNotifier {
_showHistory = true;
notifyListeners();
} else {
Future.delayed(Duration(milliseconds: 100), closeHistory);
Future.delayed(Duration(milliseconds: 100), closeHistory);
}
}

Expand Down
Loading

0 comments on commit 32543e6

Please sign in to comment.