Merge pull request #421 from Schnitzel5/feature/custom-subtitles

added option to load own subtitles
This commit is contained in:
Moustapha Kodjo Amadou 2025-03-23 05:43:16 +01:00 committed by GitHub
commit 13fddac7bf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 53 additions and 27 deletions

View file

@ -444,5 +444,6 @@
"repo_added": "Erweiterungs-Repository hinzugefügt!", "repo_added": "Erweiterungs-Repository hinzugefügt!",
"genre_search_library": "Genre im Bibliothek suchen", "genre_search_library": "Genre im Bibliothek suchen",
"genre_search_source": "Zur Erweiterung navigieren", "genre_search_source": "Zur Erweiterung navigieren",
"source_not_added": "Die Erweiterung ist nicht installiert!" "source_not_added": "Die Erweiterung ist nicht installiert!",
"load_own_subtitles": "Deine eigene Untertiteln laden..."
} }

View file

@ -457,5 +457,6 @@
"add_repo": "Add Repository?", "add_repo": "Add Repository?",
"genre_search_library": "Search genre in library", "genre_search_library": "Search genre in library",
"genre_search_source": "Browse in source", "genre_search_source": "Browse in source",
"source_not_added": "Source is not installed!" "source_not_added": "Source is not installed!",
"load_own_subtitles": "Load your own subtitles..."
} }

View file

@ -1,10 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart' as riv; import 'package:flutter_riverpod/flutter_riverpod.dart' as riv;
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/video.dart' as vid; import 'package:mangayomi/models/video.dart' as vid;
@ -627,32 +629,54 @@ class _AnimeStreamPageState extends riv.ConsumerState<AnimeStreamPage>
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 12), padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 12),
child: Column( child: Column(
children: children: [
videoSubtitleLast.toSet().toList().map((sub) { ...videoSubtitleLast.toSet().toList().map((sub) {
final title = final title =
sub.title ?? sub.title ??
sub.subtitle?.title ?? sub.subtitle?.title ??
sub.subtitle?.language ?? sub.subtitle?.language ??
sub.subtitle?.channels ?? sub.subtitle?.channels ??
"None"; "None";
final selected = final selected =
(title == (title ==
(subtitle.title ?? (subtitle.title ??
subtitle.language ?? subtitle.language ??
subtitle.channels ?? subtitle.channels ??
"None")) || "None")) ||
(subtitle.id == "no" && title == "None"); (subtitle.id == "no" && title == "None");
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
try { try {
_player.setSubtitleTrack(sub.subtitle!); _player.setSubtitleTrack(sub.subtitle!);
} catch (_) {} } catch (_) {}
}, },
child: textWidget(title, selected), child: textWidget(title, selected),
); );
}).toList(), }),
GestureDetector(
onTap: () async {
try {
FilePickerResult? result = await FilePicker.platform.pickFiles(
allowMultiple: false,
);
if (result != null && context.mounted) {
_player.setSubtitleTrack(
SubtitleTrack.uri(result.files.first.path!),
);
}
if (!context.mounted) return;
Navigator.pop(context);
} catch (_) {
botToast("Error");
Navigator.pop(context);
}
},
child: textWidget(context.l10n.load_own_subtitles, false),
),
],
), ),
); );
} }