import 'package:file_picker/file_picker.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/changed.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/services/torrent_server.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'add_torrent.g.dart'; @riverpod Future addTorrentFromUrlOrFromFile(Ref ref, Manga? mManga, {required bool init, String? url}) async { FilePickerResult? result; if (url == null) { result = await FilePicker.platform.pickFiles( allowMultiple: true, type: FileType.custom, allowedExtensions: ['torrent']); } if (result != null || url != null) { String torrentName = ""; if (url != null) { torrentName = (await MTorrentServer().getTorrentPlaylist(url, null)) .$1 .first .quality; } final dateNow = DateTime.now().millisecondsSinceEpoch; final manga = mManga ?? Manga( favorite: true, source: 'torrent', author: '', itemType: ItemType.anime, genre: [], imageUrl: '', lang: '', link: '', name: url != null ? torrentName : _getName(result!.files.first.path!), dateAdded: dateNow, lastUpdate: dateNow, status: Status.unknown, description: '', isLocalArchive: true, artist: '', ); ref .read(synchingProvider(syncId: 1).notifier) .addChangedPart(ActionType.addItem, null, manga.toJson(), true); if (url != null) { manga.customCoverImage = null; isar.writeTxnSync(() { isar.mangas.putSync(manga); final chapters = Chapter(name: torrentName, url: url, mangaId: manga.id) ..manga.value = manga; isar.chapters.putSync(chapters); chapters.manga.saveSync(); ref.read(synchingProvider(syncId: 1).notifier).addChangedPart( ActionType.addChapter, null, chapters.toJson(), false); }); } else { for (var file in result!.files.reversed.toList()) { String name = _getName(file.path!); if (init) { manga.customCoverImage = null; } isar.writeTxnSync(() { isar.mangas.putSync(manga); final chapters = Chapter(name: name, archivePath: file.path, mangaId: manga.id) ..manga.value = manga; isar.chapters.putSync(chapters); chapters.manga.saveSync(); ref.read(synchingProvider(syncId: 1).notifier).addChangedPart( ActionType.addChapter, null, chapters.toJson(), false); }); } } } return ""; } String _getName(String path) { return path.split('/').last.split("\\").last.replaceAll( RegExp(r'\.(mp4|mov|avi|flv|wmv|mpeg|mkv|cbz|zip|cbt|tar|torrent)'), ''); }