デスクトップの壁紙をBingのそれにするツールを作った
最終更新日:
先駆者は結構いますが自分でも作ってみたので記事にしました。
追記(2020-02-02)
変更点
- 壁紙をセットする部分をGoのコード内に埋め込みました。
- GNOMEに対応しました。
壁紙をセットする部分をGoのコード内に埋め込んだ
この記事を書いた段階では、macOSの壁紙を変更する部分のコードは.applescriptファイルにありましたが、それをGoのコード内部に埋め込みました。 AppleScript部分も短くなってスッキリ。
ただ、MBPがちょうど手元にないタイミングで変更をしたので動作は未確認。
GNOMEに対応
neofetchのコードを参考にGNOMEに対応しました。
手元のGNOME環境で動作確認済みです。
画像のダウンロード
これはサクッと実装できた。
トップページのHTML内にある,以下のようなmetaタグがその日の壁紙を参照しているようです(${IMAGE_ID}部分が日替わり)。で,${IMAGE_ID}直後の"tmb"の部分を1920x1080にすると1920×1080,UHDにすると大きくてきれいな画像を返すようです。*1
<meta property="og:image" content="https://www.bing.com/th?id=OHR.${IMAGE_ID}_tmb.jpg&rf=" />
これを元にGolangで実装してみたのが以下のリポジトリにあります。
壁紙の設定(macOS)
こっちがつらかった。
まず一つ目,動くけど変更反映のためにDockを再起動するせいで数秒間3本指スワイプができなくなるのが少し面倒。
sqlite3 ~/Library/Application\ Support/Dock/desktoppicture.db "update data set value = '${IMAGE_PATH}'" && killall Dock
2つ目,Dockの再起動なしに動いたが引数に画像へのパスを取るようにしたいのでこれはだめ。
tell application "System Events"
tell every desktop
set picture to "/path/to/image/file"
end tell
end tell
3つ目,引数に画像へのパスがあるときのみ動くようにしたかったのだが動かない。set picture to wallpaperPath
の1行上にdisplay dialog wallpaperPath
と入れると,それは動いたのでわけがわからなくなった。
on run argv
if (count of argv) > 0 then
set wallpaperPath to (item 1 of argv)
tell application "System Events"
tell every desktop
display dialog wallpaperPath -- 動く
set picture to wallpaperPath -- 動かない
end tell
end tell
end if
end run
4つ目,ようやくちゃんと動いたのがこれ。Stack Overflowでいろんな人が"これはどうよ?"ってコメントしてた中の一つ。なんでこれでうまいこと動くようになったのかまるでわからないが,とりあえず動いたからヨシ!*2
on run argv
if (count of argv) > 0 then
set wallpaperPath to (item 1 of argv)
tell application "System Events" to set picture of (reference to every desktop) to wallpaperPath
end if
end run