Ross Wan's World!

Python, Ajax, PHP and Linux.

Posts Tagged ‘Firefox’

Firefox:修复 omni.jar

Posted by Ross Wan 于 2011/09/06

自从 Firefox 4 开始, Firefox 许多核心文件都放在一个名为 omni.jar 的文件里, 但是, 目前很多流行的解压工具都无法正常浏览或者解压它. 究其原因, 它是一个非标准的 zip 格式文件, 有人曾经就此向 Mozill 提交过 bug, 不过直到目前为止, Firefox 9.0a1 测试版, 问题依旧存在.现提供一个解决方法: 利用 Info-zip 来修复 omni.jar 文件的 header:

zip.exe -FF omni.jar –out omni_fix.jar

运行上面命令, 将会生成一个修复好的omni_fix.jar 文件, 将其重命名为 omni.jar 即可, 这时, 你就可以用你熟悉的解压工具打开它了.

备注:
Info-zip 的下载地址: ftp://ftp.info-zip.org/pub/infozip/win32/zip300xn.zip

Have fun~~

Posted in Firefox | Tagged: , , | Leave a Comment »

批量修改 Firefox 扩展的最大版本号

Posted by Ross Wan 于 2011/08/26

本人一直都是 Firefox Nightbuild 版本的”忠实”使用者,因为可以提前使用最新的功能,性能也有很大的提升,还可以帮 Mozilla 测试新版本,提交 Bugs 报告.尤其现在的 Firefox 9, 在内存方面有很的改进,值得期待.

回归正题, Firefox Nightbuild 版有它的好处, 问题是很多扩展未能兼容, 但有一部分扩展是兼容的,只是它支持的最大版本号未修改过来,这样,就需要人工手动修改其扩展(xpi文件)的install.rdf. (当然,除了修改最大版本号,还有很多方法可以让其兼容,网上都有介绍)

下面的 Python 脚本可以达到批量修改xpi文件的目的:

#!bin/python3
# coding=utf8

import re, zipfile, os, sys

maxversion = 100
ff_maxversion_reg = re.compile(br'(ec8030f7-c20a-464f-9b0e-13a3a9e97384.*?em:maxVersion.*?)([^>< ="/]+)', re.S+re.I)

if __name__ == '__main__':
    if len(sys.argv) > 1:
        maxversion = int(sys.argv[1])
    print('Target Maxversion: %s\n' % maxversion)
    sys.exit()

    for filename in os.listdir():
        print('%s ' % filename, end='')
        if os.path.isdir(filename) or not filename.lower().endswith('.xpi'):
            print('skip.')
            continue
        zin = zipfile.ZipFile(filename)
        rdf = zin.read('install.rdf')
        version = 0
        for item in ff_maxversion_reg.finditer(rdf):
            match_obj = re.search(br'\d+', item.groups()[1])
            if match_obj and int(match_obj.group()) > version:
                version = int(match_obj.group())
        if version >= maxversion:
            zin.close()
            print('skip.')
            continue

        zout = zipfile.ZipFile('new.xpi','w')
        rdf = ff_maxversion_reg.sub(br'\g<1>'+ str(maxversion).encode('utf8'), rdf)
        zout.writestr('install.rdf', rdf)
        for item in zin.infolist():
            if item.filename.lower() == 'install.rdf':
                continue
            else:
                buffer = zin.read(item.filename)
                zout.writestr(item, buffer)
        zin.close()
        zout.close()
        os.remove(filename)
        os.rename('new.xpi', filename)
        print('done!')

将脚本放于 Firefox 配置文件夹的 extensions 目录下运行即可.也可以带1个参数运行,用于指定目标最大版本号,如:

python3 xpi_rdf_batch.py 200

值得注意的是,目前它仅可以修改 xpi 文件, 对于 unpack 的扩展不能修改.

Have fun :)

Posted in Python | Tagged: , , , , , , | 7 Comments »