NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name IMDB - Highlight movies with 400 checks on lists
// @description Adds movie check counts from ICM to IMDb lists
// @namespace bobbybrown
// @author monk-time
// @copyright 2017, monk-time (https://github.com/monk-time)
// @license MIT; https://opensource.org/licenses/MIT
// @homepageURL https://openuserjs.org/scripts/monk-time/IMDB_-_Highlight_movies_with_400_checks_on_lists
// @updateURL https://openuserjs.org/meta/monk-time/IMDB_-_Highlight_movies_with_400_checks_on_lists.meta.js
// @include https://*.imdb.com/list/*
// @icon https://ia.media-imdb.com/images/G/01/imdb/images/favicon-2165806970.ico
// @grant GM.xmlHttpRequest
// @connect icheckmovies.com
// @version 1.4.1
// ==/UserScript==
/* Changelog:
* 2017.09.01 [1.2.0]: Switched from YQL to GM_xmlhttpRequest for cross-origin requests.
* 2017.11.24 [1.3.0]: Fixed GM_xmlhttpRequest for GM4/other engines compatibility.
* 2018.15.02 [1.3.1]: Enabled on HTTPS pages.
* 2021.04.12 [1.4.0]: Removed jQuery dependency and GM4 polyfill.
* 2021.04.12 [1.4.1]: Added a warning about working only in compact view.
*/
'use strict';
const getChecks = html => {
try {
const numStr = html.match(/id="movieChecks">[^<]+?</g)[0].replace(/\D/g, '');
return Number(numStr);
} catch (e) {
console.error(`Error while parsing ICM - ${e.name}: ${e.message}`);
return null;
}
};
const addChecks = (elMovie, { icmUrl, checks }) => {
const elTarget = elMovie.querySelector('.col-watchlist-ribbon');
elTarget.innerHTML = `
<a class="ihm-icm ${checks >= 400 ? 'ihm-above' : ''}" href="${icmUrl}">
${checks}
</a>
`;
};
const icmQuery = 'https://www.icheckmovies.com/search/movies/?query=';
const imdb2icm = elMovie => {
const [imdbId] = elMovie.querySelector('.col-title a').href.match(/\d+/) || [];
if (!imdbId) {
console.error('Can\'t extract IMDb id from a list item');
return;
}
GM.xmlHttpRequest({
method: 'GET',
url: `${icmQuery}tt${imdbId}`,
onload(response) {
const icmUrl = response.finalUrl;
if (response.status !== 200) {
console.error(`Can't load ${icmUrl}: server returned ${response.status}`);
return;
}
const checks = getChecks(response.responseText);
if (checks === null) {
console.error(`Can't load ${icmUrl}`);
return;
}
addChecks(elMovie, { icmUrl, checks });
},
});
};
const attachTriggerButton = () => {
const elContainer = document.querySelector('.overflow-menu');
// For some reason the script runs a few times before the page is ready
if (!elContainer) return;
elContainer.insertAdjacentHTML('beforeend', `
<button id="ihm-button" class="btn small">Add checks</button>
`);
const elButton = document.querySelector('#ihm-button');
elButton.addEventListener('click', () => {
if (elButton.classList.contains('disabled')) return;
if (!document.querySelector('.lister-mode.simple.active')) {
alert('The script works only in compact view. Please switch and try again.');
return;
}
elButton.classList.add('disabled');
const elMovies = document.querySelectorAll('.lister-item');
elMovies.forEach(imdb2icm);
});
document.head.insertAdjacentHTML('beforeend', `<style>
#ihm-button { float: right; }
a.ihm-above { color: red; font-weight: bold; }
</style>`);
};
attachTriggerButton();