심심하기도 하고 내가 쓰고 싶어서 만들었는데 깃헙에서 코드 긁어온거 수정하고 몇 개만 직접 만든거라 똑같이 깃헙에 올려둠

( 깃헙에서 바로 보려면 ▶ [ 여기 ] ◀ 로 )


사용 방법이나 파일은 밑에 본문에서도 볼 수 있고 깃헙 가서도 볼 수 있는데, 깃헙은 동영상 안 올라가고 움짤만 올라가서 화질이 좀 낮음

(여기는 동영상 올릴 수 있어서 깃헙 보다 크게 볼 수 있음)


사용 방법은 진짜 쉽게 풀어놨고(진짜 쉬움) 스즈나 지능 1/2 되는 애도 눈 달려 있고 글만 읽을 줄 알면 다 할 수 있게 만들어 놨음


카테고리를 뭘로 해야 될 지 고민이라서 공지 읽어봤는데 카테고리 관련 내용은 안 보여 가지고 일단 정보로 지정했는데 카테고리 바꿔야 되면 바꿀게


그리고 본문 적기 귀찮아서 대충 깃헙 readme에 올린거 붙여넣고 수정 함




🔍 주요 기능

가장 먼저 {manifest_filter}에 입력 된 값을 기준으로 원본 Resource 파일을 다운로드 받음

(* 다운로드 되는 파일 정보는 밑에 참고)

  - Assetbundles (*.unity3d)

  - Audio (*.awb, *.acb)

  - Video (*.usm)<BR><BR>


그 다음, {manifest_filter}에 입력 된 값을 기준으로 모든 원본 Resource가 다운로드 됐다면 원본 파일을 변환함

(* 확장자 별 변환 과정은 밑에 참고)

  - *.unity3d -> *.png, *.txt

  - *.awb, *.acb -> *.wav

  - *.usm -> *.mp4

  - *storydata.bytes -> *.json




💾 다운로드


※ 추출 도구는 상단 쥬얼 아이콘을 클릭해서 다운

※ 필요한 모든 파일들은 zip 파일 내 '📁\01_Install' 폴더에 포함 돼 있음

*.zip 파일 내 제공 된 파일들을 사용하려는 경우 개별 다운로드 과정을 생략해도 되는데, 제공 된 설치 파일들을 신뢰하지 않을 경우 아래 링크를 통해 개별 다운로드 해야 됨

ProgramURL필수여부비고
Python 3.10.11Download필수◼ Python Script 동작, 파이썬 3.10.xx 버전 중 아무거나 사용 가능
◼ 단, 3.10.xx 버전이 아닌 다른 버전은 확인한 적 없으므로 정상적인 작동을 보장하지 못 함
dotNET 3.1Download필수◼ Audio 파일 또는 Video 파일을 변환할 때 사용
K-Lite Codec Pack 18.2.0 (Mega)Download선택◼ Audio 및 Video 코덱 설치
◼ 추출 된 Audio 파일 또는 Video 파일이 정상적으로 재생되지 않을 때 설치
◼ 18.2.0 버전이 아니어도 됨




❗ 주의 사항 ❗

※ 반드시 온라인 환경에서 작업 (오프라인 환경은 고민 중)

※ 발견 된 문제를 미리 확인하여 작업 중 적절히 대처할 수 있도록 준비해야 됨

📛 지금까지 발견 된 문제
01. 다운로드
a 폴더에 다운로드 되는 모든 manifest들은 없는 파일만 다시 다운로드 후 변환 과정을 거치나, 'movie2manifest'와 'soundmanifest'는 파일 존재 여부 상관 없이 모든 파일을 다시 처음부터 다운로드 후 변환 과정을 거쳐 시간이 많이 소요 됨

02. 알 수 없는 문제 발생
Scrpit를 통해 다운로드 또는 변환 과정을 거치는 중 알 수 없는 오류가 발생하여 진행이 멈추거나 아무 경고 없이 창이 꺼짐, 작업이 끝나지 않았는데 창이 꺼짐 등 과 같은 문제가 발생
이 경우 창을 닫고 다시 실행하여 동일 작업을 거쳐주면 정상적으로 진행하나, '💾 다운로드'에서 언급 한 'movie2manifest'와 'soundmanifest'는 필요 이상으로 시간이 많이 소요되는 단점이 있음.

03. PC 성능 저하
Scrpit를 통해 다운로드 또는 변환 과정을 거치는 중 필요 이상으로 PC Resource를 사용하여 PC 성능이 낮아지는 문제(ex. RAM 점유율 100%, 가상메모리 점유율 상승, CPU 점유율 상승 등)가 발생
특히 저사양 PC 환경이거나, 현재 사용중인 PC의 Windows가 설치 된 `C:\` 또는 `C:\ 하위 폴더 (ex. 바탕화면, 다운로드, 문서 등)`에서 작업을 하는 경우 자주 발견
이 경우 현재 사용중인 PC의 Windows가 설치 된 저장 장치에서 작업하지 않고 다른 저장장치에서 작업하면 해결 됐음


※ 반드시 저장 장치의 여유 공간을 확인 후 작업

※ 모든 내용은 2024-03-23 AM 02:20 기준이며, 작업 시점에 따라 총 용량 및 파일 개수가 달라짐


각 manifest 파일 별 추출 및 변환 파일이 저장되는 필요 최소 여유 공간은 아래 표 참고

[MANIFEST FILE NAME]디스크 할당 크기내용
all2_assetmanifest3.02GB (3,246,854,144 바이트)파일 27,334, 폴더 2,525
animation2_assetmanifest3.66MB (3,846,144 바이트)파일 276, 폴더 2
arcade2_assetmanifest2.85MB (2,990,080 바이트)파일 28, 폴더 5
banner2_assetmanifest52.3MB (54,845,440 바이트)파일 968, 폴더 2
bg2_assetmanifest3.44GB (3,699,675,136 바이트)파일 11,142, 폴더 1,100
caravan2_assetmanifest64.2MB (67,366,912 바이트)파일 631, 폴더 109
clanbattle2_assetmanifest7.50MB (7,864,320 바이트)파일 56, 폴더 2
colosseum2_assetmanifest408KB (417,792 바이트)파일 20, 폴더 4
comic2_assetmanifest50.5MB (53,014,528 바이트)파일 600, 폴더 2
consttext2_assetmanifest152KB (155,648 바이트)파일 1, 폴더 2
dailytask2_assetmanifest3.83MB (4,026,368 바이트)파일 7, 폴더 5
dungeon2_assetmanifest1.56MB (1,642,496 바이트)파일 28, 폴더 5
event2_assetmanifest893MB (937,369,600 바이트)파일 3,948, 폴더 416
font2_assetmanifest10.3MB (10,821,632 바이트)파일 4, 폴더 2
gacha2_assetmanifest2.16MB (2,269,184 바이트)파일 20, 폴더 3
howtoplay2_assetmanifest126MB (132,472,832 바이트)파일 386, 폴더 3
icon2_assetmanifest709MB (743,440,384 바이트)파일 27,687, 폴더 85
jukebox2_assetmanifest11.8MB (12,476,416 바이트)파일 698, 폴더 3
knightenhance2_assetmanifest7.86MB (8,245,248 바이트)파일 152, 폴더 6
lipsyncothers2_assetmanifest7.82MB (8,208,384 바이트)파일 1,812, 폴더 2
loginbonus2_assetmanifest151MB (158,404,608 바이트)파일 413, 폴더 54
masterdata_assetmanifest9.16MB (9,605,120 바이트)파일 1, 폴더 2
minigame2_assetmanifest261MB (274,653,184 바이트)파일 1,725, 폴더 165
resourcedefine2_assetmanifest52.0KB (53,248 바이트)파일 3, 폴더 2
room2_assetmanifest221MB (232,427,520 바이트)파일 5,826, 폴더 2,739
shader2_assetmanifest176KB (180,224 바이트)파일 2, 폴더 8
ㄴ a176KB (180,224 바이트)파일 1, 폴더 2
ㄴ assets79바이트 (79 바이트)파일 1, 폴더 4
spine2_assetmanifest1.88GB (2,026,528,768 바이트)파일 15,074, 폴더 2,953
storydata2_assetmanifest4.26GB (4,577,447,936 바이트)파일 37,785, 폴더 13,434
talentquest2_assetmanifest1.07MB (1,122,304 바이트)파일 7, 폴더 4
travel2_assetmanifest152MB (159,477,760 바이트)파일 695, 폴더 149
unit2_assetmanifest702MB (736,591,872 바이트)파일 8,136, 폴더 9
wac2_assetmanifest65.3MB (68,558,848 바이트)파일 453, 폴더 48
manifest_assetmanifest//
movie2manifest108GB (115,967,754,240 바이트)파일 5,134, 폴더 3
soundmanifest239GB (256,754,122,752 바이트)파일 298,681, 폴더 8
ㄴ b59.6GB (64,071,749,632 바이트)파일 3,050, 폴더 1
ㄴ s2.30GB (2,478,477,312 바이트)파일 3,179, 폴더 1
ㄴ v177GB (190,203,895,808 바이트)파일 292,452, 폴더 3

나 나름대로 폴더 명이 뭘 얘기 하는 건가 싶어서 생각해봤는데

\a = Asset
\b = BGM
\s = SE(Sound Effect)
\v = Voice

인 것 같음 (확실한 건 아님)


전체 manifest 파일 작업 시 필요 최소 여유 공간은 아래 표 참고

구분디스크 할당 크기내용
원본 파일 삭제 한 전체 파일 크기275GB (295,939,731,456 바이트)파일 367,270, 폴더 23,818
원본 파일 삭제 안 한 전체 파일 크기363GB (389,966,929,920 바이트)파일 449,763, 폴더 23,862


각 manifest의 구조는 아래 목록을 클릭해서 참고

🧾 All Manifests (Level 2) 📁 Priconne_Extractor
📁 a
│ ├📁 all
│ ├📁 animation
│ ├📁 arcade
│ ├📁 banner
│ ├📁 bg
│ ├📁 caravan
│ ├📁 clanbattle
│ ├📁 colosseum
│ ├📁 comic
│ ├📁 consttext
│ ├📁 dailytask
│ ├📁 dungeon
│ ├📁 event
│ ├📁 font
│ ├📁 gacha
│ ├📁 howtoplay
│ ├📁 icon
│ ├📁 jukebox
│ ├📁 knightenhance
│ ├📁 lipsyncothers
│ ├📁 loginbonus
│ ├📁 masterdata
│ ├📁 minigame
│ ├📁 resourcedefine
│ ├📁 room
│ ├📁 roomeffect
│ ├📁 roomfinger
│ ├📁 roomgrid
│ ├📁 roomicon
│ ├📁 roomitem
│ ├📁 roomthumb
│ ├📁 shader
│ ├📁 spine
│ ├📁 storydata
│ ├📁 talentquest
│ ├📁 travel
│ ├📁 unit
│ └📁 wac
📁 assets
📁 b
📁 m
│ └📁 t
📁 manifest
📁 s
📁 v
📁 t


모든 manifest의 구조와 파일 목록을 확인하고 싶으시다면 아래 목록을 클릭해서 참고

🗂 All Manifests (Full)

(용량 커서 바로 안 보이니까 View raw 눌러서 봐야 됨)



⏩ 사용 방법

01. zip 파일 다운로드 후 적절한 위치에 압축 해제




2. 01_Install 폴더로 이동 후 본문 상단 필수 요구 사항과 선택 사항을 참고해서 파일 설치



[ ※ 주의 ] Add python.exe to PATH 에 반드시 체크 후 Install Now 클릭

(📌 미처 누르지 못했다면 설치 파일 다시 실행 또는 소프트웨어 제거 후 재 설치)




3. 모두 설치가 끝났다면 02_Tools 폴더로 이동




4. Priconne_Extractor.zip 파일 압축 해제

[ ⚠️ 중요 ⚠️ ] 모든 데이터들은 Priconne_Extractor.zip 파일을 압축 해제 한 경로에 저장됨




5. 00_Install_required_Python_packages.bat 파일을 실행해서 Python Package 설치



(📌 필요 Python Package 설치가 끝나면 위 스샷같은 같은 화면이 나옴) 




6. 01_Priconne_Manifest_Extractor.py 파일을 실행해서 필요한 manifest 정보 다운로드


(📌 manifest 추출이 끝나면 위 스샷처럼 파일이 새로 생김)




7. 02_Priconne_Original_Resource_Download_to_Convert.py 파일을 실행하여 다운로드 및 변환 할 manifest 정보를 입력하고 Enter키 입력


[ 🛑 경고 🛑 ]

작업하고자 하는 menifest의 최소 여유 공간을 확인하지 않았을 경우 반드시 ❗ 주의 사항 ❗ 확인 후 작업

(특히 오디오 또는 비디오 리소스 추출하려는 프붕이는 제발 확인하고 작업 해)




(📌 banner2_assetmanifest 입력 결과)





만약 위 사진처럼 예상치 못한 오류로 인해 작업이 중단 또는 멈춘다면 창을 닫고 다시 열고 다시 작업





(📌 banner2_assetmanifest 입력 결과)



(📌 movie2manifest 입력 결과)


작업이 성공적으로 끝나면 새로운 폴더와 함께 원본 파일 및 변환 된 파일을 확인할 수 있음



선택작업

말 그대로 선택 작업이라 하고 싶은 사람만 하면 됨


원본 Resource 파일을 모두 제거하려는 경우 03_Priconne_Original_Resource_Remover.bat 파일을 실행해서 원본 Resource 파일을 제거





캐릭터 명을 모두 추출하고 싶다면 04_Find_Character_List.py 파일을 실행



캐릭터 이름 아닌 것도 몇 개 빠졌는데 무시하면 됨




입력 한 캐릭터 명 전체 또는 일부를 기준으로 대사 정보 및 Audio 파일 정보를 찾고 싶다면 05_Find_Character_Names_in_Storydata.py 파일을 실행



예를 들어, 'コッコロ(=콧코로)'를 입력하지 않고, 'コ'만 입력 후 검색을 하면 모든 캐릭터 이름 중 'コ'가 포함 된 캐릭터 모두 결과값을 반환

(📌 녹화 된 내용 기준으로 'コッコロ(콧코로)', 'ペコリーヌ(=페코린느)', 'マコト(=마코토)', 'ミヤコ(=미야코)' 가 포함 된 결과가 출력 된 것을 확인할 수 있음)




⚙ 고급 설정 (선택)

이 작업은 똑똑한 프붕이나 이것 저것 코드 수정 해 보고 싶은 프붕이만 작업하자


❗ 필수 작업 ❗


파일 -> 옵션 -> 보기 -> 숨김 파일 및 폴더 상태를 숨김 파일, 폴더 및 드라이브 표시로 변경 후 확인 클릭





수정하고자 하는 파일 선택 후 마우스 우클릭 -> 속성 -> 일반 -> 특성 항목 중 읽기 전용(R)상태 해제 후 확인


저거 안 하면 00~05 붙은 파일이 읽기 전용으로 돼 있어서 수정하고 저장 자체가 안 됨

(사본으로 저장하려는 경우에는 읽기 전용 안 풀고 해도 됨)


🛠 특정 파일만 다운로드 받은 다음 변환하고자 하는 경우?
02_Priconne_Original_Resource_Download_to_Convert.py 파일 실행 후 아래 내용 중 assetbundle_filter=""와 file_filter=""부분 수정


# 만약, png 파일만 저장되게 하고 싶다면?


    dm.datamine(

        manifest_filter=manifest_filter,

        assetbundle_filter="",

        file_filter=".png",

    )

    # manifest를 입력받지 않고 특정 manifest(`bg2_assetmanifest`)를 바로 다운로드 받고 싶다면?


    ▼ 여기서부터 ▼

    while True:

        manifest_filter = input(">>> ")


        if manifest_filter not in allowed_filenames:

            print("파일명이 올바르지 않습니다. ")

            print()

            continue


        break


    print()

    ▲ 여기까지 모두 삭제 ▲


    dm.datamine(

        # ▼ ▼ ▼ manifest_filter=manifest_filter를 manifest_filter=""로 변경 후 쌍 따옴표 안에 특정 manifest 파일 명 삽입

        manifest_filter="bg2_assetmanifest",

        assetbundle_filter="",

        file_filter="",

    )


보다 자세한 설정은 원 제작자가 제공 한 샘플(example.py) 확인

📔 example.py

from src import Dataminer



def examples():

    # initializes the dataminer

    dm = Dataminer()


    # Extracting a whole manifest

    dm.datamine(

        manifest_filter="wac",

        assetbundle_filter="",

        file_filter="",

    )


    # Extracting images

    dm.datamine(

        manifest_filter="bg",

        assetbundle_filter=r"still_unit_1001[0-9]{2}",

        file_filter=r"still_unit_1001[0-9]{2}\.png",

    )


    # Sound and Movie manifests only contain regular files so the assetbundle filter isn't needed.

    dm.datamine(

        manifest_filter="sound",

        assetbundle_filter="",

        file_filter=r"bgm_M36\.",

    )

    dm.datamine(

        manifest_filter="sound",

        assetbundle_filter="",

        file_filter="bgm_M152",

    )

    dm.datamine(

        manifest_filter="movie",

        assetbundle_filter="",

        file_filter=r"character_1001[0-9]{2}",

    )


    def sd_skel_example():

        # 000000 files contains animations shared by all units

        dm.datamine(

            manifest_filter="spine",

            assetbundle_filter="000000",

            file_filter="cysp",

        )


        # the common cysp contain animations shared by units from the same same class (eg. sword units)

        dm.datamine(

            manifest_filter="spine",

            assetbundle_filter="common",

            file_filter="cysp",

        )


        # filters for the specific unit animations, include all uncap versions

        dm.datamine(

            manifest_filter="spine",

            assetbundle_filter=r"1001[0-9]{2}",

            file_filter=r"1001[0-9]{2}",

        )


        # assemble .cysp files into a .skel file for a given unit_id

        dm.get_skel(100111)


    sd_skel_example()



if __name__ == "__main__":

    # keep all scripting in this scope to avoid bugs with multiprocessing

    examples()



🛠 *.usm 파일을 *.mp4 파일이 아닌 다른 확장자로 변환하고자 하는 경우?
PRICONNE_EXTRACTION_TOOLS에 포함 된 'UsmToolkit'은 기본적으로 FFmpeg 표준 구문 사용

01. '\Priconne_Extractor\src\files'로 이동 후 'movie_file.py'파일 내용 중 'extract_path'부분 수정
02. '\Priconne_Extractor\usmtoolkit'로 이동 후 'config.json'파일 내용 중 'OutputFormat'부분 수정

# 만약, *.mp4 파일이 아닌 *.mkv 파일로 저장하고 싶다면?

    # ▼ movie_file.py 파일 내용 중 일부 ▼
    def extract(self) -> None:
        self.download()
        extract_path = self.path.parent.parent / (self.path.stem + ".mkv")  # <--- 확장자 수정
        if extract_path.exists():
            return

    # ▼ config.json 파일 내용 ▼
{
    "VideoParameter" : "-c:v copy",
    "AudioParameter" : "-c:a ac3 -b:a 640k -af pan='stereo|FL=FL+FC+0.5*BL+BR|FR=FR+LFE+0.5*BL+BR'",
    "OutputFormat" : "mkv"
}
    # ▲ OutputFormat을 mkv로 수정 ▲

보다 자세한 설정은 FFmpeg 표준 구문 확인 후 작업하면 됨

📚 FFmpeg 표준 구문




프붕이 머리는 여기서 한계야 나머지는 몰?루 똑똑한 프붕이들이 '해 줘'


그리고 파일 찾을 땐 윈도우 기본 탐색기 말고 Everyting 같은거 설치해서 써

(Ex. 캐릭터 별 대사 확인해서 오디오 리소스 따려는 프붕이)