author | Myhailo Danylenko <isbear@ukrpost.net> |
Wed, 31 Mar 2010 01:25:19 +0300 | |
changeset 99 | ed4676536ed9 |
parent 71 | eb6edac301ac |
permissions | -rw-r--r-- |
59 | 1 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
2 |
local mpd = require 'mpd' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
3 |
local lm = require 'lm' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
4 |
local pubsub = require 'lm.pubsub' |
71
eb6edac301ac
Fixes to tune and register, change fifo perm
Myhailo Danylenko <isbear@ukrpost.net>
parents:
69
diff
changeset
|
5 |
local tune = require 'lm.tune' |
59 | 6 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
7 |
local tune_enabled = false |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
8 |
local mpd_pub_song = { } |
66 | 9 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
10 |
pubsub.handler ( 'http://jabber.org/protocol/tune', |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
11 |
function ( from, node, data ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
12 |
local self = false |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
13 |
if from == lm.connection.bless ( main.connection () ):jid():gsub ( '/.*', '' ) then -- o_O |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
14 |
self = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
15 |
mpd_pub_song = { } |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
16 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
17 |
local item = data:child () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
18 |
local text = '' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
19 |
while item do |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
20 |
local name = item:name () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
21 |
local value = item:value () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
22 |
if self then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
23 |
mpd_pub_song[name] = value or '' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
24 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
25 |
text = ("%s\n- %s: %s"):format ( text, item:name (), item:value () or '' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
26 |
item = item:next () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
27 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
28 |
if main.yesno ( main.option ( 'lua_pep_notification' ) ) then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
29 |
if text ~= '' then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
30 |
text = 'Now listening to:' .. text |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
31 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
32 |
text = 'Now not listening to anything' |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
33 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
34 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
35 |
main.print_info ( from, text ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
36 |
return true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
37 |
end ) |
59 | 38 |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
39 |
local function mpd_getstatus () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
40 |
local status = mpd.call_command { 'status' } |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
41 |
if not tune_enabled or ( status.state ~= 'play' and status.state ~= 'pause' ) then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
42 |
for k, v in pairs ( mpd_pub_song ) do -- if there is anything published, publish nothing |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
43 |
return { } |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
44 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
45 |
return nil |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
46 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
47 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
48 |
local song = mpd.call_command { 'currentsong' } |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
49 |
local dir, file = song.file:match ( '(.+)/(.-)' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
50 |
-- populate according to currentsong fields: artist - artist, length - time, source - album, title - title, track - id, rating - ?, uri - ? |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
51 |
local ret = { |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
52 |
artist = song.artist or 'Unknown', |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
53 |
length = song.time, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
54 |
source = song.album or dir, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
55 |
title = song.title or file, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
56 |
track = song.id, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
57 |
} |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
58 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
59 |
if not song.time or song.time == '0' then -- XXX |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
60 |
ret.length = nil |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
61 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
62 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
63 |
local modified = false |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
64 |
for k, v in pairs ( ret ) do |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
65 |
if mpd_pub_song[k] ~= v then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
66 |
modified = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
67 |
break |
59 | 68 |
end |
69 |
end |
|
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
70 |
if not modified then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
71 |
for k, v in pairs ( mpd_pub_song ) do |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
72 |
if ret[k] ~= v then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
73 |
modified = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
74 |
break |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
75 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
76 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
77 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
78 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
79 |
if modified then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
80 |
return ret |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
81 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
82 |
return nil |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
83 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
84 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
85 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
86 |
local function mpd_callback () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
87 |
local sdata = mpd_getstatus () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
88 |
if sdata then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
89 |
tune.publish ( lm.connection.bless ( main.connection () ), |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
90 |
function () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
91 |
end, |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
92 |
function ( mesg ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
93 |
print ( 'Error publishing tune: ' .. mesg ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
94 |
end, sdata ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
95 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
96 |
if tune_enabled then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
97 |
return true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
98 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
99 |
return false |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
100 |
end |
59 | 101 |
end |
102 |
||
68
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
103 |
-- do not call it too fast, or you end up with many daemons at once |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
104 |
local function enable_tune ( yn ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
105 |
if yn == nil then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
106 |
yn = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
107 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
108 |
if yn then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
109 |
if not tune_enabled then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
110 |
main.timer ( 15, mpd_callback ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
111 |
tune_enabled = true |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
112 |
-- update status |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
113 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
114 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
115 |
if tune_enabled then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
116 |
tune_enabled = false |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
117 |
-- update status |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
118 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
119 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
120 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
121 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
122 |
main.command ( 'tune', |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
123 |
function ( args ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
124 |
local enable = main.yesno ( args ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
125 |
if enable == nil then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
126 |
if tune_enabled then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
127 |
print ( "Tune notifications enabled" ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
128 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
129 |
print ( "Tune notifications disabled" ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
130 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
131 |
else |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
132 |
enable_tune ( enable ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
133 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
134 |
end, false, 'yesno' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
135 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
136 |
commands_help['tune'] = "[enable|disable|on|off|yes|no|true|false]\n\nEnables or disables publishing of notifications about playing music in your player (currently only mpd is supported)." |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
137 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
138 |
hooks_d['hook-post-connect'].tune = |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
139 |
function ( args ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
140 |
if tune_enabled then |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
141 |
mpd_callback () |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
142 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
143 |
end |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
144 |
|
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
145 |
main.add_feature ( 'http://jabber.org/protocol/tune+notify' ) |
742878c74b8e
Lm separation, privacy
Myhailo Danylenko <isbear@ukrpost.net>
parents:
66
diff
changeset
|
146 |
main.add_feature ( 'http://jabber.org/protocol/tune' ) |
59 | 147 |
|
69 | 148 |
mpd.server ( "localhost", 6600, nil ) |
149 |
||
59 | 150 |
-- vim: se ts=4: -- |