New source: Filma24 (SQ)

This commit is contained in:
kodjomoustapha
2023-12-25 18:14:37 +01:00
parent f08fff4aff
commit 2d293145ec
4 changed files with 309 additions and 1 deletions

View File

@@ -17,6 +17,7 @@ import 'src/id/nimegami/source.dart';
import 'src/id/oploverz/source.dart'; import 'src/id/oploverz/source.dart';
import 'src/id/otakudesu/source.dart'; import 'src/id/otakudesu/source.dart';
import 'src/it/animesaturn/source.dart'; import 'src/it/animesaturn/source.dart';
import 'src/sq/filma24/source.dart';
void main() { void main() {
List<Source> _sourcesList = [ List<Source> _sourcesList = [
@@ -34,7 +35,8 @@ void main() {
...dopeflixSourcesList, ...dopeflixSourcesList,
animesaturn, animesaturn,
uhdmoviesSource, uhdmoviesSource,
...datalifeengineSourcesList ...datalifeengineSourcesList,
filma24
]; ];
final List<Map<String, dynamic>> jsonList = final List<Map<String, dynamic>> jsonList =
_sourcesList.map((source) => source.toJson()).toList(); _sourcesList.map((source) => source.toJson()).toList();

View File

@@ -0,0 +1,290 @@
import 'package:mangayomi/bridge_lib.dart';
import 'dart:convert';
class Filma24 extends MProvider {
Filma24();
@override
Future<MPages> getPopular(MSource source, int page) async {
String pageNu = page == 1 ? "" : "/page/$page/";
final data = {"url": "${preferenceBaseUrl(source.id)}$pageNu"};
final res = await http('GET', json.encode(data));
return animeFromRes(res);
}
@override
Future<MPages> getLatestUpdates(MSource source, int page) async {
String pageNu = page == 1 ? "" : "page/$page/";
final data = {"url": "${preferenceBaseUrl(source.id)}/$pageNu?sort=trendy"};
final res = await http('GET', json.encode(data));
return animeFromRes(res);
}
@override
Future<MPages> search(
MSource source, String query, int page, FilterList filterList) async {
final filters = filterList.filters;
String url = "";
String pageNu = page == 1 ? "" : "page/$page/";
if (query.isNotEmpty) {
url += "${preferenceBaseUrl(source.id)}/search/$query/";
} else {
for (var filter in filters) {
if (filter.type == "ReleaseFilter") {
final year = filter.values[filter.state].value;
if (year.isNotEmpty) {
url = "/released-year/?release=$year/";
}
} else if (filter.type == "GenreFilter") {
final genre = filter.values[filter.state].value;
if (genre.isNotEmpty) {
url = genre;
}
}
}
url = "${preferenceBaseUrl(source.id)}$url";
}
url += pageNu;
final data = {"url": url};
final res = await http('GET', json.encode(data));
return animeFromRes(res);
}
@override
Future<MManga> getDetail(MSource source, String url) async {
List<MChapter>? episodesList = [];
if (!url.contains("seriale")) {
MChapter episode = MChapter();
episode.name = "Filma";
episode.url = url;
episodesList.add(episode);
} else {
final data = {"url": url};
final res = await http('GET', json.encode(data));
final document = parseHtml(res);
final resultElements = document.select("div.row");
for (var result in resultElements) {
final elements = result?.select("div.movie-thumb") ?? [];
for (var i = 0; i < elements.length; i++) {
MChapter ep = MChapter();
ep.name = elements[i].selectFirst("div > span").text;
ep.url = elements[i].selectFirst("a").getHref;
episodesList.add(ep);
}
}
}
MManga anime = MManga();
anime.chapters = episodesList;
return anime;
}
@override
Future<List<MVideo>> getVideoList(MSource source, String url) async {
final data = {"url": url};
final res = await http('GET', json.encode(data));
List<MVideo> videos = [];
final serverUrls = xpath(res, '//*[@class="player"]/div[1]/a/@href');
for (var serverUrl in serverUrls) {
List<MVideo> a = [];
final serVdata = {"url": "$url/$serverUrl"};
final serVres = await http('GET', json.encode(serVdata));
List<String> iframe = xpath(serVres, '//*[@id="plx"]/p/iframe/@src');
if (iframe.isNotEmpty) {
String i = iframe.first;
if (i.startsWith("//")) {
i = "https:$i";
}
if (i.contains("vidmoly")) {
a = await vidmolyExtractor(i);
} else if (i.contains("dood")) {
a = await doodExtractor(i, "DoodStream");
} else if (i.contains("oneupload")) {
a = await oneuploadExtractor(i);
} else if (i.contains("uqload")) {
a = await uqloadExtractor(i);
} else if (i.contains("voe.sx")) {
a = await voeExtractor(i, "Voe");
}
videos.addAll(a);
}
}
return videos;
}
@override
List<dynamic> getSourcePreferences(MSource source) {
return [
EditTextPreference(
key: "pref_domain",
title: "Domeni i përdorur aktualisht",
summary: "",
value: "https://www.filma24.pl",
dialogTitle: "Domeni i përdorur aktualisht",
dialogMessage: "",
text: "https://www.filma24.pl"),
];
}
String preferenceBaseUrl(int sourceId) {
return getPreferenceValue(sourceId, "pref_domain");
}
@override
List<dynamic> getFilterList(MSource source) {
return [
SelectFilter("ReleaseFilter", "Viti", 0, [
SelectFilterOption("<Select>", ""),
SelectFilterOption("2023", "2023"),
SelectFilterOption("2022", "2022"),
SelectFilterOption("2021", "2021"),
SelectFilterOption("2020", "2020"),
SelectFilterOption("2019", "2019"),
SelectFilterOption("2018", "2018"),
SelectFilterOption("2017", "2017"),
SelectFilterOption("2016", "2016"),
SelectFilterOption("2011-2015", "2011-2015"),
SelectFilterOption("2006-2010", "2006-2010"),
SelectFilterOption("2001-2005", "2001-2005"),
SelectFilterOption("1991-2000", "1991-2000"),
SelectFilterOption("1900-1990", "1900-1990"),
]),
SelectFilter("GenreFilter", "Zhanri", 0, [
SelectFilterOption("<Select>", ""),
SelectFilterOption("SË SHPEJTI", "/se-shpejti/"),
SelectFilterOption("Aksion", "/aksion/"),
SelectFilterOption("Animuar", "/animuar/"),
SelectFilterOption("Aventurë", "/aventure/"),
SelectFilterOption("Aziatik", "/aziatik/"),
SelectFilterOption("Biografi", "/biografi/"),
SelectFilterOption("Nordik", "/nordik/"),
SelectFilterOption("Dokumentar", "/dokumentar/"),
SelectFilterOption("Dramë", "/drame/"),
SelectFilterOption("Erotik +18", "/erotik/"),
SelectFilterOption("Familjar", "/familjar/"),
SelectFilterOption("Fantashkencë", "/fantashkence/"),
SelectFilterOption("Fantazi", "/fantazi/"),
SelectFilterOption("Francez", "/francez/"),
SelectFilterOption("Gjerman", "/gjerman/"),
SelectFilterOption("Hindi", "/hindi/"),
SelectFilterOption("Histori", "/histori/"),
SelectFilterOption("Horror", "/horror/"),
SelectFilterOption("Italian", "/italian/"),
SelectFilterOption("Komedi", "/komedi/"),
SelectFilterOption("Krim", "/krim/"),
SelectFilterOption("Luftë", "/lufte/"),
SelectFilterOption("Mister", "/mister/"),
SelectFilterOption("Muzikë", "/muzik/"),
SelectFilterOption("NETFLIX", "/netflix/"),
SelectFilterOption("Romancë", "/romance/"),
SelectFilterOption("Rus", "/rus/"),
SelectFilterOption("Shqiptar", "/shqiptar/"),
SelectFilterOption("Spanjoll", "/spanjoll/"),
SelectFilterOption("Sport", "/sport/"),
SelectFilterOption("Thriller", "/thriller/"),
SelectFilterOption("Turk", "/turk/"),
SelectFilterOption("Western", "/western/"),
]),
];
}
Future<List<MVideo>> vidmolyExtractor(String url) async {
final headers = {
'Referer': 'https://vidmoly.to',
};
List<MVideo> videos = [];
final playListUrlResponse = await http('GET', json.encode({"url": url}));
final playlistUrl =
RegExp(r'file:"(\S+?)"').firstMatch(playListUrlResponse)?.group(1) ??
"";
final masterPlaylistRes = await http(
'GET', json.encode({"url": playlistUrl, "headers": headers}));
if (masterPlaylistRes != "error") {
for (var it in substringAfter(masterPlaylistRes, "#EXT-X-STREAM-INF:")
.split("#EXT-X-STREAM-INF:")) {
final quality =
"${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p";
String videoUrl = substringBefore(substringAfter(it, "\n"), "\n");
MVideo video = MVideo();
video
..url = videoUrl
..originalUrl = videoUrl
..quality = "Vidmoly $quality"
..headers = headers;
videos.add(video);
}
}
return videos;
}
Future<List<MVideo>> oneuploadExtractor(String url) async {
List<MVideo> videos = [];
final playListUrlResponse = await http('GET', json.encode({"url": url}));
final playlistUrl =
RegExp(r'file:"(\S+?)"').firstMatch(playListUrlResponse)?.group(1) ??
"";
final masterPlaylistRes =
await http('GET', json.encode({"url": playlistUrl}));
for (var it in substringAfter(masterPlaylistRes, "#EXT-X-STREAM-INF:")
.split("#EXT-X-STREAM-INF:")) {
final quality =
"${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p";
String videoUrl = substringBefore(substringAfter(it, "\n"), "\n");
MVideo video = MVideo();
video
..url = videoUrl
..originalUrl = videoUrl
..quality = "OneUploader $quality";
videos.add(video);
}
return videos;
}
Future<List<MVideo>> uqloadExtractor(String url) async {
final res = await http('GET', json.encode({"url": url}));
final js = xpath(res, '//script[contains(text(), "sources:")]/text()');
if (js.isEmpty) {
return [];
}
final videoUrl =
substringBefore(substringAfter(js.first, "sources: [\""), '"');
MVideo video = MVideo();
video
..url = videoUrl
..originalUrl = videoUrl
..quality = "Uqload"
..headers = {"Referer": "${Uri.parse(url).origin}/"};
return [video];
}
MPages animeFromRes(String res) {
final document = parseHtml(res);
final result = document.selectFirst("div.row");
final elements = result?.select("div.movie-thumb") ?? [];
List<MManga> mangaList = [];
for (var i = 0; i < elements.length; i++) {
MManga manga = MManga();
manga.name = elements[i].selectFirst("div > a > h4").text;
manga.imageUrl = elements[i].selectFirst("a").getSrc;
manga.link = elements[i].selectFirst("a").getHref;
mangaList.add(manga);
}
return MPages(mangaList,
document.selectFirst("div > a.nextpostslink")?.attr("href") != null);
}
}
Filma24 main() {
return Filma24();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@@ -0,0 +1,16 @@
import '../../../../model/source.dart';
Source get filma24 => _filma24;
const _filma24Version = "0.0.1";
const _filma24CodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/sq/filma24/filma24.dart";
Source _filma24 = Source(
name: "Filma24",
baseUrl: "https://www.filma24.pl",
lang: "sq",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/sq/filma24/icon.png",
sourceCodeUrl: _filma24CodeUrl,
version: _filma24Version,
isManga: false);