Skip to content

Commit

Permalink
Close support subtitle visibility, #4235
Browse files Browse the repository at this point in the history
This commit will:
- Add a Hide Subtitles/Show Subtitles item to the Subtitles menu
- Add a Hide Second Subtitles/Show Second Subtitles item to the
  Subtitles menu
- Add a key binding mapping v to cycle sub-visibility
- Add a key binding mapping Alt-v to cycle secondary-sub-visibility
- Add a new OSD message Subtitle Visibility: On/Off
- Add a new OSD message Second Subtitle Visibility: On/Off
- Add secondary-sub-visibility to watch-later-options
- Add logging of watch-later-options

These changes add a graphical user interface for the mpv features that
control subtitle visibility.
  • Loading branch information
low-batt authored and lhc70000 committed Jun 5, 2024
1 parent 2d013fe commit a8e8cca
Show file tree
Hide file tree
Showing 11 changed files with 104 additions and 1 deletion.
4 changes: 4 additions & 0 deletions iina/AppData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,10 @@ struct Constants {
static let hideAudioPanel = NSLocalizedString("menu.hide_audio", comment: "Hide Audio Panel")
static let subtitlesPanel = NSLocalizedString("menu.subtitles", comment: "Show Subtitles Panel")
static let hideSubtitlesPanel = NSLocalizedString("menu.hide_subtitles", comment: "Hide Subtitles Panel")
static let hideSubtitles = NSLocalizedString("menu.sub_hide", comment: "Hide Subtitles")
static let showSubtitles = NSLocalizedString("menu.sub_show", comment: "Show Subtitles")
static let hideSecondSubtitles = NSLocalizedString("menu.sub_second_hide", comment: "Hide Second Subtitles")
static let showSecondSubtitles = NSLocalizedString("menu.sub_second_show", comment: "Show Second Subtitles")
}
struct Time {
static let infinite = VideoTime(999, 0, 0)
Expand Down
6 changes: 6 additions & 0 deletions iina/Base.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@
"osd.sub_delay.later" = "Subtitle Delay: %.2fs Later";
"osd.sub_delay.earlier" = "Subtitle Delay: %.2fs Earlier";
"osd.subtitle_pos" = "Subtitle Position: %.1f";
"osd.sub_visibility" = "Subtitle Visibility: %@";
"osd.sub_second_visibility" = "Second Subtitle Visibility: %@";
"osd.mute" = "Mute";
"osd.unmute" = "Unmute";
"osd.screenshot" = "Screenshot Captured";
Expand Down Expand Up @@ -127,6 +129,10 @@
"menu.volume_muted" = "Volume: %d (Muted)";
"menu.audio_delay" = "Audio Delay: %.2fs";
"menu.sub_delay" = "Subtitle Delay: %.2fs";
"menu.sub_hide" = "Hide Subtitles";
"menu.sub_show" = "Show Subtitles";
"menu.sub_second_hide" = "Hide Second Subtitles";
"menu.sub_second_show" = "Show Second Subtitles";
"menu.fullscreen" = "Enter Full Screen";
"menu.exit_fullscreen" = "Exit Full Screen";
"menu.pip" = "Enter Picture-in-Picture";
Expand Down
8 changes: 8 additions & 0 deletions iina/Base.lproj/MainMenu.xib
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,9 @@ CA
</items>
</menu>
</menuItem>
<menuItem title="Hide Subtitles" id="smo-rw-rg7" userLabel="Hide Subtitles">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Second Subtitle" id="mGw-jm-5x2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Second Subtitle" systemMenu="font" id="UwY-P2-Xdb">
Expand All @@ -544,6 +547,9 @@ CA
</items>
</menu>
</menuItem>
<menuItem title="Hide Second Subtitles" id="BOm-ia-wOV">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem title="Load External Subtitle…" id="k6x-hf-ATi">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
Expand Down Expand Up @@ -727,6 +733,8 @@ CA
<outlet property="fullScreen" destination="6Eq-ni-6hG" id="y11-Q1-drn"/>
<outlet property="gotoScreenshotFolder" destination="lj0-Oo-7nB" id="Jlj-kX-fv0"/>
<outlet property="halfSize" destination="snW-S8-Cw5" id="PDi-lV-6HL"/>
<outlet property="hideSecondSubtitles" destination="BOm-ia-wOV" id="iKO-xG-GWA"/>
<outlet property="hideSubtitles" destination="smo-rw-rg7" id="LQB-s7-8Yy"/>
<outlet property="increaseAudioDelay" destination="4ae-MT-2L1" id="nsv-LC-B9o"/>
<outlet property="increaseAudioDelaySlightly" destination="lew-3S-oGY" id="Fo9-t3-WFI"/>
<outlet property="increaseSubDelay" destination="pAo-L5-qTO" id="55m-ex-for"/>
Expand Down
36 changes: 35 additions & 1 deletion iina/MPVController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ class MPVController: NSObject {
MPVOption.Audio.volume: MPV_FORMAT_DOUBLE,
MPVOption.Audio.audioDelay: MPV_FORMAT_DOUBLE,
MPVOption.PlaybackControl.speed: MPV_FORMAT_DOUBLE,
MPVOption.Subtitles.subVisibility: MPV_FORMAT_FLAG,
MPVOption.Subtitles.secondarySubVisibility: MPV_FORMAT_FLAG,
MPVOption.Subtitles.subDelay: MPV_FORMAT_DOUBLE,
MPVOption.Subtitles.subScale: MPV_FORMAT_DOUBLE,
MPVOption.Subtitles.subPos: MPV_FORMAT_DOUBLE,
Expand Down Expand Up @@ -502,6 +504,22 @@ not applying FFmpeg 9599 workaround
chkErr(setString(MPVOption.Video.vo, "libmpv", level: .verbose))
chkErr(setString(MPVOption.Window.keepaspect, "no", level: .verbose))
chkErr(setString(MPVOption.Video.gpuHwdecInterop, "auto", level: .verbose))

// The option watch-later-options is not available until after the mpv instance is initialized.
// In mpv 0.34.1 the default value for the watch-later-options property contains the option
// sub-visibility, but the option secondary-sub-visibility is missing. This inconsistency is
// likely to confuse users, so insure the visibility setting for secondary subtitles is also
// saved in watch later files.
if let watchLaterOptions = getString(MPVOption.WatchLater.watchLaterOptions),
watchLaterOptions.contains(MPVOption.Subtitles.subVisibility),
!watchLaterOptions.contains(MPVOption.Subtitles.secondarySubVisibility) {
log("Adding \(MPVOption.Subtitles.secondarySubVisibility) to \(MPVOption.WatchLater.watchLaterOptions)")
setString(MPVOption.WatchLater.watchLaterOptions, watchLaterOptions + "," +
MPVOption.Subtitles.secondarySubVisibility)
}
if let watchLaterOptions = getString(MPVOption.WatchLater.watchLaterOptions) {
log("Options mpv is configured to save in watch later files: \(watchLaterOptions)")
}
}

func mpvInitRendering() {
Expand Down Expand Up @@ -873,7 +891,7 @@ not applying FFmpeg 9599 workaround
func removeHooks(withIdentifier id: String) {
hooks.filter { (k, v) in v.isJavascript && v.id == id }.keys.forEach { hooks.removeValue(forKey: $0) }
}

// MARK: - Events

// Read event and handle it async
Expand Down Expand Up @@ -1213,6 +1231,22 @@ not applying FFmpeg 9599 workaround
player.sendOSD(.audioDelay(data))
}

case MPVOption.Subtitles.subVisibility:
if let visible = UnsafePointer<Bool>(OpaquePointer(property.data))?.pointee {
if player.info.isSubVisible != visible {
player.info.isSubVisible = visible
player.sendOSD(.subVisible(visible))
}
}

case MPVOption.Subtitles.secondarySubVisibility:
if let visible = UnsafePointer<Bool>(OpaquePointer(property.data))?.pointee {
if player.info.isSecondSubVisible != visible {
player.info.isSecondSubVisible = visible
player.sendOSD(.secondSubVisible(visible))
}
}

case MPVOption.Subtitles.subDelay:
needReloadQuickSettingsView = true
if let data = UnsafePointer<Double>(OpaquePointer(property.data))?.pointee {
Expand Down
8 changes: 8 additions & 0 deletions iina/MainMenuActions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,14 @@ extension MainMenuActionHandler {
}
}

@objc func menuToggleSubVisibility(_ sender: NSMenuItem) {
player.toggleSubVisibility()
}

@objc func menuToggleSecondSubVisibility(_ sender: NSMenuItem) {
player.toggleSecondSubVisibility()
}

@objc func menuChangeSubDelay(_ sender: NSMenuItem) {
if let delayDelta = sender.representedObject as? Double {
let newDelay = player.info.subDelay + delayDelta
Expand Down
10 changes: 10 additions & 0 deletions iina/MenuController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ class MenuController: NSObject, NSMenuDelegate {
// Subtitle
@IBOutlet weak var subMenu: NSMenu!
@IBOutlet weak var quickSettingsSub: NSMenuItem!
@IBOutlet weak var hideSubtitles: NSMenuItem!
@IBOutlet weak var hideSecondSubtitles: NSMenuItem!
@IBOutlet weak var cycleSubtitles: NSMenuItem!
@IBOutlet weak var subTrackMenu: NSMenu!
@IBOutlet weak var secondSubTrackMenu: NSMenu!
Expand Down Expand Up @@ -374,6 +376,8 @@ class MenuController: NSObject, NSMenuDelegate {
quickSettingsSub.action = #selector(MainWindowController.menuShowSubQuickSettings(_:))
loadExternalSub.action = #selector(MainMenuActionHandler.menuLoadExternalSub(_:))
subTrackMenu.delegate = self
hideSubtitles.action = #selector(MainMenuActionHandler.menuToggleSubVisibility(_:))
hideSecondSubtitles.action = #selector(MainMenuActionHandler.menuToggleSecondSubVisibility(_:))
secondSubTrackMenu.delegate = self

findOnlineSub.action = #selector(MainMenuActionHandler.menuFindOnlineSub(_:))
Expand Down Expand Up @@ -551,6 +555,10 @@ class MenuController: NSObject, NSMenuDelegate {
player.mainWindow.quickSettingView.currentTab == .sub
quickSettingsSub?.title = isDisplayingSettings ? Constants.String.hideSubtitlesPanel :
Constants.String.subtitlesPanel
hideSubtitles.title = player.info.isSubVisible ? Constants.String.hideSubtitles :
Constants.String.showSubtitles
hideSecondSubtitles.title = player.info.isSecondSubVisible ? Constants.String.hideSecondSubtitles :
Constants.String.showSecondSubtitles
subDelayIndicator.title = String(format: NSLocalizedString("menu.sub_delay", comment: "Subtitle Delay:"), player.info.subDelay)

let encodingCode = player.info.subEncoding ?? "auto"
Expand Down Expand Up @@ -867,6 +875,8 @@ class MenuController: NSObject, NSMenuDelegate {
(increaseAudioDelay, false, ["add", "audio-delay", "0.5"], true, nil, "audio_delay_up"),
(increaseAudioDelaySlightly, false, ["add", "audio-delay", "0.1"], true, nil, "audio_delay_up"),
(resetAudioDelay, false, ["set", "audio-delay", "0"], true, nil, nil),
(hideSubtitles, false, ["cycle", "sub-visibility"], false, nil, nil),
(hideSecondSubtitles, false, ["cycle", "secondary-sub-visibility"], false, nil, nil),
(decreaseSubDelay, false, ["add", "sub-delay", "-0.5"], true, nil, "sub_delay_down"),
(decreaseSubDelaySlightly, false, ["add", "sub-delay", "-0.1"], true, nil, "sub_delay_down"),
(increaseSubDelay, false, ["add", "sub-delay", "0.5"], true, nil, "sub_delay_up"),
Expand Down
14 changes: 14 additions & 0 deletions iina/OSDMessage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ enum OSDMessage {
case audioDelay(Double)
case subDelay(Double)
case subScale(Double)
case subVisible(Bool)
case secondSubVisible(Bool)
case subPos(Double)
case mute
case unMute
Expand Down Expand Up @@ -177,6 +179,18 @@ enum OSDMessage {
.withProgress(value / 100)
)

case .subVisible(let enabled):
return (
String(format: NSLocalizedString("osd.sub_visibility", comment: "Subtitle Visibility: %@"), enabled ? NSLocalizedString("general.on", comment: "On") : NSLocalizedString("general.off", comment: "Off")),
.normal
)

case .secondSubVisible(let enabled):
return (
String(format: NSLocalizedString("osd.sub_second_visibility", comment: "Second Subtitle Visibility: %@"), enabled ? NSLocalizedString("general.on", comment: "On") : NSLocalizedString("general.off", comment: "Off")),
.normal
)

case .mute:
return (NSLocalizedString("osd.mute", comment: "Mute"), .normal)

Expand Down
3 changes: 3 additions & 0 deletions iina/PlaybackInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ class PlaybackInfo {
var vid: Int?
var secondSid: Int?

var isSubVisible = true
var isSecondSubVisible = true

var subEncoding: String?

var haveDownloadedSub: Bool = false
Expand Down
8 changes: 8 additions & 0 deletions iina/PlayerCore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1130,6 +1130,14 @@ class PlayerCore: NSObject {
}
}

func toggleSubVisibility() {
mpv.setFlag(MPVOption.Subtitles.subVisibility, !info.isSubVisible)
}

func toggleSecondSubVisibility() {
mpv.setFlag(MPVOption.Subtitles.secondarySubVisibility, !info.isSecondSubVisible)
}

func loadExternalSubFile(_ url: URL, delay: Bool = false) {
if let track = info.subTracks.first(where: { $0.externalFilename == url.path }) {
mpv.command(.subReload, args: [String(track.id)], checkError: false)
Expand Down
2 changes: 2 additions & 0 deletions iina/config/iina-default-input.conf
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ F add sub-scale -0.1 # decrease the subtitle font size
r add sub-pos -1
R add sub-pos +1
t add sub-pos +1
v cycle sub-visibility # hide or show the subtitles
Alt+v cycle secondary-sub-visibility # hide or show the secondary subtitles

f cycle fullscreen # toggle fullscreen

Expand Down
6 changes: 6 additions & 0 deletions iina/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@
"osd.sub_delay.later" = "Subtitle Delay: %.2fs Later";
"osd.sub_delay.earlier" = "Subtitle Delay: %.2fs Earlier";
"osd.subtitle_pos" = "Subtitle Position: %.1f";
"osd.sub_visibility" = "Subtitle Visibility: %@";
"osd.sub_second_visibility" = "Second Subtitle Visibility: %@";
"osd.mute" = "Mute";
"osd.unmute" = "Unmute";
"osd.screenshot" = "Screenshot Captured";
Expand Down Expand Up @@ -127,6 +129,10 @@
"menu.volume_muted" = "Volume: %d (Muted)";
"menu.audio_delay" = "Audio Delay: %.2fs";
"menu.sub_delay" = "Subtitle Delay: %.2fs";
"menu.sub_hide" = "Hide Subtitles";
"menu.sub_show" = "Show Subtitles";
"menu.sub_second_hide" = "Hide Second Subtitles";
"menu.sub_second_show" = "Show Second Subtitles";
"menu.fullscreen" = "Enter Full Screen";
"menu.exit_fullscreen" = "Exit Full Screen";
"menu.pip" = "Enter Picture-in-Picture";
Expand Down

0 comments on commit a8e8cca

Please sign in to comment.