Skip to content
This repository has been archived by the owner on Oct 3, 2024. It is now read-only.

Commit

Permalink
调整ui&修复一些问题&更新readme.md
Browse files Browse the repository at this point in the history
  • Loading branch information
wgh136 committed Jul 16, 2023
1 parent 85511ff commit b10f498
Show file tree
Hide file tree
Showing 21 changed files with 888 additions and 628 deletions.
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# Pica Comic

[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode)
[![flutter](https://img.shields.io/badge/flutter-3.10.5-blue)](https://flutter.dev/)
[![flutter](https://img.shields.io/badge/flutter-3.10.6-blue)](https://flutter.dev/)
[![License](https://img.shields.io/github/license/wgh136/PicaComic)](https://github.com/wgh136/PicaComic/blob/master/LICENSE)
[![Download](https://img.shields.io/github/v/release/wgh136/PicaComic)](https://github.com/wgh136/PicaComic/releases)
[![stars](https://img.shields.io/github/stars/wgh136/PicaComic)](https://github.com/wgh136/PicaComic/stargazers)

使用flutter构建的漫画App, 支持查看Picacg, E-hentai, 禁漫天堂, Hitomi
使用flutter构建的漫画App, 支持查看Picacg, E-hentai, 禁漫天堂, Hitomi, 绅士漫画

目前支持Android, Windows; 由于缺乏测试条件, IOS可用性未知

Expand Down Expand Up @@ -76,6 +75,17 @@ Web端已被放弃, 仅支持哔咔, 目前部署在Vercel上
- 漫画阅读
- 下载漫画

### 绅士漫画
在v2.0.0版本中添加
- 主页
- 分类
- 搜索
- 漫画详情
- 漫画阅读
- 登录
- 收藏夹
- 下载漫画

## Thanks

### dependencies
Expand Down
Binary file removed images/select.png
Binary file not shown.
70 changes: 40 additions & 30 deletions lib/network/cache_network.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,51 +10,58 @@ import 'package:pica_comic/network/proxy.dart';
import 'log_dio.dart';

///缓存网络请求, 仅提供get方法, 其它的没有意义
class CachedNetwork{
class CachedNetwork {
String? _path;

Future<void> init() async{
_path = "${(await getTemporaryDirectory()).path}${Platform.pathSeparator}cachedNetwork";
if(!Directory(_path!).existsSync()){
Future<void> init() async {
_path =
"${(await getTemporaryDirectory()).path}${Platform.pathSeparator}cachedNetwork";
if (!Directory(_path!).existsSync()) {
Directory(_path!).createSync(recursive: true);
}
}

static Future<void> clearCache() async{
var path = "${(await getTemporaryDirectory()).path}${Platform.pathSeparator}cachedNetwork";
if(Directory(path).existsSync()){
static Future<void> clearCache() async {
var path =
"${(await getTemporaryDirectory()).path}${Platform.pathSeparator}cachedNetwork";
if (Directory(path).existsSync()) {
Directory(path).deleteSync(recursive: true);
Directory(path).createSync();
}
}

Future<CachedNetworkRes<String>> get(String url, BaseOptions options,
{CacheExpiredTime expiredTime=CacheExpiredTime.short, CookieJar? cookieJar}) async{
{CacheExpiredTime expiredTime = CacheExpiredTime.short,
CookieJar? cookieJar}) async {
await setNetworkProxy();
await init();
var fileName = md5.convert(const Utf8Encoder().convert(url)).toString();
if(fileName.length > 20){
var fileName = md5
.convert(const Utf8Encoder()
.convert(url.replaceFirst("inline_set=ts_l&", "")))
.toString();
if (fileName.length > 20) {
fileName = fileName.substring(0, 21);
}
var file = File(_path! + Platform.pathSeparator + fileName);
if(file.existsSync()){
if (file.existsSync()) {
var time = file.lastModifiedSync();
if(expiredTime==CacheExpiredTime.persistent
|| DateTime.now().millisecondsSinceEpoch - time.millisecondsSinceEpoch < expiredTime.time){
if (expiredTime == CacheExpiredTime.persistent ||
DateTime.now().millisecondsSinceEpoch - time.millisecondsSinceEpoch <
expiredTime.time) {
return CachedNetworkRes(file.readAsStringSync(), 200);
}
}
options.responseType = ResponseType.plain;
var dio = logDio(options);
if(cookieJar != null){
if (cookieJar != null) {
dio.interceptors.add(CookieManager(cookieJar));
}

var res = await dio.get(url);
if(res.data == null){
if (res.data == null) {
throw Exception("无数据");
}
if(expiredTime != CacheExpiredTime.no) {
if (expiredTime != CacheExpiredTime.no) {
if (file.existsSync()) {
file.deleteSync();
}
Expand All @@ -64,40 +71,43 @@ class CachedNetwork{
return CachedNetworkRes(res.data, res.statusCode);
}

Future<CachedNetworkRes<String>> getJm(String url, BaseOptions options, int time,
{CacheExpiredTime expiredTime=CacheExpiredTime.short, CookieJar? cookieJar}) async{
Future<CachedNetworkRes<String>> getJm(
String url, BaseOptions options, int time,
{CacheExpiredTime expiredTime = CacheExpiredTime.short,
CookieJar? cookieJar}) async {
await setNetworkProxy();
await init();
var fileName = md5.convert(const Utf8Encoder().convert(url)).toString();
if(fileName.length > 20){
if (fileName.length > 20) {
fileName = fileName.substring(0, 21);
}
var file = File(_path! + Platform.pathSeparator + fileName);
if(file.existsSync()){
if (file.existsSync()) {
var time = file.lastModifiedSync();
if(expiredTime==CacheExpiredTime.persistent
|| DateTime.now().millisecondsSinceEpoch - time.millisecondsSinceEpoch < expiredTime.time){
if (expiredTime == CacheExpiredTime.persistent ||
DateTime.now().millisecondsSinceEpoch - time.millisecondsSinceEpoch <
expiredTime.time) {
return CachedNetworkRes(file.readAsStringSync(), 200);
}
}
options.responseType = ResponseType.plain;
var dio = logDio(options);
if(cookieJar != null){
if (cookieJar != null) {
dio.interceptors.add(CookieManager(cookieJar));
}
var res = await dio.get(url);
if(res.statusCode != 200){
if (res.statusCode != 200) {
return CachedNetworkRes(res.data.toString(), res.statusCode);
}
var json = const JsonDecoder().convert(res.data);
var data = json["data"];
if(data is List && data.isEmpty){
if (data is List && data.isEmpty) {
throw Exception("无数据");
}else if(data is List){
} else if (data is List) {
throw Exception("解析出错");
}
var decodedData = JmNetwork.convertData(data, time);
if(expiredTime != CacheExpiredTime.no) {
if (expiredTime != CacheExpiredTime.no) {
if (file.existsSync()) {
file.deleteSync();
}
Expand All @@ -108,7 +118,7 @@ class CachedNetwork{
}
}

enum CacheExpiredTime{
enum CacheExpiredTime {
no(-1),
short(86400000),
long(604800000),
Expand All @@ -120,9 +130,9 @@ enum CacheExpiredTime{
const CacheExpiredTime(this.time);
}

class CachedNetworkRes<T>{
class CachedNetworkRes<T> {
T data;
int? statusCode;

CachedNetworkRes(this.data, this.statusCode);
}
}
24 changes: 23 additions & 1 deletion lib/network/eh_network/eh_main_network.dart
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ class EhNetwork{
imgUrls.add(i.attributes["src"]!);
}
}
gallery.imgUrls = imgUrls;
gallery.thumbnailUrls = imgUrls;
return Res(gallery);
}
catch(e, s){
Expand Down Expand Up @@ -495,6 +495,28 @@ class EhNetwork{
}
}

Future<Res<List<String>>> getThumbnailUrls(String link, int page) async{
var res = await request("$link?inline_set=ts_l&p=${page-1}");
if(res.error){
return Res(null, errorMessage: res.errorMessage);
}
try{
var document = parse(res.data);
var imgUrls = <String>[];
var imgDom = document.querySelectorAll("div.gdtl > a > img");
for(var i in imgDom){
if(i.attributes["src"] != null) {
imgUrls.add(i.attributes["src"]!);
}
}
return Res(imgUrls);
}
catch(e, s){
LogManager.addLog(LogLevel.error, "Data Analysis", "$e\n$s");
return Res(null, errorMessage: e.toString());
}
}

///获取图片链接
///
/// 返回值表示成功加载的页数
Expand Down
15 changes: 10 additions & 5 deletions lib/network/eh_network/eh_models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,21 @@ class Gallery{
String? rating;
late String coverPath;
Map<String,List<String>> tags;
List<String> urls; //图片链接
/// 图片链接, 在进入漫画详情页时获取第一页, 进入阅读器时获取完成
List<String> urls;
List<Comment> comments = [];
Map<String,String>? auth;//api身份验证信息
/// api身份验证信息
Map<String,String>? auth;
bool favorite;
late String link;
String maxPage;
List<String> imgUrls;
///缩略图链接
List<String> thumbnailUrls;
///已加载的缩略图页数
int loadedThumbnailPage = 1;

Gallery(EhGalleryBrief brief,this.tags,this.urls,this.favorite,this.maxPage,
{this.imgUrls=const <String>[]}){
{this.thumbnailUrls=const <String>[]}){
title = brief.title;
type = brief.type;
time = brief.time;
Expand Down Expand Up @@ -106,7 +111,7 @@ class Gallery{
link = json["link"],
maxPage = json["maxPage"],
comments = [],
imgUrls = [],
thumbnailUrls = [],
urls = []{
for(var key in (json["tags"] as Map<String, dynamic>).keys){
tags["key"] = List<String>.from(json["tags"][key]);
Expand Down
22 changes: 12 additions & 10 deletions lib/network/htmanga_network/htmanga_main_network.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:pica_comic/network/htmanga_network/models.dart';
import 'package:pica_comic/network/log_dio.dart';
import 'package:pica_comic/network/res.dart';
import 'package:html/parser.dart';
import 'package:pica_comic/tools/extensions.dart';
import 'package:pica_comic/views/pre_search_page.dart';
import '../../base.dart';

Expand Down Expand Up @@ -73,7 +74,7 @@ class HtmangaNetwork {

///登录
Future<Res<String>> login(String account, String pwd) async{
var res = await post("$baseUrl/users-check_login.html", "login_name=$account&login_pass=$pwd");
var res = await post("$baseUrl/users-check_login.html", "login_name=${Uri.encodeComponent(account)}&login_pass=${Uri.encodeComponent(pwd)}");
if(res.error){
return Res(null, errorMessage: res.errorMessage);
}
Expand Down Expand Up @@ -108,7 +109,7 @@ class HtmangaNetwork {
Map<String, String> titleRes = {};
for (var title in titles) {
var text = title.querySelector("div.title_h2")!.text;
text = text.replaceAll("\n", "");
text = text.replaceAll("\n", "").removeAllBlank;
var link = title.querySelector("div.r > a")!.attributes["href"]!;
link = baseUrl + link;
titleRes[text] = link;
Expand Down Expand Up @@ -162,7 +163,7 @@ class HtmangaNetwork {
url = "${lr[0]}albums-${lr[1]}";
}
}
var res = await get(url);
var res = await get(url, cache: false);
if (res.error) {
return Res(null, errorMessage: res.errorMessage);
}
Expand All @@ -175,18 +176,19 @@ class HtmangaNetwork {
var id = RegExp(r"(?<=-aid-)[0-9]+").firstMatch(link)![0]!;
var image = comic.querySelector("div.pic_box > a > img")!.attributes["src"]!;
image = "https:$image";
var name = comic.querySelector("div.info > div.title > a")!.text;
var name = comic.querySelector("div.info > div.title > a")!.attributes["title"];
name = name??comic.querySelector("div.info > div.title > a")!.text;
var infoCol = comic.querySelector("div.info > div.info_col")!.text;
var lr = infoCol.split(",");
var time = lr[1];
var time = lr[1].removeAllBlank;
time = time.replaceAll("\n", "");
var pagesStr = "";
for (int i = 0; i < lr[0].length; i++) {
if (lr[1][i].isNum) {
pagesStr += lr[1][i];
if (lr[0][i].isNum) {
pagesStr += lr[0][i];
}
}
var pages = int.parse(pagesStr);
var pages = pagesStr==""?0:int.parse(pagesStr);
comics.add(HtComicBrief(name, time, image, id, pages));
} catch (e) {
continue;
Expand Down Expand Up @@ -222,7 +224,7 @@ class HtmangaNetwork {

/// 获取漫画详情, subData为第一页的缩略图
Future<Res<HtComicInfo>> getComicInfo(String id) async {
var res = await get("$baseUrl/photos-index-page-1-aid-$id.html");
var res = await get("$baseUrl/photos-index-page-1-aid-$id.html", cache: false);
if (res.error) {
return Res(null, errorMessage: res.errorMessage);
}
Expand Down Expand Up @@ -323,7 +325,7 @@ class HtmangaNetwork {
}

Future<bool> createFolder(String name) async =>
!(await post("$baseUrl/users-favc_save-id.html", "favc_name=$name")).error;
!(await post("$baseUrl/users-favc_save-id.html", "favc_name=${Uri.encodeComponent(name)}")).error;

Future<bool> deleteFolder(String id) async =>
!(await get("$baseUrl/users-favclass_del-id-$id.html"
Expand Down
5 changes: 5 additions & 0 deletions lib/tools/extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,9 @@ extension ListExtension<T> on List<T>{
}
return newList;
}
}

extension StringExtension on String{
///Remove all value that would display blank on the screen.
String get removeAllBlank => replaceAll("\n", "").replaceAll(" ", "").replaceAll("\t", "");
}
8 changes: 5 additions & 3 deletions lib/views/accounts_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -415,10 +415,12 @@ class AccountsPage extends StatelessWidget {
File(logic.url),
fit: BoxFit.cover,
)
: const Image(
image: AssetImage("images/select.png"),
fit: BoxFit.cover,
: Container(
color: Theme.of(context).colorScheme.primaryContainer,
child: Center(
child: Text("选择图像".tr, style: const TextStyle(fontSize: 22),),
),
),
),
onTap: () async {
if (GetPlatform.isWindows) {
Expand Down
Loading

0 comments on commit b10f498

Please sign in to comment.