Add Audible and ABB search links to MAM titles
// ==UserScript==
// @name MAM Search Sites
// @namespace https://greasyfork.org/en/users/1370284
// @version 0.0.1
// @license MIT
// @description Add Audible and ABB search links to MAM titles
// @match https://*.myanonamouse.net/t/*
// ==/UserScript==
const searchConfig = {
audible: {
enabled: true,
getLink: (title, author, narrator) => {
const searchUrl = new URL(`https://www.audible.com/search`);
searchUrl.searchParams.set('keywords', `${title} ${author} ${narrator}`);
return searchUrl.href;
}
},
abb: {
enabled: true,
getLink: (title, author) => {
const searchUrl = new URL('https://audiobookbay.lu');
searchUrl.searchParams.set('s', `${title} ${author}`.toLowerCase());
return searchUrl.href;
}
}
};
const parser = new DOMParser();
function decodeHtmlEntities(str) {
if (str == null) return '';
const domParser = parser || new DOMParser();
const doc = domParser.parseFromString(str, 'text/html');
return doc.documentElement.textContent;
}
function cleanQuery(str) {
const decoded = decodeHtmlEntities(str);
return decoded.replace(/[?!:\-+~]/g, '');
}
function removePersonTitles(str) {
return str
?.replace(/\b(Dr\.?|Mr\.?|Mrs\.?|Ms\.?|Prof\.?|M\.?D\.?|Ph\.?D\.?|D\.?O\.?|D\.?C\.?|D\.?D\.?S\.?|D\.?M\.?D\.?|D\.?Sc\.?|Ed\.?D\.?|LLB|JD|Esq\.?)\b\.?/gi, '') // Remove common author-related titles
.replace(/\b\w{1,2}\.\s*/g, '') // Remove any 1 or 2 letter abbreviations followed by a dot
.replace(/\s+/g, ' ') // Condense multiple spaces into one
.trim(); // Trim any extra spaces at the start or end
}
function parseData() {
const titleEl = document.querySelector('.TorrentTitle');
const authorEl = document.querySelector('.torAuthors a');
const narratorEl = document.querySelector('#Narrator a');
const title = cleanQuery(titleEl?.textContent.trim() || '')
const author = removePersonTitles(cleanQuery(authorEl?.textContent.trim() || ''))
const narrator = removePersonTitles(cleanQuery(narratorEl?.textContent.trim() || ''))
return {
title,
author,
narrator
};
}
function createLinkElement(href, text) {
const linkElement = document.createElement('a');
linkElement.href = href;
linkElement.target = '_blank';
linkElement.innerText = text;
linkElement.style.marginLeft = '12px';
return linkElement;
}
function addSearchLinkToSubmitInfo() {
const { title, author, narrator } = parseData();
const submitInfoElement = document.querySelector('#submitInfo .flex');
if (!submitInfoElement) return;
if (searchConfig.audible.enabled) {
const audibleLink = searchConfig.audible.getLink(title, author, narrator);
const audibleLinkElement = createLinkElement(audibleLink, '🟠 audible');
submitInfoElement.appendChild(audibleLinkElement);
}
if (searchConfig.abb.enabled) {
const audiobookbayLink = searchConfig.abb.getLink(title, author);
const audiobookbayLinkElement = createLinkElement(audiobookbayLink, '🎧 ABB');
submitInfoElement.appendChild(audiobookbayLinkElement);
}
}
addSearchLinkToSubmitInfo();