詳細情報・メニューを表示したり、タグを編集しても、プレイヤーの位置がズレないようにするニコニコ動画用Greasemonkeyスクリプト - (ββ)対応版

機能

  • 動画のタイトルを最初からすべて表示する
  • 詳細情報・メニューが以下のように動画の右側に表示される

プレイヤーがズレない

追記|2009.01.02

  • タグ編集時にもプレイヤーがズレないようにした
  • チャンネル動画における不具合を修正した

スクリプト

// ==UserScript==
// @name nicoPlayerFix
// @namespace null
// @description Script for fixing player section
// @include http://www.nicovideo.jp/watch/*
// @exclude null
// ==/UserScript==

(function () {
//動画タイトルを全部表示
  var movieTitle = document.getElementsByTagName('h1')[0].cloneNode(true);	
  var h1Container = document.getElementById('des_1').getElementsByClassName('video')[0].parentNode;
  while (h1Container.childNodes.length) {
    h1Container.childNodes[0].parentNode.removeChild(h1Container.childNodes[0]);
  }
  h1Container.appendChild(movieTitle);
  document.getElementsByTagName('h1')[1].style.marginTop = '6px';

//詳細情報・メニュー
  //表示する
  document.getElementById('des_1').getElementsByTagName('a')[0].addEventListener('click', hidePlayerRight, false);
  if (document.getElementById('des_2').getAttribute('style').search(/.+block.+/) == 0) {
    hidePlayerRight();
  }

  //隠す
  var button = document.getElementById('des_2').getElementsByTagName('a');
  for (var i = 0, l = button.length; i < l; i++) {
    if (button[i].getAttribute('href').search(/#/) == 0) {
      var hideDescription = button[i];
    }
  }
  hideDescription.addEventListener('click', showPlayerRight, false);
	
  //包括要素を作成
  var newDescription = document.createElement('div');

  //投稿日
  newDescription.appendChild(document.getElementsByTagName('h1')[1].previousSibling.previousSibling);

  //投稿者コメント
  if (document.getElementById('des_2').getElementsByTagName('img')[0].getAttribute('alt') == '投稿者コメント') {
    newDescription.appendChild(document.getElementById('des_2').getElementsByTagName('img')[0].parentNode);
  }

  //詳細情報
  newDescription.appendChild(document.getElementsByClassName('video_description')[0]);

  //この動画を…
  newDescription.appendChild(document.getElementById('des_2').getElementsByClassName('TXT12')[0]);

  //マイメモリー保存
  newDescription.appendChild(document.getElementById('mymemory_add_form').parentNode.parentNode.parentNode.parentNode);

  //コミュニティ
  if (document.getElementById('des_2').getElementsByClassName('TXT12')[0].firstChild.nodeValue == 'この動画を、あなたが所属するコミュニティに登録しますか?') {
    newDescription.appendChild(document.getElementById('des_2').getElementsByClassName('TXT12')[0].parentNode);
  }

  //チャンネル
  if (document.getElementById('des_2').getElementsByClassName('chacom_bg')[0]) {
    newDescription.appendChild(document.getElementById('des_2').getElementsByClassName('chacom_bg')[0].parentNode);
  }

  //包括要素のスタイル
  document.getElementById('flvplayer_container').style.position = 'relative';
  newDescription.style.position = 'absolute';
  newDescription.style.top = '5px';
  newDescription.style.right = '0';
  newDescription.style.zIndex = '1';
  newDescription.style.width = '400px';

  //包括要素を表示
  document.getElementById('flvplayer_container').appendChild(newDescription);

//タグ	
  GM_addStyle('div#tag_edit_form {position: absolute; top: 5px; right: 0; z-index: 2; width: 400px;}');

  editStartPlus();

//関数
  function getElementsByClassName(name) {
    var elements = [];
    var allElements = document.getElementsByTagName('*');
    for (var i = 0, l = allElements.length; i < l; i++) {
      if (allElements[i].className == name) {
        elements.push(allElements[i]);
      }
    }
    return elements;
  }

  function hidePlayerRight() {
    document.getElementById('flvplayer').style.width = '554px';
  }

  function showPlayerRight() {
    document.getElementById('flvplayer').style.width = '960px';
  }

  function getHeight() {
    document.getElementById('video_tags').parentNode.parentNode.parentNode.parentNode.parentNode.style.height = document.getElementById('video_tags').parentNode.parentNode.parentNode.parentNode.parentNode.offsetHeight + 'px';
  }

  function editStartPlus() {
    window.setTimeout(function() {
      var startButton = document.getElementById('video_tags').getElementsByClassName('tag_txt')[0].getElementsByTagName('a');
      for (var i = 0, l = startButton.length; i < l; i++ ) {
        if (startButton[i].getAttribute('href').search(/^javascript:startTagEdit/) == 0) {
          startButton[i].addEventListener('click', function(){newDescription.style.visibility = 'hidden';}, false);
          startButton[i].addEventListener('click', hidePlayerRight, false);
          startButton[i].addEventListener('mouseover', getHeight, false);
          startButton[i].addEventListener('click', editEndPlus, false);
        }
      }
    }, 1000);
  }
  
  function editEndPlus() {
    window.setTimeout(function() { 
      document.getElementById('flvplayer_container').appendChild(document.getElementById('tag_edit_form'));
      var endButton =     document.getElementById('tag_edit_form').getElementsByClassName('submit')[document.getElementById('tag_edit_form').getElementsByClassName('submit').length - 1];
      endButton.addEventListener('click', showPlayerRight, false);
      endButton.addEventListener('click', editStartPlus, false);
      endButton.addEventListener('click', function(){newDescription.style.visibility = 'visible';}, false);
    }, 1000);
  }
})();

問題点

  • setTimeout のせいで、タグ編集が指定の位置に表示されるまで1秒かかる
  • 詳細情報・メニューを表示しながらタグを編集できない