DMMGirl

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

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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;
    }
  }
})();