Rotten Tomatoes export CSV button

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

  1. // ==UserScript==
  2. // @name Rotten Tomatoes export CSV button
  3. // @namespace
  4. // @version 0.4
  5. // @description Adds a 'Download CSV' button to the personal ratings page in Rotten Tomatoes which downloads a Letterboxd compatible CSV file.
  6. // @author Guy Hizkiau
  7. // @match https://www.rottentomatoes.com/user/id/*/ratings
  8. // @grant none
  9. // @namespace https://greasyfork.org/users/72895
  10. // ==/UserScript==
  11.  
  12. String.prototype.replaceAll = function(search, replacement) {
  13. var target = this;
  14. return target.replace(new RegExp(search, 'g'), replacement);
  15. };
  16.  
  17. var ratingBoxes = document.getElementsByClassName("media bottom_divider");
  18. var ratingsArray = [];
  19.  
  20. for (var i = ratingBoxes.length - 1; i >= 0; i--) {
  21. var boxBody = ratingBoxes[i].getElementsByClassName("media-body")[0];
  22. var boxHeading = boxBody.getElementsByClassName("media-heading")[0];
  23. var titleA = boxHeading.getElementsByTagName("a")[0];
  24. var title = titleA.textContent.replaceAll(",", "");
  25.  
  26. var yearSpan = boxHeading.getElementsByTagName("span")[0];
  27. var year = yearSpan.textContent.substring(1,5);
  28.  
  29. var ratingDiv = boxBody.getElementsByTagName("div")[2];
  30. var ratingValueWholes = ratingDiv.childElementCount;
  31. var ratingValueHalves = ratingDiv.innerText;
  32.  
  33. var ratingLog = boxBody.getElementsByClassName("ratingMovieDate")[0].textContent;
  34. var ratingDateVerbal = ratingLog.substring(0,ratingLog.indexOf("ago")-1).split(" ");
  35.  
  36. var ratingDate = new Date();
  37.  
  38. if (ratingDateVerbal[1] == "days") {
  39. ratingDate.setDate(ratingDate.getDate()-ratingDateVerbal[0]);
  40. var ratingDateFormated = ratingDate.getFullYear() + '-' + (ratingDate.getMonth()+1) + '-' + ratingDate.getDate();
  41. } else if (ratingDateVerbal[1] == "months") {
  42. ratingDate.setMonth(ratingDate.getMonth()-ratingDateVerbal[0]);
  43. var ratingDateFormated = ratingDate.getFullYear() + '-' + (ratingDate.getMonth()+1) + '-' + 1;
  44. } else if (ratingDateVerbal[1] == "years") {
  45. ratingDate.setFullYear(ratingDate.getFullYear()-ratingDateVerbal[0]);
  46. var ratingDateFormated = ratingDate.getFullYear() + '-' + 1 + '-' + 1;
  47. }
  48.  
  49. if (ratingValueHalves == "½") {
  50. var ratingValue = ratingValueWholes + 0.5;
  51. }
  52. else {
  53. var ratingValue = ratingValueWholes;
  54. }
  55.  
  56. ratingsArray.push([title, year, ratingDateFormated, ratingValue]);
  57. }
  58.  
  59. var csvContent = "data:text/csv;charset=utf-8,";
  60.  
  61. csvContent += "Title,Year,WatchedDate,Rating\n"
  62.  
  63. ratingsArray.forEach(function(infoArray, index){
  64. dataString = infoArray.join(",");
  65. csvContent += index < ratingsArray.length ? dataString + "\n" : dataString;
  66.  
  67. });
  68.  
  69. var encodedUri = encodeURI(csvContent);
  70. var link = document.createElement("a");
  71. link.setAttribute("href", encodedUri);
  72. link.setAttribute("download", "rotten_tomatoes_ratings.csv");
  73. document.body.appendChild(link); // Required for FF
  74.  
  75. var pageBody = document.getElementById("main_container").children[1].children[1];
  76.  
  77. function download() {
  78. link.click();
  79. return;
  80. }
  81.  
  82. var downloadButton = document.createElement("button");
  83. var buttonText = document.createTextNode("Download CSV");
  84. downloadButton.appendChild(buttonText);
  85. downloadButton.classList.add("panel-heading");
  86. downloadButton.onclick = download;
  87.  
  88. pageBody.insertBefore(downloadButton, pageBody.children[0]);