私はよくYouTubeで動画を見るのですが、公式PVを見たいだけなのに、いわゆる「歌ってみた」動画が引っ掛かるとイラッとしてしまいます。
そこで今回は、この“歌ってみた”動画を非表示にする、Edge向けの拡張機能を作ってみることにしました。
Microsoft Edgeの拡張機能とは?
当ブログでも下記記事で紹介していますが、Edgeの拡張機能とは、早い話がHTML + JavaScriptベースで開発可能なアドオンのことです。
詳しい話はMicrosoftのものえさんのブログに載っているので、そちらをご参照ください。
YouTubeの「歌ってみた」動画を非表示にするMicrosoft Edge拡張機能
ではさっそく拡張機能を作っていきます。
今回の拡張機能は下記環境で動作確認しました。
- OS名:Microsoft Windows 10 Pro Insider Preview バージョン:10.0.16199 ビルド 16199
- Microsoft.MicrosoftEdge 41.16199.1000.0
- 拡張機能用のフォルダを作成します(今回は「C:\EdgeExtensions\HideUtattemita」)。
- テキストエディタに下記コードを貼り付け、手順1.のフォルダに「manifest.json」ファイル(UTF-8)として保存します。
- テキストエディタに下記コードを貼り付け、手順1.のフォルダに「script.js」ファイル(UTF-8)として保存します。これが拡張機能の本体となります。
- Microsoft Edgeを起動し、「about:flags」ページを開きます。
- 「拡張機能の開発者向け機能を有効にする (これによりデバイスが危険にさらされる可能性があります)」にチェックを入れ、Edgeを再起動します。
- 「…」(設定など)から「拡張機能」を開きます。
- 「拡張機能の読み込み」ボタンをクリックし、手順1.のフォルダを選択します、
- 手順2.と3.で作成した拡張機能が読み込まれます。
- この拡張機能が「オン」になっている状態でYouTubeを開くと、「歌ってみた」動画が表示されなくなります。
- これで拡張機能が意図した通りに動いてくれるのですが、Windows ストア経由でダウンロードしたのではない、信頼性の低い拡張機能とみなされるため、一度Edgeを終了してしまうと、自動的に拡張機能が「オフ」になってしまいます。以降、Edge起動時には「不明な発行元からの拡張機能を無効にしました。危険性があるため、無効にしておくことをお勧めします」といったメッセージが表示されるようになるため、「有効にする」ボタンをクリックして、拡張機能をオンにする必要があります。
{ "name": "歌ってみたを隠してみた。", "description": "YouTubeの「歌ってみた」動画を非表示にする拡張機能です。", "version": "1.0.0.0", "locale": "ja", "default_locale": "ja", "author": "@kinuasa", "content_scripts": [ { "matches": ["*://*.youtube.com/*"], "js": ["script.js"], "run_at": "document_start" } ] }
/* * YouTubeの「歌ってみた」動画を非表示にするMicrosoft Edge拡張機能 * 2017.5.18 @kinuasa * * 参考:http://stackoverflow.com/questions/38507161/getting-the-actual-html-after-a-transition-accures-in-a-youtube-page-chrome-ext * */ function injectedCode(){ document.addEventListener('spfdone', hideUtattemita); document.addEventListener('DOMContentLoaded', hideUtattemita); function hideUtattemita(){ //-------------------------------------------- // * 文字列パターン // * これにマッチした動画を非表示 var ptn = '歌ってみた|うたってみた|歌ってみました|うたってみました|cover'; //-------------------------------------------- if(location.href.indexOf('watch?') > 0){ //再生画面の動画処理 var list_item = document.getElementsByClassName('video-list-item'); if(list_item){ [].forEach.call(list_item, function(elm){ var video_text = elm.innerText.toLowerCase(); if(video_text.match(ptn)){ elm.style.display = 'none'; } }); } }else if(location.href.indexOf('results?') > 0){ //検索画面の動画処理 var yt_lockup_video = document.getElementsByClassName('yt-lockup yt-lockup-tile'); if(yt_lockup_video){ [].forEach.call(yt_lockup_video, function(elm){ var video_text = elm.innerText.toLowerCase(); if(video_text.match(ptn)){ elm.parentNode.style.display = 'none'; } }); } }else{ //上記以外の画面の動画処理 var grid_item = document.getElementsByClassName('yt-shelf-grid-item'); if(grid_item){ [].forEach.call(grid_item, function(elm){ var video_text = elm.innerText.toLowerCase(); if(video_text.match(ptn)){ elm.style.display = 'none'; } }); } } } } function getFunctionText(f) { return f.toString().match(/\{[\s\S]*\}$/)[0]; } document.documentElement.appendChild(document.createElement('script')).text = getFunctionText(injectedCode);
拡張機能の仕組み
上記拡張機能の仕組みは単純です。
コンテンツスクリプトを使って表示中のページを調べ、指定した要素に特定の文字列(var ptn)が含まれていたら、style.displayプロパティを「none」にしているだけです。
コードを見れば分かる通り、判定もザックリとしたものなので、完璧にフィルタリングすることはできませんが、大まかには目的を達成することができるので、とりあえずはこれで良しとします。
ちなみに、この手の処理は対象となるサイトの構造が変わるたびにコードも修正しなくてはならず、管理上非常に面倒くさいため、ストア公開する予定はありません。
載せているコードは自由に使っていただいて構いませんので、どなたかのご参考になれば幸いです。
この記事へのコメントはありません。