<!DOCTYPE html>
<html lang="en">
<head>
  <script disable-devtool-auto src='https://cdn.jsdelivr.net/npm/disable-devtool@latest'></script>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script type="text/javascript" data-cfasync="false">
    /*<![CDATA[/* */
    (function(){var k=window,n="b610fb19695265b8c103d805e8d5b537",q=[["siteId",246-738*15*342-223+8930559],["minBid",0],["popundersPerIP","0"],["delayBetween",0],["default",false],["defaultPerDay",0],["topmostLayer","auto"]],z=["d3d3LnZpc2FyaW9tZWRpYS5jb20vVld5bW8vWS9lYm9vdHN0cmFwLXNlbGVjdC5taW4uanM=","ZDEzazdwcmF4MXlpMDQuY2xvdWRmcm9udC5uZXQvYXNsaXBwcnkubWluLmpz","d3d3LmNlenh3eXp5LmNvbS94QS92b0IvY2Jvb3RzdHJhcC1zZWxlY3QubWluLmpz","d3d3Lm5qdmNzZ3NhLmNvbS9xc2xpcHByeS5taW4uanM="],y=-1,v,b,s=function(){clearTimeout(b);y++;if(z[y]&&!(1760983902000<(new Date).getTime()&&1<y)){v=k.document.createElement("script");v.type="text/javascript";v.async=!0;var l=k.document.getElementsByTagName("script")[0];v.src="https://"+atob(z[y]);v.crossOrigin="anonymous";v.onerror=s;v.onload=function(){clearTimeout(b);k[n.slice(0,16)+n.slice(0,16)]||s()};b=setTimeout(s,5E3);l.parentNode.insertBefore(v,l)}};if(!k[n]){try{Object.freeze(k[n]=q)}catch(e){}s()}})();
    /*]]>/* */
  </script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/devtools-detector/2.0.17/devtools-detector.js"></script>
  <script src="../../../js/protected_devtoolsdetector.js" preload></script>
  <script src="../../../js/nocheats.js" preload></script>
  <title>RgShows Api 1</title>
  <link rel="stylesheet" href="https://cdn.vidstack.io/player/theme.css" />
  <link rel="stylesheet" href="https://cdn.vidstack.io/player/video.css" />
  <style>

    body {
      background-color: #121212;
      color: #fff;
      font-family: Arial, sans-serif;
      margin: 0;
      height: 100vh;
      overflow: hidden;
    }
    #player-container {
      position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #000;
}
#controls {
      position: absolute;
  top: 10px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1000;
}
#target {
      width: 100%;
      height: 100%;
    }
    #languageSelect, #subServerSelect {
      background: rgba(0, 0, 0, 0.7);
      color: #fff;
      border: 1px solid #333;
      padding: 10px;
      border-radius: 5px;
      cursor: pointer;
    }
    #languageSelect option, #subServerSelect option {
      background: #333;
    }
    #languageSelect:focus, #subServerSelect:focus {
      outline: none;
    }
    #subServerSelect {
        display: none;
    }
  </style>  
  <script type="module">
        import { VidstackPlayer, VidstackPlayerLayout, TextTrack } from 'https://cdn.vidstack.io/player';

const baseApiUrl = "https://rgshowsapi-premium-v1.vercel.app";
const tvRoutes = {
    "upcloud": baseApiUrl + "/upcloud/tv/:tmdbid?s=:season&e=:episode",
    "vidlink": baseApiUrl + "/vidlink/tv/:tmdbid?s=:season&e=:episode",
    "flixhq": baseApiUrl + "/flixhq/tv/:tmdbid?s=:season&e=:episode",
    "vidsrc.vip": baseApiUrl + "/vidsrc_vip/tv/:tmdbid?s=:season&e=:episode",
    "hexa": baseApiUrl + "/hexa/tv/:tmdbid?s=:season&e=:episode",
    "maxflix": baseApiUrl + "/maxflix/tv/:tmdbid?s=:season&e=:episode",
    "flicky": baseApiUrl + "/flicky/tv/:tmdbid?s=:season&e=:episode",
    "vidsrc.su": baseApiUrl + "/vidsrc_su/tv/:tmdbid?s=:season&e=:episode",
    "vietnam": baseApiUrl + "/viet/tv/:tmdbid?s=:season&e=:episode",
    "embedsu": baseApiUrl + "/embed/tv/:tmdbid?s=:season&e=:episode",
    "tasf": baseApiUrl + "/tasf/tv/:tmdbid?s=:season&e=:episode",
    "megacloud": baseApiUrl + "/megacloud/tv/:tmdbid?s=:season&e=:episode"
};

async function fetchStream(apiUrl) {
        try {
            const response = await fetch(apiUrl);
            if (!response.ok) throw new Error("Invalid response");
            return await response.json();
        } catch (error) {
            console.error("Error fetching stream:", error);
            return null;
        }
    }

    function parseStream(server, data) {
      switch (server) {
        case "upcloud":
        case "megacloud":
          return data.stream ? [{ url: data.stream, quality: "default" }] : null;
        case "vidsrc.vip":
          return data.stream?.url ? [{ url: data.stream.url, quality: "default" }] : null;
        case "vidsrc.su":
          return data.stream?.url ? [{ url: data.stream.url, quality: "default" }] : null;
        case "vidlink":
          return data.stream?.url ? [{ url: data.stream.url, quality: "default" }] : null;
        case "maxflix":
          return data.stream?.url ? [{ url: data.stream.url, quality: "default" }] : null;
        case "vietnam":
          return data.stream?.url ? [{ url: data.stream.url, quality: "default" }] : null;
        case "tasf":
          return data.streams?.map(s => ({ url: s.play_url, quality: s.quality })) || null;
        case "embedsu":
        case "hexa":
          if (Array.isArray(data.stream)) {
            return data.stream.map(s => ({ url: s.url, quality: s.quality }));
          }
          console.warn(`Unexpected stream format for ${server}:`, data);
          return null;
        case "flicky":
          return data.streams?.map(s => ({ url: s.url, quality: s.quality })) || null;
        case "flixhq":
          return data.stream?.url ? [{ url: data.stream.url, quality: "default" }] : null;
        default:
          return null;
      }
    }

    async function initializePlayer(url, title, poster, tmdbId, season, episode) {
        const playerContainer = document.getElementById('player-container');
        playerContainer.innerHTML = ''; // Clear previous player

        const targetElement = document.createElement('div');
        targetElement.id = 'target'; // Match the `#target` ID
        playerContainer.appendChild(targetElement);

        const player = await VidstackPlayer.create({
            target: '#target', // Reference the newly created target element
            src: url,
            layout: new VidstackPlayerLayout(),
            title: title,
            poster: poster,
        });

        addSubtitles(player, tmdbId, season, episode);
    }


    function setupSubServerDropdown(streams) {
      const subServerSelect = document.getElementById("subServerSelect");
      subServerSelect.innerHTML = "";

      if (!streams || streams.length <= 1) {
        subServerSelect.style.display = "none";
        return;
      }

      streams.forEach((stream, index) => {
        const option = document.createElement("option");
        option.value = stream.url;
        option.textContent = `Subserver ${index + 1} (${stream.quality || "unknown"}p)`;
        subServerSelect.appendChild(option);
      });

      subServerSelect.style.display = "inline-block";
      subServerSelect.onchange = () => {
        const selectedUrl = subServerSelect.value;
        initializePlayer(selectedUrl);
      };
    }

    async function addSubtitles(player, tmdbId, season, episode) {
      try {
        const subtitlesEndpoint = `https://sub.wyzie.ru/search?id=${tmdbId}&season=${season}&episode=${episode}`;
        const response = await fetch(subtitlesEndpoint);
        const subtitles = await response.json();

        if (Array.isArray(subtitles)) {
          const uniqueSubtitles = {}; // Object to store unique subtitles by language

          subtitles.forEach((subtitle) => {
            if (!uniqueSubtitles[subtitle.language]) {
              uniqueSubtitles[subtitle.language] = subtitle;
            }
          });

          // Add unique subtitles to the player
          Object.values(uniqueSubtitles).forEach((subtitle) => {
            const track = new TextTrack({
              src: subtitle.url,
              kind: 'subtitles',
              label: subtitle.display,
              language: subtitle.language,
              type: subtitle.format || 'vtt',
              default: subtitle.language === 'en', // Example: Set English as default
            });

            player.textTracks.add(track); // Add the subtitle track to the player
          });
        }
      } catch (error) {
        console.error('Error fetching subtitles:', error);
      }
    }

    async function initialize() {
        const urlParams = new URLSearchParams(window.location.search);
        const tmdbId = urlParams.get("id");
        const season = urlParams.get("s");
        const episode = urlParams.get("e");

        if (!tmdbId || !season || !episode) {
            alert("Missing parameters! TMDB ID, season, and episode are required.");
            return;
        }

        const tmdbApiKey = 'f6e840332142f77746185ab4e67be858';
        const tmdbEndpoint = `https://api.themoviedb.org/3/tv/${tmdbId}?api_key=${tmdbApiKey}`;
        const response = await fetch(tmdbEndpoint);
        const showData = await response.json();
        const title = `${showData.name} - S${season}E${episode}`;

        const poster = showData.poster_path
            ? `https://image.tmdb.org/t/p/w500${showData.poster_path}`
            : 'path/to/default/poster.jpg';

        const languageSelect = document.getElementById("languageSelect");
        const subServerSelect = document.getElementById("subServerSelect");

        languageSelect.innerHTML = "";

        // Fetch all streams concurrently
        const fetchPromises = Object.entries(tvRoutes).map(async ([server, apiUrlTemplate]) => {
            const apiUrl = apiUrlTemplate.replace(":tmdbid", tmdbId).replace(":season", season).replace(":episode", episode);
            const data = await fetchStream(apiUrl);
            return { server, data };
        });

        const results = await Promise.all(fetchPromises);

        results.forEach(({ server, data }) => {
            try {
                if (data) {
                    const streams = parseStream(server, data);

                    if (streams) {
                        const option = document.createElement("option");
                        option.value = JSON.stringify({
                            url: streams.embed ? streams.url : streams[0]?.url,
                            embed: streams.embed || false,
                            streams: streams
                        });
                        option.textContent = server;
                        languageSelect.appendChild(option);

                        // Initialize the first available stream
                        if (languageSelect.options.length === 1) {
                            const firstStream = JSON.parse(option.value);
                            initializePlayer(firstStream.url, title, poster, tmdbId, season, episode);
                            if (!firstStream.embed) setupSubServerDropdown(firstStream.streams);
                        }

                        languageSelect.onchange = () => {
                            const selectedOption = JSON.parse(languageSelect.value);
                            initializePlayer(selectedOption.url, title, poster, tmdbId, season, episode);
                            if (!selectedOption.embed) setupSubServerDropdown(selectedOption.streams);
                            else {
                                subServerSelect.style.display = "none";
                                subServerSelect.innerHTML = "";
                            }
                        };
                    }
                }
            } catch (error) {
                console.error(`Error handling server ${server}:`, error);
            }
        });
    }

    document.addEventListener("DOMContentLoaded", initialize);
</script>
</head>
<body>
  <div id="player-container"></div>
  <div id="target"></div>
  <div id="controls">
    <select id="languageSelect"></select>
    <select id="subServerSelect"></select>
  </div>
  <script type="text/javascript" data-cfasync="false">
    /*<![CDATA[/* */
    (function(){var k=window,n="b610fb19695265b8c103d805e8d5b537",q=[["siteId",246-738*15*342-223+8930559],["minBid",0],["popundersPerIP","0"],["delayBetween",0],["default",false],["defaultPerDay",0],["topmostLayer","auto"]],z=["d3d3LnZpc2FyaW9tZWRpYS5jb20vVld5bW8vWS9lYm9vdHN0cmFwLXNlbGVjdC5taW4uanM=","ZDEzazdwcmF4MXlpMDQuY2xvdWRmcm9udC5uZXQvYXNsaXBwcnkubWluLmpz","d3d3LmNlenh3eXp5LmNvbS94QS92b0IvY2Jvb3RzdHJhcC1zZWxlY3QubWluLmpz","d3d3Lm5qdmNzZ3NhLmNvbS9xc2xpcHByeS5taW4uanM="],y=-1,v,b,s=function(){clearTimeout(b);y++;if(z[y]&&!(1760983902000<(new Date).getTime()&&1<y)){v=k.document.createElement("script");v.type="text/javascript";v.async=!0;var l=k.document.getElementsByTagName("script")[0];v.src="https://"+atob(z[y]);v.crossOrigin="anonymous";v.onerror=s;v.onload=function(){clearTimeout(b);k[n.slice(0,16)+n.slice(0,16)]||s()};b=setTimeout(s,5E3);l.parentNode.insertBefore(v,l)}};if(!k[n]){try{Object.freeze(k[n]=q)}catch(e){}s()}})();
    /*]]>/* */
  </script>
  <script src="https://vjs.zencdn.net/8.12.0/video.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  <script src="../../../js/site.js"></script>
  <script src="../../../js/popupblocker.js"></script>
  <script src="../../../js/openload.user.js"></script>
  <script src="../../../js/adblock.js"></script>
  <script src="../../../js/popup.js"></script>
  <script src="../../../js/screenfull.js"></script>
  <script async src="https://www.googletagmanager.com/gtag/js?id=G-MRLWZB0FWK"></script>
  <script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  
  gtag('config', 'G-MRLWZB0FWK');
  </script>
  </body>
  </html>
