From 7931d804f16fb57cd30c828b828201ee04e9e959 Mon Sep 17 00:00:00 2001 From: mosu Date: Tue, 28 Oct 2003 22:36:56 +0000 Subject: Improved searching for VobSubs inside RAR archives even if the names do not match the movie name. Do not display VobSubs whose timecodes are < 0 which would make all VobSubs appear from the start on upon seeking. Patches by "Reder, Uwe" . git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11310 b3059339-0415-0410-9bf9-f77b7e298cf2 --- vobsub.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'vobsub.c') diff --git a/vobsub.c b/vobsub.c index c943655f87..c2b313ca0b 100644 --- a/vobsub.c +++ b/vobsub.c @@ -88,11 +88,38 @@ rar_open(const char *const filename, const char *const mode) p++; } rc = urarlib_get(&stream->data, &stream->size, (char*) p, rar_filename, ""); - free(rar_filename); if (!rc) { - free(stream); - return NULL; + /* There is no matching filename in the archive. However, sometimes + * the files we are looking for have been given arbitrary names in the archive. + * Let's look for a file with an exact match in the extension only. */ + int i, num_files, name_len; + ArchiveList_struct *list, *lp; + /* the cast in the next line is a hack to overcome a design flaw (IMHO) in unrarlib */ + num_files = urarlib_list (rar_filename, (ArchiveList_struct *)&list); + if (num_files > 0) { + char *demanded_ext; + demanded_ext = strrchr (p, '.'); + if (demanded_ext) { + int demanded_ext_len = strlen (demanded_ext); + for (i=0, lp=list; inext) { + name_len = strlen (lp->item.Name); + if (name_len >= demanded_ext_len && !strcasecmp (lp->item.Name + name_len - demanded_ext_len, demanded_ext)) { + if ((rc = urarlib_get(&stream->data, &stream->size, lp->item.Name, rar_filename, ""))) { + break; + } + } + } + } + urarlib_freelist (list); + } + if (!rc) { + free(rar_filename); + free(stream); + return NULL; + } } + + free(rar_filename); stream->pos = 0; } return stream; -- cgit v1.2.3