mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-03-11 17:25:32 +00:00
feat: Add use sourceId property if not null to get source model
This commit is contained in:
parent
619e1b640d
commit
600a699708
45 changed files with 251 additions and 48 deletions
|
|
@ -54,6 +54,8 @@ class Manga {
|
|||
|
||||
int? updatedAt;
|
||||
|
||||
int? sourceId;
|
||||
|
||||
@Backlink(to: "manga")
|
||||
final chapters = IsarLinks<Chapter>();
|
||||
|
||||
|
|
@ -70,6 +72,7 @@ class Manga {
|
|||
required this.name,
|
||||
required this.status,
|
||||
required this.description,
|
||||
required this.sourceId,
|
||||
this.isManga,
|
||||
this.itemType = ItemType.manga,
|
||||
this.dateAdded,
|
||||
|
|
@ -107,6 +110,7 @@ class Manga {
|
|||
customCoverFromTracker = json['customCoverFromTracker'];
|
||||
smartUpdateDays = json['smartUpdateDays'];
|
||||
updatedAt = json['updatedAt'];
|
||||
sourceId = json['sourceId'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
|
|
@ -132,6 +136,7 @@ class Manga {
|
|||
'customCoverFromTracker': customCoverFromTracker,
|
||||
'smartUpdateDays': smartUpdateDays,
|
||||
'updatedAt': updatedAt ?? 0,
|
||||
'sourceId': sourceId,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -78,14 +78,15 @@ const MangaSchema = CollectionSchema(
|
|||
type: IsarType.long,
|
||||
),
|
||||
r'source': PropertySchema(id: 19, name: r'source', type: IsarType.string),
|
||||
r'sourceId': PropertySchema(id: 20, name: r'sourceId', type: IsarType.long),
|
||||
r'status': PropertySchema(
|
||||
id: 20,
|
||||
id: 21,
|
||||
name: r'status',
|
||||
type: IsarType.byte,
|
||||
enumMap: _MangastatusEnumValueMap,
|
||||
),
|
||||
r'updatedAt': PropertySchema(
|
||||
id: 21,
|
||||
id: 22,
|
||||
name: r'updatedAt',
|
||||
type: IsarType.long,
|
||||
),
|
||||
|
|
@ -227,8 +228,9 @@ void _mangaSerialize(
|
|||
writer.writeString(offsets[17], object.name);
|
||||
writer.writeLong(offsets[18], object.smartUpdateDays);
|
||||
writer.writeString(offsets[19], object.source);
|
||||
writer.writeByte(offsets[20], object.status.index);
|
||||
writer.writeLong(offsets[21], object.updatedAt);
|
||||
writer.writeLong(offsets[20], object.sourceId);
|
||||
writer.writeByte(offsets[21], object.status.index);
|
||||
writer.writeLong(offsets[22], object.updatedAt);
|
||||
}
|
||||
|
||||
Manga _mangaDeserialize(
|
||||
|
|
@ -261,10 +263,11 @@ Manga _mangaDeserialize(
|
|||
name: reader.readStringOrNull(offsets[17]),
|
||||
smartUpdateDays: reader.readLongOrNull(offsets[18]),
|
||||
source: reader.readStringOrNull(offsets[19]),
|
||||
sourceId: reader.readLongOrNull(offsets[20]),
|
||||
status:
|
||||
_MangastatusValueEnumMap[reader.readByteOrNull(offsets[20])] ??
|
||||
_MangastatusValueEnumMap[reader.readByteOrNull(offsets[21])] ??
|
||||
Status.ongoing,
|
||||
updatedAt: reader.readLongOrNull(offsets[21]),
|
||||
updatedAt: reader.readLongOrNull(offsets[22]),
|
||||
);
|
||||
return object;
|
||||
}
|
||||
|
|
@ -319,10 +322,12 @@ P _mangaDeserializeProp<P>(
|
|||
case 19:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
case 20:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
case 21:
|
||||
return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||
Status.ongoing)
|
||||
as P;
|
||||
case 21:
|
||||
case 22:
|
||||
return (reader.readLongOrNull(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
|
|
@ -2887,6 +2892,81 @@ extension MangaQueryFilter on QueryBuilder<Manga, Manga, QFilterCondition> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> sourceIdIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
const FilterCondition.isNull(property: r'sourceId'),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> sourceIdIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
const FilterCondition.isNotNull(property: r'sourceId'),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> sourceIdEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
FilterCondition.equalTo(property: r'sourceId', value: value),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> sourceIdGreaterThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'sourceId',
|
||||
value: value,
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> sourceIdLessThan(
|
||||
int? value, {
|
||||
bool include = false,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'sourceId',
|
||||
value: value,
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> sourceIdBetween(
|
||||
int? lower,
|
||||
int? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
FilterCondition.between(
|
||||
property: r'sourceId',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> statusEqualTo(
|
||||
Status value,
|
||||
) {
|
||||
|
|
@ -3294,6 +3374,18 @@ extension MangaQuerySortBy on QueryBuilder<Manga, Manga, QSortBy> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterSortBy> sortBySourceId() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'sourceId', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterSortBy> sortBySourceIdDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'sourceId', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterSortBy> sortByStatus() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'status', Sort.asc);
|
||||
|
|
@ -3536,6 +3628,18 @@ extension MangaQuerySortThenBy on QueryBuilder<Manga, Manga, QSortThenBy> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterSortBy> thenBySourceId() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'sourceId', Sort.asc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterSortBy> thenBySourceIdDesc() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'sourceId', Sort.desc);
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QAfterSortBy> thenByStatus() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addSortBy(r'status', Sort.asc);
|
||||
|
|
@ -3703,6 +3807,12 @@ extension MangaQueryWhereDistinct on QueryBuilder<Manga, Manga, QDistinct> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QDistinct> distinctBySourceId() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'sourceId');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Manga, QDistinct> distinctByStatus() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'status');
|
||||
|
|
@ -3844,6 +3954,12 @@ extension MangaQueryProperty on QueryBuilder<Manga, Manga, QQueryProperty> {
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, int?, QQueryOperations> sourceIdProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'sourceId');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Manga, Status, QQueryOperations> statusProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'status');
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ import 'package:mangayomi/services/fetch_subtitles.dart';
|
|||
import 'package:mangayomi/services/http/m_client.dart';
|
||||
import 'package:mangayomi/services/http/rhttp/src/model/settings.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:mangayomi/utils/extensions/string_extensions.dart';
|
||||
import 'package:mangayomi/utils/log/logger.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:super_sliver_list/super_sliver_list.dart';
|
||||
|
|
@ -360,13 +359,13 @@ class _SubtitlesWidgetSearchState extends ConsumerState<SubtitlesWidgetSearch> {
|
|||
}
|
||||
AppLogger.log('Subtitle file downloaded: ${subtitle.language}');
|
||||
await subtitleFile.writeAsBytes(response.bodyBytes);
|
||||
if (context.mounted) {
|
||||
if (mounted) {
|
||||
botToast(context.l10n.finished(""));
|
||||
}
|
||||
} catch (e) {
|
||||
AppLogger.log("Failed to download subtitle:", logLevel: LogLevel.error);
|
||||
AppLogger.log(e.toString(), logLevel: LogLevel.error);
|
||||
if (context.mounted) {
|
||||
if (mounted) {
|
||||
botToast(context.l10n.failed);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -263,6 +263,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
|
|||
itemType: widget.source.itemType,
|
||||
useMaterialRoute: true,
|
||||
source: widget.source.name!,
|
||||
sourceId: widget.source.id,
|
||||
);
|
||||
},
|
||||
child: StreamBuilder(
|
||||
|
|
@ -298,6 +299,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
|
|||
headersProvider(
|
||||
source: widget.source.name!,
|
||||
lang: widget.source.lang!,
|
||||
sourceId: widget.source.id,
|
||||
),
|
||||
),
|
||||
imageUrl: toImgUrl(
|
||||
|
|
|
|||
|
|
@ -376,6 +376,7 @@ class CalendarListTileWidget extends ConsumerWidget {
|
|||
headersProvider(
|
||||
source: manga.source!,
|
||||
lang: manga.lang!,
|
||||
sourceId: manga.sourceId,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -402,7 +402,11 @@ class _HistoryTabState extends ConsumerState<HistoryTab>
|
|||
? Image.memory(manga.customCoverImage as Uint8List)
|
||||
: cachedCompressedNetworkImage(
|
||||
headers: ref.watch(
|
||||
headersProvider(source: manga.source!, lang: manga.lang!),
|
||||
headersProvider(
|
||||
source: manga.source!,
|
||||
lang: manga.lang!,
|
||||
sourceId: manga.sourceId,
|
||||
),
|
||||
),
|
||||
imageUrl: toImgUrl(
|
||||
manga.customCoverFromTracker ?? manga.imageUrl ?? "",
|
||||
|
|
|
|||
|
|
@ -2020,6 +2020,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
|||
lang: randomManga.lang!,
|
||||
mangaM: randomManga,
|
||||
source: randomManga.source!,
|
||||
sourceId: randomManga.sourceId,
|
||||
);
|
||||
});
|
||||
} else if (value == 2) {
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ Future addTorrentFromUrlOrFromFile(
|
|||
isLocalArchive: true,
|
||||
artist: '',
|
||||
updatedAt: dateNow,
|
||||
sourceId: null,
|
||||
);
|
||||
|
||||
if (url != null) {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'add_torrent.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$addTorrentFromUrlOrFromFileHash() =>
|
||||
r'ca841c87c01dd9e9254b99b3223ac67d775ba5b2';
|
||||
r'a54f90b6708b13eeb8fed098691f9a79dbab50fd';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ Future<void> scanLocalLibrary(Ref ref) async {
|
|||
itemType: itemType,
|
||||
dateAdded: dateNow,
|
||||
lastUpdate: dateNow,
|
||||
sourceId: null,
|
||||
);
|
||||
newMangas++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'file_scanner.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$scanLocalLibraryHash() => r'7e028c45097e5802ee974d9f0c5a2bc540bba91c';
|
||||
String _$scanLocalLibraryHash() => r'efbad9aa5fa4233e260a2e132389c23b40ef515a';
|
||||
|
||||
/// Scans `Mangayomi/local` folder (if exists) for Mangas/Animes and imports in library.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ Future importArchivesFromFile(
|
|||
isLocalArchive: true,
|
||||
artist: '',
|
||||
updatedAt: dateNow,
|
||||
sourceId: null,
|
||||
);
|
||||
|
||||
for (var file in result.files.reversed.toList()) {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'local_archive.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$importArchivesFromFileHash() =>
|
||||
r'4d92aaade0544f76214030364433f91d27570b5a';
|
||||
r'784b9d45958695faffdf04ee7c105c9b486122de';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
|||
headersProvider(
|
||||
source: entry.source!,
|
||||
lang: entry.lang!,
|
||||
sourceId: entry.sourceId,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
@ -110,6 +111,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
|||
lang: entry.lang!,
|
||||
mangaM: entry,
|
||||
source: entry.source!,
|
||||
sourceId: entry.sourceId,
|
||||
);
|
||||
if (context.mounted) {
|
||||
ref.invalidate(
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ class LibraryListViewWidget extends StatelessWidget {
|
|||
lang: entry.lang!,
|
||||
mangaM: entry,
|
||||
source: entry.source!,
|
||||
sourceId: entry.sourceId,
|
||||
);
|
||||
ref.invalidate(
|
||||
getAllMangaWithoutCategoriesStreamProvider(
|
||||
|
|
@ -140,6 +141,7 @@ class LibraryListViewWidget extends StatelessWidget {
|
|||
headersProvider(
|
||||
source: entry.source!,
|
||||
lang: entry.lang!,
|
||||
sourceId: entry.sourceId,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -293,6 +293,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
headersProvider(
|
||||
source: widget.manga!.source!,
|
||||
lang: widget.manga!.lang!,
|
||||
sourceId: widget.manga!.sourceId,
|
||||
),
|
||||
),
|
||||
imageUrl: toImgUrl(
|
||||
|
|
@ -651,6 +652,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
final source = getSource(
|
||||
widget.manga!.lang!,
|
||||
widget.manga!.source!,
|
||||
widget.manga!.sourceId,
|
||||
);
|
||||
final url =
|
||||
"${source!.baseUrl}${widget.manga!.link!.getUrlWithoutDomain}";
|
||||
|
|
@ -670,6 +672,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
final source = getSource(
|
||||
widget.manga!.lang!,
|
||||
widget.manga!.source!,
|
||||
widget.manga!.sourceId,
|
||||
);
|
||||
context.push(
|
||||
'/extension_detail',
|
||||
|
|
@ -1513,6 +1516,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
final source = getSource(
|
||||
widget.manga!.lang!,
|
||||
widget.manga!.source!,
|
||||
widget.manga!.sourceId,
|
||||
);
|
||||
if (source == null) {
|
||||
botToast(l10n.source_not_added);
|
||||
|
|
@ -1827,6 +1831,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
headersProvider(
|
||||
source: widget.manga!.source!,
|
||||
lang: widget.manga!.lang!,
|
||||
sourceId: widget.manga!.sourceId,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
@ -1889,6 +1894,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
final source = getSource(
|
||||
widget.manga!.lang!,
|
||||
widget.manga!.source!,
|
||||
widget.manga!.sourceId,
|
||||
);
|
||||
final url =
|
||||
"${source!.baseUrl}${widget.manga!.link!.getUrlWithoutDomain}";
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ Future<dynamic> updateMangaDetail(
|
|||
if (manga!.chapters.isNotEmpty && isInit) {
|
||||
return;
|
||||
}
|
||||
final source = getSource(manga.lang!, manga.source!);
|
||||
final source = getSource(manga.lang!, manga.source!, manga.sourceId);
|
||||
MManga getManga;
|
||||
|
||||
getManga = await ref.read(
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$updateMangaDetailHash() => r'05605c26d058a9176a351ba5a79f811987d4ba1a';
|
||||
String _$updateMangaDetailHash() => r'6e4faa1fe453df67182ff6698f1ca54a7fff2bea';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -310,6 +310,7 @@ class _MigrationMangaGlobalImageCardState
|
|||
headersProvider(
|
||||
source: widget.source.name!,
|
||||
lang: widget.source.lang!,
|
||||
sourceId: widget.source.id,
|
||||
),
|
||||
),
|
||||
imageUrl: toImgUrl(
|
||||
|
|
@ -586,6 +587,7 @@ class _MigrationMangaGlobalImageCardState
|
|||
categories: categoryIds,
|
||||
dateAdded: DateTime.now().millisecondsSinceEpoch,
|
||||
updatedAt: DateTime.now().millisecondsSinceEpoch,
|
||||
sourceId: widget.source.id,
|
||||
);
|
||||
int mangaId = -1;
|
||||
isar.writeTxnSync(() {
|
||||
|
|
|
|||
|
|
@ -270,7 +270,11 @@ Future<void> downloadChapter(
|
|||
final cookie = MClient.getCookiesPref(page.url);
|
||||
final headers = itemType == ItemType.manga
|
||||
? ref.read(
|
||||
headersProvider(source: manga.source!, lang: manga.lang!),
|
||||
headersProvider(
|
||||
source: manga.source!,
|
||||
lang: manga.lang!,
|
||||
sourceId: manga.sourceId,
|
||||
),
|
||||
)
|
||||
: itemType == ItemType.anime
|
||||
? videoHeader
|
||||
|
|
|
|||
|
|
@ -1495,7 +1495,11 @@ class _MangaChapterPageGalleryState
|
|||
IconButton(
|
||||
onPressed: () async {
|
||||
final manga = chapter.manga.value!;
|
||||
final source = getSource(manga.lang!, manga.source!)!;
|
||||
final source = getSource(
|
||||
manga.lang!,
|
||||
manga.source!,
|
||||
manga.sourceId,
|
||||
)!;
|
||||
final url =
|
||||
"${source.baseUrl}${chapter.url!.getUrlWithoutDomain}";
|
||||
Map<String, dynamic> data = {
|
||||
|
|
|
|||
|
|
@ -332,6 +332,7 @@ void restoreKotatsuBackup(Ref ref, Archive archive) {
|
|||
categories: [favourite["category_id"]],
|
||||
itemType: ItemType.manga,
|
||||
favorite: true,
|
||||
sourceId: null,
|
||||
);
|
||||
isar.mangas.putSync(manga);
|
||||
}
|
||||
|
|
@ -402,6 +403,7 @@ void restoreTachiBkBackup(Ref ref, String path, BackupType bkType) {
|
|||
favorite: true,
|
||||
dateAdded: tempManga.dateAdded * 1000,
|
||||
lastUpdate: tempManga.lastModifiedAt * 1000,
|
||||
sourceId: null,
|
||||
);
|
||||
if (bkType == BackupType.neko) {
|
||||
manga.source = "MangaDex";
|
||||
|
|
@ -481,6 +483,7 @@ void restoreTachiBkBackup(Ref ref, String path, BackupType bkType) {
|
|||
favorite: true,
|
||||
dateAdded: tempAnime.dateAdded * 1000,
|
||||
lastUpdate: tempAnime.lastModifiedAt * 1000,
|
||||
sourceId: null,
|
||||
);
|
||||
isar.mangas.putSync(anime);
|
||||
History? history;
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ class _RestoreBackupProviderElement extends AutoDisposeProviderElement<void>
|
|||
}
|
||||
|
||||
String _$restoreKotatsuBackupHash() =>
|
||||
r'e927f6a196a0349285fecbd84f30c2a9125998b2';
|
||||
r'4b43cb1719527b3030b9966e5ef662c29435425d';
|
||||
|
||||
/// See also [restoreKotatsuBackup].
|
||||
@ProviderFor(restoreKotatsuBackup)
|
||||
|
|
@ -407,7 +407,7 @@ class _RestoreKotatsuBackupProviderElement
|
|||
}
|
||||
|
||||
String _$restoreTachiBkBackupHash() =>
|
||||
r'ae971c2630393df773eb1d64214b4daefb080b95';
|
||||
r'54434eaa9dc875d03ffb1dcf62ad2d7971649d61';
|
||||
|
||||
/// See also [restoreTachiBkBackup].
|
||||
@ProviderFor(restoreTachiBkBackup)
|
||||
|
|
|
|||
|
|
@ -418,7 +418,11 @@ class _NovelWebViewState extends ConsumerState<NovelWebView>
|
|||
IconButton(
|
||||
onPressed: () async {
|
||||
final manga = chapter.manga.value!;
|
||||
final source = getSource(manga.lang!, manga.source!)!;
|
||||
final source = getSource(
|
||||
manga.lang!,
|
||||
manga.source!,
|
||||
manga.sourceId,
|
||||
)!;
|
||||
String url = chapter.url!.startsWith('/')
|
||||
? "${source.baseUrl}/${chapter.url!}"
|
||||
: chapter.url!;
|
||||
|
|
|
|||
|
|
@ -284,6 +284,7 @@ class TrackerItemCard extends StatelessWidget {
|
|||
link: null,
|
||||
status: Status.unknown,
|
||||
description: "",
|
||||
sourceId: null,
|
||||
),
|
||||
track,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ class UpdateChapterListTileWidget extends ConsumerWidget {
|
|||
headersProvider(
|
||||
source: manga.source!,
|
||||
lang: manga.lang!,
|
||||
sourceId: manga.sourceId,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -61,7 +61,11 @@ class MangaImageCardWidget extends ConsumerWidget {
|
|||
: getMangaDetail!.imageUrl ?? "",
|
||||
),
|
||||
headers: ref.watch(
|
||||
headersProvider(source: source.name!, lang: source.lang!),
|
||||
headersProvider(
|
||||
source: source.name!,
|
||||
lang: source.lang!,
|
||||
sourceId: source.id,
|
||||
),
|
||||
),
|
||||
cache: true,
|
||||
cacheMaxAge: const Duration(days: 7),
|
||||
|
|
@ -74,6 +78,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
|||
lang: source.lang!,
|
||||
source: source.name!,
|
||||
itemType: itemType,
|
||||
sourceId: source.id,
|
||||
);
|
||||
},
|
||||
onLongPress: () {
|
||||
|
|
@ -85,6 +90,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
|||
source: source.name!,
|
||||
itemType: itemType,
|
||||
addToFavourite: true,
|
||||
sourceId: source.id,
|
||||
);
|
||||
},
|
||||
onSecondaryTap: () {
|
||||
|
|
@ -96,6 +102,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
|||
source: source.name!,
|
||||
itemType: itemType,
|
||||
addToFavourite: true,
|
||||
sourceId: source.id,
|
||||
);
|
||||
},
|
||||
children: [
|
||||
|
|
@ -173,7 +180,11 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
|||
: getMangaDetail!.imageUrl ?? "",
|
||||
),
|
||||
headers: ref.watch(
|
||||
headersProvider(source: source.name!, lang: source.lang!),
|
||||
headersProvider(
|
||||
source: source.name!,
|
||||
lang: source.lang!,
|
||||
sourceId: source.id,
|
||||
),
|
||||
),
|
||||
);
|
||||
return Padding(
|
||||
|
|
@ -191,6 +202,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
|||
lang: source.lang!,
|
||||
source: source.name!,
|
||||
itemType: itemType,
|
||||
sourceId: source.id,
|
||||
);
|
||||
},
|
||||
onLongPress: () {
|
||||
|
|
@ -202,6 +214,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
|||
source: source.name!,
|
||||
itemType: itemType,
|
||||
addToFavourite: true,
|
||||
sourceId: source.id,
|
||||
);
|
||||
},
|
||||
onSecondaryTap: () {
|
||||
|
|
@ -213,6 +226,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
|||
source: source.name!,
|
||||
itemType: itemType,
|
||||
addToFavourite: true,
|
||||
sourceId: source.id,
|
||||
);
|
||||
},
|
||||
child: Row(
|
||||
|
|
@ -286,6 +300,7 @@ Future<void> pushToMangaReaderDetail({
|
|||
required String lang,
|
||||
required BuildContext context,
|
||||
required String source,
|
||||
required int? sourceId,
|
||||
int? archiveId,
|
||||
Manga? mangaM,
|
||||
ItemType? itemType,
|
||||
|
|
@ -309,6 +324,7 @@ Future<void> pushToMangaReaderDetail({
|
|||
lastUpdate: 0,
|
||||
itemType: itemType ?? ItemType.manga,
|
||||
artist: getManga.artist ?? '',
|
||||
sourceId: sourceId,
|
||||
);
|
||||
final empty = isar.mangas
|
||||
.filter()
|
||||
|
|
@ -334,7 +350,12 @@ Future<void> pushToMangaReaderDetail({
|
|||
} else {
|
||||
mangaId = archiveId;
|
||||
}
|
||||
|
||||
final mang = isar.mangas.getSync(mangaId);
|
||||
if (mang!.sourceId == null) {
|
||||
isar.writeTxnSync(() {
|
||||
isar.mangas.putSync(mang..sourceId = sourceId);
|
||||
});
|
||||
}
|
||||
final settings = isar.settings.getSync(227)!;
|
||||
final sortList = settings.sortChapterList ?? [];
|
||||
final checkIfExist = sortList
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'aniskip.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c';
|
||||
String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421';
|
||||
|
||||
/// See also [AniSkip].
|
||||
@ProviderFor(AniSkip)
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ Future<GetChapterPagesModel> getChapterPages(
|
|||
final source = getSource(
|
||||
chapter.manga.value!.lang!,
|
||||
chapter.manga.value!.source!,
|
||||
chapter.manga.value!.sourceId,
|
||||
)!;
|
||||
if ((isarPageUrls?.urls?.isNotEmpty ?? false) &&
|
||||
(isarPageUrls?.chapterUrl ?? chapter.url) == chapter.url) {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getChapterPagesHash() => r'8f6d2d661593fc5537f4dda83abea8d46d65b027';
|
||||
String _$getChapterPagesHash() => r'129624607a92b6d3a896a03b450862ce1e941ff6';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ Future<(String, EpubBook?)> getHtmlContent(
|
|||
final source = getSource(
|
||||
chapter.manga.value!.lang!,
|
||||
chapter.manga.value!.source!,
|
||||
chapter.manga.value!.sourceId,
|
||||
);
|
||||
String? html;
|
||||
final proxyServer = ref.read(androidProxyServerStateProvider);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'get_html_content.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getHtmlContentHash() => r'c32670ed25b093761c867f5cf1cb5dfe063edc84';
|
||||
String _$getHtmlContentHash() => r'fa74506c0adebbdb7a0dda5a8d16a784466b79bb';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -56,12 +56,13 @@ Future<(List<Video>, bool, List<String>, Directory?)> getVideoList(
|
|||
[Video(path!, episode.name!, path, subtitles: subtitles)],
|
||||
true,
|
||||
infoHashes,
|
||||
mpvDirectory
|
||||
mpvDirectory,
|
||||
);
|
||||
}
|
||||
final source = getSource(
|
||||
episode.manga.value!.lang!,
|
||||
episode.manga.value!.source!,
|
||||
episode.manga.value!.sourceId,
|
||||
);
|
||||
final proxyServer = ref.read(androidProxyServerStateProvider);
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'get_video_list.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$getVideoListHash() => r'1fe7493f84a661cb7a3a2f1ce1e0b62e53801096';
|
||||
String _$getVideoListHash() => r'0b35633b9758cd633cc826801568aa81fbb27b61';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'anilist.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$anilistHash() => r'f6d46f4e330f1461ef18242a5e86589cb7a165c5';
|
||||
String _$anilistHash() => r'b3c56b172308ecd98c4dd9fb89d17ccc36487754';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'kitsu.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$kitsuHash() => r'0c560ca99e2858b38af183491303d9cdcc9c0d92';
|
||||
String _$kitsuHash() => r'496bdb4380faeba4d15da60b2c4d89ad2e2da7ca';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'myanimelist.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$myAnimeListHash() => r'c6812dbc8c56494e4776f80a2b0f402bf5e00996';
|
||||
String _$myAnimeListHash() => r'092a7d2d329c5d40fede4bfc00644576b2d08eaa';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'simkl.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$simklHash() => r'b55f4a85c66fbb4456e0499f15376d314cd0bf90';
|
||||
String _$simklHash() => r'3a6e18e9a2ef6dc702c569bd747c66ff605643ce';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'trakt_tv.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$traktTvHash() => r'1ae8a5c79cb6b5fc6c5d9db61ed9307deeb450ed';
|
||||
String _$traktTvHash() => r'd852a7d96511637bf565cbcf6e958397740158fd';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
|
|||
headersProvider(
|
||||
source: data.chapter!.manga.value!.source!,
|
||||
lang: data.chapter!.manga.value!.lang!,
|
||||
sourceId: data.chapter!.manga.value!.sourceId,
|
||||
),
|
||||
),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -14,9 +14,10 @@ Map<String, String> headers(
|
|||
Ref ref, {
|
||||
required String source,
|
||||
required String lang,
|
||||
required int? sourceId,
|
||||
String androidProxyServer = "",
|
||||
}) {
|
||||
final mSource = getSource(lang, source);
|
||||
final mSource = getSource(lang, source, sourceId);
|
||||
|
||||
Map<String, String> headers = {};
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'headers.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$headersHash() => r'a33ccbf1971e6b5da84f25a852c675a4d8821ea2';
|
||||
String _$headersHash() => r'6ad2d5394456d7c054f1270a9f774329ccbb5dad';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
@ -42,11 +42,13 @@ class HeadersFamily extends Family<Map<String, String>> {
|
|||
HeadersProvider call({
|
||||
required String source,
|
||||
required String lang,
|
||||
required int? sourceId,
|
||||
String androidProxyServer = "",
|
||||
}) {
|
||||
return HeadersProvider(
|
||||
source: source,
|
||||
lang: lang,
|
||||
sourceId: sourceId,
|
||||
androidProxyServer: androidProxyServer,
|
||||
);
|
||||
}
|
||||
|
|
@ -56,6 +58,7 @@ class HeadersFamily extends Family<Map<String, String>> {
|
|||
return call(
|
||||
source: provider.source,
|
||||
lang: provider.lang,
|
||||
sourceId: provider.sourceId,
|
||||
androidProxyServer: provider.androidProxyServer,
|
||||
);
|
||||
}
|
||||
|
|
@ -81,12 +84,14 @@ class HeadersProvider extends AutoDisposeProvider<Map<String, String>> {
|
|||
HeadersProvider({
|
||||
required String source,
|
||||
required String lang,
|
||||
required int? sourceId,
|
||||
String androidProxyServer = "",
|
||||
}) : this._internal(
|
||||
(ref) => headers(
|
||||
ref as HeadersRef,
|
||||
source: source,
|
||||
lang: lang,
|
||||
sourceId: sourceId,
|
||||
androidProxyServer: androidProxyServer,
|
||||
),
|
||||
from: headersProvider,
|
||||
|
|
@ -98,6 +103,7 @@ class HeadersProvider extends AutoDisposeProvider<Map<String, String>> {
|
|||
allTransitiveDependencies: HeadersFamily._allTransitiveDependencies,
|
||||
source: source,
|
||||
lang: lang,
|
||||
sourceId: sourceId,
|
||||
androidProxyServer: androidProxyServer,
|
||||
);
|
||||
|
||||
|
|
@ -110,11 +116,13 @@ class HeadersProvider extends AutoDisposeProvider<Map<String, String>> {
|
|||
required super.from,
|
||||
required this.source,
|
||||
required this.lang,
|
||||
required this.sourceId,
|
||||
required this.androidProxyServer,
|
||||
}) : super.internal();
|
||||
|
||||
final String source;
|
||||
final String lang;
|
||||
final int? sourceId;
|
||||
final String androidProxyServer;
|
||||
|
||||
@override
|
||||
|
|
@ -132,6 +140,7 @@ class HeadersProvider extends AutoDisposeProvider<Map<String, String>> {
|
|||
debugGetCreateSourceHash: null,
|
||||
source: source,
|
||||
lang: lang,
|
||||
sourceId: sourceId,
|
||||
androidProxyServer: androidProxyServer,
|
||||
),
|
||||
);
|
||||
|
|
@ -147,6 +156,7 @@ class HeadersProvider extends AutoDisposeProvider<Map<String, String>> {
|
|||
return other is HeadersProvider &&
|
||||
other.source == source &&
|
||||
other.lang == lang &&
|
||||
other.sourceId == sourceId &&
|
||||
other.androidProxyServer == androidProxyServer;
|
||||
}
|
||||
|
||||
|
|
@ -155,6 +165,7 @@ class HeadersProvider extends AutoDisposeProvider<Map<String, String>> {
|
|||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, source.hashCode);
|
||||
hash = _SystemHash.combine(hash, lang.hashCode);
|
||||
hash = _SystemHash.combine(hash, sourceId.hashCode);
|
||||
hash = _SystemHash.combine(hash, androidProxyServer.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
|
|
@ -170,6 +181,9 @@ mixin HeadersRef on AutoDisposeProviderRef<Map<String, String>> {
|
|||
/// The parameter `lang` of this provider.
|
||||
String get lang;
|
||||
|
||||
/// The parameter `sourceId` of this provider.
|
||||
int? get sourceId;
|
||||
|
||||
/// The parameter `androidProxyServer` of this provider.
|
||||
String get androidProxyServer;
|
||||
}
|
||||
|
|
@ -184,6 +198,8 @@ class _HeadersProviderElement
|
|||
@override
|
||||
String get lang => (origin as HeadersProvider).lang;
|
||||
@override
|
||||
int? get sourceId => (origin as HeadersProvider).sourceId;
|
||||
@override
|
||||
String get androidProxyServer =>
|
||||
(origin as HeadersProvider).androidProxyServer;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,14 +2,15 @@ import 'package:isar/isar.dart';
|
|||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
|
||||
Source? getSource(String lang, String name) {
|
||||
Source? getSource(String lang, String name, int? sourceId) {
|
||||
try {
|
||||
final sourcesList = isar.sources.filter().idIsNotNull().findAllSync();
|
||||
return sourcesList.lastWhere(
|
||||
(element) =>
|
||||
element.name!.toLowerCase() == name.toLowerCase() &&
|
||||
element.lang == lang &&
|
||||
element.sourceCode != null,
|
||||
return sourcesList.firstWhere(
|
||||
(element) => sourceId != null
|
||||
? element.id == sourceId && element.sourceCode != null
|
||||
: element.name!.toLowerCase() == name.toLowerCase() &&
|
||||
element.lang == lang &&
|
||||
element.sourceCode != null,
|
||||
orElse: () => throw ("Error when getting source"),
|
||||
);
|
||||
} catch (_) {
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ extension ClassElementX on ClassElement {
|
|||
return [
|
||||
...fields,
|
||||
if (collectionAnnotation?.inheritance ?? embeddedAnnotation!.inheritance)
|
||||
for (InterfaceType supertype in allSupertypes) ...[
|
||||
if (!supertype.isDartCoreObject) ...supertype.element.fields
|
||||
]
|
||||
for (final InterfaceType supertype in allSupertypes) ...[
|
||||
if (!supertype.isDartCoreObject) ...supertype.element.fields,
|
||||
],
|
||||
]
|
||||
.where(
|
||||
(PropertyInducingElement e) =>
|
||||
|
|
|
|||
|
|
@ -162,21 +162,21 @@ class IsarAnalyzer {
|
|||
}
|
||||
|
||||
Map<String, String> _getEmbeddedDartNames(ClassElement element) {
|
||||
void _fillNames(Map<String, String> names, ClassElement element) {
|
||||
void fillNames(Map<String, String> names, ClassElement element) {
|
||||
for (final property in element.allAccessors) {
|
||||
final type = property.type.scalarType.element;
|
||||
if (type is ClassElement && type.embeddedAnnotation != null) {
|
||||
final isarName = type.isarName;
|
||||
if (!names.containsKey(isarName)) {
|
||||
names[type.isarName] = type.displayName;
|
||||
_fillNames(names, type);
|
||||
fillNames(names, type);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final names = <String, String>{};
|
||||
_fillNames(names, element);
|
||||
fillNames(names, element);
|
||||
return names;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue