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