Skip to content

Instantly share code, notes, and snippets.

@programminghoch10
Last active December 7, 2024 16:29
Show Gist options
  • Save programminghoch10/9b89ddb2040d18abe9734e06852c9f11 to your computer and use it in GitHub Desktop.
Save programminghoch10/9b89ddb2040d18abe9734e06852c9f11 to your computer and use it in GitHub Desktop.
FFmpeg ISO language codes for Jellyfin

Jellyfin uses only ISO 639-2 language codes to translate the metadata tag eng to English for the track selector.

For some languages multiple such tags exist, for example Germany has ger and deu. Here only the tag deu is correctly translated to German whilst ger remains unrecognized.

mkvmerge always replaces the language codes with the matroska specified set of langauge codes, which sadly are the wrong ones for Jellyfin.

As an end user one can use ffmpeg to rewrite the metadata language tags to the correct set for Jellyfin.

For this I went to Wikipedias list of language codes and developed the following javascript line to create ffmpeg metadata mappings

[...document.querySelectorAll("#Table > tbody > tr")]
.map(tr => [tr.children[2].textContent, tr.children[3].textContent])
.filter(c => c[0] !== c[1])
.map(c => `-metadata:s:m:language:${c[1]} language=${c[0]}`)
.join(" ")

which results in this long line of text:

-metadata:s:m:language:alb language=sqi -metadata:s:m:language:arm language=hye -metadata:s:m:language:baq language=eus -metadata:s:m:language:bur language=mya -metadata:s:m:language:chi language=zho -metadata:s:m:language:cze language=ces -metadata:s:m:language:dut language=nld -metadata:s:m:language:fre language=fra -metadata:s:m:language:geo language=kat -metadata:s:m:language:ger language=deu -metadata:s:m:language:gre language=ell -metadata:s:m:language:ice language=isl -metadata:s:m:language:mac language=mkd -metadata:s:m:language:may language=msa -metadata:s:m:language:mao language=mri -metadata:s:m:language:per language=fas -metadata:s:m:language:rum language=ron -metadata:s:m:language:slo language=slk -metadata:s:m:language:tib language=bod -metadata:s:m:language:wel language=cym

(and the same for 2-digit long language codes)

we can now use it in an ffmpeg command to rewrite the metadata tags like this:

ffmpegfixjellyfinlanguagecodes() {
	ffmpeg \
		-hide_banner \
		-nostdin \
		-v error \
		-xerror \
		-i "$1" \
		-map 0 \
		-c copy \
		-disposition +0 \
		-metadata:s:m:language:alb language=sqi \
		-metadata:s:m:language:arm language=hye \
		-metadata:s:m:language:baq language=eus \
		-metadata:s:m:language:bur language=mya \
		-metadata:s:m:language:chi language=zho \
		-metadata:s:m:language:cze language=ces \
		-metadata:s:m:language:dut language=nld \
		-metadata:s:m:language:fre language=fra \
		-metadata:s:m:language:geo language=kat \
		-metadata:s:m:language:ger language=deu \
		-metadata:s:m:language:gre language=ell \
		-metadata:s:m:language:ice language=isl \
		-metadata:s:m:language:mac language=mkd \
		-metadata:s:m:language:may language=msa \
		-metadata:s:m:language:mao language=mri \
		-metadata:s:m:language:per language=fas \
		-metadata:s:m:language:rum language=ron \
		-metadata:s:m:language:slo language=slk \
		-metadata:s:m:language:tib language=bod \
		-metadata:s:m:language:wel language=cym \
		-metadata:s:m:language:ab language=abk \
		-metadata:s:m:language:aa language=aar \
		-metadata:s:m:language:af language=afr \
		-metadata:s:m:language:ak language=aka \
		-metadata:s:m:language:sq language=sqi \
		-metadata:s:m:language:am language=amh \
		-metadata:s:m:language:ar language=ara \
		-metadata:s:m:language:an language=arg \
		-metadata:s:m:language:hy language=hye \
		-metadata:s:m:language:as language=asm \
		-metadata:s:m:language:av language=ava \
		-metadata:s:m:language:ae language=ave \
		-metadata:s:m:language:ay language=aym \
		-metadata:s:m:language:az language=aze \
		-metadata:s:m:language:bm language=bam \
		-metadata:s:m:language:ba language=bak \
		-metadata:s:m:language:eu language=eus \
		-metadata:s:m:language:be language=bel \
		-metadata:s:m:language:bn language=ben \
		-metadata:s:m:language:bi language=bis \
		-metadata:s:m:language:bs language=bos \
		-metadata:s:m:language:br language=bre \
		-metadata:s:m:language:bg language=bul \
		-metadata:s:m:language:my language=mya \
		-metadata:s:m:language:ca language=cat \
		-metadata:s:m:language:ch language=cha \
		-metadata:s:m:language:ce language=che \
		-metadata:s:m:language:ny language=nya \
		-metadata:s:m:language:zh language=zho \
		-metadata:s:m:language:cu language=chu \
		-metadata:s:m:language:cv language=chv \
		-metadata:s:m:language:kw language=cor \
		-metadata:s:m:language:co language=cos \
		-metadata:s:m:language:cr language=cre \
		-metadata:s:m:language:hr language=hrv \
		-metadata:s:m:language:cs language=ces \
		-metadata:s:m:language:da language=dan \
		-metadata:s:m:language:dv language=div \
		-metadata:s:m:language:nl language=nld \
		-metadata:s:m:language:dz language=dzo \
		-metadata:s:m:language:en language=eng \
		-metadata:s:m:language:eo language=epo \
		-metadata:s:m:language:et language=est \
		-metadata:s:m:language:ee language=ewe \
		-metadata:s:m:language:fo language=fao \
		-metadata:s:m:language:fj language=fij \
		-metadata:s:m:language:fi language=fin \
		-metadata:s:m:language:fr language=fra \
		-metadata:s:m:language:fy language=fry \
		-metadata:s:m:language:ff language=ful \
		-metadata:s:m:language:gd language=gla \
		-metadata:s:m:language:gl language=glg \
		-metadata:s:m:language:lg language=lug \
		-metadata:s:m:language:ka language=kat \
		-metadata:s:m:language:de language=deu \
		-metadata:s:m:language:el language=ell \
		-metadata:s:m:language:kl language=kal \
		-metadata:s:m:language:gn language=grn \
		-metadata:s:m:language:gu language=guj \
		-metadata:s:m:language:ht language=hat \
		-metadata:s:m:language:ha language=hau \
		-metadata:s:m:language:he language=heb \
		-metadata:s:m:language:hz language=her \
		-metadata:s:m:language:hi language=hin \
		-metadata:s:m:language:ho language=hmo \
		-metadata:s:m:language:hu language=hun \
		-metadata:s:m:language:is language=isl \
		-metadata:s:m:language:io language=ido \
		-metadata:s:m:language:ig language=ibo \
		-metadata:s:m:language:id language=ind \
		-metadata:s:m:language:ia language=ina \
		-metadata:s:m:language:ie language=ile \
		-metadata:s:m:language:iu language=iku \
		-metadata:s:m:language:ik language=ipk \
		-metadata:s:m:language:ga language=gle \
		-metadata:s:m:language:it language=ita \
		-metadata:s:m:language:ja language=jpn \
		-metadata:s:m:language:jv language=jav \
		-metadata:s:m:language:kn language=kan \
		-metadata:s:m:language:kr language=kau \
		-metadata:s:m:language:ks language=kas \
		-metadata:s:m:language:kk language=kaz \
		-metadata:s:m:language:km language=khm \
		-metadata:s:m:language:ki language=kik \
		-metadata:s:m:language:rw language=kin \
		-metadata:s:m:language:ky language=kir \
		-metadata:s:m:language:kv language=kom \
		-metadata:s:m:language:kg language=kon \
		-metadata:s:m:language:ko language=kor \
		-metadata:s:m:language:kj language=kua \
		-metadata:s:m:language:ku language=kur \
		-metadata:s:m:language:lo language=lao \
		-metadata:s:m:language:la language=lat \
		-metadata:s:m:language:lv language=lav \
		-metadata:s:m:language:li language=lim \
		-metadata:s:m:language:ln language=lin \
		-metadata:s:m:language:lt language=lit \
		-metadata:s:m:language:lu language=lub \
		-metadata:s:m:language:lb language=ltz \
		-metadata:s:m:language:mk language=mkd \
		-metadata:s:m:language:mg language=mlg \
		-metadata:s:m:language:ms language=msa \
		-metadata:s:m:language:ml language=mal \
		-metadata:s:m:language:mt language=mlt \
		-metadata:s:m:language:gv language=glv \
		-metadata:s:m:language:mi language=mri \
		-metadata:s:m:language:mr language=mar \
		-metadata:s:m:language:mh language=mah \
		-metadata:s:m:language:mn language=mon \
		-metadata:s:m:language:na language=nau \
		-metadata:s:m:language:nv language=nav \
		-metadata:s:m:language:nd language=nde \
		-metadata:s:m:language:nr language=nbl \
		-metadata:s:m:language:ng language=ndo \
		-metadata:s:m:language:ne language=nep \
		-metadata:s:m:language:no language=nor \
		-metadata:s:m:language:nb language=nob \
		-metadata:s:m:language:nn language=nno \
		-metadata:s:m:language:oc language=oci \
		-metadata:s:m:language:oj language=oji \
		-metadata:s:m:language:or language=ori \
		-metadata:s:m:language:om language=orm \
		-metadata:s:m:language:os language=oss \
		-metadata:s:m:language:pi language=pli \
		-metadata:s:m:language:ps language=pus \
		-metadata:s:m:language:fa language=fas \
		-metadata:s:m:language:pl language=pol \
		-metadata:s:m:language:pt language=por \
		-metadata:s:m:language:pa language=pan \
		-metadata:s:m:language:qu language=que \
		-metadata:s:m:language:ro language=ron \
		-metadata:s:m:language:rm language=roh \
		-metadata:s:m:language:rn language=run \
		-metadata:s:m:language:ru language=rus \
		-metadata:s:m:language:se language=sme \
		-metadata:s:m:language:sm language=smo \
		-metadata:s:m:language:sg language=sag \
		-metadata:s:m:language:sa language=san \
		-metadata:s:m:language:sc language=srd \
		-metadata:s:m:language:sr language=srp \
		-metadata:s:m:language:sn language=sna \
		-metadata:s:m:language:sd language=snd \
		-metadata:s:m:language:si language=sin \
		-metadata:s:m:language:sk language=slk \
		-metadata:s:m:language:sl language=slv \
		-metadata:s:m:language:so language=som \
		-metadata:s:m:language:st language=sot \
		-metadata:s:m:language:es language=spa \
		-metadata:s:m:language:su language=sun \
		-metadata:s:m:language:sw language=swa \
		-metadata:s:m:language:ss language=ssw \
		-metadata:s:m:language:sv language=swe \
		-metadata:s:m:language:tl language=tgl \
		-metadata:s:m:language:ty language=tah \
		-metadata:s:m:language:tg language=tgk \
		-metadata:s:m:language:ta language=tam \
		-metadata:s:m:language:tt language=tat \
		-metadata:s:m:language:te language=tel \
		-metadata:s:m:language:th language=tha \
		-metadata:s:m:language:bo language=bod \
		-metadata:s:m:language:ti language=tir \
		-metadata:s:m:language:to language=ton \
		-metadata:s:m:language:ts language=tso \
		-metadata:s:m:language:tn language=tsn \
		-metadata:s:m:language:tr language=tur \
		-metadata:s:m:language:tk language=tuk \
		-metadata:s:m:language:tw language=twi \
		-metadata:s:m:language:ug language=uig \
		-metadata:s:m:language:uk language=ukr \
		-metadata:s:m:language:ur language=urd \
		-metadata:s:m:language:uz language=uzb \
		-metadata:s:m:language:ve language=ven \
		-metadata:s:m:language:vi language=vie \
		-metadata:s:m:language:vo language=vol \
		-metadata:s:m:language:wa language=wln \
		-metadata:s:m:language:cy language=cym \
		-metadata:s:m:language:wo language=wol \
		-metadata:s:m:language:xh language=xho \
		-metadata:s:m:language:ii language=iii \
		-metadata:s:m:language:yi language=yid \
		-metadata:s:m:language:yo language=yor \
		-metadata:s:m:language:za language=zha \
		-metadata:s:m:language:zu language=zul \
		"${1%.*}-fixedlanguagecodes.${1##*.}"
}

After running this command on the video files, all language tags will correctly be recognized by Jellyfin.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment