Merge pull request #288 from Yogesh-S-09/main

Server Problem Fixed
This commit is contained in:
Moustapha Kodjo Amadou
2025-06-17 07:45:44 +01:00
committed by GitHub
2 changed files with 129 additions and 61 deletions

View File

@@ -104,21 +104,33 @@ class DonghuaStream extends MProvider {
@override @override
Future<List<MVideo>> getVideoList(String url) async { Future<List<MVideo>> getVideoList(String url) async {
final res = (await client.get(Uri.parse(url))).body; final res = (await client.get(Uri.parse(url))).body;
final servers = parseHtml(res).select('select.mirror > option[data-index]'); var servers = parseHtml(res).select('select.mirror > option[data-index]');
if(servers.length==0){
final src_data = parseHtml(res).selectFirst('article[id] > script').attr('src').replaceAll ('data:text/javascript;base64,','');
final src_function = utf8.decode(base64Url.decode(src_data));
final html_data = RegExp(r'"html":"(.*?)","autoplayIndex"').firstMatch(src_function).group(1);
servers = parseHtml(html_data.replaceAll(r'\t', '\t').replaceAll(r'\n', '\n').replaceAll(r'\"', '"').replaceAll(r'\/', '/')).select('select.mirror > option[data-index]');
}
List<MVideo> videos = []; List<MVideo> videos = [];
for (var i = 0; i < servers.length; i++) { for (var i = 0; i < servers.length; i++) {
String name = '${servers[i].attr("data-index")}: ${servers[i].text}'; String name = '${servers[i].attr("data-index")}: ${servers[i].text}';
String valueHtml = utf8.decode(base64Url.decode(servers[i].attr('value'))); String valueHtml = utf8.decode(base64Url.decode(servers[i].attr('value')));
String serverUrl = xpath(valueHtml,'//iframe/@src')[0]; final serverUrlList = xpath(valueHtml,'//iframe/@src');
if(serverUrl.startsWith('https://geo.dailymotion.com/player')){ if (serverUrlList.length>0){
String videoId = RegExp(r'[?&]video=([a-zA-Z0-9]+)').firstMatch(serverUrl).group(1)!; String serverUrl = serverUrlList[0];
return dailymotionUrlFetcher(videoId,name); if(serverUrl.contains('https://geo.dailymotion.com/player')){
String videoId = RegExp(r'[?&]video=([a-zA-Z0-9]+)').firstMatch(serverUrl).group(1);
videos.addAll(await dailymotionVideosFetcher(videoId,name));
}else if(serverUrl.contains('//play.streamplay.co.in/')){
String videoId = serverUrl.split('/embed/')[1];
videos.addAll(await streamplayVideosFetcher(videoId,name));
}
} }
} }
return videos; return videos;
} }
Future<List<MVideo>> dailymotionUrlFetcher(String videoID, String name) async { Future<List<MVideo>> dailymotionVideosFetcher(String videoID, String name) async {
String metaDataUrl = 'https://www.dailymotion.com/player/metadata/video/$videoID'; String metaDataUrl = 'https://www.dailymotion.com/player/metadata/video/$videoID';
final res = (await client.get(Uri.parse(metaDataUrl))).body; final res = (await client.get(Uri.parse(metaDataUrl))).body;
final jsonRes = json.decode(res); final jsonRes = json.decode(res);
@@ -126,17 +138,72 @@ class DonghuaStream extends MProvider {
return m3u8extractor(masterUrl, name); return m3u8extractor(masterUrl, name);
} }
Future<List<MVideo>> streamplayVideosFetcher(String videoID, String name) async {
String url = 'https://play.streamplay.co.in/embed/'+videoID;
final res = (await client.get(Uri.parse(url))).body;
final match = RegExp(r"eval\(function\(p,a,c,k,e,d\)\{[\s\S]*?\}\((.*?)\)").firstMatch(res);
if (match == null) {
return [];
}
final argsStr = match.group(1);
final argsPattern = RegExp(r"'(.*?)',(.*?),(.*?),'(.*?)'\.split");
final argsMatches = argsPattern.firstMatch(argsStr);
final arg_p = argsMatches.group(1);
final arg_a =int.parse(argsMatches.group(2));
final arg_c =int.parse(argsMatches.group(3));
final arg_k =argsMatches.group(4).split('|').toList();
final unpacked_js = unpack(arg_p,arg_a,arg_c,arg_k);
final kakenMatch = RegExp(r'window\.kaken\s*=\s*"([^"]+)"').firstMatch(unpacked_js);
if (kakenMatch == null) {
return [];
}
final kakenValue = kakenMatch.group(1);
final apiUrl = 'https://play.streamplay.co.in/api/?$kakenValue';
final apiRes = (await client.get(Uri.parse(apiUrl))).body;
final jsonRes = json.decode(apiRes);
String masterUrl = jsonRes['sources'][0]['file'];
List<MTrack> subtitles = [];
for (final track in jsonRes['tracks']){
MTrack subtitle = MTrack();
subtitle.label = name + ' - ' + track['label'];
subtitle.file = track['file'];
subtitles.add(subtitle);
}
List<MVideo> videos = await m3u8extractor(masterUrl, name);
if(videos.length>0){
videos[0].subtitles = subtitles;
}
return videos;
}
String unpack(String p, int a, int c, List<String> k) {
for (int i = c - 1; i >= 0; i--) {
String word = (i < k.length) ? k[i] : baseN(i, a);
String pattern = r'\b' + baseN(i, a) + r'\b';
p = p.replaceAll(RegExp(pattern), word);
}
return p;
}
String baseN(int num, int base) {
const digits = '0123456789abcdefghijklmnopqrstuvwxyz';
if (num == 0) return '0';
String result = '';
while (num > 0) {
result = digits[num % base] + result;
num ~/= base;
}
return result;
}
Future<List<MVideo>> m3u8extractor(String masterUrl, String name) async { Future<List<MVideo>> m3u8extractor(String masterUrl, String name) async {
List<MVideo> videos = []; List<MVideo> videos = [];
List<MTrack> subtitles = []; List<MTrack> subtitles = [];
final masterPlaylistRes = final masterPlaylistRes = (await client.get(Uri.parse(masterUrl), headers: headers)).body;
(await client.get(Uri.parse(masterUrl), headers: headers)).body;
// Parse Subtitles
final subtitleRegExp = RegExp(r'#EXT-X-MEDIA:TYPE=SUBTITLES.*?NAME="(.*?)".*?URI="(.*?)"', dotAll: true); final subtitleRegExp = RegExp(r'#EXT-X-MEDIA:TYPE=SUBTITLES.*?NAME="(.*?)".*?URI="(.*?)"', dotAll: true);
for (final match in subtitleRegExp.allMatches(masterPlaylistRes)) { for (final match in subtitleRegExp.allMatches(masterPlaylistRes)) {
MTrack subtitle = MTrack(); MTrack subtitle = MTrack();
subtitle.label = match.group(1) ?? 'Subtitle'; subtitle.label = name + ' - ' + match.group(1) ?? 'Subtitle';
subtitle.file = match.group(2) ?? ''; subtitle.file = match.group(2) ?? '';
subtitles.add(subtitle); subtitles.add(subtitle);
} }
@@ -159,11 +226,12 @@ class DonghuaStream extends MProvider {
video video
..url = videoUrl ..url = videoUrl
..originalUrl = videoUrl ..originalUrl = videoUrl
..quality = "$name - $quality" ..quality = "$name - $quality";
..subtitles = subtitles
..headers = headers;
videos.add(video); videos.add(video);
} }
if(videos.length>0){
videos[0].subtitles = subtitles;
}
return videos; return videos;
} }
} }

View File

@@ -1,7 +1,7 @@
import '../../../../../model/source.dart'; import '../../../../../model/source.dart';
Source get donghuastreamSource => _donghuastreamSource; Source get donghuastreamSource => _donghuastreamSource;
const _donghuastreamVersion = "0.0.1"; const _donghuastreamVersion = "0.0.2";
const _donghuastreamSourceCodeUrl = const _donghuastreamSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/donghuastream/donghuastream.dart"; "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/donghuastream/donghuastream.dart";
Source _donghuastreamSource = Source( Source _donghuastreamSource = Source(