Help
RSS
API
Feed
Maltego
Contact
Domain > yeet.tv
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2020-06-05
13.226.138.115
(
ClassC
)
2020-06-05
13.226.138.20
(
ClassC
)
2025-01-13
13.224.14.67
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Mon, 13 Jan 2025 00:56:15 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://yeet.tv/X-Cache: Redirect from cloudfrontVia: 1.1 d6a002c70d55f415107618b0750d493c.cloudfront.net (CloudFront)X-Amz-Cf-Pop: SEA19-C2X-Amz-Cf-Id: yYc5gbmyM9vSsDI79az25BziLgWGLnVfEScPkZ1vlVImxkrnCc9rYw html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 120476Connection: keep-aliveLast-Modified: Sat, 08 Jun 2024 00:57:17 GMTx-amz-server-side-encryption: AES256x-amz-version-id: UZ4DdyUfTtzgD3z2EfkRB_5fKlj5vrxRAccept-Ranges: bytesServer: AmazonS3Date: Mon, 13 Jan 2025 00:56:17 GMTETag: 8ecad1492f8b38830d2f19950c196651X-Cache: Error from cloudfrontVia: 1.1 a847181d425b7fc57e81eb3c800bfdf2.cloudfront.net (CloudFront)X-Amz-Cf-Pop: SEA19-C2X-Amz-Cf-Id: IjACopFtHZvohvLaBLQa9TR2MupK0-x0JZVN_qu025LnuNNR9DETLA !DOCTYPE html>html langen>head> meta charsetUTF-8/> link hrefhttps://player.twitch.tv/js/embed/v1.js relpreload asscript/> title>yeet.tv/title> meta namedescription contentWatch multiple Twitch streams. Browse in the sidebar. Drag & drop layout. Desktop and mobile./> meta nameviewport contentwidthdevice-width, initial-scale1/> link relcanonical hrefhttps://yeet.tv/> link relmanifest href/manifest.json/> meta nametheme-color content#0d0a0b/> meta nameapple-mobile-web-app-capable contentyes> meta nameapple-mobile-web-app-status-bar-style content#0d0a0b> meta nameapple-mobile-web-app-title contentyeet.tv> link relapple-touch-icon href/img/152x152.png> style> * { margin: 0; padding: 0; box-sizing: border-box; } html { overflow: hidden; height: 100%; width: 100%; background-color: #000; } body { margin: 0; padding: 0; position: relative; font-family: sans-serif; font-size: 14px; overflow: hidden; height: 100%; width: 100%; background-color: #000; } .toggler, .closeStream, .resetStream { width: 21px; height: 21px; background: transparent; position: absolute; border: 0; right: 0px; top: 0px; cursor: pointer; z-index: 9; color: white; visibility: visible; font-size: 21px; overflow: hidden; } .resetStream { width: 40px; height: 30px; right: 40px; z-index: 20; } .resetStream:hover { background-color:rgb(83, 83, 83); } .streamButtonInner { padding: 5px 10px; width: 100%; height: 100%; position: absolute; right: 0px; top: 0px; } .toggleInfo { position: absolute; right: 35px; padding: 5px; } .resetBrowser { position: absolute; right: 5px; padding: 5px; } .icon{ display: block; width: 20px; height: 20px; } .iconClose{ background: url(/img/icons.png) 0 0; } .iconReset{ background: url(/img/icons.png) 0 -20px; } .iconInfo{ background: url(/img/icons.png) 0 -40px; } .iconCloseGray{ background: url(/img/icons.png) 0 -60px; } .iconQuoteGray{ background: url(/img/icons.png) 0 -80px; } .iconPlayGray{ background: url(/img/icons.png) 0 -100px; } .iconChatMenu{ display: block; width: 15px; height: 15px; background: url(/img/icons.png) 0 -120px; } .iconChatTopUp{ background: url(/img/icons.png) 0 -140px; } .iconChatTopDown{ background: url(/img/icons.png) 0 -160px; } .iconChatBottomDown{ background: url(/img/icons.png) 0 -180px; } .iconChatBottomUp{ background: url(/img/icons.png) 0 -200px; } .closeStream { width: 40px; height: 30px; right: 0; z-index: 20; } .closeStream:hover { background-color:rgb(147, 48, 48); } .dragBar { position: relative; height: 30px; width: 350px; min-width: 40%; max-width: 100%; top: 0; margin: 0 auto; background-color: rgb(70, 70, 70, 0.7); z-index: 19; opacity: 1; } iframe { position: absolute; top: 0; } button { border: 0; background: transparent; cursor: pointer; color: white; } button:focus { outline: 0; } .openStream, .openChannel { background-color: rgb(20, 18, 18); color: white; border: 0; cursor: pointer; text-decoration: none; margin-bottom: 10px; } .openChannel:hover { background-color: rgb(31, 31, 31); } ::-webkit-scrollbar { width: 16px; } ::-webkit-scrollbar-track { background: #131313; } ::-webkit-scrollbar-thumb { background: #2c2c2c; } ::-webkit-scrollbar-thumb:hover { background: #323232; } .browser { position: absolute; height: calc(100% - 58px); width: 100%; background-color: #0d0a0b; } .browserScrollContainer { position: absolute; height: 100%; width: 100%; background-color: #0d0a0b; padding: 5px; overflow-x: hidden; overflow-y: scroll; scrollbar-width:auto; scrollbar-color: #2c2c2c #131313; } .browserStream { position: relative; flex: 1 auto; width: 150px; height: max-content; max-width: 100%; margin: 5px; text-align: left; } .browserGame { position: relative; flex: 1 auto; width: 100px; max-width: calc(50% - 10px); margin: 5px; background-color: rgb(32, 29, 29); } .hidden { visibility: hidden; } .menuButton { padding: 5px; font-size: 16px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1 1 0; height: 30px; } .menuButton:hover { background-color: rgb(50, 46, 46); } .menuSeparator { padding: 5px 0; font-size: 16px; color: white; cursor: default; flex: 0; } input:focus{ outline: none; } #sidebar { width: 339px; max-width: 30%; background-color: #313131; height: 100%; top: 0; right: 0; position: absolute; } #main0drops { position: absolute; top: 0; left: 0; height: 100%; width: calc(100% - 339px); min-width: 70%; } #main0drop { position: absolute; top: 0; left: 0; height: 100%; width: 100%; visibility: hidden; display: block; z-index: 2; } #vertical0dropUp { position: absolute; top: 0; left: 0; height: 50%; width: 100%; visibility: hidden; display: none; } #vertical0dropDown { position: absolute; top: 50%; left: 0; height: 50%; width: 100%; visibility: hidden; display: none; } #vertical0dropLeft { position: absolute; top: 0; left: 0; height: 100%; width: 50%; visibility: hidden; display: none; } #vertical0dropRight { position: absolute; top: 0; left: 50%; height: 100%; width: 50%; visibility: hidden; display: none; } #sidebar0drop { position:absolute; top: 0; left: 0; height: 100px; width: 100%; visibility: hidden; display: block; z-index: 200; } .wbBrowser { overflow: hidden; position: absolute; height: 100%; width: 100%; } #watchBrowser { z-index: 0; top: 0; left: 0; } #browseBrowser { z-index: 20; } .wbBrowserDiv { box-shadow: 0 4px 9px -4px black; position: relative; width: 100%; top: 0; left: 0; background-color: #1d1a1b; z-index: 3; display: flex; white-space: nowrap; flex-wrap: nowrap; } #toggler { box-sizing: content-box; position:absolute; padding: 5px 0 5px 5px; left: -25px; top: 25px; z-index: 100; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; font-weight: bold; } #channelBrowser { position: absolute; height: 100%; width: 100%; background-color: #0d0a0b; z-index: 2; padding: 10px; overflow-x: hidden; overflow-y: scroll; scrollbar-width: none; scrollbar-color: #17191b #0c0e0f; } #channelBrowserInner { position: relative; height: auto; margin-bottom: 70px; color: white; } .chatContainer { position: absolute; height: calc(100% - 29px); width: 100%; margin-top: 0; z-index: 0; } .chatToggler { position: absolute; top: 0px; left: 0px; padding: 2px 5px 5px 2px; z-index: 3; } .chatToggleMenuButton:hover { background-color: rgb(50, 46, 46); } .chatToggleMenuButton { display: grid; padding: 5px; } .chatToggleMenuPlaceholder { display: grid; font-size: 30px; padding: 0px 5px; } #chatsOuter { width: 100%; position: absolute; margin-top: 0px; height: calc(100% + 41px); overflow: hidden; z-index: 0; color: white; } #chats { width: 100%; position: absolute; margin-top: -50px; height: calc(100% + 50px); overflow: hidden; z-index: 0; color: white; } .quickAddContainer { position: absolute; bottom: -30px; left: -5px; width: 100%; z-index: 20; } #quickAddPreview { position: absolute; bottom: 25px; max-width: 300px; width: 100%; background-color: #1d1a1b; } .searchBar { position: absolute; bottom: 0; margin: 0; padding: 1px 35px 5px 10px; width: calc(100% + 10px); font-size: 16px; background-color: #1d1a1b; border: 0; color: white; height: 30px; } #clearSearchGames, #clearSearch, #resetQuickAdd { visibility: hidden; } .searchButton { position: absolute; bottom: 0; right: 0; width: 30px; height: 30px; z-index: 20; } .searchButton:hover { background-color: rgb(50, 46, 46); } .searchButtonInner { width: 100%; height: 100%; right: 0; top: 0; padding: 5px; } #browser { z-index: 2; } #gameBrowser { z-index: -2; } .resetContainer { position: sticky; top: 5px; z-index: 3; width: 100%; } .browserInner { position: relative; height: auto; margin-bottom: 500px; display: flex; flex-wrap: wrap; align-content: flex-start; } .gameButtonInnerDiv { height: 0; padding-bottom: 139.73%; } .gameButtonInnerP { position: absolute; width: 100%; font-size: 33px; line-height: 32px; top: 43%; font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .favs { background-color: rgb(147, 48, 48); } #tutorialContainer a { color: #4ec0ed; } #tutorialContainer a:visited { color: #4ec0ed; } @media (hover: none) { .menuButton:hover { background-color: rgb(50, 46, 46); } } /style>/head>body> div idmain0drops> div idmain0drop classdropArea 0drop 0drops ondropdropFirst(event) ondragoverallowDrop(event) styledisplay: block; visibility: hidden;> /div> div idvertical0drops styledisplay: none; visibility: hidden;> div idvertical0dropUp classdropArea 0dropUp 0drops ondropdropNew(event, bigUp) ondragoverallowDrop(event) styledisplay: block; visibility: hidden;> /div> div idvertical0dropDown classdropArea 0dropDown 0drops ondropdropNew(event, bigDown) ondragoverallowDrop(event) styledisplay: block; visibility: hidden;> /div> /div> div idhorizontal0drops styledisplay: none; visibility: hidden;> div idvertical0dropLeft classdropArea 0dropLeft 0drops ondropdropNew(event, bigLeft) ondragoverallowDrop(event) styledisplay: block; visibility: hidden;> /div> div idvertical0dropRight classdropArea 0dropRight 0drops ondropdropNew(event, bigRight) ondragoverallowDrop(event) styledisplay: block; visibility: hidden;> /div> /div> /div> div idsidebar classsidebar> button idtoggler classtoggler autoHide>>/button> div idsidebar0drop classdropArea 0drop ondropdropFirst(event) ondragoverallowDrop(event)> /div> div idtutorialContainer styledisplay: none; background: rgb(29 44 51); color: white; position: absolute; z-index: 99; padding: 10px; width: 100%; top: 30px; line-height: 24px;> p>b>Info/b>/p> button onclickopenTutorial() styleposition: absolute; top: 5px; right: 5px; font-size: 15px; width: 30px; height: 30px;>X/button> p>You can drag and drop multiple streams from the sidebar to the player area on the left or the one aboth the sidebar. If theres only one or no stream active a simple click will also open that stream./p> p>a hrefhttps://imgur.com/a/yeet-tv-desktop-tour-dJBzaz5>Desktop images/a> / a hrefhttps://imgur.com/a/yeet-tv-mobile-tour-XsNDDIn>Mobile images/a>/p> p>br>b>Chat/b>/p> p>You can toggle the chats top/bottom parts in its upper left corner menu./p> p>br>b>Feedback and contact/b>/p> p>a hrefhttps://reddit.com/r/yeettv/>Subreddit/a> / a hrefhttps://reddit.com/message/compose/?to0100011101000111>Direct message/a>/p> /div> div idwatchBrowser classwbBrowser> div classwbBrowserDiv> button idopenStreamers classmenuButton> div stylemargin: 0 auto; display: flex; width: min-content; max-width: 100%;> div idopenStreamersText styleflex: 1 1 0; overflow: hidden; text-overflow: ellipsis;> No Chat /div> div idopenStreamersArrow styleflex: 0; margin-left: 3px;> /div> /div> /button> div classmenuSeparator>|/div> button idopenWatch classmenuButton>Browse/button> div classmenuSeparator>|/div> button classopenTutorial menuButton onclickopenTutorial() styleflex-grow: 0.1; font-size: 16px;>?/button> /div> div idchannelBrowser> div idchannelBrowserInner>/div> /div> div idchatContainer classchatContainer> button idchatToggler classchatToggler autoHide>span classiconChatMenu>/button> div idchatToggleMenu styleposition: absolute; display: grid; grid-template-columns: auto auto; grid-template-rows: 30px 30px 30px; padding: 2px; z-index: 4; display: none; background-color: #1d1a1b;> div classchatToggleMenuPlaceholder>/div> button idresetChat classchatToggleMenuButton>span classiconReset icon>/span>/button> button idchatTogglerTopUp classchatToggleMenuButton>span classiconChatTopUp icon>/span>/button> button idchatTogglerTopDown classchatToggleMenuButton>span classiconChatTopDown icon>/span>/button> button idchatTogglerBottomDown classchatToggleMenuButton>span classiconChatBottomDown icon>/span>/button> button idchatTogglerBottomUp classchatToggleMenuButton>span classiconChatBottomUp icon>/span>/button> /div> div idchatsOuter styleheight: calc(100% + 41px);> div idchats stylemargin-top: -50px;> /div> /div> /div> /div> div idbrowseBrowser classwbBrowser> div classwbBrowserDiv> button idopenBrowser classmenuButton>Chat/button> div classmenuSeparator>|/div> button idopenGameBrowser classmenuButton> div stylemargin: 0 auto; display: flex; width: min-content; max-width: 100%;> div idopenGameBrowserText styleflex: 1 1 0; overflow: hidden; text-overflow: ellipsis;> All /div> div idopenGameBrowserArrow styleflex: 0; margin-left: 3px;> ▾ /div> /div> /button> div classmenuSeparator>|/div> button classopenTutorial menuButton onclickopenTutorial() styleflex-grow: 0.1;>?/button> /div> div idbrowser classbrowser> div idbrowserScrollContainer classbrowserScrollContainer> div classresetContainer> button idtoggleInfo classtoggleInfo onclicktoggleInfo()>span classiconInfo icon>/span>/button> button idresetBrowser classresetBrowser onclickresetBrowser(browserInner)>span classiconReset icon>/span>/button> /div> div idbrowserInner classbrowserInner> /div> /div> div classquickAddContainer> div idquickAddPreview>/div> input idsearch classsearchBar typetext placeholderSearch aria-labelsearch> button idclearSearch classsearchButton titleClear (Esc) stylemargin-right:53px;> div classsearchButtonInner>span classiconCloseGray icon>/span>/div> /button> button idquickAddButton classsearchButton titleQuick add (Shift+Enter) stylemargin-top:0; margin-right:24px;> div classsearchButtonInner>span classiconQuoteGray icon>/span>/div> /button> button idsearchButton classsearchButton titleSearch (Enter) stylemargin-right:-5px;> div idsearchButtonInner classsearchButtonInner>span classiconPlayGray icon>/span>/div> /button> /div> /div> div idgameBrowser classbrowser> div idgameBrowserScrollContainer classbrowserScrollContainer> div classresetContainer> button idtoggleGameInfo classtoggleInfo onclicktoggleGameInfo()>span classiconInfo icon>/span>/button> button idresetGameBrowser classresetBrowser onclickresetBrowser(gameBrowserInner)>span classiconReset icon>/span>/button> /div> div idgameBrowserInner classbrowserInner> button classopenStream browserGame onclickchangeGame(); return false;> div classgameButtonInnerDiv> p classgameButtonInnerP> All /p> /div> /button> button classopenStream browserGame favs onclickchangeGame(#Favs); return false;> div classgameButtonInnerDiv> p classgameButtonInnerP> <3 /p> /div> /button> /div> /div> div classquickAddContainer> input idsearchGames classsearchBar typetext placeholderSearch games aria-labelgamesSearch> button idclearSearchGames classsearchButton titleClear (Esc) stylemargin-right:24px;> div classsearchButtonInner>span classiconCloseGray icon>/span>/div> /button> button idsearchGamesButton classsearchButton titleSearch (Enter) stylemargin-right:-5px;> div idsearchButtonInner classsearchButtonInner>span classiconPlayGray icon>/span>/div> /button> /div> /div> /div> /div> script srchttps://player.twitch.tv/js/embed/v1.js>/script> script> use strict; let a ; let b ; function ratio(a) { if (a0 h) { let r h, 0, 0; let r1 ratio(a1); let hratio r11; let vratio r12; r3 r1; for (let i 2; i a.length; i++) { let ri ratio(ai); let vratio2 ri2; let hratio2fixed ri1 / vratio2 * vratio; ri + 2 ri; hratio + hratio2fixed; } r1 hratio; r2 vratio; return r; } else if (a0 v) { let r v, 0, 0; let r1 ratio(a1); let hratio r11; let vratio r12; r3 r1; for (let i 2; i a.length; i++) { let ri ratio(ai); let hratio2 ri1; let vratio2fixed ri2 / hratio2 * hratio; ri + 2 ri; vratio + vratio2fixed; } r1 hratio; r2 vratio; return r; } else { return a; } } function distributor(useableW, useableH, positionX, positionY, sr) { if (sr0 h) { for (let i 3; i sr.length; i++) { let ri sri; let vratio (ri1 / ri2 * sr2) / sr1; let useableW2 vratio * useableW; distributor(useableW2, useableH, positionX, positionY, ri); positionX + useableW2; } } else if (sr0 v) { for (let i 3; i sr.length; i++) { let ri sri; let hratio (ri2 / ri1 * sr1) / sr2; let useableH2 hratio * useableH; distributor(useableW, useableH2, positionX, positionY, ri); positionY + useableH2; } } else { document.getElementById(sr3).style.width useableW + px; document.getElementById(sr3).style.height useableH + px; positionX (Math.round(positionX * 2) / 2).toFixed(1); document.getElementById(sr3).style.left positionX + px; positionY (Math.round(positionY * 2) / 2).toFixed(1); document.getElementById(sr3).style.top positionY + px; } } function distributorSidebar(useableW, useableH, positionX, positionY, sr) { if (sr0 h) { for (let i sr.length-1; i > 3; i--) { let ri sri; let vratio (ri1 / ri2 * sr2) / sr1; let useableW2 vratio * useableW; distributorSidebar(useableW2, useableH, positionX, positionY, ri); positionX + useableW2; } } else if (sr0 v) { for (let i 3; i sr.length; i++) { let ri sri; let hratio (ri2 / ri1 * sr1) / sr2; let useableH2 hratio * useableH; distributorSidebar(useableW, useableH2, positionX, positionY, ri); positionY + useableH2; } } else { document.getElementById(sr3).style.width useableW + px; document.getElementById(sr3).style.height useableH + px; positionX (Math.round(positionX * 2) / 2).toFixed(1); document.getElementById(sr3).style.left ; document.getElementById(sr3).style.right positionX + px; document.getElementById(sr3).style.zIndex 20; positionY (Math.round(positionY * 2) / 2).toFixed(1); document.getElementById(sr3).style.top positionY + px; } } let clientWidth document.documentElement.clientWidth; let clientHeight window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; let sr ratio(a); let sidebarSr ratio(b); let mHeight 0; let sbHeight 0; function bob(areaName) { let cw, ch, sw, sh; cw clientWidth; ch clientHeight; if (areaName main) { if (portrait || clientWidth/clientHeight1) { cw document.getElementById(sidebar).clientWidth; sw sr1; sh sr2; } else { cw sidebarHidden ? document.documentElement.clientWidth : document.documentElement.clientWidth - document.getElementById(sidebar).clientWidth; sw sr1; sh sr2; } } else { cw document.getElementById(sidebar).clientWidth; sw sidebarSr1; sh sidebarSr2; } let shn sh / sw * cw; let useableW; let useableH; let positionX; let positionY; if (shn ch) { useableW cw; useableH shn; positionX 0; positionY (ch - useableH) / 2; } else { useableW sw / sh * ch; useableH ch; positionX (cw - useableW) / 2; positionY 0; } if (areaName main) { mHeight useableH; if (portrait || clientWidth/clientHeight1) { document.getElementById(sidebar).style.top (useableH + sbHeight) + px; document.getElementById(sidebar).style.height calc(100% - + (useableH + sbHeight) + px); distributorSidebar(useableW, useableH, 0, 0, sr); if (b.length > 1) { sidebarSr ratio(b); bob(sidebar); } } else { if(shn ch) { document.getElementById(vertical0drops).style.display block; document.getElementById(horizontal0drops).style.display none; } else { document.getElementById(vertical0drops).style.display none; document.getElementById(horizontal0drops).style.display block; } distributor(useableW, useableH, positionX, positionY, sr); } } else { sbHeight useableH; if (portrait || clientWidth/clientHeight1) { document.getElementById(sidebar).style.top (useableH + mHeight) + px; document.getElementById(sidebar).style.height calc(100% - + (useableH + mHeight) + px); distributorSidebar(useableW, useableH, 0, mHeight, sidebarSr); } else { document.getElementById(sidebar).style.top useableH + px; document.getElementById(sidebar).style.height calc(100% - + useableH + px); distributorSidebar(useableW, useableH, 0, 0, sidebarSr); } } } let portrait true; window.addEventListener(orientationchange, checkOrientation); function checkOrientation() { let orientation (screen.orientation || {}).type || screen.mozOrientation || screen.msOrientation; if (orientation landscape-primary || orientation landscape-secondary) { portrait false; if(document.getElementById(sidebar).style.width 100%) { document.getElementById(sidebar).style.width ; document.getElementById(sidebar).style.maxWidth ; document.getElementById(sidebar).style.right sidebarHidden ? - + document.getElementById(sidebar).clientWidth + px : 0px; document.getElementById(toggler).innerHTML >; document.getElementById(toggler).style.display block; } } if(orientation portrait-primary || orientation portrait-secondary || clientWidth/clientHeight1) { portrait true; document.getElementById(sidebar).style.width 100%; document.getElementById(sidebar).style.maxWidth 100%; document.getElementById(sidebar).style.right 0px; document.getElementById(toggler).style.display none; } } window.onresize function () { clientWidth document.documentElement.clientWidth; clientHeight window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; document.getElementById(sidebar).style.top sbHeight + px; document.getElementById(sidebar).style.height calc(100% - + sbHeight + px); document.getElementById(main0drops).style.width sidebarHidden ? 100% : calc(100% - + document.getElementById(sidebar).clientWidth + px); document.getElementById(sidebar).style.right sidebarHidden ? - + document.getElementById(sidebar).clientWidth + px : 0px; checkOrientation(); if (a.length > 1) { bob(main); } if (b.length > 1) { bob(sidebar); } }; let streamNumber 0; let allStreams new Map(); let options { width: 100%, height: 100%, }; function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData(streamName, ev.target.id); ev.dataTransfer.setData(swap, false); let streamName ev.target.id; let img ev.target.firstElementChild.firstElementChild.cloneNode(true); document.body.appendChild(img); img.id dragImg; img.style.width 160px; img.style.height 90px; img.style.zIndex -999; img.style.top 0; img.style.right 0; ev.dataTransfer.setDragImage(img, 0, 0); let els document.getElementsByClassName(dropArea); Array.from(els).forEach((el) > { el.style.visibility visible; }); } function dragSwap(ev) { ev.dataTransfer.setData(streamName, ev.target.id); ev.dataTransfer.setData(swap, true); let img ev.target.parentElement.firstElementChild.cloneNode(true); document.body.appendChild(img); img.id dragImg; img.style.width 160px; img.style.height 90px; img.style.zIndex -999; img.style.top 0; img.style.right 0; ev.dataTransfer.setDragImage(img, 0, 0); let els document.getElementsByClassName(dropArea); Array.from(els).forEach((el) > { if (el.parentElement.id ! ev.target.parentElement.id) { el.style.visibility visible; } }); if(a.length 2 && ev.target.parentElement.id stream_1) { let els0 document.getElementsByClassName(0drops); Array.from(els0).forEach((el) > { el.style.visibility hidden; }); } } function dragEnd(ev) { ev.preventDefault(); let dragImg document.getElementById(dragImg); dragImg.parentElement.removeChild(dragImg); let els document.getElementsByClassName(dropArea); Array.from(els).forEach((el) > { el.style.visibility hidden; }); } let dragging false; let scrolling false; let touchStartTime; let touchXStart; let touchYStart; function touchDragStart(ev, el) { let touchLocation ev.targetTouches0; let touchX touchLocation.pageX; let touchY touchLocation.pageY; touchXStart touchX; touchYStart touchY; touchStartTime Date.now(); } function touchDrag(ev, el, dragBar) { if(!scrolling || dragBar) { let touchLocation ev.targetTouches0; let touchX touchLocation.pageX; let touchY touchLocation.pageY; if (dragging || dragBar) { ev.preventDefault(); let td document.getElementById(touchDraggable); if(!td) { asdf el.id; let newDiv; if(dragBar) { newDiv document.createElement(div); let streamName allStreams.get(el.parentElement.id).streamName; imgCacheReloadIncrease(); let img https://static-cdn.jtvnw.net/previews-ttv/live_user_ + streamName + -160x90.jpg?r + imgCacheReloadNumber; newDiv.style position:absolute; background-size: cover !important; width:160px; height:90px; background: url( + img + ) 0 0;; } else { newDiv el.cloneNode(true); newDiv.style.width 150px; } newDiv.id touchDraggable; newDiv.style.position absolute; newDiv.style.zIndex 999; document.body.appendChild(newDiv); let els2 document.getElementsByClassName(dropArea); Array.from(els2).forEach((el2) > { if (el2.parentElement.id ! el.parentElement.id) { el2.style.visibility visible; } }); } td document.getElementById(touchDraggable); td.style.left touchLocation.pageX+1 + px; td.style.top touchLocation.pageY+1 + px; let newTouchEl document.elementFromPoint(touchLocation.pageX, touchLocation.pageY); if(newTouchEl && touchEl ! newTouchEl) { if(touchEl ! null && touchEl.classList.contains(dropArea)) { touchEl.style.background ; } if(newTouchEl.classList.contains(dropArea)) { newTouchEl.style.background rgba(31, 31, 61, 0.7); } } touchEl newTouchEl; } else { if (touchXtouchXStart+40 && touchX>touchXStart-40 && touchYtouchYStart+40 && touchY>touchYStart-40 ) { if((Date.now() - touchStartTime) > 300) { dragging true; ev.preventDefault(); } } else { scrolling true; } } } } function touchDragEnd(ev, swap) { dragging false; scrolling false; let td document.getElementById(touchDraggable); if(td ! null) { ev.preventDefault(); let x parseInt(td.style.left); let y parseInt(td.style.top); td.parentElement.removeChild(td); let drop document.elementFromPoint(x, y); if (drop && drop.classList.contains(dropArea)) { let streamName asdf; let target document.elementFromPoint(x, y); let cl target.classList; if(cl.contains(0drop)) { dropFirst0(target, streamName, swap); } else if(cl.contains(mid)) { drop0(target, streamName, swap); } else if(cl.contains(up)) { dropNew0(target, streamName, swap, up) } else if(cl.contains(down)) { dropNew0(target, streamName, swap, down) } else if(cl.contains(left)) { dropNew0(target, streamName, swap, left) } else if(cl.contains(right)) { dropNew0(target, streamName, swap, right) } else if(cl.contains(0dropUp)) { dropNew0(target, streamName, swap, bigUp) } else if(cl.contains(0dropDown)) { dropNew0(target, streamName, swap, bigDown) } else if(cl.contains(0dropRight)) { dropNew0(target, streamName, swap, bigRight) } else if(cl.contains(0dropLeft)) { dropNew0(target, streamName, swap, bigLeft) } } } let els2 document.getElementsByClassName(dropArea); Array.from(els2).forEach((el2) > { el2.style.visibility hidden; el2.style.background ; }); } function dropFirst(ev) { ev.preventDefault(); let target ev.target; let streamName ev.dataTransfer.getData(streamName); let swap ev.dataTransfer.getData(swap); dropFirst0(target, streamName, swap) } function dropFirst0(target, streamName, swap) { target.style.background ; target.style.display none; let newStreamId; let targetId target.id; if (swap true) { let dragParentId document.getElementById(streamName).parentElement.id; let aPath dragParentId.split(_).slice(1); newStreamId streamIdPlaceholder; if (targetId main0drop) { a v; } else { b v; } let dragParentId2 dragParentId.split(_)0; if (dragParentId2 sbStream) { b removeStream(b, aPath, dragParentId); allStreams.set(newStreamId, allStreams.get(dragParentId)); allStreams.delete(dragParentId); document.getElementById(dragParentId).id newStreamId; b fixIds(b, sbStream); } else { a removeStream(a, aPath, dragParentId); allStreams.set(newStreamId, allStreams.get(dragParentId)); allStreams.delete(dragParentId); document.getElementById(dragParentId).id newStreamId; a fixIds(a, stream); } let dropZoneParentId targetId; if (dropZoneParentId sidebar0drop) { document.getElementById(streamIdPlaceholder).style.zIndex 20; aPath 1; b addStream(b, aPath, newStreamId, up); b fixIds(b, sbStream); } else { document.getElementById(streamIdPlaceholder).style.zIndex 3; aPath 1; a addStream(a, aPath, newStreamId, up); a fixIds(a, stream); } if (dropZoneParentId sidebar0drop && dragParentId2 sbStream) { sidebarSr ratio(b); bob(sidebar); } else if (dropZoneParentId main0drop && dragParentId2 stream) { sr ratio(a); bob(main); } else { if (a.length > 1) { sr ratio(a); bob(main); } if (b.length > 1) { sidebarSr ratio(b); bob(sidebar); } } pushState(false); } else { dropFirst3(targetId, streamName, true); pushState(true); } let els document.getElementsByClassName(dropArea); Array.from(els).forEach((el) > { el.style.visibility hidden; }); } function dropFirst3(targetId, streamName, pushState) { let newStreamId ; if (targetId main0drop) { document.getElementById(main0drop).style.display none; newStreamId stream_1; a v, s, 16, 9, newStreamId; } else { document.getElementById(sidebar0drop).style.display none; newStreamId sbStream_1; b v, s, 16, 9, newStreamId; } addStreamDiv(newStreamId, streamName, null, pushState); if (targetId main0drop) { a fixIds(a, stream); sr ratio(a); bob(main); } else { b fixIds(b, sbStream); sidebarSr ratio(b); bob(sidebar); } if(allChannels.size1) { document.getElementById(chats).lastChild.style.zIndex 2; document.getElementById(openStreamersText).innerHTML streamName; document.getElementById(openStreamersArrow).innerHTML ▴; } } function drop(ev) { ev.preventDefault(); let target ev.target; let streamName ev.dataTransfer.getData(streamName); let swap ev.dataTransfer.getData(swap); drop0(target, streamName, swap); } function drop0(target, streamName, swap) { target.style.background ; let dropZoneParentId target.parentElement.id; if (swap true) { let dragParentId document.getElementById(streamName).parentElement.id; let streamIdPlaceholder streamIdPlaceholder; let placeholder allStreams.get(dragParentId); allStreams.set(dragParentId, allStreams.get(dropZoneParentId)); allStreams.set(dropZoneParentId, placeholder); let dragDiv document.getElementById(dragParentId); let dropDiv document.getElementById(dropZoneParentId); let quality allStreams.get(dragParentId).streamObject.getQuality(); allStreams.get(dragParentId).streamObject.setQuality(allStreams.get(dropZoneParentId).streamObject.getQuality()); allStreams.get(dropZoneParentId).streamObject.setQuality(quality); dropDiv.id streamIdPlaceholder; dragDiv.id dropZoneParentId; document.getElementById(streamIdPlaceholder).id dragParentId; let height dropDiv.style.height; let width dropDiv.style.width; let top dropDiv.style.top; let left dropDiv.style.left; let right dropDiv.style.right; let zIndex dropDiv.style.zIndex; dropDiv.style.height dragDiv.style.height; dropDiv.style.width dragDiv.style.width; dropDiv.style.top dragDiv.style.top; dropDiv.style.left dragDiv.style.left; dropDiv.style.right dragDiv.style.right; dropDiv.style.zIndex dragDiv.style.zIndex; dragDiv.style.height height; dragDiv.style.width width; dragDiv.style.top top; dragDiv.style.left left; dragDiv.style.right right; dragDiv.style.zIndex zIndex; pushState(false); } else { let previousStreamName allStreams.get(dropZoneParentId).streamName; if (allChannels.has(streamName)) { allChannels.set(streamName, allChannels.get(streamName) + 1); } else { let newChat document.createElement(div); newChat.style position:absolute; left:0; width:100%; height:100%; overflow:hidden; z-index:-2; background-color: #0d0a0b;; newChat.id streamName + Chat; newChat.classList.add(chat); document.getElementById(chats).appendChild(newChat); allChannels.set(streamName, 1); } if (allChannels.get(previousStreamName) > 1) { allChannels.set(previousStreamName, allChannels.get(previousStreamName) - 1); } else { let oldChat document.getElementById(previousStreamName + Chat); oldChat.parentElement.removeChild(oldChat); allChannels.delete(previousStreamName); } if(document.getElementById(openStreamersText).innerHTMLpreviousStreamName) { document.getElementById(openStreamersText).innerHTML streamName; document.getElementById(streamName + Chat).style.zIndex 2; } getAllChannels(true); let imgUrl https://static-cdn.jtvnw.net/previews-ttv/live_user_ + streamName + -160x90.jpg?r + imgCacheReloadNumber; document.getElementById(dropZoneParentId).firstElementChild.style.backgroundImage url( + imgUrl + ); allStreams.get(dropZoneParentId).streamObject.setChannel(streamName); allStreams.set(dropZoneParentId, { streamName: streamName, streamObject: allStreams.get(dropZoneParentId).streamObject, uid: s + streamNumber++ }); pushState(true); } let els document.getElementsByClassName(dropArea); Array.from(els).forEach((el) > { el.style.visibility hidden; }); } function dropNew(ev, direction) { ev.preventDefault(); let target ev.target; let streamName ev.dataTransfer.getData(streamName); let swap ev.dataTransfer.getData(swap); dropNew0(target, streamName, swap, direction); } function dropNew0(target, streamName, swap, direction) { target.style.background ; if (swap true) { let dragParentId document.getElementById(streamName).parentElement.id; let aPath dragParentId.split(_).slice(1); let newStreamId streamIdPlaceholder; let dragParentId2 dragParentId.split(_)0; if (dragParentId2 sbStream) { b removeStream(b, aPath, dragParentId); allStreams.set(newStreamId, allStreams.get(dragParentId)); allStreams.delete(dragParentId); document.getElementById(dragParentId).id newStreamId; b fixIds(b, sbStream); } else { a removeStream(a, aPath, dragParentId); allStreams.set(newStreamId, allStreams.get(dragParentId)); allStreams.delete(dragParentId); document.getElementById(dragParentId).id newStreamId; a fixIds(a, stream); } let dropZoneParentId target.parentElement.id; let newStreamId2 dropZoneParentId.split(_)0; if (newStreamId2 sbStream) { document.getElementById(newStreamId).style.zIndex 20; aPath dropZoneParentId.split(_).slice(1); b addStream(b, aPath, newStreamId, direction); b fixIds(b, sbStream); } else { document.getElementById(newStreamId).style.zIndex 3; aPath dropZoneParentId.split(_).slice(1); a addStream(a, aPath, newStreamId, direction); a fixIds(a, stream); } if (newStreamId2 sbStream && dragParentId2 sbStream) { sidebarSr ratio(b); bob(sidebar); } else if (newStreamId2 stream && dragParentId2 stream) { sr ratio(a); bob(main); } else { if (a.length > 1) { sr ratio(a); bob(main); } if (b.length > 1) { sidebarSr ratio(b); bob(sidebar); } } pushState(false); } else { let dropZoneParentId target.parentElement.id; let aPath dropZoneParentId.split(_).slice(1); let newStreamId streamIdPlaceholder; let newStreamId2 dropZoneParentId.split(_)0; if (newStreamId2 sbStream) { b addStream(b, aPath, newStreamId, direction); addStreamDiv(newStreamId, streamName, null, true); b fixIds(b, sbStream); sidebarSr ratio(b); bob(sidebar); } else { a addStream(a, aPath, newStreamId, direction); addStreamDiv(newStreamId, streamName, null, true); a fixIds(a, stream); sr ratio(a); bob(main); } pushState(true); } let els document.getElementsByClassName(dropArea); Array.from(els).forEach((el) > { el.style.visibility hidden; }); } function addStream(a, aPath, newStreamId, direction) { if (aPath.length 1) { let orientation a0; switch (direction) { case up: if (orientation v) { a.splice(aPath0, 0, s, 16, 9, newStreamId); } else { aaPath0 v, s, 16, 9, newStreamId, aaPath0; } break; case right: if (orientation h) { a.splice(parseInt(aPath0) + 1, 0, s, 16, 9, newStreamId); } else { aaPath0 h, aaPath0, s, 16, 9, newStreamId; } break; case down: if (orientation v) { a.splice(parseInt(aPath0) + 1, 0, s, 16, 9, newStreamId); } else { aaPath0 v, aaPath0, s, 16, 9, newStreamId; } break; case left: if (orientation h) { a.splice(aPath0, 0, s, 16, 9, newStreamId); } else { aaPath0 h, s, 16, 9, newStreamId, aaPath0; } break; case bigUp: a.splice(1, 0, s, 16, 9, newStreamId); break; case bigRight: if (a.length 2) { if(a10 h) { a1.splice(a1.length, 0, s, 16, 9, newStreamId); } else { a v, h, a1, s, 16, 9, newStreamId; } } else { a v, h, a, s, 16, 9, newStreamId; } break; case bigDown: a.splice(a.length, 0, s, 16, 9, newStreamId); break; case bigLeft: if (a.length 2) { if(a10 h) { a1.splice(1, 0, s, 16, 9, newStreamId); } else { a v, h, s, 16, 9, newStreamId, a1; } } else { a v, h, s, 16, 9, newStreamId, a; } break; } return a; } else { let a2 aaPath0; let aPath2 aPath.slice(1); let newStreamId2 newStreamId; let rA addStream(a2, aPath2, newStreamId2, direction); aaPath0 rA; return a; } } let quality null; function addStreamDiv(newStreamId, streamName, uid, pushState) { const newDiv document.createElement(div); newDiv.style position: absolute; width: 20px; height: 20px; right:0; z-index: 3; background-color: black; newDiv.id newStreamId; let streamId uid ? uid : s + streamNumber; newDiv.classList.add(stream); let sbStreamDiv document.getElementById(streamName); let img; if(sbStreamDiv) { img document.getElementById(streamName).firstElementChild.firstElementChild.cloneNode(true); } else { imgCacheReloadIncrease(); let imgUrl https://static-cdn.jtvnw.net/previews-ttv/live_user_ + streamName + -160x90.jpg?r + imgCacheReloadNumber; img document.createElement(div); img.style position:absolute; background-size: cover !important; background: url( + imgUrl + ) 0 0; background-color: black;; } img.style.width 100%; img.style.height 100%; img.style.zIndex 1; img.style.top 0; img.style.right 0; let loading document.createElement(div); loading.style position:absolute; background-size: cover !important; height:30px; width:min-content; min-height:min-content; max-width:100%; max-height:100%; white-space: nowrap; overflow: hidden; margin: auto; top: 0; right: 0; bottom: 0; left: 0; padding:2px; color: white; font-size: 20px; font-weight: bold; text-overflow: ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000;; loading.innerHTML Loading...; img.appendChild(loading); newDiv.appendChild(img); newDiv.insertAdjacentHTML( beforeend, ` div ids` + streamNumber + `drag classdragBar autoHide draggabletrue ondragstartdragSwap(event) ondragenddragEnd(event) stylevisibility:visible;> button classresetStream` + streamNumber + ` resetStream onclickresetStream(this) styleopacity:1;>div classstreamButtonInner>span classiconReset icon>/span>/div>/button> button classcloseStream` + streamNumber + ` closeStream onclickcloseStream(this) styleopacity:1;>div classstreamButtonInner>span classiconClose icon>/span>/div>/button> /div> div ids` + streamNumber + `drop classdropArea mid ondropdrop(event) ondragoverallowDrop(event) styleposition:absolute; top:0; left:0; height:100%; width:100%; visibility:hidden; z-index:20;>/div> div ids` + streamNumber + `updrop classdropArea up ondropdropNew(event, up) ondragoverallowDrop(event) styleposition:absolute; top:0; left:0; height:20%; width:100%; visibility:hidden; z-index:21;>/div> div ids` + streamNumber + `downdrop classdropArea down ondropdropNew(event, down) ondragoverallowDrop(event) styleposition:absolute; bottom:0; left:0; height:20%; width:100%; visibility:hidden; z-index:21;>/div> div ids` + streamNumber + `leftdrop classdropArea left ondropdropNew(event, left) ondragoverallowDrop(event) styleposition:absolute; top:0; left:0; height:100%; width:15%; visibility:hidden; z-index:22;>/div> div ids` + streamNumber + `rightdrop classdropArea right ondropdropNew(event, right) ondragoverallowDrop(event) styleposition:absolute; top:0; right:0; height:100%; width:15%; visibility:hidden; z-index:22;>/div> `); document.body.appendChild(newDiv); let options2 options; options2.channel streamName; let newPlayer new Twitch.Player(newStreamId, options2); newPlayer.addEventListener(Twitch.Player.READY, function () { for (let k, v of allStreams) { if (v.streamObject newPlayer) { document.getElementById(k).firstElementChild.style.zIndex -9; document.getElementById(k).firstElementChild.removeChild(document.getElementById(k).firstElementChild.firstElementChild); } } }, false); allStreams.set(newStreamId, { streamName: streamName, streamObject: newPlayer, uid: streamId }); allStreams.get(newStreamId).streamObject.setChannel(streamName); if (allChannels.has(streamName) && allChannels.get(streamName)>0) { allChannels.set(streamName, allChannels.get(streamName) + 1); } else { allChannels.set(streamName, 1); let newChat document.createElement(div); newChat.style position:absolute; left:0; width:100%; height:100%; overflow:hidden; background-color: #0d0a0b;; newChat.style.zIndex -2; newChat.id streamName + Chat; newChat.classList.add(chat); document.getElementById(chats).appendChild(newChat); } getAllChannels(pushState); let dragBar s + streamNumber + drag; newDiv.addEventListener(mouseover, function (ev) { document.getElementById(dragBar).style.opacity 1; }); newDiv.addEventListener(mouseout, function (ev) { document.getElementById(dragBar).style.opacity 0; }); newDiv.addEventListener(mousemove, function (ev) { document.getElementById(dragBar).style.opacity 1; }); document.addEventListener(dragenter, function (ev) { if (event.target.className dropArea) { event.target.style.background rgba(31, 31, 61, 0.7); } }, false); document.addEventListener(dragleave, function (ev) { if (event.target.className dropArea) { event.target.style.background ; } }, false); let els0 document.getElementsByClassName(dragBar); Array.from(els0).forEach((el) > { el.addEventListener(touchmove, (ev) > touchDrag(ev, el, true)); el.addEventListener(touchend, (ev) > touchDragEnd(ev, true)); el.addEventListener(touchcancel, (ev) > touchDragEnd(ev, true)); }); streamNumber++; } function resetStream(th) { let stream th.parentElement.parentElement; let streamId th.parentElement.parentElement.id; let streamName allStreams.get(streamId).streamName; let oldStream stream.getElementsByTagName(iframe)0; let oldQuality allStreams.get(streamId).streamObject.getQuality(); stream.firstElementChild.style.zIndex 9; stream.removeChild(oldStream); let options2 options; options2.channel streamName; let newPlayer new Twitch.Player(streamId, options2); newPlayer.addEventListener(Twitch.Player.READY, function () { stream.firstElementChild.style.zIndex -9; newPlayer.removeEventListener(Twitch.Player.READY); }, false); newPlayer.addEventListener(Twitch.Player.PLAYING, function () { newPlayer.setQuality(oldQuality); newPlayer.removeEventListener(Twitch.Player.PLAYING); }, false); allStreams.set(streamId, { streamName: streamName, streamObject: newPlayer, uid: allStreams.get(streamId).uid }); allStreams.get(streamId).streamObject.setChannel(streamName); } function closeStream(th) { let parentId th.parentNode.parentNode.id; let aPath parentId.split(_).slice(1); let newStreamId parentId.split(_)0; if (newStreamId sbStream) { b removeStream(b, aPath, newStreamId); } else { a removeStream(a, aPath, newStreamId); } let previousStreamName allStreams.get(parentId).streamName; if (allChannels.get(previousStreamName) > 1) { allChannels.set(previousStreamName, allChannels.get(previousStreamName) - 1); } else { allChannels.delete(previousStreamName); let chat document.getElementById(previousStreamName + Chat); let wasActiveChat (chat.style.zIndex2); chat.parentNode.removeChild(chat); if(allChannels.size 0) { document.getElementById(openStreamersText).innerHTML No Chat; document.getElementById(openStreamersArrow).innerHTML ; document.getElementById(channelBrowser).style.zIndex 2; document.getElementById(chatContainer).style.zIndex -2; } else if(wasActiveChat) { let lastAddedChat document.getElementById(chats).lastChild; let streamName lastAddedChat.id.slice(0, -4); document.getElementById(openStreamersText).innerHTML streamName; if (document.getElementById(channelBrowser).style.zIndex -2) { document.getElementById(openStreamersArrow).innerHTML ▾; } else { document.getElementById(openStreamersArrow).innerHTML ▴; } lastAddedChat.style.zIndex 2; addChatIframe(streamName); } } getAllChannels(true); allStreams.delete(parentId); document.getElementById(parentId).remove(); if (newStreamId sbStream) { b fixIds(b, sbStream); if (b.length > 1) { sidebarSr ratio(b); bob(sidebar); } else if (portrait || clientWidth/clientHeight1) { sbHeight 0; document.getElementById(sidebar).style.top mHeight + px; document.getElementById(sidebar).style.height calc(100% - + mHeight + px); } } else { a fixIds(a, stream); if (a.length > 1) { sr ratio(a); bob(main); } else if (portrait || clientWidth/clientHeight1) { mHeight 0; document.getElementById(sidebar).style.top sbHeight + px; document.getElementById(sidebar).style.height calc(100% - + sbHeight + px); if (b.length > 1) { sidebarSr ratio(b); bob(sidebar); } } } pushState(true); } function removeStream(au, aPath, newStreamId) { if (aPath.length 1) { au.splice(parseInt(aPath0), 1); if (newStreamId.split(_)0 sbStream) { if (b.length 1) { sbHeight 0; document.getElementById(sidebar).style.top 0 + px; document.getElementById(sidebar).style.height calc(100% - + 0 + px); document.getElementById(sidebar0drop).style.display block; } } else { if (a.length 1) { mHeight 0; document.getElementById(main0drop).style.display block; } } return au; } else { let a2 auaPath0; let aPath2 aPath.slice(1); let newStreamId2 newStreamId + _ + aPath20; let rAu removeStream(a2, aPath2, newStreamId2); if (rAu.length 3) { rAu rAu1; if (rAu0 s) { auaPath0 rAu; } else { au.splice(aPath0, 1); for (let i 1; i rAu.length; i++) { au.splice(parseInt(aPath0) + i - 1, 0, rAui); } } } else { auaPath0 rAu; } return au; } } function fixIds(au, newStreamId) { let au2 fixIds2(au, maerts); return fixIds2(au2, newStreamId); } function fixIds2(au, newStreamId) { if (au0 h || au0 v) { for (let i 1; i au.length; i++) { let newStreamId2 newStreamId + _ + i; aui fixIds2(aui, newStreamId2); } return au; } else { if (au3 ! newStreamId) { document.getElementById(au3).id newStreamId; allStreams.set(newStreamId, allStreams.get(au3)); allStreams.delete(au3); au3 newStreamId; } return au; } } let sidebarHidden false; document.getElementById(toggler).addEventListener(click, toggleSidebar); function toggleSidebar() { sidebarHidden parseInt(document.defaultView.getComputedStyle(document.getElementById(sidebar)).right) 0; if (sidebarHidden) { document.getElementById(sidebar).style.width 339px; document.getElementById(sidebar).style.right ; document.getElementById(toggler).innerHTML >; sidebarHidden false; } else { document.getElementById(sidebar).style.right - + document.getElementById(sidebar).clientWidth + px; document.getElementById(toggler).innerHTML ; sidebarHidden true; } document.getElementById(main0drops).style.width sidebarHidden ? 100% : calc(100% - + document.getElementById(sidebar).clientWidth + px); if(a.length>1) { sr ratio(a); bob(main); } } document.getElementById(chatToggler).addEventListener(mouseover, chatToggle); function chatToggle() { document.getElementById(chatToggleMenu).style.display grid; }; document.getElementById(chatToggleMenu).addEventListener(mouseleave, function (event) { document.getElementById(chatToggleMenu).style.display none; }); document.getElementById(chatTogglerTopUp).addEventListener(click, () > chatToggleMenu(TopUp)); document.getElementById(chatTogglerTopDown).addEventListener(click, () > chatToggleMenu(TopDown)); document.getElementById(chatTogglerBottomUp).addEventListener(click, () > chatToggleMenu(BottomUp)); document.getElementById(chatTogglerBottomDown).addEventListener(click, () > chatToggleMenu(BottomDown)); function chatToggleMenu(button) { switch(button) { case TopUp: if (document.getElementById(chats).style.marginTop 0px) { document.getElementById(chats).style.height calc(100% + 50px); document.getElementById(chats).style.marginTop -50px; localStorage.setItem(chatLevelTop, 1); } else if (document.getElementById(chats).style.marginTop -50px) { document.getElementById(chats).style.height calc(100% + 150px); document.getElementById(chats).style.marginTop -150px; localStorage.setItem(chatLevelTop, 2); } else if (document.getElementById(chats).style.marginTop -150px) { document.getElementById(chats).style.height calc(100% + 655px); document.getElementById(chats).style.marginTop -655px; localStorage.setItem(chatLevelTop, 3); } else if (document.getElementById(chats).style.marginTop -655px) { document.getElementById(chats).style.height calc(100% + 705px); document.getElementById(chats).style.marginTop -705px; localStorage.setItem(chatLevelTop, 4); } else if (document.getElementById(chats).style.marginTop -705px) { document.getElementById(chats).style.height calc(100% + 805px); document.getElementById(chats).style.marginTop -805px; localStorage.setItem(chatLevelTop, 5); } break; case TopDown: if (document.getElementById(chats).style.marginTop -805px) { document.getElementById(chats).style.marginTop -705px; document.getElementById(chats).style.height calc(100% + 705px); localStorage.setItem(chatLevelTop, 4); } else if (document.getElementById(chats).style.marginTop -705px) { document.getElementById(chats).style.marginTop -655px; document.getElementById(chats).style.height calc(100% + 655px); localStorage.setItem(chatLevelTop, 3); } else if (document.getElementById(chats).style.marginTop -655px) { document.getElementById(chats).style.marginTop -150px; document.getElementById(chats).style.height calc(100% + 150px); localStorage.setItem(chatLevelTop, 2); } else if (document.getElementById(chats).style.marginTop -150px) { document.getElementById(chats).style.marginTop -50px; document.getElementById(chats).style.height calc(100% + 50px); localStorage.setItem(chatLevelTop, 1); } else if (document.getElementById(chats).style.marginTop -50px) { document.getElementById(chats).style.marginTop 0px; document.getElementById(chats).style.height 100%; localStorage.setItem(chatLevelTop, 0); } break; case BottomUp: if (document.getElementById(chatsOuter).style.height calc(100% + 95px)) { document.getElementById(chatsOuter).style.height calc(100% + 41px); localStorage.setItem(chatLevelBottom, 1); } else if (document.getElementById(chatsOuter).style.height calc(100% + 41px)) { document.getElementById(chatsOuter).style.height 100%; localStorage.setItem(chatLevelBottom, 0); } break; case BottomDown: if (document.getElementById(chatsOuter).style.height 100%) { document.getElementById(chatsOuter).style.height calc(100% + 41px); localStorage.setItem(chatLevelBottom, 1); } else if (document.getElementById(chatsOuter).style.height calc(100% + 41px)) { document.getElementById(chatsOuter).style.height calc(100% + 95px); localStorage.setItem(chatLevelBottom, 2); } break; default: break; } } document.getElementById(resetChat).addEventListener(click, () > resetChat()); function resetChat() { let chats document.getElementsByClassName(chat); Array.from(chats).forEach((oldChat) > { if(oldChat.style.zIndex2) { let newChat oldChat; document.getElementById(chats).removeChild(oldChat); document.getElementById(chats).appendChild(newChat); } }); } let startTime 0; let browserElement document.getElementById(browserScrollContainer); browserElement.addEventListener(scroll, function (event) { if (browserElement.scrollHeight - browserElement.scrollTop browserElement.clientHeight + 750) { if ((Date.now() - startTime) > 1000) { startTime Date.now(); getStreams(); } } }); let gameStartTime 0; let gameBrowserElement document.getElementById(gameBrowserScrollContainer); gameBrowserElement.addEventListener(scroll, function (event) { if (gameBrowserElement.scrollHeight - gameBrowserElement.scrollTop gameBrowserElement.clientHeight + 750) { if ((Date.now() - gameStartTime) > 1000) { gameStartTime Date.now(); getGames(); } } }); let asdf; let touchEl null; let game ; let gameName ; let searchQuery ; let after ; let end false; let language ; function getStreams() { if(!end) { let requestString; if(searchQuery ! ) { requestString https://api.yeet.tv/search/yeet_ttv_search?query + searchQuery; if(after ! ) { requestString + &after + after; } if(language ! ) { requestString + &broadcaster_language + language; } getStreams2(requestString, null); } else if (gameName #Favs) { if (userID ! ) { let favsRequestString https://api.twitch.tv/helix/channels/followed?user_id + userID + &first100&sortbylast_broadcast; if(after ! ) { favsRequestString + &after + after; } let favsRequestURL new URL(favsRequestString); requestString https://api.twitch.tv/helix/streams?user_id; fetch(favsRequestURL, { headers: { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq, Authorization: Bearer + userAuth } }) .then(function (response) { return response.json(); }) .then(function (myJson) { let ids ; for (let i of myJson.data) { ids.push(i.broadcaster_id); } requestString + ids.join(&user_id); if(myJson.pagination.cursor) { after myJson.pagination.cursor; } else { after ; } if(myJson.total 100) { end true; } getStreams2(requestString, myJson); }); } } else if(game) { requestString https://api.yeet.tv/streams/yeet_ttv_streams?game_id + encodeURIComponent(game); if(after ! ) { requestString + &after + after; } if(language ! ) { requestString + &language + language; } getStreams2(requestString, null); } else { requestString https://api.yeet.tv/streams/yeet_ttv_streams?; if(after ! ) { requestString + &after + after; } if(language ! ) { requestString + &language + language; } getStreams2(requestString, null); } } } function getStreams2(requestString, follows) { let requestURL new URL(requestString); let headers { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq }; if(searchQuery && gameName #Favs) { headers { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq, Authorization: Bearer + userAuth }; } fetch(requestURL, { headers: headers }) .then(function (response) { return response.json(); }) .then(function (myJson) { if(myJson.pagination.cursor) { after myJson.pagination.cursor; } else { after ; } if (searchQuery && gameName #Favs && follows.total > myJson.data.length) { for (let i0; ifollows.total; i++) { if(!myJson.data.some(s > s.user_id follows.datai.broadcaster_id)) { follows.datai.offline true; myJson.data.push(follows.datai); } } after ; } let browserInner document.getElementById(browserInner); for(let i0; i5; i++) { browserInner.removeChild(browserInner.lastChild); } let x ; for (let i of myJson.data) { let preview; let gameName; let extras; if(i.offline || i.started_at ) { preview https://static-cdn.jtvnw.net/ttv-static/404_preview-440x248.jpg; gameName i.game_name; extras Offline; } else { let d1 new Date(i.started_at); let d2 Date.now(); if (d2 d1) { d2.setDate(d2.getDate() + 1); } let timeOnline Math.floor((d2-d1) / 1000 / 60); if(timeOnline > 60) { timeOnline Math.floor(timeOnline / 60) + h; } else { timeOnline + m; } preview https://static-cdn.jtvnw.net/previews-ttv/live_user_{streamer}-{width}x{height}.jpg.replace({streamer}, (i.user_login || i.broadcaster_login)).replace({height}, 248).replace({width}, 440) + ?r + imgCacheReloadNumber; gameName i.game_name; extras (i.viewer_count ? (transformViews(i.viewer_count) + ) : ) + (i.language || i.broadcaster_language) + + timeOnline; } x + button id + (i.user_login || i.broadcaster_login) + classopenStream browserStream onclickchangeChannel(\ + (i.user_login || i.broadcaster_login) + \, 1); return false; draggabletrue ondragstartdrag(event) ondragenddragEnd(event)> + div stylepadding-bottom:56.25%; height:0;> + div realsrc + preview + styleposition:absolute; background-size: cover !important; width:100%; height:100%; background-image: none;>/div>/div> + /div> + div classinfo onmouseoverif(!showInfo){this.getElementsByTagName(\p\)1.style.display\block\; this.style.background\rgb(0,0,0,0.7)\; this.style.width\100%\}; onmouseoutif(!showInfo){this.getElementsByTagName(\p\)1.style.display\none\; this.style.background\\; this.style.width\\;} styleposition:absolute; max-width:100%; white-space: nowrap; bottom:0; overflow: hidden; + (showInfo ? width:100%; background: rgb(0,0,0,0.7); : ) + > + p stylefont-size:20px; font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; padding-left:5px; padding-right:2px;> + (i.user_name || i.broadcaster_name || i.display_name) + /p> + p style + (showInfo ? display:block; : display:none;) + font-size:16px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; padding-left:5px; padding-right:2px;> + (i.offline ? : (gameName + br> + i.title + br>)) + extras + /p> + /div>/button>; } for(let i0; i5; i++) { x + div classbrowserStream hidden>/div>; } document.getElementById(browserInner).innerHTML + x; streamsLazyLoading(); let els document.getElementsByClassName(browserStream); Array.from(els).forEach((el) > { el.addEventListener(touchstart, (ev) > touchDragStart(ev, el)); el.addEventListener(touchmove, (ev) > touchDrag(ev, el, false)); el.addEventListener(touchend, (ev) > touchDragEnd(ev, false)); el.addEventListener(touchcancel, (ev) > touchDragEnd(ev, false)); }); }); } let gameOffset 0; let gameAfter ; let gameSearchQuery ; function getGames() { let requestGameString; if(gameSearchQuery ) { requestGameString https://api.yeet.tv/games/yeet_ttv_games?; if(gameAfter ! ) { requestGameString + &after + gameAfter; } fetch(requestGameString, { headers: { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq } }) .then(function (gameResponse) { return gameResponse.json(); }) .then(function (gameJson) { if(gameJson.pagination.cursor) { gameAfter gameJson.pagination.cursor; } else { gameAfter ; } getGames2(gameJson); }); } else { requestGameString https://api.yeet.tv/gamesearch/yeet_ttv_gamesearch?query + encodeURIComponent(gameSearchQuery); if(gameAfter ! ) { requestGameString + &after + gameAfter; } fetch(requestGameString, { headers: { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq } }) .then(function (gameResponse) { return gameResponse.json(); }) .then(function (gameJson) { if(gameJson.pagination.cursor) { gameAfter gameJson.pagination.cursor; } else { gameAfter ; } getGames3(gameJson); }); } } function getGames2(gameJson) { let gameBrowserInner document.getElementById(gameBrowserInner); for(let i0; i10; i++) { gameBrowserInner.removeChild(gameBrowserInner.lastChild); } let z ; for (let i in gameJson.data) { z + button classopenStream browserGame onclickchangeGame(\ + gameJson.datai.name.replace(\, \\\) + \, \ + gameJson.datai.id + \); return false;> + div stylepadding-bottom:139.73%; height:0;> + div realsrc + gameJson.datai.box_art_url.replace({height}, 204).replace({width}, 146) + styleposition:absolute; background-size: cover !important; width:100%; height:100%; background-image: none;>/div> + div classgameInfo styleposition:absolute; width:100%; bottom:0; text-align:left; overflow:hidden; background-color:rgb(0,0,0,0.7); visibility: + (showGameInfo ? visible : hidden) + ;> + p stylefont-size:16px; font-weight:bold; overflow:hidden; text-overflow:ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; padding-left:5px; padding-right:2px;> + gameJson.datai.name + /p> //+ p stylefont-size:16px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; padding-left:5px; padding-right:2px;> + transformViews(gameJson.datai.viewers) + /p> + /div> + /div> + /button>; } for(let i0; i10; i++) { z + div classbrowserGame hidden>/div>; } document.getElementById(gameBrowserInner).innerHTML + z; streamsLazyLoading(); } function getGames3(gameJson) { let gameBrowserInner document.getElementById(gameBrowserInner); for(let i0; i10; i++) { gameBrowserInner.removeChild(gameBrowserInner.lastChild); } gameJson.data.sort((a, b) > { a a.name.toLowerCase(); b b.name.toLowerCase(); return (a b) ? -1 : (a > b) ? 1 : 0; }); let z ; for (let i in gameJson.data) { z + button classopenStream browserGame onclickchangeGame(\ + gameJson.datai.name.replace(\, \\\) + \, \ + gameJson.datai.id + \); return false;> + div stylepadding-bottom:139.73%; height:0;> + div realsrc + gameJson.datai.box_art_url.replace(52x72, 146x204).replace({height}, 204).replace({width}, 146) + styleposition:absolute; background-size: cover !important; width:100%; height:100%; background-image: none;>/div> + div classgameInfo styleposition:absolute; width:100%; bottom:0; text-align:left; overflow:hidden; background-color:rgb(0,0,0,0.7); visibility: + (showGameInfo ? visible : hidden) + ;> + p stylefont-size:16px; font-weight:bold; overflow:hidden; text-overflow:ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; padding-left:5px; padding-right:2px;> + gameJson.datai.name + /p> + /div> + /div> + /button>; } for(let i0; i10; i++) { z + div classbrowserGame hidden>/div>; } document.getElementById(gameBrowserInner).innerHTML + z; streamsLazyLoading(); } function changeGame(newGameName, gameId) { if (newGameName ) { document.getElementById(openGameBrowserText).innerHTML All; } else if(newGameName #Favs) { document.getElementById(openGameBrowserText).innerHTML Followed; } else { document.getElementById(openGameBrowserText).innerHTML newGameName; } document.getElementById(openGameBrowserArrow).innerHTML ▾; game gameId; gameName newGameName; localStorage.setItem(category, JSON.stringify({id: gameId, name: newGameName})); resetBrowser(browserInner); openBrowserNoReturn(); } let languages new Map( , All Languages, en, English, cs, Čeština, da, Dansk, de, Deutsch, es, Español, fr, Français, it, Italiano, hu, Magyar, nl, Nederlands, no, Norsk, pl, Polski, pt, Português, ro, Română, sk, Slovenčina, fi, Suomi, sv, Svenska, vi, Tiếng Việt, tr, Türkçe, el, Eλληνικά, bg, Български, ru, Русский, th, ไทย, zh, 中文, ko, 한국어, ja, 日本語 ); function openLanguageDropdown() { if(document.getElementById(languageDropdown).style.displaynone) { document.getElementById(languageDropdownButton).style.backgroundColor #933030; document.getElementById(languageDropdown).style.displayblock; } else { document.getElementById(languageDropdownButton).style.backgroundColor #1d1a1b; document.getElementById(languageDropdown).style.displaynone; } } function changeLanguage(ln) { if(language ! ln) { language ln; localStorage.setItem(language, ln); resetBrowser(browserInner); } } let showInfo false; function toggleInfo() { let display; let background; let width; if(showInfo) { showInfo false; display none; background rgb(0,0,0,0.0); width ; } else { showInfo true; display block; background rgb(0,0,0,0.7); width 100%; } let els document.getElementsByClassName(info); Array.from(els).forEach((el) > { el.getElementsByTagName(p)1.style.display display; el.style.background background; el.style.width width; }); } let showGameInfo false; function toggleGameInfo() { let visibility; if(showGameInfo) { showGameInfo false; visibility hidden; } else { showGameInfo true; visibility visible; } let els document.getElementsByClassName(gameInfo); Array.from(els).forEach((el) > { el.style.visibility visibility; }); } function resetBrowser(browserInner) { end false; if (browserInner browserInner) { imgCacheReloadIncrease(); startTime Date.now(); document.getElementById(browserInner).innerHTML ; after ; document.getElementById(browserScrollContainer).scrollTop 0; let x ; if(gameName #Favs) { if(localStorage.getItem(userID)) { userID localStorage.getItem(userID); } if(localStorage.getItem(username)) { username localStorage.getItem(username); } if(localStorage.getItem(userAuth)) { userAuth localStorage.getItem(userAuth); } let placeholder username ? Authorize to display followed : Logout + username; x + `button idauthorizeFollowerList onclickauthorizeFollowerList(event) stylepadding: 5px 35px 5px 10px; margin: 5px; width:100%; font-size:16px; background-color:#1d1a1b; border:0; color:white; text-align: left;>` + placeholder + `/button>`; } else if (gameName.charAt(0) ! §) { x + `button idlanguageDropdownButton classopenStream browserGame onclickopenLanguageDropdown(); return false; styleposition:relative; padding: 5px 35px 5px 10px; margin: 5px; min-width:calc(100% - 10px); height: 29px; font-size:16px; text-align:left; background-color:#1d1a1b; border:0; color:white; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;>` + languages.get(language) + `/button> div idlanguageDropdown styledisplay:none;>`; for(let i of languages) { if(i0 ! language) { x + button classopenStream browserGame onclickchangeLanguage(\ + i0 + \); return false; styleposition:relative; padding: 5px 10px; margin: 5px; min-width:calc(100% - 10px); height: 29px; font-size:16px; text-align:left; background-color:#1d1a1b; border:0; color:white; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;> + i1 + /button>; } } x + `/div>`; } for(let i0; i5; i++) { x + div classbrowserStream hidden>/div>; } document.getElementById(browserInner).innerHTML + x; getStreams(); } else { gameStartTime Date.now(); document.getElementById(gameBrowserScrollContainer).scrollTop 0; if(gameSearchQuery ) { document.getElementById(browserInner).innerHTML button classopenStream browserGame onclickchangeGame(\\); return false;> + div classgameButtonInnerDiv> + p classgameButtonInnerP> + All + /p> + /div> + /button> +button classopenStream browserGame onclickchangeGame(\#Favs\); return false; stylebackground-color:rgb(147, 48, 48);> + div classgameButtonInnerDiv> + p classgameButtonInnerP> + Favs + /p> + /div> + /button>; } else { document.getElementById(browserInner).innerHTML ; } gameOffset 0; let z ; for(let i0; i10; i++) { z + div classbrowserGame hidden>/div>; } document.getElementById(gameBrowserInner).innerHTML + z; getGames(); } } function openTutorial() { const tutorial document.getElementById(tutorialContainer); if(tutorial.style.display block) { document.getElementById(tutorialContainer).style.display none; } else { document.getElementById(tutorialContainer).style.display block; } } document.getElementById(openWatch).addEventListener(click, openBrowser2); document.getElementById(openBrowser).addEventListener(click, openBrowser2); function openBrowser2() { if (document.getElementById(watchBrowser).style.zIndex 20) { document.getElementById(browseBrowser).style.zIndex 20; document.getElementById(watchBrowser).style.zIndex 0; } else { if(allChannels.size 1) { document.getElementById(openStreamersArrow).innerHTML ▾; document.getElementById(channelBrowser).style.zIndex -2; document.getElementById(chatContainer).style.zIndex 2; if(!document.getElementById(chats).firstElementChild.firstElementChild) { let streamName document.getElementById(chats).firstElementChild.id.slice(0, -4); let newChat document.createElement(iframe); newChat.style position:absolute; left:0; width:100%; height:100%; overflow:hidden;; newChat.frameBorder0; newChat.scrollingno; newChat.style.visibility hidden; newChat.onload function() { newChat.style.visibility visible; }; newChat.srchttps://www.twitch.tv/embed/ + streamName + /chat?darkpopout&parentyeet.tv&parent127.0.0.1; document.getElementById(streamName + Chat).appendChild(newChat); } } else if (allChannels.size 1) { document.getElementById(channelBrowser).style.zIndex 2; document.getElementById(chatContainer).style.zIndex -2; } document.getElementById(browseBrowser).style.zIndex 0; document.getElementById(watchBrowser).style.zIndex 20; } } document.getElementById(openGameBrowser).addEventListener(click, openGameBrowser); function openGameBrowser() { if (document.getElementById(gameBrowser).style.zIndex 2) { document.getElementById(openGameBrowserArrow).innerHTML ▾; document.getElementById(gameBrowser).style.zIndex -2; document.getElementById(browser).style.zIndex 2; } else if (gameOffset 0) { document.getElementById(openGameBrowserArrow).innerHTML ▴; document.getElementById(gameBrowser).style.zIndex 2; document.getElementById(browser).style.zIndex -2; getGames(); } else { document.getElementById(openGameBrowserArrow).innerHTML ▴; document.getElementById(gameBrowser).style.zIndex 2; document.getElementById(browser).style.zIndex -2; } } function openBrowserNoReturn() { if (document.getElementById(browser).style.zIndex 2) { resetBrowser(browserInner); } else { document.getElementById(browser).style.zIndex 2; document.getElementById(gameBrowser).style.zIndex -2; } } document.getElementById(openStreamers).addEventListener(click, openStreamers); function openStreamers() { if (document.getElementById(channelBrowser).style.zIndex -2) { document.getElementById(openStreamersArrow).innerHTML ▴; document.getElementById(channelBrowser).style.zIndex 2; document.getElementById(chatContainer).style.zIndex -2; } else if(allChannels.size > 0) { if(!document.getElementById(document.getElementById(openStreamersText).innerText + Chat).firstChild){ addChatIframe(document.getElementById(openStreamersText).innerText); } document.getElementById(openStreamersArrow).innerHTML ▾; document.getElementById(channelBrowser).style.zIndex -2; document.getElementById(chatContainer).style.zIndex 2; } } function quickAdd() { document.getElementById(quickAddPreview).innerHTML ; let streamName document.getElementById(search).value; if(streamName ! ) { document.getElementById(clearSearch).style.visibility visible; imgCacheReloadIncrease(); let img https://static-cdn.jtvnw.net/previews-ttv/live_user_ + streamName + -440x248.jpg?r + imgCacheReloadNumber; let x button id + streamName + classopenStream onclickchangeChannel(\ + streamName + \, 1); return false; draggabletrue ondragstartdrag(event) ondragenddragEnd(event) styleposition:relative; width: 100%;width: stretch;width: -webkit-fill-available; width:-moz-available; max-width:400px; margin: 5px; text-align: left;> + div stylepadding-bottom:56.25%; height:0;> + div styleposition:absolute; background-size: cover !important; width:100%; height:100%; background: url( + img + ) 0 0;>/div> + /div> + div styleposition:absolute; bottom:0px; left:5px; white-space: nowrap; overflow: hidden;> + p stylefont-size:20px; line-height: 20px; height:22px; font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-shadow: 2px 0 0 #000, 0 -2px 0 #000, 0 1px 0 #000, -1px 0 0 #000; padding-right:2px;> + streamName + /p> + /div> + /button>; document.getElementById(quickAddPreview).innerHTML x; let el document.getElementById(quickAddPreview).firstElementChild; el.addEventListener(touchstart, (ev) > touchDragStart(ev, el)); el.addEventListener(touchmove, (ev) > touchDrag(ev, el, false)); el.addEventListener(touchend, (ev) > touchDragEnd(ev, false)); el.addEventListener(touchcancel, (ev) > touchDragEnd(ev, false)); } else { game ; gameName ; document.getElementById(clearSearch).style.visibility hidden; resetBrowser(browserInner); } } function search() { document.getElementById(quickAddPreview).innerHTML ; searchQuery encodeURIComponent(document.getElementById(search).value); if(searchQuery ! ) { document.getElementById(clearSearch).style.visibility visible; startTime Date.now(); document.getElementById(browserScrollContainer).scrollTop 0; document.getElementById(browserInner).innerHTML ; after ; let z ; for(let i0; i5; i++) { z + div classbrowserStream hidden>/div>; } document.getElementById(browserInner).innerHTML + z; let requestString https://api.yeet.tv/search/yeet_ttv_search?query + searchQuery; if(after ! ) { requestString + &after + after; } if(language ! ) { requestString + &broadcaster_language + language; } getStreams2(requestString, null); } else { document.getElementById(clearSearch).style.visibility hidden; resetBrowser(browserInner); } } function clearSearch() { document.getElementById(search).value; document.getElementById(quickAddPreview).innerHTML ; document.getElementById(clearSearch).style.visibility hidden; if(searchQuery!) { searchQuery ; resetBrowser(browserInner); } } function searchGames() { gameSearchQuery encodeURIComponent(document.getElementById(searchGames).value); if(gameSearchQuery ! ) { document.getElementById(clearSearchGames).style.visibility visible; gameStartTime Date.now(); document.getElementById(gameBrowserScrollContainer).scrollTop 0; document.getElementById(gameBrowserInner).innerHTML ; gameAfter ; let z ; for(let i0; i10; i++) { z + div classbrowserGame hidden>/div>; } document.getElementById(gameBrowserInner).innerHTML + z; let requestGameString https://api.yeet.tv/gamesearch/yeet_ttv_gamesearch?query + encodeURIComponent(gameSearchQuery); if(gameAfter ! ) { requestGameString + &after + gameAfter; } let requestGameURL new URL(requestGameString); fetch(requestGameURL, { headers: { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq } }) .then(function (gameResponse) { return gameResponse.json(); }) .then(function (gameJson) { getGames3(gameJson); }); } else { document.getElementById(clearSearchGames).style.visibility hidden; resetBrowser(gameBrowserInner); } } function clearSearchGames() { gameSearchQuery ; document.getElementById(searchGames).value; document.getElementById(clearSearchGames).style.visibility hidden; resetBrowser(gameBrowserInner); } document.getElementById(search).addEventListener(keyup, function(event) { if (event.keyCode 27) { clearSearch(); } else if (event.keyCode 13 && event.shiftKey) { quickAdd(); } else if (event.key Enter) { search(); } }); document.getElementById(searchGames).addEventListener(keyup, function(event) { if (event.keyCode 27) { clearSearchGames(); } else if (event.key Enter) { searchGames(); } }); let username ; let userID ; let userAuth ; let twilightZone false; function authorizeFollowerList(ev) { if(twilightZone) { if(localStorage.getItem(userID)) { userID localStorage.getItem(userID); } if(localStorage.getItem(username)) { username localStorage.getItem(username); } if(localStorage.getItem(userAuth)) { userAuth localStorage.getItem(userAuth); } twilightZone false; resetBrowser(browserInner); } else if(username ) { userID ; const state window.crypto.randomUUID().replaceAll(-,); localStorage.setItem(followerStateID, state); const url https://id.twitch.tv/oauth2/authorize+ ?response_typetoken+ &client_idn8r8jja1lutwm2vuul5lai0g2utdeq+ &redirect_urihttps://yeet.tv+ &scopeuser%3Aread%3Afollows+ &state + state; window.open(url, _blank).focus(); document.getElementById(authorizeFollowerList).innerText Click again once done; twilightZone true; } else { localStorage.setItem(userID, ); localStorage.setItem(username, ); localStorage.setItem(userAuth, ); userID ; username ; userAuth ; resetBrowser(browserInner); } } let imgCacheReloadNumber 0; let lastImgReload 0; function imgCacheReloadIncrease() { if((Date.now() - lastImgReload) > 180000) { lastImgReload Date.now(); imgCacheReloadNumber++; } } function changeChannel(streamName, targetNumber) { if(targetNumber 1) { streamName streamName.replace(/\s+/g, ); if (document.getElementById(main0drop).style.display block) { document.getElementById(main0drop).style.display none; let newStreamId stream_1; a v, s, 16, 9, newStreamId; addStreamDiv(newStreamId, streamName, null, true); a fixIds(a, stream); sr ratio(a); bob(main); if(allChannels.size 1) { document.getElementById(streamName + Chat).style.zIndex 2; document.getElementById(openStreamersText).innerHTML streamName; document.getElementById(openStreamersArrow).innerHTML ▾; } } else if(a.length 2 && a10 s) { let previousStreamName allStreams.get(stream_1).streamName; if(previousStreamName ! streamName) { if (allChannels.has(streamName)) { allChannels.set(streamName, allChannels.get(streamName) + 1); } else { let newChat document.createElement(div); newChat.style position:absolute; left:0; width:100%; height:100%; overflow:hidden; z-index:-2; background-color: #0d0a0b;; newChat.id streamName + Chat; newChat.classList.add(chat); document.getElementById(chats).appendChild(newChat); allChannels.set(streamName, 1); } if (allChannels.get(previousStreamName) > 1) { allChannels.set(previousStreamName, allChannels.get(previousStreamName) - 1); } else { let oldChat document.getElementById(previousStreamName + Chat); oldChat.parentElement.removeChild(oldChat); allChannels.delete(previousStreamName); } if(document.getElementById(openStreamersText).innerHTMLpreviousStreamName) { document.getElementById(openStreamersText).innerHTML streamName; document.getElementById(streamName + Chat).style.zIndex 2; } getAllChannels(true); let imgUrl https://static-cdn.jtvnw.net/previews-ttv/live_user_ + streamName + -160x90.jpg?r + imgCacheReloadNumber; document.getElementById(stream_1).firstElementChild.style.backgroundImage url( + imgUrl + ); allStreams.get(stream_1).streamObject.setChannel(streamName); allStreams.set(stream_1, { streamName: streamName, streamObject: allStreams.get(stream_1).streamObject, uid: s + streamNumber++ }); } } pushState(true); } else { document.getElementById(channelBrowser).style.zIndex -2; document.getElementById(chatContainer).style.zIndex 2; let previousStreamName document.getElementById(openStreamersText).innerText; if(previousStreamName ! streamName) { let oldChatId previousStreamName + Chat; let oldChat document.getElementById(oldChatId); oldChat.style.zIndex -2; if(oldChat.firstElementChild) { oldChat.removeChild(oldChat.firstElementChild); } } addChatIframe(streamName); document.getElementById(streamName + Chat).style.zIndex 2; document.getElementById(openStreamersText).innerHTML streamName; document.getElementById(openStreamersArrow).innerHTML ▾; } } function addChatIframe(streamName) { if(!document.getElementById(streamName + Chat).firstElementChild) { let newChat document.createElement(iframe); newChat.style position:absolute; left:0; width:100%; height:100%; overflow:hidden;; newChat.frameBorder0; newChat.scrollingno; newChat.style.visibility hidden; newChat.onload function() { newChat.style.visibility visible; }; newChat.srchttps://www.twitch.tv/embed/ + streamName + /chat?darkpopout&parentyeet.tv&parent127.0.0.1; document.getElementById(streamName + Chat).appendChild(newChat); } } function transformViews(views) { if (views 1e3) { return views; } else if (views > 1e3 && views 1e6) { return (views / 1e3).toFixed(1) + k; } else { return (views / 1e6).toFixed(1) + M; } } let allChannels new Map(); function getAllChannels(pushState) { let x ; let url ; for (let i of allChannels.keys()) { x + button id + i + Channel classopenChannel onclickchangeChannel(\ + i + \, 0); return false; styleheight: 40px; width:100%; padding: 10px; text-align: left;> + div stylemargin-left: 5px; white-space: nowrap; overflow: hidden;> p stylefont-size:16px; font-weight: bold; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;> + i + /p> + /div> + /button>; url + /+ i } document.getElementById(channelBrowserInner).innerHTML x; } function pushState(newState) { let streamStructure {}; streamStructure.a a; streamStructure.b b; streamStructure.allStreams ; for (let i of allStreams.keys()) { streamStructure.allStreams.push(i, allStreams.get(i).streamName, allStreams.get(i).uid); } let url ; for (let i of allChannels.keys()) { for(let j0; jallChannels.get(i); j++) { url + / + i } } if(newState) { if(url) { window.history.pushState(streamStructure, , url); document.title url.slice(1) + - yeet.tv; } else { window.history.pushState(streamStructure, , /); document.title yeet.tv; } } else { if(url) { window.history.replaceState(streamStructure, , url); } else { window.history.replaceState(streamStructure, , /); } } } function streamsLazyLoading() { let el document.querySelectorAll(*realsrc); for (let i0; iel.length; i++) { let boundingClientRect eli.getBoundingClientRect(); if (eli.hasAttribute(realsrc) && boundingClientRect.top window.innerHeight+500) { eli.style.backgroundImage url( + eli.getAttribute(realsrc) + ); eli.removeAttribute(realsrc); } } }; browserElement.addEventListener(scroll, streamsLazyLoading); gameBrowserElement.addEventListener(scroll, streamsLazyLoading); window.addEventListener(resize, streamsLazyLoading); window.addEventListener(popstate, function(event) { document.getElementById(sidebar).style.top 0px; document.getElementById(sidebar).style.height 100%; document.getElementById(main0drop).style.display block; document.getElementById(sidebar0drop).style.display block; init(event.state); }); let firstInit true; function init(state) { if(document.location.hash.includes(access_token)) { const urlParams new URLSearchParams(window.location.hash); if(urlParams.get(state) localStorage.getItem(followerStateID)) { userAuth urlParams.get(#access_token); const requestURL new URL(https://api.twitch.tv/helix/users); fetch(requestURL, { headers: { Accept: application/vnd.twitchtv.v5+json, Client-Id: n8r8jja1lutwm2vuul5lai0g2utdeq, Authorization: Bearer + userAuth } }) .then(function(response) { return response.json(); }) .then(function(myJson) { userID myJson.data0.id; username myJson.data0.display_name; localStorage.setItem(userID, userID); localStorage.setItem(username, username); localStorage.setItem(userAuth, userAuth); window.close(); }); } else { document.body.style.color white; document.body.style.padding 20px; document.body.innerText Error: State differs from request URL. Please try again or send a message to reddit user 0100011101000111; } } else { if(localStorage.getItem(userID)) { userID localStorage.getItem(userID); } if(localStorage.getItem(username)) { username localStorage.getItem(username); } if(localStorage.getItem(userAuth)) { userAuth localStorage.getItem(userAuth); } } if(localStorage.getItem(category)) { game JSON.parse(localStorage.getItem(category)).id; gameName JSON.parse(localStorage.getItem(category)).name; } if(localStorage.getItem(language)) { language localStorage.getItem(language); } if(localStorage.getItem(chatLevelTop)) { if (localStorage.getItem(chatLevelTop) 0) { document.getElementById(chats).style.marginTop 0px; document.getElementById(chats).style.height 100%; } else if (localStorage.getItem(chatLevelTop) 2) { document.getElementById(chats).style.height calc(100% + 150px); document.getElementById(chats).style.marginTop -150px; } else if (localStorage.getItem(chatLevelTop) 3) { document.getElementById(chats).style.height calc(100% + 655px); document.getElementById(chats).style.marginTop -655px; } else if (localStorage.getItem(chatLevelTop) 4) { document.getElementById(chats).style.height calc(100% + 705px); document.getElementById(chats).style.marginTop -705px; } else if (localStorage.getItem(chatLevelTop) 5) { document.getElementById(chats).style.height calc(100% + 805px); document.getElementById(chats).style.marginTop -805px; } } if(localStorage.getItem(chatLevelBottom)) { if (localStorage.getItem(chatLevelBottom) 0) { document.getElementById(chatsOuter).style.height 100%; } else if (localStorage.getItem(chatLevelBottom) 2) { document.getElementById(chatsOuter).style.height calc(100% + 95px); } } checkOrientation(); if (gameName ) { document.getElementById(openGameBrowserText).innerHTML All; } else if(gameName #Favs) { document.getElementById(openGameBrowserText).innerHTML Followed; } else { document.getElementById(openGameBrowserText).innerHTML gameName; } if(firstInit && gameOffset 0) { let z ; for(let i0; i5; i++) { z + div classbrowserGame hidden>/div>div classbrowserGame hidden>/div>; } document.getElementById(gameBrowserInner).innerHTML + z; } if(firstInit && after ) { let x ; for(let i0; i5; i++) { x + div classbrowserStream hidden>/div>; } document.getElementById(browserInner).innerHTML + x; resetBrowser(browserInner); } let url window.location.href.split(/).slice(3); let urlLength url.length; let n0; if(n>urlLength || !url0) { document.title yeet.tv; } else { let urlString ; for(let i0; iurlLength; i++) { urlString + / + urli; } document.title urlString.slice(1) + - yeet.tv; if(state null) { let u url.slice(0, 1); dropFirst3(main0drop, un, false); n++; if(n>urlLength) { pushState(false); return; } let rows Math.ceil(Math.sqrt(urlLength)); for(; nrows; n++) { a addStream(a, n, streamIdPlaceholder, down); addStreamDiv(streamIdPlaceholder, urln, null, false); a fixIds(a, stream); sr ratio(a); bob(main); } if(n>urlLength) { pushState(false); return; } for(let i1; irows; i++) { a addStream(a, i, streamIdPlaceholder, right); addStreamDiv(streamIdPlaceholder, urln, null, false); a fixIds(a, stream); sr ratio(a); bob(main); n++; if(n>urlLength) { pushState(false); return; } } for(let i2; irows; i++) { for(let j1; jrows; j++) { a addStream(a, j, i, streamIdPlaceholder, right); addStreamDiv(streamIdPlaceholder, urln, null, false); a fixIds(a, stream); sr ratio(a); bob(main); n++; if(n>urlLength) { pushState(false); return; } } } } } if(state!null) { a state.a; b state.b; let oldAllStreams allStreams; allStreams new Map(); let oldAllChannels allChannels; allChannels new Map(); for(let i0; iurlLength; i++) { allChannels.set(urli, 0); } for (let k of oldAllStreams.keys()) { document.getElementById(k).id oldAllStreams.get(k).uid + Placeholder; } let activeUids ; for (let k of state.allStreams) { let alreadyOpen false; for (let j of oldAllStreams.keys()) { if(k2oldAllStreams.get(j).uid) { document.getElementById(oldAllStreams.get(j).uid + Placeholder).id k0; allStreams.set(k0, { streamName: k1, streamObject: oldAllStreams.get(j).streamObject, uid: k2 }); if (allChannels.has(k1)) { allChannels.set(k1, allChannels.get(k1) + 1); } else { allChannels.set(k1, 1); } alreadyOpen true; } } if(!alreadyOpen) { addStreamDiv(k0, k1, k2, false); } activeUids.push(k2); } for (let j of oldAllStreams.keys()) { if(!activeUids.includes(oldAllStreams.get(j).uid)) { let removedStream document.getElementById(oldAllStreams.get(j).uid + Placeholder); document.body.removeChild(removedStream); } } for (let j of oldAllChannels.keys()) { if(!allChannels.has(j)) { let removedChat document.getElementById(j + Chat); document.getElementById(chats).removeChild(removedChat); } } if(a.length > 1) { document.getElementById(main0drop).style.display none; sr ratio(a); bob(main); } if(b.length > 1) { document.getElementById(sidebar0drop).style.display none; sidebarSr ratio(b); bob(sidebar); } getAllChannels(null); if(allChannels.size 0) { document.getElementById(chats).innerHTML ; document.getElementById(openStreamersText).innerHTML No Chat; document.getElementById(openStreamersArrow).innerHTML ; document.getElementById(channelBrowser).style.zIndex 2; document.getElementById(chatContainer).style.zIndex -2; } else { let activeStream document.getElementById(openStreamersText).innerText; if(!allChannels.has(activeStream)){ let lastAddedChat document.getElementById(chats).lastChild; let streamName lastAddedChat.id.slice(0, -4); document.getElementById(openStreamersText).innerHTML streamName; if (document.getElementById(channelBrowser).style.zIndex -2) { document.getElementById(openStreamersArrow).innerHTML ▾; } else { document.getElementById(openStreamersArrow).innerHTML ▴; } lastAddedChat.style.zIndex 2; addChatIframe(streamName); } } } } document.addEventListener(dragenter, function (ev) { if (ev.target.classList && ev.target.classList.contains(dropArea)) { ev.target.style.background rgba(31, 31, 61, 0.7); } }, false); document.addEventListener(dragleave, function (ev) { if (ev.target.classList && ev.target.classList.contains(dropArea)) { ev.target.style.background ; } }, false); let timeoutID null; let autoHide true; document.addEventListener(mousemove, function(ev) { clearTimeout(timeoutID); let list document.getElementsByClassName(autoHide); if(autoHide) { autoHide false; } timeoutID setTimeout(function(){ Array.from(list).forEach((i) > { autoHide true; i.style.opacity 0; }); },5000); }); if (serviceWorker in navigator) { window.addEventListener(load, () > { navigator.serviceWorker.register(/service-worker.js); }); } window.addEventListener(mouseover, () > { document.querySelector(.toggler).style.visibilityvisible; document.querySelector(.toggler).style.opacity1; }); window.addEventListener(mousemove, () > { document.querySelector(.toggler).style.visibilityvisible; document.querySelector(.toggler).style.opacity1 }); window.addEventListener(mouseout, () > { document.querySelector(.toggler).style.visibilityhidden }); document.getElementById(sidebar).addEventListener(mouseover, () > { document.querySelector(.chatToggler).style.opacity1; }); document.getElementById(sidebar).addEventListener(mousemove, () > { document.querySelector(.chatToggler).style.opacity1; }); document.getElementById(sidebar).addEventListener(mouseout, () > { document.querySelector(.chatToggler).style.opacity0; }); document.getElementById(quickAddButton).addEventListener(click, () > { quickAdd(); }); document.getElementById(searchButton).addEventListener(click, () > { search(); }); document.getElementById(clearSearch).addEventListener(click, () > { clearSearch(); }); document.getElementById(searchGamesButton).addEventListener(click, () > { searchGames(); }); document.getElementById(clearSearchGames).addEventListener(click, () > { clearSearchGames(); }); init(null); pushState(false); firstInit false; /script>/body>/html>
Subdomains
Date
Domain
IP
api.yeet.tv
2024-02-15
18.161.6.83
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]