summaryrefslogtreecommitdiff
path: root/mpv/scripts/music-mode.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mpv/scripts/music-mode.lua')
-rw-r--r--mpv/scripts/music-mode.lua192
1 files changed, 192 insertions, 0 deletions
diff --git a/mpv/scripts/music-mode.lua b/mpv/scripts/music-mode.lua
new file mode 100644
index 0000000..4c57456
--- /dev/null
+++ b/mpv/scripts/music-mode.lua
@@ -0,0 +1,192 @@
+local mp = require 'mp'
+local msg = require 'mp.msg'
+local opt = require 'mp.options'
+
+--script options, set these in script-opts
+local o = {
+ --change to disable automatic mode switching
+ auto = true,
+
+ --profile to call when valid extension is found
+ profile = "music",
+
+ --runs this profile when in music mode and a non-audio file is loaded
+ --you should essentially put all your defaults that the music profile changed in here
+ undo_profile = "",
+
+ --start playback in music mode. This setting is only applied when the player is initially started,
+ --changing this option during runtime does nothing.
+ --probably only useful if auto is disabled
+ enable = false,
+
+ --the script will also enable the following input section when music mode is enabled
+ --see the mpv manual for details on sections
+ input_section = "music",
+
+ --dispays the metadata of the track on the osd when music mode is on
+ --there is also a script message to enable this seperately
+ show_metadata = false
+}
+
+opt.read_options(o, 'musicmode', function() msg.verbose('options updated') end)
+
+--a music file is one where mpv returns an audio stream or coverart as the first track
+local function is_audio_file()
+ local track_list = mp.get_property_native("track-list")
+
+ local has_audio = false
+ for _, track in ipairs(track_list) do
+ if track.type == "audio" then has_audio = true
+ elseif not track.albumart and (track["demux-fps"] or 2) > 1 then return false end
+ end
+ return has_audio
+end
+
+local metadata = mp.create_osd_overlay('ass-events')
+metadata.hidden = not o.show_metadata
+
+local function update_metadata()
+ metadata.data = mp.get_property_osd('filtered-metadata')
+ metadata:update()
+end
+
+local function enable_metadata()
+ metadata.hidden = false
+ metadata:update()
+end
+
+local function disable_metadata()
+ metadata.hidden = true
+ metadata:remove()
+end
+
+--changes visibility of metadata
+local function show_metadata(command)
+ if command == "on" or command == nil then
+ enable_metadata()
+ elseif command == "off" then
+ disable_metadata()
+ elseif command == "toggle" then
+ if metadata.hidden then
+ enable_metadata()
+ else
+ disable_metadata()
+ end
+ else
+ msg.warn('unknown command "' .. command .. '"')
+ end
+end
+
+--to prevent superfluous loading of profiles the script keeps track of when music mode is enabled
+local musicMode = false
+
+--enables music mode
+local function activate()
+ mp.commandv('apply-profile', o.profile)
+ mp.commandv('enable-section', o.input_section, "allow-vo-dragging+allow-hide-cursor")
+ mp.osd_message('Music Mode enabled')
+
+ if o.show_metadata then
+ show_metadata("on")
+ end
+
+ musicMode = true
+end
+
+--disables music mode
+local function deactivate()
+ mp.commandv('apply-profile', o.undo_profile)
+ mp.commandv('disable-section', o.input_section)
+ mp.osd_message('Music Mode disabled')
+
+ if o.show_metadata then
+ show_metadata('off')
+ end
+
+ musicMode = false
+end
+
+local function main()
+ --if the file is an audio file then the music profile is loaded
+ if is_audio_file() then
+ msg.verbose('audio file, applying profile "' .. o.profile .. '"')
+ if not musicMode then
+ activate()
+ end
+ elseif o.undo_profile ~= "" and musicMode then
+ msg.verbose('video file, applying undo profile "' .. o.undo_profile .. '"')
+ deactivate()
+ end
+end
+
+--sets music mode from script-message
+local function script_message(command)
+ if command == "on" or command == nil then
+ activate()
+ elseif command == "off" then
+ deactivate()
+ elseif command == "toggle" then
+ if musicMode then
+ deactivate()
+ else
+ activate()
+ end
+ else
+ msg.warn('unknown command "' .. command .. '"')
+ end
+end
+
+local function lock()
+ o.auto = false
+ msg.info('Music Mode locked')
+ mp.osd_message('Music Mode locked')
+end
+
+local function unLock()
+ o.auto = true
+ msg.info('Music Mode unlocked')
+ mp.osd_message('Music Mode unlocked')
+end
+
+--toggles lock
+local function lock_script_message(command)
+ if command == "on" or command == nil then
+ lock()
+ elseif command == "off" then
+ unLock()
+ elseif command == "toggle" then
+ if o.auto then
+ lock()
+ else
+ unLock()
+ end
+ else
+ msg.warn('unknown command "' .. command .. '"')
+ end
+end
+
+--runs when the file is loaded, if script is locked it will do nothing
+local function file_loaded()
+ if o.auto then
+ main()
+ end
+end
+
+if o.enable then
+ activate()
+end
+
+--sets music mode
+--accepts arguments: 'on', 'off', 'toggle'
+mp.register_script_message('music-mode', script_message)
+
+--stops the script from switching modes on file loads
+----accepts arguments: 'on', 'off', 'toggle'
+mp.register_script_message('music-mode-lock', lock_script_message)
+
+--shows file metadata on osc
+--accepts arguments: 'on' 'off' 'toggle'
+mp.register_script_message('show-metadata', show_metadata)
+
+mp.add_hook('on_preloaded', 40, file_loaded)
+mp.observe_property('filtered-metadata', 'string', update_metadata)