From 5cd7617d4467693feced81b440eee8782aebdb02 Mon Sep 17 00:00:00 2001
From: Timmy Keller <tjk@tjkeller.xyz>
Date: Sat, 10 Aug 2024 19:34:54 -0500
Subject: initial commit

---
 usps/fill-out-usps-scheduled-pickup.js | 107 +++++++++++++++++++++++++++++++++
 youtube/disable-mini-player.js         |  31 ++++++++++
 youtube/piped-button.js                |  79 ++++++++++++++++++++++++
 youtube/remove-home-shorts.js          |  62 +++++++++++++++++++
 4 files changed, 279 insertions(+)
 create mode 100644 usps/fill-out-usps-scheduled-pickup.js
 create mode 100644 youtube/disable-mini-player.js
 create mode 100644 youtube/piped-button.js
 create mode 100644 youtube/remove-home-shorts.js

diff --git a/usps/fill-out-usps-scheduled-pickup.js b/usps/fill-out-usps-scheduled-pickup.js
new file mode 100644
index 0000000..88660fc
--- /dev/null
+++ b/usps/fill-out-usps-scheduled-pickup.js
@@ -0,0 +1,107 @@
+// ==UserScript==
+// @name        Fill out usps scheduled pickup
+// @namespace   Violentmonkey Scripts
+// @match       https://tools.usps.com/schedule-pickup-steps.htm*
+// @grant       none
+// @version     1.0
+// @author      -
+// @description 2/11/2024, 7:23:34 PM
+// ==/UserScript==
+
+/* First page config */
+const fill = {
+  emailAddress: "youremail@example.com",
+  phoneNumber: "777-777-7777",
+  zipCode: "60606",
+  state: "IL",
+  city: "CHICAGO",
+  addressLineOne: "701 My Lovely Home St.",
+  lastName: "Smith",
+  firstName: "John"
+}
+
+/* Misc config */
+const packageLocationFill = "Porch"
+
+/* Fill funcs */
+function fillInitialFields() {
+  for (let fieldName in fill)
+    document.getElementById(fieldName).value = fill[fieldName]
+}
+
+function fillDogField() {
+  const f = document.querySelector("#second-radio-verification[name=isDogHere]")
+  f.checked = true
+  return f
+}
+
+function fillPackageLocation() {
+  const f = document.getElementById("packageLocation")
+  f.value = packageLocationFill
+  return f
+}
+
+function fillPickupTime() {
+  const f = document.getElementById("pickup-regular-time")
+  f.click()
+  return f
+}
+
+function fillPickupDate() {
+  const f = document.querySelector("#schedule-pickup-cal td:not(.ui-datepicker-unselectable)") // Gets first date that is selectable
+  f.click()
+  return f
+}
+
+function fillTerms() {
+  const f = document.querySelector(".termsConditions")
+  f.checked = true
+  return f
+}
+
+function fillHazmat() {
+  const f = document.querySelector("#hazmat-no")
+  f.checked = true
+  return f
+}
+
+function scrollToDetails() {
+  document.getElementById("quantityCheck").scrollIntoView()
+}
+
+function showPickupDateInStepFour(pickupDateTD) {
+  const month = parseInt(pickupDateTD.dataset.month) + 1
+  const year  = pickupDateTD.dataset.year
+  const day   = pickupDateTD.firstElementChild.innerText
+
+  const date = `${month}-${day}-${year}`
+
+  const dateElement = document.createElement("div")
+  dateElement.class = "step-four-top-header"
+  dateElement.innerHTML =  `<p class="step-four-row-header"></p>`
+  dateElement.innerHTML += `<p class="step-four-row-header" style="font-weight:bold;">Date of Pickup: ${date}</p>`
+
+  const container = document.querySelector("div.pickup-summary-gray-box-wrapper div")
+  const sibiling = container.querySelector("div.step-four-top-header")
+  container.insertBefore(dateElement, sibiling)
+  return dateElement
+}
+
+/* Start */
+fillInitialFields()
+
+document.querySelector("#webToolsAddressCheck").addEventListener("click", () => {
+  const magicChange = new Event("change")
+
+  fillDogField()       .dispatchEvent(magicChange)
+  fillPackageLocation().dispatchEvent(magicChange)
+
+  fillPickupTime() // Works through click
+
+  setTimeout(() => {
+    showPickupDateInStepFour(fillPickupDate()) // Need to wait for this (calendar) to load in first since it's loaded dynamically
+    fillHazmat()
+    fillTerms()
+    scrollToDetails()
+  }, 750)
+})
diff --git a/youtube/disable-mini-player.js b/youtube/disable-mini-player.js
new file mode 100644
index 0000000..da8349c
--- /dev/null
+++ b/youtube/disable-mini-player.js
@@ -0,0 +1,31 @@
+// ==UserScript==
+// @name        Disable YouTube Miniplayer
+// @author      tjkeller.xyz
+// @include     *youtube.com*
+// @grant       GM_addStyle
+// ==/UserScript==
+
+// Remove home and shorts button
+GM_addStyle(`
+  ytd-miniplayer,
+  .ytp-miniplayer-button
+  {
+    display: none !important; /* Needs !important flag */
+  }
+`)
+
+
+// Pause video before navigating
+document.body.addEventListener("yt-navigate-start", () => {
+  if (window.location.pathname == "/watch")
+    document.querySelector("ytd-player video").pause()
+})
+
+// Close miniplayer by clicking close button in code
+document.body.addEventListener("yt-navigate-finish", () => {
+  setTimeout(() => {
+    const miniplayerCloseButton = document.querySelector("button.ytp-miniplayer-close-button")
+    if (miniplayerCloseButton)
+      miniplayerCloseButton.click()
+  }, 500) // Wait 500ms to close consistantly since miniplayer loads a little after this event
+})
diff --git a/youtube/piped-button.js b/youtube/piped-button.js
new file mode 100644
index 0000000..fd4b331
--- /dev/null
+++ b/youtube/piped-button.js
@@ -0,0 +1,79 @@
+// ==UserScript==
+// @name        Piped Button youtube.com
+// @namespace   Violentmonkey Scripts
+// @match       https://www.youtube.com/*
+// @grant       GM_addStyle
+// @version     1.0
+// @author      -
+// @description 3/9/2024, 8:38:47 PM
+// ==/UserScript==
+
+/* Config */
+const instanceHostname = "piped.tjkeller.xyz"
+const instanceProtocol = "https:"
+const instanceIconLogo = "/img/icons/logo.svg"
+
+const instanceUrl = `${instanceProtocol}//${instanceHostname}`
+
+const redirectButtonId = "piped-button"
+
+GM_addStyle(`
+  a#${redirectButtonId} button {
+    background-color: #272727;
+    border-radius: 18px;
+    border: none;
+    color: white;
+    cursor: pointer;
+    display: flex;
+    font-family: "Roboto","Arial",sans-serif;
+    font-weight: 500;
+    height: 36px;
+    padding: .25em 1em .25em .65em;
+  text-decoration: none;
+  }
+  a#${redirectButtonId} button:hover { background-color: #3f3f3f; }
+  a#${redirectButtonId} button * { align-self: center; max-height: 100%; }
+`)
+
+
+function newUrl() {
+  return `${instanceProtocol}//${instanceHostname}${document.location.pathname}${document.location.search}`
+}
+
+if (!document.getElementById(redirectButtonId)) {
+  const redirectButton = document.createElement("a")
+  const redirectButtonC = redirectButton.appendChild(document.createElement("button"))
+  const redirectButtonImg = redirectButtonC.appendChild(document.createElement("img"))
+  const redirectButtonTxt = redirectButtonC.appendChild(document.createElement("span"))
+  redirectButton.id = redirectButtonId
+  redirectButtonImg.src = instanceUrl + instanceIconLogo
+  redirectButtonImg.alt = "(Down)" // Logo effectively acts as a test to see whether the instance is up or not as a bonus
+  redirectButtonTxt.innerText = "Piped"
+
+  redirectButton.addEventListener("mouseover", () => { redirectButton.href = newUrl() })
+
+  /* Insert */
+  document.body.addEventListener("yt-navigate-finish", () => {
+
+    setTimeout(() => {
+      const headContainer = document.querySelector("#masthead-container #container #start")
+      headContainer.appendChild(redirectButton)
+      /*
+      const actionDiv = document.querySelector("#actions #menu")
+
+      const pipedLink = actionDiv.appendChild(document.createElement("a"))
+      pipedLink.id = "piped"
+      pipedLink.href = `${document.location.protocol}//${pipedInstance}${document.location.pathname}${document.location.search}`
+
+      const pipedButton = pipedLink.appendChild(document.createElement("button")) // Simplify styling
+
+      const pipedLogo = pipedButton.appendChild(document.createElement("img"))
+      pipedLogo.src = `${document.location.protocol}//${pipedInstance}/img/icons/logo.svg`
+      pipedLogo.alt = "(Down)" // Indicates instance is down if logo cannot be loaded
+
+      const pipedText = pipedButton.appendChild(document.createElement("span"))
+      pipedText.innerText = "Piped"
+      */
+    }, 500) // Wait 500ms for page load to finish after event called
+  })
+}
diff --git a/youtube/remove-home-shorts.js b/youtube/remove-home-shorts.js
new file mode 100644
index 0000000..a5e3634
--- /dev/null
+++ b/youtube/remove-home-shorts.js
@@ -0,0 +1,62 @@
+// ==UserScript==
+// @name        Remove youtube home and shorts
+// @namespace   Violentmonkey Scripts
+// @include      *youtube.com*
+// @grant       GM_addStyle
+// @version     1.0
+// @author      tjk918
+// @description 9/21/2023, 9:44:13 AM
+// @license     MIT
+// ==/UserScript==
+
+
+// Remove home and shorts button
+GM_addStyle(`
+  tp-yt-app-drawer a[title=Home],
+  tp-yt-app-drawer a[title=Shorts],
+  ytd-mini-guide-renderer a[title=Home],
+  ytd-mini-guide-renderer a[title=Shorts]
+  {
+    display: none !important; /* Needs !important flag */
+  }
+`)
+
+
+// Subscriptions page is new homepage
+const subscriptionsPath = "/feed/subscriptions"
+
+function redirectToSubscriptions() {
+  // Invoke clicking the subscriptions button to use youtube's hot page reloading if possible instead of reloading the whole page
+  const subscriptionsButton = document.querySelector("tp-yt-app-drawer a[title=Subscriptions]")
+  if (subscriptionsButton)
+    subscriptionsButton.click()
+  else
+    window.location.replace(subscriptionsPath)
+}
+
+
+// Redirect to new homepage
+function redirectIfHome() {
+   if (window.location.pathname === "/")
+    redirectToSubscriptions()
+}
+
+redirectIfHome()
+window.addEventListener("popstate", redirectIfHome)
+//document.body.addEventListener("yt-navigate-finish", redirectIfHome)
+
+
+// Youtube logo navigate to subscriptions
+/* Needs to be done safely in case youtube changes and also because it throws
+ * an error otherwise because violentmonkey seems to load the script twice */
+
+const logo = document.querySelector("#logo a")
+if (logo) {
+  logo.href = subscriptionsPath
+  logo.addEventListener("click", e => {
+    // Seems there is an event listener that forces redirect to site root, so stop that first
+    e.stopPropagation()
+    e.preventDefault()
+    redirectToSubscriptions()
+  })
+}
-- 
cgit v1.2.3