MEMO‎ > ‎

seedbox

개인용으로 토렌트 시드 정리하는 웹사이트가 있으며 좋겠다. 시드 파일을 올리면 그 시드가 보유한 파일 정보를 해석해서 같이 보여주고, 실제로 필요할 때는 마그넷 주소를 긁거나 파일을 다시 받거나 할 수 있게. 모든 시드를 다 보유하기에는 하드가 모자라기 십상이다 보니. 게다가 어둠의 경로가 많은 특성상 시드를 쉽게 못 찾는 경우가 많아서...

되어야 하는 건 1) 시드 파일 업로드 하면 추가, 정리해서 보여주기 2) 마그넷 링크 추가도 동일하게 처리 2-1) 마그넷은 분석할 대상이 바로 생기는 게 아니니까 마그넷으로 내용이 받아질 때까지 시도하는 큐 3) 시드 분석하기 위한 libtorrent 정도의 해석기 4) 정리된 자료를 불러와서 표시 5) 원본 파일 다시 제공 6) 파일이 있거나 없거나 마그넷 링크 제공
시중에 있는 시드 배포 사이트들은 다 이런 게 되지 않을까나?

http://en.wikipedia.org/wiki/Torrent_file 파일 형식 참조.
특정 해시값을 참조할 수 있을까 싶었는데 pieces라는 게 160비트의 배수만큼 길이를 가진다고 하니 일정한 값은 아니란 얘기.
Merkle trees에서는 pieces 자체는 없고 최상위 값만 가지고 있는다고 하는데 이 경우는 사용하기 적합하지만 모든 시드가 이 규약을 만족하지는 않겠지.
http://www.bittorrent.org/beps/bep_0003.html info_hash 값을 쓰면 되겠다. 트래커가 구분하는데 쓰는 거면 유일값으로 써도 되는 거겠지.

libtorrent에 정보를 해석하기만 한다는 동작은 따로 노출된 건 없는 것 같고, libtorrent에서 세션을 시작하고, 그 세션에 토런트를 등록하고, 등록된 torrent_handle에서 info_hash()를 확인할 수 있는 형태다.
add와 동시에 다운로드 상태로 진입하지 않도록 해야 한다. 정보 확인까지만 할 수 있도록. 파일이 잠깐 생겼다 없어지는 것도 곤란하다. 생성과 동시에 용량은 그만큼 먹어버리는 거니까. 불필요하게 IO가 발생할 필요도 없고.
https://github.com/danfolkes/Magnet2Torrent/blob/master/Magnet_To_Torrent2.py 기본적인 흐름을 참조할 수 있겠다. 자잘한 세팅은 안 들어가 있지만.
add_magnet_uri() 호출시에 params에 paused True를 주면 파일을 받지 않고, info_hash() 반환은 된다.
http://www.rasterbar.com/products/libtorrent/manual.html#async-add-torrent-add-torrent 에 의하면 save_path가 반드시 지정되어야 한다. 글로벌하게 쓸 임시 경로가 하나 있어야 하겠다.

magnet은 일단 두고, 파일을 처리하는 건 굳이 세션까지 안 넣고 info만 받아서 거기서 hash랑 name을 바로 뽑을 수 있는 걸 확인했다.
Django 1.3부터 모델 지울 때 파일은 안 지우기 때문에, 파일을 많이 다뤄야 한다면 필연적으로 무소속 파일이 잔뜩 생기게 된다. post_delete 시그널을 붙여서 바로 삭제되도록 했다. 왜 post_delete를 써야 하냐면, QuerySet을 통한 대량 삭제에서는 모델별 delete가 호출되지 않기 때문에 시그널을 써야 한다고.

의문 : FileField에 upload_to를 다단 디렉토리가 생기게 만들어서 주면, 나중에 그 복잡한 디렉토리까지 같이 지워주려나? 그러진 않겠지? 그럼 디렉토리 관리는 누가 해야 되는 거지?
Comments