AmebaVision Movie Searcher

By moaikids Last update Jan 9, 2007 — Installed 395 times.
// ==UserScript==
// @name             AmebaVision Movie Searcher
// @namespace        http://www.moaikids.net/
// @include          http://ja.wikipedia.org/wiki/*
// @include          http://www.youtube.com/results*
// @include          http://www.google.co.jp/search*
// @version          1.00
// ==/UserScript==

const WATCH_URL = 'http://vision.ameba.jp/watch.do?movie=';
const API_URL = 'http://vision.ameba.jp/api/get/search/keyword/new.do?keyword=';
const SEARCH_URL = 'http://vision.ameba.jp/search/keyword/new.do?keyword=';
const ELEMENT_THUMBNAIL = 'imageUrlSmall';
const ELEMENT_TITLE = 'title';
const ELEMENT_TAG_ID = 'tagId';
const MAX_MOVIE_LENGTH = 5;
var PANEL_ALIGN = 'left';
var SITE_QUERY = '';


function main() {
	var site = Site.get(location.href);

	if(!site){
		return;
	}

	if(site.align && site.align.length > 0){
		PANEL_ALIGN = site.align;
	}
	
	var query = location.href.substring(site.url.length);

	if(site.query && site.query.length > 0){
		query = query.replace('?','');
		var queryList = query.split('&');
		for(var i = 0 ; i < queryList.length ; i++){
			var param = queryList[i].split('=');
			if(!param || param.length < 2){
				continue;
			}
			if(param[0] == site.query){
				query = param[1];
				break;
			}
		}
	}
	SITE_QUERY = query;
	
	var reader = new Reader();
    reader.read(API_URL + query);

}

var Class = {
   create: function() {
      var newClass = function() {
         this.initialize.apply(this, arguments);
      }
      newClass.prototype.initialize = function() {}
      return newClass;
   }
};

Function.prototype.extend = function(newClass) {
   var proto = this.prototype;
   for(var property in newClass)
      proto[property] = newClass[property];
}

Function.extend({
   bind: function(base) {
      var self = this;
      return function() {
         self.apply(base, arguments);
      }
   }
});

var Reader = Class.create();
Reader.extend({
	initialize: function() {
		this.panel = new Panel();
	},

	read: function(url) {
		GM_xmlhttpRequest({
			method: 'GET',
			url: url,
			onload: this.onSuccess.bind(this),
			onerror: this.onError.bind(this)
		});
	},

   onSuccess: function(response) {
		if(!response.responseText)
			return this.onError();

		try {
			var parser = new Parser();
			parser.parse(response.responseText);
			
			var count = parser.getCount();
			if(count <= 0 ){
				return;
			}
			if(count > MAX_MOVIE_LENGTH){
				count = MAX_MOVIE_LENGTH;
			}
			
			var html = '<div id="ameba_vision_movie_search_result">';
			for(var i = 0 ; i < count ; i++){
				var thumbnail = parser.getValue(ELEMENT_THUMBNAIL, i);
				var title     = parser.getValue(ELEMENT_TITLE, i);
				var tagId     = parser.getValue(ELEMENT_TAG_ID, i);
				
				html += '<div id="ameba_vision_movie_info">' +
				        '<a href="' + WATCH_URL + tagId + '" target="_blank">' + 
				        '<div id="ameba_vision_movie_title"><b>' + title + '</b></div>' +
				        '<img src="' + thumbnail + '" />' + 
				        '</a>' +
				        '</div>';
			}
			html += '<a href="' + SEARCH_URL + SITE_QUERY + '" target="_blank">AmebaVision</a>' + 
			        '</div>';

			this.panel.create(html);
		} catch(e) {
			this.panel.create('Parse Error');
			return;
		}
   },

	onError: function() {
		this.panel.create('HTTP Load Error');
	}
});

var Parser = Class.create();
Parser.extend({
	initialize: function() {
		this.items = [];
	},

	parse: function(data) {
		try {
			var wrap   = new XPCNativeWrapper(window, 'DOMParser()');
			var parser = new wrap.DOMParser();
			this.head  = parser.parseFromString(data, 'application/xhtml+xml');
			this.items = this.head.getElementsByTagName('item');
		} catch(e) {
			throw 'parse error';
		}
	},
	
	getCount: function(name,count) {
		return this.items.length;
	},

	getValue: function(name,count) {
		if(!this.items){
			return undefined;
		}
		if(!count){
			count = 0;
		}
		
		var item = this.items[count];
		var value = (item.getElementsByTagName(name))[0].childNodes[0].nodeValue;

		return value;
	}
});

var Panel = Class.create();

Panel.extend({
	element: function(html) {
		var div = document.createElement('div');
		if(html) div.innerHTML = html;
		return div;
	},

	create: function(msg) {
		var GM_infoPanel = document.createElement('div');
		with(GM_infoPanel.style) {
			bottom   = 0;

			if(PANEL_ALIGN == 'right'){
				right = 0;
			}else{
				left  = 0;
			}
			padding  = '2px';
			opacity  = 0.8;
			fontSize = 'x-small';
			color    = '#000000';
//			backgroundColor = '#EEEEEE';
			backgroundColor = '#98FB98';
			border   = '1px solid #C0C0C0';
			width = '150px'

			zIndex   = 100;
			position = 'fixed';
		}

		document.body.appendChild(GM_infoPanel);
		var msgspace = this.element();
		msgspace.style.margin = '0.5em 1em';
		GM_infoPanel.appendChild(msgspace);

		this.panel = msgspace;
		this.insert(msg);
	},

   insert: function(msg) {
      if(typeof msg  == 'string') {
         this.panel.innerHTML = msg;
      } else {
         this.panel.innerHTML = '';
         this.panel.appendChild(msg);
      }
   },

   insertError: function(msg) {
      this.insert('<font color="red">' + msg + '</font>');
   }
});



var PatternMap = {
	lists: new Array(),

	add: function(m) {
		this.lists.push(m);
	},

	get: function(url) {
		if(this.result){
			return this.result;
		}

		for(var i = 0 ; i < this.lists.length ; i++) {
			var site = this.lists[i];
			if(url.indexOf(site.url) >= 0){
				return this.result = site;
			}
		}
		return null;
   },
};

var Site = PatternMap;
// Google(ja)
PatternMap.add({
   url:   'http://www.google.co.jp/search',
   query: 'q',
   align:   'right'
});
// Wikipedia(ja)
PatternMap.add({
   url:   'http://ja.wikipedia.org/wiki/',
   query: '',
   align:   'left'
});
// YouTube
PatternMap.add({
   url:   'http://www.youtube.com/results',
   query: 'search_query',
   align:   'right'
});


main();