J.A.R.V.I.S-rust/resources/commands/now_playing/now.lua
Bossiara13 4d3d664abd feat: Now Playing + World Clock + Daily Quote packs (72 → 75 rust packs)
Three small daily-driver packs mirrored with python (commit 02ab8a4 or similar).

now_playing
  - "что играет" / "что за песня" / "какой трек" / "что слушаю"
  - Reads Windows.Media.Control.GlobalSystemMediaTransportControlsSessionManager
    via PowerShell — works with Spotify/YouTube/Foobar/Winamp/Yandex Music
    (anything that exposes Windows SMTC, Win10 1803+).
  - Speaks "Сейчас играет: <Artist> — <Title>" or just "<Title>" if no artist.

world_clock
  - "сколько времени в Токио" / "время в Лондоне"
  - 21+ pre-mapped Russian/world city names → IANA timezones.
  - Fetches worldtimeapi.org (free, no key, no rate-limit headers exposed).
  - Parses ISO 8601 datetime, speaks "В <city> сейчас HH:MM."

daily_quote
  - "цитата дня" / "вдохнови меня"
  - zenquotes.io (free, no key) → English quote.
  - LLM translates to Russian via active backend (Groq or Ollama).
  - Falls back to LLM-generated quote if zenquotes is unreachable.
  - Speaks "<translated quote> — <author>."

Tests: 6 commands tests pass (no_duplicate_ids / no_empty_phrases /
all_lua_scripts_exist auto-validate the 3 new packs).
Pack count: 72 → 75.
2026-05-16 00:56:10 +03:00

46 lines
1.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- "Что играет" — query Windows SMTC.
-- Requires Windows 10 1803+ (Media Session API).
local ps = [[
[Windows.Media.Control.GlobalSystemMediaTransportControlsSessionManager,Windows.Media.Control,ContentType=WindowsRuntime] | Out-Null
$mgr = [Windows.Media.Control.GlobalSystemMediaTransportControlsSessionManager]::RequestAsync()
while ($mgr.Status -eq 0) { Start-Sleep -Milliseconds 50 }
$session = $mgr.GetResults().GetCurrentSession()
if (-not $session) { Write-Output 'NONE'; exit }
$propsTask = $session.TryGetMediaPropertiesAsync()
while ($propsTask.Status -eq 0) { Start-Sleep -Milliseconds 50 }
$props = $propsTask.GetResults()
$artist = $props.Artist
$title = $props.Title
if ([string]::IsNullOrEmpty($artist) -and [string]::IsNullOrEmpty($title)) {
Write-Output 'EMPTY'
exit
}
Write-Output ("{0}|{1}" -f $artist, $title)
]]
local res = jarvis.system.exec(string.format(
'powershell -NoProfile -ExecutionPolicy Bypass -Command "%s"',
ps:gsub('"', '\\"'):gsub("\r?\n", "; ")
))
if not res.success then
return jarvis.cmd.error("Не получилось получить данные.")
end
local out = (res.stdout or ""):gsub("^%s+", ""):gsub("%s+$", "")
if out == "NONE" then
return jarvis.cmd.not_found("Сейчас ничего не играет.")
end
if out == "EMPTY" or out == "|" then
return jarvis.cmd.not_found("Что-то играет, но без названия.")
end
local artist, title = out:match("^([^|]*)|(.*)$")
if not title or title == "" then
return jarvis.cmd.not_found("Трек без названия.")
end
if artist and artist ~= "" then
return jarvis.cmd.ok(string.format("Сейчас играет: %s — %s.", artist, title))
end
return jarvis.cmd.ok(string.format("Сейчас играет: %s.", title))