mpv-player / mpv

🎥 Command line video player
https://mpv.io
Other
26.67k stars 2.83k forks source link

Add a "--secondary-slang" option #4209

Open sebma opened 7 years ago

sebma commented 7 years ago

Hi,

I'm using mpv v0.24 on Ubuntu Linux and I would like two display a secondary subtitle knowing that the subtitles SIDs provided by youtube are not always in the same order.

Therefore the --secondary-sid option does not help because I do NOT know the SID number before actually playing the video with mpv :

Here is the example URL : https://www.youtube.com/watch?v=QS2mzHP1Cx4

Can you please consider my idea ?

sCreami commented 7 years ago

As no one has answered your question yet I'm going to take the shot and tell you that your issue is incoherent. It's not clear what you're asking for. Would you like to use a fallback behaviour when the preferred subtitle language is unavailable? You can already do that by separating the tag with comma like --slang=eng,en,fre,fra,fr. Also your video doesn't provide subtitle so I'm not really sure it's what you're looking for.

sebma commented 7 years ago

Thanks for your time.

The URL I provided has youtube auto-generated subtitles.

I would like to see two subtitle tracks on the video at the same time : one in French and the other in English.

But the problem is that the SIDs are for each language are not always the same (maybe because these subtitles are auto-generated by Youtube) :

$ mpv https://www.youtube.com/watch?v=QS2mzHP1Cx4
Playing: https://www.youtube.com/watch?v=QS2mzHP1Cx4
[ffmpeg] tls: A TLS packet with unexpected length was received.
[ffmpeg] tls: A TLS packet with unexpected length was received.
......
 (+) Video --vid=1 (*) (h264)
 (+) Audio --aid=1 --alang=eng (*) 'DASH audio' (opus) (external)
     Subs  --sid=1 --slang=ca 'vtt' (webvtt) (external)
     Subs  --sid=2 --slang=da 'vtt' (webvtt) (external)
     Subs  --sid=3 --slang=hi 'vtt' (webvtt) (external)
     Subs  --sid=4 --slang=de 'vtt' (webvtt) (external)
     Subs  --sid=5 --slang=fi 'vtt' (webvtt) (external)
     Subs  --sid=6 --slang=be 'vtt' (webvtt) (external)
     Subs  --sid=7 --slang=eu 'vtt' (webvtt) (external)
     Subs  --sid=8 --slang=mi 'vtt' (webvtt) (external)
     Subs  --sid=9 --slang=sm 'vtt' (webvtt) (external)
     Subs  --sid=10 --slang=gu 'vtt' (webvtt) (external)
     Subs  --sid=11 --slang=xh 'vtt' (webvtt) (external)
     Subs  --sid=12 --slang=ta 'vtt' (webvtt) (external)
     Subs  --sid=13 --slang=ne 'vtt' (webvtt) (external)
     Subs  --sid=14 --slang=te 'vtt' (webvtt) (external)
     Subs  --sid=15 --slang=pa 'vtt' (webvtt) (external)
     Subs  --sid=16 --slang=ka 'vtt' (webvtt) (external)
     Subs  --sid=17 --slang=la 'vtt' (webvtt) (external)
     Subs  --sid=18 --slang=ja 'vtt' (webvtt) (external)
     Subs  --sid=19 --slang=ga 'vtt' (webvtt) (external)
     Subs  --sid=20 --slang=ha 'vtt' (webvtt) (external)
     Subs  --sid=21 --slang=am 'vtt' (webvtt) (external)
     Subs  --sid=22 --slang=el 'vtt' (webvtt) (external)
     Subs  --sid=23 --slang=fy 'vtt' (webvtt) (external)
     Subs  --sid=24 --slang=cy 'vtt' (webvtt) (external)
     Subs  --sid=25 --slang=lt 'vtt' (webvtt) (external)
     Subs  --sid=26 --slang=pt 'vtt' (webvtt) (external)
     Subs  --sid=27 --slang=ml 'vtt' (webvtt) (external)
     Subs  --sid=28 --slang=ny 'vtt' (webvtt) (external)
     Subs  --sid=29 --slang=ceb 'vtt' (webvtt) (external)
     Subs  --sid=30 --slang=nl 'vtt' (webvtt) (external)
     Subs  --sid=31 --slang=pl 'vtt' (webvtt) (external)
     Subs  --sid=32 --slang=it 'vtt' (webvtt) (external)
     Subs  --sid=33 --slang=hy 'vtt' (webvtt) (external)
     Subs  --sid=34 --slang=uk 'vtt' (webvtt) (external)
     Subs  --sid=35 --slang=yo 'vtt' (webvtt) (external)
     Subs  --sid=36 --slang=tg 'vtt' (webvtt) (external)
     Subs  --sid=37 --slang=gd 'vtt' (webvtt) (external)
     Subs  --sid=38 --slang=id 'vtt' (webvtt) (external)
     Subs  --sid=39 --slang=ro 'vtt' (webvtt) (external)
     Subs  --sid=40 --slang=so 'vtt' (webvtt) (external)
     Subs  --sid=41 --slang=sd 'vtt' (webvtt) (external)
     Subs  --sid=42 --slang=no 'vtt' (webvtt) (external)
     Subs  --sid=43 --slang=ig 'vtt' (webvtt) (external)
     Subs  --sid=44 --slang=ms 'vtt' (webvtt) (external)
     Subs  --sid=45 --slang=sw 'vtt' (webvtt) (external)
     Subs  --sid=46 --slang=az 'vtt' (webvtt) (external)
     Subs  --sid=47 --slang=ps 'vtt' (webvtt) (external)
     Subs  --sid=48 --slang=lo 'vtt' (webvtt) (external)
     Subs  --sid=49 --slang=bs 'vtt' (webvtt) (external)
     Subs  --sid=50 --slang=cs 'vtt' (webvtt) (external)
     Subs  --sid=51 --slang=ky 'vtt' (webvtt) (external)
     Subs  --sid=52 --slang=es 'vtt' (webvtt) (external)
     Subs  --sid=53 --slang=sl 'vtt' (webvtt) (external)
     Subs  --sid=54 --slang=my 'vtt' (webvtt) (external)
     Subs  --sid=55 --slang=mg 'vtt' (webvtt) (external)
     Subs  --sid=56 --slang=is 'vtt' (webvtt) (external)
     Subs  --sid=57 --slang=mk 'vtt' (webvtt) (external)
     Subs  --sid=58 --slang=uz 'vtt' (webvtt) (external)
     Subs  --sid=59 --slang=sk 'vtt' (webvtt) (external)
     Subs  --sid=60 --slang=st 'vtt' (webvtt) (external)
     Subs  --sid=61 --slang=km 'vtt' (webvtt) (external)
     Subs  --sid=62 --slang=mt 'vtt' (webvtt) (external)
     Subs  --sid=63 --slang=ko 'vtt' (webvtt) (external)
     Subs  --sid=64 --slang=et 'vtt' (webvtt) (external)
     Subs  --sid=65 --slang=fa 'vtt' (webvtt) (external)
     Subs  --sid=66 --slang=kk 'vtt' (webvtt) (external)
     Subs  --sid=67 --slang=sv 'vtt' (webvtt) (external)
     Subs  --sid=68 --slang=bg 'vtt' (webvtt) (external)
     Subs  --sid=69 --slang=tr 'vtt' (webvtt) (external)
     Subs  --sid=70 --slang=sr 'vtt' (webvtt) (external)
     Subs  --sid=71 --slang=ku 'vtt' (webvtt) (external)
 (+) Subs  --sid=72 --slang=fr 'vtt' (webvtt) (external)
     Subs  --sid=73 --slang=zh-Hans 'vtt' (webvtt) (external)
     Subs  --sid=74 --slang=lv 'vtt' (webvtt) (external)
     Subs  --sid=75 --slang=en 'vtt' (webvtt) (external)
     Subs  --sid=76 --slang=jv 'vtt' (webvtt) (external)
     Subs  --sid=77 --slang=kn 'vtt' (webvtt) (external)
     Subs  --sid=78 --slang=ht 'vtt' (webvtt) (external)
     Subs  --sid=79 --slang=eo 'vtt' (webvtt) (external)
     Subs  --sid=80 --slang=iw 'vtt' (webvtt) (external)
     Subs  --sid=81 --slang=hr 'vtt' (webvtt) (external)
     Subs  --sid=82 --slang=ur 'vtt' (webvtt) (external)
     Subs  --sid=83 --slang=mn 'vtt' (webvtt) (external)
     Subs  --sid=84 --slang=af 'vtt' (webvtt) (external)
     Subs  --sid=85 --slang=sn 'vtt' (webvtt) (external)
     Subs  --sid=86 --slang=mr 'vtt' (webvtt) (external)
     Subs  --sid=87 --slang=zh-Hant 'vtt' (webvtt) (external)
     Subs  --sid=88 --slang=ar 'vtt' (webvtt) (external)
     Subs  --sid=89 --slang=yi 'vtt' (webvtt) (external)
     Subs  --sid=90 --slang=hu 'vtt' (webvtt) (external)
     Subs  --sid=91 --slang=zu 'vtt' (webvtt) (external)
     Subs  --sid=92 --slang=hmn 'vtt' (webvtt) (external)
     Subs  --sid=93 --slang=co 'vtt' (webvtt) (external)
     Subs  --sid=94 --slang=vi 'vtt' (webvtt) (external)
     Subs  --sid=95 --slang=si 'vtt' (webvtt) (external)
     Subs  --sid=96 --slang=th 'vtt' (webvtt) (external)
     Subs  --sid=97 --slang=haw 'vtt' (webvtt) (external)
     Subs  --sid=98 --slang=gl 'vtt' (webvtt) (external)
     Subs  --sid=99 --slang=ru 'vtt' (webvtt) (external)
     Subs  --sid=100 --slang=su 'vtt' (webvtt) (external)
     Subs  --sid=101 --slang=sq 'vtt' (webvtt) (external)
     Subs  --sid=102 --slang=bn 'vtt' (webvtt) (external)
     Subs  --sid=103 --slang=lb 'vtt' (webvtt) (external)
     Subs  --sid=104 --slang=fil 'vtt' (webvtt) (external)
AO: [pulse] 48000Hz stereo 2ch float
VO: [opengl] 1920x1080 yuv420p
AV: 00:00:03 / 00:34:02 (0%) A-V:  0.000 Dropped: 2 Cache:  8s+15KB
sCreami commented 7 years ago

I see. There's currently no way of doing so. Let's see what the higher ups will do about it.

bugdone commented 6 years ago

You can do this with a script

lalomartins commented 2 years ago

I should add that if possible, the secondary sub should not be loaded if it's the same as the primary.

One major use case for this is language learning/practice. I'd like to specify --slang jpn,ja,eng,en --secondary-slang eng,en; then, whenever there are both Japanese and English subs available, I'd get Japanese as primary and English as secondary, but if there are only English, I'd get that as primary and nothing as secondary.

paulmiddelkoop commented 1 year ago

I created this script until this feature is implemented. You can change the secondarySubtitleLanguages to your likings.

secondarySubtitleLanguages = {"dut", "eng"}

function setSecondarySubtitle()
  local languagePriorities = {}
  for index,language in ipairs(secondarySubtitleLanguages) do
     languagePriorities[language]=index
  end

  local secondaryTrackNumber
  for trackNumber = 0, mp.get_property_number("track-list/count") do
    if getTrackListProperty("type", trackNumber) == "sub" then
      local trackLang = getTrackListProperty("lang", trackNumber)

      if languagePriorities[trackLang] and
          (not secondaryTrackNumber or languagePriorities[trackLang] < languagePriorities[getTrackListProperty("lang", secondaryTrackNumber)])  then
        secondaryTrackNumber = trackNumber
      end
    end
  end

  if secondaryTrackNumber then
    mp.set_property_number("secondary-sid", getTrackListProperty("id", secondaryTrackNumber))
  else
    print("No suitable secondary subtitle found.")
  end
end

function getTrackListProperty(subProperty, trackNumber)
  return mp.get_property("track-list/" .. trackNumber .. "/" .. subProperty)
end

mp.register_event("file-loaded", setSecondarySubtitle)

@lalomartins if you choose the same secondary sub as the primary it is already ignored by mpv.