change data structure for novel type

This commit is contained in:
playerterra1 2024-10-31 13:53:55 +00:00
parent 396bc57920
commit 04ddbb6ac7
31 changed files with 5008 additions and 794 deletions

View file

@ -187,6 +187,7 @@
"anime_sources": "Anime-Quellen",
"anime_extensions": "Anime-Erweiterungen",
"manga_extensions": "Manga-Erweiterungen",
"novel": "Novel",
"anime": "Anime",
"manga": "Manga",
"library_no_category_exist": "Sie haben noch keine Kategorien",

View file

@ -208,10 +208,13 @@
"n_episodes": "{n} episodes",
"manga_sources": "Manga Sources",
"anime_sources": "Anime Sources",
"novel_sources": "Novel Sources",
"anime_extensions": "Anime Extensions",
"manga_extensions": "Manga Extensions",
"novel_extensions": "Novel Extensions",
"anime": "Anime",
"manga": "Manga",
"novel": "Novel",
"library_no_category_exist": "You don't have any categories yet",
"watching": "Watching",
"plan_to_watch": "Plan to watch",

View file

@ -1,4 +1,5 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/models/manga.dart';
part 'category.g.dart';
@collection
@ -6,18 +7,19 @@ part 'category.g.dart';
class Category {
Id? id;
String? name;
bool? forManga;
@enumerated
late ItemType forItemType;
Category(
{this.id = Isar.autoIncrement,
required this.name,
required this.forManga});
required this.forItemType});
Category.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
forManga = json['forManga'];
forItemType = json['forItemType'];
}
Map<String, dynamic> toJson() =>
{'id': id, 'name': name, 'forManga': forManga};
{'id': id, 'name': name, 'forItemType': forItemType};
}

View file

@ -17,10 +17,11 @@ const CategorySchema = CollectionSchema(
name: r'Category',
id: 5751694338128944171,
properties: {
r'forManga': PropertySchema(
r'forItemType': PropertySchema(
id: 0,
name: r'forManga',
type: IsarType.bool,
name: r'forItemType',
type: IsarType.byte,
enumMap: _CategoryforItemTypeEnumValueMap,
),
r'name': PropertySchema(
id: 1,
@ -63,7 +64,7 @@ void _categorySerialize(
List<int> offsets,
Map<Type, List<int>> allOffsets,
) {
writer.writeBool(offsets[0], object.forManga);
writer.writeByte(offsets[0], object.forItemType.index);
writer.writeString(offsets[1], object.name);
}
@ -74,7 +75,9 @@ Category _categoryDeserialize(
Map<Type, List<int>> allOffsets,
) {
final object = Category(
forManga: reader.readBoolOrNull(offsets[0]),
forItemType:
_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ??
ItemType.manga,
id: id,
name: reader.readStringOrNull(offsets[1]),
);
@ -89,7 +92,8 @@ P _categoryDeserializeProp<P>(
) {
switch (propertyId) {
case 0:
return (reader.readBoolOrNull(offset)) as P;
return (_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
ItemType.manga) as P;
case 1:
return (reader.readStringOrNull(offset)) as P;
default:
@ -97,6 +101,17 @@ P _categoryDeserializeProp<P>(
}
}
const _CategoryforItemTypeEnumValueMap = {
'manga': 0,
'anime': 1,
'novel': 2,
};
const _CategoryforItemTypeValueEnumMap = {
0: ItemType.manga,
1: ItemType.anime,
2: ItemType.novel,
};
Id _categoryGetId(Category object) {
return object.id ?? Isar.autoIncrement;
}
@ -186,32 +201,60 @@ extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
extension CategoryQueryFilter
on QueryBuilder<Category, Category, QFilterCondition> {
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
property: r'forManga',
));
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaIsNotNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNotNull(
property: r'forManga',
));
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaEqualTo(
bool? value) {
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeEqualTo(
ItemType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'forManga',
property: r'forItemType',
value: value,
));
});
}
QueryBuilder<Category, Category, QAfterFilterCondition>
forItemTypeGreaterThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'forItemType',
value: value,
));
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeLessThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'forItemType',
value: value,
));
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeBetween(
ItemType lower,
ItemType upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'forItemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<Category, Category, QAfterFilterCondition> idIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@ -434,15 +477,15 @@ extension CategoryQueryLinks
on QueryBuilder<Category, Category, QFilterCondition> {}
extension CategoryQuerySortBy on QueryBuilder<Category, Category, QSortBy> {
QueryBuilder<Category, Category, QAfterSortBy> sortByForManga() {
QueryBuilder<Category, Category, QAfterSortBy> sortByForItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'forManga', Sort.asc);
return query.addSortBy(r'forItemType', Sort.asc);
});
}
QueryBuilder<Category, Category, QAfterSortBy> sortByForMangaDesc() {
QueryBuilder<Category, Category, QAfterSortBy> sortByForItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'forManga', Sort.desc);
return query.addSortBy(r'forItemType', Sort.desc);
});
}
@ -461,15 +504,15 @@ extension CategoryQuerySortBy on QueryBuilder<Category, Category, QSortBy> {
extension CategoryQuerySortThenBy
on QueryBuilder<Category, Category, QSortThenBy> {
QueryBuilder<Category, Category, QAfterSortBy> thenByForManga() {
QueryBuilder<Category, Category, QAfterSortBy> thenByForItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'forManga', Sort.asc);
return query.addSortBy(r'forItemType', Sort.asc);
});
}
QueryBuilder<Category, Category, QAfterSortBy> thenByForMangaDesc() {
QueryBuilder<Category, Category, QAfterSortBy> thenByForItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'forManga', Sort.desc);
return query.addSortBy(r'forItemType', Sort.desc);
});
}
@ -500,9 +543,9 @@ extension CategoryQuerySortThenBy
extension CategoryQueryWhereDistinct
on QueryBuilder<Category, Category, QDistinct> {
QueryBuilder<Category, Category, QDistinct> distinctByForManga() {
QueryBuilder<Category, Category, QDistinct> distinctByForItemType() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'forManga');
return query.addDistinctBy(r'forItemType');
});
}
@ -522,9 +565,9 @@ extension CategoryQueryProperty
});
}
QueryBuilder<Category, bool?, QQueryOperations> forMangaProperty() {
QueryBuilder<Category, ItemType, QQueryOperations> forItemTypeProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'forManga');
return query.addPropertyName(r'forItemType');
});
}

View file

@ -24,6 +24,9 @@ class Manga {
bool? isManga;
@enumerated
late ItemType itemType;
List<String>? genre;
bool? favorite;
@ -63,6 +66,7 @@ class Manga {
required this.status,
required this.description,
this.isManga = true,
this.itemType = ItemType.manga,
this.dateAdded,
this.lastUpdate,
this.categories,
@ -84,6 +88,7 @@ class Manga {
imageUrl = json['imageUrl'];
isLocalArchive = json['isLocalArchive'];
isManga = json['isManga'];
itemType = ItemType.values[json['itemType']];
lang = json['lang'];
lastRead = json['lastRead'];
lastUpdate = json['lastUpdate'];
@ -107,6 +112,7 @@ class Manga {
'imageUrl': imageUrl,
'isLocalArchive': isLocalArchive,
'isManga': isManga,
'itemType': itemType.index,
'lang': lang,
'lastRead': lastRead,
'lastUpdate': lastUpdate,
@ -126,3 +132,9 @@ enum Status {
onHiatus,
publishingFinished
}
enum ItemType {
manga,
anime,
novel
}

View file

@ -77,38 +77,44 @@ const MangaSchema = CollectionSchema(
name: r'isManga',
type: IsarType.bool,
),
r'lang': PropertySchema(
r'itemType': PropertySchema(
id: 12,
name: r'itemType',
type: IsarType.byte,
enumMap: _MangaitemTypeEnumValueMap,
),
r'lang': PropertySchema(
id: 13,
name: r'lang',
type: IsarType.string,
),
r'lastRead': PropertySchema(
id: 13,
id: 14,
name: r'lastRead',
type: IsarType.long,
),
r'lastUpdate': PropertySchema(
id: 14,
id: 15,
name: r'lastUpdate',
type: IsarType.long,
),
r'link': PropertySchema(
id: 15,
id: 16,
name: r'link',
type: IsarType.string,
),
r'name': PropertySchema(
id: 16,
id: 17,
name: r'name',
type: IsarType.string,
),
r'source': PropertySchema(
id: 17,
id: 18,
name: r'source',
type: IsarType.string,
),
r'status': PropertySchema(
id: 18,
id: 19,
name: r'status',
type: IsarType.byte,
enumMap: _MangastatusEnumValueMap,
@ -241,13 +247,14 @@ void _mangaSerialize(
writer.writeString(offsets[9], object.imageUrl);
writer.writeBool(offsets[10], object.isLocalArchive);
writer.writeBool(offsets[11], object.isManga);
writer.writeString(offsets[12], object.lang);
writer.writeLong(offsets[13], object.lastRead);
writer.writeLong(offsets[14], object.lastUpdate);
writer.writeString(offsets[15], object.link);
writer.writeString(offsets[16], object.name);
writer.writeString(offsets[17], object.source);
writer.writeByte(offsets[18], object.status.index);
writer.writeByte(offsets[12], object.itemType.index);
writer.writeString(offsets[13], object.lang);
writer.writeLong(offsets[14], object.lastRead);
writer.writeLong(offsets[15], object.lastUpdate);
writer.writeString(offsets[16], object.link);
writer.writeString(offsets[17], object.name);
writer.writeString(offsets[18], object.source);
writer.writeByte(offsets[19], object.status.index);
}
Manga _mangaDeserialize(
@ -270,13 +277,15 @@ Manga _mangaDeserialize(
imageUrl: reader.readStringOrNull(offsets[9]),
isLocalArchive: reader.readBoolOrNull(offsets[10]),
isManga: reader.readBoolOrNull(offsets[11]),
lang: reader.readStringOrNull(offsets[12]),
lastRead: reader.readLongOrNull(offsets[13]),
lastUpdate: reader.readLongOrNull(offsets[14]),
link: reader.readStringOrNull(offsets[15]),
name: reader.readStringOrNull(offsets[16]),
source: reader.readStringOrNull(offsets[17]),
status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[18])] ??
itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ??
ItemType.manga,
lang: reader.readStringOrNull(offsets[13]),
lastRead: reader.readLongOrNull(offsets[14]),
lastUpdate: reader.readLongOrNull(offsets[15]),
link: reader.readStringOrNull(offsets[16]),
name: reader.readStringOrNull(offsets[17]),
source: reader.readStringOrNull(offsets[18]),
status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[19])] ??
Status.ongoing,
);
return object;
@ -314,18 +323,21 @@ P _mangaDeserializeProp<P>(
case 11:
return (reader.readBoolOrNull(offset)) as P;
case 12:
return (reader.readStringOrNull(offset)) as P;
return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
ItemType.manga) as P;
case 13:
return (reader.readLongOrNull(offset)) as P;
return (reader.readStringOrNull(offset)) as P;
case 14:
return (reader.readLongOrNull(offset)) as P;
case 15:
return (reader.readStringOrNull(offset)) as P;
return (reader.readLongOrNull(offset)) as P;
case 16:
return (reader.readStringOrNull(offset)) as P;
case 17:
return (reader.readStringOrNull(offset)) as P;
case 18:
return (reader.readStringOrNull(offset)) as P;
case 19:
return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ??
Status.ongoing) as P;
default:
@ -333,6 +345,16 @@ P _mangaDeserializeProp<P>(
}
}
const _MangaitemTypeEnumValueMap = {
'manga': 0,
'anime': 1,
'novel': 2,
};
const _MangaitemTypeValueEnumMap = {
0: ItemType.manga,
1: ItemType.anime,
2: ItemType.novel,
};
const _MangastatusEnumValueMap = {
'ongoing': 0,
'completed': 1,
@ -1937,6 +1959,59 @@ extension MangaQueryFilter on QueryBuilder<Manga, Manga, QFilterCondition> {
});
}
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeEqualTo(
ItemType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeGreaterThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeLessThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeBetween(
ItemType lower,
ItemType upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'itemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<Manga, Manga, QAfterFilterCondition> langIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@ -2875,6 +2950,18 @@ extension MangaQuerySortBy on QueryBuilder<Manga, Manga, QSortBy> {
});
}
QueryBuilder<Manga, Manga, QAfterSortBy> sortByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.asc);
});
}
QueryBuilder<Manga, Manga, QAfterSortBy> sortByItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.desc);
});
}
QueryBuilder<Manga, Manga, QAfterSortBy> sortByLang() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'lang', Sort.asc);
@ -3081,6 +3168,18 @@ extension MangaQuerySortThenBy on QueryBuilder<Manga, Manga, QSortThenBy> {
});
}
QueryBuilder<Manga, Manga, QAfterSortBy> thenByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.asc);
});
}
QueryBuilder<Manga, Manga, QAfterSortBy> thenByItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.desc);
});
}
QueryBuilder<Manga, Manga, QAfterSortBy> thenByLang() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'lang', Sort.asc);
@ -3245,6 +3344,12 @@ extension MangaQueryWhereDistinct on QueryBuilder<Manga, Manga, QDistinct> {
});
}
QueryBuilder<Manga, Manga, QDistinct> distinctByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'itemType');
});
}
QueryBuilder<Manga, Manga, QDistinct> distinctByLang(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -3372,6 +3477,12 @@ extension MangaQueryProperty on QueryBuilder<Manga, Manga, QQueryProperty> {
});
}
QueryBuilder<Manga, ItemType, QQueryOperations> itemTypeProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'itemType');
});
}
QueryBuilder<Manga, String?, QQueryOperations> langProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'lang');

View file

@ -185,11 +185,38 @@ class Settings {
int? animeGridSize;
int? novelGridSize;
@enumerated
late SectionType disableSectionType;
bool? useLibass;
int? libraryFilterNovelDownloadType;
int? libraryFilterNovelUnreadType;
int? libraryFilterNovelStartedType;
int? libraryFilterNovelBookMarkedType;
bool? novelLibraryShowCategoryTabs;
bool? novelLibraryDownloadedChapters;
bool? novelLibraryShowLanguage;
bool? novelLibraryShowNumbersOfItems;
bool? novelLibraryShowContinueReadingButton;
bool? novelLibraryLocalSource;
late SortLibraryManga? sortLibraryNovel;
@enumerated
late DisplayType novelDisplayType;
Settings(
{this.id = 227,
this.displayType = DisplayType.compactGrid,
@ -239,7 +266,7 @@ class Settings {
this.animeLibraryShowNumbersOfItems = false,
this.animeLibraryShowContinueReadingButton = false,
this.animeLibraryLocalSource,
this.sortLibraryAnime,
this.sortLibraryAnime, // TODO add novel settings
this.pagePreloadAmount = 6,
this.scaleType = ScaleType.fitScreen,
this.checkForExtensionUpdates = true,

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,6 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_source.dart';
import 'package:mangayomi/models/manga.dart';
part 'source.g.dart';
@collection
@ -49,6 +50,9 @@ class Source {
bool? isManga;
@enumerated
late ItemType itemType;
String? appMinVerReq;
String? additionalParams;
@ -83,6 +87,7 @@ class Source {
this.sourceCode = '',
this.headers = '',
this.isManga = true,
this.itemType = ItemType.manga,
this.appMinVerReq = "",
this.additionalParams = "",
this.isLocal = false,
@ -102,6 +107,7 @@ class Source {
isAdded = json['isAdded'];
isFullData = json['isFullData'];
isManga = json['isManga'];
itemType = ItemType.values[json['itemType'] ?? 0];
isNsfw = json['isNsfw'];
isPinned = json['isPinned'];
lang = json['lang'];
@ -133,6 +139,7 @@ class Source {
'isAdded': isAdded,
'isFullData': isFullData,
'isManga': isManga,
'itemType': itemType,
'isNsfw': isNsfw,
'isPinned': isPinned,
'lang': lang,

View file

@ -107,49 +107,55 @@ const SourceSchema = CollectionSchema(
name: r'isTorrent',
type: IsarType.bool,
),
r'lang': PropertySchema(
r'itemType': PropertySchema(
id: 18,
name: r'itemType',
type: IsarType.byte,
enumMap: _SourceitemTypeEnumValueMap,
),
r'lang': PropertySchema(
id: 19,
name: r'lang',
type: IsarType.string,
),
r'lastUsed': PropertySchema(
id: 19,
id: 20,
name: r'lastUsed',
type: IsarType.bool,
),
r'name': PropertySchema(
id: 20,
id: 21,
name: r'name',
type: IsarType.string,
),
r'sourceCode': PropertySchema(
id: 21,
id: 22,
name: r'sourceCode',
type: IsarType.string,
),
r'sourceCodeLanguage': PropertySchema(
id: 22,
id: 23,
name: r'sourceCodeLanguage',
type: IsarType.byte,
enumMap: _SourcesourceCodeLanguageEnumValueMap,
),
r'sourceCodeUrl': PropertySchema(
id: 23,
id: 24,
name: r'sourceCodeUrl',
type: IsarType.string,
),
r'typeSource': PropertySchema(
id: 24,
id: 25,
name: r'typeSource',
type: IsarType.string,
),
r'version': PropertySchema(
id: 25,
id: 26,
name: r'version',
type: IsarType.string,
),
r'versionLast': PropertySchema(
id: 26,
id: 27,
name: r'versionLast',
type: IsarType.string,
)
@ -291,15 +297,16 @@ void _sourceSerialize(
writer.writeBool(offsets[15], object.isObsolete);
writer.writeBool(offsets[16], object.isPinned);
writer.writeBool(offsets[17], object.isTorrent);
writer.writeString(offsets[18], object.lang);
writer.writeBool(offsets[19], object.lastUsed);
writer.writeString(offsets[20], object.name);
writer.writeString(offsets[21], object.sourceCode);
writer.writeByte(offsets[22], object.sourceCodeLanguage.index);
writer.writeString(offsets[23], object.sourceCodeUrl);
writer.writeString(offsets[24], object.typeSource);
writer.writeString(offsets[25], object.version);
writer.writeString(offsets[26], object.versionLast);
writer.writeByte(offsets[18], object.itemType.index);
writer.writeString(offsets[19], object.lang);
writer.writeBool(offsets[20], object.lastUsed);
writer.writeString(offsets[21], object.name);
writer.writeString(offsets[22], object.sourceCode);
writer.writeByte(offsets[23], object.sourceCodeLanguage.index);
writer.writeString(offsets[24], object.sourceCodeUrl);
writer.writeString(offsets[25], object.typeSource);
writer.writeString(offsets[26], object.version);
writer.writeString(offsets[27], object.versionLast);
}
Source _sourceDeserialize(
@ -327,17 +334,19 @@ Source _sourceDeserialize(
isNsfw: reader.readBoolOrNull(offsets[14]),
isObsolete: reader.readBoolOrNull(offsets[15]),
isPinned: reader.readBoolOrNull(offsets[16]),
lang: reader.readStringOrNull(offsets[18]),
lastUsed: reader.readBoolOrNull(offsets[19]),
name: reader.readStringOrNull(offsets[20]),
sourceCode: reader.readStringOrNull(offsets[21]),
sourceCodeUrl: reader.readStringOrNull(offsets[23]),
typeSource: reader.readStringOrNull(offsets[24]),
version: reader.readStringOrNull(offsets[25]),
versionLast: reader.readStringOrNull(offsets[26]),
itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[18])] ??
ItemType.manga,
lang: reader.readStringOrNull(offsets[19]),
lastUsed: reader.readBoolOrNull(offsets[20]),
name: reader.readStringOrNull(offsets[21]),
sourceCode: reader.readStringOrNull(offsets[22]),
sourceCodeUrl: reader.readStringOrNull(offsets[24]),
typeSource: reader.readStringOrNull(offsets[25]),
version: reader.readStringOrNull(offsets[26]),
versionLast: reader.readStringOrNull(offsets[27]),
);
object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[
reader.readByteOrNull(offsets[22])] ??
reader.readByteOrNull(offsets[23])] ??
SourceCodeLanguage.dart;
return object;
}
@ -386,30 +395,43 @@ P _sourceDeserializeProp<P>(
case 17:
return (reader.readBool(offset)) as P;
case 18:
return (reader.readStringOrNull(offset)) as P;
return (_SourceitemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
ItemType.manga) as P;
case 19:
return (reader.readBoolOrNull(offset)) as P;
case 20:
return (reader.readStringOrNull(offset)) as P;
case 20:
return (reader.readBoolOrNull(offset)) as P;
case 21:
return (reader.readStringOrNull(offset)) as P;
case 22:
return (reader.readStringOrNull(offset)) as P;
case 23:
return (_SourcesourceCodeLanguageValueEnumMap[
reader.readByteOrNull(offset)] ??
SourceCodeLanguage.dart) as P;
case 23:
return (reader.readStringOrNull(offset)) as P;
case 24:
return (reader.readStringOrNull(offset)) as P;
case 25:
return (reader.readStringOrNull(offset)) as P;
case 26:
return (reader.readStringOrNull(offset)) as P;
case 27:
return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
}
const _SourceitemTypeEnumValueMap = {
'manga': 0,
'anime': 1,
'novel': 2,
};
const _SourceitemTypeValueEnumMap = {
0: ItemType.manga,
1: ItemType.anime,
2: ItemType.novel,
};
const _SourcesourceCodeLanguageEnumValueMap = {
'dart': 0,
'javascript': 1,
@ -1997,6 +2019,59 @@ extension SourceQueryFilter on QueryBuilder<Source, Source, QFilterCondition> {
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeEqualTo(
ItemType value) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.equalTo(
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeGreaterThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.greaterThan(
include: include,
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeLessThan(
ItemType value, {
bool include = false,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.lessThan(
include: include,
property: r'itemType',
value: value,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeBetween(
ItemType lower,
ItemType upper, {
bool includeLower = true,
bool includeUpper = true,
}) {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(FilterCondition.between(
property: r'itemType',
lower: lower,
includeLower: includeLower,
upper: upper,
includeUpper: includeUpper,
));
});
}
QueryBuilder<Source, Source, QAfterFilterCondition> langIsNull() {
return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const FilterCondition.isNull(
@ -3321,6 +3396,18 @@ extension SourceQuerySortBy on QueryBuilder<Source, Source, QSortBy> {
});
}
QueryBuilder<Source, Source, QAfterSortBy> sortByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.asc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> sortByItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.desc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> sortByLang() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'lang', Sort.asc);
@ -3659,6 +3746,18 @@ extension SourceQuerySortThenBy on QueryBuilder<Source, Source, QSortThenBy> {
});
}
QueryBuilder<Source, Source, QAfterSortBy> thenByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.asc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> thenByItemTypeDesc() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'itemType', Sort.desc);
});
}
QueryBuilder<Source, Source, QAfterSortBy> thenByLang() {
return QueryBuilder.apply(this, (query) {
return query.addSortBy(r'lang', Sort.asc);
@ -3887,6 +3986,12 @@ extension SourceQueryWhereDistinct on QueryBuilder<Source, Source, QDistinct> {
});
}
QueryBuilder<Source, Source, QDistinct> distinctByItemType() {
return QueryBuilder.apply(this, (query) {
return query.addDistinctBy(r'itemType');
});
}
QueryBuilder<Source, Source, QDistinct> distinctByLang(
{bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) {
@ -4065,6 +4170,12 @@ extension SourceQueryProperty on QueryBuilder<Source, Source, QQueryProperty> {
});
}
QueryBuilder<Source, ItemType, QQueryOperations> itemTypeProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'itemType');
});
}
QueryBuilder<Source, String?, QQueryOperations> langProperty() {
return QueryBuilder.apply(this, (query) {
return query.addPropertyName(r'lang');

View file

@ -40,8 +40,8 @@ import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/utils/global_style.dart';
class LibraryScreen extends ConsumerStatefulWidget {
final bool isManga;
const LibraryScreen({required this.isManga, super.key});
final ItemType itemType;
const LibraryScreen({required this.itemType, super.key});
@override
ConsumerState<LibraryScreen> createState() => _LibraryScreenState();
@ -83,13 +83,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
final settings = settingsList.first;
final categories =
ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga));
ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType));
final withoutCategories = ref.watch(
getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga));
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType));
final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final mangaAll = ref.watch(
getAllMangaStreamProvider(categoryId: null, isManga: widget.isManga));
getAllMangaStreamProvider(categoryId: null, itemType: widget.itemType));
final l10n = l10nLocalizations(context)!;
return Scaffold(
body: mangaAll.when(
@ -113,55 +113,55 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
return Consumer(builder: (context, ref, child) {
bool reverse = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.reverse!;
final continueReaderBtn = ref.watch(
libraryShowContinueReadingButtonStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final showNumbersOfItems = ref.watch(
libraryShowNumbersOfItemsStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final localSource = ref.watch(
libraryLocalSourceStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final downloadedChapter = ref.watch(
libraryDownloadedChaptersStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final language = ref.watch(
libraryLanguageStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final displayType = ref.watch(
libraryDisplayTypeStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final isNotFiltering = ref.watch(
mangasFilterResultStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final downloadFilterType = ref.watch(
mangaFilterDownloadedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final unreadFilterType = ref.watch(
mangaFilterUnreadStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final startedFilterType = ref.watch(
mangaFilterStartedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final bookmarkedFilterType = ref.watch(
mangaFilterBookmarkedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final sortType = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.index as int;
final numberOfItemsList = _filterAndSortManga(
data: man,
@ -364,53 +364,53 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
return Consumer(builder: (context, ref, child) {
bool reverse = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.reverse!;
final continueReaderBtn = ref.watch(
libraryShowContinueReadingButtonStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final showNumbersOfItems = ref.watch(
libraryShowNumbersOfItemsStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final localSource = ref.watch(
libraryLocalSourceStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final downloadedChapter = ref.watch(
libraryDownloadedChaptersStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final language = ref.watch(libraryLanguageStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final displayType = ref.watch(
libraryDisplayTypeStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final isNotFiltering = ref.watch(
mangasFilterResultStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final downloadFilterType = ref.watch(
mangaFilterDownloadedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final unreadFilterType = ref.watch(
mangaFilterUnreadStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final startedFilterType = ref.watch(
mangaFilterStartedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final bookmarkedFilterType = ref.watch(
mangaFilterBookmarkedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings));
final sortType = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.index;
final numberOfItemsList = _filterAndSortManga(
data: man,
@ -518,9 +518,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
.set();
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
isManga: widget.isManga));
itemType: widget.itemType));
ref.invalidate(getAllMangaStreamProvider(
categoryId: null, isManga: widget.isManga));
categoryId: null, itemType: widget.itemType));
},
child: Icon(
Icons.done_all_sharp,
@ -545,9 +545,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
.set();
ref.invalidate(
getAllMangaWithoutCategoriesStreamProvider(
isManga: widget.isManga));
itemType: widget.itemType));
ref.invalidate(getAllMangaStreamProvider(
categoryId: null, isManga: widget.isManga));
categoryId: null, itemType: widget.itemType));
},
child: Icon(
Icons.remove_done_sharp,
@ -611,10 +611,10 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required int categoryId,
required Settings settings}) {
final mangas = ref.watch(getAllMangaStreamProvider(
categoryId: categoryId, isManga: widget.isManga));
categoryId: categoryId, itemType: widget.itemType));
final sortType = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.index;
return mangas.when(
data: (data) {
@ -661,10 +661,10 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required Settings settings}) {
final l10n = l10nLocalizations(context)!;
final mangas = ref.watch(getAllMangaStreamProvider(
categoryId: categoryId, isManga: widget.isManga));
categoryId: categoryId, itemType: widget.itemType));
final sortType = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.index;
final mangaIdsList = ref.watch(mangasListStateProvider);
return Scaffold(
@ -702,7 +702,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
language: language,
mangaIdsList: mangaIdsList,
localSource: localSource,
isManga: widget.isManga,
itemType: widget.itemType,
),
);
}
@ -733,13 +733,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
required Settings settings}) {
final sortType = ref
.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings))
itemType: widget.itemType, settings: settings))
.index;
final manga = withouCategories
? ref.watch(
getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga))
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType))
: ref.watch(getAllMangaStreamProvider(
categoryId: null, isManga: widget.isManga));
categoryId: null, itemType: widget.itemType));
final mangaIdsList = ref.watch(mangasListStateProvider);
final l10n = l10nLocalizations(context)!;
return manga.when(
@ -776,7 +776,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
language: language,
mangaIdsList: mangaIdsList,
localSource: localSource,
isManga: widget.isManga,
itemType: widget.itemType,
),
);
}
@ -954,7 +954,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
.filter()
.idIsNotNull()
.and()
.forMangaEqualTo(widget.isManga)
.forItemTypeEqualTo(widget.itemType)
.watch(fireImmediately: true),
builder: (context, snapshot) {
return AlertDialog(
@ -1006,7 +1006,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onPressed: () {
context.push("/categories", extra: (
true,
widget.isManga ? 0 : 1
widget.itemType
));
Navigator.pop(context);
},
@ -1059,7 +1059,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onPressed: () {
context.push("/categories", extra: (
true,
widget.isManga ? 0 : 1
widget.itemType
));
Navigator.pop(context);
},
@ -1270,13 +1270,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ListTileChapterFilter(
label: l10n.downloaded,
type: ref.watch(mangaFilterDownloadedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)),
onTap: () {
ref
.read(mangaFilterDownloadedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)
.notifier)
@ -1285,13 +1285,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ListTileChapterFilter(
label: l10n.unread,
type: ref.watch(mangaFilterUnreadStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)),
onTap: () {
ref
.read(mangaFilterUnreadStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)
.notifier)
@ -1300,13 +1300,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ListTileChapterFilter(
label: l10n.started,
type: ref.watch(mangaFilterStartedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)),
onTap: () {
ref
.read(mangaFilterStartedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)
.notifier)
@ -1315,14 +1315,14 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ListTileChapterFilter(
label: l10n.bookmarked,
type: ref.watch(mangaFilterBookmarkedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)),
onTap: () {
setState(() {
ref
.read(mangaFilterBookmarkedStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
mangaList: _entries,
settings: settings)
.notifier)
@ -1335,11 +1335,11 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
Consumer(builder: (context, ref, chil) {
final reverse = ref
.read(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings)
itemType: widget.itemType, settings: settings)
.notifier)
.isReverse();
final reverseChapter = ref.watch(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
return Column(
children: [
for (var i = 0; i < 7; i++)
@ -1349,7 +1349,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onTap: () {
ref
.read(sortLibraryMangaStateProvider(
isManga: widget.isManga, settings: settings)
itemType: widget.itemType, settings: settings)
.notifier)
.set(i);
},
@ -1360,25 +1360,25 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
}),
Consumer(builder: (context, ref, chil) {
final display = ref.watch(libraryDisplayTypeStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final displayV = ref.read(libraryDisplayTypeStateProvider(
isManga: widget.isManga, settings: settings)
itemType: widget.itemType, settings: settings)
.notifier);
final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final continueReaderBtn = ref.watch(
libraryShowContinueReadingButtonStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final showNumbersOfItems = ref.watch(
libraryShowNumbersOfItemsStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final downloadedChapter = ref.watch(
libraryDownloadedChaptersStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final language = ref.watch(libraryLanguageStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
final localSource = ref.watch(libraryLocalSourceStateProvider(
isManga: widget.isManga, settings: settings));
itemType: widget.itemType, settings: settings));
return SingleChildScrollView(
physics: const NeverScrollableScrollPhysics(),
child: Column(
@ -1451,7 +1451,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
Consumer(
builder: (context, ref, child) {
final gridSize = ref.watch(libraryGridSizeStateProvider(
isManga: widget.isManga)) ??
itemType: widget.itemType)) ??
0;
return Padding(
padding: const EdgeInsets.only(left: 8, right: 8, top: 10),
@ -1484,14 +1484,14 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
HapticFeedback.vibrate();
ref
.read(libraryGridSizeStateProvider(
isManga: widget.isManga)
itemType: widget.itemType)
.notifier)
.set(value.toInt());
},
onChangeEnd: (value) {
ref
.read(libraryGridSizeStateProvider(
isManga: widget.isManga)
itemType: widget.itemType)
.notifier)
.set(value.toInt(), end: true);
},
@ -1521,7 +1521,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onTap: () {
ref
.read(libraryDownloadedChaptersStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
settings: settings)
.notifier)
.set(!downloadedChapter);
@ -1532,7 +1532,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onTap: () {
ref
.read(libraryLanguageStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
settings: settings)
.notifier)
.set(!language);
@ -1543,7 +1543,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onTap: () {
ref
.read(libraryLocalSourceStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
settings: settings)
.notifier)
.set(!localSource);
@ -1555,7 +1555,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
ref
.read(
libraryShowContinueReadingButtonStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
settings: settings)
.notifier)
.set(!continueReaderBtn);
@ -1579,7 +1579,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onTap: () {
ref
.read(libraryShowCategoryTabsStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
settings: settings)
.notifier)
.set(!showCategoryTabs);
@ -1590,7 +1590,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
onTap: () {
ref
.read(libraryShowNumbersOfItemsStateProvider(
isManga: widget.isManga,
itemType: widget.itemType,
settings: settings)
.notifier)
.set(!showNumbersOfItems);
@ -1636,9 +1636,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
final mangaIdsList = ref.watch(mangasListStateProvider);
final manga = categoryId == null
? ref.watch(
getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga))
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType))
: ref.watch(getAllMangaStreamProvider(
categoryId: categoryId, isManga: widget.isManga));
categoryId: categoryId, itemType: widget.itemType));
final l10n = l10nLocalizations(context)!;
return PreferredSize(
preferredSize: Size.fromHeight(AppBar().preferredSize.height),
@ -1707,7 +1707,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
: Row(
children: [
Text(
widget.isManga ? l10n.manga : l10n.anime,
widget.itemType == ItemType.manga ?
l10n.manga : widget.itemType == ItemType.anime ?
l10n.anime : l10n.novel,
style:
TextStyle(color: Theme.of(context).hintColor),
),
@ -1783,7 +1785,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
value: 1, child: Text(l10n.open_random_entry)),
PopupMenuItem<int>(
value: 2, child: Text(l10n.import)),
if (!widget.isManga)
if (widget.itemType == ItemType.anime)
PopupMenuItem<int>(
value: 3, child: Text(l10n.torrent_stream)),
];
@ -1806,8 +1808,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
source: randomManga.source!);
});
} else if (value == 2) {
_importLocal(context, widget.isManga);
} else if (value == 3 && !widget.isManga) {
_importLocal(context, widget.itemType);
} else if (value == 3 && widget.itemType == ItemType.anime) {
addTorrent(context);
}
}),
@ -1816,7 +1818,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
}
}
void _importLocal(BuildContext context, bool isManga) {
void _importLocal(BuildContext context, ItemType itemType) {
final l10n = l10nLocalizations(context)!;
bool isLoading = false;
showDialog(
@ -1850,7 +1852,7 @@ void _importLocal(BuildContext context, bool isManga) {
});
await ref.watch(
importArchivesFromFileProvider(
isManga: isManga,
itemType: itemType,
null,
init: true)
.future);
@ -1865,7 +1867,7 @@ void _importLocal(BuildContext context, bool isManga) {
children: [
const Icon(Icons.archive_outlined),
Text(
"${l10n.import_files} ( ${isManga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )",
"${l10n.import_files} ( ${itemType == ItemType.manga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )",
style: TextStyle(
color: Theme.of(context)
.textTheme

View file

@ -7,14 +7,14 @@ part 'isar_providers.g.dart';
@riverpod
Stream<List<Manga>> getAllMangaStream(GetAllMangaStreamRef ref,
{required int? categoryId, required bool? isManga}) async* {
{required int? categoryId, required ItemType itemType}) async* {
yield* categoryId == null
? isar.mangas
.filter()
.idIsNotNull()
.favoriteEqualTo(true)
.and()
.isMangaEqualTo(isManga)
.itemTypeEqualTo(itemType)
.watch(fireImmediately: true)
: isar.mangas
.filter()
@ -23,27 +23,27 @@ Stream<List<Manga>> getAllMangaStream(GetAllMangaStreamRef ref,
.categoriesIsNotEmpty()
.categoriesElementEqualTo(categoryId)
.and()
.isMangaEqualTo(isManga)
.itemTypeEqualTo(itemType)
.watch(fireImmediately: true);
}
@riverpod
Stream<List<Manga>> getAllMangaWithoutCategoriesStream(
GetAllMangaWithoutCategoriesStreamRef ref,
{required bool? isManga}) async* {
{required ItemType itemType}) async* {
yield* isar.mangas
.filter()
.idIsNotNull()
.favoriteEqualTo(true)
.categoriesIsEmpty()
.and()
.isMangaEqualTo(isManga)
.itemTypeEqualTo(itemType)
.or()
.idIsNotNull()
.categoriesIsNull()
.favoriteEqualTo(true)
.and()
.isMangaEqualTo(isManga)
.itemTypeEqualTo(itemType)
.watch(fireImmediately: true);
}

View file

@ -6,7 +6,7 @@ part of 'isar_providers.dart';
// RiverpodGenerator
// **************************************************************************
String _$getAllMangaStreamHash() => r'd06c3a94ba847055746f2d52566cc94db4c28b7e';
String _$getAllMangaStreamHash() => r'9073754a9086e922dd502e9333482342196a300c';
/// Copied from Dart SDK
class _SystemHash {
@ -41,11 +41,11 @@ class GetAllMangaStreamFamily extends Family<AsyncValue<List<Manga>>> {
/// See also [getAllMangaStream].
GetAllMangaStreamProvider call({
required int? categoryId,
required bool? isManga,
required ItemType itemType,
}) {
return GetAllMangaStreamProvider(
categoryId: categoryId,
isManga: isManga,
itemType: itemType,
);
}
@ -55,7 +55,7 @@ class GetAllMangaStreamFamily extends Family<AsyncValue<List<Manga>>> {
) {
return call(
categoryId: provider.categoryId,
isManga: provider.isManga,
itemType: provider.itemType,
);
}
@ -79,12 +79,12 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
/// See also [getAllMangaStream].
GetAllMangaStreamProvider({
required int? categoryId,
required bool? isManga,
required ItemType itemType,
}) : this._internal(
(ref) => getAllMangaStream(
ref as GetAllMangaStreamRef,
categoryId: categoryId,
isManga: isManga,
itemType: itemType,
),
from: getAllMangaStreamProvider,
name: r'getAllMangaStreamProvider',
@ -96,7 +96,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
allTransitiveDependencies:
GetAllMangaStreamFamily._allTransitiveDependencies,
categoryId: categoryId,
isManga: isManga,
itemType: itemType,
);
GetAllMangaStreamProvider._internal(
@ -107,11 +107,11 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
required super.debugGetCreateSourceHash,
required super.from,
required this.categoryId,
required this.isManga,
required this.itemType,
}) : super.internal();
final int? categoryId;
final bool? isManga;
final ItemType itemType;
@override
Override overrideWith(
@ -127,7 +127,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
categoryId: categoryId,
isManga: isManga,
itemType: itemType,
),
);
}
@ -141,14 +141,14 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
bool operator ==(Object other) {
return other is GetAllMangaStreamProvider &&
other.categoryId == categoryId &&
other.isManga == isManga;
other.itemType == itemType;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, categoryId.hashCode);
hash = _SystemHash.combine(hash, isManga.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
}
@ -158,8 +158,8 @@ mixin GetAllMangaStreamRef on AutoDisposeStreamProviderRef<List<Manga>> {
/// The parameter `categoryId` of this provider.
int? get categoryId;
/// The parameter `isManga` of this provider.
bool? get isManga;
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
class _GetAllMangaStreamProviderElement
@ -170,11 +170,11 @@ class _GetAllMangaStreamProviderElement
@override
int? get categoryId => (origin as GetAllMangaStreamProvider).categoryId;
@override
bool? get isManga => (origin as GetAllMangaStreamProvider).isManga;
ItemType get itemType => (origin as GetAllMangaStreamProvider).itemType;
}
String _$getAllMangaWithoutCategoriesStreamHash() =>
r'03581754f330a87894f953f8eaae528642b0afc2';
r'd0ca0954d452102dc845a4aae414e88add666615';
/// See also [getAllMangaWithoutCategoriesStream].
@ProviderFor(getAllMangaWithoutCategoriesStream)
@ -189,10 +189,10 @@ class GetAllMangaWithoutCategoriesStreamFamily
/// See also [getAllMangaWithoutCategoriesStream].
GetAllMangaWithoutCategoriesStreamProvider call({
required bool? isManga,
required ItemType itemType,
}) {
return GetAllMangaWithoutCategoriesStreamProvider(
isManga: isManga,
itemType: itemType,
);
}
@ -201,7 +201,7 @@ class GetAllMangaWithoutCategoriesStreamFamily
covariant GetAllMangaWithoutCategoriesStreamProvider provider,
) {
return call(
isManga: provider.isManga,
itemType: provider.itemType,
);
}
@ -225,11 +225,11 @@ class GetAllMangaWithoutCategoriesStreamProvider
extends AutoDisposeStreamProvider<List<Manga>> {
/// See also [getAllMangaWithoutCategoriesStream].
GetAllMangaWithoutCategoriesStreamProvider({
required bool? isManga,
required ItemType itemType,
}) : this._internal(
(ref) => getAllMangaWithoutCategoriesStream(
ref as GetAllMangaWithoutCategoriesStreamRef,
isManga: isManga,
itemType: itemType,
),
from: getAllMangaWithoutCategoriesStreamProvider,
name: r'getAllMangaWithoutCategoriesStreamProvider',
@ -240,7 +240,7 @@ class GetAllMangaWithoutCategoriesStreamProvider
dependencies: GetAllMangaWithoutCategoriesStreamFamily._dependencies,
allTransitiveDependencies: GetAllMangaWithoutCategoriesStreamFamily
._allTransitiveDependencies,
isManga: isManga,
itemType: itemType,
);
GetAllMangaWithoutCategoriesStreamProvider._internal(
@ -250,10 +250,10 @@ class GetAllMangaWithoutCategoriesStreamProvider
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.isManga,
required this.itemType,
}) : super.internal();
final bool? isManga;
final ItemType itemType;
@override
Override overrideWith(
@ -269,7 +269,7 @@ class GetAllMangaWithoutCategoriesStreamProvider
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
isManga: isManga,
itemType: itemType,
),
);
}
@ -282,13 +282,13 @@ class GetAllMangaWithoutCategoriesStreamProvider
@override
bool operator ==(Object other) {
return other is GetAllMangaWithoutCategoriesStreamProvider &&
other.isManga == isManga;
other.itemType == itemType;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, isManga.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
}
@ -296,8 +296,8 @@ class GetAllMangaWithoutCategoriesStreamProvider
mixin GetAllMangaWithoutCategoriesStreamRef
on AutoDisposeStreamProviderRef<List<Manga>> {
/// The parameter `isManga` of this provider.
bool? get isManga;
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
class _GetAllMangaWithoutCategoriesStreamProviderElement
@ -306,8 +306,8 @@ class _GetAllMangaWithoutCategoriesStreamProviderElement
_GetAllMangaWithoutCategoriesStreamProviderElement(super.provider);
@override
bool? get isManga =>
(origin as GetAllMangaWithoutCategoriesStreamProvider).isManga;
ItemType get itemType =>
(origin as GetAllMangaWithoutCategoriesStreamProvider).itemType;
}
String _$getSettingsStreamHash() => r'273ef0597a1078ab7c31af861628f1be7ab154d8';

View file

@ -12,8 +12,15 @@ part 'library_state_provider.g.dart';
@riverpod
class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
@override
DisplayType build({required bool isManga, required Settings settings}) {
return isManga ? settings.displayType : settings.animeDisplayType;
DisplayType build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.displayType;
case ItemType.anime:
return settings.animeDisplayType;
default:
return settings.novelDisplayType;
}
}
String getLibraryDisplayTypeName(
@ -31,10 +38,16 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
Settings appSettings = Settings();
state = displayType;
if (isManga) {
appSettings = settings..displayType = displayType;
} else {
appSettings = settings..animeDisplayType = displayType;
switch (itemType) {
case ItemType.manga:
appSettings = settings..displayType = displayType;
break;
case ItemType.anime:
appSettings = settings..animeDisplayType = displayType;
break;
default:
appSettings = settings..novelDisplayType = displayType;
}
isar.writeTxnSync(() {
@ -46,8 +59,15 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
@riverpod
class LibraryGridSizeState extends _$LibraryGridSizeState {
@override
int? build({required bool isManga}) {
return isManga ? settings.mangaGridSize : settings.animeGridSize;
int? build({required ItemType itemType}) {
switch (itemType) {
case ItemType.manga:
return settings.mangaGridSize;
case ItemType.anime:
return settings.animeGridSize;
default:
return settings.novelGridSize;
}
}
Settings get settings {
@ -59,10 +79,15 @@ class LibraryGridSizeState extends _$LibraryGridSizeState {
state = value;
if (end) {
if (isManga) {
appSettings = settings..mangaGridSize = value;
} else {
appSettings = settings..animeGridSize = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..mangaGridSize = value;
break;
case ItemType.anime:
appSettings = settings..animeGridSize = value;
break;
default:
appSettings = settings..novelGridSize = value;
}
isar.writeTxnSync(() {
@ -77,24 +102,34 @@ class MangaFilterDownloadedState extends _$MangaFilterDownloadedState {
@override
int build(
{required List<Manga> mangaList,
required bool isManga,
required ItemType itemType,
required Settings settings}) {
state = getType();
return getType();
}
int getType() {
return isManga
? settings.libraryFilterMangasDownloadType!
: settings.libraryFilterAnimeDownloadType ?? 0;
switch (itemType) {
case ItemType.manga:
return settings.libraryFilterMangasDownloadType!;
case ItemType.anime:
return settings.libraryFilterAnimeDownloadType!;
default:
return settings.libraryFilterNovelDownloadType ?? 0;
}
}
void setType(int type) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryFilterMangasDownloadType = type;
} else {
appSettings = settings..libraryFilterAnimeDownloadType = type;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryFilterMangasDownloadType = type;
break;
case ItemType.anime:
appSettings = settings..libraryFilterAnimeDownloadType = type;
break;
default:
appSettings = settings..libraryFilterNovelDownloadType = type;
}
isar.writeTxnSync(() {
isar.settings.putSync(appSettings);
@ -118,24 +153,34 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
@override
int build(
{required List<Manga> mangaList,
required bool isManga,
required ItemType itemType,
required Settings settings}) {
state = getType();
return getType();
}
int getType() {
return isManga
? settings.libraryFilterMangasUnreadType!
: settings.libraryFilterAnimeUnreadType ?? 0;
switch (itemType) {
case ItemType.manga:
return settings.libraryFilterMangasUnreadType!;
case ItemType.anime:
return settings.libraryFilterAnimeUnreadType!;
default:
return settings.libraryFilterNovelUnreadType ?? 0;
}
}
void setType(int type) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryFilterMangasUnreadType = type;
} else {
appSettings = settings..libraryFilterAnimeUnreadType = type;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryFilterMangasUnreadType = type;
break;
case ItemType.anime:
appSettings = settings..libraryFilterAnimeUnreadType = type;
break;
default:
appSettings = settings..libraryFilterNovelUnreadType = type;
}
isar.writeTxnSync(() {
isar.settings.putSync(appSettings);
@ -208,24 +253,34 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
@override
int build(
{required List<Manga> mangaList,
required bool isManga,
required ItemType itemType,
required Settings settings}) {
state = getType();
return getType();
}
int getType() {
return isManga
? settings.libraryFilterMangasStartedType!
: settings.libraryFilterAnimeStartedType ?? 0;
switch (itemType) {
case ItemType.manga:
return settings.libraryFilterMangasStartedType!;
case ItemType.anime:
return settings.libraryFilterAnimeStartedType!;
default:
return settings.libraryFilterNovelStartedType ?? 0;
}
}
void setType(int type) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryFilterMangasStartedType = type;
} else {
appSettings = settings..libraryFilterAnimeStartedType = type;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryFilterMangasStartedType = type;
break;
case ItemType.anime:
appSettings = settings..libraryFilterAnimeStartedType = type;
break;
default:
appSettings = settings..libraryFilterNovelStartedType = type;
}
isar.writeTxnSync(() {
isar.settings.putSync(appSettings);
@ -298,24 +353,34 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
@override
int build(
{required List<Manga> mangaList,
required bool isManga,
required ItemType itemType,
required Settings settings}) {
state = getType();
return getType();
}
int getType() {
return isManga
? settings.libraryFilterMangasBookMarkedType!
: settings.libraryFilterAnimeBookMarkedType ?? 0;
switch (itemType) {
case ItemType.manga:
return settings.libraryFilterMangasBookMarkedType!;
case ItemType.anime:
return settings.libraryFilterAnimeBookMarkedType!;
default:
return settings.libraryFilterNovelBookMarkedType ?? 0;
}
}
void setType(int type) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryFilterMangasBookMarkedType = type;
} else {
appSettings = settings..libraryFilterAnimeBookMarkedType = type;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryFilterMangasBookMarkedType = type;
break;
case ItemType.anime:
appSettings = settings..libraryFilterAnimeBookMarkedType = type;
break;
default:
appSettings = settings..libraryFilterNovelBookMarkedType = type;
}
isar.writeTxnSync(() {
isar.settings.putSync(appSettings);
@ -388,16 +453,16 @@ class MangasFilterResultState extends _$MangasFilterResultState {
@override
bool build(
{required List<Manga> mangaList,
required bool isManga,
required ItemType itemType,
required Settings settings}) {
final downloadFilterType = ref.watch(mangaFilterDownloadedStateProvider(
mangaList: mangaList, isManga: isManga, settings: settings));
mangaList: mangaList, itemType: itemType, settings: settings));
final unreadFilterType = ref.watch(mangaFilterUnreadStateProvider(
mangaList: mangaList, isManga: isManga, settings: settings));
mangaList: mangaList, itemType: itemType, settings: settings));
final startedFilterType = ref.watch(mangaFilterStartedStateProvider(
mangaList: mangaList, isManga: isManga, settings: settings));
mangaList: mangaList, itemType: itemType, settings: settings));
final bookmarkedFilterType = ref.watch(mangaFilterBookmarkedStateProvider(
mangaList: mangaList, isManga: isManga, settings: settings));
mangaList: mangaList, itemType: itemType, settings: settings));
return downloadFilterType == 0 &&
unreadFilterType == 0 &&
startedFilterType == 0 &&
@ -408,18 +473,28 @@ class MangasFilterResultState extends _$MangasFilterResultState {
@riverpod
class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState {
@override
bool build({required bool isManga, required Settings settings}) {
return isManga
? settings.libraryShowCategoryTabs!
: settings.animeLibraryShowCategoryTabs ?? false;
bool build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.libraryShowCategoryTabs!;
case ItemType.anime:
return settings.animeLibraryShowCategoryTabs!;
default:
return settings.novelLibraryShowCategoryTabs ?? false;
}
}
void set(bool value) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryShowCategoryTabs = value;
} else {
appSettings = settings..animeLibraryShowCategoryTabs = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryShowCategoryTabs = value;
break;
case ItemType.anime:
appSettings = settings..animeLibraryShowCategoryTabs = value;
break;
default:
appSettings = settings..novelLibraryShowCategoryTabs = value;
}
state = value;
isar.writeTxnSync(() {
@ -431,18 +506,28 @@ class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState {
@riverpod
class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState {
@override
bool build({required bool isManga, required Settings settings}) {
return isManga
? settings.libraryDownloadedChapters!
: settings.animeLibraryDownloadedChapters ?? false;
bool build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.libraryDownloadedChapters!;
case ItemType.anime:
return settings.animeLibraryDownloadedChapters!;
default:
return settings.novelLibraryDownloadedChapters ?? false;
}
}
void set(bool value) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryDownloadedChapters = value;
} else {
appSettings = settings..animeLibraryDownloadedChapters = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryDownloadedChapters = value;
break;
case ItemType.anime:
appSettings = settings..animeLibraryDownloadedChapters = value;
break;
default:
appSettings = settings..novelLibraryDownloadedChapters = value;
}
state = value;
isar.writeTxnSync(() {
@ -454,18 +539,28 @@ class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState {
@riverpod
class LibraryLanguageState extends _$LibraryLanguageState {
@override
bool build({required bool isManga, required Settings settings}) {
return isManga
? settings.libraryShowLanguage!
: settings.animeLibraryShowLanguage ?? false;
bool build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.libraryShowLanguage!;
case ItemType.anime:
return settings.animeLibraryShowLanguage!;
default:
return settings.novelLibraryShowLanguage ?? false;
}
}
void set(bool value) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryShowLanguage = value;
} else {
appSettings = settings..animeLibraryShowLanguage = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryShowLanguage = value;
break;
case ItemType.anime:
appSettings = settings..animeLibraryShowLanguage = value;
break;
default:
appSettings = settings..novelLibraryShowLanguage = value;
}
state = value;
isar.writeTxnSync(() {
@ -477,18 +572,28 @@ class LibraryLanguageState extends _$LibraryLanguageState {
@riverpod
class LibraryLocalSourceState extends _$LibraryLocalSourceState {
@override
bool build({required bool isManga, required Settings settings}) {
return isManga
? settings.libraryLocalSource ?? false
: settings.animeLibraryLocalSource ?? false;
bool build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.libraryLocalSource!;
case ItemType.anime:
return settings.animeLibraryLocalSource!;
default:
return settings.novelLibraryLocalSource ?? false;
}
}
void set(bool value) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryLocalSource = value;
} else {
appSettings = settings..animeLibraryLocalSource = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryLocalSource = value;
break;
case ItemType.anime:
appSettings = settings..animeLibraryLocalSource = value;
break;
default:
appSettings = settings..novelLibraryLocalSource = value;
}
state = value;
isar.writeTxnSync(() {
@ -500,18 +605,28 @@ class LibraryLocalSourceState extends _$LibraryLocalSourceState {
@riverpod
class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState {
@override
bool build({required bool isManga, required Settings settings}) {
return isManga
? settings.libraryShowNumbersOfItems!
: settings.animeLibraryShowNumbersOfItems ?? false;
bool build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.libraryShowNumbersOfItems!;
case ItemType.anime:
return settings.animeLibraryShowNumbersOfItems!;
default:
return settings.novelLibraryShowNumbersOfItems ?? false;
}
}
void set(bool value) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryShowNumbersOfItems = value;
} else {
appSettings = settings..animeLibraryShowNumbersOfItems = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryShowNumbersOfItems = value;
break;
case ItemType.anime:
appSettings = settings..animeLibraryShowNumbersOfItems = value;
break;
default:
appSettings = settings..novelLibraryShowNumbersOfItems = value;
}
state = value;
isar.writeTxnSync(() {
@ -524,18 +639,28 @@ class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState {
class LibraryShowContinueReadingButtonState
extends _$LibraryShowContinueReadingButtonState {
@override
bool build({required bool isManga, required Settings settings}) {
return isManga
? settings.libraryShowContinueReadingButton!
: settings.animeLibraryShowContinueReadingButton ?? false;
bool build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.libraryShowContinueReadingButton!;
case ItemType.anime:
return settings.animeLibraryShowContinueReadingButton!;
default:
return settings.novelLibraryShowContinueReadingButton ?? false;
}
}
void set(bool value) {
Settings appSettings = Settings();
if (isManga) {
appSettings = settings..libraryShowContinueReadingButton = value;
} else {
appSettings = settings..animeLibraryShowContinueReadingButton = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..libraryShowContinueReadingButton = value;
break;
case ItemType.anime:
appSettings = settings..animeLibraryShowContinueReadingButton = value;
break;
default:
appSettings = settings..novelLibraryShowContinueReadingButton = value;
}
state = value;
isar.writeTxnSync(() {
@ -547,10 +672,15 @@ class LibraryShowContinueReadingButtonState
@riverpod
class SortLibraryMangaState extends _$SortLibraryMangaState {
@override
SortLibraryManga build({required bool isManga, required Settings settings}) {
return isManga
? settings.sortLibraryManga ?? SortLibraryManga()
: settings.sortLibraryAnime ?? SortLibraryManga();
SortLibraryManga build({required ItemType itemType, required Settings settings}) {
switch (itemType) {
case ItemType.manga:
return settings.sortLibraryManga ?? SortLibraryManga();
case ItemType.anime:
return settings.sortLibraryAnime ?? SortLibraryManga();
default:
return settings.sortLibraryNovel ?? SortLibraryManga();
}
}
void update(bool reverse, int index) {
@ -559,10 +689,15 @@ class SortLibraryMangaState extends _$SortLibraryMangaState {
..index = index
..reverse = state.index == index ? !reverse : reverse;
if (isManga) {
appSettings = settings..sortLibraryManga = value;
} else {
appSettings = settings..sortLibraryAnime = value;
switch (itemType) {
case ItemType.manga:
appSettings = settings..sortLibraryManga = value;
break;
case ItemType.anime:
appSettings = settings..sortLibraryAnime = value;
break;
default:
appSettings = settings..sortLibraryNovel = value;
}
isar.writeTxnSync(() {
isar.settings.putSync(appSettings);

File diff suppressed because it is too large Load diff

View file

@ -10,11 +10,11 @@ part 'local_archive.g.dart';
@riverpod
Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga,
{required bool isManga, required bool init}) async {
{required ItemType itemType, required bool init}) async {
FilePickerResult? result = await FilePicker.platform.pickFiles(
allowMultiple: true,
type: FileType.custom,
allowedExtensions: isManga
allowedExtensions: itemType == ItemType.manga
? ['cbz', 'zip']
: ['mp4', 'mov', 'avi', 'flv', 'wmv', 'mpeg', 'mkv']);
if (result != null) {
@ -24,7 +24,8 @@ Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga,
favorite: true,
source: 'archive',
author: '',
isManga: isManga,
isManga: itemType == ItemType.manga,
itemType: itemType,
genre: [],
imageUrl: '',
lang: '',
@ -38,20 +39,20 @@ Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga,
artist: '',
);
for (var file in result.files.reversed.toList()) {
(String, LocalExtensionType, Uint8List, String)? data = isManga
(String, LocalExtensionType, Uint8List, String)? data = itemType == ItemType.manga
? await ref.watch(getArchivesDataFromFileProvider(file.path!).future)
: null;
String name = _getName(file.path!);
if (init) {
manga.customCoverImage = isManga ? data!.$3 : null;
manga.customCoverImage = itemType == ItemType.manga ? data!.$3 : null;
}
isar.writeTxnSync(() {
isar.mangas.putSync(manga);
final chapters = Chapter(
name: isManga ? data!.$1 : name,
archivePath: isManga ? data!.$4 : file.path,
name: itemType == ItemType.manga ? data!.$1 : name,
archivePath: itemType == ItemType.manga ? data!.$4 : file.path,
mangaId: manga.id)
..manga.value = manga;
isar.chapters.putSync(chapters);

View file

@ -7,7 +7,7 @@ part of 'local_archive.dart';
// **************************************************************************
String _$importArchivesFromFileHash() =>
r'4ac9e6c438919a1ea8cebd28cb554b13b5e53cc2';
r'08e34a4b0ba52b8d3861b297f687c1136f2c5443';
/// Copied from Dart SDK
class _SystemHash {
@ -42,12 +42,12 @@ class ImportArchivesFromFileFamily extends Family<AsyncValue> {
/// See also [importArchivesFromFile].
ImportArchivesFromFileProvider call(
Manga? mManga, {
required bool isManga,
required ItemType itemType,
required bool init,
}) {
return ImportArchivesFromFileProvider(
mManga,
isManga: isManga,
itemType: itemType,
init: init,
);
}
@ -58,7 +58,7 @@ class ImportArchivesFromFileFamily extends Family<AsyncValue> {
) {
return call(
provider.mManga,
isManga: provider.isManga,
itemType: provider.itemType,
init: provider.init,
);
}
@ -84,13 +84,13 @@ class ImportArchivesFromFileProvider
/// See also [importArchivesFromFile].
ImportArchivesFromFileProvider(
Manga? mManga, {
required bool isManga,
required ItemType itemType,
required bool init,
}) : this._internal(
(ref) => importArchivesFromFile(
ref as ImportArchivesFromFileRef,
mManga,
isManga: isManga,
itemType: itemType,
init: init,
),
from: importArchivesFromFileProvider,
@ -103,7 +103,7 @@ class ImportArchivesFromFileProvider
allTransitiveDependencies:
ImportArchivesFromFileFamily._allTransitiveDependencies,
mManga: mManga,
isManga: isManga,
itemType: itemType,
init: init,
);
@ -115,12 +115,12 @@ class ImportArchivesFromFileProvider
required super.debugGetCreateSourceHash,
required super.from,
required this.mManga,
required this.isManga,
required this.itemType,
required this.init,
}) : super.internal();
final Manga? mManga;
final bool isManga;
final ItemType itemType;
final bool init;
@override
@ -137,7 +137,7 @@ class ImportArchivesFromFileProvider
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
mManga: mManga,
isManga: isManga,
itemType: itemType,
init: init,
),
);
@ -152,7 +152,7 @@ class ImportArchivesFromFileProvider
bool operator ==(Object other) {
return other is ImportArchivesFromFileProvider &&
other.mManga == mManga &&
other.isManga == isManga &&
other.itemType == itemType &&
other.init == init;
}
@ -160,7 +160,7 @@ class ImportArchivesFromFileProvider
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, mManga.hashCode);
hash = _SystemHash.combine(hash, isManga.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
hash = _SystemHash.combine(hash, init.hashCode);
return _SystemHash.finish(hash);
@ -171,8 +171,8 @@ mixin ImportArchivesFromFileRef on AutoDisposeFutureProviderRef<Object?> {
/// The parameter `mManga` of this provider.
Manga? get mManga;
/// The parameter `isManga` of this provider.
bool get isManga;
/// The parameter `itemType` of this provider.
ItemType get itemType;
/// The parameter `init` of this provider.
bool get init;
@ -186,7 +186,7 @@ class _ImportArchivesFromFileProviderElement
@override
Manga? get mManga => (origin as ImportArchivesFromFileProvider).mManga;
@override
bool get isManga => (origin as ImportArchivesFromFileProvider).isManga;
ItemType get itemType => (origin as ImportArchivesFromFileProvider).itemType;
@override
bool get init => (origin as ImportArchivesFromFileProvider).init;
}

View file

@ -29,7 +29,7 @@ class LibraryGridViewWidget extends StatefulWidget {
final bool downloadedChapter;
final bool continueReaderBtn;
final bool localSource;
final bool isManga;
final ItemType itemType;
const LibraryGridViewWidget(
{super.key,
required this.entriesManga,
@ -40,7 +40,7 @@ class LibraryGridViewWidget extends StatefulWidget {
required this.continueReaderBtn,
required this.mangaIdsList,
required this.localSource,
required this.isManga});
required this.itemType});
@override
State<LibraryGridViewWidget> createState() => _LibraryGridViewWidgetState();
@ -51,10 +51,10 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
Widget build(BuildContext context) {
return Consumer(builder: (context, ref, child) {
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
final isManga = widget.isManga;
final itemType = widget.itemType;
final gridSize =
ref.watch(libraryGridSizeStateProvider(isManga: isManga));
ref.watch(libraryGridSizeStateProvider(itemType: itemType));
return GridViewWidget(
gridSize: gridSize,
childAspectRatio: widget.isComfortableGrid ? 0.642 : 0.69,
@ -97,9 +97,9 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
mangaM: entry,
source: entry.source!);
ref.invalidate(getAllMangaWithoutCategoriesStreamProvider(
isManga: widget.isManga));
itemType: widget.itemType));
ref.invalidate(getAllMangaStreamProvider(
categoryId: null, isManga: widget.isManga));
categoryId: null, itemType: widget.itemType));
}
},
onLongPress: () {

View file

@ -59,9 +59,9 @@ class LibraryListViewWidget extends StatelessWidget {
mangaM: entry,
source: entry.source!);
ref.invalidate(getAllMangaWithoutCategoriesStreamProvider(
isManga: entry.isManga));
itemType: entry.itemType));
ref.invalidate(getAllMangaStreamProvider(
categoryId: null, isManga: entry.isManga));
categoryId: null, itemType: entry.itemType));
}
},
onLongPress: () {

View file

@ -39,10 +39,10 @@ class MainScreen extends ConsumerWidget {
routerCurrentLocationStateProvider(context),
);
bool isReadingScreen =
location == '/mangareaderview' || location == '/animePlayerView';
location == '/mangaReaderView' || location == '/animePlayerView' || location == '/novelReaderView';
int currentIndex = switch (location) {
null || '/MangaLibrary' => 0,
'/AnimeLibrary' => 1,
'/AnimeLibrary' => 1, // TODO add /NovelLibrary
'/updates' => 2,
'/history' => 3,
'/browse' => 4,

View file

@ -636,8 +636,9 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
manga: manga);
} else {
await ref.watch(importArchivesFromFileProvider(
isManga: manga
.isManga!,
itemType:
manga
.itemType,
manga,
init:
false)
@ -1393,7 +1394,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
} else {
await ref.watch(
importArchivesFromFileProvider(
isManga: manga.isManga!,
itemType: manga.itemType,
manga,
init: false)
.future);

View file

@ -196,7 +196,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
.filter()
.idIsNotNull()
.and()
.forMangaEqualTo(widget.manga.isManga)
.forItemTypeEqualTo(widget.manga.itemType)
.isNotEmptySync();
if (checkCategoryList) {
_openCategory(widget.manga);
@ -257,7 +257,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
.filter()
.idIsNotNull()
.and()
.forMangaEqualTo(widget.manga.isManga)
.forItemTypeEqualTo(widget.manga.itemType)
.watch(fireImmediately: true),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data!.isNotEmpty) {

View file

@ -555,7 +555,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
: Consumer(builder: (context, ref, child) {
final gridSize = ref.watch(
libraryGridSizeStateProvider(
isManga: source.isManga!));
itemType: source.itemType));
return GridViewWidget(
gridSize: gridSize,

View file

@ -3,6 +3,7 @@ import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
Future<void> pushMangaReaderView({
@ -23,19 +24,31 @@ Future<void> pushMangaReaderView({
.findAllSync()
.isNotEmpty;
if (sourceExist || chapter.manga.value!.isLocalArchive!) {
if (chapter.manga.value!.isManga!) {
await context.push('/mangareaderview', extra: chapter);
} else {
await context.push('/animePlayerView', extra: chapter);
switch (chapter.manga.value!.itemType) {
case ItemType.manga:
await context.push('/mangaReaderView', extra: chapter);
break;
case ItemType.anime:
await context.push('/animePlayerView', extra: chapter);
break;
case ItemType.novel:
await context.push('/novelReaderView', extra: chapter);
break;
}
}
}
void pushReplacementMangaReaderView(
{required BuildContext context, required Chapter chapter}) {
if (chapter.manga.value!.isManga!) {
context.pushReplacement('/mangareaderview', extra: chapter);
} else {
context.pushReplacement('/animePlayerView', extra: chapter);
}
switch (chapter.manga.value!.itemType) {
case ItemType.manga:
context.pushReplacement('/mangaReaderView', extra: chapter);
break;
case ItemType.anime:
context.pushReplacement('/animePlayerView', extra: chapter);
break;
case ItemType.novel:
context.pushReplacement('/novelReaderView', extra: chapter);
break;
}
}

View file

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart';
import 'package:mangayomi/modules/more/categories/widgets/custom_textfield.dart';
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
@ -52,10 +53,13 @@ class _CategoriesScreenState extends ConsumerState<CategoriesScreen>
),
body: TabBarView(controller: _tabBarController, children: const [
CategoriesTab(
isManga: true,
itemType: ItemType.manga,
),
CategoriesTab(
isManga: false,
itemType: ItemType.anime,
),
CategoriesTab(
itemType: ItemType.novel,
)
]),
),
@ -64,8 +68,8 @@ class _CategoriesScreenState extends ConsumerState<CategoriesScreen>
}
class CategoriesTab extends ConsumerStatefulWidget {
final bool isManga;
const CategoriesTab({required this.isManga, super.key});
final ItemType itemType;
const CategoriesTab({required this.itemType, super.key});
@override
ConsumerState<CategoriesTab> createState() => _CategoriesTabState();
@ -77,7 +81,7 @@ class _CategoriesTabState extends ConsumerState<CategoriesTab> {
Widget build(BuildContext context) {
final l10n = l10nLocalizations(context)!;
final categories =
ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga));
ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType));
return Scaffold(
body: categories.when(
data: (data) {
@ -279,7 +283,7 @@ class _CategoriesTabState extends ConsumerState<CategoriesTab> {
: () async {
await isar.writeTxn(() async {
await isar.categorys.put(Category(
forManga: widget.isManga,
forItemType: widget.itemType,
name: controller.text,
));
});

View file

@ -1,16 +1,17 @@
import 'package:isar/isar.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'isar_providers.g.dart';
@riverpod
Stream<List<Category>> getMangaCategorieStream(GetMangaCategorieStreamRef ref,
{required bool isManga}) async* {
{required ItemType itemType}) async* {
yield* isar.categorys
.filter()
.idIsNotNull()
.and()
.forMangaEqualTo(isManga)
.forItemTypeEqualTo(itemType)
.watch(fireImmediately: true);
}

View file

@ -7,7 +7,7 @@ part of 'isar_providers.dart';
// **************************************************************************
String _$getMangaCategorieStreamHash() =>
r'16b3a35e4962b39a2948a257eba66124bbff139a';
r'4bf633ef6dc6720ac486f1fb6e3a2a57e18262ce';
/// Copied from Dart SDK
class _SystemHash {
@ -41,10 +41,10 @@ class GetMangaCategorieStreamFamily extends Family<AsyncValue<List<Category>>> {
/// See also [getMangaCategorieStream].
GetMangaCategorieStreamProvider call({
required bool isManga,
required ItemType itemType,
}) {
return GetMangaCategorieStreamProvider(
isManga: isManga,
itemType: itemType,
);
}
@ -53,7 +53,7 @@ class GetMangaCategorieStreamFamily extends Family<AsyncValue<List<Category>>> {
covariant GetMangaCategorieStreamProvider provider,
) {
return call(
isManga: provider.isManga,
itemType: provider.itemType,
);
}
@ -77,11 +77,11 @@ class GetMangaCategorieStreamProvider
extends AutoDisposeStreamProvider<List<Category>> {
/// See also [getMangaCategorieStream].
GetMangaCategorieStreamProvider({
required bool isManga,
required ItemType itemType,
}) : this._internal(
(ref) => getMangaCategorieStream(
ref as GetMangaCategorieStreamRef,
isManga: isManga,
itemType: itemType,
),
from: getMangaCategorieStreamProvider,
name: r'getMangaCategorieStreamProvider',
@ -92,7 +92,7 @@ class GetMangaCategorieStreamProvider
dependencies: GetMangaCategorieStreamFamily._dependencies,
allTransitiveDependencies:
GetMangaCategorieStreamFamily._allTransitiveDependencies,
isManga: isManga,
itemType: itemType,
);
GetMangaCategorieStreamProvider._internal(
@ -102,10 +102,10 @@ class GetMangaCategorieStreamProvider
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.isManga,
required this.itemType,
}) : super.internal();
final bool isManga;
final ItemType itemType;
@override
Override overrideWith(
@ -120,7 +120,7 @@ class GetMangaCategorieStreamProvider
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
isManga: isManga,
itemType: itemType,
),
);
}
@ -132,13 +132,14 @@ class GetMangaCategorieStreamProvider
@override
bool operator ==(Object other) {
return other is GetMangaCategorieStreamProvider && other.isManga == isManga;
return other is GetMangaCategorieStreamProvider &&
other.itemType == itemType;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, isManga.hashCode);
hash = _SystemHash.combine(hash, itemType.hashCode);
return _SystemHash.finish(hash);
}
@ -146,8 +147,8 @@ class GetMangaCategorieStreamProvider
mixin GetMangaCategorieStreamRef
on AutoDisposeStreamProviderRef<List<Category>> {
/// The parameter `isManga` of this provider.
bool get isManga;
/// The parameter `itemType` of this provider.
ItemType get itemType;
}
class _GetMangaCategorieStreamProviderElement
@ -156,7 +157,7 @@ class _GetMangaCategorieStreamProviderElement
_GetMangaCategorieStreamProviderElement(super.provider);
@override
bool get isManga => (origin as GetMangaCategorieStreamProvider).isManga;
ItemType get itemType => (origin as GetMangaCategorieStreamProvider).itemType;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

File diff suppressed because it is too large Load diff

View file

@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/foundation.dart';
import 'package:go_router/go_router.dart';
import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/track_preference.dart';
import 'package:mangayomi/modules/anime/anime_player_view.dart';
@ -10,6 +11,7 @@ import 'package:mangayomi/modules/browse/extension/edit_code.dart';
import 'package:mangayomi/modules/browse/extension/extension_detail.dart';
import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart';
import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart';
import 'package:mangayomi/modules/novel/novel_reader_view.dart';
import 'package:mangayomi/modules/updates/updates_screen.dart';
import 'package:mangayomi/modules/more/backup_and_restore/backup_and_restore.dart';
import 'package:mangayomi/modules/more/categories/categories_screen.dart';
@ -85,12 +87,12 @@ class RouterNotifier extends ChangeNotifier {
name: "MangaLibrary",
path: '/MangaLibrary',
builder: (context, state) => const LibraryScreen(
isManga: true,
itemType: ItemType.manga,
),
pageBuilder: (context, state) => transitionPage(
key: state.pageKey,
child: const LibraryScreen(
isManga: true,
itemType: ItemType.manga,
),
),
),
@ -98,12 +100,25 @@ class RouterNotifier extends ChangeNotifier {
name: "AnimeLibrary",
path: '/AnimeLibrary',
builder: (context, state) => const LibraryScreen(
isManga: false,
itemType: ItemType.anime,
),
pageBuilder: (context, state) => transitionPage(
key: state.pageKey,
child: const LibraryScreen(
isManga: false,
itemType: ItemType.anime,
),
),
),
GoRoute(
name: "NovelLibrary",
path: '/NovelLibrary',
builder: (context, state) => const LibraryScreen(
itemType: ItemType.novel,
),
pageBuilder: (context, state) => transitionPage(
key: state.pageKey,
child: const LibraryScreen(
itemType: ItemType.novel,
),
),
),
@ -183,8 +198,8 @@ class RouterNotifier extends ChangeNotifier {
));
}),
GoRoute(
path: "/mangareaderview",
name: "mangareaderview",
path: "/mangaReaderView",
name: "mangaReaderView",
builder: (context, state) {
final chapter = state.extra as Chapter;
return MangaReaderView(
@ -220,6 +235,25 @@ class RouterNotifier extends ChangeNotifier {
);
},
),
/*GoRoute(
path: "/novelReaderView",
name: "novelReaderView",
builder: (context, state) {
final chapter = state.extra as Chapter;
return NovelReaderView(
chapter: chapter,
);
},
pageBuilder: (context, state) {
final chapter = state.extra as Chapter;
return transitionPage(
key: state.pageKey,
child: NovelReaderView(
chapter: chapter,
),
);
},
),*/
GoRoute(
path: "/ExtensionLang",
name: "ExtensionLang",

View file

@ -6,7 +6,7 @@ part of 'aniskip.dart';
// RiverpodGenerator
// **************************************************************************
String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c';
String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421';
/// See also [AniSkip].
@ProviderFor(AniSkip)

View file

@ -6,7 +6,7 @@ part of 'anilist.dart';
// RiverpodGenerator
// **************************************************************************
String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58';
String _$anilistHash() => r'87784b25bccf5b1c61d6c7494f0569a28494dd8b';
/// Copied from Dart SDK
class _SystemHash {