{"id":202,"date":"2025-10-03T19:23:15","date_gmt":"2025-10-03T19:23:15","guid":{"rendered":"https:\/\/shop.duckndata.com\/?page_id=202"},"modified":"2026-08-21T05:23:41","modified_gmt":"2026-08-21T05:23:41","slug":"shows","status":"publish","type":"page","link":"https:\/\/shop.duckndata.com\/?page_id=202","title":{"rendered":"Shows"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"202\" class=\"elementor elementor-202\">\n\t\t\t\t<div class=\"elementor-element elementor-element-32fa935 e-flex e-con-boxed e-con e-parent\" data-id=\"32fa935\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7f6ab08 elementor-widget elementor-widget-heading\" data-id=\"7f6ab08\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h6 class=\"elementor-heading-title elementor-size-default\"><strong>I do not have control over the ads do not install anything that pops up.<\/strong><br><strong>Install an adblock to get no ads.<\/strong> (less on mobile)<br><br><strong>Links to download:<br>PC\/Laptop: <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/ublock-origin\/\" data-type=\"link\" data-id=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/ublock-origin\/\" target=\"_blank\" rel=\"noreferrer noopener\">Firefox<\/a>   <a href=\"https:\/\/chromewebstore.google.com\/detail\/ublock-origin-lite\/ddkjiahejlhfcafbddmgiahcphecmpfh?hl=en\" data-type=\"link\" data-id=\"https:\/\/chromewebstore.google.com\/detail\/ublock-origin\/cjpalhdlnbpafiamejdnhcphjbkeiagm\" target=\"_blank\" rel=\"noreferrer noopener\">Chrome<\/a><\/strong><br>Android: <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=org.mozilla.firefox&amp;hl=en_US&amp;pli=1\" data-type=\"link\" data-id=\"https:\/\/play.google.com\/store\/apps\/details?id=org.mozilla.firefox&amp;hl=en_US&amp;pli=1\" target=\"_blank\" rel=\"noreferrer noopener\">FireFox App<\/a> + ublock extension<br><a href=\"http:\/\/www.duckndata.com\/wp-content\/uploads\/2024\/11\/blockguide.gif\" data-type=\"link\" data-id=\"http:\/\/www.duckndata.com\/wp-content\/uploads\/2024\/11\/blockguide.gif\" target=\"_blank\" rel=\"noreferrer noopener\">Guide<\/a><\/h6>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b8c85d3 e-flex e-con-boxed e-con e-parent\" data-id=\"b8c85d3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8c76678 elementor-widget elementor-widget-html\" data-id=\"8c76678\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"tv-app\">\n\n    <!-- ==============================\n         HEADER\n    =============================== -->\n\n    <header class=\"tv-header\">\n\n        <div class=\"tv-brand\">\n\n            <div class=\"tv-logo\">\n                \ud83d\udcfa\n            <\/div>\n\n            <div>\n                <h1>TV Shows<\/h1>\n                <p>Find something to watch<\/p>\n            <\/div>\n\n        <\/div>\n\n\n        <div class=\"tv-search\">\n\n            <input\n                type=\"text\"\n                id=\"search-title\"\n                placeholder=\"Search for a TV show...\"\n                autocomplete=\"off\"\n            >\n\n            <button\n                onclick=\"searchTVShows()\"\n                aria-label=\"Search\"\n            >\n                \ud83d\udd0d\n            <\/button>\n\n        <\/div>\n\n    <\/header>\n\n\n    <!-- ==============================\n         PLAYER\n    =============================== -->\n\n    <section\n        id=\"tv-player-section\"\n        class=\"tv-player-section hidden\"\n    >\n\n        <div class=\"player-card\">\n\n            <!-- PLAYER HEADER -->\n\n            <div class=\"player-header\">\n\n                <button\n                    class=\"back-button\"\n                    onclick=\"closeTVShow()\"\n                >\n                    \u2190 Back to shows\n                <\/button>\n\n\n                <div class=\"server-selector\">\n\n                    <span>Server<\/span>\n\n                    <select\n                        id=\"server-select\"\n                        onchange=\"switchServer()\"\n                    >\n\n                        <option value=\"vidsrc.me\">\n                            \u2b50 Stable\n                        <\/option>\n\n                        <option value=\"vidsrc.dev\">\n                            \u2b50 Backup\n                        <\/option>\n\n                        <option value=\"vidsrc.vip\">\n                            \u2b50 VIP\n                        <\/option>\n\n                        <option value=\"vidsrc.pro\">\n                            Pro\n                        <\/option>\n\n                        <option value=\"vidsrc.xyz\">\n                            XYZ\n                        <\/option>\n\n                        <option value=\"vidsrc.to\">\n                            TO\n                        <\/option>\n\n                    <\/select>\n\n                <\/div>\n\n            <\/div>\n\n\n            <!-- VIDEO -->\n\n            <div class=\"video-wrapper\">\n\n                <div\n                    id=\"episode-video\"\n                    class=\"episode-video\"\n                ><\/div>\n\n\n                <div\n                    id=\"player-loading\"\n                    class=\"player-loading\"\n                >\n\n                    <div class=\"loading-spinner\"><\/div>\n\n                    <span>\n                        Loading episode...\n                    <\/span>\n\n                <\/div>\n\n            <\/div>\n\n\n            <!-- SHOW INFORMATION -->\n\n            <div class=\"show-information\">\n\n                <h2 id=\"show-title\">\n                    TV Show\n                <\/h2>\n\n\n                <div class=\"show-meta\">\n\n                    <span id=\"show-year\"><\/span>\n\n                    <span class=\"meta-separator\">\n                        \u2022\n                    <\/span>\n\n                    <span id=\"show-rating\"><\/span>\n\n                <\/div>\n\n\n                <div\n                    id=\"show-genres\"\n                    class=\"show-genres\"\n                ><\/div>\n\n\n                <p\n                    id=\"show-overview\"\n                    class=\"show-overview\"\n                ><\/p>\n\n            <\/div>\n\n\n            <!-- ==============================\n                 SEASONS\n            =============================== -->\n\n            <div class=\"episodes-section\">\n\n                <div class=\"episodes-heading\">\n\n                    <div>\n\n                        <h3>\n                            Episodes\n                        <\/h3>\n\n                        <p id=\"episode-count\"><\/p>\n\n                    <\/div>\n\n                <\/div>\n\n\n                <div\n                    id=\"season-list\"\n                    class=\"season-list\"\n                ><\/div>\n\n\n                <div\n                    id=\"episodes-list\"\n                    class=\"episode-grid\"\n                ><\/div>\n\n            <\/div>\n\n        <\/div>\n\n    <\/section>\n\n\n    <!-- ==============================\n         SEARCH RESULTS\n    =============================== -->\n\n    <section class=\"results-section\">\n\n        <div class=\"results-header\">\n\n            <h2>\n                Search Results\n            <\/h2>\n\n            <p id=\"results-count\"><\/p>\n\n        <\/div>\n\n\n        <div\n            id=\"search-results\"\n            class=\"show-grid\"\n        >\n\n            <div class=\"empty-results\">\n\n                <div class=\"empty-icon\">\n                    \ud83d\udcfa\n                <\/div>\n\n                <h3>\n                    Search for a TV show\n                <\/h3>\n\n                <p>\n                    Enter a title above to get started.\n                <\/p>\n\n            <\/div>\n\n        <\/div>\n\n    <\/section>\n\n<\/div>\n\n\n<style>\n\n\/* =========================================================\n   APP\n========================================================= *\/\n\n#tv-app {\n\n    width: 100%;\n    max-width: 1500px;\n\n    margin: 0 auto;\n\n    padding: 25px;\n\n    box-sizing: border-box;\n\n    color: #ffffff;\n\n    font-family:\n        Inter,\n        -apple-system,\n        BlinkMacSystemFont,\n        \"Segoe UI\",\n        sans-serif;\n}\n\n\n.hidden {\n    display: none !important;\n}\n\n\n\/* =========================================================\n   HEADER\n========================================================= *\/\n\n.tv-header {\n\n    display: flex;\n\n    align-items: center;\n\n    justify-content: space-between;\n\n    gap: 30px;\n\n    margin-bottom: 35px;\n}\n\n\n.tv-brand {\n\n    display: flex;\n\n    align-items: center;\n\n    gap: 14px;\n}\n\n\n.tv-logo {\n\n    width: 52px;\n    height: 52px;\n\n    display: flex;\n\n    align-items: center;\n    justify-content: center;\n\n    border-radius: 14px;\n\n    background:\n        linear-gradient(\n            135deg,\n            #e50914,\n            #7b0000\n        );\n\n    font-size: 25px;\n\n    box-shadow:\n        0 8px 25px rgba(229,9,20,.25);\n}\n\n\n.tv-brand h1 {\n\n    margin: 0;\n\n    font-size: 29px;\n\n    font-weight: 800;\n}\n\n\n.tv-brand p {\n\n    margin: 3px 0 0;\n\n    color: #777;\n\n    font-size: 13px;\n}\n\n\n\/* =========================================================\n   SEARCH\n========================================================= *\/\n\n.tv-search {\n\n    width: 100%;\n\n    max-width: 500px;\n\n    display: flex;\n\n    background: #171717;\n\n    border: 1px solid #292929;\n\n    border-radius: 12px;\n\n    overflow: hidden;\n\n    transition: .2s;\n}\n\n\n.tv-search:focus-within {\n\n    border-color: #e50914;\n\n    box-shadow:\n        0 0 0 3px rgba(229,9,20,.10);\n}\n\n\n.tv-search input {\n\n    flex: 1;\n\n    min-width: 0;\n\n    border: none;\n\n    outline: none;\n\n    background: transparent;\n\n    color: #fff;\n\n    padding: 14px 16px;\n\n    font-size: 14px;\n}\n\n\n.tv-search input::placeholder {\n\n    color: #666;\n}\n\n\n.tv-search button {\n\n    width: 52px;\n\n    border: none;\n\n    background: #e50914;\n\n    color: white;\n\n    cursor: pointer;\n\n    font-size: 17px;\n\n    transition: .2s;\n}\n\n\n.tv-search button:hover {\n\n    background: #f6121d;\n}\n\n\n\/* =========================================================\n   PLAYER\n========================================================= *\/\n\n.tv-player-section {\n\n    margin-bottom: 45px;\n\n    animation:\n        playerAppear .35s ease;\n}\n\n\n.player-card {\n\n    overflow: hidden;\n\n    border-radius: 16px;\n\n    background: #101010;\n\n    border: 1px solid #252525;\n\n    box-shadow:\n        0 20px 60px rgba(0,0,0,.35);\n}\n\n\n.player-header {\n\n    display: flex;\n\n    align-items: center;\n\n    justify-content: space-between;\n\n    padding: 12px 16px;\n\n    background: #151515;\n}\n\n\n.back-button {\n\n    border: none;\n\n    background: transparent;\n\n    color: #999;\n\n    cursor: pointer;\n\n    font-size: 13px;\n\n    font-weight: 600;\n\n    transition: .2s;\n}\n\n\n.back-button:hover {\n\n    color: white;\n}\n\n\n.server-selector {\n\n    display: flex;\n\n    align-items: center;\n\n    gap: 8px;\n\n    color: #777;\n\n    font-size: 12px;\n}\n\n\n.server-selector select {\n\n    border: 1px solid #333;\n\n    border-radius: 7px;\n\n    background: #222;\n\n    color: #fff;\n\n    padding: 7px 10px;\n\n    outline: none;\n\n    cursor: pointer;\n}\n\n\n\/* =========================================================\n   VIDEO\n========================================================= *\/\n\n.video-wrapper {\n\n    position: relative;\n\n    width: 100%;\n\n    aspect-ratio: 16 \/ 9;\n\n    background: #000;\n}\n\n\n.episode-video {\n\n    width: 100%;\n    height: 100%;\n}\n\n\n.episode-video iframe {\n\n    display: block;\n\n    width: 100%;\n    height: 100%;\n\n    border: none;\n}\n\n\n.player-loading {\n\n    position: absolute;\n\n    inset: 0;\n\n    z-index: 5;\n\n    display: flex;\n\n    flex-direction: column;\n\n    align-items: center;\n    justify-content: center;\n\n    gap: 14px;\n\n    background: #050505;\n\n    color: #777;\n\n    font-size: 13px;\n\n    transition: opacity .35s;\n}\n\n\n.player-loading.loaded {\n\n    opacity: 0;\n\n    pointer-events: none;\n}\n\n\n.loading-spinner {\n\n    width: 30px;\n    height: 30px;\n\n    border-radius: 50%;\n\n    border: 3px solid #333;\n\n    border-top-color: #e50914;\n\n    animation:\n        spin .8s linear infinite;\n}\n\n\n\/* =========================================================\n   SHOW INFORMATION\n========================================================= *\/\n\n.show-information {\n\n    padding: 25px;\n\n    border-bottom: 1px solid #252525;\n}\n\n\n.show-information h2 {\n\n    margin: 0 0 7px;\n\n    font-size: 27px;\n\n    font-weight: 800;\n}\n\n\n.show-meta {\n\n    display: flex;\n\n    align-items: center;\n\n    gap: 8px;\n\n    color: #999;\n\n    font-size: 13px;\n\n    margin-bottom: 13px;\n}\n\n\n.meta-separator {\n\n    color: #444;\n}\n\n\n#show-rating {\n\n    color: #ffd700;\n\n    font-weight: 600;\n}\n\n\n.show-genres {\n\n    display: flex;\n\n    flex-wrap: wrap;\n\n    gap: 7px;\n\n    margin-bottom: 13px;\n}\n\n\n.show-genre {\n\n    padding: 4px 9px;\n\n    border-radius: 20px;\n\n    background: #222;\n\n    border: 1px solid #333;\n\n    color: #aaa;\n\n    font-size: 11px;\n}\n\n\n.show-overview {\n\n    max-width: 900px;\n\n    margin: 0;\n\n    color: #8d8d8d;\n\n    font-size: 14px;\n\n    line-height: 1.65;\n}\n\n\n\/* =========================================================\n   EPISODES\n========================================================= *\/\n\n.episodes-section {\n\n    padding: 25px;\n}\n\n\n.episodes-heading {\n\n    margin-bottom: 18px;\n}\n\n\n.episodes-heading h3 {\n\n    margin: 0;\n\n    font-size: 20px;\n\n    font-weight: 750;\n}\n\n\n#episode-count {\n\n    margin: 4px 0 0;\n\n    color: #666;\n\n    font-size: 12px;\n}\n\n\n\/* =========================================================\n   SEASON BUTTONS\n========================================================= *\/\n\n.season-list {\n\n    display: flex;\n\n    gap: 8px;\n\n    overflow-x: auto;\n\n    padding-bottom: 10px;\n\n    margin-bottom: 20px;\n\n    scrollbar-width: thin;\n}\n\n\n.season-button {\n\n    flex-shrink: 0;\n\n    padding: 9px 15px;\n\n    border-radius: 8px;\n\n    border: 1px solid #333;\n\n    background: #1b1b1b;\n\n    color: #999;\n\n    cursor: pointer;\n\n    font-size: 13px;\n\n    font-weight: 600;\n\n    transition: .2s;\n}\n\n\n.season-button:hover {\n\n    color: white;\n\n    border-color: #555;\n}\n\n\n.season-button.active {\n\n    background: #e50914;\n\n    border-color: #e50914;\n\n    color: white;\n\n    box-shadow:\n        0 5px 15px rgba(229,9,20,.2);\n}\n\n\n\/* =========================================================\n   EPISODE GRID\n========================================================= *\/\n\n.episode-grid {\n\n    display: grid;\n\n    grid-template-columns:\n        repeat(auto-fill, minmax(220px, 1fr));\n\n    gap: 14px;\n}\n\n\n.episode-card {\n\n    overflow: hidden;\n\n    border-radius: 10px;\n\n    background: #181818;\n\n    border: 1px solid #292929;\n\n    cursor: pointer;\n\n    transition:\n        transform .2s,\n        border-color .2s,\n        background .2s;\n}\n\n\n.episode-card:hover {\n\n    transform:\n        translateY(-4px);\n\n    border-color: #444;\n\n    background: #202020;\n}\n\n\n.episode-card.active {\n\n    border-color: #e50914;\n\n    box-shadow:\n        0 0 0 1px #e50914;\n}\n\n\n.episode-thumbnail {\n\n    position: relative;\n\n    width: 100%;\n\n    aspect-ratio: 16 \/ 9;\n\n    background: #111;\n\n    overflow: hidden;\n}\n\n\n.episode-thumbnail img {\n\n    width: 100%;\n    height: 100%;\n\n    display: block;\n\n    object-fit: cover;\n\n    transition:\n        transform .3s;\n}\n\n\n.episode-card:hover\n.episode-thumbnail img {\n\n    transform:\n        scale(1.05);\n}\n\n\n.episode-play {\n\n    position: absolute;\n\n    inset: 0;\n\n    display: flex;\n\n    align-items: center;\n    justify-content: center;\n\n    opacity: 0;\n\n    background:\n        rgba(0,0,0,.45);\n\n    transition:\n        opacity .2s;\n}\n\n\n.episode-card:hover\n.episode-play {\n\n    opacity: 1;\n}\n\n\n.episode-play-circle {\n\n    width: 42px;\n    height: 42px;\n\n    display: flex;\n\n    align-items: center;\n    justify-content: center;\n\n    border-radius: 50%;\n\n    background: #e50914;\n\n    color: white;\n\n    font-size: 15px;\n}\n\n\n.episode-info {\n\n    padding: 11px;\n}\n\n\n.episode-number {\n\n    color: #e50914;\n\n    font-size: 10px;\n\n    font-weight: 800;\n\n    text-transform: uppercase;\n\n    letter-spacing: .4px;\n}\n\n\n.episode-name {\n\n    margin-top: 4px;\n\n    color: white;\n\n    font-size: 13px;\n\n    font-weight: 700;\n\n    white-space: nowrap;\n\n    overflow: hidden;\n\n    text-overflow: ellipsis;\n}\n\n\n.episode-description {\n\n    margin-top: 5px;\n\n    color: #666;\n\n    font-size: 11px;\n\n    line-height: 1.4;\n\n    display: -webkit-box;\n\n    -webkit-line-clamp: 2;\n\n    -webkit-box-orient: vertical;\n\n    overflow: hidden;\n}\n\n\n\/* =========================================================\n   RESULTS\n========================================================= *\/\n\n.results-section {\n\n    margin-top: 10px;\n}\n\n\n.results-header {\n\n    margin-bottom: 18px;\n}\n\n\n.results-header h2 {\n\n    margin: 0;\n\n    font-size: 21px;\n\n    font-weight: 750;\n}\n\n\n#results-count {\n\n    margin: 4px 0 0;\n\n    color: #666;\n\n    font-size: 12px;\n}\n\n\n.show-grid {\n\n    display: grid;\n\n    grid-template-columns:\n        repeat(auto-fill, minmax(155px, 1fr));\n\n    gap: 19px;\n}\n\n\n\/* =========================================================\n   SHOW CARDS\n========================================================= *\/\n\n.show-card {\n\n    min-width: 0;\n\n    cursor: pointer;\n\n    transition:\n        transform .25s ease;\n}\n\n\n.show-card:hover {\n\n    transform:\n        translateY(-7px);\n}\n\n\n.show-poster {\n\n    position: relative;\n\n    width: 100%;\n\n    aspect-ratio: 2 \/ 3;\n\n    overflow: hidden;\n\n    border-radius: 10px;\n\n    background: #181818;\n}\n\n\n.show-poster img {\n\n    width: 100%;\n    height: 100%;\n\n    display: block;\n\n    object-fit: cover;\n\n    transition:\n        transform .35s ease;\n}\n\n\n.show-card:hover\n.show-poster img {\n\n    transform:\n        scale(1.06);\n}\n\n\n.show-overlay {\n\n    position: absolute;\n\n    inset: 0;\n\n    display: flex;\n\n    align-items: center;\n    justify-content: center;\n\n    opacity: 0;\n\n    background:\n        linear-gradient(\n            to top,\n            rgba(0,0,0,.8),\n            rgba(0,0,0,.05)\n        );\n\n    transition:\n        opacity .25s;\n}\n\n\n.show-card:hover\n.show-overlay {\n\n    opacity: 1;\n}\n\n\n.show-play {\n\n    width: 50px;\n    height: 50px;\n\n    display: flex;\n\n    align-items: center;\n    justify-content: center;\n\n    border-radius: 50%;\n\n    background: #e50914;\n\n    color: white;\n\n    font-size: 18px;\n\n    box-shadow:\n        0 8px 25px rgba(0,0,0,.45);\n}\n\n\n.show-rating {\n\n    position: absolute;\n\n    top: 8px;\n    right: 8px;\n\n    padding: 5px 7px;\n\n    border-radius: 6px;\n\n    background:\n        rgba(0,0,0,.85);\n\n    color: #ffd700;\n\n    font-size: 11px;\n\n    font-weight: 700;\n}\n\n\n.show-title-card {\n\n    margin-top: 9px;\n\n    color: white;\n\n    font-size: 13px;\n\n    font-weight: 700;\n\n    white-space: nowrap;\n\n    overflow: hidden;\n\n    text-overflow: ellipsis;\n}\n\n\n.show-year-card {\n\n    margin-top: 3px;\n\n    color: #666;\n\n    font-size: 11px;\n}\n\n\n\/* =========================================================\n   EMPTY\n========================================================= *\/\n\n.empty-results {\n\n    grid-column: 1 \/ -1;\n\n    padding: 75px 20px;\n\n    text-align: center;\n\n    color: #666;\n}\n\n\n.empty-icon {\n\n    margin-bottom: 14px;\n\n    font-size: 45px;\n\n    opacity: .55;\n}\n\n\n.empty-results h3 {\n\n    margin: 0 0 6px;\n\n    color: #aaa;\n\n    font-size: 17px;\n}\n\n\n.empty-results p {\n\n    margin: 0;\n\n    font-size: 13px;\n}\n\n\n\/* =========================================================\n   ANIMATIONS\n========================================================= *\/\n\n@keyframes spin {\n\n    to {\n        transform:\n            rotate(360deg);\n    }\n}\n\n\n@keyframes playerAppear {\n\n    from {\n\n        opacity: 0;\n\n        transform:\n            translateY(12px);\n    }\n\n    to {\n\n        opacity: 1;\n\n        transform:\n            translateY(0);\n    }\n}\n\n\n\/* =========================================================\n   MOBILE\n========================================================= *\/\n\n@media (max-width: 750px) {\n\n    #tv-app {\n\n        padding: 15px;\n    }\n\n\n    .tv-header {\n\n        flex-direction: column;\n\n        align-items: stretch;\n\n        gap: 20px;\n    }\n\n\n    .tv-search {\n\n        max-width: none;\n    }\n\n\n    .player-header {\n\n        padding: 10px;\n    }\n\n\n    .server-selector span {\n\n        display: none;\n    }\n\n\n    .show-information {\n\n        padding: 18px;\n    }\n\n\n    .show-information h2 {\n\n        font-size: 21px;\n    }\n\n\n    .episodes-section {\n\n        padding: 18px;\n    }\n\n\n    .episode-grid {\n\n        grid-template-columns:\n            repeat(2, minmax(0, 1fr));\n\n        gap: 10px;\n    }\n\n\n    .show-grid {\n\n        grid-template-columns:\n            repeat(2, minmax(0, 1fr));\n\n        gap: 12px;\n    }\n\n}\n\n\n@media (max-width: 450px) {\n\n    .episode-grid {\n\n        grid-template-columns:\n            1fr;\n    }\n\n\n    .tv-brand h1 {\n\n        font-size: 24px;\n    }\n\n\n    .tv-logo {\n\n        width: 45px;\n        height: 45px;\n    }\n\n}\n\n<\/style>\n\n\n<script>\n\n\/* =========================================================\n   CONFIG\n========================================================= *\/\n\nconst apiKey =\n    '395de9052435b5517885ed82441ff295';\n\nlet videoSource =\n    'vidsrc.me';\n\nlet currentShowId =\n    null;\n\nlet currentSeason =\n    1;\n\nlet currentEpisode =\n    1;\n\nlet searchCache =\n    {};\n\n\n\/* =========================================================\n   ENTER KEY SEARCH\n========================================================= *\/\n\ndocument\n    .getElementById('search-title')\n    .addEventListener(\n        'keydown',\n        function(event) {\n\n            if (event.key === 'Enter') {\n\n                searchTVShows();\n\n            }\n\n        }\n    );\n\n\n\/* =========================================================\n   SEARCH\n========================================================= *\/\n\nasync function searchTVShows() {\n\n    const input =\n        document.getElementById(\n            'search-title'\n        );\n\n\n    const title =\n        input.value.trim();\n\n\n    if (!title) return;\n\n\n    const results =\n        document.getElementById(\n            'search-results'\n        );\n\n\n    results.innerHTML = `\n\n        <div class=\"empty-results\">\n\n            <div\n                class=\"loading-spinner\"\n                style=\"margin:auto;\"\n            ><\/div>\n\n            <p style=\"margin-top:15px;\">\n                Searching...\n            <\/p>\n\n        <\/div>\n    `;\n\n\n    const cacheKey =\n        title.toLowerCase();\n\n\n    try {\n\n        if (searchCache[cacheKey]) {\n\n            displayTVShows(\n                searchCache[cacheKey]\n            );\n\n            return;\n        }\n\n\n        const response =\n            await fetch(\n                `https:\/\/api.themoviedb.org\/3\/search\/tv?api_key=${apiKey}&query=${encodeURIComponent(title)}`\n            );\n\n\n        if (!response.ok) {\n\n            throw new Error(\n                'TMDB request failed'\n            );\n        }\n\n\n        const data =\n            await response.json();\n\n\n        if (\n            !data.results ||\n            data.results.length === 0\n        ) {\n\n            results.innerHTML = `\n\n                <div class=\"empty-results\">\n\n                    <div class=\"empty-icon\">\n                        \ud83d\ude15\n                    <\/div>\n\n                    <h3>\n                        No TV shows found\n                    <\/h3>\n\n                    <p>\n                        Try another title.\n                    <\/p>\n\n                <\/div>\n            `;\n\n            return;\n        }\n\n\n        searchCache[cacheKey] =\n            data.results;\n\n\n        displayTVShows(\n            data.results\n        );\n\n\n    } catch (error) {\n\n        console.error(\n            'TV search error:',\n            error\n        );\n\n\n        results.innerHTML = `\n\n            <div class=\"empty-results\">\n\n                <div class=\"empty-icon\">\n                    \u26a0\ufe0f\n                <\/div>\n\n                <h3>\n                    Search failed\n                <\/h3>\n\n                <p>\n                    Please try again.\n                <\/p>\n\n            <\/div>\n        `;\n    }\n}\n\n\n\/* =========================================================\n   DISPLAY SHOWS\n========================================================= *\/\n\nfunction displayTVShows(shows) {\n\n    const container =\n        document.getElementById(\n            'search-results'\n        );\n\n\n    container.innerHTML = '';\n\n\n    document\n        .getElementById(\n            'results-count'\n        )\n        .textContent =\n        `${shows.length} show${shows.length === 1 ? '' : 's'} found`;\n\n\n    shows.forEach(show => {\n\n        const title =\n            show.name ||\n            'Untitled';\n\n\n        const year =\n            show.first_air_date\n                ? show.first_air_date.substring(0, 4)\n                : '';\n\n\n        const rating =\n            show.vote_average\n                ? show.vote_average.toFixed(1)\n                : 'N\/A';\n\n\n        const poster =\n            show.poster_path\n\n                ? `https:\/\/image.tmdb.org\/t\/p\/w342${show.poster_path}`\n\n                : 'https:\/\/via.placeholder.com\/342x513\/181818\/777?text=No+Poster';\n\n\n        const card =\n            document.createElement(\n                'div'\n            );\n\n\n        card.className =\n            'show-card';\n\n\n        card.innerHTML = `\n\n            <div class=\"show-poster\">\n\n                <img decoding=\"async\"\n                    src=\"${poster}\"\n                    alt=\"${escapeHTML(title)}\"\n                    loading=\"lazy\"\n                >\n\n\n                <div class=\"show-rating\">\n                    \u2b50 ${rating}\n                <\/div>\n\n\n                <div class=\"show-overlay\">\n\n                    <div class=\"show-play\">\n                        \u25b6\n                    <\/div>\n\n                <\/div>\n\n            <\/div>\n\n\n            <div class=\"show-title-card\">\n                ${escapeHTML(title)}\n            <\/div>\n\n\n            <div class=\"show-year-card\">\n                ${year || 'Unknown year'}\n            <\/div>\n\n        `;\n\n\n        card.onclick = () =>\n            openTVShow(\n                show.id\n            );\n\n\n        container.appendChild(\n            card\n        );\n\n    });\n}\n\n\n\/* =========================================================\n   OPEN SHOW\n========================================================= *\/\n\nasync function openTVShow(tvId) {\n\n    currentShowId =\n        tvId;\n\n    currentSeason =\n        1;\n\n    currentEpisode =\n        1;\n\n\n    const playerSection =\n        document.getElementById(\n            'tv-player-section'\n        );\n\n\n    playerSection\n        .classList\n        .remove('hidden');\n\n\n    document\n        .getElementById(\n            'player-loading'\n        )\n        .classList\n        .remove('loaded');\n\n\n    document\n        .getElementById(\n            'episode-video'\n        )\n        .innerHTML = '';\n\n\n    document\n        .getElementById(\n            'season-list'\n        )\n        .innerHTML = '';\n\n\n    document\n        .getElementById(\n            'episodes-list'\n        )\n        .innerHTML = '';\n\n\n    document\n        .getElementById(\n            'show-title'\n        )\n        .textContent =\n        'Loading...';\n\n\n    document\n        .getElementById(\n            'show-overview'\n        )\n        .textContent = '';\n\n\n    playerSection.scrollIntoView({\n\n        behavior: 'smooth',\n\n        block: 'start'\n\n    });\n\n\n    try {\n\n        const response =\n            await fetch(\n                `https:\/\/api.themoviedb.org\/3\/tv\/${tvId}?api_key=${apiKey}`\n            );\n\n\n        if (!response.ok) {\n\n            throw new Error(\n                'Unable to load TV show'\n            );\n        }\n\n\n        const show =\n            await response.json();\n\n\n        displayShowInfo(\n            show\n        );\n\n\n        buildSeasonButtons(\n            show\n        );\n\n\n    } catch (error) {\n\n        console.error(\n            error\n        );\n\n\n        document\n            .getElementById(\n                'show-title'\n            )\n            .textContent =\n            'Unable to load show';\n    }\n}\n\n\n\/* =========================================================\n   SHOW INFORMATION\n========================================================= *\/\n\nfunction displayShowInfo(show) {\n\n    document\n        .getElementById(\n            'show-title'\n        )\n        .textContent =\n        show.name || 'Unknown';\n\n\n    document\n        .getElementById(\n            'show-year'\n        )\n        .textContent =\n        show.first_air_date\n            ? show.first_air_date.substring(0, 4)\n            : '';\n\n\n    document\n        .getElementById(\n            'show-rating'\n        )\n        .textContent =\n        show.vote_average\n            ? `\u2b50 ${show.vote_average.toFixed(1)}`\n            : '';\n\n\n    const genres =\n        document.getElementById(\n            'show-genres'\n        );\n\n\n    genres.innerHTML = '';\n\n\n    if (show.genres) {\n\n        show.genres.forEach(\n            genre => {\n\n                const element =\n                    document.createElement(\n                        'span'\n                    );\n\n\n                element.className =\n                    'show-genre';\n\n\n                element.textContent =\n                    genre.name;\n\n\n                genres.appendChild(\n                    element\n                );\n\n            }\n        );\n\n    }\n\n\n    document\n        .getElementById(\n            'show-overview'\n        )\n        .textContent =\n        show.overview ||\n        'No description available.';\n}\n\n\n\/* =========================================================\n   BUILD SEASONS\n========================================================= *\/\n\nfunction buildSeasonButtons(show) {\n\n    const container =\n        document.getElementById(\n            'season-list'\n        );\n\n\n    container.innerHTML = '';\n\n\n    const seasons =\n        (show.seasons || [])\n            .filter(\n                season =>\n                    season.season_number >= 1\n            );\n\n\n    if (seasons.length === 0) {\n\n        document\n            .getElementById(\n                'episodes-list'\n            )\n            .innerHTML = `\n\n                <div class=\"empty-results\">\n\n                    <div class=\"empty-icon\">\n                        \ud83d\udcfa\n                    <\/div>\n\n                    <h3>\n                        No seasons found\n                    <\/h3>\n\n                <\/div>\n            `;\n\n        return;\n    }\n\n\n    seasons.forEach(\n        (season, index) => {\n\n            const button =\n                document.createElement(\n                    'button'\n                );\n\n\n            button.className =\n                'season-button';\n\n\n            button.textContent =\n                `Season ${season.season_number}`;\n\n\n            button.onclick = () => {\n\n                document\n                    .querySelectorAll(\n                        '.season-button'\n                    )\n                    .forEach(\n                        btn =>\n                            btn.classList.remove(\n                                'active'\n                            )\n                    );\n\n\n                button.classList.add(\n                    'active'\n                );\n\n\n                loadSeasonEpisodes(\n                    currentShowId,\n                    season.season_number,\n                    false\n                );\n\n            };\n\n\n            container.appendChild(\n                button\n            );\n\n\n            \/* Automatically select first season *\/\n\n            if (index === 0) {\n\n                button.classList.add(\n                    'active'\n                );\n\n            }\n\n        }\n    );\n\n\n    \/* Load first season *\/\n\n    loadSeasonEpisodes(\n        currentShowId,\n        seasons[0].season_number,\n        true\n    );\n}\n\n\n\/* =========================================================\n   LOAD EPISODES\n========================================================= *\/\n\nasync function loadSeasonEpisodes(\n    tvId,\n    seasonNumber,\n    autoPlay\n) {\n\n    currentSeason =\n        seasonNumber;\n\n\n    const container =\n        document.getElementById(\n            'episodes-list'\n        );\n\n\n    container.innerHTML = `\n\n        <div class=\"empty-results\">\n\n            <div\n                class=\"loading-spinner\"\n                style=\"margin:auto;\"\n            ><\/div>\n\n            <p style=\"margin-top:15px;\">\n                Loading episodes...\n            <\/p>\n\n        <\/div>\n    `;\n\n\n    try {\n\n        const response =\n            await fetch(\n                `https:\/\/api.themoviedb.org\/3\/tv\/${tvId}\/season\/${seasonNumber}?api_key=${apiKey}`\n            );\n\n\n        if (!response.ok) {\n\n            throw new Error(\n                'Unable to load season'\n            );\n        }\n\n\n        const data =\n            await response.json();\n\n\n        const episodes =\n            data.episodes || [];\n\n\n        container.innerHTML = '';\n\n\n        document\n            .getElementById(\n                'episode-count'\n            )\n            .textContent =\n            `${episodes.length} episode${episodes.length === 1 ? '' : 's'}`;\n\n\n        if (episodes.length === 0) {\n\n            container.innerHTML = `\n\n                <div class=\"empty-results\">\n\n                    <div class=\"empty-icon\">\n                        \ud83d\udcfa\n                    <\/div>\n\n                    <h3>\n                        No episodes found\n                    <\/h3>\n\n                <\/div>\n            `;\n\n            return;\n        }\n\n\n        episodes.forEach(\n            (episode, index) => {\n\n                const card =\n                    document.createElement(\n                        'div'\n                    );\n\n\n                card.className =\n                    'episode-card';\n\n\n                const image =\n                    episode.still_path\n\n                        ? `https:\/\/image.tmdb.org\/t\/p\/w500${episode.still_path}`\n\n                        : 'https:\/\/via.placeholder.com\/500x281\/181818\/777?text=No+Image';\n\n\n                card.innerHTML = `\n\n                    <div class=\"episode-thumbnail\">\n\n                        <img decoding=\"async\"\n                            src=\"${image}\"\n                            alt=\"${escapeHTML(\n                                episode.name || ''\n                            )}\"\n                            loading=\"lazy\"\n                        >\n\n\n                        <div class=\"episode-play\">\n\n                            <div class=\"episode-play-circle\">\n                                \u25b6\n                            <\/div>\n\n                        <\/div>\n\n                    <\/div>\n\n\n                    <div class=\"episode-info\">\n\n                        <div class=\"episode-number\">\n                            Episode ${episode.episode_number}\n                        <\/div>\n\n\n                        <div class=\"episode-name\">\n                            ${escapeHTML(\n                                episode.name ||\n                                'Untitled'\n                            )}\n                        <\/div>\n\n\n                        <div class=\"episode-description\">\n                            ${escapeHTML(\n                                episode.overview ||\n                                ''\n                            )}\n                        <\/div>\n\n                    <\/div>\n                `;\n\n\n                card.onclick = () => {\n\n                    currentEpisode =\n                        episode.episode_number;\n\n\n                    document\n                        .querySelectorAll(\n                            '.episode-card'\n                        )\n                        .forEach(\n                            ep =>\n                                ep.classList.remove(\n                                    'active'\n                                )\n                        );\n\n\n                    card.classList.add(\n                        'active'\n                    );\n\n\n                    playEpisode(\n                        tvId,\n                        seasonNumber,\n                        episode.episode_number\n                    );\n\n                };\n\n\n                container.appendChild(\n                    card\n                );\n\n\n                \/* Automatically play first episode *\/\n\n                if (\n                    autoPlay &&\n                    index === 0\n                ) {\n\n                    card.classList.add(\n                        'active'\n                    );\n\n                    currentEpisode =\n                        episode.episode_number;\n\n\n                    playEpisode(\n                        tvId,\n                        seasonNumber,\n                        episode.episode_number\n                    );\n\n                }\n\n            }\n        );\n\n\n    } catch (error) {\n\n        console.error(\n            'Episode error:',\n            error\n        );\n\n\n        container.innerHTML = `\n\n            <div class=\"empty-results\">\n\n                <div class=\"empty-icon\">\n                    \u26a0\ufe0f\n                <\/div>\n\n                <h3>\n                    Unable to load episodes\n                <\/h3>\n\n                <p>\n                    Please try again.\n                <\/p>\n\n            <\/div>\n        `;\n    }\n}\n\n\n\/* =========================================================\n   PLAY EPISODE\n========================================================= *\/\n\nfunction playEpisode(\n    tvId,\n    seasonNumber,\n    episodeNumber\n) {\n\n    currentShowId =\n        tvId;\n\n    currentSeason =\n        seasonNumber;\n\n    currentEpisode =\n        episodeNumber;\n\n\n    document\n        .getElementById(\n            'player-loading'\n        )\n        .classList\n        .remove('loaded');\n\n\n    const container =\n        document.getElementById(\n            'episode-video'\n        );\n\n\n    container.innerHTML = '';\n\n\n    const iframe =\n        document.createElement(\n            'iframe'\n        );\n\n\n    iframe.src =\n        `https:\/\/${videoSource}\/embed\/tv\/${tvId}\/${seasonNumber}\/${episodeNumber}`;\n\n\n    iframe.allowFullscreen =\n        true;\n\n\n    iframe.setAttribute(\n        'allow',\n        'autoplay; fullscreen'\n    );\n\n\n    iframe.setAttribute(\n        'scrolling',\n        'no'\n    );\n\n\n    iframe.onload =\n        function() {\n\n            setTimeout(\n                () => {\n\n                    document\n                        .getElementById(\n                            'player-loading'\n                        )\n                        .classList\n                        .add('loaded');\n\n                },\n                700\n            );\n\n        };\n\n\n    container.appendChild(\n        iframe\n    );\n\n\n    \/* Scroll player into view *\/\n\n    document\n        .getElementById(\n            'tv-player-section'\n        )\n        .scrollIntoView({\n\n            behavior: 'smooth',\n\n            block: 'start'\n\n        });\n}\n\n\n\/* =========================================================\n   SERVER SWITCH\n========================================================= *\/\n\nfunction switchServer() {\n\n    const select =\n        document.getElementById(\n            'server-select'\n        );\n\n\n    videoSource =\n        select.value;\n\n\n    if (!currentShowId) return;\n\n\n    playEpisode(\n        currentShowId,\n        currentSeason,\n        currentEpisode\n    );\n}\n\n\n\/* =========================================================\n   CLOSE SHOW\n========================================================= *\/\n\nfunction closeTVShow() {\n\n    document\n        .getElementById(\n            'episode-video'\n        )\n        .innerHTML = '';\n\n\n    document\n        .getElementById(\n            'tv-player-section'\n        )\n        .classList\n        .add('hidden');\n\n\n    document\n        .getElementById(\n            'season-list'\n        )\n        .innerHTML = '';\n\n\n    document\n        .getElementById(\n            'episodes-list'\n        )\n        .innerHTML = '';\n\n\n    currentShowId =\n        null;\n\n    currentSeason =\n        1;\n\n    currentEpisode =\n        1;\n\n\n    window.scrollTo({\n\n        top: 0,\n\n        behavior: 'smooth'\n\n    });\n}\n\n\n\/* =========================================================\n   ESCAPE HTML\n========================================================= *\/\n\nfunction escapeHTML(text) {\n\n    const element =\n        document.createElement(\n            'div'\n        );\n\n\n    element.textContent =\n        text;\n\n\n    return element.innerHTML;\n}\n\n<\/script\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>I do not have control over the ads do not install anything that pops up.Install an adblock to get no [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":11,"comment_status":"open","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-202","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"mailpoet_newsletter_max":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false},"uagb_author_info":{"display_name":"madmin","author_link":"https:\/\/shop.duckndata.com\/?author=1"},"uagb_comment_info":8,"uagb_excerpt":"I do not have control over the ads do not install anything that pops up.Install an adblock to get no [&hellip;]","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=\/wp\/v2\/pages\/202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=202"}],"version-history":[{"count":13,"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=\/wp\/v2\/pages\/202\/revisions"}],"predecessor-version":[{"id":288,"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=\/wp\/v2\/pages\/202\/revisions\/288"}],"wp:attachment":[{"href":"https:\/\/shop.duckndata.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}