Greasy Fork is available in English.

Rotten Tomatoes export CSV button with Reviews- update -2020

Adds a 'Download CSV' button to the personal ratings page in Rotten Tomatoes which downloads a Letterboxd compatible CSV file.

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         Rotten Tomatoes export CSV button with Reviews- update -2020
// @namespace
// @version      0.5
// @description  Adds a 'Download CSV' button to the personal ratings page in Rotten Tomatoes which downloads a Letterboxd compatible CSV file.
// @author       Guy Hizkiau
// @Guy who added reviews as an exported field   Lagomorph
// @match        https://www.rottentomatoes.com/user/id/*/ratings
// @grant        none
// @namespace https://greasyfork.org/users/72895
// ==/UserScript==
debugger;
String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

var ratingBoxes = document.getElementsByClassName("ratings__user-rating-review");
var ratingsArray = [];

for (var i = ratingBoxes.length - 1; i >= 0; i--) {
	var boxBody = ratingBoxes[i].getElementsByClassName("bottom_divider ratings__user-rating")[0];

	var boxHeading = boxBody.getElementsByClassName("ratings__review-top")[0];
	var titleA = boxHeading.getElementsByTagName("a")[0];
	var title = titleA.textContent.replaceAll(",", "");

	var yearSpan = boxHeading.getElementsByTagName("span")[0];
	var year = yearSpan.textContent.substring(1,5);

	var ratingDiv = boxBody.getElementsByTagName("div")[1];
    var ratinghalf = 0;
    var ratingfull = ratingBoxes[i].getElementsByClassName("star-display__filled ").length;
    ratinghalf = ratingBoxes[i].getElementsByClassName("star-display__half ").length;
	if (ratinghalf == 1) {
		ratingValue = ratingfull + 0.5;
	}
	else {
		ratingValue = ratingfull;
	}

    var ratingLog = boxBody.getElementsByClassName("ratings__age")[0].textContent;
    var ratingDateVerbal = ratingLog.substring(0,ratingLog.indexOf("ago")-1).split(" ");

    var ratingDate = new Date();
    var ratingDateFormated;
    var ratingValue
    //var reviewRaw = boxBody.children[3].innerText; //grab raw review text
    var reviewRaw_full = boxBody.getElementsByClassName("ratings__comment")[0].textContent;
    var reviewRaw = reviewRaw_full.replaceAll("\"", "\"\""); //replace double quotes with double double quotes to prepare for comma sanitziation for CSV format
    reviewRaw = reviewRaw.replace(/\n/g, " ");
    reviewRaw = reviewRaw.replace(/[`~!@#$%^&*()]/gi, '');
    var review = '"' + reviewRaw + '"' //append quotes at beginning and end of string to escape all commas for CSV format

    if (ratingDateVerbal[1] == "days") {
        ratingDate.setDate(ratingDate.getDate()-ratingDateVerbal[0]);
        ratingDateFormated = ratingDate.getFullYear() + '-' + (ratingDate.getMonth()+1) + '-' + ratingDate.getDate();
    } else if (ratingDateVerbal[1] == "months") {
        ratingDate.setMonth(ratingDate.getMonth()-ratingDateVerbal[0]);
        ratingDateFormated = ratingDate.getFullYear() + '-' + (ratingDate.getMonth()+1) + '-' + 1;
    } else if (ratingDateVerbal[1] == "years") {
        ratingDate.setFullYear(ratingDate.getFullYear()-ratingDateVerbal[0]);
        ratingDateFormated = ratingDate.getFullYear() + '-' + 1 + '-' + 1;
    }

	ratingsArray.push([title, year, ratingDateFormated, ratingValue, review]);
}

//debugger;
var csvContent = "data:text/csv;charset=utf-8,";

csvContent += "Title,Year,WatchedDate,Rating,Review\n"

ratingsArray.forEach(function(infoArray, index){
   var dataString = infoArray.join(",");
   csvContent += index < ratingsArray.length ? dataString + "\n" : dataString;

});

var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "rotten_tomatoes_ratings.csv");
document.body.appendChild(link); // Required for FF

var pageBody = document.getElementsByClassName("panel-heading")[0]
//debugger;
function download() {
	link.click();
	return;
}

var downloadButton = document.createElement("button");
var buttonText = document.createTextNode("Download CSV");
downloadButton.appendChild(buttonText);
downloadButton.classList.add("panel-heading");
downloadButton.onclick = download;

pageBody.insertBefore(downloadButton, pageBody.children[0]);