sb3extract.py scratch3.0的sb3项目文件素材提取器

""" sb3extract.py scratch3.0的sb3项目文件素材提取器
    本程序用来提取scratch3.0版本的项目文件里的资源。sb3文件是zip档,用winrar等工具解压后的资源以MD5值为文件名。
不方便区分造型先后顺序,对形成序列帧不友好。本程序首先解压sb3文件,再读取project.json文件,根据文件名,索引号,造型名称,文件格式,形成新的文件名。
程序设计为命令行的方式,可以用各种编程语言设计GUI程序方便地调用。
最简单的用法就是把本程序放在需要提取的sb3文件们同一个文件夹,双击它即可。"""

__author__ = '李兴球'
__date__ = '2019/1/13'
__company__ = '风火轮少儿编程'

import os
import re
import sys
import json
import shutil
import zipfile

def pure_string(filename):
    table = ("\\","/","*","?","<",">","|",".")
    for char in table:
        filename = filename.replace(char,'')
    return filename

def extractzip(filename):
    """试图解压缩filename,成功则返回True"""
    projectfile = ""  
    folder = os.path.splitext(filename)[0]
    folder = folder.replace(".","")
    folder = folder.strip()
    try:
       fp = zipfile.ZipFile(filename)    
       fp.extractall(path=folder)
       fp.close()
       projectfile = folder + os.sep + "project.json"
       return folder,os.path.exists(projectfile)
    except:
       return  folder,False

def process_name(sb3file):
    pass  # 需要获取完整的程序请和李兴球联系。

def bat_process_name(sb3filelist):
    """遍历所有sb3文件"""
    amounts = len(sb3filelist)
    counter = 0
    for sb3file in sb3filelist:
        try:            
            counter += process_name(sb3file)
        except:
            pass
    print("共有:",amounts,"个文件,成功处理了:",counter,"个。")
    input("done!                         作者:" + __author__ + "@" + __date__)
     
def analyse(parameters):
    """分析命令行参数列表"""
    sb3files = []
    if not ("-sb3" in parameters or "-path" in parameters): # sb3extract sb3file1 sb3file2 ...
        #print("在参数中没有-sb3也没有-path")
        return parameters
        
    if "-sb3" in parameters:
        sb3index = parameters.index("-sb3")
        #print("-sb3index",sb3index)
        if "-path" in parameters:            
            pathindex = parameters.index("-path")
            path = parameters[pathindex+1]         # -path后的字符串
            if pathindex<sb3index:                 # sb3extract -path pathname -sb3 sb3file1 sb3file2 ...
                sb3files = parameters[sb3index+1:]                
            else:                                  # sb3extract -sb3 sb3file1 sb3file2 ... -path pathname  
                sb3files =  parameters[sb3index+1:pathindex]
            for file in os.listdir(path):          # 把path中的加到列表中
                if os.path.splitext(file)[-1] == '.sb3':
                   sb3files.append(path + os.sep  + file)
            
        else:                                      # sb3extract -sb3 sb3file1 sb3file2 ...
            sb3files = parameters[sb3index+1:]            
    else:                                          # sb3extract -path pathname
        pathindex = parameters.index("-path")
        path = parameters[pathindex+1]             # 在-path后没写目录名可能会让程序崩溃
        for file in os.listdir(path):
            if os.path.splitext(file)[-1] == '.sb3':
               sb3files.append(path + os.sep  + file)
        sb3files.extend(parameters[1:pathindex])   # 把-path前面的sb3filename加到列表(如果有的话)
        try:
            sb3files.extend(parameters[pathindex+2:])   # 把-path后面的sb3filename加到列表(如果有的话)
        except:
            pass
    return sb3files
         

if __name__ == "__main__":   

    p = sys.argv
    
    if len(p) == 1:
        print("本程序提取scratch3项目素材,以可读性好的文件名呈现出来。\n")        
        print("用法如下:")
        print("sb3extract                             # 处理当前目录下sb3文件们(双击本程序)")    
        print("sb3extract file1 file2 ..              # 指定文件们处理")
        print("sb3extract file1 file2 ..-path dir     # 指定文件们与文件夹" )
        print("sb3extract -sb3 file1 file2 ..         # 指定文件们")
        print("sb3extract -sb3 file1 file2 ..-path dir # 指定文件们与文件夹")
        print("sb3extract -path dir                    # 只指定文件夹")
        print("sb3extract -path dir file1 file2..      # 指定文件夹和文件们")
        print("sb3extract -path dir -sb3 file1 file2.. # 指定文件夹与文件们\n")
        print("说明:-sb3参数后面是以空格隔开的sb3文件名,-path参数后面是路径名,不输入-sb3和-path,则认为都是sb3文件。")
        print("程序会把指定目录下的sb3文件和指定的sb3文件们合并到一个列表,然后逐个处理。开始处理:\n")
        sb3files = [filename for filename in os.listdir() if os.path.splitext(filename)[-1] == '.sb3']
    else:
        parameters = p[1:]
        sb3files = analyse(parameters)
    #print(sb3files)
    bat_process_name(sb3files)
 
    """打包方式:pyinstaller -F sb3extract.py"""