Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

다운로드 설정을 바꾸지 않고 qBittorrent Content 파일 목록을 CSV로 내보내기

한 토렌트의 파일 응답을 저장하고 원래 인덱스, 다운로드 제외 항목과 진행 비율을 보존해 표에서 확인하세요.

토렌트 요약, 개별 파일 API 응답과 로컬 폴더 목록을 비교한 원본 일러스트
원본 일러스트: 이 절차의 개별 파일 기록은 files 응답에서 얻습니다. Watch at Ease

토렌트 이름 목록은 한 토렌트 내부의 파일 목록과 다릅니다. 큰 Content 트리를 표에서 검색하고 다운로드하지 않음 항목도 포함하려면 아직 받지 않은 파일이 빠질 수 있는 폴더 목록 대신 개별 파일 응답을 사용하세요.

이 방법은 이미 설정되고 정상 인증된 로컬 WebUI에서 기존 토렌트를 읽은 뒤 저장한 JSON 복사본을 오프라인으로 변환합니다. 토렌트 추가, 우선순위 변경, 콘텐츠 다운로드나 디스크 파일 검증은 하지 않습니다.

한 토렌트의 올바른 응답 저장하기

본인의 qBittorrent 5와 이미 로그인할 수 있는 로컬 WebUI에서만 사용합니다. 정상 인증과 보호 기능을 유지하세요. 같은 컴퓨터의 주소가 http://127.0.0.1:8080 이면 그곳에서 평소대로 로그인합니다. 실제 포트로 바꾸고, 설정되지 않았다면 이 방법을 중단합니다. 서비스를 공개하거나 인증을 끄지 마세요.

같은 로그인된 브라우저에서 http://127.0.0.1:8080/api/v2/torrents/info 를 열고 대상 이름의 hash 필드를 복사합니다. 이름이 같으면 올바른 기록인지 확인합니다. 다음으로 http://127.0.0.1:8080/api/v2/torrents/files?hash=YOUR_HASH 에서 YOUR_HASH를 정확한 값으로 바꿔 여세요. 로그인과 같은 호스트·포트를 쓰고 indexes를 넣어 일부로 제한하지 않습니다.

전체 JSON 응답을 files.json으로 로컬 저장하거나 전체 원시 응답을 UTF-8 일반 텍스트 파일로 복사합니다. 파일 객체 배열이어야 하며 로그인 페이지, HTML 뷰어 마크업이나 토렌트 요약 배열은 아닙니다. 토렌트 식별 정보와 수집 시각은 따로 적으세요. 빈 배열은 메타데이터가 아직 없다는 뜻일 수 있고 대상 없음·인증 실패는 유효한 빈 목록이 아닙니다.

저장된 파일 기록 변환하기

Python 3가 설치되어 있다면 해당 폴더에서 터미널을 엽니다. Windows에서는 python3 대신 py -3를 사용합니다. 곧은 따옴표를 유지한 한 줄로 명령을 복사하고 새 CSV 이름을 선택하세요. Python의 -O 옵션은 쓰지 않습니다. 검증은 출력을 열기 전에 끝나며 배타적 생성으로 기존 출력을 거부합니다.

python3 -c "import csv,json,math,sys; r=json.load(open(sys.argv[1],encoding='utf-8-sig')); ok=lambda b:isinstance(b,dict) and type(b.get('index')) is int and b['index']>=0 and isinstance(b.get('name'),str) and type(b.get('size')) is int and b['size']>=0 and type(b.get('progress')) in (int,float) and math.isfinite(b['progress']) and 0<=b['progress']<=1 and type(b.get('priority')) is int and b['priority'] in (0,1,6,7); assert isinstance(r,list) and r and all(ok(b) for b in r) and len({b['index'] for b in r})==len(r), 'Expected nonempty unfiltered files array with unique indexes'; f=open(sys.argv[2],'x',encoding='utf-8-sig',newline=''); w=csv.writer(f); w.writerow(['index','name','size_bytes','progress_fraction','priority']); w.writerows([[b[k] for k in ('index','name','size','progress','priority')] for b in r]); f.close(); print(len(r),'file records exported')" "files.json" "content-files.csv"

다섯 열은 index, name, size_bytes, progress_fraction, priority입니다. index는 원래 파일 인덱스이며 새 행 번호가 아니므로 정렬 후 다시 번호를 매기지 않습니다. name에는 상대 경로가 포함됩니다. 진행0.25는25%이지0.25%가 아닙니다. 우선순위0은 다운로드 안 함,1은 보통,6은 높음,7은 최고입니다. 제외 파일,0바이트와 같은 기본 파일 이름까지 모든 반환 기록을 남깁니다.

텍스트로 가져와 기록 비교하기

LibreOffice Calc에서 파일 > 열기와 텍스트 CSV를 선택하고 UTF-8, 쉼표 구분 및 곧은 큰따옴표 문자열 구분을 설정합니다. 구분자 병합, 공백 제거, 수식 평가를 끄고 미리 보기의 다섯 열을 모두 텍스트로 지정하세요. 창이 생략되면 열 때 필터 설정 편집을 켭니다. =로 시작하는 파일 이름도 수식 대신 원문으로 남습니다.

출력된 수를 머리글 제외 CSV 데이터 행 수와 비교합니다. 따옴표 안 파일명에 줄바꿈이 있을 수 있어 물리적 텍스트 줄 수는 기록 수가 아닙니다. 필터를 지운 Content 보기와 여러 전체 상대 경로·원래 인덱스를 대조하고 제외 항목도 확인하세요. 그림의 인덱스0과1은 가상 예입니다. 인덱스0은 첫 파일이며 CSV 머리글이나 새 표의 행 번호가 아닙니다. 정렬·필터 작업 전에 변경하지 않은 마스터 CSV를 보관하세요.

오류와 범위 이해하기

검증 오류는 빈 입력, 잘못된 형식, 중복 인덱스, 필요한 이름·크기·진행·우선순위의 누락이나 부적합을 뜻합니다. 정확한 files 응답과 메타데이터 준비를 확인하고 검증을 지워 강제로 출력하지 마세요. 기존 대상 오류에는 새 이름을 선택합니다. 디스크·쓰기 오류는 부분 CSV를 남길 수 있으니 정상 재실행과 파싱된 행 수 확인 전에는 쓰지 않습니다.

이는 수집 시점의 클라이언트 메타데이터로, 실제 파일 존재, 바이트 무결성, 피어 가용성 또는 복원 가능한 재개 백업을 증명하지 않습니다. 항목·진행은 이후 바뀔 수 있고 상대 이름은 독립적인 절대 디스크 경로가 아닙니다. 유니코드, 쉼표, 따옴표, 여러 줄 이름, 비연속 인덱스, 중복,0값, 잘못된 입력과 덮어쓰기 거부를 포함한13개 합성 검사를 실제 실행했습니다. 실제 qBittorrent나 브라우저·Calc 화면은 시험하지 않았습니다. JSON과 수집 메모를 보관하고 공개하려는 메타데이터만 공유하세요.

두 원래 인덱스와 우선순위0이 CSV에 남는 원본 일러스트
원본 일러스트: 가상 인덱스0과 1은 변경하지 않으며 제외 항목도 남깁니다. Watch at Ease