All pastes #952034 Raw Edit

Anonymous

public text v1 · immutable
#952034 ·published 2008-03-21 21:06 UTC
rendered paste body
// ==UserScript==
// @name           FTNPlus
// @namespace      https://feedthe.net/
// @description    Displays iMDB information for movies on FTN. A modified version from FTN+
// @include        https://feedthe.net/details.php*
// ==/UserScript==


function getInsertionPoint() {
  return evalXPath(document, '//table[@id="detailtable"]/tbody/tr').snapshotItem(1);
}

function evalXPath(dom, XPath) {
  return document.evaluate(XPath, dom, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null, null);
}

function getPureRating(dom) {
  var result = evalXPath(dom, "div[@id='wrapper']/div[@id='root']/div[@id='tn15']/div[@id='tn15main']/div[@id='tn15content']/div[@id='tn15rating']/div[2]/b[2]");
  if (result.snapshotLength > 0) {
    var rating = result.snapshotItem(0).innerHTML;
    return rating.substring(0,rating.length - 3);
  } else {
    return null;
  }
}

function IMDbVotes(dom) {
  return evalXPath(dom, "div[@id='wrapper']/div[@id='root']/div[@id='tn15']/div[@id='tn15main']/div[@id='tn15content']/div[@id='tn15rating']/div[2]/small").snapshotItem(0).textContent;
}

function createTr(title, content) {
  var contentTr = document.createElement("tr");
  
  var name = document.createElement("td");
  name.innerHTML = "<b>" + title + "</b>";

  contentTr.insertBefore(name, null);
  contentTr.insertBefore(content, null);

  return contentTr;
}

/* FIXME: Rewrite the next two methods */

function IMDbScore(dom) {
  var content = document.createElement("td");
  var votes = IMDbVotes(dom);

  if (votes.search(/awaiting 5 votes/) == -1) {
    var rating = getPureRating(dom);

    if (rating) {
      var tmpDiv = document.createElement("span");
      tmpDiv.innerHTML = "(" + rating + "/10)&nbsp;" + IMDbVotes(dom);

      var starsDiv = IMDbScoreStars(rating);

      content.insertBefore(starsDiv, null);
      content.insertBefore(tmpDiv, null);
    }
  } else {
    content.innerHTML = "Not enough votes.";
  }
  return createTr("Rating", content);
}

function IMDbScoreStars(rating) {
  var tmpDiv = document.createElement("span");
  tmpDiv.setAttribute("style", "float: left;");

  var style = document.createElement("style");
  style.setAttribute("type", "text/css");
  /* [XXX] Need a better image, transparent and preferrably with FTN icons */
  style.innerHTML = ".starbar {display: inline; height: 20px; width: 200px; }.starbar .outer, .starbar .inner { background: transparent url('http://i.media-imdb.com/images/SFae751da69684847117d205d2cbc0ae90/tn15/stars.gif') no-repeat scroll 0px 0px; } .starbar .outer {height:20px;width:200px;}.starbar .inner { background-position: 0px -20px; height: 20px; width: 0pt; }";
  tmpDiv.insertBefore(style, null);

  var width = rating * 20;
  
  var starbar = document.createElement("span");
  starbar.innerHTML = "<div class='outer'><div class='inner' style='width: " + width + "px'></div></div>";
  starbar.setAttribute("class", "starbar");
  tmpDiv.insertBefore(starbar, null);

  return tmpDiv;
}

function IMDbGenres(dom) {
  var content = document.createElement("td");

  var genres = evalXPath(dom, "div[@id='wrapper']/div[@id='root']/div[@id='tn15']/div[@id='tn15main']/div[@id='tn15content']/div[6]/a");
  if(genres.snapshotLength == 0) {
    content.innerHTML += "No genres.";
  } else {        
    for (var i = 0; i < genres.snapshotLength - 1; i++) {
      content.innerHTML += genres.snapshotItem(i).innerHTML;

      if (i + 1 < genres.snapshotLength - 1) {
        content.innerHTML += " / ";
      }
    }
  }

  return createTr("Genres", content);
}

function IMDbPoster(dom) {
  var content = document.createElement("td");
  var images = evalXPath(dom, "div[@id='wrapper']/div[@id='root']/div[@id='tn15']/div[@id='tn15lhs']/div/a/img/@src");
  var tmpImg = document.createElement("img");
  tmpImg.setAttribute("src", images.snapshotItem(0).textContent);
  content.insertBefore(tmpImg, null);

  return createTr("Poster", content);
}

function IMDbImages(dom) {
  var content = document.createElement("td");

  var style = document.createElement("style");
  style.innerHTML = ".imdbimages { float: left; margin-right: 5px; border: 1px solid #000; }";
  content.insertBefore(style, null);

  var images = evalXPath(dom, "div[@id='wrapper']/div[@id='root']/div[@id='tn15']/div[@id='tn15main']/div[@id='tn15content']/table[1]/tbody/tr[2]/td/div/a/img/@src");

  if ( images.snapshotLength == 0 ) { 
    content.innerHTML += "No images."; 
  } else {
    for (var i = 0; i < images.snapshotLength; i++) {
      var tmpImg = document.createElement("img");
      tmpImg.setAttribute("src", images.snapshotItem(i).textContent);
      tmpImg.setAttribute("class", "imdbimages");
      content.insertBefore(tmpImg, null);
    }
  }
  
  return createTr("Images", content);
}

function IMDbRelease(dom) {
  var content = document.createElement("td");
  var release = evalXPath(dom, "div[@id='wrapper']/div[@id='root']/div[@id='tn15']/div[@id='tn15main']/div[@id='tn15content']/div[5]/text()[2]").snapshotItem(0).textContent;

  if(release && !(hasWhiteSpace(release))) {
    content.innerHTML = release;
  } else {
    content.innerHTML = "No release date listed.";
  }

  return createTr("Release Date", content);
}

function IMDbOutline(dom) {
  var content = document.createElement("td");
  var text = dom.innerHTML;

  var re = /<h5>Plot (?:Summary|Outline):<\/h5>\s*([^<]*)/i;

  var outline = text.match(re);

  if ( outline ) {
    content.innerHTML = outline[1];
  } else {
    content.innerHTML = "Plot outline not available.";
  }

  return createTr("Plot Outline", content);
}

function IMDbRuntime(dom) {
  var content = document.createElement("td");
  var text = dom.innerHTML;

  var re = /(<h5>Runtime:<\/h5>)\s*([^<]*)/;
  
  var runtime = text.match(re);
  
  if( runtime && runtime.length > 0 && !hasWhiteSpace(runtime) ) {
    content.innerHTML = runtime[2];
  } else {
    content.innerHTML = "Runtime not available.";
  }

  return createTr("Runtime", content);
}

function hasWhiteSpace(s) {
  reWhiteSpace = new RegExp(/^(\s|\b)+$/);
  if ( reWhiteSpace.test(s) ) {
    return true;
  } else {
    return false;
  }
}

function createDOM(text) {
  var tmpDiv = document.createElement("div");
  tmpDiv.innerHTML = text;

  return tmpDiv;
}

function insert(destination, content) {
  destination.insertBefore(content, null);
}

function FTNPlusInsert(responseDetails) {
  if (responseDetails.status == "200") {
  var IMDBfetch = createDOM(responseDetails.responseText);

  var trFtnplus = document.createElement("tr");
  trFtnplus.setAttribute("id", "tr_ftnplus");

  var tdName = document.createElement("td");
  tdName.innerHTML = "<b>iMDB</b>";
  tdName.style.textAlign = "right";
  tdName.style.verticalAlign = "top";

  var tdContent = document.createElement("td");

  var style = document.createElement("style");
  style.innerHTML = "table#ftnplus td, table#ftnplus { border-width: 0px; } table#ftnplus td { vertical-align: top; } table#ftnplus td b { display: block; width: 80px; text-align: right; }";

  tdContent.insertBefore(style, null);

  var ftnplusTable = document.createElement("table");
  ftnplusTable.setAttribute("id", "ftnplus");
  ftnplusTable.setAttribute("cellpadding", "3");
  
  insert(ftnplusTable, IMDbScore(IMDBfetch));
  insert(ftnplusTable, IMDbPoster(IMDBfetch));
  insert(ftnplusTable, IMDbRelease(IMDBfetch));
  insert(ftnplusTable, IMDbGenres(IMDBfetch));
  insert(ftnplusTable, IMDbOutline(IMDBfetch));
  insert(ftnplusTable, IMDbRuntime(IMDBfetch));
  insert(ftnplusTable, IMDbImages(IMDBfetch));

  insert(tdContent, ftnplusTable);
  
  insert(trFtnplus, tdName);
  insert(trFtnplus, tdContent);
  var insertion = getInsertionPoint();
  insertion.parentNode.insertBefore(trFtnplus, insertion.nextSibling);
  }
}

function fetch(imdblink) {
  GM_xmlhttpRequest({
    method: 'GET',
    url: imdblink,
    headers: {
      'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
      'Accept': 'application/atom+xml,application/xml,text/xml',
      'Referer': imdblink,
    },
    onload: FTNPlusInsert
  });
}

function getIMDbLink(text) {
  var re = /http:\/\/([^\.]*\.)?imdb.com\/title\/tt[0-9]{7}(\/)?/i;

  var arr = text.match(re);

  if (arr) { 
    return arr[0]; 
  } else { 
    return arr;    
  }
}

function displayFTNPlus() {
  var category = evalXPath(document, '//table[@id="detailtable"]/tbody/tr/td[.="Type"]/following-sibling::td[1]').snapshotItem(0).innerHTML.split("/")[0];

  if (!( category == "Movies" )) { return; }

  var desc = evalXPath(document, '//table[@id="detailtable"]/tbody/tr/td[.="Description"]/ancestor::tr[1]/td[2]').snapshotItem(0).textContent;
  var imdb = getIMDbLink(desc);

  if ( imdb == null ) {
    /* Do nothing */
  } else {
    fetch(imdb);
  }
}

displayFTNPlus();