File: mpd_all.lua

package info (click to toggle)
awesome-extra 2020122801
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,328 kB
  • sloc: cpp: 112; sh: 84; makefile: 25; python: 11
file content (135 lines) | stat: -rw-r--r-- 4,887 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
-- Music Player Daemon widget type
-- Copyright (C) 2010  Adrian C. <anrxc@sysphere.org>
-- Copyright (C) 2017,2019  mutlusun <mutlusun@github.com>
-- Copyright (C) 2018  Jörg Thalheim <joerg@thalheim.io>
-- Copyright (C) 2018-2019  Nguyễn Gia Phong <vn.mcsinyx@gmail.com>
-- Copyright (C) 2019  Juan Carlos Menonita <JuanKman94@users.noreply.github.com>
-- Copyright (C) 2019  Lorenzo Gaggini <lg@lgaggini.net>
--
-- This file is part of Vicious.
--
-- Vicious is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as
-- published by the Free Software Foundation, either version 2 of the
-- License, or (at your option) any later version.
--
-- Vicious is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Vicious.  If not, see <https://www.gnu.org/licenses/>.

-- {{{ Grab environment
local tonumber = tonumber
local math = { floor = math.floor }
local type = type

local helpers = require"vicious.helpers"
local spawn = require"vicious.spawn"
-- }}}

-- Mpd: provides Music Player Daemon information
-- vicious.widgets.mpd
local mpd_all = {}


-- {{{ Return true if number is nonzero
local function cbool(number)
    return type(number) == "number" and number ~= 0 or number
end
-- }}}

-- {{{ Format playing progress
local function format_progress(elapsed, duration)
    local em, es = math.floor(elapsed / 60), math.floor(elapsed % 60)
    local dm, ds = math.floor(duration / 60), math.floor(duration % 60)

    if dm < 10 then
        return ("%d:%02d"):format(em, es), ("%d:%02d"):format(dm, ds)
    elseif dm < 60 then
        return ("%02d:%02d"):format(em, es), ("%02d:%02d"):format(dm, ds)
    end

    local eh, dh = math.floor(em / 60), math.floor(dm / 60)
    em, dm = math.floor(em % 60), math.floor(dm % 60)
    if dm < 600 then
        return ("%d:%02d:%02d"):format(eh, em, es),
               ("%d:%02d:%02d"):format(dh, dm, ds)
    else
        return ("%02d:%02d:%02d"):format(eh, em, es),
               ("%02d:%02d:%02d"):format(dh, dm, ds)
    end
end
-- }}}

-- {{{ Format playing progress (percentage)
local function format_progress_percentage(elapsed, duration)
    if duration > 0 then
        local percentage = math.floor((elapsed / duration) * 100 + 0.5)
        return ("%d%%"):format(percentage)
    else
        return("0%")
    end
end
-- }}}

-- {{{ MPD widget type
function mpd_all.async(format, warg, callback)
    -- Fallback values
    local mpd_state = {
        ["{volume}"]   = 0,
        ["{bitrate}"]  = 0,
        ["{elapsed}"]  = 0,
        ["{duration}"] = 0,
        ["{repeat}"]   = false,
        ["{random}"]   = false,
        ["{state}"]    = "N/A",
        ["{Artist}"]   = "N/A",
        ["{Title}"]    = "N/A",
        ["{Album}"]    = "N/A",
        ["{Genre}"]    = "N/A",
        --["{Name}"]   = "N/A",
        --["{file}"]   = "N/A",
    }

    -- Construct MPD client options, fallback to defaults when necessary
    local query = ("printf 'password %s\nstatus\ncurrentsong\nclose\n'"):format(
        warg and (warg.password or warg[1]) or '""')
    local connect = ("curl --connect-timeout 1 -fsm 3 telnet://%s:%s"):format(
        warg and (warg.host or warg[2]) or "127.0.0.1",
        warg and (warg.port or warg[3]) or "6600")

    -- Get data from MPD server
    spawn.with_line_callback_with_shell(query .. "|" .. connect, {
        stdout = function (line)
            for k, v in line:gmatch"([%w]+):[%s](.*)$" do
                local key = "{" .. k .. "}"
                if k == "volume" or k == "bitrate" or
                   k == "elapsed" or k == "duration" then
                    mpd_state[key] = v and tonumber(v)
                elseif k == "repeat" or k == "random" then
                    mpd_state[key] = cbool(v)
                elseif k == "state" then
                    mpd_state[key] = helpers.capitalize(v)
                elseif k == "Artist" or k == "Title" or
                       --k == "Name" or k == "file" or
                       k == "Album" or k == "Genre" then
                    mpd_state[key] = v
                end
            end
        end,
        output_done = function ()
            -- Formatted elapsed and duration
            mpd_state["{Elapsed}"], mpd_state["{Duration}"] = format_progress(
                mpd_state["{elapsed}"], mpd_state["{duration}"])
            -- Formatted playing progress percentage
            mpd_state["{Progress}"] = format_progress_percentage(
                mpd_state["{elapsed}"], mpd_state["{duration}"])
            callback(mpd_state)
        end })
end
-- }}}

return helpers.setasyncall(mpd_all)