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