Rex Posted April 30, 2016 Posted April 30, 2016 (edited) A friend of mine asked if I could make a torrent maker for him, and I thought that could be a nice challenge. I searched the forum and found that monoceres had created on for single files, I wrote and asked If I could get the source and monoceres was so kind to provide it But it was only for single files, and I want to create one for both single and multiply files, also I would try to make it in native AutoIT, so I changed the code as below. For a single file the script works fine, but for multiply files in a folder, I ran into a problem. It's seems that my hash file function fails when creating for multiply files, and I can't really get my head around on what seems to be the problem. Also It seems that when creating a torrent in utorrent, the files is sorted alphabetic by extension and not the filename it self, but the filelisttoarray sorts them by filename, and couldn't find a way to make it sort by ext. Here is my test code, it ugly and poor written but it works for most parts. expandcollapse popup#include <crypt.au3> #include <array.au3> #include <file.au3> Global $Progress1 $FolderPath = 'C:\Test\' $aFolderContents = _FileListToArray('C:\Test') ; Gives a list of files/folders inside a folder $outfile = 'C:\TestOUT.torrent' $sizeofpiece = 64 ; Fixed size for now $sizeofpiece *= 1024 $write = FileOpen($outfile, 1) $sAnnounce = 'd8:announce' $sAnounceUrl = '19:http://announce.com' $sComment = '7:comment' $sCommentString = '17:This is a comment' $sCreatedBy = '10:created by' $sCreatedBYString = '13:uTorrent/2210' $sCreationDate = '13:creation date' $sDate = 'i1461781110e' $sEncoding = '8:encoding' $sEncodingType = '5:UTF-8' $sInfo = '4:info' $sFiles = 'd5:files' $slistDir = 'l' ; Dir start $sFileLength = 'd6:length' $sFile1 = 'i' & FileGetSize($FolderPath & $aFolderContents[2]) & 'e' $sFilePath = '4:pathl' $sFile1Name = StringLen($aFolderContents[2]) & ':' & $aFolderContents[2] & 'ee' $sFile2 = 'i' & FileGetSize($FolderPath & $aFolderContents[3]) & 'e' $sFile2Name = StringLen($aFolderContents[3]) & ':' & $aFolderContents[3] & 'ee' $sFile3 = 'i' & FileGetSize($FolderPath & $aFolderContents[1]) & 'e' $sFile3Name = StringLen($aFolderContents[1]) & ':' & $aFolderContents[1] & 'ee' $EndList = 'e' $sPices = '12:piece lengthi' & $sizeofpiece & 'e' $sPicesCount = '6:pieces' & _GetPiecesCount(DirGetSize('C:\Test'), $sizeofpiece) & ':' FileWrite($write, $sAnnounce & $sAnounceUrl & $sComment & $sCommentString & $sCreatedBy & $sCreatedBYString & $sCreationDate & $sDate & $sEncoding & _ $sEncodingType & $sInfo & $sFiles & $slistDir & $sFileLength & $sFile1 & $sFilePath & $sFile1Name & $sFileLength & $sFile2 & $sFilePath & $sFile2Name & _ $sFileLength & $sFile3 & $sFilePath & $sFile3Name & $EndList & '4:name' & StringLen(StringTrimLeft(StringTrimRight($FolderPath, 1), 3)) & ':' & StringTrimLeft(StringTrimRight($FolderPath, 1), 3) & $sPices & $sPicesCount) FileClose($write) Sleep(500) ; Loop thru the files to create HASH.. ; Hmm seems that the torrent is sorted by extension in alphab order, and not in plain aplhab order. ;~ For $i = 1 to UBound($aFolderContents) -1 ;~ $sfileHash = _WriteHashFilePieces($FolderPath & $aFolderContents[$i], $sizeofpiece, $outfile) ;~ ConsoleWrite(@CRLF & $i & ' = ' & $aFolderContents[$i] & @CRLF) ;~ Next #region ### START Koda GUI section ### Form= $Form1 = GUICreate("Creating Torrent file", 416, 75, -1, -1) $Progress1 = GUICtrlCreateProgress(16, 8, 300, 33) $Label10 = GUICtrlCreateLabel("Hashing data...:", 326, 16, 90, 20) GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif") GUISetState(@SW_SHOW) #endregion ### START Koda GUI section ### Form GUISetState(@SW_HIDE) $outfileEnd = FileOpen($outfile, 17) FileWrite($outfileEnd, _WriteHashFilePieces($FolderPath & $aFolderContents[2], $sizeofpiece, $outfile)) FileWrite($outfileEnd, _WriteHashFilePieces($FolderPath & $aFolderContents[3], $sizeofpiece, $outfile)) FileWrite($outfileEnd, _WriteHashFilePieces($FolderPath & $aFolderContents[1], $sizeofpiece, $outfile)) FileWrite($outfileEnd, '7:privatei1eee') FileClose($outfileEnd) Func _GetPiecesCount($size, $psize) $return = Ceiling(($size / $psize) * 20) While Mod($return, 20) > 0 $return += 1 WEnd Return $return EndFunc ;==>_GetPiecesCount Func _WriteHashFilePieces($file, $psize, $outfile) Local $t, $ty Local $inc, $percent, $totalsize = FileGetSize($file), $oldp Local $hash Local $size = FileGetSize($file) Local $filehandle = FileOpen($file,16) If $filehandle = -1 Then MsgBox(16, "Error", "Error opening file") While 1 $tdata = FileRead($filehandle, $psize) If $tdata <> "" Then $t = _Crypt_HashData($tdata, $CALG_SHA1) $t = BinaryToString($t) $inc += $psize $percent = Round(($inc / $totalsize) * 100) If $percent <> $oldp Then GUICtrlSetData($Progress1, $percent) EndIf $oldp = $percent $ty = $ty & $t Else ExitLoop EndIf WEnd Return $ty EndFunc ;==>_WriteHashFilePieces I have created a test torrent with utorrent 2.1 from the same folder, and that's the one I use to compare my result with, also I'm trying to open the torrent with a Torrent editor. But as far I can see, it's the last file in my folder where the script fails the HASH creation. My test folder contains 3 files, a txt, an exe and a nfo file, all of them is a txt file with changed ext. Could some one help by point me in the right direction with the hash problem Cheers /Rex Edited April 30, 2016 by Rex
Rex Posted May 3, 2016 Author Posted May 3, 2016 Is there no one who could help me with this ? Cheers /Rex
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now