BlueHell mIRC Script — File Browser
BlueHellmIRCScriptv1.0 / BlueHellmIRCScriptv1.0 / BlueHellScript / System / makeTorrent.mrc
makeTorrent.mrc — 12.14 KB — Download this file
; makeTorrent Torrent Creator by Scab
;
; /maketorrent
;
; TODO: Add md5sum to info dict (configurable; isn't actually part of the original standard. would also make the script a lot slower)
; Automatic piece size determination to keep metafile size low(er)
; Support for announce-list metainfo (multitracker torrents)
; Support for making trackerless torrents
; List of last x used trackers
alias maketorrent {
dialog -m maketorrent maketorrent
}
menu menubar {
-
.&makeTorrent
..&Launch:maketorrent
..&Clear History:if ($input(Are you sure you want to clear the makeTorrent history?,ywd,makeTorrent)) { unset %maketorrent_last* %maketorrent_fullsize %maketorrent_lastpc | echo -esa * Cleared makeTorrent history. }
..-
..&Uninstall:if ($input(Are you sure you want to uninstall makeTorrent?,ywd,makeTorrent)) !unload -rs $qt($script)
}
on *:load:{
echo -esa * $maketorrentversion(local) loaded successfully. A menubar popup menu has been added. You can also launch the script using the /maketorrent command.
}
on *:unload:{
unset %maketorrent_*
}
dialog maketorrent {
title "makeTorrent/0.2"
size -1 -1 188 108
option dbu
box "Source", 1, 4 2 180 36
button "Add file", 2, 102 24 37 9
button "Add folder", 3, 141 24 37 9
combo 4, 10 12 168 44, size drop
box "Torrent Properties", 5, 4 42 180 48
edit "", 6, 46 52 132 10
edit "", 7, 46 64 132 10
text "Tracker:", 8, 10 53 35 7
text "Comment:", 9, 10 66 35 7
check "Private torrent", 10, 127 79 50 8
button "Create torrent", 11, 134 94 50 11
button "Close", 12, 95 94 37 11
text "", 13, 6 96 80 8
}
on *:dialog:maketorrent:*:*:{
if ($devent == init) {
mtlast5
if (%maketorrent_lasttracker) did -a $dname 6 %maketorrent_lasttracker
if (%maketorrent_lastcomment) did -a $dname 7 %maketorrent_lastcomment
if (%maketorrent_lastprivate == 1) did -c $dname 10
}
if ($devent == sclick) {
if ($did isnum 2-3) {
if ($gettok(%maketorrent_last5,-1,124)) var %dir = $nofile($v1)
else var %dir = $left($scriptdir,3)
var %infile = $iif($did == 2,$$sfile(%dir,Select file,Open),$$sdir(%dir,Select folder))
mtlast5 %infile
}
elseif ($did == 10) set %maketorrent_lastprivate $did($did).state
elseif ($did == 11) {
var %in = $qt($did($dname,4).seltext), %tracker = $did($dname,6), %private = $iif($did($dname,10).state isnum 0-1,$v1,0), %comment = $did($dname,7)
if (%tracker) {
if ($exists(%in)) {
; unset vars if they remain from last time
unset %maketorrent_fullsize
unset %maketorrent_lastpc
; get size of file
if ($isfile(%in)) set %maketorrent_fullsize $file(%in).size
; get size of dir
elseif ($isdir(%in)) {
var %i = 1
while ($findfile(%in,*,%i)) {
dll $whilefix WhileFix .
inc %maketorrent_fullsize $file($v1).size
inc %i
}
}
; generate metainfo file
if (%maketorrent_fullsize isnum) {
_maketorrent $+(%tracker,$chr(124),%in,$chr(124),%private,$iif(%comment != $null,$+($chr(124),%comment)))
}
else !noop $input(Unexpected error.,ohd,Error)
}
else !noop $input(The source file/folder does not exist.,ohd,Error)
}
else !noop $input(You must specify a tracker.,ohd,Error)
}
elseif ($did == 12) dialog -x $dname
}
elseif ($devent == edit) {
if ($did isnum 6-7) set %maketorrent_last [ $+ [ $replace($did,6,tracker,7,comment) ] ] $did($did)
}
}
alias -l mtlast5 {
if ($1) {
set %maketorrent_last5 $addtok(%maketorrent_last5,$1-,124)
if ($numtok(%maketorrent_last5,124) > 5) set %maketorrent_last5 $deltok(%maketorrent_last5,1,124)
}
if ($dialog(maketorrent)) {
did -r maketorrent 4
var %x = $numtok(%maketorrent_last5,124)
while (%x > 0) {
dll $whilefix WhileFix .
did -a maketorrent 4 $gettok(%maketorrent_last5,%x,124)
dec %x
}
did -c maketorrent 4 1
}
}
; /_maketorrent <http://my.tracker/announce>|<c:\my.file|c:\mydir>|<private0/1>|[comment]
alias -l _maketorrent {
if ($numtok($1-,124) > 1) {
tokenize 124 $1-
var %tracker = $1, %file = $qt($2), %private = $3, %comment = $4-
if ($isfile($2)) var %type = file
elseif ($isdir($2)) var %type = dir
if (%type) {
; tracker data
var %meta = d8:announce $+ $len(%tracker) $+ : $+ %tracker
; comment
if (%comment != $null) var %meta = %meta $+ 7:comment $+ $len(%comment) $+ : $+ %comment
; creation data
var %meta = %meta $+ 10:created by $+ $len($maketorrentversion) $+ : $+ $maketorrentversion $+ 13:creation datei $+ $ctime $+ e
; encoding
; there doesn't appear to be a reliable way of determining Windows' language setting for non-unicode programs from mIRC.
var %meta = %meta $+ 8:encoding4:ANSI
; single-file torrent
if (%type == file) {
; info dict (256KB piece size)
var %lof = $lof(%file), %piecesize = 262144
var %meta = %meta $+ 4:infod6:lengthi $+ %lof $+ e4:name $+ $len($nopath(%file)) $+ : $+ $nopath(%file) $+ 12:piece lengthi $+ %piecesize $+ e
; pieces
var %x = 0
while (%x <= %lof) {
dll $whilefix WhileFix .
bread %file %x %piecesize &piece
var %hash = $sha1(&piece,1), %y = 1, %twentyb
while (%y <= $len(%hash)) {
dll $whilefix WhileFix .
var %twentyb = %twentyb $base($mid(%hash,%y,2),16,10)
inc %y 2
}
bset &twentyb 1 %twentyb
bcopy &pieces $calc(1 + $bvar(&pieces,0)) &twentyb 1 -1
bunset &twentyb
inc %x %piecesize
if ($dialog(maketorrent)) {
var %pc = $round($calc((%x / %maketorrent_fullsize)*100),0)
; avoid updating the dialog unnecessarily (mainly reduces flickering)
if (%pc != %maketorrent_lastpc) {
set %maketorrent_lastpc %pc
if (%x > %maketorrent_fullsize) var %pc = 100
else did -i maketorrent 13 1 Generating torrent file... %pc $+ %
}
}
}
bset -t &torrent 1 %meta $+ 6:pieces $+ $bvar(&pieces,0) $+ :
}
; multi-file torrent
elseif (%type == dir) {
; info dict (256KB piece size)
bset -t &torrent 1 %meta $+ 4:infod5:filesl
if ($dialog(maketorrent)) did -i maketorrent 13 1 Parsing directory structure...
var %f = 1, %fn = $findfile(%file,*,0), %piecesize = 262144
; findfile lists files before dirs. this needs to be switched around..
if ($window(@maketorrent_dirs)) window -c @maketorrent_dirs
if ($window(@maketorrent_files)) window -c @maketorrent_files
if ($window(@maketorrent)) window -c @maketorrent
window -hs @maketorrent_dirs
window -hs @maketorrent_files
window -h @maketorrent
; separate files and folders
while (%f <= %fn) {
dll $whilefix WhileFix .
var %ff = $findfile(%file,*,%f), %relativepath = $mid(%ff,$calc($len($noqt(%file)) + 1),$len(%ff))
if (\* iswm %relativepath) var %relativepath = $mid(%relativepath,2,$calc($len(%relativepath) - 1))
if (*\* iswm %relativepath) aline @maketorrent_dirs %ff
else aline @maketorrent_files %ff
inc %f
}
; add all folders to new list
var %i = 1
while (%i <= $line(@maketorrent_dirs,0)) {
dll $whilefix WhileFix .
aline @maketorrent $line(@maketorrent_dirs,%i)
inc %i
}
; add all files to new list
var %i = 1
while (%i <= $line(@maketorrent_files,0)) {
dll $whilefix WhileFix .
aline @maketorrent $line(@maketorrent_files,%i)
inc %i
}
; proceed using @maketorrent as the file list
; generate metadata for files
var %f = 1, %fn = $line(@maketorrent,0)
while (%f <= %fn) {
dll $whilefix WhileFix .
var %ff = $line(@maketorrent,%f), %path = $mid(%ff,$calc($len($noqt(%file)) + 1),$len(%ff)), %lof = $lof(%ff)
if (*\* iswm %path) {
var %tok = 1, %toks = $numtok(%path,92), %out = d6:lengthi $+ %lof $+ e4:path
while (%tok <= %toks) {
dll $whilefix WhileFix .
var %part = $gettok(%path,%tok,92)
var %out = %out $+ $iif(%tok == 1,l) $+ $len(%part) $+ : $+ %part
inc %tok
}
var %out = %out $+ ee
bset -t &torrent $calc(1 + $bvar(&torrent,0)) %out
}
else bset -t &torrent $calc(1 + $bvar(&torrent,0)) d6:lengthi $+ %lof $+ e4:pathl $+ $len(%path) $+ : $+ %path $+ ee
inc %f
}
; end info dict
bset -t &torrent $calc(1 + $bvar(&torrent,0)) e
; generate pieces
var %filenr = 1, %pos = 0, %toread = %piecesize, %totread
:read
var %filename = $qt($line(@maketorrent,%filenr))
if ($isfile(%filename)) {
bread %filename %pos %toread &read
var %read = $bvar(&read,0)
inc %totread %read
if (%read == %toread) {
if ($bvar(&piece,0) > 0) {
bcopy &piece $calc(1 + $bvar(&piece,0)) &read 1 -1
}
else bcopy &piece 1 &read 1 -1
;generate piece
:makepiece
var %hash = $sha1(&piece,1), %y = 1, %twentyb
while (%y <= $len(%hash)) {
dll $whilefix WhileFix .
var %twentyb = %twentyb $base($mid(%hash,%y,2),16,10)
inc %y 2
}
bset &twentyb 1 %twentyb
bcopy &pieces $calc(1 + $bvar(&pieces,0)) &twentyb 1 -1
bunset &twentyb
if ($dialog(maketorrent)) {
var %pc = $round($calc((%totread / %maketorrent_fullsize)*100),0)
; avoid updating the dialog unnecessarily (mainly reduces flickering)
if (%pc != %maketorrent_lastpc) {
set %maketorrent_lastpc %pc
if (%totread > %maketorrent_fullsize) var %pc = 100
else did -i maketorrent 13 1 Generating torrent file... %pc $+ %
}
}
bunset &piece
inc %pos %read
var %toread = %piecesize
goto read
}
else {
bcopy &piece $calc(1 + $bvar(&piece,0)) &read 1 -1
dec %toread %read
inc %filenr
var %pos = 0
if (%filenr > $line(@maketorrent,0)) {
goto makepiece
}
goto read
}
}
; other metadata
var %name = $gettok($noqt(%file),-1,92)
bset -t &torrent $calc(1 + $bvar(&torrent,0)) 4:name $+ $len(%name) $+ : $+ %name $+ 12:piece lengthi $+ %piecesize $+ e6:pieces $+ $bvar(&pieces,0) $+ :
}
bcopy &torrent $calc(1 + $bvar(&torrent,0)) &pieces 1 -1
if (%private == 1) bset -t &torrent $calc(1 + $bvar(&torrent,0)) 7:privatei1e
bset -t &torrent $calc(1 + $bvar(&torrent,0)) ee
var %saveas = $qt($sfile($+($iif($isdir($nofile(%file)),$nofile(%file),$left($scriptdir,3)),$iif(%name,%name,$nopath(%file)),.torrent),Save as,Save)), %isfile = $isfile(%saveas)
if ((%saveas) && (!%isfile)) || ((%saveas) && (%isfile) && ($input(File already exists. Do you want to replace it?,ywd,File exists))) {
if (%isfile) .remove %saveas
bwrite %saveas 0 &torrent
!noop $input(Successfully saved metainfo file.,oid,$maketorrentversion(local))
if ($dialog(maketorrent)) dialog -v maketorrent
}
else {
!noop $input(Aborted.,ohd,Error)
if ($dialog(maketorrent)) dialog -v maketorrent
}
}
else {
!noop $input(File/Directory not found.,ohd,Error)
if ($dialog(maketorrent)) dialog -v maketorrent
}
}
}
alias -l maketorrentversion return makeTorrent $+ $iif($1 != local,(mIRC)) $+ /0.2
alias -l whilefix return $qt($+($scriptdir,WhileFix.dll))
; EOF