Lobsters

Reviving Valve's 15-year-old e-book

밸브의 15년 된 전자책 되살리기

Portal 2 개발 과정을 담은 전자책 ‘The Final Hours of Portal 2’는 오래된 Flash와 종료된 웹 서비스에 의존해 여러 기능이 고장 났습니다. 작성자는 영상·음악·인터랙티브 콘텐츠를 복구하고, SWF 패처와 FastAPI 서버를 공개해 다른 사용자도 전자책을 고칠 수 있게 했습니다.

AI 요약

Portal 2의 개발 과정을 담은 전자책 ‘The Final Hours of Portal 2(TFHoP2)’는 2011년판 Adobe AIR와 Flash를 사용합니다. 전자책 자체는 판매되고 있지만, 영상·음악·설문·인터랙티브 콘텐츠가 외부 웹 서비스에 연결돼 있어 서비스가 바뀌거나 사라지면서 여러 기능이 고장 났습니다. 작성자는 Flash 파일을 분석해 의존성을 확인하고, 콘텐츠를 복구한 뒤 다른 독자도 적용할 수 있도록 패처와 서버를 공개했습니다.

고장 난 콘텐츠 복구

작성자는 SWF 파일을 JPEXS Free Flash Decompiler로 분석해 외부 URL을 조사했습니다. 영상은 10여 년 전에 중단된 YouTube ActionScript 3 Player API에 의존했습니다. 전자책이 기대하는 메서드를 흉내 내는 ActionScript 플레이어를 새로 만들고, 호출을 로컬 MP4 재생으로 연결했습니다. 전자책에 실린 영상 아홉 편은 yt-dlp로 내려받았습니다. 그중 하나는 쿠키를 전달해 연령 제한을 처리했고, 비공개 영상은 제목을 찾아 재업로드본을 확보했습니다.

3D 시각화 세 개와 미니게임 하나는 모두 사라진 도메인의 URL에 연결돼 있었습니다. 처음에는 남은 아카이브를 찾지 못해 미니게임을 짧은 영상만 참고해 재현했습니다. 이후 Archive.org에서 iOS 앱의 IPA 파일을 발견했고, 그 안에 시각화 콘텐츠가 HTML과 에셋 형태로 포함된 사실을 확인했습니다. 이를 PC로 옮겨 네 가지 기능을 복구했습니다.

전자책은 음악 여덟 곡의 미리듣기를 Apple의 mzstatic.com 도메인에서 불러왔습니다. 작성자는 Apple Music 웹에서 각 곡의 ID를 확인한 다음 API로 30초 미리듣기를 내려받아 연결했습니다. 설문 일곱 개는 모두 작동하지 않았습니다. Wayback Machine에서 설문 하나의 HTML과 스타일을 확보했고, PDF에서 13장까지 질문을 복원했습니다. 나중에 추가된 14장의 설문 두 개와 구독 양식은 자료를 찾지 못해 복원하지 못했습니다.

댓글과 파노라마

마지막에 남아 있던 피드백 양식은 화면은 열렸지만 새 댓글이 검토 대기열에만 쌓였습니다. 작성자는 Python 스크립트로 기존 페이지를 순회하며 작성자, 본문, 날짜를 수집했고, 댓글 2,662개를 CSV로 저장했습니다.

파노라마는 외부 서비스가 아니라 로컬 파일을 사용하는데도 최신 Windows 11에서 작동하지 않았습니다. 작성자는 오류 #3207과 #3226을 재현했고, 원인을 확정하지는 못했습니다. 다만 중첩 SWF를 불러오는 HTMLLoader 대신 네이티브 Loader를 쓰고 코드 가져오기를 명시적으로 허용하자 세 파노라마가 모두 작동했습니다.

서버와 패처 공개

처음에는 Python과 FastAPI로 자체 서버를 만들고, hosts 파일을 수정해 전자책의 요청을 자신의 컴퓨터로 돌렸습니다. 정적 파일은 원래 경로에 맞춰 제공하고, 설문과 댓글 데이터는 SQLite에 저장했습니다. 이후 공개 배포를 위해 저작권이 있는 음악과 약 600MB의 영상을 서버에 포함하지 않는 방식으로 바꿨습니다. 음악은 원래 미리듣기 URL로 연결하고, 영상은 Archive.org에 올린 파일을 가리킵니다. 서버는 Docker 이미지로도 제공하며 누구나 직접 호스팅할 수 있습니다.

hosts 파일 수정은 YouTube까지 바꾸는 문제가 있어, 최종 해결책으로 SWF 자체를 고치는 패처를 만들었습니다. 패처는 수정 대상 SWF 세 개를 찾아 백업하고 압축을 풉니다. 컴파일된 ActionScript에 저장된 URL 가운데 지정된 서비스 주소만 교체한 뒤 파일을 다시 만들고 검증합니다. 파노라마 수정에는 단순 문자열 교체가 아닌 ActionScript 변경이 필요해, 원본 SWF와 수정본 사이의 diff를 만들고 사용자 파일에 적용합니다. 패처는 외부 Python 의존성 없이 실행되며, 서버와 함께 소스 코드를 공개했습니다.

원문: nikolan.net / 번역·요약: Trawling