mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-21 03:32:06 +00:00
add manga status enum
This commit is contained in:
parent
58f32cacd7
commit
46707fd32b
24 changed files with 268 additions and 165 deletions
|
|
@ -17,7 +17,8 @@ class Manga {
|
|||
|
||||
String? author;
|
||||
|
||||
String? status;
|
||||
@enumerated
|
||||
Status status;
|
||||
|
||||
List<String>? genre;
|
||||
|
||||
|
|
@ -56,3 +57,5 @@ class Manga {
|
|||
this.lastRead = 0,
|
||||
});
|
||||
}
|
||||
|
||||
enum Status { ongoing, completed, canceled, unknown, onHiatus }
|
||||
|
|
|
|||
|
|
@ -85,7 +85,8 @@ const MangaSchema = CollectionSchema(
|
|||
r'status': PropertySchema(
|
||||
id: 13,
|
||||
name: r'status',
|
||||
type: IsarType.string,
|
||||
type: IsarType.byte,
|
||||
enumMap: _MangastatusEnumValueMap,
|
||||
)
|
||||
},
|
||||
estimateSize: _mangaEstimateSize,
|
||||
|
|
@ -176,12 +177,6 @@ int _mangaEstimateSize(
|
|||
bytesCount += 3 + value.length * 3;
|
||||
}
|
||||
}
|
||||
{
|
||||
final value = object.status;
|
||||
if (value != null) {
|
||||
bytesCount += 3 + value.length * 3;
|
||||
}
|
||||
}
|
||||
return bytesCount;
|
||||
}
|
||||
|
||||
|
|
@ -204,7 +199,7 @@ void _mangaSerialize(
|
|||
writer.writeString(offsets[10], object.link);
|
||||
writer.writeString(offsets[11], object.name);
|
||||
writer.writeString(offsets[12], object.source);
|
||||
writer.writeString(offsets[13], object.status);
|
||||
writer.writeByte(offsets[13], object.status.index);
|
||||
}
|
||||
|
||||
Manga _mangaDeserialize(
|
||||
|
|
@ -228,7 +223,8 @@ Manga _mangaDeserialize(
|
|||
link: reader.readStringOrNull(offsets[10]),
|
||||
name: reader.readStringOrNull(offsets[11]),
|
||||
source: reader.readStringOrNull(offsets[12]),
|
||||
status: reader.readStringOrNull(offsets[13]),
|
||||
status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[13])] ??
|
||||
Status.ongoing,
|
||||
);
|
||||
return object;
|
||||
}
|
||||
|
|
@ -267,12 +263,28 @@ P _mangaDeserializeProp<P>(
|
|||
case 12:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 13:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||
Status.ongoing) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
}
|
||||
}
|
||||
|
||||
const _MangastatusEnumValueMap = {
|
||||
'ongoing': 0,
|
||||
'completed': 1,
|
||||
'canceled': 2,
|
||||
'unknown': 3,
|
||||
'onHiatus': 4,
|
||||
};
|
||||
const _MangastatusValueEnumMap = {
|
||||
0: Status.ongoing,
|
||||
1: Status.completed,
|
||||
2: Status.canceled,
|
||||
3: Status.unknown,
|
||||
4: Status.onHiatus,
|
||||
};
|
||||
|
||||
Id _mangaGetId(Manga object) {
|
||||
return object.id ?? Isar.autoIncrement;
|
||||
}
|
||||
|
|
@ -2045,71 +2057,47 @@ extension MangaQueryFilter on QueryBuilder<Manga, Manga, QFilterCondition> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'status',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'status',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
Status value) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'status',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusGreaterThan(
|
||||
String? value, {
|
||||
Status value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'status',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusLessThan(
|
||||
String? value, {
|
||||
Status value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'status',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusBetween(
|
||||
String? lower,
|
||||
String? upper, {
|
||||
Status lower,
|
||||
Status upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
|
|
@ -2118,74 +2106,6 @@ extension MangaQueryFilter on QueryBuilder<Manga, Manga, QFilterCondition> {
|
|||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'status',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'status',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusContains(String value,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'status',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusMatches(
|
||||
String pattern,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'status',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'status',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'status',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
|
@ -2641,10 +2561,9 @@ extension MangaQueryWhereDistinct on QueryBuilder<Manga, Manga, QDistinct> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QDistinct> distinctByStatus(
|
||||
{bool caseSensitive = true}) {
|
||||
QueryBuilder<Manga, Manga, QDistinct> distinctByStatus() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'status', caseSensitive: caseSensitive);
|
||||
return query.addDistinctBy(r'status');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -2734,7 +2653,7 @@ extension MangaQueryProperty on QueryBuilder<Manga, Manga, QQueryProperty> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, String?, QQueryOperations> statusProperty() {
|
||||
QueryBuilder<Manga, Status, QQueryOperations> statusProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'status');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -242,6 +242,7 @@ const _SourcetypeSourceEnumValueMap = {
|
|||
'comick': 2,
|
||||
'mmrcms': 3,
|
||||
'heancms': 4,
|
||||
'madara': 5,
|
||||
};
|
||||
const _SourcetypeSourceValueEnumMap = {
|
||||
0: TypeSource.single,
|
||||
|
|
@ -249,6 +250,7 @@ const _SourcetypeSourceValueEnumMap = {
|
|||
2: TypeSource.comick,
|
||||
3: TypeSource.mmrcms,
|
||||
4: TypeSource.heancms,
|
||||
5: TypeSource.madara,
|
||||
};
|
||||
|
||||
Id _sourceGetId(Source object) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
|
|
@ -10,6 +9,7 @@ import 'package:mangayomi/modules/manga/detail/widgets/custom_floating_action_bt
|
|||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/utils/colors.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
import 'package:mangayomi/utils/media_query.dart';
|
||||
import 'package:mangayomi/modules/manga/detail/manga_detail_view.dart';
|
||||
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
|
||||
|
|
@ -99,14 +99,14 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
|||
),
|
||||
Row(
|
||||
children: [
|
||||
const Icon(
|
||||
FontAwesomeIcons.clock,
|
||||
Icon(
|
||||
getMangaStatusIcon(widget.manga.status),
|
||||
size: 12,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 4,
|
||||
),
|
||||
Text(widget.manga.status!),
|
||||
Text(getMangaStatusName(widget.manga.status)),
|
||||
const Text(' • '),
|
||||
Row(
|
||||
children: [
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ void pushToMangaReaderDetail(
|
|||
name: getManga.name,
|
||||
genre: getManga.genre,
|
||||
author: getManga.author,
|
||||
status: getManga.status,
|
||||
status: getManga.status!,
|
||||
description: getManga.description,
|
||||
link: getManga.url,
|
||||
source: getManga.source,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'get_chapter_url.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getChapterUrlHash() => r'7713a0aa89a528cf9aa90016fdebb63af89a2520';
|
||||
String _$getChapterUrlHash() => r'2ac689860d288da631afbf39ab7ad2df7e2b99f3';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'get_manga_detail.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getMangaDetailHash() => r'938a051244e585f8350f95556bd3f94b9d0145c4';
|
||||
String _$getMangaDetailHash() => r'ecad72288b8df330f295949d2b452b1bffa132a9';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'get_popular_manga.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getPopularMangaHash() => r'27240e2756f6bd99d44a553ddd7ebe4374618c8d';
|
||||
String _$getPopularMangaHash() => r'e973741f7105e38032412a7ae160003565779463';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'cloudflare_bypass.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$cloudflareBypassDomHash() =>
|
||||
r'f1307097afd3dd52318ecd83a4a979f4a6711aa2';
|
||||
r'9329b2e079dda8e1ccdbccd41fe7370df1509953';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
@ -129,7 +129,7 @@ class CloudflareBypassDomProvider extends AutoDisposeFutureProvider<Document?> {
|
|||
}
|
||||
|
||||
String _$cloudflareBypassHtmlHash() =>
|
||||
r'eb50578058f3b316fa07a01e336281931af55afb';
|
||||
r'8c1d6820ba10fe5ddfe6ce532e1e4677b563ceee';
|
||||
typedef CloudflareBypassHtmlRef = AutoDisposeFutureProviderRef<String>;
|
||||
|
||||
/// See also [cloudflareBypassHtml].
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'search_manga.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$searchMangaHash() => r'0d71677c6ef2822590f2061119134e3b0e3167f7';
|
||||
String _$searchMangaHash() => r'5f2a70ca38af7448f546f70db81cbe55a79a5fba';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'dart:convert';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/services/http_service/http_res_to_dom_html.dart';
|
||||
import 'package:mangayomi/sources/multisrc/heancms/model/search.dart';
|
||||
import 'package:mangayomi/sources/multisrc/heancms/utils/utils.dart';
|
||||
|
|
@ -120,7 +121,15 @@ class HeanCms extends MangaYomiServices {
|
|||
}
|
||||
|
||||
for (var a in data) {
|
||||
statusList.add(a.status ?? "Unknown");
|
||||
final status = (switch (a.status) {
|
||||
"Ongoing" => Status.ongoing,
|
||||
"Hiatus" => Status.onHiatus,
|
||||
"Dropped" => Status.canceled,
|
||||
"Completed" => Status.completed,
|
||||
"Finished" => Status.completed,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
statusList.add(status);
|
||||
image.add(a.thumbnail!.startsWith("https://")
|
||||
? a.thumbnail
|
||||
: "${getMangaAPIUrl(source)}cover/${a.thumbnail}");
|
||||
|
|
@ -156,7 +165,15 @@ class HeanCms extends MangaYomiServices {
|
|||
}
|
||||
|
||||
for (var a in data) {
|
||||
statusList.add(a.status ?? "Unknown");
|
||||
final status = (switch (a.status) {
|
||||
"Ongoing" => Status.ongoing,
|
||||
"Hiatus" => Status.onHiatus,
|
||||
"Dropped" => Status.canceled,
|
||||
"Completed" => Status.completed,
|
||||
"Finished" => Status.completed,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
statusList.add(status);
|
||||
image.add(a.thumbnail!.startsWith("https://")
|
||||
? a.thumbnail
|
||||
: "${getMangaAPIUrl(source)}cover/${a.thumbnail}");
|
||||
|
|
|
|||
|
|
@ -78,11 +78,11 @@ class Madara extends MangaYomiServices {
|
|||
.map((e) => e.text)
|
||||
.toList()
|
||||
.first;
|
||||
status = dom
|
||||
status = madaraStatusParser(dom
|
||||
.querySelectorAll("div.summary-content")
|
||||
.map((e) => e.text.trim().trimLeft().trimRight())
|
||||
.toList()
|
||||
.last;
|
||||
.last);
|
||||
|
||||
manga.imageUrl = dom
|
||||
.querySelectorAll("div.summary_image img")
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:intl/intl.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/sources/utils/utils.dart';
|
||||
|
||||
class WordSet {
|
||||
|
|
@ -107,3 +108,67 @@ int parseChapterDate(String? date, String source) {
|
|||
.millisecondsSinceEpoch;
|
||||
}
|
||||
}
|
||||
|
||||
List<String> completedStatusList = [
|
||||
"Completed",
|
||||
"Completo",
|
||||
"Completado",
|
||||
"Concluído",
|
||||
"Concluido",
|
||||
"Finalizado",
|
||||
"Terminé",
|
||||
"Hoàn Thành",
|
||||
"مكتملة",
|
||||
"مكتمل",
|
||||
"已完结",
|
||||
];
|
||||
|
||||
List<String> ongoingStatusList = [
|
||||
"OnGoing",
|
||||
"Продолжается",
|
||||
"Updating",
|
||||
"Em Lançamento",
|
||||
"Em lançamento",
|
||||
"Em andamento",
|
||||
"Em Andamento",
|
||||
"En cours",
|
||||
"Ativo",
|
||||
"Lançando",
|
||||
"Đang Tiến Hành",
|
||||
"Devam Ediyor",
|
||||
"Devam ediyor",
|
||||
"In Corso",
|
||||
"In Arrivo",
|
||||
"مستمرة",
|
||||
"مستمر",
|
||||
"En Curso",
|
||||
"En curso",
|
||||
"Emision",
|
||||
"En marcha",
|
||||
"Publicandose",
|
||||
"En emision",
|
||||
"连载中",
|
||||
];
|
||||
|
||||
List<String> hiatusStatusList = [
|
||||
"On Hold",
|
||||
"Pausado",
|
||||
"En espera",
|
||||
];
|
||||
|
||||
List<String> canceledStatusList = [
|
||||
"Canceled",
|
||||
"Cancelado",
|
||||
];
|
||||
|
||||
Status madaraStatusParser(String status) {
|
||||
return canceledStatusList.contains(status)
|
||||
? Status.canceled
|
||||
: completedStatusList.contains(status)
|
||||
? Status.completed
|
||||
: ongoingStatusList.contains(status)
|
||||
? Status.ongoing
|
||||
: hiatusStatusList.contains(status)
|
||||
? Status.onHiatus
|
||||
: Status.unknown;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:html/dom.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/services/http_service/http_service.dart';
|
||||
import 'package:mangayomi/sources/service.dart';
|
||||
import 'package:mangayomi/sources/utils/utils.dart';
|
||||
|
|
@ -22,7 +23,7 @@ class MangaThemeSia extends MangaYomiServices {
|
|||
final resHtml = dom.querySelector(
|
||||
'div.bigcontent, div.animefull, div.main-info, div.postbody');
|
||||
if (resHtml!.querySelectorAll('.tsinfo .imptdt').isNotEmpty) {
|
||||
status = resHtml
|
||||
status = mangathemesiaStatusParser(resHtml
|
||||
.querySelectorAll('.tsinfo .imptdt')
|
||||
.where((e) =>
|
||||
e.innerHtml.contains("Status") ||
|
||||
|
|
@ -31,24 +32,24 @@ class MangaThemeSia extends MangaYomiServices {
|
|||
? e.text.replaceAll('Situação', '').trim()
|
||||
: e.text.replaceAll('Status', '').trim())
|
||||
.toList()
|
||||
.last;
|
||||
.last);
|
||||
} else if (resHtml.querySelectorAll('.infotable tr').isNotEmpty) {
|
||||
status = resHtml
|
||||
status = mangathemesiaStatusParser(resHtml
|
||||
.querySelectorAll('.infotable tr')
|
||||
.where((e) =>
|
||||
e.innerHtml.toLowerCase().contains('statut') ||
|
||||
e.innerHtml.toLowerCase().contains('status'))
|
||||
.map((e) => e.querySelector('td:last-child')!.text)
|
||||
.toList()
|
||||
.first;
|
||||
.first);
|
||||
} else if (resHtml.querySelectorAll('.fmed').isNotEmpty) {
|
||||
status = resHtml
|
||||
status = mangathemesiaStatusParser(resHtml
|
||||
.querySelectorAll('.tsinfo .imptdt')
|
||||
.map((e) => e.text.replaceAll('Status', '').trim())
|
||||
.toList()
|
||||
.first;
|
||||
.first);
|
||||
} else {
|
||||
status = "";
|
||||
status = Status.unknown;
|
||||
}
|
||||
|
||||
//2
|
||||
|
|
@ -277,3 +278,13 @@ class MangaThemeSia extends MangaYomiServices {
|
|||
return pageUrls;
|
||||
}
|
||||
}
|
||||
|
||||
mangathemesiaStatusParser(String status) {
|
||||
return (switch (status) {
|
||||
"ongoing" => Status.ongoing,
|
||||
"publishing" => Status.ongoing,
|
||||
"hiatus" => Status.onHiatus,
|
||||
"completed" => Status.completed,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:html/dom.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/services/http_service/http_service.dart';
|
||||
import 'package:mangayomi/sources/multisrc/mmrcms/src/utils.dart';
|
||||
import 'package:mangayomi/sources/service.dart';
|
||||
import 'package:mangayomi/sources/utils/utils.dart';
|
||||
import 'package:mangayomi/utils/reg_exp_matcher.dart';
|
||||
|
|
@ -23,7 +24,7 @@ class Mmrcms extends MangaYomiServices {
|
|||
.map((e) => e.text.trim())
|
||||
.toList()
|
||||
.first;
|
||||
status = dom
|
||||
status = mmrcmsStatusParser(dom
|
||||
.querySelectorAll('.row .dl-horizontal dt')
|
||||
.where((e) =>
|
||||
e.innerHtml.toString().toLowerCase().contains("status") ||
|
||||
|
|
@ -32,7 +33,7 @@ class Mmrcms extends MangaYomiServices {
|
|||
e.innerHtml.toString().toLowerCase().contains("durum"))
|
||||
.map((e) => e.nextElementSibling!.text.trim())
|
||||
.toList()
|
||||
.first;
|
||||
.first);
|
||||
if (dom.querySelectorAll(".row .dl-horizontal dt").isNotEmpty) {
|
||||
author = dom
|
||||
.querySelectorAll('.row .dl-horizontal dt')
|
||||
|
|
|
|||
27
lib/sources/multisrc/mmrcms/src/utils.dart
Normal file
27
lib/sources/multisrc/mmrcms/src/utils.dart
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
import 'package:mangayomi/models/manga.dart';
|
||||
|
||||
Status mmrcmsStatusParser(String status) {
|
||||
return completedStatusList.contains(status)
|
||||
? Status.completed
|
||||
: ongoingStatusList.contains(status)
|
||||
? Status.ongoing
|
||||
: Status.unknown;
|
||||
}
|
||||
|
||||
List<String> completedStatusList = [
|
||||
"complete",
|
||||
"مكتملة",
|
||||
"complet",
|
||||
"completo",
|
||||
"zakończone",
|
||||
"concluído"
|
||||
];
|
||||
List<String> ongoingStatusList = [
|
||||
"ongoing",
|
||||
"مستمرة",
|
||||
"en cours",
|
||||
"em lançamento",
|
||||
"prace w toku",
|
||||
"ativo",
|
||||
"em andamento"
|
||||
];
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
|
||||
abstract class MangaYomiServices {
|
||||
List<String?> url = [];
|
||||
|
|
@ -7,8 +8,8 @@ abstract class MangaYomiServices {
|
|||
List<String?> image = [];
|
||||
List<String> genre = [];
|
||||
String? author = "";
|
||||
String? status = "";
|
||||
List<String> statusList = [];
|
||||
Status? status;
|
||||
List<Status> statusList = [];
|
||||
List<String> chapterTitle = [];
|
||||
List<String> chapterUrl = [];
|
||||
List<String> chapterDate = [];
|
||||
|
|
@ -22,7 +23,7 @@ abstract class MangaYomiServices {
|
|||
mangaList.add(GetManga(
|
||||
genre: genre,
|
||||
author: author,
|
||||
status: statusList.isEmpty ? "" : statusList[i],
|
||||
status: statusList.isEmpty ? Status.unknown : statusList[i],
|
||||
chapters: chapters,
|
||||
imageUrl: image[i],
|
||||
description: description,
|
||||
|
|
@ -83,7 +84,7 @@ class GetManga {
|
|||
List<String> genre = [];
|
||||
List<Chapter> chapters = [];
|
||||
String? author;
|
||||
String? status;
|
||||
Status? status;
|
||||
String? source;
|
||||
String? url;
|
||||
String? name;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'dart:convert';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/sources/src/all/comick/src/model/chapter_page_comick.dart';
|
||||
import 'package:mangayomi/sources/src/all/comick/src/model/manga_chapter_detail.dart';
|
||||
import 'package:mangayomi/sources/src/all/comick/src/model/manga_detail_comick.dart';
|
||||
|
|
@ -35,7 +36,7 @@ class Comick extends MangaYomiServices {
|
|||
name.add(popular.title);
|
||||
image.add(popular.coverUrl);
|
||||
}
|
||||
|
||||
|
||||
return mangaRes();
|
||||
}
|
||||
|
||||
|
|
@ -57,8 +58,7 @@ class Comick extends MangaYomiServices {
|
|||
String authorr =
|
||||
regExp.firstMatch(mangaDetailLMap.authors![0].toString())?.group(1) ??
|
||||
'';
|
||||
String statuss = parseStatut(mangaDetailLMap.comic!.status!);
|
||||
status = statuss;
|
||||
status = parseStatut(mangaDetailLMap.comic!.status!);
|
||||
author = authorr;
|
||||
RegExp regExp1 = RegExp(r'name:\s*(.*?)}');
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,16 @@
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
parseStatut(int i) {
|
||||
if (i == 1) {
|
||||
return 'Ongoing';
|
||||
} else if (i == 2) {
|
||||
return 'Completed';
|
||||
} else if (i == 3) {
|
||||
return 'Canceled';
|
||||
} else if (i == 4) {
|
||||
return '';
|
||||
} else {
|
||||
return 'Unknown';
|
||||
}
|
||||
return (switch (i) {
|
||||
1 => Status.ongoing,
|
||||
2 => Status.completed,
|
||||
3 => Status.canceled,
|
||||
4 => Status.onHiatus,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
}
|
||||
|
||||
Future findCurrentSlug(String oldSlug, AutoDisposeFutureProviderRef ref) async {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import 'package:flutter_js/flutter_js.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:html/dom.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/services/http_service/http_service.dart';
|
||||
import 'package:mangayomi/sources/service.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
|
@ -30,9 +32,13 @@ class Mangahere extends MangaYomiServices {
|
|||
.map((e) => e.text.trim())
|
||||
.toList();
|
||||
|
||||
status = tt[0];
|
||||
status = (switch (tt[0]) {
|
||||
"ongoing" => Status.ongoing,
|
||||
"completed" => Status.completed,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
} else {
|
||||
status = "";
|
||||
status = Status.unknown;
|
||||
}
|
||||
if (dom
|
||||
.querySelectorAll(
|
||||
|
|
@ -88,7 +94,7 @@ class Mangahere extends MangaYomiServices {
|
|||
.map((e) => e.text.trim())
|
||||
.toList();
|
||||
for (var ok in tt) {
|
||||
chapterDate.add(parseDate(ok, source));
|
||||
chapterDate.add(parseMangaHereChapterDate(ok, source).toString());
|
||||
}
|
||||
}
|
||||
if (dom
|
||||
|
|
@ -302,3 +308,24 @@ class Mangahere extends MangaYomiServices {
|
|||
return pageUrls;
|
||||
}
|
||||
}
|
||||
|
||||
int parseMangaHereChapterDate(String date, String source) {
|
||||
if (date.contains('Today') || date.contains(' ago')) {
|
||||
final now = DateTime.now();
|
||||
final today = DateTime(now.year, now.month, now.day);
|
||||
return today.millisecondsSinceEpoch;
|
||||
} else if (date.contains('Yesterday')) {
|
||||
final now = DateTime.now();
|
||||
final yesterday = DateTime(now.year, now.month, now.day - 1);
|
||||
return yesterday.millisecondsSinceEpoch;
|
||||
} else {
|
||||
try {
|
||||
final dateFormat =
|
||||
DateFormat(getFormatDate(source), getFormatDateLocale(source));
|
||||
final parsedDate = dateFormat.parse(date);
|
||||
return parsedDate.millisecondsSinceEpoch;
|
||||
} catch (e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:html/dom.dart' as dom;
|
||||
import 'package:html/dom.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/services/http_service/cloudflare/cloudflare_bypass.dart';
|
||||
import 'package:mangayomi/services/http_service/http_service.dart';
|
||||
import 'package:mangayomi/sources/service.dart';
|
||||
|
|
@ -35,8 +36,13 @@ class Japscan extends MangaYomiServices {
|
|||
.where((element) => element.innerHtml.contains('Statut:'))
|
||||
.map((e) => e.text)
|
||||
.toList();
|
||||
String sta = stat[0].replaceAll('Statut:', '').trim();
|
||||
if (stat.isNotEmpty) {
|
||||
status = stat[0].replaceAll('Statut:', '').trim();
|
||||
status = (switch (sta) {
|
||||
"En Cours" => Status.ongoing,
|
||||
"Terminé" => Status.completed,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
}
|
||||
|
||||
final auth = dom
|
||||
|
|
@ -49,7 +55,7 @@ class Japscan extends MangaYomiServices {
|
|||
}
|
||||
} else {
|
||||
author = "";
|
||||
status = "";
|
||||
status = Status.unknown;
|
||||
}
|
||||
|
||||
final genres = dom
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:html/dom.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/services/http_service/http_res_to_dom_html.dart';
|
||||
import 'package:mangayomi/services/http_service/http_service.dart';
|
||||
import 'package:mangayomi/sources/service.dart';
|
||||
|
|
@ -14,7 +15,9 @@ class MangaKawaii extends MangaYomiServices {
|
|||
required String source,
|
||||
required AutoDisposeFutureProviderRef ref}) async {
|
||||
final dom = await ref.watch(httpGetProvider(
|
||||
url: 'https://www.mangakawaii.io${manga.url}', source: source, resDom: true)
|
||||
url: 'https://www.mangakawaii.io${manga.url}',
|
||||
source: source,
|
||||
resDom: true)
|
||||
.future) as Document?;
|
||||
List detail = [];
|
||||
manga.imageUrl =
|
||||
|
|
@ -58,7 +61,11 @@ class MangaKawaii extends MangaYomiServices {
|
|||
}
|
||||
}
|
||||
detail = detail.toSet().toList();
|
||||
status = detail[0];
|
||||
status = (switch (detail[0]) {
|
||||
"En Cours" => Status.ongoing,
|
||||
"Terminé" => Status.completed,
|
||||
_ => Status.unknown,
|
||||
});
|
||||
author = detail[1];
|
||||
if (dom.querySelectorAll("tr[class*='volume-']").isNotEmpty) {
|
||||
final url = dom.querySelectorAll("tr[class*='volume-']").map((e) {
|
||||
|
|
@ -102,9 +109,7 @@ class MangaKawaii extends MangaYomiServices {
|
|||
.toList();
|
||||
if (urlz.length > url.length) {
|
||||
for (var _ in urlz) {
|
||||
chapterDate.add(parseDate(
|
||||
"${DateTime.now().day}.${DateTime.now().month}.${DateTime.now().year}",
|
||||
source));
|
||||
chapterDate.add(DateTime.now().millisecondsSinceEpoch.toString());
|
||||
}
|
||||
} else {
|
||||
for (var ok in url) {
|
||||
|
|
|
|||
|
|
@ -1,3 +1,25 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
|
||||
const defaultUserAgent =
|
||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0";
|
||||
|
||||
String getMangaStatusName(Status status) {
|
||||
return (switch (status) {
|
||||
Status.ongoing => "Ongoing",
|
||||
Status.onHiatus => "On hiatus",
|
||||
Status.canceled => "Canceled",
|
||||
Status.completed => "Completed",
|
||||
_ => "Unknown",
|
||||
});
|
||||
}
|
||||
|
||||
IconData getMangaStatusIcon(Status status) {
|
||||
return (switch (status) {
|
||||
Status.ongoing => Icons.schedule_rounded,
|
||||
Status.onHiatus => Icons.pause_circle_rounded,
|
||||
Status.canceled => Icons.cancel_rounded,
|
||||
Status.completed => Icons.done_all_rounded,
|
||||
_ => Icons.block_outlined,
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'headers.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$headersHash() => r'13a50be589fe0038aa6195027eb8da260d3b127f';
|
||||
String _$headersHash() => r'371ee77f40f010b4e2d5e354c30e666754b34291';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
Loading…
Reference in a new issue