diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index cfc19b874ad7d..b3dde2d33d49a 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -8751,7 +8751,7 @@ Miscellaneous
Registers mpv as a media player on Windows. This includes adding registry
entries to associate mpv with media files and protocols, as well as enabling
- autoplay handlers for Blu-ray, DVD, and CD-Audio.
+ autoplay handlers for Blu-ray, DVD, DVD-Audio, and CD-Audio.
Note that the registration is done in-place, so the current mpv.exe path will
be used. If you move mpv after registering it, you can re-run this command to
@@ -8764,7 +8764,8 @@ Miscellaneous
The list of the file extensions to register, can be controlled with the
``--video-exts``, ``--audio-exts``, ``--image-exts``, ``--playlist-exts``
- and ``--archive-exts`` options.
+ and ``--archive-exts`` options. Disc images (``.iso``) and the ``.ifo``
+ and ``.bdmv`` files of DVD and Blu-ray folders are registered as well.
By default, mpv will be registered for the current user. To register it for
all users, run mpv as an administrator with this option. However, this is
diff --git a/TOOLS/osxbundle/mpv.app/Contents/Info.plist b/TOOLS/osxbundle/mpv.app/Contents/Info.plist
index fcb3c988621e1..7f7546e701b36 100644
--- a/TOOLS/osxbundle/mpv.app/Contents/Info.plist
+++ b/TOOLS/osxbundle/mpv.app/Contents/Info.plist
@@ -68,7 +68,6 @@
io.mpv.mk3d
io.mpv.mts
io.mpv.nsv
- io.mpv.vcd
io.mpv.vob
io.mpv.webm
io.mpv.wmv
@@ -89,6 +88,24 @@
public.video
+
+ CFBundleTypeIconFile
+ document.icns
+ CFBundleTypeName
+ Disc File
+ CFBundleTypeRole
+ Viewer
+ LSHandlerRank
+ Alternate
+ LSTypeIsPackage
+
+ LSItemContentTypes
+
+ io.mpv.bdmv
+ io.mpv.ifo
+ public.iso-image
+
+
CFBundleTypeIconFile
document.icns
@@ -191,7 +208,6 @@
cdda
dvd
- vcd
bd
@@ -747,29 +763,6 @@
-
- UTTypeConformsTo
-
- public.movie
-
- UTTypeDescription
- Video CD File
- UTTypeIconFile
- document.icns
- UTTypeIdentifier
- io.mpv.vcd
- UTTypeReferenceURL
- https://en.wikipedia.org/wiki/Video_CD
- UTTypeTagSpecification
-
- public.filename-extension
-
- vcd
- svcd
- dat
-
-
-
UTTypeConformsTo
@@ -958,6 +951,48 @@
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ DVD Information File
+ UTTypeIconFile
+ document.icns
+ UTTypeIdentifier
+ io.mpv.ifo
+ UTTypeReferenceURL
+ https://en.wikipedia.org/wiki/DVD-Video
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ ifo
+
+
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ Blu-ray Disc Information File
+ UTTypeIconFile
+ document.icns
+ UTTypeIdentifier
+ io.mpv.bdmv
+ UTTypeReferenceURL
+ https://en.wikipedia.org/wiki/Blu-ray
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ bdmv
+
+
+
UTTypeConformsTo
diff --git a/etc/mpv.desktop b/etc/mpv.desktop
index e56134e5a728f..b78d92284d7d8 100644
--- a/etc/mpv.desktop
+++ b/etc/mpv.desktop
@@ -44,7 +44,7 @@ TryExec=mpv
Exec=mpv --player-operation-mode=pseudo-gui -- %U
Terminal=false
Categories=AudioVideo;Audio;Video;Player;TV;
-MimeType=application/ogg;application/x-ogg;application/mxf;application/sdp;application/smil;application/x-smil;application/streamingmedia;application/x-streamingmedia;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/aac;audio/x-aac;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/aiff;audio/x-aiff;audio/m4a;audio/x-m4a;application/x-extension-m4a;audio/mp1;audio/x-mp1;audio/mp2;audio/x-mp2;audio/mp3;audio/x-mp3;audio/mpeg;audio/mpeg2;audio/mpeg3;audio/mpegurl;audio/x-mpegurl;audio/mpg;audio/x-mpg;audio/rn-mpeg;audio/musepack;audio/x-musepack;audio/ogg;audio/scpls;audio/x-scpls;audio/vnd.rn-realaudio;audio/wav;audio/x-pn-wav;audio/x-pn-windows-pcm;audio/x-realaudio;audio/x-pn-realaudio;audio/x-ms-wma;audio/x-pls;audio/x-wav;video/mpeg;video/x-mpeg2;video/x-mpeg3;video/mp4v-es;video/x-m4v;video/mp4;application/x-extension-mp4;video/divx;video/vnd.divx;video/msvideo;video/x-msvideo;video/ogg;video/quicktime;video/vnd.rn-realvideo;video/x-ms-afs;video/x-ms-asf;audio/x-ms-asf;application/vnd.ms-asf;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvxvideo;video/x-avi;video/avi;video/x-flic;video/fli;video/x-flc;video/flv;video/x-flv;video/x-theora;video/x-theora+ogg;video/x-matroska;video/mkv;audio/x-matroska;application/x-matroska;video/webm;audio/webm;audio/vorbis;audio/x-vorbis;audio/x-vorbis+ogg;video/x-ogm;video/x-ogm+ogg;application/x-ogm;application/x-ogm-audio;application/x-ogm-video;application/x-shorten;audio/x-shorten;audio/x-ape;audio/x-wavpack;audio/x-tta;audio/AMR;audio/ac3;audio/eac3;audio/amr-wb;video/mp2t;audio/flac;audio/mp4;application/x-mpegurl;video/vnd.mpegurl;application/vnd.apple.mpegurl;audio/x-pn-au;video/3gp;video/3gpp;video/3gpp2;audio/3gpp;audio/3gpp2;video/dv;audio/dv;audio/opus;audio/vnd.dts;audio/vnd.dts.hd;audio/x-adpcm;application/x-cue;audio/m3u;audio/vnd.wave;video/vnd.avi;
+MimeType=application/ogg;application/x-ogg;application/mxf;application/sdp;application/smil;application/x-smil;application/streamingmedia;application/x-streamingmedia;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/aac;audio/x-aac;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/aiff;audio/x-aiff;audio/m4a;audio/x-m4a;application/x-extension-m4a;audio/mp1;audio/x-mp1;audio/mp2;audio/x-mp2;audio/mp3;audio/x-mp3;audio/mpeg;audio/mpeg2;audio/mpeg3;audio/mpegurl;audio/x-mpegurl;audio/mpg;audio/x-mpg;audio/rn-mpeg;audio/musepack;audio/x-musepack;audio/ogg;audio/scpls;audio/x-scpls;audio/vnd.rn-realaudio;audio/wav;audio/x-pn-wav;audio/x-pn-windows-pcm;audio/x-realaudio;audio/x-pn-realaudio;audio/x-ms-wma;audio/x-pls;audio/x-wav;video/mpeg;video/x-mpeg2;video/x-mpeg3;video/mp4v-es;video/x-m4v;video/mp4;application/x-extension-mp4;video/divx;video/vnd.divx;video/msvideo;video/x-msvideo;video/ogg;video/quicktime;video/vnd.rn-realvideo;video/x-ms-afs;video/x-ms-asf;audio/x-ms-asf;application/vnd.ms-asf;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvxvideo;video/x-avi;video/avi;video/x-flic;video/fli;video/x-flc;video/flv;video/x-flv;video/x-theora;video/x-theora+ogg;video/x-matroska;video/mkv;audio/x-matroska;application/x-matroska;video/webm;audio/webm;audio/vorbis;audio/x-vorbis;audio/x-vorbis+ogg;video/x-ogm;video/x-ogm+ogg;application/x-ogm;application/x-ogm-audio;application/x-ogm-video;application/x-shorten;audio/x-shorten;audio/x-ape;audio/x-wavpack;audio/x-tta;audio/AMR;audio/ac3;audio/eac3;audio/amr-wb;video/mp2t;audio/flac;audio/mp4;application/x-mpegurl;video/vnd.mpegurl;application/vnd.apple.mpegurl;audio/x-pn-au;video/3gp;video/3gpp;video/3gpp2;audio/3gpp;audio/3gpp2;video/dv;audio/dv;audio/opus;audio/vnd.dts;audio/vnd.dts.hd;audio/x-adpcm;application/x-cue;audio/m3u;audio/vnd.wave;video/vnd.avi;x-content/video-dvd;x-content/video-bluray;x-content/audio-dvd;application/vnd.efi.iso;application/x-cd-image;
X-KDE-Protocols=appending,file,ftp,hls,http,https,mms,mpv,rist,rtmp,rtmps,rtmpt,rtmpts,rtp,rtsp,rtsps,sftp,smb,srt,srtp,webdav,webdavs
StartupWMClass=mpv
Keywords=mpv;media;player;video;audio;tv;
diff --git a/osdep/w32_register.c b/osdep/w32_register.c
index 90b114fedc12c..a1c88f3a8539b 100644
--- a/osdep/w32_register.c
+++ b/osdep/w32_register.c
@@ -214,8 +214,50 @@ static wchar_t *w32_get_shortcut_path(struct mp_log *log)
return shortcut_path;
}
+static void remove_registration(struct mp_log *log, HKEY root)
+{
+ reg_del(log, root, KEY_MPV_APP_PATH(".exe"), NULL);
+ reg_del(log, root, KEY_MPV_APP_PATH(".com"), NULL);
+ reg_del(log, root, KEY_MPV_APP, NULL);
+ reg_del(log, root, KEY_MPV_CAPABILITIES_APP, NULL);
+ reg_del(log, root, L"Software\\RegisteredApplications", MPV_NAME);
+
+ reg_del(log, root, KEY_MPV_PROG_ID("bluray"), NULL);
+ reg_del(log, root, KEY_MPV_PROG_ID("cdda"), NULL);
+ reg_del(log, root, KEY_MPV_PROG_ID("dvd"), NULL);
+ reg_del(log, root, KEY_MPV_PROG_ID("dvda"), NULL);
+ reg_del(log, root, KEY_MPV_PROG_ID("file"), NULL);
+ reg_del(log, root, KEY_MPV_PROG_ID("url"), NULL);
+
+ reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayCDAudioOnArrival", NULL);
+ reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayCDAudioOnArrival",
+ L"MpvPlayCDAudioOnArrival");
+ reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayDVDMovieOnArrival", NULL);
+ reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayDVDMovieOnArrival",
+ L"MpvPlayDVDMovieOnArrival");
+ reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayDVDAudioOnArrival", NULL);
+ reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayDVDAudioOnArrival",
+ L"MpvPlayDVDAudioOnArrival");
+ reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayBluRayOnArrival", NULL);
+ reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayBluRayOnArrival",
+ L"MpvPlayBluRayOnArrival");
+
+ wchar_t *shortcut_path = w32_get_shortcut_path(log);
+ if (shortcut_path) {
+ mp_msg(log, MSGL_V, "Removing shortcut: '%ls'\n", shortcut_path);
+ if (!DeleteFileW(shortcut_path)) {
+ DWORD err = GetLastError();
+ mp_msg(log, err == ERROR_FILE_NOT_FOUND ? MSGL_DEBUG : MSGL_ERR,
+ "Failed to delete shortcut: '%ls' -> %s\n", shortcut_path,
+ mp_LastError_to_str());
+ }
+ LocalFree(shortcut_path);
+ }
+
+ reg_del(log, root, KEY_MPV_UNINSTALL, NULL);
+}
+
#define REGISTER_AUTOPLAY_HANDLER(media, event, action) \
- reg_add_str(log, root, KEY_MPV_PROG_ID(media) L"\\shell", NULL, L"open"); \
reg_add_str(log, root, KEY_MPV_PROG_ID(media) L"\\shell\\open\\command", \
NULL, L"mpv.exe " media L":// --" media L"-device=%L"); \
reg_add_str(log, root, \
@@ -258,6 +300,8 @@ static void w32_register(struct MPContext *mpctx)
mp_msg(log, MSGL_INFO, "Registering mpv for %s...\n",
root == HKEY_LOCAL_MACHINE ? "all users" : "the current user");
+ remove_registration(log, root);
+
// Register mpv as an application
//
reg_add_str(log, root, KEY_MPV_APP_PATH(".exe"), NULL, mpv_path);
@@ -275,7 +319,6 @@ static void w32_register(struct MPContext *mpctx)
// reg_add_str(log, root, KEY_MPV_APP, L"FriendlyAppName", MPV_FRIENDLY_NAME);
// Add shell open command
- reg_add_str(log, root, KEY_MPV_APP L"\\shell", NULL, L"open");
reg_add_str(log, root, KEY_MPV_APP L"\\shell\\open\\command", NULL,
L"mpv.exe -- \"%L\"");
@@ -294,7 +337,6 @@ static void w32_register(struct MPContext *mpctx)
reg_add_dwr(log, root, KEY_MPV_PROG_ID("url"), L"EditFlags", FTA_Show);
reg_add_str(log, root, KEY_MPV_PROG_ID("url"), L"FriendlyTypeName",
L"mpv URL handler");
- reg_add_str(log, root, KEY_MPV_PROG_ID("url") L"\\shell", NULL, L"open");
reg_add_str(log, root, KEY_MPV_PROG_ID("url") L"\\shell\\open\\command",
NULL, L"mpv.exe -- \"%L\"");
reg_add_str(log, root, KEY_MPV_PROG_ID("url") L"\\shell\\open\\ddeexec",
@@ -336,20 +378,30 @@ static void w32_register(struct MPContext *mpctx)
mp_from_utf8(tmp, protocols_str));
}
- // Register file handler
- reg_add_str(log, root, KEY_MPV_PROG_ID("file"), NULL, L"mpv");
- reg_add_str(log, root, KEY_MPV_PROG_ID("file"), L"FriendlyTypeName", L"mpv Media File");
+ // Register file handler. Without a name, so it will be identified by its extension.
reg_add_dwr(log, root, KEY_MPV_PROG_ID("file"), L"EditFlags", FTA_OpenIsSafe);
- reg_add_str(log, root, KEY_MPV_PROG_ID("file") L"\\shell", NULL, L"open");
reg_add_str(log, root, KEY_MPV_PROG_ID("file") L"\\shell\\open\\command",
NULL, L"mpv.exe -- \"%L\"");
// Register file associations
+ char *disc_exts[] = {
+#if HAVE_DVDNAV || HAVE_DVDA || HAVE_LIBBLURAY
+ "iso",
+#endif
+#if HAVE_DVDNAV || HAVE_DVDA
+ "ifo",
+#endif
+#if HAVE_LIBBLURAY
+ "bdmv",
+#endif
+ NULL
+ };
char **exts_groups[] = {
#if HAVE_LIBARCHIVE
mpctx->opts->archive_exts,
#endif
mpctx->opts->audio_exts,
+ disc_exts,
mpctx->opts->image_exts,
mpctx->opts->playlist_exts,
mpctx->opts->video_exts,
@@ -425,6 +477,8 @@ static void w32_register(struct MPContext *mpctx)
if (SUCCEEDED(PathCchRemoveFileSpec(mpv_path, MP_PATH_MAX)))
reg_add_str(log, root, KEY_MPV_UNINSTALL, L"InstallLocation", mpv_path);
+ SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
+
mp_msg(log, MSGL_INFO, "mpv has been successfully registered.\n");
mp_msg(log, MSGL_INFO, "Note: The mpv binary has not been copied or moved. Please keep it in the current directory.\n");
mp_msg(log, MSGL_INFO, "If you move it, simply run this process again to re-register.\n");
@@ -440,45 +494,9 @@ static void w32_unregister(struct MPContext *mpctx)
mp_msg(log, MSGL_INFO, "Unregistering mpv for %s...\n",
root == HKEY_LOCAL_MACHINE ? "all users" : "the current user");
- reg_del(log, root, KEY_MPV_APP_PATH(".exe"), NULL);
- reg_del(log, root, KEY_MPV_APP_PATH(".com"), NULL);
- reg_del(log, root, KEY_MPV_APP, NULL);
- reg_del(log, root, KEY_MPV_CAPABILITIES_APP, NULL);
- reg_del(log, root, L"Software\\RegisteredApplications", MPV_NAME);
-
- reg_del(log, root, KEY_MPV_PROG_ID("bluray"), NULL);
- reg_del(log, root, KEY_MPV_PROG_ID("cdda"), NULL);
- reg_del(log, root, KEY_MPV_PROG_ID("dvd"), NULL);
- reg_del(log, root, KEY_MPV_PROG_ID("dvda"), NULL);
- reg_del(log, root, KEY_MPV_PROG_ID("file"), NULL);
- reg_del(log, root, KEY_MPV_PROG_ID("url"), NULL);
+ remove_registration(log, root);
- reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayCDAudioOnArrival", NULL);
- reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayCDAudioOnArrival",
- L"MpvPlayCDAudioOnArrival");
- reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayDVDMovieOnArrival", NULL);
- reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayDVDMovieOnArrival",
- L"MpvPlayDVDMovieOnArrival");
- reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayDVDAudioOnArrival", NULL);
- reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayDVDAudioOnArrival",
- L"MpvPlayDVDAudioOnArrival");
- reg_del(log, root, KEY_AUTOPLAY L"\\Handlers\\MpvPlayBluRayOnArrival", NULL);
- reg_del(log, root, KEY_AUTOPLAY L"\\EventHandlers\\PlayBluRayOnArrival",
- L"MpvPlayBluRayOnArrival");
-
- wchar_t *shortcut_path = w32_get_shortcut_path(log);
- if (shortcut_path) {
- mp_msg(log, MSGL_V, "Removing shortcut: '%ls'\n", shortcut_path);
- if (!DeleteFileW(shortcut_path)) {
- DWORD err = GetLastError();
- mp_msg(log, err == ERROR_FILE_NOT_FOUND ? MSGL_DEBUG : MSGL_ERR,
- "Failed to delete shortcut: '%ls' -> %s\n", shortcut_path,
- mp_LastError_to_str());
- }
- LocalFree(shortcut_path);
- }
-
- reg_del(log, root, KEY_MPV_UNINSTALL, NULL);
+ SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
mp_msg(log, MSGL_INFO, "mpv has been successfully unregistered.\n");
mp_msg(log, MSGL_INFO, "You may now safely delete the mpv binary if desired.\n");
diff --git a/stream/stream_bluray.c b/stream/stream_bluray.c
index e4454999d38c5..f83b1a5d9a169 100644
--- a/stream/stream_bluray.c
+++ b/stream/stream_bluray.c
@@ -1742,7 +1742,7 @@ const stream_info_t stream_info_bluray = {
static bool check_bdmv(const char *path)
{
- if (strcasecmp(mp_basename(path), "MovieObject.bdmv"))
+ if (!bstr_case_endswith(bstr0(path), bstr0(".bdmv")))
return false;
FILE *temp = fopen(path, "rb");
@@ -1754,7 +1754,10 @@ static bool check_bdmv(const char *path)
if (fread(data, 50, 1, temp) == 1) {
bstr bdata = {data, 50};
- ret = bstr_startswith0(bdata, "MOBJ0100") || // AVCHD
+ ret = bstr_startswith0(bdata, "INDX0100") || // AVCHD
+ bstr_startswith0(bdata, "INDX0200") || // Blu-ray
+ bstr_startswith0(bdata, "INDX0300") || // UHD BD
+ bstr_startswith0(bdata, "MOBJ0100") || // AVCHD
bstr_startswith0(bdata, "MOBJ0200") || // Blu-ray
bstr_startswith0(bdata, "MOBJ0300"); // UHD BD
}
@@ -1815,7 +1818,8 @@ static int bdmv_dir_stream_open(stream_t *stream)
}
// We allow the path to point to a directory containing BDMV/, a
- // directory containing MovieObject.bdmv, or that file itself.
+ // directory containing MovieObject.bdmv, or index.bdmv or
+ // MovieObject.bdmv in it.
if (!check_bdmv(path)) {
// On UNIX, just assume the filename has always this case.
char *npath = mp_path_join(priv, path, "MovieObject.bdmv");
diff --git a/stream/stream_dvda.c b/stream/stream_dvda.c
index 2c1f70180c5cd..d243872b6de8e 100644
--- a/stream/stream_dvda.c
+++ b/stream/stream_dvda.c
@@ -878,19 +878,19 @@ const stream_info_t stream_info_dvda = {
.stream_origin = STREAM_ORIGIN_UNSAFE,
};
-// Check if this is likely to be AUDIO_TS.IFO.
+// Check if this is likely to be an IFO file of a DVD-Audio disc.
static bool check_ifo(const char *path)
{
- if (strcasecmp(mp_basename(path), "audio_ts.ifo"))
+ if (!bstr_case_endswith(bstr0(path), bstr0(".ifo")))
return false;
FILE *temp = fopen(path, "rb");
if (!temp)
return false;
- char data[12];
+ char data[8];
bool r = fread(data, sizeof(data), 1, temp) == 1 &&
- memcmp(data, "DVDAUDIO-AMG", 12) == 0;
+ memcmp(data, "DVDAUDIO", 8) == 0;
fclose(temp);
return r;
@@ -929,7 +929,7 @@ static int ifo_dvda_stream_open(stream_t *stream)
}
// We allow the path to point to a directory containing AUDIO_TS/, a
- // directory containing AUDIO_TS.IFO, or that file itself.
+ // directory containing AUDIO_TS.IFO, or any IFO file in it.
if (!check_ifo(path)) {
// On UNIX, just assume the filename is always uppercase.
char *npath = mp_path_join(priv, path, "AUDIO_TS.IFO");
diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c
index 19f724f9a47a4..58abaf5876545 100644
--- a/stream/stream_dvdnav.c
+++ b/stream/stream_dvdnav.c
@@ -1694,10 +1694,7 @@ const stream_info_t stream_info_dvdnav = {
static bool check_ifo(const char *path)
{
- if (strcasecmp(mp_basename(path), "video_ts.ifo"))
- return false;
-
- return dvd_probe(path, ".ifo", "DVDVIDEO-VMG");
+ return dvd_probe(path, ".ifo", "DVDVIDEO");
}
static int ifo_dvdnav_stream_open(stream_t *stream)
@@ -1733,7 +1730,7 @@ static int ifo_dvdnav_stream_open(stream_t *stream)
}
// We allow the path to point to a directory containing VIDEO_TS/, a
- // directory containing VIDEO_TS.IFO, or that file itself.
+ // directory containing VIDEO_TS.IFO, or any IFO file in it.
if (!check_ifo(path)) {
// On UNIX, just assume the filename is always uppercase.
char *npath = mp_path_join(priv, path, "VIDEO_TS.IFO");