diff options
author | mosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-10-28 22:36:56 +0000 |
---|---|---|
committer | mosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-10-28 22:36:56 +0000 |
commit | 7931d804f16fb57cd30c828b828201ee04e9e959 (patch) | |
tree | 976027a66608cb82e8973715b40b932c8021284b /vobsub.c | |
parent | 09c8f3f996f7573f746aef21e08cbffa46fa0684 (diff) | |
download | mpv-7931d804f16fb57cd30c828b828201ee04e9e959.tar.bz2 mpv-7931d804f16fb57cd30c828b828201ee04e9e959.tar.xz |
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" <Uwe.Reder@3SOFT.de>.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11310 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'vobsub.c')
-rw-r--r-- | vobsub.c | 33 |
1 files changed, 30 insertions, 3 deletions
@@ -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; i<num_files; i++, lp=lp->next) { + 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; |