feat: Add use sourceId property if not null to get source model

This commit is contained in:
Moustapha Kodjo Amadou 2025-08-28 12:12:23 +01:00
parent 619e1b640d
commit 600a699708
45 changed files with 251 additions and 48 deletions

View file

@ -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,
};
}

View file

@ -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');

View file

@ -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);
}
}

View file

@ -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(

View file

@ -376,6 +376,7 @@ class CalendarListTileWidget extends ConsumerWidget {
headersProvider(
source: manga.source!,
lang: manga.lang!,
sourceId: manga.sourceId,
),
),
),

View file

@ -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 ?? "",

View file

@ -2020,6 +2020,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
lang: randomManga.lang!,
mangaM: randomManga,
source: randomManga.source!,
sourceId: randomManga.sourceId,
);
});
} else if (value == 2) {

View file

@ -51,6 +51,7 @@ Future addTorrentFromUrlOrFromFile(
isLocalArchive: true,
artist: '',
updatedAt: dateNow,
sourceId: null,
);
if (url != null) {

View file

@ -7,7 +7,7 @@ part of 'add_torrent.dart';
// **************************************************************************
String _$addTorrentFromUrlOrFromFileHash() =>
r'ca841c87c01dd9e9254b99b3223ac67d775ba5b2';
r'a54f90b6708b13eeb8fed098691f9a79dbab50fd';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -130,6 +130,7 @@ Future<void> scanLocalLibrary(Ref ref) async {
itemType: itemType,
dateAdded: dateNow,
lastUpdate: dateNow,
sourceId: null,
);
newMangas++;
}

View file

@ -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.
///

View file

@ -48,6 +48,7 @@ Future importArchivesFromFile(
isLocalArchive: true,
artist: '',
updatedAt: dateNow,
sourceId: null,
);
for (var file in result.files.reversed.toList()) {

View file

@ -7,7 +7,7 @@ part of 'local_archive.dart';
// **************************************************************************
String _$importArchivesFromFileHash() =>
r'4d92aaade0544f76214030364433f91d27570b5a';
r'784b9d45958695faffdf04ee7c105c9b486122de';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -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(

View file

@ -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,
),
),
),

View file

@ -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}";

View file

@ -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(

View file

@ -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 {

View file

@ -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(() {

View file

@ -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

View file

@ -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 = {

View file

@ -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;

View file

@ -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)

View file

@ -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!;

View file

@ -284,6 +284,7 @@ class TrackerItemCard extends StatelessWidget {
link: null,
status: Status.unknown,
description: "",
sourceId: null,
),
track,
),

View file

@ -71,6 +71,7 @@ class UpdateChapterListTileWidget extends ConsumerWidget {
headersProvider(
source: manga.source!,
lang: manga.lang!,
sourceId: manga.sourceId,
),
),
),

View file

@ -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

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

@ -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) {

View file

@ -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 {

View file

@ -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);

View file

@ -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 {

View file

@ -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);

View file

@ -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 {

View file

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

View file

@ -6,7 +6,7 @@ part of 'kitsu.dart';
// RiverpodGenerator
// **************************************************************************
String _$kitsuHash() => r'0c560ca99e2858b38af183491303d9cdcc9c0d92';
String _$kitsuHash() => r'496bdb4380faeba4d15da60b2c4d89ad2e2da7ca';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'myanimelist.dart';
// RiverpodGenerator
// **************************************************************************
String _$myAnimeListHash() => r'c6812dbc8c56494e4776f80a2b0f402bf5e00996';
String _$myAnimeListHash() => r'092a7d2d329c5d40fede4bfc00644576b2d08eaa';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'simkl.dart';
// RiverpodGenerator
// **************************************************************************
String _$simklHash() => r'b55f4a85c66fbb4456e0499f15376d314cd0bf90';
String _$simklHash() => r'3a6e18e9a2ef6dc702c569bd747c66ff605643ce';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -6,7 +6,7 @@ part of 'trakt_tv.dart';
// RiverpodGenerator
// **************************************************************************
String _$traktTvHash() => r'1ae8a5c79cb6b5fc6c5d9db61ed9307deeb450ed';
String _$traktTvHash() => r'd852a7d96511637bf565cbcf6e958397740158fd';
/// Copied from Dart SDK
class _SystemHash {

View file

@ -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,
),
),
},

View file

@ -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 = {};

View file

@ -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;
}

View file

@ -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 (_) {

View file

@ -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) =>

View file

@ -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;
}