-
Notifications
You must be signed in to change notification settings - Fork 48
/
auto-keep-gui-open.lua
186 lines (181 loc) · 8 KB
/
auto-keep-gui-open.lua
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
-- -----------------------------------------------------------
--
-- AUTO-KEEP-GUI-OPEN.LUA
-- Version: 1.0.1
-- Author: VideoPlayerCode
-- URL: https://github.com/VideoPlayerCode/mpv-tools
--
-- Description:
--
-- Intelligently switches mpv's "keep-open" behavior based on
-- whether you are running in video-mode or audio-only mode.
--
-- -----------------------------------------------------------
--
-- Recommended configuration:
-- AKGO_WINDOW_KEEP_OPEN_VALUE="yes" (or "always")
-- AKGO_NOWINDOW_KEEP_OPEN_VALUE="no" (or "original")
-- AKGO_USE_WINDOW_FOR_AUDIO_AFTER_VIDEO=true
--
-- Result:
-- * If you manually queue up a bunch of audio-only files via your
-- command line, then you'll never see a GUI, so you'll always be in
-- the "NOWINDOW" state, which means that the player automatically
-- advances to the next audio file and quits when it reaches the end.
-- * It's only when you play a *video* file that the "WINDOW" state
-- happens, and thanks to the "USE_WINDOW" option mpv will then
-- automatically *stay* in the video/window state and use the
-- "AKGO_WINDOW_KEEP_OPEN_VALUE" for the rest of the playlist.
-- * This script therefore automatically gives you the best of both
-- worlds. Audio-only playlists started from the command line will
-- stay in CLI mode if started from CLI, but Video / Audio+Video
-- playlists (regardless of whether they were started from the
-- desktop via double-clicking or via the command line) will *stay*
-- in GUI mode and use the WINDOW keep-open value, which makes mpv
-- behave even better as a GUI application, without hurting CLI mode.
--
-- -----------------------------------------------------------
--
-- ### START OF USER CONFIGURATION:
--
-------
--
-- AKGO_WINDOW_KEEP_OPEN_VALUE:
-- Possible values are: "no", "yes", "always", "original".
-- Reference: https://mpv.io/manual/master/#options-keep-open
--
-- The "keep-open" option will be set to this value every time the video
-- output is created. Most video output modules create a GUI, so in
-- other words, this is the "keep-open" value that mpv will use when in
-- GUI mode with a video window on screen.
--
-- Note: The special value "original" means whatever was in your user
-- config before this script was loaded.
--
--
-- I recommend setting this option to "yes", so that mpv's GUI stays
-- open after you've reached the end of your playlist or scrubbed the
-- playback position to the end of the last file. This means that you
-- can safely scrub the playback without worrying that you'll hover near
-- the end and make mpv "insta-terminate" when you were just trying to
-- scrub the video position. It makes mpv behave much better as a GUI
-- application.
--
-- You may even want to set it to "always", to always pause after the
-- end of every playlist item (instead of just the last one), to give
-- you manual control over advancing your playlists. But to most people,
-- that isn't as important as simply ensuring that the player stays alive
-- after the end of the final file.
--
-- The benefit of using this script instead of setting the option
-- globally, is that it makes it easy to have one "keep-open" setting
-- for music and another for videos, without having to fiddle with
-- manual per-extension settings. This script is smarter than extension
-- filters, since we detect when video output is used, as opposed to
-- blindly guessing based on file extension. The dynamic switching of
-- this script means that you preserve the ability to use mpv from the
-- command line to play your music files without worrying about having
-- to manually advance every music playlist step by step if you had used
-- a global "keep-open" setting. And your mpv GUI will be much more
-- reliable for video playback as well, since you will prevent mpv from
-- accidentally quitting its GUI at the slightest accidental touch. ;-)
--
AKGO_WINDOW_KEEP_OPEN_VALUE="yes"
--
-------
--
-- AKGO_NOWINDOW_KEEP_OPEN_VALUE:
-- Possible values are: "no", "yes", "always", "original".
-- Reference: https://mpv.io/manual/master/#options-keep-open
--
-- The "keep-open" option will be set to this value every time the video
-- output is destroyed. If you want non-video files in your playlist
-- to be treated differently, then this is for you.
--
-- Note: The special value "original" means whatever was in your user
-- config before this script was loaded.
--
--
-- However, if you set AKGO_USE_WINDOW_FOR_AUDIO_AFTER_VIDEO to true,
-- then all audio files in the playlist (*after* a *video* has played)
-- will continue using the GUI, and this "NOWINDOW" state won't happen.
--
-- I recommend keeping this at "no" or "original" (which means "no" if
-- you haven't set any custom config value for "keep-open").
--
AKGO_NOWINDOW_KEEP_OPEN_VALUE="original"
--
-------
--
-- AKGO_USE_WINDOW_FOR_AUDIO_AFTER_VIDEO:
-- Possible values are: true, false.
-- Reference: https://mpv.io/manual/master/#options-force-window
--
-- If true, we will automatically enable "force-window" after mpv has
-- used video output at least once during the current playlist session.
--
--
-- For most people (who only play a single file) this won't do anything.
-- Nor for people who start mpv with "--player-operation-mode pseudo-gui"
-- since that already enables the video output for audio files too.
--
-- Instead, this option is for when you're *manually* queuing up
-- multiple files from the command line and some of them are video files
-- and some are audio files. Without this option, mpv would switch back
-- and forth between terminal output (CLI) for the playlist's audio
-- files, and video output (GUI) for its video files.
--
-- Automatically switching to force-window means we will use the GUI
-- even for the audio files.
--
-- I recommend leaving this option enabled.
--
AKGO_USE_WINDOW_FOR_AUDIO_AFTER_VIDEO=true
--
-------
--
-- ### END OF USER CONFIGURATION.
-- -----------------------------------------------------------
-- Only proceed if user's personal/system mpv config was loaded.
-- NOTE: This is just a safeguard to protect programs that use
-- mpv as their backend via "--no-config" mode. For now, that
-- actually prevents all user scripts from loading, but there's
-- no guarantee it will always be that way. Better safe than sorry.
if (mp.get_property("config") ~= "no") then
local originalKeepOpenValue = mp.get_property("keep-open")
-- This runs with "false" at mpv initialization (before the playback
-- of the first file), regardless of whether that file will use
-- video output or not. After that, it runs whenever the video
-- output (usually a GUI window) is created or destroyed. So if the
-- first file is a video, it runs twice at startup (false -> true).
--
-- Implementation details:
-- vo-configured == video output created && its configuration went ok.
-- What that means depends on the platform-specific video output module,
-- but usually it means there is a GUI on screen to display video.
mp.observe_property(
"vo-configured",
"bool",
function (name, value)
if (value and mp.get_property("vo") ~= "image") then
-- Video output (usually a GUI) has been created.
-- NOTE: We ignore the "image" vo driver, which isn't a "real"
-- window since it has no GUI and just writes images to disk.
if (AKGO_WINDOW_KEEP_OPEN_VALUE == "original") then
mp.set_property("keep-open", originalKeepOpenValue)
else
mp.set_property("keep-open", AKGO_WINDOW_KEEP_OPEN_VALUE)
end
if (AKGO_USE_WINDOW_FOR_AUDIO_AFTER_VIDEO) then
mp.set_property("force-window", "yes")
end
else
-- Video output (usually a GUI) has been destroyed.
if (AKGO_NOWINDOW_KEEP_OPEN_VALUE == "original") then
mp.set_property("keep-open", originalKeepOpenValue)
else
mp.set_property("keep-open", AKGO_NOWINDOW_KEEP_OPEN_VALUE)
end
end
end)
end