mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-20 19:12:04 +00:00
Update
This commit is contained in:
parent
fc2e80f31e
commit
a086e918b6
24 changed files with 264 additions and 47 deletions
|
|
@ -36,6 +36,9 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
|
|||
'supportsLatest': BridgeMethodDef(BridgeFunctionDef(
|
||||
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.bool)),
|
||||
)),
|
||||
'baseUrl': BridgeMethodDef(BridgeFunctionDef(
|
||||
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string),
|
||||
nullable: true))),
|
||||
},
|
||||
methods: {
|
||||
'getLatestUpdates': BridgeMethodDef(BridgeFunctionDef(
|
||||
|
|
@ -936,6 +939,9 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
|
|||
@override
|
||||
bool get supportsLatest => $_get('supportsLatest');
|
||||
|
||||
@override
|
||||
String? get baseUrl => $_get('baseUrl');
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(String url) async =>
|
||||
await $_invoke('getDetail', [$String(url)]);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ abstract class MProvider {
|
|||
|
||||
bool get supportsLatest => true;
|
||||
|
||||
String? get baseUrl;
|
||||
|
||||
Future<MPages> getLatestUpdates(int page);
|
||||
|
||||
Future<MPages> getPopular(int page);
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ class Source {
|
|||
String? additionalParams;
|
||||
|
||||
Source(
|
||||
{this.id = 1,
|
||||
{this.id = 0,
|
||||
this.name = '',
|
||||
this.baseUrl = '',
|
||||
this.lang = '',
|
||||
|
|
|
|||
|
|
@ -3,17 +3,18 @@ import 'package:mangayomi/main.dart';
|
|||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/modules/browse/extension/providers/fetch_manga_sources.dart';
|
||||
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
part 'fetch_anime_sources.g.dart';
|
||||
|
||||
@riverpod
|
||||
Future fetchAnimeSourcesList(FetchAnimeSourcesListRef ref,
|
||||
{int? id, required bool reFresh}) async {
|
||||
final http = MInterceptor.init();
|
||||
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
|
||||
final info = await PackageInfo.fromPlatform();
|
||||
final req = await http.get(Uri.parse(
|
||||
final req = await MInterceptor.init().get(Uri.parse(
|
||||
"https://kodjodevf.github.io/mangayomi-extensions/anime_index.json"));
|
||||
final res = jsonDecode(req.body) as List;
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$fetchAnimeSourcesListHash() =>
|
||||
r'3f9cf47efce8e6e207c59e0d936727959c1fe982';
|
||||
r'0978d9a13fa5d0a13be2ade237afa37897dd251b';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -5,14 +5,15 @@ import 'package:mangayomi/eval/runtime/runtime.dart';
|
|||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
part 'fetch_manga_sources.g.dart';
|
||||
|
||||
@riverpod
|
||||
Future fetchMangaSourcesList(FetchMangaSourcesListRef ref,
|
||||
{int? id, required reFresh}) async {
|
||||
final http = MInterceptor.init();
|
||||
if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) {
|
||||
final info = await PackageInfo.fromPlatform();
|
||||
final req = await http.get(Uri.parse(
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$fetchMangaSourcesListHash() =>
|
||||
r'a74557098c49877942a296abe110fb6ef1dce580';
|
||||
r'd5e159297c52465b30b2a2f7c6fd13f22778d218';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provi
|
|||
import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/services/get_source_baseurl.dart';
|
||||
import 'package:mangayomi/sources/utils/utils.dart';
|
||||
import 'package:mangayomi/utils/cached_network.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
|
|
@ -1534,10 +1535,13 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
elevation: 0),
|
||||
onPressed: () {
|
||||
final manga = widget.manga!;
|
||||
|
||||
final source =
|
||||
getSource(widget.manga!.lang!, widget.manga!.source!)!;
|
||||
final baseUrl =
|
||||
ref.watch(sourceBaseUrlProvider(source: source));
|
||||
String url = widget.manga!.link!.startsWith('/')
|
||||
? "${source.baseUrl}${widget.manga!.link!}"
|
||||
? "$baseUrl${widget.manga!.link!}"
|
||||
: widget.manga!.link!;
|
||||
|
||||
Map<String, dynamic> data = {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$updateMangaDetailHash() => r'950a994c59fea3451e6bced24d50d27b65f4b605';
|
||||
String _$updateMangaDetailHash() => r'7733551fd578f5d093c4ca11427015a3f3af415a';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import 'package:mangayomi/providers/l10n_providers.dart';
|
|||
import 'package:mangayomi/services/get_filter_list.dart';
|
||||
import 'package:mangayomi/services/get_latest_updates.dart';
|
||||
import 'package:mangayomi/services/get_popular.dart';
|
||||
import 'package:mangayomi/services/get_source_baseurl.dart';
|
||||
import 'package:mangayomi/services/search.dart';
|
||||
import 'package:mangayomi/services/supports_latest.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
|
|
@ -67,26 +68,25 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
|||
}
|
||||
|
||||
Future<MPages?> _loadMore() async {
|
||||
MPages? mangaResList;
|
||||
|
||||
MPages? mangaRes;
|
||||
if (_isLoading) {
|
||||
if (widget.source.isFullData!) {
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
_fullDataLength = _fullDataLength + 50;
|
||||
} else {
|
||||
if (_selectedIndex == 0 && !_isSearch && _query.isEmpty) {
|
||||
mangaResList = await ref.watch(getPopularProvider(
|
||||
mangaRes = await ref.watch(getPopularProvider(
|
||||
source: widget.source,
|
||||
page: _page + 1,
|
||||
).future);
|
||||
} else if (_selectedIndex == 1 && !_isSearch && _query.isEmpty) {
|
||||
mangaResList = await ref.watch(getLatestUpdatesProvider(
|
||||
mangaRes = await ref.watch(getLatestUpdatesProvider(
|
||||
source: widget.source,
|
||||
page: _page + 1,
|
||||
).future);
|
||||
} else if (_selectedIndex == 2 && (_isSearch && _query.isNotEmpty) ||
|
||||
_isFiltering) {
|
||||
mangaResList = await ref.watch(searchProvider(
|
||||
mangaRes = await ref.watch(searchProvider(
|
||||
source: widget.source,
|
||||
query: _query,
|
||||
page: _page + 1,
|
||||
|
|
@ -94,14 +94,17 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
|||
.future);
|
||||
}
|
||||
}
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_page = _page + 1;
|
||||
_hasNextPage = mangaResList!.hasNextPage;
|
||||
});
|
||||
if (mangaRes!.list.isNotEmpty) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_page = _page + 1;
|
||||
_hasNextPage = mangaRes!.hasNextPage;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return mangaResList;
|
||||
|
||||
return mangaRes;
|
||||
}
|
||||
|
||||
late final _textEditingController = TextEditingController(text: widget.query);
|
||||
|
|
@ -181,8 +184,10 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
|||
Icon(Icons.search, color: Theme.of(context).hintColor)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
final baseUrl =
|
||||
ref.watch(sourceBaseUrlProvider(source: widget.source));
|
||||
Map<String, dynamic> data = {
|
||||
'url': widget.source.baseUrl!,
|
||||
'url': baseUrl,
|
||||
'sourceId': widget.source.id.toString(),
|
||||
'title': '',
|
||||
"hasCloudFlare": widget.source.hasCloudflare ?? false
|
||||
|
|
@ -475,8 +480,10 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
|||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
final baseUrl = ref.watch(
|
||||
sourceBaseUrlProvider(source: widget.source));
|
||||
Map<String, dynamic> data = {
|
||||
'url': widget.source.baseUrl!,
|
||||
'url': baseUrl,
|
||||
'sourceId': widget.source.id.toString(),
|
||||
'title': '',
|
||||
"hasCloudFlare":
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@ import 'dart:convert';
|
|||
import 'dart:developer';
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:mangayomi/modules/browse/extension/providers/fetch_manga_sources.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:mangayomi/utils/extensions/string_extensions.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
|
@ -76,6 +76,7 @@ Future<void> _launchInBrowser(Uri url) async {
|
|||
}
|
||||
|
||||
Future<(String, String, String)> _checkUpdate() async {
|
||||
final http = MInterceptor.init();
|
||||
try {
|
||||
final res = await http.get(Uri.parse(
|
||||
"https://api.github.com/repos/kodjodevf/Mangayomi/releases?page=1&per_page=10"));
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import 'dart:convert';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'aniskip.g.dart';
|
||||
|
||||
// credits: https://github.com/aniyomiorg/aniyomi/blob/master/app/src/main/java/eu/kanade/tachiyomi/util/AniSkipApi.kt
|
||||
@riverpod
|
||||
class AniSkip extends _$AniSkip {
|
||||
final _client = http.Client();
|
||||
final http = MInterceptor.init();
|
||||
@override
|
||||
void build() {}
|
||||
|
||||
|
|
@ -17,7 +17,7 @@ class AniSkip extends _$AniSkip {
|
|||
|
||||
final url =
|
||||
"https://api.aniskip.com/v2/skip-times/$malId/$episodeNumber?types[]=ed&types[]=mixed-ed&types[]=mixed-op&types[]=op&types[]=recap&episodeLength=$episodeLength";
|
||||
final response = await _client.get(Uri.parse(url));
|
||||
final response = await http.get(Uri.parse(url));
|
||||
final res = AniSkipResponse.fromJson(json.decode(response.body));
|
||||
|
||||
return (res.found ?? false) ? res.results : null;
|
||||
|
|
@ -35,7 +35,7 @@ class AniSkip extends _$AniSkip {
|
|||
Media(id:${id.$1}){idMal}
|
||||
}
|
||||
""";
|
||||
final response = await _client.post(
|
||||
final response = await http.post(
|
||||
Uri.parse("https://graphql.anilist.co"),
|
||||
body: json.encode({"query": query}),
|
||||
headers: {"Content-Type": "application/json"},
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'aniskip.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$aniSkipHash() => r'58cfba5bb87e0a5f34009391a204d99bf773c858';
|
||||
String _$aniSkipHash() => r'bd921f6bbeebd61d17644a6efd4e5960330ba17b';
|
||||
|
||||
/// See also [AniSkip].
|
||||
@ProviderFor(AniSkip)
|
||||
|
|
|
|||
31
lib/services/get_source_baseurl.dart
Normal file
31
lib/services/get_source_baseurl.dart
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import 'package:mangayomi/eval/bridge/m_source.dart';
|
||||
import 'package:mangayomi/eval/compiler/compiler.dart';
|
||||
import 'package:mangayomi/eval/model/m_provider.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
import 'package:mangayomi/eval/runtime/runtime.dart';
|
||||
import 'package:mangayomi/sources/source_test.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'get_source_baseurl.g.dart';
|
||||
|
||||
@riverpod
|
||||
String sourceBaseUrl(SourceBaseUrlRef ref, {required Source source}) {
|
||||
String? baseUrl;
|
||||
|
||||
try {
|
||||
final bytecode =
|
||||
compilerEval(useTestSourceCode ? testSourceCode : source.sourceCode!);
|
||||
|
||||
final runtime = runtimeEval(bytecode);
|
||||
|
||||
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
|
||||
[$MSource.wrap(source.toMSource())]);
|
||||
baseUrl = (res as MProvider).baseUrl;
|
||||
} catch (e) {
|
||||
baseUrl = source.baseUrl;
|
||||
}
|
||||
if (baseUrl == null || baseUrl.isEmpty) {
|
||||
baseUrl = source.baseUrl;
|
||||
}
|
||||
|
||||
return baseUrl!;
|
||||
}
|
||||
158
lib/services/get_source_baseurl.g.dart
Normal file
158
lib/services/get_source_baseurl.g.dart
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'get_source_baseurl.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$sourceBaseUrlHash() => r'232addc3559f2b77974224a5ed8813eee9a0ba8e';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
_SystemHash._();
|
||||
|
||||
static int combine(int hash, int value) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + value);
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||
return hash ^ (hash >> 6);
|
||||
}
|
||||
|
||||
static int finish(int hash) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||
// ignore: parameter_assignments
|
||||
hash = hash ^ (hash >> 11);
|
||||
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||
}
|
||||
}
|
||||
|
||||
/// See also [sourceBaseUrl].
|
||||
@ProviderFor(sourceBaseUrl)
|
||||
const sourceBaseUrlProvider = SourceBaseUrlFamily();
|
||||
|
||||
/// See also [sourceBaseUrl].
|
||||
class SourceBaseUrlFamily extends Family<String> {
|
||||
/// See also [sourceBaseUrl].
|
||||
const SourceBaseUrlFamily();
|
||||
|
||||
/// See also [sourceBaseUrl].
|
||||
SourceBaseUrlProvider call({
|
||||
required Source source,
|
||||
}) {
|
||||
return SourceBaseUrlProvider(
|
||||
source: source,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
SourceBaseUrlProvider getProviderOverride(
|
||||
covariant SourceBaseUrlProvider provider,
|
||||
) {
|
||||
return call(
|
||||
source: provider.source,
|
||||
);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'sourceBaseUrlProvider';
|
||||
}
|
||||
|
||||
/// See also [sourceBaseUrl].
|
||||
class SourceBaseUrlProvider extends AutoDisposeProvider<String> {
|
||||
/// See also [sourceBaseUrl].
|
||||
SourceBaseUrlProvider({
|
||||
required Source source,
|
||||
}) : this._internal(
|
||||
(ref) => sourceBaseUrl(
|
||||
ref as SourceBaseUrlRef,
|
||||
source: source,
|
||||
),
|
||||
from: sourceBaseUrlProvider,
|
||||
name: r'sourceBaseUrlProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$sourceBaseUrlHash,
|
||||
dependencies: SourceBaseUrlFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
SourceBaseUrlFamily._allTransitiveDependencies,
|
||||
source: source,
|
||||
);
|
||||
|
||||
SourceBaseUrlProvider._internal(
|
||||
super._createNotifier, {
|
||||
required super.name,
|
||||
required super.dependencies,
|
||||
required super.allTransitiveDependencies,
|
||||
required super.debugGetCreateSourceHash,
|
||||
required super.from,
|
||||
required this.source,
|
||||
}) : super.internal();
|
||||
|
||||
final Source source;
|
||||
|
||||
@override
|
||||
Override overrideWith(
|
||||
String Function(SourceBaseUrlRef provider) create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
override: SourceBaseUrlProvider._internal(
|
||||
(ref) => create(ref as SourceBaseUrlRef),
|
||||
from: from,
|
||||
name: null,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
debugGetCreateSourceHash: null,
|
||||
source: source,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
AutoDisposeProviderElement<String> createElement() {
|
||||
return _SourceBaseUrlProviderElement(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is SourceBaseUrlProvider && other.source == source;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, source.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
|
||||
mixin SourceBaseUrlRef on AutoDisposeProviderRef<String> {
|
||||
/// The parameter `source` of this provider.
|
||||
Source get source;
|
||||
}
|
||||
|
||||
class _SourceBaseUrlProviderElement extends AutoDisposeProviderElement<String>
|
||||
with SourceBaseUrlRef {
|
||||
_SourceBaseUrlProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
Source get source => (origin as SourceBaseUrlProvider).source;
|
||||
}
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
|
||||
|
|
@ -2,17 +2,19 @@ import 'dart:convert';
|
|||
import 'dart:io';
|
||||
import 'dart:isolate';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/settings.dart';
|
||||
import 'package:mangayomi/models/video.dart';
|
||||
import 'package:mangayomi/providers/storage_provider.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:mangayomi/utils/extensions/string_extensions.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:mangayomi/ffi/torrent_server_ffi.dart' as libmtorrentserver_ffi;
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'torrent_server.g.dart';
|
||||
|
||||
class MTorrentServer {
|
||||
final http = MInterceptor.init();
|
||||
Future<bool> removeTorrent(String? inforHash) async {
|
||||
if (inforHash == null || inforHash.isEmpty) return false;
|
||||
try {
|
||||
|
|
@ -44,11 +46,11 @@ class MTorrentServer {
|
|||
try {
|
||||
final torrentByte = (await http.get(Uri.parse(url))).bodyBytes;
|
||||
var request =
|
||||
http.MultipartRequest('POST', Uri.parse('$_baseUrl/torrent/add'));
|
||||
MultipartRequest('POST', Uri.parse('$_baseUrl/torrent/add'));
|
||||
|
||||
request.files.add(http.MultipartFile.fromBytes('file', torrentByte,
|
||||
request.files.add(MultipartFile.fromBytes('file', torrentByte,
|
||||
filename: 'file.torrent'));
|
||||
http.StreamedResponse response = await request.send();
|
||||
StreamedResponse response = await request.send();
|
||||
return await response.stream.bytesToString();
|
||||
} catch (e) {
|
||||
rethrow;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import 'dart:io';
|
||||
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:mangayomi/eval/model/m_bridge.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/track.dart';
|
||||
|
|
@ -9,11 +8,13 @@ import 'dart:convert';
|
|||
import 'package:mangayomi/models/track_search.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'anilist.g.dart';
|
||||
|
||||
@riverpod
|
||||
class Anilist extends _$Anilist {
|
||||
final http = MInterceptor.init();
|
||||
final String _clientId =
|
||||
(Platform.isWindows || Platform.isLinux) ? '13587' : '13588';
|
||||
static const String _baseApiUrl = "https://graphql.anilist.co/";
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'anilist.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$anilistHash() => r'ee83d9fc6e85366bb7cbce876b0878207829a979';
|
||||
String _$anilistHash() => r'afd6de461493a0f7a658e5f9d33bffc9d51c1f6d';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import 'dart:developer';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:mangayomi/eval/model/m_bridge.dart';
|
||||
import 'package:mangayomi/models/track.dart';
|
||||
|
|
@ -8,11 +8,13 @@ import 'dart:convert';
|
|||
import 'package:mangayomi/models/track_search.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'kitsu.g.dart';
|
||||
|
||||
@riverpod
|
||||
class Kitsu extends _$Kitsu {
|
||||
final http = MInterceptor.init();
|
||||
final String _clientId =
|
||||
'dd031b32d2f56c990b1425efe6c42ad847e7fe3ab46bf1299f05ecd856bdb7dd';
|
||||
final String _clientSecret =
|
||||
|
|
@ -41,7 +43,7 @@ class Kitsu extends _$Kitsu {
|
|||
|
||||
Future<(bool, String)> login(String username, String password) async {
|
||||
try {
|
||||
final request = http.MultipartRequest('POST', Uri.parse(_loginUrl));
|
||||
final request = MultipartRequest('POST', Uri.parse(_loginUrl));
|
||||
request.fields.addAll({
|
||||
'username': username,
|
||||
'password': password,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'kitsu.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$kitsuHash() => r'425a6699eafe84e35320c9a66bce33b4ba332a52';
|
||||
String _$kitsuHash() => r'c8ceccec70441eefe0c4a94c901adaaa5009cff3';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -2,18 +2,20 @@ import 'dart:convert';
|
|||
import 'dart:io';
|
||||
import 'dart:math';
|
||||
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:mangayomi/models/track.dart';
|
||||
import 'package:mangayomi/models/track_preference.dart';
|
||||
import 'package:mangayomi/models/track_search.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/myanimelist/model.dart';
|
||||
import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart';
|
||||
import 'package:mangayomi/services/http/interceptor.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'myanimelist.g.dart';
|
||||
|
||||
@riverpod
|
||||
class MyAnimeList extends _$MyAnimeList {
|
||||
final http = MInterceptor.init();
|
||||
String baseOAuthUrl = 'https://myanimelist.net/v1/oauth2';
|
||||
String baseApiUrl = 'https://api.myanimelist.net/v2';
|
||||
String codeVerifier = "";
|
||||
|
|
@ -312,11 +314,11 @@ class MyAnimeList extends _$MyAnimeList {
|
|||
if (track.finishedReadingDate != null)
|
||||
'finish_date': _convertToIsoDate(track.finishedReadingDate)
|
||||
};
|
||||
final request = http.Request(
|
||||
final request = Request(
|
||||
'PUT', Uri.parse('$baseApiUrl/anime/${track.mediaId}/my_list_status'));
|
||||
request.bodyFields = formBody;
|
||||
request.headers.addAll({'Authorization': 'Bearer $accessToken'});
|
||||
final response = await http.Client().send(request);
|
||||
final response = await Client().send(request);
|
||||
final mJson = jsonDecode(await response.stream.bytesToString());
|
||||
return _parseAnimeItem(mJson, track);
|
||||
}
|
||||
|
|
@ -334,11 +336,11 @@ class MyAnimeList extends _$MyAnimeList {
|
|||
if (track.finishedReadingDate != null)
|
||||
'finish_date': _convertToIsoDate(track.finishedReadingDate)
|
||||
};
|
||||
final request = http.Request(
|
||||
final request = Request(
|
||||
'PUT', Uri.parse('$baseApiUrl/manga/${track.mediaId}/my_list_status'));
|
||||
request.bodyFields = formBody;
|
||||
request.headers.addAll({'Authorization': 'Bearer $accessToken'});
|
||||
final response = await http.Client().send(request);
|
||||
final response = await Client().send(request);
|
||||
final mJson = jsonDecode(await response.stream.bytesToString());
|
||||
return _parseMangaItem(mJson, track);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'myanimelist.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$myAnimeListHash() => r'bdbe57c0071039f20aa929fc9f320f130b4a4ae3';
|
||||
String _$myAnimeListHash() => r'0213cf673c21b2c164cbac3b86de196335daebf7';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -623,7 +623,7 @@ packages:
|
|||
source: hosted
|
||||
version: "0.15.4"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
dependency: "direct overridden"
|
||||
description:
|
||||
name: http
|
||||
sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
|
||||
|
|
@ -642,10 +642,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: http_interceptor
|
||||
sha256: "7fe0863f734dcc8286875d2f074f8dd91c47fef95cd219b34282d71930a4895f"
|
||||
sha256: fc7eedc62433c17612bf65237a8aa2615553cc9130f1e4d75f7e5fa364d5232e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0-beta.7"
|
||||
version: "2.0.0-beta.8"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -66,8 +66,7 @@ dependencies:
|
|||
window_manager: ^0.3.8
|
||||
ffi: ^2.1.0
|
||||
ffigen: ^11.0.0
|
||||
http_interceptor: ^2.0.0-beta.7
|
||||
http: ^1.2.0
|
||||
http_interceptor: ^2.0.0-beta.8
|
||||
flutter_windows_webview:
|
||||
git:
|
||||
url: https://github.com/wgh136/flutter_windows_webview
|
||||
|
|
|
|||
Loading…
Reference in a new issue