Finish basic functionality

This commit is contained in:
Kevin Rodrigues Borges
2025-09-16 06:02:41 +01:00
parent 1ab7722459
commit 9152a4dad9
8 changed files with 3300 additions and 45 deletions

View File

@@ -1,10 +1,16 @@
import 'package:flutter/material.dart';
import 'package:k3vinb5_aniyomi_bridge/aniyomi_bridge.dart';
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
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());
}

View File

@@ -1,14 +1,6 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd"
url: "https://pub.dev"
source: hosted
version: "4.0.7"
args:
dependency: transitive
description:
@@ -65,14 +57,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.19.1"
crypto:
dependency: transitive
description:
name: crypto
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
cupertino_icons:
dependency: "direct main"
description:
@@ -306,14 +290,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.8"
posix:
dependency: transitive
description:
name: posix
sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
url: "https://pub.dev"
source: hosted
version: "6.0.3"
pub_semver:
dependency: transitive
description:

9
jnigen/sepisode.yaml Normal file
View 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
View 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'

View File

@@ -1,20 +1,20 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter/services.dart';
import 'package:k3vinb5_aniyomi_bridge/jmodels/jvideo.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;
import 'package:jni/jni.dart';
import 'package:k3vinb5_aniyomi_bridge/jmodels/janiyomibridge.dart';
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsanime.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:archive/archive.dart';
import 'package:k3vinb5_aniyomi_bridge/jmodels/jsepisode.dart';
class AniyomiBridge {
static final _aniyomiBridgeDir = "aniyomibridge";
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();
await _loadJarIfNeeded(supportDirectory);
Jni.spawn(
@@ -22,18 +22,47 @@ class AniyomiBridge {
classPath: _getClassPath(supportDirectory),
);
JAniyomiBridge.init();
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());
}
}
_jAniyomiBridge = JAniyomiBridge();
}
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 executablePath = File(Platform.resolvedExecutable).parent.path;
if (Platform.isLinux) {
@@ -56,11 +85,11 @@ class AniyomiBridge {
File aniyomiBridgeCore = File(aniyomiBridgeCorePath);
if (!(await aniyomiBridgeCore.exists())) {
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 buffer = byteData.buffer.asUint8List();
final file = File(outPath);

1005
lib/jmodels/jsepisode.dart Normal file

File diff suppressed because it is too large Load Diff

2222
lib/jmodels/jvideo.dart Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,6 @@ environment:
flutter: ">=1.17.0"
dependencies:
archive: ^4.0.7
flutter:
sdk: flutter
jni: ^0.14.2