# HG changeset patch # User mosu # Date 1067380616 0 # Node ID fa738ed513f9dec1afc571e6fd3406a90bbb8f67 # Parent 0c8d12a58a296d5e567f380e27a52e2497f86dd3 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" . diff -r 0c8d12a58a29 -r fa738ed513f9 vobsub.c --- a/vobsub.c Tue Oct 28 20:49:33 2003 +0000 +++ b/vobsub.c Tue Oct 28 22:36:56 2003 +0000 @@ -88,11 +88,38 @@ p++; } rc = urarlib_get(&stream->data, &stream->size, (char*) p, rar_filename, ""); + if (!rc) { + /* 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); - if (!rc) { - free(stream); - return NULL; - } stream->pos = 0; } return stream;