NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name APOD (Astronomy Picture of the Day) Enhancer
// @description A userscript to simplify and beautify the NASA Astronomy Picture Of the Day website.
// @namespace mll
// @author mll, jcunews1
// @match *://apod.nasa.gov/apod/*
// @version 6
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js
// @updateURL https://openuserjs.org/meta/mll/APOD_(Astronomy_Picture_of_the_Day)_Enhancer.meta.js
// @license MIT
// ==/UserScript==
/* global $ */
/* eslint-disable no-multi-spaces */
var title = $('b:eq(0)').text();
var prev = 'https://apod.nasa.gov/apod/' + $('a:contains("<")').attr('href');
var next = 'https://apod.nasa.gov/apod/' + $('a:contains(">")').attr('href');
var p = $('p:eq(1)').html().split('<br>');
//clean p from empty or "/n" items
p = p.filter(function (item) {
return item.trim() !== "";
});
var p1 = $.trim(p[1]);
//look for date
var date = $.trim(p[0]).split(' ');
console.log(date);
//look for explanation
var explanation = $.trim($('p:eq(2)').html());
explanation = explanation.substring(22);
// look for credits
var credits
// Regular expression to match the start tag variations (could be "<b> Image Credit & Copyright: </b>" or "<b> Image Credit & Copyright: </b>" or "<b> Image Credit: </b>")
// kudos to ChatGPT 3 for the regexp :)
var creditsStartTagRegex = /<b>\s*Image\s+Credit(?:\s*&|\s*&)?(?:\s+Copyright)?\s*:\s*<\/b>/i;
var creditsStartTagMatch = $('body').html().match(creditsStartTagRegex);
if (creditsStartTagMatch) {
var startIndex = creditsStartTagMatch.index + creditsStartTagMatch[0].length;
var endIndex = $('body').html().indexOf("</center>", startIndex);
if (endIndex !== -1) {
credits = $('body').html().substring(startIndex, endIndex);
} else {
credits = "Credits end tag not found.";
}
} else {
credits = "Credits start tag not found.";
}
// handle date
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var d = new Date();
var year = d.getFullYear();
var month = monthNames[d.getMonth()];
var day = d.getDate();
$('body').empty();
$('body').prepend('<div id="header"><a href="https://www.nasa.gov/" id="logo"><i></i></a><h1>' + title + '</h1><a href="https://apod.nasa.gov/apod/astropix.html" id="date">' + date[2] + ' ' + date[1] + ' ' + date[0] + '</a></div> \
<a id="prev" href="' + prev + '"><span>«</span></a><a id="next" href="' + next + '"><span>»</span></a> \
<div id="image">' + p1 + '</div> \
<div id="explanation">' + explanation + '</div> \
<div id="credits">Image credits: ' + credits + '</div>');
if (day == date[2] && month == date[1] && year == date[0]) {
$('#next').hide();
}
if (p1.toLowerCase().indexOf("iframe") >= 0) {
$('iframe').addClass('iframe');
}
// Create a style element
var style = document.createElement('style');
style.type = 'text/css';
// Define the CSS rules
style.textContent = `
body {
background-color: #222;
font-family: Arial, Helvetica, sans-serif;
}
a {
color: #666;
text-decoration: none;
}
#header {
position: relative;
width: 900px;
height: 92px;
margin: 20px auto;
}
#logo {
float: left;
}
#logo i {
width: 110px;
height: 92px;
display: inline-block;
left: 0;
}
h1 {
color: #eee;
text-align: right;
line-height: 36px;
padding-top: 25px;
font-weight: 300;
}
#date {
position: absolute;
top: 0;
right: 0;
color: #ccc;
}
#prev, #next {
position: fixed;
top: 0;
display: table;
height: 100%;
text-align: center;
width: 100px;
text-decoration: none;
font-size: 50px;
color: #666;
transition: background-color 300ms;
}
#prev:hover, #next:hover {
background-color: rgba(255, 255, 255, 0.1);
transition: background-color 300ms;
}
#prev {
left: 0;
}
#next {
right: 0;
}
#prev span, #next span {
display: table-cell;
vertical-align: middle;
}
#image {
width: 900px;
margin: 0px auto 30px;
}
#image img {
width: 100%;
border-radius: 10px;
box-shadow: 0 0 10px 2px rgba(0, 0, 0, 0.5);
}
.iframe {
width: 900px;
}
#explanation, #credits {
color: #CCCCCC;
margin: 0 auto 30px;
text-align: justify;
width: 700px;
}
@media (max-width: 1160px) {
#header, #image, .iframe, #explanation, #credits {
width: 700px;
}
#explanation, #credits {
width: 600px;
}
}
@media (max-width: 980px) {
#header, #image, .iframe, #explanation, #credits {
width: 600px;
}
#explanation, #credits {
width: 500px;
}
}
@media (max-width: 850px) {
#prev, #next {
width: 50px;
}
}
`;
// Append the style element to the head of the document
document.head.appendChild(style);