Skip to content

Instantly share code, notes, and snippets.

@automatthew
Created October 2, 2020 19:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save automatthew/d5f6df4b962ca9a6316e6726cf339414 to your computer and use it in GitHub Desktop.
Save automatthew/d5f6df4b962ca9a6316e6726cf339414 to your computer and use it in GitHub Desktop.
UATV podcast addon

Enhances streams on unauthorized.tv by adding buttons to jump 30s forward/backward and change playback rate. On android devices, the playback controls on the notification screen also receive jump buttons.

On your desktop browser, install a userscript manager like Tampermonkey and add the script below. Each stream will be augmented with extra buttons.

On android, create a bookmark and copy-paste the snippet below into the URL field. Click on this bookmark whenever you're listening to a podcast to upgrade the page. (You can usually invoke the bookmarklet from the URL bar by typing in its name)

javascript:(function()%7B(function()%7B'use%20strict'%3Bconst%20%24%3Ddocument.querySelector.bind(document)%3Bconst%20gui%3Ddocument.createElement('div')%3Bgui.innerHTML%3D%60%0A%3Cdiv%20class%3D%22tm-controls%22%3E%0A%20%20%3Cbutton%20class%3D%22tm-controls__back%22%3E%3Ci%20class%3D%22fa%20fa-backward%22%3E%3C%2Fi%3E%3C%2Fbutton%3E%0A%20%20%3Cbutton%20class%3D%22tm-controls__rate%22%3E1x%3C%2Fbutton%3E%0A%20%20%3Cbutton%20class%3D%22tm-controls__fwd%22%3E%3Ci%20class%3D%22fa%20fa-forward%22%3E%3C%2Fi%3E%3C%2Fbutton%3E%0A%3C%2Fdiv%3E%0A%3Cstyle%3E%0A.tm-controls%20%7B%0A%20%20display%3A%20flex%3B%0A%20%20align-items%3A%20center%3B%0A%20%20justify-content%3A%20center%3B%0A%7D%0A%0A.tm-controls%20button%20%7B%0A%20%20min-height%3A%2033px%3B%0A%20%20min-width%3A%2040px%3B%0A%20%20margin-left%3A%2010px%3B%0A%20%20font-size%3A%2018px%3B%0A%7D%0A.tm-controls%20button%3Afirst-child%20%7B%0A%20%20margin-left%3A%200%3B%0A%7D%0A%3C%2Fstyle%3E%0A%60%3Bconst%20audio%3D%24('audio')%3Bif(audio)%7Bdocument.querySelector('main').insertBefore(gui%2C%24('.formWrapper'))%3Baudio.addEventListener('play'%2CsetupMediaSession)%3B%24('.tm-controls__back').addEventListener('click'%2Cback)%3B%24('.tm-controls__fwd').addEventListener('click'%2Cfwd)%3B%24('.tm-controls__rate').addEventListener('click'%2CchangeRate)%7Dfunction%20fwd()%7Baudio.currentTime%3DMath.min(audio.currentTime%2B30%2Caudio.duration)%7D%3Bfunction%20back()%7Baudio.currentTime%3DMath.max(audio.currentTime-30%2C0)%7D%3Bfunction%20changeRate()%7Bconst%20rates%3D%5B0.5%2C0.75%2C1%2C1.25%2C1.5%2C1.75%2C2%5D%3Bconst%20index%3Drates.findIndex((i)%3D%3Eaudio.playbackRate%3D%3D%3Di)%3Blet%20rate%3Drates%5Bindex%2B1%5D%3Bif(!rate)%7Brate%3Drates%5B0%5D%7Daudio.playbackRate%3Drate%3B%24('.tm-controls__rate').innerText%3D%60%24%7B%20rate%20%7Dx%60%7D%3Bfunction%20setupMediaSession()%7Bif('mediaSession'in%20navigator)%7Bnavigator.mediaSession.metadata%3Dnew%20MediaMetadata(%7Btitle%3A%24('.video.header').innerText.trim()%2Cartist%3A'Unauthorized.tv'%2Calbum%3A'N%2FA'%2Cartwork%3A%5B%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'96x96'%2Ctype%3A'image%2Fpng'%7D%2C%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'128x128'%2Ctype%3A'image%2Fpng'%7D%2C%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'192x192'%2Ctype%3A'image%2Fpng'%7D%2C%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'256x256'%2Ctype%3A'image%2Fpng'%7D%2C%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'384x384'%2Ctype%3A'image%2Fpng'%7D%2C%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'512x512'%2Ctype%3A'image%2Fpng'%7D%2C%7Bsrc%3A'https%3A%2F%2Funauthorized.tv%2Fstatic%2Fimg%2Fhome_button.png'%2Csizes%3A'600x600'%2Ctype%3A'image%2Fpng'%7D%5D%7D)%3Bnavigator.mediaSession.setActionHandler('play'%2C()%3D%3Eaudio.play())%3Bnavigator.mediaSession.setActionHandler('pause'%2C()%3D%3Eaudio.pause())%3Bnavigator.mediaSession.setActionHandler('seekbackward'%2C()%3D%3Eback())%3Bnavigator.mediaSession.setActionHandler('seekforward'%2C()%3D%3Efwd())%7Daudio.removeEventListener('play'%2CsetupMediaSession)%7D%7D)()%3B%7D)()%3B)

I'm not affiliated with UATV and this code (and its equavalent userscript below) is public domain, without any warranty.

// ==UserScript==
// @name UATV Plus
// @namespace https://unauthorized.tv/
// @version 0.3
// @description Add rate and jump controls to UATV
// @author tuxmachine
// @match https://unauthorized.tv/watch/*
// @grant none
// ==/UserScript==
/* global MediaMetadata */
(function() {
'use strict';
const $ = document.querySelector.bind(document);
const gui = document.createElement('div');
gui.innerHTML = `
<div class="tm-controls">
<button class="tm-controls__back"><i class="fa fa-backward"></i></button>
<button class="tm-controls__rate">1x</button>
<button class="tm-controls__fwd"><i class="fa fa-forward"></i></button>
</div>
<style>
.tm-controls {
display: flex;
align-items: center;
justify-content: center;
}
.tm-controls button {
min-height: 33px;
min-width: 40px;
margin-left: 10px;
font-size: 18px;
}
.tm-controls button:first-child {
margin-left: 0;
}
</style>
`
const audio = $('audio') || $('video');
if (audio) {
document.querySelector('main').insertBefore(gui, $('.formWrapper'));
audio.addEventListener('play', setupMediaSession);
$('.tm-controls__back').addEventListener('click', back);
$('.tm-controls__fwd').addEventListener('click', fwd);
$('.tm-controls__rate').addEventListener('click', changeRate);
}
function fwd() {
audio.currentTime = Math.min(audio.currentTime + 30, audio.duration);
};
function back() {
audio.currentTime = Math.max(audio.currentTime - 30, 0);
};
function changeRate() {
const rates = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
const index = rates.findIndex((i) => audio.playbackRate === i);
let rate = rates[index + 1];
if (!rate) {
rate = rates[0];
}
audio.playbackRate = rate;
$('.tm-controls__rate').innerText = `${rate}x`;
};
function setupMediaSession() {
if ('mediaSession' in navigator) {
navigator.mediaSession.metadata = new MediaMetadata({
title: $('.video.header').innerText.trim(),
artist: 'Unauthorized.tv',
album: 'N/A',
artwork: [
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '96x96', type: 'image/png' },
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '128x128', type: 'image/png' },
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '192x192', type: 'image/png' },
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '256x256', type: 'image/png' },
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '384x384', type: 'image/png' },
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '512x512', type: 'image/png' },
{ src: 'https://unauthorized.tv/static/img/home_button.png', sizes: '600x600', type: 'image/png' },
]
});
navigator.mediaSession.setActionHandler('play', () => audio.play());
navigator.mediaSession.setActionHandler('pause', () => audio.pause());
navigator.mediaSession.setActionHandler('seekbackward', () => back());
navigator.mediaSession.setActionHandler('seekforward', () => fwd());
}
audio.removeEventListener('play', setupMediaSession);
}
})();
@automatthew
Copy link
Author

Looks good. Would you email me at the address on my GH profile? I'll explain who I am.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment