Changeset 406

Show
Ignore:
Timestamp:
04/11/07 15:25:20 (1 year ago)
Author:
astrange
Message:

Use the (LGPL) Mozilla automatic charset detection library for external subtitles.
Unfortunately, it's quite large...
References #87

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Categories.h

    r335 r406  
    1111@interface NSCharacterSet (STAdditions) 
    1212+ (NSCharacterSet *)newlineCharacterSet; 
     13+ (NSCharacterSet *)whitespaceAndBomCharacterSet; 
    1314@end 
    1415 
  • trunk/Categories.m

    r394 r406  
    88 
    99#import "Categories.h" 
     10#import "UniversalDetector.h" 
     11#import "Codecprintf.h" 
    1012 
    1113@implementation NSCharacterSet(STUtilities) 
     
    1416        const unichar chars[] = {'\r','\n',0x0085,0x2028,0x2029}; 
    1517        return [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithCharacters:chars length:5]]; 
     18} 
     19 
     20+ (NSCharacterSet *)whitespaceAndBomCharacterSet 
     21{ 
     22        const unichar bom = 0xfeff; 
     23        NSMutableCharacterSet *cs = [[NSMutableCharacterSet alloc] init];  
     24 
     25        [cs addCharactersInString:[NSString stringWithCharacters:&bom length:1]]; 
     26         
     27        [cs formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; 
     28         
     29        return [cs autorelease]; 
    1630} 
    1731@end 
     
    7387{ 
    7488        NSData *data = [NSData dataWithContentsOfMappedFile:file]; 
    75         NSStringEncoding encodings[] = {NSUTF8StringEncoding, NSUnicodeStringEncoding, NSWindowsCP1252StringEncoding, NSWindowsCP1251StringEncoding}
    76         NSString *str = nil
    77         int i
     89        UniversalDetector *ud = [[UniversalDetector alloc] init]
     90        NSString *res
     91        CFStringEncoding enc
    7892         
    79         for (i = 0; i < sizeof(encodings) / sizeof(NSStringEncoding); i++) { 
    80                 str = [[NSString alloc] initWithData:data encoding:encodings[i]]; 
     93        [ud analyzeData:data]; 
     94         
     95        enc = [ud encoding]; 
     96         
     97        if ([ud confidence] < .7)  
     98                Codecprintf(NULL,"Guessed encoding \"%s\" for \"%s\", but not sure (confidence %f%%).\n",[[ud MIMECharset] UTF8String],[file UTF8String],[ud confidence]*100.); 
    8199                 
    82                 if (str) return [str autorelease]; 
    83         } 
     100        res = [[[NSString alloc] initWithData:data encoding:enc] autorelease]; 
    84101         
    85         NSLog(@"Perian: unable to determine character encoding of %@",file); 
    86         return nil; 
     102        if (!res) Codecprintf(NULL,"Failed to load file as guessed encoding %s.\n",[[ud MIMECharset] UTF8String]); 
     103        [ud release]; 
     104 
     105        return res; 
    87106} 
    88107@end 
  • trunk/Perian.xcodeproj/project.pbxproj

    r377 r406  
    106106                3D211A230B6B1A660051299D /* Categories.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D211A220B6B1A660051299D /* Categories.m */; }; 
    107107                3D211A300B6B1AD80051299D /* SSATagParsing.m.rl in Sources */ = {isa = PBXBuildFile; fileRef = 3D211A2F0B6B1AD80051299D /* SSATagParsing.m.rl */; }; 
     108                3D41BEB40BCD3B510069E7C2 /* libuniversaldetector.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D41BE9A0BCD3B330069E7C2 /* libuniversaldetector.a */; }; 
    108109                3D4A7A990B5533BC004C5D6A /* ColorConversions.c in Sources */ = {isa = PBXBuildFile; fileRef = 3D4A7A980B5533BC004C5D6A /* ColorConversions.c */; }; 
    109110                3DAD32DA0B6DB26100DA0A72 /* StdIOCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61CB114D0ACDF3C2007994BD /* StdIOCallback.cpp */; }; 
     
    270271                        remoteInfo = "ffmpeg Static Libraries"; 
    271272                }; 
     273                3D41BE950BCD3B330069E7C2 /* PBXContainerItemProxy */ = { 
     274                        isa = PBXContainerItemProxy; 
     275                        containerPortal = 3D41BE8C0BCD3B330069E7C2 /* UniversalDetector.xcodeproj */; 
     276                        proxyType = 2; 
     277                        remoteGlobalIDString = 8DC2EF5B0486A6940098B216; 
     278                        remoteInfo = UniversalDetector; 
     279                }; 
     280                3D41BE970BCD3B330069E7C2 /* PBXContainerItemProxy */ = { 
     281                        isa = PBXContainerItemProxy; 
     282                        containerPortal = 3D41BE8C0BCD3B330069E7C2 /* UniversalDetector.xcodeproj */; 
     283                        proxyType = 2; 
     284                        remoteGlobalIDString = 1B0DDCAB0A2D0AD10009B697; 
     285                        remoteInfo = DetectorTest; 
     286                }; 
     287                3D41BE990BCD3B330069E7C2 /* PBXContainerItemProxy */ = { 
     288                        isa = PBXContainerItemProxy; 
     289                        containerPortal = 3D41BE8C0BCD3B330069E7C2 /* UniversalDetector.xcodeproj */; 
     290                        proxyType = 2; 
     291                        remoteGlobalIDString = 3DBF4F570BCD396800DA401A; 
     292                        remoteInfo = universaldetector; 
     293                }; 
    272294                61CB120F0ACE0FB1007994BD /* PBXContainerItemProxy */ = { 
    273295                        isa = PBXContainerItemProxy; 
     
    452474                3D211A2E0B6B1AD80051299D /* SSATagParsing.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SSATagParsing.h; sourceTree = "<group>"; }; 
    453475                3D211A2F0B6B1AD80051299D /* SSATagParsing.m.rl */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; fileEncoding = 4; path = SSATagParsing.m.rl; sourceTree = "<group>"; }; 
     476                3D41BE8C0BCD3B330069E7C2 /* UniversalDetector.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = UniversalDetector.xcodeproj; path = UniversalDetector/UniversalDetector.xcodeproj; sourceTree = "<group>"; }; 
     477                3D41BEBC0BCD63510069E7C2 /* UniversalDetector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = UniversalDetector.h; path = UniversalDetector/UniversalDetector.h; sourceTree = "<group>"; }; 
    454478                3D4A7A970B5533BC004C5D6A /* ColorConversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorConversions.h; sourceTree = "<group>"; }; 
    455479                3D4A7A980B5533BC004C5D6A /* ColorConversions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ColorConversions.c; sourceTree = "<group>"; }; 
     
    663687                                8F483B5E0A6426C1002CCA73 /* AudioToolbox.framework in Frameworks */, 
    664688                                3D211A1D0B6B18880051299D /* Foundation.framework in Frameworks */, 
     689                                3D41BEB40BCD3B510069E7C2 /* libuniversaldetector.a in Frameworks */, 
    665690                        ); 
    666691                        runOnlyForDeploymentPostprocessing = 0; 
     
    778803                                3D211A210B6B1A660051299D /* Categories.h */, 
    779804                                3D211A220B6B1A660051299D /* Categories.m */, 
     805                                3D41BEBC0BCD63510069E7C2 /* UniversalDetector.h */, 
    780806                        ); 
    781807                        name = Source; 
     
    829855                        sourceTree = "<group>"; 
    830856                }; 
     857                3D41BE8D0BCD3B330069E7C2 /* Products */ = { 
     858                        isa = PBXGroup; 
     859                        children = ( 
     860                                3D41BE960BCD3B330069E7C2 /* UniversalDetector.framework */, 
     861                                3D41BE980BCD3B330069E7C2 /* DetectorTest */, 
     862                                3D41BE9A0BCD3B330069E7C2 /* libuniversaldetector.a */, 
     863                        ); 
     864                        name = Products; 
     865                        sourceTree = "<group>"; 
     866                }; 
    831867                6116E5360B43C27B0020F1CE /* ACPublic */ = { 
    832868                        isa = PBXGroup; 
     
    877913                        isa = PBXGroup; 
    878914                        children = ( 
     915                                3D41BE8C0BCD3B330069E7C2 /* UniversalDetector.xcodeproj */, 
    879916                                3D211A2E0B6B1AD80051299D /* SSATagParsing.h */, 
    880917                                3D211A2F0B6B1AD80051299D /* SSATagParsing.m.rl */, 
     
    13231360                                        ProjectRef = F5CFD2C90B5012A100616865 /* A52Codec.xcodeproj */; 
    13241361                                }, 
     1362                                { 
     1363                                        ProductGroup = 3D41BE8D0BCD3B330069E7C2 /* Products */; 
     1364                                        ProjectRef = 3D41BE8C0BCD3B330069E7C2 /* UniversalDetector.xcodeproj */; 
     1365                                }, 
    13251366                        ); 
    13261367                        targets = ( 
     
    13411382 
    13421383/* Begin PBXReferenceProxy section */ 
     1384                3D41BE960BCD3B330069E7C2 /* UniversalDetector.framework */ = { 
     1385                        isa = PBXReferenceProxy; 
     1386                        fileType = wrapper.framework; 
     1387                        path = UniversalDetector.framework; 
     1388                        remoteRef = 3D41BE950BCD3B330069E7C2 /* PBXContainerItemProxy */; 
     1389                        sourceTree = BUILT_PRODUCTS_DIR; 
     1390                }; 
     1391                3D41BE980BCD3B330069E7C2 /* DetectorTest */ = { 
     1392                        isa = PBXReferenceProxy; 
     1393                        fileType = "compiled.mach-o.executable"; 
     1394                        path = DetectorTest; 
     1395                        remoteRef = 3D41BE970BCD3B330069E7C2 /* PBXContainerItemProxy */; 
     1396                        sourceTree = BUILT_PRODUCTS_DIR; 
     1397                }; 
     1398                3D41BE9A0BCD3B330069E7C2 /* libuniversaldetector.a */ = { 
     1399                        isa = PBXReferenceProxy; 
     1400                        fileType = archive.ar; 
     1401                        path = libuniversaldetector.a; 
     1402                        remoteRef = 3D41BE990BCD3B330069E7C2 /* PBXContainerItemProxy */; 
     1403                        sourceTree = BUILT_PRODUCTS_DIR; 
     1404                }; 
    13431405                F5CFD2D60B5012A100616865 /* A52Codec.component */ = { 
    13441406                        isa = PBXReferenceProxy; 
  • trunk/SSADocument.m

    r394 r406  
    323323        NSMutableDictionary *headers, *styleDict; 
    324324        NSMutableArray *doclines; 
    325         NSCharacterSet *ws = [NSCharacterSet whitespaceCharacterSet]; 
     325        NSCharacterSet *ws = [NSCharacterSet whitespaceAndBomCharacterSet]; 
    326326        unichar cai; 
    327327        int formatc; 
     
    332332        doclines = [NSMutableArray array]; 
    333333         
    334         if (![(NSString*)[lenum nextObject] isEqualToString:@"[Script Info]"]) return -1; 
     334        ns = [(NSString*)[lenum nextObject] stringByTrimmingCharactersInSet:ws]; 
     335        if (![ns isEqualToString:@"[Script Info]"]) return -1; 
    335336        while (1) { 
    336337                ns = (NSString*)[lenum nextObject]; 
     
    508509 
    509510        FSRefMakePath(theDirectory, path, PATH_MAX); 
    510         nspath = [NSString stringWithUTF8String:(char*)path]; 
     511        nspath = [[NSString stringWithUTF8String:(char*)path] stringByAppendingPathComponent:(NSString*)filename]; 
    511512        free(path); 
    512513         
    513         if ([ssa loadFile:[nspath stringByAppendingPathComponent:(NSString*)filename]]) { 
    514                 NSLog(@"Perian: unable to load SSA file %@",nspath); 
     514        if ([ssa loadFile:nspath]) { 
     515                Codecprintf(NULL,"Unable to load SSA file \"%s\"\n",[nspath UTF8String]); 
    515516                err = -1; 
    516517                goto bail; 
  • trunk/SubImport.mm

    r394 r406  
    188188                                        NSString *l = [[NSString alloc] initWithBytes:subTextOffset length:subOffset - subTextOffset encoding:NSUTF8StringEncoding]; 
    189189                                        sl = [[SubLine alloc] initWithLine:l start:startTime end:endTime]; 
    190                                          
    191190                                        [l autorelease]; 
    192191                                        [sl autorelease];