diff --git a/README.md b/README.md
index 270b042..200f8c5 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ In short: no commercial use and transparency is required.
🚫 CAUTION
-
Do not pay to use these modules — if someone is charging you, it's a scam.
+
Do not pay to use these modules — if someone is charging you, it's a scam!
Neither should you bear watching ads to use these modules. Please report apps that do this forcibly!
diff --git a/onetouch/onetouch.js b/onetouch/onetouch.js
new file mode 100644
index 0000000..ebefa62
--- /dev/null
+++ b/onetouch/onetouch.js
@@ -0,0 +1,128 @@
+async function searchResults(keyword) {
+ const results = [];
+ try {
+ const response = await fetchv2("https://api3.devcorp.me/vod/search?page=1&keyword=" + encodeURIComponent(keyword.toLowerCase()));
+ const encrypted = await response.text();
+
+ const headers = { "Content-Type": "application/json" };
+ const postData = JSON.stringify({ text: encrypted });
+
+ const decryptedResponse = await fetchv2("https://enc-dec.app/api/dec-onetouchtv", headers, "POST", postData);
+ const decryptedData = await decryptedResponse.json();
+ console.log(JSON.stringify(decryptedData));
+ if (decryptedData.status === 200 && Array.isArray(decryptedData.result)) {
+ for (const item of decryptedData.result) {
+ results.push({
+ title: item.title || "Unknown",
+ image: item.image || "",
+ href: item.id
+ });
+ }
+ }
+ console.log(results);
+ return JSON.stringify(results);
+ } catch (err) {
+ console.error(err);
+ return JSON.stringify([{ title: "Error", image: "Error", href: "Error" }]);
+ }
+}
+
+async function extractDetails(ID) {
+ try {
+ const response = await fetchv2("https://api3.devcorp.me/web/vod/" + ID + "/detail");
+ const encrypted = await response.text();
+
+ const headers = { "Content-Type": "application/json" };
+ const postData = JSON.stringify({ text: encrypted });
+
+ const decryptedResponse = await fetchv2("https://enc-dec.app/api/dec-onetouchtv", headers, "POST", postData);
+ const decryptedText = await decryptedResponse.text();
+ const decryptedData = JSON.parse(decryptedText);
+
+ const result = decryptedData.result;
+
+ return JSON.stringify([{
+ description: result.description || "N/A",
+ aliases: Array.isArray(result.otherTitles) ? result.otherTitles.join(", ") : "N/A",
+ airdate: result.year || "N/A"
+ }]);
+ } catch (err) {
+ return JSON.stringify([{
+ description: "Error",
+ aliases: "Error",
+ airdate: "Error"
+ }]);
+ }
+}
+
+async function extractEpisodes(ID) {
+ const results = [];
+ try {
+ const response = await fetchv2("https://api3.devcorp.me/web/vod/" + ID + "/detail");
+ const encrypted = await response.text();
+
+ const headers = { "Content-Type": "application/json" };
+ const postData = JSON.stringify({ text: encrypted });
+
+ const decryptedResponse = await fetchv2("https://enc-dec.app/api/dec-onetouchtv", headers, "POST", postData);
+ const decryptedText = await decryptedResponse.text();
+ const decryptedData = JSON.parse(decryptedText);
+
+ const episodes = decryptedData.result.episodes || [];
+
+ for (const ep of episodes) {
+ results.push({
+ href: ep.id,
+ number: parseInt(ep.episode, 10)
+ });
+ }
+
+ return JSON.stringify(results.reverse());
+ } catch (err) {
+ return JSON.stringify([{ href: "Error", number: "Error" }]);
+ }
+}
+
+async function extractStreamUrl(href) {
+ try {
+ const parts = href.split("-episode-");
+ const id = parts[0];
+ const episodeNumber = parts[1];
+
+ const response = await fetchv2("https://api3.devcorp.me/web/vod/" + id + "/episode/" + episodeNumber);
+ const encrypted = await response.text();
+
+ const headers = { "Content-Type": "application/json" };
+ const postData = JSON.stringify({ text: encrypted });
+
+ const decryptedResponse = await fetchv2("https://enc-dec.app/api/dec-onetouchtv", headers, "POST", postData);
+ const decryptedText = await decryptedResponse.text();
+ const decryptedData = JSON.parse(decryptedText);
+
+ const sources = decryptedData.result.sources;
+ const tracks = decryptedData.result.track;
+
+ const stream = sources.find(s => s.url.includes(".mp4") || s.url.includes(".m3u8"));
+ const subtitle = tracks.find(t => t.name && t.name.toLowerCase().includes("english"));
+
+ return JSON.stringify({
+ streams: [{
+ title: "Default",
+ streamUrl: stream ? stream.url : "https://error.org/",
+ headers: stream ? stream.headers : {}
+ }],
+ subtitle: subtitle ? subtitle.file : null
+ });
+ } catch (err) {
+ return JSON.stringify({
+ streams: [{
+ title: "Error",
+ streamUrl: "https://error.org/",
+ headers: {}
+ }],
+ subtitle: null
+ });
+ }
+}
+
+
diff --git a/onetouch/onetouch.json b/onetouch/onetouch.json
new file mode 100644
index 0000000..59c1229
--- /dev/null
+++ b/onetouch/onetouch.json
@@ -0,0 +1,19 @@
+{
+ "sourceName": "OneTouch TV",
+ "iconUrl": "https://onetouchtv.xyz/favicon.png",
+ "author": {
+ "name": "50/50",
+ "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s"
+ },
+ "version": "1.0.0",
+ "language": "English",
+ "streamType": "HLS",
+ "quality": "1080p",
+ "baseUrl": "https://s1.devcorp.me/",
+ "searchBaseUrl": "https://s1.devcorp.me/",
+ "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/onetouch/onetouch.js",
+ "type": "shows/movies/anime",
+ "asyncJS": true,
+ "softsub": true,
+ "downloadSupport": false
+}
diff --git a/smashystream/smashystream.js b/smashystream/smashystream.js
new file mode 100644
index 0000000..0515f88
--- /dev/null
+++ b/smashystream/smashystream.js
@@ -0,0 +1,320 @@
+//Thanks ibro for the TMDB search!
+
+async function searchResults(keyword) {
+ try {
+ let transformedResults = [];
+
+ const keywordGroups = {
+ trending: ["!trending", "!hot", "!tr", "!!"],
+ topRatedMovie: ["!top-rated-movie", "!topmovie", "!tm", "??"],
+ topRatedTV: ["!top-rated-tv", "!toptv", "!tt", "::"],
+ popularMovie: ["!popular-movie", "!popmovie", "!pm", ";;"],
+ popularTV: ["!popular-tv", "!poptv", "!pt", "++"],
+ };
+
+ const skipTitleFilter = Object.values(keywordGroups).flat();
+
+ const shouldFilter = !matchesKeyword(keyword, skipTitleFilter);
+
+ // --- TMDB Section ---
+ const encodedKeyword = encodeURIComponent(keyword);
+ let baseUrl = null;
+
+ if (matchesKeyword(keyword, keywordGroups.trending)) {
+ baseUrl = `https://api.themoviedb.org/3/trending/all/week?api_key=9801b6b0548ad57581d111ea690c85c8&include_adult=false&page=`;
+ } else if (matchesKeyword(keyword, keywordGroups.topRatedMovie)) {
+ baseUrl = `https://api.themoviedb.org/3/movie/top_rated?api_key=9801b6b0548ad57581d111ea690c85c8&include_adult=false&page=`;
+ } else if (matchesKeyword(keyword, keywordGroups.topRatedTV)) {
+ baseUrl = `https://api.themoviedb.org/3/tv/top_rated?api_key=9801b6b0548ad57581d111ea690c85c8&include_adult=false&page=`;
+ } else if (matchesKeyword(keyword, keywordGroups.popularMovie)) {
+ baseUrl = `https://api.themoviedb.org/3/movie/popular?api_key=9801b6b0548ad57581d111ea690c85c8&include_adult=false&page=`;
+ } else if (matchesKeyword(keyword, keywordGroups.popularTV)) {
+ baseUrl = `https://api.themoviedb.org/3/tv/popular?api_key=9801b6b0548ad57581d111ea690c85c8&include_adult=false&page=`;
+ } else {
+ baseUrl = `https://api.themoviedb.org/3/search/multi?api_key=9801b6b0548ad57581d111ea690c85c8&query=${encodedKeyword}&include_adult=false&page=`;
+ }
+
+ let dataResults = [];
+
+ if (baseUrl) {
+ const pagePromises = Array.from({ length: 5 }, (_, i) =>
+ soraFetch(baseUrl + (i + 1)).then(r => r.json())
+ );
+ const pages = await Promise.all(pagePromises);
+ dataResults = pages.flatMap(p => p.results || []);
+ }
+
+ if (dataResults.length > 0) {
+ transformedResults = transformedResults.concat(
+ dataResults
+ .map(result => {
+ if (result.media_type === "movie" || result.title) {
+ return {
+ title: result.title || result.name || result.original_title || result.original_name || "Untitled",
+ image: result.poster_path ? `https://image.tmdb.org/t/p/w500${result.poster_path}` : "",
+ href: `movie/${result.id}`,
+ };
+ } else if (result.media_type === "tv" || result.name) {
+ return {
+ title: result.name || result.title || result.original_name || result.original_title || "Untitled",
+ image: result.poster_path ? `https://image.tmdb.org/t/p/w500${result.poster_path}` : "",
+ href: `tv/${result.id}/1/1`,
+ };
+ }
+ })
+ .filter(Boolean)
+ .filter(result => result.title !== "Overflow")
+ .filter(result => result.title !== "My Marriage Partner Is My Student, a Cocky Troublemaker")
+ .filter(r => !shouldFilter || r.title.toLowerCase().includes(keyword.toLowerCase()))
+ );
+ }
+
+ console.log("Transformed Results: " + JSON.stringify(transformedResults));
+ return JSON.stringify(transformedResults);
+ } catch (error) {
+ console.log("Fetch error in searchResults: " + error);
+ return JSON.stringify([{ title: "Error", image: "", href: "" }]);
+ }
+}
+
+function matchesKeyword(keyword, commands) {
+ const lower = keyword.toLowerCase();
+ return commands.some(cmd => lower.startsWith(cmd.toLowerCase()));
+}
+
+async function extractDetails(url) {
+ try {
+ if(url.includes('movie')) {
+ const match = url.match(/movie\/([^\/]+)/);
+ if (!match) throw new Error("Invalid URL format");
+
+ const movieId = match[1];
+ const responseText = await soraFetch(`https://api.themoviedb.org/3/movie/${movieId}?api_key=ad301b7cc82ffe19273e55e4d4206885`);
+ const data = await responseText.json();
+
+ const transformedResults = [{
+ description: data.overview || 'No description available',
+ aliases: `Duration: ${data.runtime ? data.runtime + " minutes" : 'Unknown'}`,
+ airdate: `Released: ${data.release_date ? data.release_date : 'Unknown'}`
+ }];
+
+ return JSON.stringify(transformedResults);
+ } else if(url.includes('tv')) {
+ const match = url.match(/tv\/([^\/]+)/);
+ if (!match) throw new Error("Invalid URL format");
+
+ const showId = match[1];
+ const responseText = await soraFetch(`https://api.themoviedb.org/3/tv/${showId}?api_key=ad301b7cc82ffe19273e55e4d4206885`);
+ const data = await responseText.json();
+
+ const transformedResults = [{
+ description: data.overview || 'No description available',
+ aliases: `Duration: ${data.episode_run_time && data.episode_run_time.length ? data.episode_run_time.join(', ') + " minutes" : 'Unknown'}`,
+ airdate: `Aired: ${data.first_air_date ? data.first_air_date : 'Unknown'}`
+ }];
+
+ console.log(JSON.stringify(transformedResults));
+ return JSON.stringify(transformedResults);
+ } else {
+ throw new Error("Invalid URL format");
+ }
+ } catch (error) {
+ console.log('Details error: ' + error);
+ return JSON.stringify([{
+ description: 'Error loading description',
+ aliases: 'Duration: Unknown',
+ airdate: 'Aired/Released: Unknown'
+ }]);
+ }
+}
+
+async function extractEpisodes(url) {
+ try {
+ if(url.includes('movie')) {
+ const match = url.match(/movie\/([^\/]+)/);
+
+ if (!match) throw new Error("Invalid URL format");
+
+ const movieId = match[1];
+
+ const movie = [
+ { href: `/movie/${movieId}`, number: 1, title: "Full Movie" }
+ ];
+
+ console.log(movie);
+ return JSON.stringify(movie);
+ } else if(url.includes('tv')) {
+ const match = url.match(/tv\/([^\/]+)\/([^\/]+)\/([^\/]+)/);
+
+ if (!match) throw new Error("Invalid URL format");
+
+ const showId = match[1];
+
+ const showResponseText = await soraFetch(`https://api.themoviedb.org/3/tv/${showId}?api_key=ad301b7cc82ffe19273e55e4d4206885`);
+ const showData = await showResponseText.json();
+
+ let allEpisodes = [];
+ for (const season of showData.seasons) {
+ const seasonNumber = season.season_number;
+
+ if(seasonNumber === 0) continue;
+
+ const seasonResponseText = await soraFetch(`https://api.themoviedb.org/3/tv/${showId}/season/${seasonNumber}?api_key=ad301b7cc82ffe19273e55e4d4206885`);
+ const seasonData = await seasonResponseText.json();
+
+ if (seasonData.episodes && seasonData.episodes.length) {
+ const episodes = seasonData.episodes.map(episode => ({
+ href: `/tv/${showId}/${seasonNumber}/${episode.episode_number}`,
+ number: episode.episode_number,
+ title: episode.name || ""
+ }));
+ allEpisodes = allEpisodes.concat(episodes);
+ }
+ }
+
+ console.log(allEpisodes);
+ return JSON.stringify(allEpisodes);
+ } else {
+ throw new Error("Invalid URL format");
+ }
+ } catch (error) {
+ console.log('Fetch error in extractEpisodes: ' + error);
+ return JSON.stringify([]);
+ }
+}
+
+async function extractStreamUrl(ID) {
+ if (ID.includes('movie')) {
+ const tmdbID = ID.replace('/movie/', '');
+ const headersOne = {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiI2NTQ0MWU0MTg4NjhhMWI0NDZiM2I0Mzg1MmE4OWQ2NyIsIm5iZiI6MTYzMDg4NDI0My40NzMsInN1YiI6IjYxMzU1MTkzZmQ0YTk2MDA0NDVkMTJjNiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.Hm0W-hUx-7ph-ASvk2TpMxZbMtwVa5DEXWcgNgcqXJM",
+ "Referer": "https://player.smashystream.com/",
+ "Origin": "https://player.smashystream.com",
+ "X-Requested-With": "XMLHttpRequest",
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"
+ };
+ const tmdbResponse = await fetchv2(`https://api.themoviedb.org/3/movie/${tmdbID}?append_to_response=external_ids`, headersOne);
+ const tmdbData = await tmdbResponse.json();
+ console.log(JSON.stringify(tmdbData));
+ const imdbID = tmdbData.imdb_id;
+ const tokenResponse = await soraFetch("https://enc-dec.app/api/enc-vidstack");
+ const tokenData = await tokenResponse.json();
+ const token = tokenData.result.token;
+
+ const embedResponse = await soraFetch(`https://api.smashystream.top/api/v1/videosmashyi/${imdbID}/155?token=${token}&user_id=`);
+ const embedData = await embedResponse.json();
+
+ const embedUrl = embedData.data;
+ const embedID = embedUrl.split("#")[1];
+ const encodedResponse = await soraFetch(`https://smashyplayer.top/api/v1/video?id=${embedID}`);
+ const encodedData = await encodedResponse.text();
+
+ const encrypted = /[A-Z]/.test(encodedData) ? atob(encodedData) : encodedData;
+
+ const postData = {
+ "text": encrypted
+ };
+
+ const headers = { "Content-Type": "application/json" };
+ const decryptResponse = await fetchv2("https://enc-dec.app/api/dec-vidstack", headers, "POST", JSON.stringify(postData));
+ const decryptData = await decryptResponse.json();
+
+ const streamdata = decryptData.result.hls;
+ const stream = "https://proxy.aether.mom/m3u8-proxy?url=https://smashyplayer.top"+streamdata;
+ console.log(stream);
+ const subsEng = decryptData.result.subtitle["English"];
+
+ const streams = [];
+
+ if (stream) {
+ streams.push("Default", stream);
+ };
+
+ const final = {
+ streams,
+ subtitles: subsEng
+ };
+
+ return JSON.stringify(final);
+} else if (ID.includes('tv')) {
+ const parts = ID.split('/');
+ const tmdbID = parts[2];
+ const seasonNumber = parts[3];
+ const episodeNumber = parts[4];
+ console.log(`TMDB ID: ${tmdbID}, Season: ${seasonNumber}, Episode: ${episodeNumber}`);
+ const headersOne = {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiI2NTQ0MWU0MTg4NjhhMWI0NDZiM2I0Mzg1MmE4OWQ2NyIsIm5iZiI6MTYzMDg4NDI0My40NzMsInN1YiI6IjYxMzU1MTkzZmQ0YTk2MDA0NDVkMTJjNiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.Hm0W-hUx-7ph-ASvk2TpMxZbMtwVa5DEXWcgNgcqXJM",
+ "Referer": "https://player.smashystream.com/",
+ "Origin": "https://player.smashystream.com",
+ "X-Requested-With": "XMLHttpRequest",
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"
+ };
+ const tmdbResponse = await fetchv2(`https://api.themoviedb.org/3/tv/${tmdbID}?append_to_response=external_ids`, headersOne);
+ const tmdbData = await tmdbResponse.json();
+ console.log(JSON.stringify(tmdbData));
+ const imdbID = tmdbData.external_ids.imdb_id;
+ const tokenResponse = await soraFetch("https://enc-dec.app/api/enc-vidstack");
+ const tokenData = await tokenResponse.json();
+ const token = tokenData.result.token;
+
+ const embedResponse = await soraFetch(`https://api.smashystream.top/api/v1/videosmashyi/${imdbID}/155/${seasonNumber}/${episodeNumber}?token=${token}&user_id=`);
+ const embedData = await embedResponse.json();
+
+ const embedUrl = embedData.data;
+ const embedID = embedUrl.split("#")[1];
+ const encodedResponse = await soraFetch(`https://smashyplayer.top/api/v1/video?id=${embedID}`);
+ const encodedData = await encodedResponse.text();
+
+ const encrypted = /[A-Z]/.test(encodedData) ? atob(encodedData) : encodedData;
+
+ const postData = {
+ "text": encrypted
+ };
+
+ const headers = { "Content-Type": "application/json" };
+ const decryptResponse = await fetchv2("https://enc-dec.app/api/dec-vidstack", headers, "POST", JSON.stringify(postData));
+ const decryptData = await decryptResponse.json();
+
+ const streamdata = decryptData.result.hls || decryptData.result.cf;
+ const baseUrl = streamdata === decryptData.result.hls
+ ? "https://proxy.aether.mom/m3u8-proxy?url=https://smashyplayer.top"
+ : "";
+ const stream = baseUrl + streamdata;
+ console.log(stream);
+ const subsEng = decryptData.result.subtitle?.English || "https://error.org";
+
+ const streams = [];
+
+ if (stream) {
+ streams.push("Default", stream);
+ };
+
+ const final = {
+ streams,
+ subtitles: subsEng
+ };
+
+ return JSON.stringify(final);
+ }
+}
+
+async function soraFetch(url, options = { headers: {}, method: 'GET', body: null, encoding: 'utf-8' }) {
+ try {
+ return await fetchv2(
+ url,
+ options.headers ?? {},
+ options.method ?? 'GET',
+ options.body ?? null,
+ true,
+ options.encoding ?? 'utf-8'
+ );
+ } catch(e) {
+ try {
+ return await fetch(url, options);
+ } catch(error) {
+ return null;
+ }
+ }
+}
diff --git a/smashystream/smashystream.json b/smashystream/smashystream.json
new file mode 100644
index 0000000..9967277
--- /dev/null
+++ b/smashystream/smashystream.json
@@ -0,0 +1,19 @@
+{
+ "sourceName": "SmashyStream",
+ "iconUrl": "https://smashystream.xyz/icon.png",
+ "author": {
+ "name": "50/50",
+ "icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3122kQwublLkZ6rf1fEpUP79BxZOFmH9BSA&s"
+ },
+ "version": "1.0.0",
+ "language": "English",
+ "streamType": "HLS",
+ "quality": "1080p",
+ "baseUrl": "https://smashystream.xyz/i",
+ "searchBaseUrl": "https://smashystream.xyz/i",
+ "scriptUrl": "https://git.luna-app.eu/50n50/sources/raw/branch/main/smashystream/smashystream.js",
+ "type": "shows/movies/anime",
+ "asyncJS": true,
+ "softsub": true,
+ "downloadSupport": false
+}