diff --git a/README.md b/README.md index 2db7f93..58ede39 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,29 @@ Better YouTube + works to improve the YouTube experience by providing quick acce * It allows quick thumbnail access of the video. * It allows setting the loop mode easily. * It allows setting the loop mode to a ranged set. - * It allows the video to be toggled to fixed or floating with drag functionality. + * It allows the video to be toggled to fixed or floating. (With drag functionality!) * It allows volume control through the mouse-wheel when hovering over the player. * It allows for quick access to the YouTube video slug. - * It lets Unix, Linux, and MacOS systems the ability to download the video using native app calls. + * It allows for NonStop watch mode. (i.e, no "Are you still there?" dialog.) + * It shows volume level as you scroll. + * It lets Unix, Linux, and MacOS systems have the ability to download the video using native app calls. -# Version: 1.4.3 -* Added mutation observation for (un)fullscreen action. -* Cleaned up some log cruft and fixed CSS... +# Version: 1.5.0 +* Refactored code. +* Resolved volume change not always sticking on Linux. (I think fixed...) +* Added a quick volume indicator when scrolling. +* Added NonStop watch mode. # Download https://addons.mozilla.org/en-US/firefox/addon/better-youtube-plus/ +# Images +![1 Controls... ](images/pic1.png) +![2 Thumbnail list... ](images/pic2.png) +![3 Secondary controls... ](images/pic3.png) +![4 Video in float mode... ](images/pic4.png) +![5 Video moved around in float mode... ](images/pic5.png) + # NOTE On *Nix systems download youtube-dl and use provided app in this repo to download videos. diff --git a/images/pic1.png b/images/pic1.png new file mode 100644 index 0000000..ebd6209 Binary files /dev/null and b/images/pic1.png differ diff --git a/images/pic2.png b/images/pic2.png new file mode 100644 index 0000000..86c6c4a Binary files /dev/null and b/images/pic2.png differ diff --git a/images/pic3.png b/images/pic3.png new file mode 100644 index 0000000..0af74af Binary files /dev/null and b/images/pic3.png differ diff --git a/images/pic4.png b/images/pic4.png new file mode 100644 index 0000000..f2917df Binary files /dev/null and b/images/pic4.png differ diff --git a/images/pic5.png b/images/pic5.png new file mode 100644 index 0000000..d3f8572 Binary files /dev/null and b/images/pic5.png differ diff --git a/src/manifest.json b/src/manifest.json index 5fb43a1..855172b 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,13 +1,12 @@ { "manifest_version": 2, "name": "Better Youtube +", - "version": "1.4.0", + "version": "1.5.0", "description": "Enhancements for Youtube to have a better experience.", "applications": { "gecko": { - "id": "betterYoutube@itdominator.com", - "strict_min_version": "50.0" + "id": "betterYoutube@itdominator.com" } }, diff --git a/src/scripts/betterYoutube.js b/src/scripts/betterYoutube.js index 9eaf931..f231316 100644 --- a/src/scripts/betterYoutube.js +++ b/src/scripts/betterYoutube.js @@ -1,182 +1,183 @@ (function() { - // Declare variables - let slugInputTag, ytThumbImgMenu, ytEnhancerMenu; // Menu systems - let ytThumbnailBttn, ytMaxDefaultImg, ytHqDefaultImg, // Buttons & Images - ytLoopBttn, ytFloatBttn, ytAMaxDefaultImg, ytAHqDefaultImg; + const menuTemplate = ` +
+
+
+
+
+
+ ` + const slugTemplate = ` +
+
+ Volume +
+ + + + + + + +
+ ` + const thumbnailTemplate = ` + + ` + const popedContainerTemplate = ` + + ` - let mastHead, mainContentArea, playerWindow; // Youtube Player container - let video, containerOfPlyrWndow, poppedContainer; // Video accessor - let part, videoSlug, temp; // Image part + // Declare other variables + let ytThumbImgMenu, ytEnhancerMenu, ytEnhancerMenu2; // Menu systems + let ytThumbnailBttn, ytLoopBttn, ytFloatBttn, ytDownloadBttn; // Menu Buttons + let ytMaxDefaultImg, ytHqDefaultImg, ytAMaxDefaultImg, ytAHqDefaultImg; // Thumbnail images + let mainContentArea, playerWindow, containerOfPlyrWndow, video; // Youtube Player container let videoTimeLength, videoTimeCurent, ytRangeStart, ytRangeEnd, - ytdVideoIntervalLoop; + slugInputTag, endlessPlayTag, ytVideoIntervalLoop; + let poppedContainer, videoSlug, volumeLbl, part; let loopingInterval = false; - let count = 0; - let OSName = ""; + let shouldHideVol = true; + let OSName = ""; + let count = 0; + + // confirm dialog elm + const isYoutubeMusic = window.location.hostname === 'music.youtube.com'; + let dialogElementQueryRef = isYoutubeMusic ? 'ytmusic-you-there-renderer' : 'yt-confirm-dialog-renderer'; // Options for the observer (which mutations to observe) - const config = { attributes: true }; + let observer, observer2; + const observerConfig = { attributes: true }; + const observerConfig2 = { childList: true, subtree: true }; const preSetupProc = () => { - if (navigator.appVersion.indexOf("Win")!=-1) OSName = "Windows"; - if (navigator.appVersion.indexOf("Mac")!=-1) OSName = "MacOS"; - if (navigator.appVersion.indexOf("X11")!=-1) OSName = "UNIX"; - if (navigator.appVersion.indexOf("Linux")!=-1) OSName ="Linux"; - - video = document.getElementsByTagName("video")[0]; // Video Controler - slugInputTag = document.createElement("INPUT"); - ytRangeEnd = document.createElement("INPUT"); - - slugInputTag.id = "slugCopyZone"; - ytRangeEnd.id = "rangeEndID"; - slugInputTag.type = "text"; - ytRangeEnd.type = "text"; - - // We need to wait for info to load before getting full duration - setTimeout(function () { - videoTimeLength = document.getElementsByClassName("ytp-time-duration")[0].innerHTML; - if (!document.getElementById("rangeEndID")) { - } else { - ytRangeEnd = document.getElementById("rangeEndID"); - } - ytRangeEnd.value = videoTimeLength; - }, 1000); + // Look to add saving image from video elm. + // path = "/html/body/ytd-app/div/ytd-page-manager/ytd-watch-flexy/div[4]/div[1]/div/div[1]/div/div/div/ytd-player/div/div/div[1]/video" + // elm = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + if (navigator.appVersion.indexOf("Win")!=-1) OSName = "Windows"; + if (navigator.appVersion.indexOf("Mac")!=-1) OSName = "MacOS"; + if (navigator.appVersion.indexOf("X11")!=-1) OSName = "UNIX"; + if (navigator.appVersion.indexOf("Linux")!=-1) OSName = "Linux"; + // check if we've loaded elements already... if (!document.getElementById("slugCopyZone")) { - document.body.appendChild(slugInputTag); + document.body.insertAdjacentHTML( 'beforeend', slugTemplate ); + document.body.insertAdjacentHTML( 'beforeend', menuTemplate ); + document.body.insertAdjacentHTML( 'beforeend', thumbnailTemplate ); + document.body.insertAdjacentHTML( 'beforeend', popedContainerTemplate ); + controlsWereLoaded = false; } else { - slugInputTag = document.getElementById("slugCopyZone"); + controlsWereLoaded = true; } - slugInputTag.value = video.baseURI.slice(32, 32+11); + ytEnhancerMenu = document.getElementById("enhancerMenuID"); + ytEnhancerMenu2 = document.getElementById("enhancerMenuID2"); + ytThumbnailBttn = document.getElementById("ytThumbnailBttn"); + ytLoopBttn = document.getElementById("ytLoopBttn"); + ytRangeEnd = document.getElementById("rangeEndID"); + ytRangeStart = document.getElementById("rangeStartID"); + ytFloatBttn = document.getElementById("ytFloatBttn"); + ytDownloadBttn = document.getElementById("ytDownloadBttn"); + volumeContainer = document.getElementById("volumeContainerID"); + volumeLbl = document.getElementById("volumeValueLbl"); + endlessPlayTag = document.getElementById("endlessPlayID"); + + ytThumbImgMenu = document.getElementById("ytThumbMenuID"); + ytAMaxDefaultImg = document.getElementById("ytAMaxDefaultImgID"); + ytAHqDefaultImg = document.getElementById("ytAHqDefaultImgID"); + ytAMedDefaultImg = document.getElementById("ytAMedDefaultImgID"); + ytASdDefaultImg = document.getElementById("ytASdDefaultImgID"); + ytMaxDefaultImg = document.getElementById("ytMaxDefaultImgID"); + ytHqDefaultImg = document.getElementById("ytHqDefaultImgID"); + ytMqDefaultImg = document.getElementById("ytMqDefaultImgID"); + ytSdDefaultImg = document.getElementById("ytSdDefaultImgID"); + + poppedContainer = document.getElementById("draggable"); + ytIfrm = document.getElementById("popIframe"); + slugInputTag = document.getElementById("slugCopyZone"); + + // Video Controler + video = document.getElementsByTagName("video")[0]; + // Container of actual player (Used for floating window) + containerOfPlyrWndow = document.getElementById("player-container"); } const setupProc = () => { - poppedContainer = document.createElement("DIV"); - ytThumbImgMenu = document.createElement("DIV"); - ytEnhancerMenu = document.createElement("DIV"); - ytThumbnailBttn = document.createElement("IMG"); - ytDownloadBttn = document.createElement("IMG"); - ytLoopBttn = document.createElement("IMG"); - ytFloatBttn = document.createElement("IMG"); - ytMaxDefaultImg = document.createElement("IMG"); - ytHqDefaultImg = document.createElement("IMG"); - ytMqDefaultImg = document.createElement("IMG"); - ytSdDefaultImg = document.createElement("IMG"); + part = "https://img.youtube.com/vi/"; + slugInputTag.value = video.baseURI.slice(32, 32+11); + ytRangeStart.value = "0:00"; - ytAMaxDefaultImg = document.createElement("A"); - ytAHqDefaultImg = document.createElement("A"); - ytAMedDefaultImg = document.createElement("A"); - ytASdDefaultImg = document.createElement("A"); - ytIfrm = document.createElement("IFRAME"); + // We need to wait for info to load before getting full duration + setTimeout(function () { + videoTimeLength = document.getElementsByClassName("ytp-time-duration")[0].innerText; + ytRangeEnd.value = videoTimeLength; + }, 2000); - // Loop range controls - ytRangeSection = document.createElement("SECTION"); - ytRangeStart = document.createElement("INPUT"); + // Only setting these up if we need to load controls' info + if (!controlsWereLoaded) { + setbuttonImage(ytThumbnailBttn, "/icons/thumbnailOff.png"); + setbuttonImage(ytLoopBttn, "/icons/loopFalse.png"); + setbuttonImage(ytFloatBttn, "/icons/floatPlayer.png"); + setbuttonImage(ytDownloadBttn, "/icons/downloadVid.png"); - // Get nodes for page work - containerOfPlyrWndow = document.getElementById("player-container"); // Container of actual player - Used for floating window - part = "https://img.youtube.com/vi/"; + // Set onclick actions + ytThumbnailBttn.addEventListener("click", showThumbImageVew); + ytLoopBttn.addEventListener("click", setLoop); + ytFloatBttn.addEventListener("click", toggleFloat); + endlessPlayTag.addEventListener("click", toggleEndlessPlay); + ytDownloadBttn.addEventListener("click", downloadVideo); + video.addEventListener("wheel", manageVolume); + // Dragable window for floating video event setup + dragVideo(poppedContainer); - // Append to nodes as required - ytThumbnailBttn.title = "Video Thumbnails..."; - ytLoopBttn.title = "Start Loop..."; - ytFloatBttn.title = "Float Video Container"; - ytRangeStart.title = "Loop Range Start"; - ytRangeEnd.title = "Loop Range End"; - ytRangeStart.type = "text"; - ytRangeStart.value = "0:00"; - - // Insert - ytEnhancerMenu.appendChild(ytThumbnailBttn); - ytEnhancerMenu.appendChild(ytLoopBttn); - ytEnhancerMenu.appendChild(ytRangeSection); - ytEnhancerMenu.appendChild(ytFloatBttn); - - if (OSName.includes("MacOS") || OSName.includes("UNIX") || - OSName.includes("Linux")) { - console.log("System supports downloader..."); - console.log("OS is : " + OSName); - ytEnhancerMenu.appendChild(ytDownloadBttn); + // Remove download button if system doesn't support youtube-dl functionality + if (!OSName.includes("MacOS") && !OSName.includes("UNIX") && !OSName.includes("Linux")) { + console.log("System does not support downloader..."); + ytEnhancerMenu.removeChild(ytDownloadBttn); + } } - ytRangeSection.append(ytRangeStart); - ytRangeSection.append(ytRangeEnd); - document.body.appendChild(poppedContainer); - document.body.appendChild(ytThumbImgMenu); - document.body.appendChild(ytEnhancerMenu); - ytAMaxDefaultImg.appendChild(ytMaxDefaultImg); - ytAHqDefaultImg.appendChild(ytHqDefaultImg); - ytAMedDefaultImg.appendChild(ytMqDefaultImg); - ytASdDefaultImg.appendChild(ytSdDefaultImg); - ytThumbImgMenu.appendChild(ytAMaxDefaultImg); - ytThumbImgMenu.appendChild(ytAHqDefaultImg); - ytThumbImgMenu.appendChild(ytAMedDefaultImg); - ytThumbImgMenu.appendChild(ytASdDefaultImg); - poppedContainer.appendChild(ytIfrm); - - // Set onclick actions - ytThumbnailBttn.addEventListener("click", showThumbImageVew); - ytLoopBttn.addEventListener("click", setLoop); - ytFloatBttn.addEventListener("click", toggleFloat); - ytDownloadBttn.addEventListener("click", downloadVideo); - video.addEventListener("wheel", manageVolume); - + // ---- Hide controls if fullscreen using obsever ---- // Observer target for fullscreen action... - targetNode = document.getElementsByTagName('ytd-app')[0]; - + let targetNode = document.getElementsByTagName('ytd-app')[0]; // Create an observer instance linked to the callback function - const observer = new MutationObserver(mutationcallback); + observer = new MutationObserver(mutationCallback); // Start observing the target node for configured mutations - observer.observe(targetNode, config); + observer.observe(targetNode, observerConfig); - // Dragable window for floating video - dragVideo(poppedContainer); - - ytThumbnailBttn.src = browser.extension.getURL("/icons/thumbnailOff.png"); - ytLoopBttn.src = browser.extension.getURL("/icons/loopFalse.png"); - ytFloatBttn.src = browser.extension.getURL("/icons/floatPlayer.png"); - ytDownloadBttn.src = browser.extension.getURL("/icons/downloadVid.png"); - - // Set trget of Thumbnails of video - ytAMaxDefaultImg.target = "_blank"; - ytAHqDefaultImg.target = "_blank"; - ytAMedDefaultImg.target = "_blank"; - ytASdDefaultImg.target = "_blank"; - - // Theming & Apply Styles - ytThumbImgMenu.className = "ytThumbMenuStyle"; - ytMaxDefaultImg.className = "thumbImageStyle"; - ytHqDefaultImg.className = "thumbImageStyle"; - ytMqDefaultImg.className = "thumbImageStyle"; - ytSdDefaultImg.className = "thumbImageStyle"; - ytEnhancerMenu.className = "ytMenuStyle"; - ytThumbnailBttn.className = "imageStyle"; - ytLoopBttn.className = "imageStyle"; - ytFloatBttn.className = "imageStyle"; - ytDownloadBttn.className = "imageStyle"; - ytEnhancerMenu.id = "enhancerMenuIDRef"; - poppedContainer.id = "draggable"; - ytRangeStart.id = "rangeStartID"; - ytRangeEnd.id = "rangeEndID"; - poppedContainer.style.display = "none"; - ytEnhancerMenu.style.display = "block"; - slugInputTag.style.display = "block"; - - ytIfrm.setAttribute("allow", "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"); - ytIfrm.setAttribute("frameborder", "0"); - ytIfrm.setAttribute("autoplay", ""); - ytIfrm.setAttribute("allowfullscreen", "true"); - ytIfrm.setAttribute("width", "650px"); - ytIfrm.setAttribute("height", "400px"); + // ---- Endless play obsever ---- + // Create an observer instance linked to the callback function + observer2 = new MutationObserver(mutationCallback); + // Start observing the target node for configured mutations + if (endlessPlayTag.checked == true) { + endlessPlayTag.setAttribute("checked", true); + console.log("Endless play checked. Starting observer..."); + observer2.observe(document, observerConfig2); + } } // Functions // Callback function to execute when mutations are observed - const mutationcallback = (mutationsList, observer) => { + const mutationCallback = (mutationsList, observer) => { for(let mutation of mutationsList) { if (mutation.type === 'attributes') { controlManager(mutation.target); + } else if (mutation.type === 'childList') { + let elm = document.querySelector(dialogElementQueryRef).parentElement; + elmDisplayState = elm.style.display; + if (elmDisplayState !== 'none') { + clickDialog(); + } } } }; @@ -184,16 +185,34 @@ const controlManager = (elm) => { attrib = elm.getAttribute('masthead-hidden_'); if (attrib == null) { // if out of fullscreen - ytEnhancerMenu.style.display = "block"; - slugInputTag.style.display = "block"; + ytEnhancerMenu.style.display = "block"; + ytEnhancerMenu2.style.display = "block"; } else { // if fullscreen - ytEnhancerMenu.style.display = "none"; - slugInputTag.style.display = "none"; + ytEnhancerMenu.style.display = "none"; + ytEnhancerMenu2.style.display = "none"; } } - const downloadVideo = () => { - browser.runtime.sendMessage( { "url": video.baseURI } ); + const clickDialog = () => { + console.log("Clicking dialog confirm to continue playing..."); + document + .querySelector(dialogElementQueryRef) + .querySelector('yt-button-renderer[dialog-confirm]') + .click(); + } + + const toggleEndlessPlay = () => { + isChecked = endlessPlayTag.getAttribute("checked"); + if (isChecked) { + endlessPlayTag.setAttribute("checked", false); + console.log("Stopping endless play..."); + observer2.disconnect(); + } else { + endlessPlayTag.setAttribute("checked", true); + console.log("Starting endless play..."); + observer2.observe(confirmDialogElement, observerConfig2); + } + console.log(observer2); } const showThumbImageVew = (e) => { @@ -201,7 +220,7 @@ if (ytThumbImgMenu.style.display == "block") { ytThumbImgMenu.style.display = "none"; - ytThumbnailBttn.src = browser.extension.getURL("/icons/thumbnailOff.png"); + setbuttonImage(ytThumbnailBttn, "/icons/thumbnailOff.png"); } else { ytAMaxDefaultImg.href = part + videoSlug + "/maxresdefault.jpg"; ytAHqDefaultImg.href = part + videoSlug + "/hqdefault.jpg"; @@ -211,12 +230,7 @@ ytHqDefaultImg.src = part + videoSlug + "/hqdefault.jpg"; ytMqDefaultImg.src = part + videoSlug + "/mqdefault.jpg"; ytSdDefaultImg.src = part + videoSlug + "/sddefault.jpg"; - ytMaxDefaultImg.title = "Max Resolution Default"; - ytHqDefaultImg.title = "High Quality Default"; - ytMqDefaultImg.title = "Medium Quality Default"; - ytSdDefaultImg.title = "Standard Quality Default"; - - ytThumbnailBttn.src = browser.extension.getURL("/icons/thumbnailOn.png"); + setbuttonImage(ytThumbnailBttn, "/icons/thumbnailOn.png"); ytThumbImgMenu.style.display = "block"; } return; @@ -228,10 +242,11 @@ if (loopingInterval) { console.log("Unsetting interval for loop check..."); - clearInterval(ytdVideoIntervalLoop); + clearInterval(ytVideoIntervalLoop); loopingInterval = false; ytLoopBttn.title = "Start Loop..."; - ytLoopBttn.src = browser.extension.getURL("/icons/loopFalse.png"); + let ipath = browser.extension.getURL("/icons/loopFalse.png"); + setbuttonImage(ytLoopBttn, ipath); return ; } @@ -240,12 +255,14 @@ console.log("Setting default loop marker..."); video.loop = true; ytLoopBttn.title = "Stop Loop..."; - ytLoopBttn.src = browser.extension.getURL("/icons/loopTrue.png"); + let ipath = browser.extension.getURL("/icons/loopTrue.png"); + setbuttonImage(ytLoopBttn, ipath); } else { console.log("Unsetting default loop marker..."); video.loop = false; ytLoopBttn.title = "Start Loop..."; - ytLoopBttn.src = browser.extension.getURL("/icons/loopFalse.png"); + let ipath = browser.extension.getURL("/icons/loopFalse.png"); + setbuttonImage(ytLoopBttn, ipath); } return ; } else { @@ -285,11 +302,12 @@ // Setup interval check for 1 sec and compare value of current pos to end ytLoopBttn.title = "Stop Loop..."; - ytLoopBttn.src = browser.extension.getURL("/icons/loopTrue.png"); + let ipath = browser.extension.getURL("/icons/loopTrue.png"); + setbuttonImage(ytLoopBttn, ipath); loopingInterval = true; console.log("Setting interval for loop check..."); - ytdVideoIntervalLoop = setInterval(checkLoopStuff, 1000); + ytVideoIntervalLoop = setInterval(checkLoopStuff, 1000); } } @@ -326,10 +344,33 @@ let delta; e.preventDefault(); // Keep page from scrolling while in video area + shouldHideVol = false; + volumeContainer.style.display = "block"; + // Detect scroll direction + let incramentType = "+"; if (e.wheelDelta) delta = e.wheelDelta; else delta = -1 * e.deltaY; // Vol UP || Vol DOWN - if (delta > 0) video.volume += 0.05; else if (delta < 0) video.volume -= 0.05; + let tmpVol = video.volume.toFixed(2); + let volume = Math.round((tmpVol * 100), 2).toFixed(0); + + if (delta > 0) { + incramentType = "+"; + while ((volume % 5) !== 0) { volume += 1; } + video.volume = (volume/100) + 0.05; + } else if (delta < 0) { + incramentType = "-"; + while ((volume % 5) !== 0) { volume -= 1; } + video.volume = (volume/100) - 0.05; + } + + volumeLbl.innerText = incramentType + Math.round((video.volume * 100), 1).toFixed(0); + setTimeout(function () { + if (shouldHideVol) { + volumeContainer.style.display = "none"; + } + }, 1000); + shouldHideVol = true; } const dragVideo = (elmnt) => { @@ -375,28 +416,15 @@ } } - const checkPg = () => { - if (!document.getElementById("enhancerMenuIDRef")) { - let existCondition = setInterval(function() { - if (document.getElementById("masthead-container")) { - clearInterval(existCondition); - preSetupProc(); - setupProc(); - count = 0; - } else { - if (count == 12) { // ~ 6 sec through half sec loops - count = 0; - clearInterval(existCondition); - } else { - count++; - } - } - }, 500); // check every 500ms - } else { - preSetupProc(); - } + const downloadVideo = () => { + browser.runtime.sendMessage( { "url": video.baseURI } ); + } + + const setbuttonImage = (elm, path) => { + elm.style.backgroundImage = "url('" + browser.extension.getURL(path); + "')"; } // Start init - checkPg(); + preSetupProc(); + setupProc(); }()); diff --git a/src/styles/betterYoutube.css b/src/styles/betterYoutube.css index 9cdfbdb..dd19b5c 100644 --- a/src/styles/betterYoutube.css +++ b/src/styles/betterYoutube.css @@ -1,4 +1,16 @@ -#slugCopyZone, .ytThumbMenuStyle, .ytMenuStyle { +/* Tag CSS */ +/* Youtube stylers based off of its tags... */ +yt-formatted-string > a { + color: rgba(125, 65, 0, 0.84) !important; +} + +yt-formatted-string > a:hover { + color: rgba(150, 21, 176, 0.97); +} + + +/* ID CSS */ +#enhancerMenuID2, .ytThumbMenuStyle, .ytMenuStyle { z-index: 100; position: fixed; background: rgba(0,0,0,0.64); @@ -6,52 +18,26 @@ overflow: auto; } -#slugCopyZone { +#enhancerMenuID2 { bottom: 0%; - left: 35%; - width: 10em; - text-align: center; - color: #fff; + left: 10%; + width: auto; + color: #ffffff; } -#enhancerMenuIDRef, #slugCopyZone { +#enhancerMenuID, #enhancerMenuID2 { z-index: 5; } -.ytThumbMenuStyle { - display: none; - bottom: 20px; -} - -.ytMenuStyle { - top: 45%; - width: 4em; -} - -.imageStyle { - width: 32px; - height: 32px; - margin-right: 0.5em; -} - -.imageStyle:hover { - background:rgba(12,160,193,.64); - cursor: pointer; -} - -#xIconHoverTop { - margin-bottom: 80px; -} - -.thumbImageStyle { - width: 200px; - height: 100px; - margin: 0em 1em 0em 1em; - float: left; +#volumeContainerID { + display: none; + font-size:200%; + color: #ffffff; + text-align: center; } #draggable { - z-index: 100; + z-index: 9999; position: fixed; right: 0px; bottom: 0px; @@ -63,12 +49,51 @@ background: rgba(64, 64, 64, 0.64) } - -/* Youtube stylers based off of its tags... */ -yt-formatted-string > a { - color: rgba(125, 65, 0, 0.84) !important; +#rangeEndID, #rangeStartID { + width: 56px; + overflow-x: scroll; + overflow-y: hidden; } -yt-formatted-string > a:hover { - color: rgba(150, 21, 176, 0.97); +#slugCopyZone, #rangeEndID, #rangeStartID { + text-align: center; + background: rgba(0,0,0,0.0); + color: #fff; +} + + +/* Class CSS */ +.ytMenuStyle { + top: 40%; + width: 42px; + overflow: hidden; +} + +.ytThumbMenuStyle { + display: none; + bottom: 20px; +} + +.imageStyle { + width: 42px; + height: 42px; + background-repeat: no-repeat; + background-position: center; + background-color: rgba(0,0,0,.64); + background-size: 42px 42px; +} + +.imageStyle:hover { + background: rgba(12,160,193,.64); + cursor: pointer; + background-repeat: no-repeat; + background-position: center; + background-size: 28px 28px; +} + +.thumbImageStyle { + width: 200px; + height: 100px; + margin: 0em 1em 0em 1em; + float: left; }