DMMGirl

DMM.R18/mono/dvd tweak for non-member: show big cover, preload sample picture, local wishlist, remove member functions...

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           DMMGirl
// @namespace      null
// @description    DMM.R18/mono/dvd tweak for non-member: show big cover, preload sample picture, local wishlist, remove member functions...
// @version        1.1.2
// @grant          GM_addStyle
// @include        http://www.dmm.co.jp/*
// @include        http://www.dmm.co.jp/mono/dvd/-/list/*
// @include        http://www.dmm.co.jp/top/-/error/area/*
// @include        http://www.dmm.co.jp/mono/dvd/-/detail/=/cid=*
// ==/UserScript==
var detail = {
  videoEnable: false,
  init: function(c) {
    GM_addStyle(' \
      #mybox {font-size:1.2em; font-weight:bold; background-color:#F7FDFF; border:1px solid #CCCCCC; padding:5px 10px; margin-bottom:10px;} \
      #mybox a {display:block; color:#005FC0; cursor:pointer; text-decoration:none; padding-left:10px; \
        background:url("http://p.dmm.co.jp/p/common/arrow_common.gif") no-repeat scroll left center transparent} \
      #mybox a:active, #mybox a:hover {color:#EE2200 !important; text-decoration:underline !important;} \
      #mybox a:visited {color:#990099 !important;}');
    this.replaceRcolumn(c.comment);
    this.checkVideo();
    this.showCover();
    this.addPreloadRadio(c.preload);
  },
  //==Add preload radio button==
  addPreloadRadio: function(c) {
    var headline = document.getElementsByClassName('headline mg-b10 lh3')[0];
    var nosample = document.querySelectorAll('span.nw')[0];
    if(headline && !nosample) {
      var link = document.createElement('input');
      link.type = 'radio';
      link.id = 'prelink';
      link.addEventListener('click', this.onPreloadSample, false);
      headline.appendChild(link);
      headline.appendChild(document.createTextNode('Preload '));
      if(c) {
        link.click();
      }
    }
  },
  //==Preload previews==
  onPreloadSample: function() {
    this.removeEventListener('click', detail.onPreloadSample, false);
    var sample = document.getElementsByName('sample-image'); //
    var block = document.getElementById('sample-image-block');
    var newblock = document.createElement('div');
    for(var i = 0; i < sample.length; i++) {
      var pic = document.createElement('img');
      pic.src = sample[i].firstChild.src.replace('-', 'jp-');
      pic.height = 73;
      pic.className = 'galpic';
      pic.addEventListener('click', gal.onShowPic, false);
      newblock.appendChild(pic);
    }
    block.parentNode.replaceChild(newblock, block);
  },

  checkVideo: function() {
    var video = document.getElementById('sample-video');
    if(video.lastElementChild.tagName === 'NOSCRIPT') {
      this.videoEnable = true;
    }
  },
  //==Show big cover==
  showCover: function() {
    var sample = document.getElementsByClassName('float-l mg-b20 mg-r12')[0];
    var img = document.getElementsByClassName('tdmm')[0];
    img.src = img.src.replace('ps.jpg', 'pl.jpg');
    removeChildren(sample);
    sample.className = 'mg-b20 mg-r12';
    sample.appendChild(img);
  },
  replaceRcolumn: function(c) {
    var rcolumn = document.getElementsByClassName('vline')[0].nextElementSibling;
    var info = document.getElementsByClassName('mg-b20')[1];
    info.id = 'infot';
    var tbody = info.firstElementChild; //remove last 2 rows
    tbody.removeChild(tbody.lastElementChild);
    var review = document.getElementById('review');
    if(review) {
      var star = tbody.lastElementChild.lastElementChild;
      var vote = document.getElementsByClassName('overview')[0];
      if(vote && star.lastElementChild) {
        star.lastElementChild.innerHTML = '(' + vote.firstElementChild.lastElementChild.innerHTML + ')';
      } else {
        star.lastElementChild.innerHTML = '(0)';
      }
      if(c) {
        review.parentNode.removeChild(review);
      }
    }
    var box = document.getElementsByClassName('bx-option mg-t20')[0];
    if(box) {
      box.parentNode.removeChild(box);
    }
    var tag = document.getElementById('producttag');
    if(tag) {
      tag.parentNode.removeChild(tag);
    }
    var desc = info.nextElementSibling.nextElementSibling;
    var another = document.getElementsByClassName('another')[0];
    removeChildren(rcolumn);
    var div = document.createElement('div');
    div.id = 'mybox';
    var add = document.createElement('a');
    add.textContent = 'Add to Wishlist';
    add.addEventListener('click', this.onAddWish, false);
    var view = document.createElement('a');
    view.href = '/top/-/error/area/';
    view.textContent = 'View Wishlist';
    var search = document.createElement('a');
    search.href = 'https://www.google.com/#q=' + getCid(location.pathname, true)[0];
    search.target = '_blank';
    search.textContent = 'Google It';
    div.appendChild(add);
    div.appendChild(view);
    div.appendChild(search);
    rcolumn.appendChild(div);
    rcolumn.appendChild(info);
    rcolumn.appendChild(desc);
    if(another) {
      rcolumn.appendChild(another);
    }
    var ad = document.getElementsByClassName('mg-b12  center')[0];
    ad.parentNode.removeChild(ad);
  },
  //==Add to wishlist==
  onAddWish: function() {
    var tds = document.querySelectorAll('td.nw'); //[type,date,length,actress,director,series,maker,label,genre,cid]
    var date = tds[1].nextElementSibling;
    var actress = tds[3].nextElementSibling;
    var maker = tds[6].nextElementSibling;
    var cid = tds[9].nextElementSibling.innerHTML;
    var title = document.getElementById('title'); //get title
    var detail = date.innerHTML + '#' + actress.innerHTML + '#' + maker.innerHTML + '#' + title.innerHTML;
    localStorage.setItem(cid, detail);
  }


};
var list = {
  init: function() {
    var smallThumb = document.getElementsByClassName('img');
    for(var i = 0; i < smallThumb.length; i++) {
      smallThumb[i].firstElementChild.addEventListener('mouseover', this.onShowThumb, false);
    }
    var thumb = new Image();
    thumb.id = 'hoverpic';
    thumb.style.position = 'absolute';
    thumb.style.zIndex = 22;
    thumb.style.display = 'none';
    thumb.addEventListener('mouseout', this.onRemoveThumb, false);
    var a = document.createElement('a');
    a.appendChild(thumb);
    document.body.appendChild(a);
  },
  onShowThumb: function() {
    if(this.src.search('noimage') === -1) {
      var thumb = document.getElementById('hoverpic');
      thumb.src = this.src.replace('pt.jpg', 'ps.jpg');
      var pos = this.getBoundingClientRect();
      thumb.style.left = pos.left - 29 + window.pageXOffset + 'px'; //147*200,90*122
      thumb.style.top = pos.top - 39 + window.pageYOffset + 'px';
      thumb.width = 147;
      thumb.height = 200;
      thumb.style.display = 'block';
      thumb.parentNode.href = '/mono/dvd/-/detail/=/cid=' + getCid(this.src)[1] + '/';
    }
  },
  onRemoveThumb: function() {
    this.style.display = 'none';
    this.src = null;
    this.parentNode.href = null;
  }
};
var wish = {
  dvd: [],
  sortType: ['cid', 'date', 'actress', 'maker'],
  init: function() {
    document.title = 'Wishlist';
    GM_addStyle(' \
      body,table {color:#333333; font-size:12px; font-family:"MS PGothic","Osaka";} \
      a:link {color:#005FC0; text-decoration:none;} \
      a:visited {color:#005FC0; text-decoration:none;} \
      a:hover,a:active {color:#EE2200; text-decoration:underline;} \
      table {text-align:center; width:590px; border-collapse:separate; border-spacing:5px;} \
      table th {font-size:1.1em; padding:2px; background-color:#242424; color:#ffffff} \
      table th:hover {cursor:pointer} \
      table td {padding:2px; background-color:#F8F8F8; border:1px solid #CCCCCC;} \
      p {text-align:left}');
    document.body.innerHTML = ' \
      <table> \
        <thead> \
          <tr> \
            <th width="3%">#</th> \
            <th width=15%">Cover</th> \
            <th width="30%" id="cid">CID</th> \
            <th width="17%" id="actress">Actress</th> \
            <th width="17%" id="maker">Maker</th> \
            <th width="14%" id="date">Date</th> \
            <th width="4%">X</th> \
          </tr> \
        </thead> \
        <tbody id="wishlist"></tbody> \
      </table>';
    this.createObj();
    this.fillTable();
  },
  onSort: function() {
    for(var i = 0; i < 4; i++) {
      document.getElementById(wish.sortType[i]).style.backgroundColor = '#242424';
    }
    this.style.backgroundColor = '#C10000';
    wish.dvd.sort(wish.by(this.id));
    wish.fillTable();
  },
  by: function(type) {
    return function(a, b) {
      var c = a[type];
      var d = b[type];
      if(c === d) {
        return 0;
      }
      if(c < d) {
        return -1;
      } else {
        return 1;
      }
    };
  },
  createObj: function() {
    function Dvd(cid, date, actress, maker, title) {
      this.cid = cid;
      this.date = date;
      this.actress = actress;
      this.maker = maker;
      this.title = title;
    }
    for(var i = 0, j = 0; i < localStorage.length; i++) {
      var cid = localStorage.key(i);
      if(cid[0] !== '#' && cid[0] !== '_' && cid.slice(0,3) !== 'cX_') {
        var info = localStorage[cid].split('#'); //Date[0]#Actress[1]#Maker[2]#Title[3]
        info[1] = info[1].replace(/></g, '><br /><');
        this.dvd[j] = new Dvd(cid, info[0], info[1], info[2], info[3]);
        j++;
      }
    }
    this.dvd.sort(this.by('date'));
  },
  fillTable: function() {
    for(var i = 0; i < 4; i++) {
      document.getElementById(this.sortType[i]).addEventListener('click', this.onSort, false);
    }
    var list = document.getElementById('wishlist');
    removeChildren(list);
    for(i = 0; i < this.dvd.length; i++) {
      var item = document.createElement('tr');
      item.innerHTML = ' \
        <td height="130">' + (i + 1) + '</td> \
        <td><img src="http://pics.dmm.co.jp/mono/movie/' + this.dvd[i].cid + '/' + this.dvd[i].cid + 'pt.jpg" /></td> \
        <td><a href="/mono/dvd/-/detail/=/cid=' + this.dvd[i].cid.replace(/so$/, '') + '/">' + this.dvd[i].cid + '<br /></a><p>' + this.dvd[i].title + '</p></td> \
        <td>' + this.dvd[i].actress + '</td> \
        <td name="maker">' + this.dvd[i].maker + '</td> \
        <td>' + this.dvd[i].date + '</td> \
        <td><a href="" onclick="localStorage.removeItem(\'' + this.dvd[i].cid + '\')">' + 'X' + '</a></td>';
      list.appendChild(item);
    }

  }
};
var fav = {
  menus: [],
  init: function() {
    GM_addStyle(' \
      #header .hd-lnav ul li ul li {float:none; margin:0; background-color:#242424; position:relative; z-index:99} \
      #header .hd-lnav ul li ul {display:none; position:absolute;} \
      #header .hd-lnav ul li>ul {top:auto; left:auto;} \
      #header .hd-lnav ul li:hover ul {display:block}');
    this.addLink();
    this.setMenu();
  },
  addLink: function() {
    var wishLink = document.createElement('a');
    wishLink.href = '/top/-/error/area/';
    wishLink.textContent = 'Wishlist';
    wishLink.style.marginLeft = '5px';
    var key = document.getElementsByClassName('popular-keyword')[0];
    key.appendChild(wishLink);
    key.style.right = '-3em';
  },
  setMenu: function() {
    function Menu(label, key) {
      this.label = label;
      this.key = key;
    }
    this.menus[0] = new Menu('Actress', 'actress');
    this.menus[1] = new Menu('Maker', 'maker');
    this.menus[2] = new Menu('Genre', 'keyword', '#GId', '#GName');
    for(var i = 0; i < this.menus.length; i++) {
      var type = this.menus[i].key[0];
      var id = '#' + type + 'ID';
      var name = '#' + type + 'NAME';
      var sid = localStorage.getItem(id);
      if(!sid) {
        localStorage.setItem(id, '[]');
        localStorage.setItem(name, '[]');
      } else {
        var idList = JSON.parse(sid);
        var nameList = JSON.parse(localStorage.getItem(name));
        this.createMenu(this.menus[i].label, this.menus[i].key, idList, nameList);
      }
    }
  },
  createMenu: function(label, key, id, name) {
    var navBar = document.getElementsByClassName('hd-lnav group')[0].firstElementChild;
    var liMenu = document.createElement('li');
    var aMenu = document.createElement('a');
    aMenu.href = '/mono/dvd/-/' + label.toLowerCase() + '/';
    aMenu.textContent = label;
    liMenu.appendChild(aMenu);
    var ulMenu = document.createElement('ul');
    liMenu.appendChild(ulMenu);
    navBar.appendChild(liMenu);
    for(var i = 0; i < id.length; i++) {
      var liSubmenu = document.createElement('li');
      var aSubmenu = document.createElement('a');
      aSubmenu.href = '/mono/dvd/-/list/=/article=' + key + '/id=' + id[i] + '/sort=date/';
      aSubmenu.textContent = name[i];
      liSubmenu.appendChild(aSubmenu);
      ulMenu.appendChild(liSubmenu);
    }
  }
};
var addfav = {
  init: function() {
    GM_addStyle(' \
      #dropzone {position:absolute; left:0; top:0; width:100%; height:100%;} \
      #dropbox {position:relative; font-size:1.2em; font-weight:bold; text-align:center; padding-top:10px; color:#005FC0; \
        height:30px; background-color:#F7FDFF; border:2px dashed #EE2200; margin-bottom:5px; display:none} \
      #dropbox.over {border:2px solid #005FC0;}');
    this.addFav();
  },
  addFav: function() {
    var actress = document.getElementById('performer');
    var performer = actress.querySelectorAll('a');
    for(var c = 0 ; c < performer.length; c++) {
      actress.parentNode.insertBefore(performer[c], actress);
    }
    actress.parentNode.removeChild(actress);
    var tds = document.getElementsByClassName('nw');
    var k = [3, 6, 8]; //3:actress, 6: maker, 8: genre
    for(var i = 0; i < k.length; i++) {
      var link = tds[k[i]].nextElementSibling.children;
      for(var j = 0; j < link.length; j++) {
        link[j].addEventListener('dragstart', this.onDragStart, false);
        link[j].addEventListener('dragend', this.onDragEnd, false);
      }
    }
    var info = document.getElementById('infot');
    var box = document.createElement('div');
    box.id = 'dropbox';
    var zone = document.createElement('div');
    zone.id = 'dropzone';
    box.appendChild(zone);
    box.appendChild(document.createTextNode('Drop Here'));
    info.parentNode.insertBefore(box, info);
    zone.addEventListener('dragenter', this.onDragEnter, false);
    zone.addEventListener('dragover', this.onDragOver, false);
    zone.addEventListener('dragleave', this.onDragLeave, false);
    zone.addEventListener('drop', this.onDrop, false);
  },
  onDragStart: function(e) {
    document.getElementById('dropbox').style.display = 'block';
    e.dataTransfer.effectAllowed = 'link';
    e.dataTransfer.setData('aName', this.text);
    e.dataTransfer.setData('aLink', this.href);
  },
  onDragOver: function(e) {
    e.preventDefault();
    e.dataTransfer.dropEffect = 'link';
  },
  onDragEnter: function() {
    this.parentNode.classList.add('over');
  },
  onDragLeave: function() {
    this.parentNode.classList.remove('over');
  },
  onDrop: function(e) {
    e.stopPropagation();
    e.preventDefault();
    this.classList.remove('over');
    var aName = e.dataTransfer.getData('aName');
    var aLink = e.dataTransfer.getData('aLink');
    var aId = aLink.match(/\d+/)[0];
    var aType = aLink.match(/article=([a-z])/)[1];
    var itemId = '#' + aType + 'ID';
    var itemName = '#' + aType + 'NAME';
    //this.innerHTML=aType + ':'aName + ',' + aId;
    var aIdList = JSON.parse(localStorage.getItem(itemId));
    if(aIdList) {
      if(aIdList.indexOf(aId) === -1) {
        aIdList.push(aId);
        var aNameList = JSON.parse(localStorage.getItem(itemName));
        aNameList.push(aName);
        localStorage.setItem(itemId, JSON.stringify(aIdList));
        localStorage.setItem(itemName, JSON.stringify(aNameList));
      }
    } else {
      aIdList = [];
      aNameList = [];
    }
  },
  onDragEnd: function() {
    document.getElementById('dropbox').style.display = 'none';
  }
};
var gal = {
  init: function(e, width, height) {
    var div = document.createElement('div');
    var background = document.createElement('div');
    background.setAttribute('style', 'position:fixed; height:100%; width:100%; left:0; top:0; background-color:black; opacity:0.8;z-index:20');
    background.addEventListener('click', function() {
      document.body.removeChild(div);
    }, true);
    var box = document.createElement('div');
    box.id = 'box';
    box.style.position = 'absolute';
    box.style.left = window.pageXOffset + (window.innerWidth - width) / 2 + 'px';
    box.style.top = window.pageYOffset + (window.innerHeight - height) / 2 + 'px';
    box.style.zIndex = 21;
    document.body.appendChild(div);
    div.appendChild(background);
    div.appendChild(box);
    box.appendChild(e);
  },
  //==Show preview gallery==
  onShowPic: function() {
    var origin = new Image();
    origin.src = this.src;
    var leftd = document.createElement('div');
    leftd.id = 'leftd';
    leftd.setAttribute('style', 'position:absolute; left:0; top:0; height:100%; width:50%');
    leftd.addEventListener('click', gal.onShowNext, true);
    var rightd = document.createElement('div');
    rightd.id = 'rightd';
    rightd.setAttribute('style', 'position:absolute; right:0; top:0; height:100%; width:50%');
    rightd.addEventListener('click', gal.onShowNext, true);
    var image = document.createElement('div');
    image.appendChild(origin);
    image.appendChild(leftd);
    image.appendChild(rightd);
    gal.init(image, origin.width, origin.height);
  },
  //==Show next preview==
  onShowNext: function() {
    var box = document.getElementById('box');
    var curpic = box.firstChild.firstChild;
    var gal = document.getElementsByClassName('galpic').length;
    var num = (this.id === 'leftd') ? -1 : 1;
    var patt = /\d+(?=\.jpg$)/;
    patt.compile(patt);
    var nextnum = parseInt(curpic.src.match(patt)[0], 10) + num;
    if(nextnum <= gal && nextnum > 0) {
      var nextpic = new Image();
      nextpic.src = curpic.src.replace(patt, nextnum);
      box.style.left = window.pageXOffset + (window.innerWidth - nextpic.width) / 2 + 'px';
      box.style.top = window.pageYOffset + (window.innerHeight - nextpic.height) / 2 + 'px';
      box.firstChild.insertBefore(nextpic, curpic);
      box.firstChild.removeChild(curpic);
    } else {
      document.body.removeChild(box.parentNode);
    }
  },
  onPlay: function() {
    var video = document.createElement('div');
    video.id = 'samplevideo';
    video.width = 560;
    video.height = 440;
    video.setAttribute('style', 'border:5px solid #FFFFFF; color: #F4F4F4; font-weight:bold;');
    video.textContent = 'Loading...';
    gal.init(video, video.width, video.height);
  }
};
var sample = {
  init: function() {
    if(detail.videoEnable) {
      this.createLink();
    }
  },
  createLink: function() {
    var mybox = document.getElementById('mybox');
    var play = document.createElement('a');
    play.textContent = 'Play Sample';
    play.addEventListener('click', gal.onPlay, false);
    play.addEventListener('click', sample.injectScript, false);
    mybox.appendChild(play);
  },
  injectScript: function() {
    function handelVideo() {
      $('#samplevideo').load(location.pathname + 'ajax=movie/');
    }

    function closePlayer() {
      $('#box').parent().remove();
    }
    var inject = document.createElement('script');
    inject.appendChild(document.createTextNode('(' + handelVideo + ')();'));
    inject.appendChild(document.createTextNode(closePlayer));
    var sample = document.getElementsByClassName('mg-b20 mg-r12')[0];
    sample.parentNode.insertBefore(inject, sample);
  }
};
//Get cid of the dvd: type ? realcid : dmmcid
//realcid[abcd123, abcd, 123] dmmcid[abcd123so, abcd123]


function getCid(str, type) {
  return type ? str.match(/([a-z]+)([0-9]+)/) : str.match(/(\w+\d+)(?:so)?/);
}

function removeChildren(e) {
  while(e.firstChild) {
    e.removeChild(e.firstChild);
  }
}

(function() {
  //hide welcome
  GM_addStyle('#welcome {display:none !important;}');
  var page = /\/top\/-\/error\/area\/|\/detail\/|\/list\//.exec(location.pathname);
  if(page) {
    var config = {
      comment: true,
      //remove comments
      preload: false //auto preload
    };
    switch(page[0]) {
    case '/list/':
      list.init();
      fav.init();
      break;
    case '/top/-/error/area/':
      wish.init();
      break;
    case '/detail/':
      detail.init(config);
      sample.init();
      fav.init();
      addfav.init();
      break;
    }
  }
})();