mirror of
https://github.com/Theaninova/TheaninovOS.git
synced 2025-12-12 19:46:20 +00:00
99 lines
2.4 KiB
TypeScript
99 lines
2.4 KiB
TypeScript
import options from "options"
|
|
import { dependencies, sh } from "lib/utils"
|
|
|
|
export type Resolution = 1920 | 1366 | 3840
|
|
export type Market =
|
|
| "random"
|
|
| "en-US"
|
|
| "ja-JP"
|
|
| "en-AU"
|
|
| "en-GB"
|
|
| "de-DE"
|
|
| "en-NZ"
|
|
| "en-CA"
|
|
|
|
const WP = `${Utils.HOME}/.config/background`
|
|
const Cache = `${Utils.HOME}/Pictures/Wallpapers/Bing`
|
|
|
|
class Wallpaper extends Service {
|
|
static {
|
|
Service.register(this, {}, {
|
|
"wallpaper": ["string"],
|
|
})
|
|
}
|
|
|
|
#blockMonitor = false
|
|
|
|
#wallpaper() {
|
|
if (!dependencies("swww"))
|
|
return
|
|
|
|
sh("hyprctl cursorpos").then(pos => {
|
|
sh([
|
|
"swww", "img",
|
|
"--transition-type", "grow",
|
|
"--transition-pos", pos.replace(" ", ""),
|
|
WP,
|
|
]).then(() => {
|
|
this.changed("wallpaper")
|
|
})
|
|
})
|
|
}
|
|
|
|
async #setWallpaper(path: string) {
|
|
this.#blockMonitor = true
|
|
|
|
await sh(`cp ${path} ${WP}`)
|
|
this.#wallpaper()
|
|
|
|
this.#blockMonitor = false
|
|
}
|
|
|
|
async #fetchBing() {
|
|
const res = await Utils.fetch("https://bing.biturl.top/", {
|
|
params: {
|
|
resolution: options.wallpaper.resolution.value,
|
|
format: "json",
|
|
image_format: "jpg",
|
|
index: "random",
|
|
mkt: options.wallpaper.market.value,
|
|
},
|
|
}).then(res => res.text())
|
|
|
|
if (!res.startsWith("{"))
|
|
return console.warn("bing api", res)
|
|
|
|
const { url } = JSON.parse(res)
|
|
const file = `${Cache}/${url.replace("https://www.bing.com/th?id=", "")}`
|
|
|
|
if (dependencies("curl")) {
|
|
Utils.ensureDirectory(Cache)
|
|
await sh(`curl "${url}" --output ${file}`)
|
|
this.#setWallpaper(file)
|
|
}
|
|
}
|
|
|
|
readonly random = () => { this.#fetchBing() }
|
|
readonly set = (path: string) => { this.#setWallpaper(path) }
|
|
get wallpaper() { return WP }
|
|
|
|
constructor() {
|
|
super()
|
|
|
|
if (!dependencies("swww"))
|
|
return this
|
|
|
|
// gtk portal
|
|
Utils.monitorFile(WP, () => {
|
|
if (!this.#blockMonitor)
|
|
this.#wallpaper()
|
|
})
|
|
|
|
Utils.execAsync("swww-daemon")
|
|
.then(this.#wallpaper)
|
|
.catch(() => null)
|
|
}
|
|
}
|
|
|
|
export default new Wallpaper
|