Files
DMZJ_F/lib/models/comic/detail_info.dart
2026-03-07 17:24:59 +08:00

276 lines
7.1 KiB
Dart

import 'dart:convert';
import 'package:flutter_dmzj/models/comic/detail_model.dart';
import 'package:flutter_dmzj/models/comic/detail_v1_model.dart';
import 'package:get/get.dart';
T? asT<T>(dynamic value) {
if (value is T) {
return value;
}
return null;
}
class ComicDetailInfo {
ComicDetailInfo({
this.id = 0,
this.title = "",
this.direction = 0,
this.isLong = false,
this.cover = "",
this.description = "",
this.lastUpdatetime = 0,
this.lastUpdatechapterName = "",
this.firstLetter = "",
this.comicPy = "",
this.hotNum = 0,
this.hitNum = 0,
this.lastUpdateChapterId = 0,
required this.types,
required this.status,
required this.authors,
this.subscribeNum = 0,
required this.volumes,
this.isHide = false,
this.isVip = false,
});
factory ComicDetailInfo.empty() => ComicDetailInfo(
types: [],
status: [],
authors: [],
volumes: [],
);
factory ComicDetailInfo.fromV4(ComicDetailModel data) => ComicDetailInfo(
id: data.data.id,
title: data.data.title,
direction: data.data.direction ?? 0,
isLong: data.data.islong == 1,
cover: data.data.cover ?? "",
description: data.data.description ?? "",
lastUpdateChapterId: data.data.lastUpdateChapterId ?? 0,
lastUpdatechapterName: data.data.lastUpdateChapterName ?? "",
lastUpdatetime: data.data.lastUpdatetime ?? 0,
hitNum: 0,
hotNum: 0,
subscribeNum: 0,
firstLetter: data.data.firstLetter ?? "",
comicPy: data.data.comicPy ?? "",
isVip: false,
types: (data.data.types ?? [])
.map(
(e) => ComicDetailTag(
tagId: e.tagId.toInt(),
tagName: e.tagName,
),
)
.toList(),
status: (data.data.status ?? [])
.map(
(e) => ComicDetailTag(
tagId: e.tagId.toInt(),
tagName: e.tagName,
),
)
.toList(),
authors: (data.data.authors ?? [])
.map(
(e) => ComicDetailTag(
tagId: e.tagId,
tagName: e.tagName,
),
)
.toList(),
volumes: (data.data.chapters ?? [])
.map(
(e) => ComicDetailVolume(
title: e.title!,
chapters: RxList<ComicDetailChapterItem>(
(e.data ?? [])
.map(
(x) => ComicDetailChapterItem(
chapterId: x.chapterId.toInt(),
chapterTitle: x.chapterTitle,
updateTime: x.updatetime ?? 0,
fileSize: 0,
chapterOrder: x.chapterOrder,
isVip: false,
),
)
.toList(),
),
),
)
.toList(),
);
factory ComicDetailInfo.fromV1(ComicDetailV1Model model,
{bool isHide = false}) {
var lastChapterId = 0;
List<ComicDetailVolume> volumes = [];
List<ComicDetailChapterItem> serialItems = [];
List<ComicDetailChapterItem> aloneItems = [];
for (var item in model.list) {
serialItems.add(
ComicDetailChapterItem(
chapterId: int.tryParse(item.id) ?? 0,
chapterTitle: item.chapterName,
updateTime: int.tryParse(item.updatetime) ?? 0,
fileSize: int.tryParse(item.filesize) ?? 0,
chapterOrder: int.tryParse(item.chapterOrder) ?? 0,
),
);
}
for (var item in model.alone) {
aloneItems.add(
ComicDetailChapterItem(
chapterId: int.tryParse(item.id) ?? 0,
chapterTitle: item.chapterName,
updateTime: int.tryParse(item.updatetime) ?? 0,
fileSize: int.tryParse(item.filesize) ?? 0,
chapterOrder: int.tryParse(item.chapterOrder) ?? 0,
),
);
}
if (serialItems.isNotEmpty) {
lastChapterId = serialItems.last.chapterId;
}
volumes.add(
ComicDetailVolume(
title: isHide ? "神隐" : "连载",
chapters: RxList<ComicDetailChapterItem>(serialItems)),
);
if (aloneItems.isNotEmpty) {
volumes.add(
ComicDetailVolume(
title: isHide ? "神隐-单行本" : "单行本",
chapters: RxList<ComicDetailChapterItem>(aloneItems)),
);
}
return ComicDetailInfo(
id: int.tryParse(model.info.id) ?? 0,
title: model.info.title,
direction: int.tryParse(model.info.direction) ?? 0,
isLong: (int.tryParse(model.info.islong) ?? 0) == 1,
cover: model.info.cover,
description: model.info.description,
lastUpdateChapterId: lastChapterId,
lastUpdatechapterName: model.info.lastUpdateChapterName,
lastUpdatetime: int.tryParse(model.info.lastUpdatetime) ?? 0,
hitNum: 0,
hotNum: 0,
subscribeNum: 0,
firstLetter: model.info.firstLetter,
comicPy: "",
isHide: isHide,
types: model.info.types
.split("/")
.map(
(e) => ComicDetailTag(
tagId: 0,
tagName: e,
),
)
.toList(),
status: [
ComicDetailTag(
tagId: 0,
tagName: model.info.status,
)
],
authors: model.info.authors
.split("/")
.map(
(e) => ComicDetailTag(
tagId: 0,
tagName: e,
),
)
.toList(),
volumes: volumes,
);
}
int id;
String title;
int direction;
bool isLong;
String cover;
String description;
int lastUpdatetime;
String lastUpdatechapterName;
String firstLetter;
String comicPy;
int hotNum;
int hitNum;
int lastUpdateChapterId;
List<ComicDetailTag> types = [];
List<ComicDetailTag> status = [];
List<ComicDetailTag> authors = [];
int subscribeNum;
List<ComicDetailVolume> volumes = [];
bool isVip;
/// 是否神隐
bool isHide;
@override
String toString() {
return jsonEncode(this);
}
}
class ComicDetailTag {
ComicDetailTag({
required this.tagId,
required this.tagName,
});
int tagId;
String tagName;
}
class ComicDetailVolume {
ComicDetailVolume({
required this.title,
required this.chapters,
}) {
sort();
}
String title;
RxList<ComicDetailChapterItem> chapters;
//0倒序,1正序
var sortType = 0.obs;
var showAll = false.obs;
bool get showMoreButton => chapters.length > 15;
void sort() {
if (sortType.value == 0) {
chapters.sort((a, b) => b.chapterOrder.compareTo(a.chapterOrder));
} else {
chapters.sort((a, b) => a.chapterOrder.compareTo(b.chapterOrder));
}
}
}
class ComicDetailChapterItem {
ComicDetailChapterItem({
required this.chapterId,
required this.chapterTitle,
required this.updateTime,
required this.fileSize,
required this.chapterOrder,
this.isVip = false,
});
int chapterId;
String chapterTitle;
int updateTime;
int fileSize;
int chapterOrder;
bool isVip;
}