see douban book movie music in every webpage by selecting text
// ==UserScript== // @name quick-view-douban // @namespace http://vivyli.com // @modified ywzhaiqi // @include * // @version 2.1 // @description see douban book movie music in every webpage by selecting text // @description 修正电影搜索,增加图片显示 // @grant GM_xmlhttpRequest // ==/UserScript== var apikey = '0c088077ba8a630f241981672f9f292d'; var imgDouban; var txtSelection; var isBookClicked = false; var isMovieClicked = false; var isMusicClicked = false; var q = null; var userAgent = 'known'; initialize(); document.addEventListener('mousedown', clean, false); document.addEventListener('mouseup', showIcon, false); function clean(event) { var divInfo = getId('divInfo'); var divSearch = getId('divSearch'); if (divInfo) { if (!clickedInsideID(event.target, 'divInfo')) divInfo.parentNode.removeChild(divInfo); } if (divSearch) divSearch.parentNode.removeChild(divSearch); } function showIcon(event) { var divInfo = getId('divInfo'); var divSearch = getId('divSearch'); if (!clickedInsideID(event.target, 'divInfo')) txtSelection = getSelection(event); else return; if (txtSelection == '') { return; } else { q = txtSelection; } divSearch = createElement('div', { id: 'divSearch', style: 'top:' + (event.clientY + window.pageYOffset + 10) + 'px; left:' + (event.clientX + window.pageXOffset + 10) + 'px;' }); divSearch.appendChild(imgDouban.cloneNode(false)); divSearch.addEventListener('mouseover', showDouban, false); document.body.appendChild(divSearch); } function showDouban(event) { var divR###lt = null; var divInfo = getId('divInfo'); var divSearch = getId('divSearch'); var top = divSearch.style.top; var left = divSearch.style.left; divInfo = createElement('div', { id: 'divInfo' }); divInfo.style.top = top; divInfo.style.left = left; document.body.appendChild(divInfo); var bookDiv = createElement('div', { id: 'bookDiv', title: 'book' }, null, null); var bookClickDiv = createElement('div', { id: 'bookClickDiv' }, 'mouseup showDoubanBook false', '+豆瓣读书'); bookDiv.appendChild(bookClickDiv); divInfo.appendChild(bookDiv); var movieDiv = createElement('div', { id: 'movieDiv', title: 'movie' }, null, null); var movieClickDiv = createElement('div', { id: 'movieClickDiv' }, 'mouseup showDoubanMovie false', '+豆瓣电影'); movieDiv.appendChild(movieClickDiv); divInfo.appendChild(movieDiv); var musicDiv = createElement('div', { id: 'musicDiv', title: 'music' }, null, null); var musicClickDiv = createElement('div', { id: 'musicClickDiv' }, 'mouseup showDoubanMusic false', '+豆瓣音乐'); musicDiv.appendChild(musicClickDiv); divInfo.appendChild(musicDiv); } function showDoubanBook(event) { if (isBookClicked == false) { getId('bookClickDiv').innerHTML = '-豆瓣读书 loading...'; isBookClicked = true; showBookInfo(); } else if (isBookClicked == true) { getId('bookClickDiv').innerHTML = '+豆瓣读书'; cleanBook(); //getId('bookDiv') isBookClicked = false; } } function cleanBook() { var bookInfo = getId('bookInfo'); var morebooks = getId('morebooks'); if (bookInfo != null) bookInfo.parentNode.removeChild(bookInfo); if (morebooks != null) morebooks.parentNode.removeChild(morebooks); } function showBookInfo() { var bookurl = 'http://api.douban.com/book/subjects?q=' + q + '&apikey=' + apikey; var moreurl = 'http://book.douban.com/subject_search?search_text=' + q + '&cat=1001'; GM_xmlhttpRequest({ method: 'GET', url: bookurl, onload: function(resp) { var book = parseBook(resp.responseText); var bookInfo = createElement('div', { id: 'bookInfo' }, null, book); getId('bookDiv').appendChild(bookInfo); var more = createElement('div', { id: 'more' }, null, null); getId('bookDiv').appendChild(more); more.appendChild(createElement('a', { id: 'morebooks', href: moreurl, target: '_blank' }, null, '--更多书籍--')); getId('bookClickDiv').innerHTML = '-豆瓣读书'; } }); } function parseBook(text) { return parse(text, 'Book'); } // Douban Movie function showDoubanMovie(event) { if (isMovieClicked == false) { getId('movieClickDiv').innerHTML = '-豆瓣电影 loading...'; isMovieClicked = true; // showMovieInfo(); showMovieInfo2(); } else if (isMovieClicked == true) { getId('movieClickDiv').innerHTML = '+豆瓣电影'; cleanMovie(); //getId('bookDiv') isMovieClicked = false; } } function cleanMovie() { var movieInfo = getId('movieInfo'); var moremovies = getId('moremovies'); if (movieInfo != null) movieInfo.parentNode.removeChild(movieInfo); if (moremovies != null) moremovies.parentNode.removeChild(moremovies); } // version 2 function showMovieInfo2() { var movieurl = 'https://api.douban.com/v2/movie/search?q=' + q; var moreurl = 'http://movie.douban.com/subject_search?search_text=' + q + '&cat=1002'; GM_xmlhttpRequest({ method: 'GET', url: movieurl, onload: function(res) { var obj = JSON.parse(res.responseText); var movie = obj.subjects[0]; var html; if(movie){ movie.subtype = (movie.subtype == 'tv') ? "电视剧" : "电影"; movie.original_title = (movie.original_title == movie.title) ? "" : movie.original_title; var template = '\ <img src="{images.small}" alt={alt} align="right"/>\ {subtype}: <a id = "turl" href="{alt}" target="_blank">{title}</a><br/>\ 原名: {original_title}<br/>\ 时间: {year}<br/>\ <span class="_allstar{rating.stars}"></span>\ <span>{rating.average}</span>\ <span>({collect_count}评价)</span>\ '; html = nano(template, movie); }else{ html = "对不起,找不到相关的电影"; } var movieInfo = createElement('div', { id: 'movieInfo' }, null, html); getId('movieDiv').appendChild(movieInfo); var more = createElement('div', { id: 'more' }, null, null); getId('movieDiv').appendChild(more); more.appendChild(createElement('a', { id: 'moremovies', href: moreurl, target: '_blank' }, null, '--更多电影--')); getId('movieClickDiv').innerHTML = '-豆瓣电影'; } }); } function showMovieInfo() { //alert(q); var movieurl = 'http://api.douban.com/movie/subjects?q=' + q + '&apikey=' + apikey; var moreurl = 'http://movie.douban.com/subject_search?search_text=' + q + '&cat=1002'; GM_xmlhttpRequest({ method: 'GET', url: movieurl, onload: function(resp) { var movie = parseMovie(resp.responseText); var movieInfo = createElement('div', { id: 'movieInfo' }, null, movie); getId('movieDiv').appendChild(movieInfo); var more = createElement('div', { id: 'more' }, null, null); getId('movieDiv').appendChild(more); more.appendChild(createElement('a', { id: 'moremovies', href: moreurl, target: '_blank' }, null, '--更多电影--')); getId('movieClickDiv').innerHTML = '-豆瓣电影'; } }); } function parseMovie(text) { return parse(text, 'Movie'); } //Douban Music function showDoubanMusic(event) { if (isMusicClicked == false) { getId('musicClickDiv').innerHTML = '-豆瓣音乐 loading...'; isMusicClicked = true; showMusicInfo(); } else if (isMusicClicked == true) { getId('musicClickDiv').innerHTML = '+豆瓣音乐'; cleanMusic(); //getId('bookDiv') isMusicClicked = false; } } function cleanMusic() { var musicInfo = getId('musicInfo'); var moremusics = getId('moremusics'); if (musicInfo != null) musicInfo.parentNode.removeChild(musicInfo); if (moremusics != null) moremusics.parentNode.removeChild(moremusics); } function showMusicInfo() { var musicurl = 'http://api.douban.com/music/subjects?q=' + q + '&apikey=' + apikey; var moreurl = 'http://music.douban.com/subject_search?search_text=' + q + '&cat=1003'; GM_xmlhttpRequest({ method: 'GET', url: musicurl, onload: function(resp) { var music = parseMusic(resp.responseText); var musicInfo = createElement('div', { id: 'musicInfo' }, null, music); getId('musicDiv').appendChild(musicInfo); var more = createElement('div', { id: 'more' }, null, null); getId('musicDiv').appendChild(more); more.appendChild(createElement('a', { id: 'moremusics', href: moreurl, target: '_blank' }, null, '--更多音乐--')); getId('musicClickDiv').innerHTML = '-豆瓣音乐'; } }); } function parseMusic(text) { return parse(text, 'Music'); } function parse(text, category) { var cat = category; if (category == 'Book') cat = '书籍'; else if (category == 'Music') cat = '音乐'; else if (category == 'Movie') cat = '电影'; var ratingTag = 'rating'; var attributeTag = 'attribute'; if (userAgent == 'Firefox') { ratingTag = 'gd:' + ratingTag; attributeTag = 'db:' + attributeTag; } var res = ''; var parser = new DOMParser(); var dom = parser.parseFromString(text, "text/xml"); var entities = dom.getElementsByTagName("entry"); if (entities.length > 0) { var entry = entities[0]; var id = entry.getElementsByTagName("id")[0].textContent; var title = entry.getElementsByTagName("title")[0].textContent; var rate = entry.getElementsByTagName(ratingTag)[0].getAttribute('average'); var total = entry.getElementsByTagName(ratingTag)[0].getAttribute('numRaters'); var attrs = entry.getElementsByTagName(attributeTag); var links = entry.getElementsByTagName('link'); if (category == 'Book') { var author = ''; var price = ''; var publisher = ''; var pubdate = ''; for (var i = 0; i < attrs.length; i++) { var name = attrs[i].getAttribute('name').toString(); if (name == "author") { if (author == '') author = attrs[i].textContent; else author += ', ' + attrs[i].textContent; } else if (name == 'price') { price = attrs[i].textContent; } else if (name == 'publisher') { publisher = attrs[i].textContent; } else if (name == 'pubdate') { pubdate = attrs[i].textContent; } } var url = ''; if (links.length > 0) { for (var i = links.length - 1; i >= 0; i--) { var rel = links[i].getAttribute('rel').toString(); if (rel == 'alternate') { url = links[i].getAttribute('href').toString(); break; } }; } var imgSrc = entry.querySelector('link[rel="image"]').getAttribute('href'); res = '<img src="' + imgSrc + '" align="right"/>' + '书籍: <a id = "turl" href = "' + url + '" target = "_blank">' + title + '</a><br/>' + '作者: ' + author + '<br/>' + '价格: ' + price + '<br/>' + '发行: ' + publisher + '<br/>' + '时间: ' + pubdate + '<br/>' + '评分: ' + rate + '(共' + total + ' 条评价)'; } else if (category == 'Music') { var singer = ''; var pubdate = ''; var publisher = ''; for (var i = 0; i < attrs.length; i++) { var name = attrs[i].getAttribute('name'); if (name == 'singer') { if (singer == '') singer = attrs[i].textContent; else singer += ', ' + attrs[i].textContent; } else if (name == 'pubdate') { pubdate = attrs[i].textContent; } else if (name == 'publisher') { publisher = attrs[i].textContent; } } var url = ''; if (links.length > 0) { for (var i = links.length - 1; i >= 0; i--) { var rel = links[i].getAttribute('rel').toString(); if (rel == 'alternate') { url = links[i].getAttribute('href').toString(); break; } }; } res = cat + ': <a id = "turl" href = "' + url + '" target = "_blank">' + title + '</a><br/>' + '歌手: ' + singer + '<br/>' + '时间: ' + pubdate + '<br/>' + '发行: ' + publisher + '<br/>' + '评分: ' + rate + '(共' + total + ' 条评价)'; } else if (category == 'Movie') { var country = ''; var director = ''; var pubdate = ''; var lang = ''; var cast = ''; for (var i = 0; i < attrs.length; i++) { var name = attrs[i].getAttribute('name'); if (name == 'country') { if (country == '') country = attrs[i].textContent; else country += ', ' + attrs[i].textContent; } else if (name == 'director') { if (director == '') director = attrs[i].textContent; else director += ', ' + attrs[i].textContent; } else if (name == 'pubdate') { pubdate = attrs[i].textContent; } else if (name == 'language') { if (lang == '') lang = attrs[i].textContent; else lang += ', ' + attrs[i].textContent; } else if (name == 'cast') { if (cast == '') cast = attrs[i].textContent; else cast += ', ' + attrs[i].textContent; } } var url = ''; if (links.length > 0) { for (var i = links.length - 1; i >= 0; i--) { var rel = links[i].getAttribute('rel').toString(); if (rel == 'alternate') { url = links[i].getAttribute('href').toString(); break; } }; } res = cat + ': <a id = "turl" href = "' + url + '" target = "_blank">' + title + '</a><br/>' + '导演: ' + director + '<br/>' + '主演: ' + cast + '<br/>' + '国家: ' + country + '<br/>' + '时间: ' + pubdate + '<br/>' + '评分: ' + rate + '(共' + total + ' 条评价)'; } return res; } return '对不起,找不到相关的' + cat; } function getSelection(event) { var txt = null; if (event && event.target.nodeName == 'TextArea') { txt = event.target.value.substr(event.target.selectionStart, event.target.selectionEnd - event.target.selectionStart); } else if (window.getSelection) { txt = window.getSelection(); } else if (document.getSelection) { txt = window.getSelection(); } else if (document.selection) { txt = document.selection.createRange().text; } return txt.toString(); } function getId(id, parent) { if (!parent) return document.getElementById(id); return parent.getElementById(id); } function createElement(type, attrArray, evtListener, html) { var node = document.createElement(type); for (var attr in attrArray) if (attrArray.hasOwnProperty(attr)) { node.setAttribute(attr, attrArray[attr]); } if (evtListener) { var a = evtListener.split(' '); node.addEventListener(a[0], eval(a[1]), eval(a[2])); } if (html) node.innerHTML = html; return node; } function getTag(name, parent) { if (!parent) return document.getElementsByTagName(name); return parent.getElementsByTagName(name); } function clickedInsideID(target, id) { if (target.getAttribute('id') == id) return getId(id); if (target.parentNode) { while (target = target.parentNode) { try { if (target.getAttribute('id') == id) return getId(id); } catch (e) {} } } return null; } // initialize function initialize() { images(); css(); checkUserAgent(); } function checkUserAgent() { if (navigator["userAgent"].indexOf('Firefox') != -1) userAgent = 'Firefox'; else if (navigator['userAgent'].indexOf('Chrome') != -1) userAgent = 'Chrome'; } function css() { var style = createElement('style', { id: 'douban-view', type: "text/css" }, null, "" + '#bookClickDiv {cursor : pointer; color: #FFFFFF;}' + '#musicClickDiv {cursor : pointer;color: #FFFFFF;}' + '#movieClickDiv {cursor: pointer;color: #FFFFFF;}' + '#bookInfo {color: #FFFFFF;}' + '#musicInfo {color: #FFFFFF;}' + '#movieInfo {color: #FFFFFF;}' + '#divSearch { background-color:#FFFFFF; color:#000000; position:absolute; padding:3px; z-index:999999999; -moz-border-radius:3px; }' + '#divInfo { background-color:#000000; color:#FFFFFF !important; filter: Alpha(opacity=10);opacity:0.75; position:absolute; min-width:250px; min-height:50px; max-width:100%; padding:7px; font-size:small; text-align:left; z-index:999999999; -moz-border-radius:3px; }' + '#more{ text-align: right;}' + '#morebooks{color: #FFAA00}' + '#moremusics{color: #FFAA00}' + '#moremovies{color: #FFAA00}' + '#turl{color: #FFAA00}' + '._allstar50, ._allstar45, ._allstar40, ._allstar35, ._allstar30, ._allstar25, ._allstar20, ._allstar15, ._allstar10, ._allstar05 {\ background: url("http://www.douban.com/pics/movie/midstars.gif") no-repeat scroll 0 0 transparent;\ display: inline-block;\ height: 11px;\ margin: 0 3px 0 0;\ overflow: hidden;\ width: 55px;\ }' ); getTag('head')[0].appendChild(style); } function images() { imgDouban = createElement('img', { border: 0 }); imgDouban.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAARCAYAAADUryzEAAADHmlDQ1BJQ0MgUHJvZmlsZQAAeAGFVN9r01AU/tplnbDhizpnEQk+aJFuZFN0Q5y2a1e6zVrqNrchSJumbVyaxiTtfrAH2YtvOsV38Qc++QcM2YNve5INxhRh+KyIIkz2IrOemzRNJ1MDufe73/nuOSfn5F6g+XFa0xQvDxRVU0/FwvzE5BTf8gFeHEMr/GhNi4YWSiZHQA/Tsnnvs/MOHsZsdO5v36v+Y9WalQwR8BwgvpQ1xCLhWaBpXNR0E+DWie+dMTXCzUxzWKcECR9nOG9jgeGMjSOWZjQ1QJoJwgfFQjpLuEA4mGng8w3YzoEU5CcmqZIuizyrRVIv5WRFsgz28B9zg/JfsKiU6Zut5xCNbZoZTtF8it4fOX1wjOYA1cE/Xxi9QbidcFg246M1fkLNJK4RJr3n7nRpmO1lmpdZKRIlHCS8YlSuM2xp5gsDiZrm0+30UJKwnzS/NDNZ8+PtUJUE6zHF9fZLRvS6vdfbkZMH4zU+pynWf0D+vff1corleZLw67QejdX0W5I6Vtvb5M2mI8PEd1E/A0hCgo4cZCjgkUIMYZpjxKr4TBYZIkqk0ml0VHmyONY7KJOW7RxHeMlfDrheFvVbsrj24Pue3SXXjrwVhcW3o9hR7bWB6bqyE5obf3VhpaNu4Te55ZsbbasLCFH+iuWxSF5lyk+CUdd1NuaQU5f8dQvPMpTuJXYSWAy6rPBe+CpsCk+FF8KXv9TIzt6tEcuAcSw+q55TzcbsJdJM0utkuL+K9ULGGPmQMUNanb4kTZyKOfLaUAsnBneC6+biXC/XB567zF3h+rkIrS5yI47CF/VFfCHwvjO+Pl+3b4hhp9u+02TrozFa67vTkbqisXqUj9sn9j2OqhMZsrG+sX5WCCu0omNqSrN0TwADJW1Ol/MFk+8RhAt8iK4tiY+rYleQTysKb5kMXpcMSa9I2S6wO4/tA7ZT1l3maV9zOfMqcOkb/cPrLjdVBl4ZwNFzLhegM3XkCbB8XizrFdsfPJ63gJE722OtPW1huos+VqvbdC5bHgG7D6vVn8+q1d3n5H8LeKP8BqkjCtbCoV8yAAACAUlEQVQ4EZVTz0sbQRh9+0tTbf0RFRWprawGEbQgDa5NcpP2Iu3BlmqN/4v/gCBePIiIKBEvHooULAEvEUSxtqJio1ZLwepajJqou0k2cWY3WbNJhTjLzM735r038307y0S1WNK3PIvAzhJCV+fIp5UXl8Hd7MIn6SO4hteOwflvX6DElHy0Oodyg393oWgqOLtUNajGo3mLM4knoWPwl0pYxzzkSO/auzPX753vy78w6h8D1fJp1tafbezLB1CjKsCk0ax3EhB4HnFNMxdMg7OrEED625fdeFZZTwi5LhHlEnMrn3FxfZFrQJE6ex16ne8xuTQNlRQo2+SDswdHZydY2Pj6fwOe4yCH/xGC3yRkTl48bYUgmIfWlyyRRnKrfGwHLehNTAXLGGkkQR6Sv1glYvd4L9PzrogUPQ2fYmHTD0ns0EkcxxpkItYSCQTlINYOvxtYarScQI1FMRXw4U1bFw7kQwRTu9mEQgx4vBhfnEAimbAYpLawYHhUWAS3w2WCjpomPK+ozxFTgmnAMiwKeEHvO0c/oZGd0rHkkLD++4cZUzzdmJ6RPpIh4HX3QawWDZzkS0GGNfxrS6oRuj6HEqefFoioEQzND+tzvsT2RL+S04EZHXjIQLWsp8XzEI2F625+Bd7b2Ys4+RuX91YtV9TCzApKi0ohNTox4OrHLRsAtvjqiOggAAAAAElFTkSuQmCC'; } var _regex = /\{([\w\.]*)\}/g; function nano(template, data) { return template.replace(this._regex, function(str, key) { var keys = key.split('.'), value = data[keys.shift()]; keys.forEach(function(key) { value = value[key]; }); return (value === null || value === undefined) ? '' : value; }); }