Finish basic functionality
This commit is contained in:
@@ -1,10 +1,16 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:k3vinb5_aniyomi_bridge/aniyomi_bridge.dart';
|
import 'package:k3vinb5_aniyomi_bridge/aniyomi_bridge.dart';
|
||||||
|
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
AniyomiBridge bridge = AniyomiBridge();
|
AniyomiBridge bridge = AniyomiBridge();
|
||||||
bridge.initJvm();
|
await bridge.initJvm();
|
||||||
|
bridge.loadExtension("https://kohiden.xyz/Kohi-den/extensions/raw/branch/main/apk/aniyomi-all.animeonsen-v14.7.apk");
|
||||||
|
List<JSAnime> animes = bridge.getSearchResults("Shingeki", 1, "animeonsen");
|
||||||
|
print(animes);
|
||||||
|
animes.forEach((anime) => print(anime.getTitle().toDartString()));
|
||||||
|
|
||||||
runApp(const SizedBox());
|
runApp(const SizedBox());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,6 @@
|
|||||||
# Generated by pub
|
# Generated by pub
|
||||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||||
packages:
|
packages:
|
||||||
archive:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: archive
|
|
||||||
sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "4.0.7"
|
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -65,14 +57,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.19.1"
|
version: "1.19.1"
|
||||||
crypto:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: crypto
|
|
||||||
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.0.6"
|
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -306,14 +290,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.8"
|
version: "2.1.8"
|
||||||
posix:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: posix
|
|
||||||
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "6.0.3"
|
|
||||||
pub_semver:
|
pub_semver:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
9
jnigen/sepisode.yaml
Normal file
9
jnigen/sepisode.yaml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
output:
|
||||||
|
dart:
|
||||||
|
path: ../lib/jmodels/jsepisode.dart
|
||||||
|
structure: single_file
|
||||||
|
|
||||||
|
class_path:
|
||||||
|
- '../assets/aniyomibridge-core.jar'
|
||||||
|
classes:
|
||||||
|
- 'eu.kanade.tachiyomi.animesource.model.SEpisode'
|
||||||
9
jnigen/video.yaml
Normal file
9
jnigen/video.yaml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
output:
|
||||||
|
dart:
|
||||||
|
path: ../lib/jmodels/jvideo.dart
|
||||||
|
structure: single_file
|
||||||
|
|
||||||
|
class_path:
|
||||||
|
- '../assets/aniyomibridge-core.jar'
|
||||||
|
classes:
|
||||||
|
- 'eu.kanade.tachiyomi.animesource.model.Video'
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:k3vinb5_aniyomi_bridge/jmodels/jvideo.dart';
|
||||||
import 'package:flutter/services.dart' show rootBundle;
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
import 'package:jni/jni.dart';
|
import 'package:jni/jni.dart';
|
||||||
import 'package:k3vinb5_aniyomi_bridge/jmodels/janiyomibridge.dart';
|
import 'package:k3vinb5_aniyomi_bridge/jmodels/janiyomibridge.dart';
|
||||||
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart';
|
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart';
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsepisode.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
import 'package:archive/archive.dart';
|
|
||||||
|
|
||||||
class AniyomiBridge {
|
class AniyomiBridge {
|
||||||
|
|
||||||
static final _aniyomiBridgeDir = "aniyomibridge";
|
static final _aniyomiBridgeDir = "aniyomibridge";
|
||||||
static final _packageAssetsDir = "packages/k3vinb5_aniyomi_bridge/assets";
|
static final _packageAssetsDir = "packages/k3vinb5_aniyomi_bridge/assets";
|
||||||
|
static late final JAniyomiBridge _jAniyomiBridge;
|
||||||
|
|
||||||
Future<void> initJvm() async{
|
Future<void> initJvm() async {
|
||||||
Directory supportDirectory = await getApplicationSupportDirectory();
|
Directory supportDirectory = await getApplicationSupportDirectory();
|
||||||
await _loadJarIfNeeded(supportDirectory);
|
await _loadJarIfNeeded(supportDirectory);
|
||||||
Jni.spawn(
|
Jni.spawn(
|
||||||
@@ -22,18 +22,47 @@ class AniyomiBridge {
|
|||||||
classPath: _getClassPath(supportDirectory),
|
classPath: _getClassPath(supportDirectory),
|
||||||
);
|
);
|
||||||
JAniyomiBridge.init();
|
JAniyomiBridge.init();
|
||||||
JAniyomiBridge jAniyomiBridge = JAniyomiBridge();
|
_jAniyomiBridge = JAniyomiBridge();
|
||||||
jAniyomiBridge.loadExtension(JString.fromString("https://kohiden.xyz/Kohi-den/extensions/raw/branch/main/apk/aniyomi-en.allanime-v14.37.apk"));
|
|
||||||
JList<JObject?>? searchResults = jAniyomiBridge.getSearchResults(JString.fromString("Naruto"), 1, JString.fromString("allanime"));
|
|
||||||
print("Search results size: ${searchResults?.length}");
|
|
||||||
if (searchResults != null) {
|
|
||||||
for (JObject obj in searchResults.cast()) {
|
|
||||||
JSAnime jsAnime = obj.as<JSAnime>(JSAnime.type);
|
|
||||||
print(jsAnime.getTitle().toDartString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<JSAnime> getSearchResults(String query, int page, String source) {
|
||||||
|
JList<JObject?>? searchResults = _jAniyomiBridge.getSearchResults(JString.fromString(query), page, JString.fromString(source));
|
||||||
|
if (searchResults == null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return searchResults.cast<JObject?>().where(_jObjIsNotNull).map((jObj) => jObj!.as<JSAnime>(JSAnime.type)).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<JSEpisode> getEpisodeList(JSAnime sAnime, String source) {
|
||||||
|
JList<JObject?>? episodeList = _jAniyomiBridge.getEpisodeList(sAnime, JString.fromString(source));
|
||||||
|
if (episodeList == null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return episodeList.cast<JObject?>().where(_jObjIsNotNull).map((jObj) => jObj!.as<JSEpisode>(JSEpisode.type)).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<JVideo> getVideoList(JSEpisode sEpisode, String source) {
|
||||||
|
JList<JObject?>? videoList = _jAniyomiBridge.getVideoList(sEpisode, JString.fromString(source));
|
||||||
|
if (videoList == null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return videoList.cast<JObject?>().where(_jObjIsNotNull).map((jObj) => jObj!.as<JVideo>(JVideo.type)).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadExtension(String extensionUrl) {
|
||||||
|
_jAniyomiBridge.loadExtension(JString.fromString(extensionUrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String>? getLoadedExtensions() {
|
||||||
|
JList<JString?>? loadedExtensions = _jAniyomiBridge.getLoadedExtensions();
|
||||||
|
if (loadedExtensions == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return loadedExtensions.cast<JString>().map((jStr) => jStr.toDartString()).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Function(JObject? jObj) get _jObjIsNotNull => (jObj) => jObj != null;
|
||||||
|
|
||||||
String _getDylibDir(Directory supportDirectory) {
|
String _getDylibDir(Directory supportDirectory) {
|
||||||
String executablePath = File(Platform.resolvedExecutable).parent.path;
|
String executablePath = File(Platform.resolvedExecutable).parent.path;
|
||||||
if (Platform.isLinux) {
|
if (Platform.isLinux) {
|
||||||
@@ -56,11 +85,11 @@ class AniyomiBridge {
|
|||||||
File aniyomiBridgeCore = File(aniyomiBridgeCorePath);
|
File aniyomiBridgeCore = File(aniyomiBridgeCorePath);
|
||||||
if (!(await aniyomiBridgeCore.exists())) {
|
if (!(await aniyomiBridgeCore.exists())) {
|
||||||
print("Copying aniyomibridge-core.jar to $aniyomiBridgeCorePath");
|
print("Copying aniyomibridge-core.jar to $aniyomiBridgeCorePath");
|
||||||
copyAssetToFile("$_packageAssetsDir/aniyomibridge-core.jar", aniyomiBridgeCorePath);
|
_copyAssetToFile("$_packageAssetsDir/aniyomibridge-core.jar", aniyomiBridgeCorePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<File> copyAssetToFile(String assetPath, String outPath) async {
|
Future<File> _copyAssetToFile(String assetPath, String outPath) async {
|
||||||
final byteData = await rootBundle.load(assetPath);
|
final byteData = await rootBundle.load(assetPath);
|
||||||
final buffer = byteData.buffer.asUint8List();
|
final buffer = byteData.buffer.asUint8List();
|
||||||
final file = File(outPath);
|
final file = File(outPath);
|
||||||
|
|||||||
1005
lib/jmodels/jsepisode.dart
Normal file
1005
lib/jmodels/jsepisode.dart
Normal file
File diff suppressed because it is too large
Load Diff
2222
lib/jmodels/jvideo.dart
Normal file
2222
lib/jmodels/jvideo.dart
Normal file
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,6 @@ environment:
|
|||||||
flutter: ">=1.17.0"
|
flutter: ">=1.17.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
archive: ^4.0.7
|
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
jni: ^0.14.2
|
jni: ^0.14.2
|
||||||
|
|||||||
Reference in New Issue
Block a user