Skip to content

Commit

Permalink
# 调整
Browse files Browse the repository at this point in the history
- 将部分文本改为可复制的格式
  • Loading branch information
deretame committed Jan 20, 2025
1 parent 2cd367c commit 6a4f3b2
Show file tree
Hide file tree
Showing 24 changed files with 677 additions and 262 deletions.
158 changes: 114 additions & 44 deletions lib/page/comic_info/method/export_comic.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,46 +12,51 @@ import '../../download/json/comic_all_info_json/comic_all_info_json.dart';

/// 导出漫画为文件夹
Future<void> exportComicAsFolder(ComicAllInfoJson comicInfo) async {
var processedComicInfo = comicInfoProcess(comicInfo);
var downloadPath = await createDownloadDir();
var comicDir =
'$downloadPath/${comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}';
var comicDir = '$downloadPath/${processedComicInfo.comic.title}';

if (!await Directory(comicDir).exists()) {
await Directory(comicDir).create(recursive: true);
}

// 保存漫画下载信息
var comicInfoString = comicAllInfoJsonToJson(comicInfo);
var comicInfoFile = File('$comicDir/info.json');
var comicInfoFile = File('$comicDir/original_comic_info.json');
if (!await comicInfoFile.exists()) {
await comicInfoFile.create(recursive: true);
}
await comicInfoFile.writeAsString(comicInfoString);

if (comicInfo.comic.thumb.path.isNotEmpty) {
var processedComicInfoString = comicAllInfoJsonToJson(processedComicInfo);
var processedComicInfoFile = File('$comicDir/processed_comic_info.json');
if (!await processedComicInfoFile.exists()) {
await processedComicInfoFile.create(recursive: true);
}
await processedComicInfoFile.writeAsString(processedComicInfoString);

if (processedComicInfo.comic.thumb.path.isNotEmpty) {
var coverDir = '$comicDir/cover';
var coverFile = File('$coverDir/cover.jpg');
if (!await coverFile.exists()) {
await coverFile.create(recursive: true);
}
var coverDownloadFile = await downloadPicture(
from: 'bika',
url: comicInfo.comic.thumb.fileServer,
path: comicInfo.comic.thumb.path,
cartoonId: comicInfo.comic.id,
url: processedComicInfo.comic.thumb.fileServer,
path: processedComicInfo.comic.thumb.path,
cartoonId: processedComicInfo.comic.id,
pictureType: 'cover',
chapterId: comicInfo.comic.id,
chapterId: processedComicInfo.comic.id,
);
await File(coverDownloadFile).copy(coverFile.path);
}

final List<Future<void>> downloadTasks = [];
for (var ep in comicInfo.eps.docs) {
var epDir =
'$comicDir/eps/${ep.order}.${ep.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}';
for (var ep in processedComicInfo.eps.docs) {
var epDir = '$comicDir/eps/${ep.title}';
for (var page in ep.pages.docs) {
var pageFile =
'$epDir/${page.media.originalName.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}';
var pageFile = '$epDir/${page.media.originalName}';
downloadTask() async {
try {
var pageDownloadFile = await downloadPicture(
Expand All @@ -77,53 +82,53 @@ Future<void> exportComicAsFolder(ComicAllInfoJson comicInfo) async {

await Future.wait(downloadTasks);

debugPrint(
'漫画${comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}导出为文件夹完成');
EasyLoading.showSuccess(
'漫画${comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}导出为文件夹完成');
debugPrint('漫画${comicInfo.comic.title}导出为文件夹完成');
EasyLoading.showSuccess('漫画${comicInfo.comic.title}导出为文件夹完成');
}

/// 导出漫画为 ZIP
Future<void> exportComicAsZip(ComicAllInfoJson comicInfo) async {
var processedComicInfo = comicInfoProcess(comicInfo);
var downloadPath = await createDownloadDir();
var comicDir =
comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_');
var comicDir = processedComicInfo.comic.title;

// 保存漫画下载信息
var comicInfoString = comicAllInfoJsonToJson(comicInfo);
var comicInfoBytes = utf8.encode(comicInfoString);
// 保存原始漫画信息
var originalComicInfoString = comicAllInfoJsonToJson(comicInfo);
var originalComicInfoBytes = utf8.encode(originalComicInfoString);

// 保存处理后的漫画信息
var processedComicInfoString = comicAllInfoJsonToJson(processedComicInfo);
var processedComicInfoBytes = utf8.encode(processedComicInfoString);

// 封面图片
Uint8List? coverBytes;
if (comicInfo.comic.thumb.path.isNotEmpty) {
if (processedComicInfo.comic.thumb.path.isNotEmpty) {
var coverDownloadFile = await downloadPicture(
from: 'bika',
url: comicInfo.comic.thumb.fileServer,
path: comicInfo.comic.thumb.path,
cartoonId: comicInfo.comic.id,
url: processedComicInfo.comic.thumb.fileServer,
path: processedComicInfo.comic.thumb.path,
cartoonId: processedComicInfo.comic.id,
pictureType: 'cover',
chapterId: comicInfo.comic.id,
chapterId: processedComicInfo.comic.id,
);
coverBytes = await File(coverDownloadFile).readAsBytes();
}

// 漫画页面
final List<Map<String, dynamic>> pages = [];
for (var ep in comicInfo.eps.docs) {
var epDir =
'eps/${ep.order}.${ep.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}';
for (var ep in processedComicInfo.eps.docs) {
var epDir = 'eps/${ep.title}';
for (var page in ep.pages.docs) {
var pageDownloadFile = await downloadPicture(
from: 'bika',
url: page.media.fileServer,
path: page.media.path,
cartoonId: comicInfo.comic.id,
cartoonId: processedComicInfo.comic.id,
pictureType: 'comic',
chapterId: ep.id,
);
var pageBytes = await File(pageDownloadFile).readAsBytes();
var fileName =
page.media.originalName.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_');
var fileName = page.media.originalName;
pages.add({
'path': join(epDir, fileName),
'bytes': pageBytes,
Expand All @@ -137,30 +142,31 @@ Future<void> exportComicAsZip(ComicAllInfoJson comicInfo) async {
_CompressToZipParams(
downloadPath: downloadPath,
comicDir: comicDir,
comicInfoBytes: comicInfoBytes,
originalComicInfoBytes: originalComicInfoBytes,
processedComicInfoBytes: processedComicInfoBytes,
coverBytes: coverBytes,
pages: pages,
),
);

debugPrint(
'漫画${comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}导出为ZIP完成');
EasyLoading.showSuccess(
'漫画${comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}导出为ZIP完成');
debugPrint('漫画${comicInfo.comic.title}导出为ZIP完成');
EasyLoading.showSuccess('漫画${comicInfo.comic.title}导出为ZIP完成');
}

/// 压缩任务参数类
class _CompressToZipParams {
final String downloadPath;
final String comicDir;
final Uint8List comicInfoBytes;
final Uint8List originalComicInfoBytes; // 原始漫画信息
final Uint8List processedComicInfoBytes; // 处理后的漫画信息
final Uint8List? coverBytes;
final List<Map<String, dynamic>> pages;

_CompressToZipParams({
required this.downloadPath,
required this.comicDir,
required this.comicInfoBytes,
required this.originalComicInfoBytes,
required this.processedComicInfoBytes,
this.coverBytes,
required this.pages,
});
Expand All @@ -170,11 +176,18 @@ class _CompressToZipParams {
void _compressToZip(_CompressToZipParams params) {
var archive = Archive();

// 添加漫画信息文件
// 添加原始漫画信息文件
archive.addFile(ArchiveFile(
'info.json',
params.comicInfoBytes.length,
params.comicInfoBytes,
'original_comic_info.json',
params.originalComicInfoBytes.length,
params.originalComicInfoBytes,
));

// 添加处理后的漫画信息文件
archive.addFile(ArchiveFile(
'processed_comic_info.json',
params.processedComicInfoBytes.length,
params.processedComicInfoBytes,
));

// 添加封面图片
Expand Down Expand Up @@ -242,3 +255,60 @@ Future<String> createDownloadDir() async {
rethrow;
}
}

ComicAllInfoJson comicInfoProcess(ComicAllInfoJson comicInfo) {
return ComicAllInfoJson(
comic: Comic(
id: comicInfo.comic.id,
creator: comicInfo.comic.creator,
title: comicInfo.comic.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_'),
description: comicInfo.comic.description,
thumb: comicInfo.comic.thumb,
author: comicInfo.comic.author,
chineseTeam: comicInfo.comic.chineseTeam,
categories: comicInfo.comic.categories,
tags: comicInfo.comic.tags,
pagesCount: comicInfo.comic.pagesCount,
epsCount: comicInfo.comic.epsCount,
finished: comicInfo.comic.finished,
updatedAt: comicInfo.comic.updatedAt,
createdAt: comicInfo.comic.createdAt,
allowDownload: comicInfo.comic.allowDownload,
allowComment: comicInfo.comic.allowComment,
totalLikes: comicInfo.comic.totalLikes,
totalViews: comicInfo.comic.totalViews,
totalComments: comicInfo.comic.totalComments,
viewsCount: comicInfo.comic.viewsCount,
likesCount: comicInfo.comic.likesCount,
commentsCount: comicInfo.comic.commentsCount,
isFavourite: comicInfo.comic.isFavourite,
isLiked: comicInfo.comic.isLiked,
),
eps: Eps(
docs: comicInfo.eps.docs
.map((ep) => EpsDoc(
id: ep.id,
title:
"${ep.order}.${ep.title.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_')}",
order: ep.order,
updatedAt: ep.updatedAt,
docId: ep.docId,
pages: Pages(
docs: ep.pages.docs
.map((page) => PagesDoc(
id: page.id,
media: Thumb(
originalName: page.media.originalName
.replaceAll(RegExp(r'[<>:"/\\|?* ]'), '_'),
path: page.media.path,
fileServer: page.media.fileServer,
),
docId: page.docId,
))
.toList(),
),
))
.toList(),
),
);
}
23 changes: 17 additions & 6 deletions lib/page/comic_info/view/comic_info.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:convert';

import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
Expand Down Expand Up @@ -79,18 +81,27 @@ class _ComicInfoState extends State<_ComicInfo>
super.initState();
_type = type ?? ComicEntryType.normal;
// 首先查询一下有没有记录
final query = objectbox.bikaHistoryBox
.query(BikaComicHistory_.comicId.equals(widget.comicId));
comicHistory = query.build().findFirst();
comicHistory = objectbox.bikaHistoryBox
.query(BikaComicHistory_.comicId.equals(widget.comicId))
.build()
.findFirst();

var temp = jsonEncode(comicHistory?.toJson());

debugPrint('comicHistory: $temp');

if (_type == ComicEntryType.download) {
final query = objectbox.bikaDownloadBox
.query(BikaComicDownload_.comicId.equals(widget.comicId));
comicDownload = query.build().findFirst();
comicDownload = objectbox.bikaDownloadBox
.query(BikaComicDownload_.comicId.equals(widget.comicId))
.build()
.findFirst();

if (comicDownload != null) {
comicAllInfo = comic_all_info_json
.comicAllInfoJsonFromJson(comicDownload!.comicInfoAll);
comicInfo = comicAllInfo2Comic(comicAllInfo!);
}

var epsDoc = comicAllInfo!.eps.docs;
for (var epDoc in epsDoc) {
epsInfo.add(Doc(
Expand Down
3 changes: 2 additions & 1 deletion lib/page/comic_info/widgets/cover.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:zephyr/widgets/picture_bloc/models/picture_info.dart';

import '../../../config/global.dart';
import '../../../main.dart';
import '../../../widgets/full_screen_image_view.dart';
import '../../../widgets/picture_bloc/bloc/picture_bloc.dart';

Expand Down Expand Up @@ -42,7 +43,7 @@ class Cover extends StatelessWidget {
return Padding(
padding: const EdgeInsets.all(16.0),
child: LoadingAnimationWidget.waveDots(
color: Colors.blue,
color: materialColorScheme.primaryFixedDim,
size: 50,
),
);
Expand Down
12 changes: 9 additions & 3 deletions lib/page/comic_info/widgets/creator_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,18 @@ class CreatorInfoWidget extends StatelessWidget {
const CreatorInfoWidget({super.key, required this.comicInfo});

String timeDecode(DateTime originalTime) {
// 加上8个小时
DateTime newDateTime = originalTime.add(const Duration(hours: 8));
// 获取当前设备的时区偏移量
Duration timeZoneOffset = DateTime.now().timeZoneOffset;

// 根据时区偏移量调整时间
DateTime newDateTime = originalTime.add(timeZoneOffset);

// 按照指定格式输出
String formattedTime =
'${newDateTime.year}年${newDateTime.month}月${newDateTime.day}日 ${newDateTime.hour.toString().padLeft(2, '0')}:${newDateTime.minute.toString().padLeft(2, '0')}:${newDateTime.second.toString().padLeft(2, '0')}';
'${newDateTime.year}年${newDateTime.month}月${newDateTime.day}日 '
'${newDateTime.hour.toString().padLeft(2, '0')}:'
'${newDateTime.minute.toString().padLeft(2, '0')}:'
'${newDateTime.second.toString().padLeft(2, '0')}';

return "$formattedTime 更新";
}
Expand Down
21 changes: 17 additions & 4 deletions lib/page/comic_info/widgets/eps.dart
Original file line number Diff line number Diff line change
Expand Up @@ -211,11 +211,24 @@ class EpButtonWidget extends StatelessWidget {

String timeDecode(DateTime originalTime, {bool history = false}) {
DateTime newDateTime;
history
? newDateTime = originalTime
: newDateTime = originalTime.add(const Duration(hours: 8));

if (history) {
// 如果是历史记录,直接使用原始时间
newDateTime = originalTime;
} else {
// 如果不是历史记录,获取当前设备的时区偏移量并调整时间
Duration timeZoneOffset = DateTime.now().timeZoneOffset;
newDateTime = originalTime.add(timeZoneOffset);
}

// 格式化时间
String formattedTime =
'${newDateTime.year}年${newDateTime.month}月${newDateTime.day}日 ${newDateTime.hour.toString().padLeft(2, '0')}:${newDateTime.minute.toString().padLeft(2, '0')}:${newDateTime.second.toString().padLeft(2, '0')}';
'${newDateTime.year}年${newDateTime.month}月${newDateTime.day}日 '
'${newDateTime.hour.toString().padLeft(2, '0')}:'
'${newDateTime.minute.toString().padLeft(2, '0')}:'
'${newDateTime.second.toString().padLeft(2, '0')}';

// 返回格式化后的时间
return history ? "$formattedTime 观看" : "$formattedTime 更新";
}
}
2 changes: 1 addition & 1 deletion lib/page/comic_info/widgets/recommend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ class _Cover extends StatelessWidget {
return Padding(
padding: const EdgeInsets.all(16.0),
child: LoadingAnimationWidget.waveDots(
color: Colors.blue,
color: materialColorScheme.primaryFixedDim,
size: 50,
),
);
Expand Down
2 changes: 1 addition & 1 deletion lib/page/comic_read/method/method.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ BikaComicHistory comicToBikaComicHistory(
commentsCount: comic.commentsCount,
isFavourite: comic.isFavourite,
isLiked: comic.isLiked,
history: DateTime.now().toUtc().add(Duration(hours: 8)),
history: DateTime.now().toUtc(),
epTitle: "",
order: 0,
epPageCount: 0,
Expand Down
Loading

0 comments on commit 6a4f3b2

Please sign in to comment.