From b9ea9732f6939fe3cd04049c7e640654511dbed8 Mon Sep 17 00:00:00 2001 From: 50/50 <80717571+50n50@users.noreply.github.com> Date: Tue, 14 Oct 2025 22:44:28 +0200 Subject: [PATCH 1/5] test --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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!

From 57c035d7969d4e83c5486948de5ac06485b26be7 Mon Sep 17 00:00:00 2001 From: aka paul <50n50@noreply.localhost> Date: Sat, 18 Oct 2025 19:54:11 +0000 Subject: [PATCH 2/5] Add onetouch/onetouch.js --- onetouch/onetouch.js | 128 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 onetouch/onetouch.js 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 + }); + } +} + + From 7718a0b458dd50c7712741add7ca62106ebc0f79 Mon Sep 17 00:00:00 2001 From: aka paul <50n50@noreply.localhost> Date: Sat, 18 Oct 2025 19:55:47 +0000 Subject: [PATCH 3/5] Add onetouch/onetouch.json --- onetouch/onetouch.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 onetouch/onetouch.json 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 +} From d8a2a3bb49199c221249a1fb6ae23f09ce1defa4 Mon Sep 17 00:00:00 2001 From: aka paul <50n50@noreply.localhost> Date: Tue, 21 Oct 2025 21:53:29 +0000 Subject: [PATCH 4/5] Add smashystream/smashystream.js --- smashystream/smashystream.js | 320 +++++++++++++++++++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 smashystream/smashystream.js 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; + } + } +} From 6613d718cddbf4d6cdf08dc4212f2002d029ea69 Mon Sep 17 00:00:00 2001 From: aka paul <50n50@noreply.localhost> Date: Tue, 21 Oct 2025 21:54:43 +0000 Subject: [PATCH 5/5] Add smashystream/smashystream.json --- smashystream/smashystream.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 smashystream/smashystream.json 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 +}