// ==UserScript== // @name Metacritic Improved // @namespace metacritic_improved // @description Save/Hide upcoming releases, various UI improvements. // @homepageURL https://github.com/daraeman/metacritic_improved // @author daraeman // @version 1.1 // @date 2017-08-10 // @include http://www.metacritic.com/browse/dvds/* // @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js // @downloadURL none // ==/UserScript== var storage_keys = { local: { ignored: "metacritic_improved_release_ignore", saved: "metacritic_improved_release_save", }, }; // grab our saved data var data = { ignored: {}, saved: {}, show_hidden: 0, }; function parseJson( json, assign_to, initial ) { try { var parsed = JSON.parse( json ); try { if ( parsed === null ) parsed = initial; data[ assign_to ] = parsed; } catch ( e ) {} } catch ( e ) {} } parseJson( localStorage.getItem( storage_keys.local.ignored ), "ignored", {} ); parseJson( localStorage.getItem( storage_keys.local.saved ), "saved", {} ); parseJson( localStorage.getItem( storage_keys.local.show_hidden ), "show_hidden", 0 ); // iterate over the page function isSaved( link ) { if ( data.saved[ link ] ) return true; return false; } function isIgnored( link ) { if ( data.ignored[ link ] ) return true; return false; } function getLink( el ) { return el.find( ".title a" ).attr( "href" ); } function saveView( el ) { el.removeClass( "metacritic_improved_ignored" ).addClass( "metacritic_improved_saved" ); } function ignoreView( el ) { el.removeClass( "metacritic_improved_saved" ).addClass( "metacritic_improved_ignored" ); if ( ! data.show_hidden ) jQuery( ".metacritic_improved_ignored" ).slideUp(); } function resetView( el ) { el.removeClass( "metacritic_improved_saved" ).removeClass( "metacritic_improved_ignored" ); } function stringToDate( str ) { return new Date( str ); } function daysUntil( date ) { var now_millis = +new Date(); var then_millis = +date; return ( ( then_millis - now_millis ) / 1000 / 60 / 60 / 24 ); } function dateView( el ) { var date_el = el.find( ".date_wrapper" ).find( "span" ).first(); var date_string = date_el.text(); var parsed_date = stringToDate( date_string ); var days_until = daysUntil( parsed_date ); var rounded_date = Math.round( days_until ); var words = Math.abs( rounded_date ) +" days "; words += ( days_until > 0 ) ? "" : "ago"; if ( rounded_date === 0 ) words = "today"; else if ( rounded_date === 1 ) words = "tomorrow"; else if ( rounded_date === -1 ) words = "yesterday"; date_el.append( '
'+ words +'
' ); } jQuery( ".list .summary_row" ).each(function(){ var el = jQuery( this ); var link = getLink( el ); dateView( el ); if ( isSaved( link ) ) saveView( el ); else if ( isIgnored( link ) ) ignoreView( el ); el.append( '
' ); }); // add styles jQuery( "head" ).append( '' ); // hide/show actions function save( link, el ) { if ( isIgnored( link ) ) removeIgnore( link ); if ( isSaved( link ) ) { removeSave( link ); resetView( el ); return true; } else { data.saved[ link ] = 1; saveView( el ); } saveDataLocal(); return true; } function ignore( link, el ) { if ( isSaved( link ) ) removeSave( link ); if ( isIgnored( link ) ) { removeIgnore( link ); resetView( el ); return true; } else { data.ignored[ link ] = 1; ignoreView( el ); } saveDataLocal(); return true; } function removeSave( link ) { delete data.saved[ link ]; } function removeIgnore( link ) { delete data.ignored[ link ]; } function saveDataLocal() { var saved_json = JSON.stringify( data.saved ); var ignored_json = JSON.stringify( data.ignored ); localStorage.setItem( storage_keys.local.saved, saved_json ); localStorage.setItem( storage_keys.local.ignored, ignored_json ); localStorage.setItem( storage_keys.local.show_hidden, data.show_hidden ); } jQuery( ".metacritic_improved_save" ).click(function(){ var el = jQuery( this ); var parent = el.parent().parent(); var link = getLink( parent ); save( link, parent ); }); jQuery( ".metacritic_improved_ignore" ).click(function(){ var el = jQuery( this ); var parent = el.parent().parent(); var link = getLink( parent ); ignore( link, parent ); }); jQuery( "body" ).attr( "id", "metacritic_improved" ); jQuery( ".browse_trailer_wrapper" ).parent().parent().hide(); // create the hide/show button var initial_state_class = ( data.show_hidden ) ? "on" : "off"; jQuery( ".content_after_header .inset_left2 .next_to_side_col" ).first().addClass( "metacritic_improved_toggle_container" ).append( '
hide ignoredshow ignored
' ); jQuery( ".metacritic_improved_toggle_hidden" ).click(function(){ var el = jQuery( this ); if ( el.attr( "data-mi_state" ) == "on" ) { jQuery( ".metacritic_improved_ignored" ).hide(); el.attr( "data-mi_state", "off" ); data.show_hidden = 0; } else { jQuery( ".metacritic_improved_ignored" ).show(); el.attr( "data-mi_state", "on" ); data.show_hidden = 1; } saveDataLocal(); });