It was originally: | Became with the extension: |
![]() | ![]() |
{ "manifest_version": 2, "name": " ", "description": " .", "version": "2.0", "content_scripts": [{ "matches": ["*://vk.com/*"], "js": ["vk_inject.js"], "css": ["vk_styles.css"] }] }
.downloadLink { float: right; cursor: copy; border: 1px dotted #CED8DB; border-radius: 2px; padding: 0 4px; } .downloadLink:hover { background-color: #d0e6ff; border-color: #9DA5AE; }
(function (){ // , // observer var trackObserver = new MutationObserver(listModified); // , , var list_ids = ['pad_playlist', 'pad_search_list', 'initial_list', 'search_list', 'choose_audio_rows']; for (var i= 0 ; i < list_ids.length; i++) { var list = document.getElementById(list_ids[i]); if (list) { // "" , trackObserver listFound(list); } } // , css list = document.getElementById('results'); if (list && list.classList.contains('audio_results')) { listFound(list); } // observer var listObserver = new MutationObserver(elementAdded); // body, listObserver.observe(document.body, {childList: true, subtree: true}); // DOM function elementAdded(mutations) { for (var i = 0; i < mutations.length; i++) { var added = mutations[i].addedNodes; // for (var j = 0; j < added.length; j++) { findAudioLists(added[j]); } } } // function findAudioLists(node) { if (node.id) // id { for (var i = 0; i < list_ids.length; i++) // , id { if (list_ids[i] == node.id) { listFound(node); return; // } } if (node.id == 'results') // '#results.audio_results' - { if (node.classList.contains('audio_results')) { listFound(node); return; } } } // var child = node.firstElementChild; while (child) { findAudioLists(child); // child = child.nextElementSibling; } } // , function listFound(listNode) { if (listNode.children.length) // { for (var j = 0; j < listNode.children.length; j++) { addDownloadLink(listNode.children[j]); // "" } } trackObserver.observe(listNode, {childList: true}); // -> listModified() } // , ( ) function listModified(mutations) { for (var i = 0; i < mutations.length; i++) { var mut = mutations[i]; // for (var j = 0; j < mut.addedNodes.length; j++) { addDownloadLink(mut.addedNodes[j]); } // - mut.removedNodes } } // "" function addDownloadLink(row) { // - , , if (!row.classList.contains('audio')) { // , " " row = row.querySelector('div.audio'); // 'div.audio', if (!row) { return; } } var titleNode = row.querySelector('div.title_wrap'); // + if (!titleNode) // - (, ?) { return; } // , ? , if (titleNode.querySelector('a.downloadLink')) { return; // } var input = row.querySelector('div.play_btn > input'); // input, url if (!input) { input = row.querySelector('div.play_btn_wrap + input'); // if (!input) { return; // } } var ref = input.getAttribute('value'); // URL ref = ref.substr(0, ref.indexOf('?')); // '?', mp3 var link = document.createElement('a'); link.className = 'downloadLink'; // 'downloadLink' link.textContent = "^"; link.setAttribute('title', ""); link.setAttribute('download', titleNode.textContent + '.mp3'); // link.setAttribute('href', ref); link.addEventListener('click', function(event){ // , event.stopPropagation(); }); titleNode.appendChild(link); } })();
Source: https://habr.com/ru/post/254979/
All Articles