BC: embed player everywhere

use embedded player on: /feed (mouseover album art); /music

当前为 2022-10-19 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name BC: embed player everywhere
  3. // @namespace userscript1
  4. // @match https://*.bandcamp.com/music
  5. // @match https://bandcamp.com/EmbeddedPlayer*
  6. // @match https://bandcamp.com/*/feed
  7. // @match https://*/*
  8. // @grant none
  9. // @version 0.1.7
  10. // @author -
  11. // @license GPLv3
  12. // @description use embedded player on: /feed (mouseover album art); /music
  13. // ==/UserScript==
  14.  
  15.  
  16. (function() { // ------------
  17. 'use strict';
  18.  
  19. // is this *bandcamp.com or bandcamp on a custom domain?
  20. if (!document.location.hostname.endsWith('bandcamp.com')
  21. && !document.head.querySelector('meta[property="twitter:site"][content="@bandcamp"]') ) {
  22. //console.log('--not a bandcamp site');
  23. return;
  24. }
  25.  
  26.  
  27. //document.body.classList.add(document.URL); // testing what URL the iframe ends up on
  28.  
  29. ////////////////////////////////////////////////////////////////////////////////////////////////
  30. if (document.location.pathname.startsWith('/EmbeddedPlayer')) {
  31. // embeddedplayer window.location changes when iframed: https://bandcamp.com/EmbeddedPlayer.html/ ...
  32. console.log('---embed page');
  33. if (document.location.pathname.includes('/track=') ) {
  34. console.log('---track player, checking for album');
  35.  
  36. var albumID = JSON.parse(
  37. document.querySelector('script[data-player-data]')
  38. ?.getAttribute('data-player-data')
  39. ).album_id;
  40.  
  41. if (!albumID) {
  42. console.log('--track only');
  43. return;
  44. }
  45.  
  46. // it's from an album, so load that
  47. document.body.remove();
  48. var newURL = document.URL.replace(/track=\d*/, 'album=' + albumID);
  49. console.log('--redirecting to: ' + newURL);
  50. document.location = newURL;
  51. }
  52. ////////////////////////////////////////////////////////////////////////////////////////////////
  53. } else if (document.location.pathname == '/music') {
  54. console.log('---music page');
  55.  
  56. // featured releases don't have the data id, hide them. we unhide their regular listing below
  57. document.querySelectorAll('ol.featured-grid')?.forEach( li => li.style.display = 'none' );
  58.  
  59. var releases = document.querySelectorAll('li.music-grid-item');
  60. for (let r of releases) {
  61. r.style.display = ''; // unhiding anything that was featured
  62. var itemStr = r.getAttribute('data-item-id').replace('-', '=');
  63. // firefox doesn't yet support lazy-loading iframes
  64. var player = `<iframe style="border: 0; width: 400px; height: 300px;"
  65. src="https://bandcamp.com/EmbeddedPlayer/${itemStr}/size=large/bgcol=ffffff/linkcol=0687f5/artwork=none/transparent=true/"
  66. loading="lazy"
  67. referrerpolicy="no-referrer"
  68. seamless>
  69. </iframe>
  70. <div style="clear:left;"> </div>
  71. `;
  72. r.insertAdjacentHTML('afterEnd', player);
  73. }
  74. ////////////////////////////////////////////////////////////////////////////////////////////////
  75. } else if (document.location.pathname.endsWith('/feed')) {
  76. console.log('---feed page');
  77. document.getElementById('stories').addEventListener('mouseover', feedEvent, true);
  78. }
  79.  
  80.  
  81.  
  82. function feedEvent(evt) {
  83. const t = evt.target;
  84. if (t.nodeName == 'IMG' && t.classList.contains('tralbum-art-large') ) {
  85.  
  86. // if we decide to make the event 'click' we need to block the default player:
  87. //evt.preventDefault();
  88. //evt.stopPropagation();
  89.  
  90. // step up the tree to find data
  91. var d = t.parentNode;
  92. while (!d.classList.contains('collection-item-container') ) {
  93. d = d.parentNode;
  94. }
  95. var itemID = d.getAttribute('data-tralbumid');
  96. var itemType = d.getAttribute('data-tralbumtype') == 'a' ? 'album' : 'track';
  97. var itemStr = itemType + '=' + itemID;
  98. var player = `<iframe style="border: 0; width: 100%; height: 300px;"
  99. src="https://bandcamp.com/EmbeddedPlayer/${itemStr}/size=large/bgcol=ffffff/linkcol=0687f5/artwork=small/transparent=true/"
  100. referrerpolicy="no-referrer"
  101. seamless>
  102. </iframe>
  103. `;
  104. d.querySelector('div.story-title').insertAdjacentHTML('afterEnd', player);
  105. d.querySelector('div.tralbum-art-container').remove();
  106. //d.querySelector('div.tralbum-wrapper-col2').remove(); // 'supported by' section
  107. }
  108. }
  109.  
  110. })(); // ----------------

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址