Closed16

[SoundCloud Cover Art Getter] サンクラの画像をコピーできるChrome拡張を作る

HarukiHaruki
  • サンクラから落としたアートワークのない音声ファイルにアートワークをつけるためにサンクラの画像をクリップボードにコピーしたい
  • 右クリックメニューで提供する or 拡張アイコンワンクリック or その両方
  • https://www.howtotechies.com/soundcloud-artwork-downloader すでにこのようなダウンローダーはあるが一手間かかる
HarukiHaruki

表示させるところまではできたがコピーが難しい

HarukiHaruki

document.execCommand('copy') を使いたいが Error in event handler: ReferenceError: document is not defined となる。 Manifest V3だと、background(Service Worker)ではDOMやwindowオブジェクトは存在しない(undefined)ためらしい。

HarukiHaruki

ワーカスレッドで実行できそうな代案がなかったので navigator.clipboard でできないか試してみる。

HarukiHaruki
  • Error in event handler: TypeError: Cannot read properties of undefined (reading 'writeText')
  • ググると「http環境ではできず、このようなエラーになる (仕様)」というのは見られるが、サンクラはhttpsである
HarukiHaruki

Navigatorはあるがnavigator.cliupboardがない

HarukiHaruki

navigator.clipboardの機能はそもそもドキュメントにフォーカスが当たっていないと使えないっぽい。今回はDOMもdocumentも存在しないので使えないっぽい。

HarukiHaruki

画像が入ったimg要素のnaturalWidthが0になる

HarukiHaruki
  • その後imgを貼り付けたcanvasを表示しても空だった
  • これらはimg要素にまだ画像が入っていなかったのが原因
  • 下記のようにすることで解決できた
img.onload = function () {
          canvas.width = img.naturalWidth
          canvas.height = img.naturalHeight
          const ctx = canvas.getContext('2d')
          ctx.drawImage(img, 0, 0)
}

これで画像コピーは一通りできた

HarukiHaruki

画面にフォーカスが当たってない(コンソールにフォーカスしている時など)とどこかがエラー出して動かないので将来的には治したい (普通に使う場合問題ないと思うが)

このスクラップは2023/02/13にクローズされました