NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Audible Cloud Player Enhancements
// @version 0.11
// @description Play audiobooks in a sidebar or in new tabs with Audible's Cloud Player.
// @copyright 2018, wombley (https://openuserjs.org/users/wombley)
// @license MIT
// @match https://www.audible.co.uk/a/library*
// @match https://www.audible.com/a/library*
// @match https://www.audible.co.uk/lib*
// @match https://www.audible.com/lib*
// @grant none
// @require http://code.jquery.com/jquery-2.2.4.min.js
// ==/UserScript==
(function () {
'use strict';
function getASIN(e) {
console.log(e);
return $(e.currentTarget).parent().find('input[name=asin]').val();
}
function getCloudPlayerLink(asin) {
return "/cloudplayer?asin=" + asin + "&ref_=a_libraryItem_cloudplayer_" + asin + "#";
}
function getBookDetails(e) {
const row = $(e.currentTarget).closest("tr");
const asin = getASIN(e);
const image = row.children("td").first().find('img').attr("src").trim();
const title = row.children("td").eq(1).find('a').first().text().trim();
const author = row.children("td").eq(2).find('a').first().text().trim();
const returnVal = {
asin: asin,
title: title,
author: author,
image: image
};
console.log(returnVal);
return returnVal;
}
function getBookList() {
let bookList = localStorage.getItem("audible_extension_book_list");
if (!bookList) {
bookList = {}
}
else {
bookList = JSON.parse(bookList);
}
return bookList;
}
function setBookList(bookList) {
localStorage.setItem("audible_extension_book_list", JSON.stringify(bookList));
}
function renderBookList() {
let bookList = getBookList();
bookList = Object.values(bookList); // Sort by access time
bookList.sort(function (a, b) {
return a.accessTime < b.accessTime
});
let html = $("<div></div>");
html.append($("<div style='text-align:center; font-size: 25px; height: 40px; line-height: 40px'>☰</div>"));
html.css("transition", "all 0.5s ease");
//console.log(bookList);
for (let bookASIN in bookList) {
const book = bookList[bookASIN];
const element = $("<img width='60' height='60' title='" + book.title + " by " + book.author + "' src='" + book.image + "' />");
element.css("transition", "all 0.5s ease");
element.click(function (e) {
addToBookmarks(book); // Bring to top
playInSidebar(book.asin);
openSidebar();
e.stopImmediatePropagation()
});
html.append(element);
}
$('#audible-extension-sidebar-bookmarks').html(html);
}
function addToBookmarks(bookDetails) {
bookDetails.accessTime = Date.now();
const bookList = getBookList();
bookList[bookDetails.asin] = bookDetails;
setBookList(bookList);
renderBookList();
}
// "Add" buttons next to each book
const bookmarkButton = $('<button/>', {
html: '+ Sidebar',
"class": 'bc-size-small bc-button bc-button-small bc-button-secondary bc-button-text-inner',
style: "width:100%;",
click: function (e) {
addToBookmarks(getBookDetails(e));
}
});
const playSidebarButton = $('<button/>', {
html: '► Sidebar',
"class": 'bc-size-small bc-button bc-button-small bc-button-secondary bc-button-text-inner',
style: "width:100%;",
click: function (e) {
addToBookmarks(getBookDetails(e));
playInSidebar(getASIN(e));
e.stopImmediatePropagation()
}
});
const playTabButton = $('<button/>', {
html: '► New Tab',
"class": 'bc-size-small bc-button bc-button-small bc-button-secondary bc-button-text-inner',
style: "width:100%;",
click: function (e) {
var win = window.open(getCloudPlayerLink(getASIN(e)), '_blank');
}
});
$('.adbl-library-action .bc-col-responsive').prepend(playTabButton);
$('.adbl-library-action .bc-col-responsive').prepend(playSidebarButton);
$('.adbl-library-action .bc-col-responsive').prepend(bookmarkButton);
let sidebarOpen = true;
function openSidebar() {
console.log("openSidebar");
$(".adbl-page.desktop").css("marginRight", 460);
$("#audible-extension-sidebar").css("marginRight", 0);
$('#adbl-library-content-main table tr th:nth-of-type(6), #adbl-library-content-main table tr td:nth-of-type(6)').hide();
$('#adbl-library-content-main table tr th:nth-of-type(7), #adbl-library-content-main table tr td:nth-of-type(7)').hide();
$('.adbl-page.desktop').css("minWidth", 0);
$('#center-3 .bc-container').css("minWidth", 0);
$('#adbl-library-content-main').css("minWidth", 0);
sidebarOpen = true;
}
function closeSidebar() {
$(".adbl-page.desktop").css("marginRight", 60);
$("#audible-extension-sidebar").css("marginRight", -400);
$('#adbl-library-content-main table tr th:nth-of-type(6), #adbl-library-content-main table tr td:nth-of-type(6)').show();
$('#adbl-library-content-main table tr th:nth-of-type(7), #adbl-library-content-main table tr td:nth-of-type(7)').show();
$('.adbl-page.desktop').css("minWidth", 1040);
$('#adbl-library-content-main').css("minWidth", 1020);
sidebarOpen = false;
}
function playInSidebar(asin) {
if ($('#audible-extension-sidebar-player').length < 1) { // Got to dynamically create as Audible does odd things to preexisting iframes
$('#audible-extension-sidebar-player-div').append("<iframe style='overflow:hidden' scrolling='no' frameborder='0' width='400' height='100%' id='audible-extension-sidebar-player'></iframe>")
}
$('#audible-extension-sidebar-player').attr('src', getCloudPlayerLink(asin));
}
$(".adbl-page.desktop").css("transition", "all 0.5s ease");
const sidebar = $('<div/>', {
style: "position:fixed!important; display:block; right:0; top:0; height: 100%; width: 460px; border-left: 1px solid lightgray; background-color: white; transition: all 0.5s ease;",
html: "<div id='audible-extension-sidebar-bookmarks' style='width:60px; height:100%; background-color: white; border-right: 1px solid lightgray;'>SB</div>\
<div id='audible-extension-sidebar-player-div' style='width: 400px; height:100%; position:absolute; top:0; right:0;'></div>",
id: "audible-extension-sidebar",
click: function (e) {
if (sidebarOpen) {
closeSidebar();
}
else {
openSidebar();
}
}
});
$("body").append(sidebar);
closeSidebar();
renderBookList();
$.noConflict()
})();