DMMGirl

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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;
    }
  }
})();