| 44 | | * Path to the file or directory to create the |
| 45 | | * torrent from. |
| 46 | | * |
| 47 | | * @var string |
| 48 | | */ |
| 49 | | var $path = ''; |
| 50 | | |
| 51 | | /** |
| 52 | | * Whether or not $path is a file |
| 53 | | * |
| 54 | | * @var bool |
| 55 | | */ |
| 56 | | var $_isFile = false; |
| 57 | | |
| 58 | | /** |
| 59 | | * Where or not $path is a directory |
| 60 | | * |
| 61 | | * @var bool |
| 62 | | */ |
| 63 | | var $_isDir = false; |
| 64 | | |
| 65 | | /** |
| 66 | | * The .torrent info dictionary |
| 67 | | * |
| 68 | | * @var array |
| 69 | | */ |
| 70 | | var $info = array(); |
| 71 | | |
| 72 | | /** |
| 73 | | * The .torrent announce URL |
| 74 | | * |
| 75 | | * @var string |
| 76 | | */ |
| 77 | | var $announce = ''; |
| 78 | | |
| 79 | | /** |
| 80 | | * The .torrent announce_list extension |
| 81 | | * |
| 82 | | * @var array |
| 83 | | */ |
| 84 | | var $announce_list = array(); |
| 85 | | |
| 86 | | /** |
| 87 | | * The .torrent creation timestamp |
| 88 | | * |
| 89 | | * @var int |
| 90 | | */ |
| 91 | | var $creation_date = 0; |
| 92 | | |
| 93 | | /** |
| 94 | | * The .torrent comment |
| 95 | | * |
| 96 | | * @var string |
| 97 | | */ |
| 98 | | var $comment = ''; |
| 99 | | |
| 100 | | /** |
| 101 | | * The .torrent created by string |
| 102 | | * |
| 103 | | * @var string |
| 104 | | */ |
| 105 | | var $created_by = 'File_Bittorrent_MakeTorrent $Rev$'; |
| 106 | | |
| 107 | | /** |
| 108 | | * The .torrent suggested name (file/dir) |
| 109 | | * |
| 110 | | * @var string |
| 111 | | */ |
| 112 | | var $name = ''; |
| 113 | | |
| 114 | | /** |
| 115 | | * The .torrent packed piece data |
| 116 | | * |
| 117 | | * @var string |
| 118 | | */ |
| 119 | | var $pieces = ''; |
| 120 | | |
| 121 | | /** |
| 122 | | * The .torrent piece length |
| 123 | | * The size of each piece in bytes. |
| 124 | | * |
| 125 | | * @var int |
| 126 | | */ |
| 127 | | var $piece_length = 524288; |
| 128 | | |
| 129 | | /** |
| 130 | | * The list of files (if this is |
| 131 | | * a multi-file torrent) |
| 132 | | * |
| 133 | | * @var array |
| 134 | | */ |
| 135 | | var $files = array(); |
| 136 | | |
| 137 | | /** |
| 138 | | * The data gap used to join two |
| 139 | | * files into the same piece |
| 140 | | * |
| 141 | | * @var mixed string if it contains data or boolean false |
| 142 | | */ |
| 143 | | var $data_gap = false; |
| | 57 | * @var string Path to the file or directory to create the torrent from. |
| | 58 | * @access private |
| | 59 | */ |
| | 60 | var $_path = ''; |
| | 61 | |
| | 62 | /** |
| | 63 | * @var bool Whether or not $path is a file |
| | 64 | * @access private |
| | 65 | */ |
| | 66 | var $_is_file = false; |
| | 67 | |
| | 68 | /** |
| | 69 | * @var bool Where or not $path is a directory |
| | 70 | */ |
| | 71 | var $_is_dir = false; |
| | 72 | |
| | 73 | /** |
| | 74 | * @var string The .torrent announce URL |
| | 75 | * @access private |
| | 76 | */ |
| | 77 | var $_announce = ''; |
| | 78 | |
| | 79 | /** |
| | 80 | * @var array The .torrent announce_list extension |
| | 81 | * @access private |
| | 82 | */ |
| | 83 | var $_announce_list = array(); |
| | 84 | |
| | 85 | /** |
| | 86 | * @var string The .torrent comment |
| | 87 | * @access private |
| | 88 | */ |
| | 89 | var $_comment = ''; |
| | 90 | |
| | 91 | /** |
| | 92 | * @var string The .torrent created by string |
| | 93 | * @access private |
| | 94 | */ |
| | 95 | var $_created_by = 'File_Bittorrent_MakeTorrent $Rev$. http://pear.php.net/package/File_Bittorrent'; |
| | 96 | |
| | 97 | /** |
| | 98 | * @var string The .torrent suggested name (file/dir) |
| | 99 | * @access private |
| | 100 | */ |
| | 101 | var $_name = ''; |
| | 102 | |
| | 103 | /** |
| | 104 | * @var string The .torrent packed piece data |
| | 105 | * @access private |
| | 106 | */ |
| | 107 | var $_pieces = ''; |
| | 108 | |
| | 109 | /** |
| | 110 | * @var int The size of each piece in bytes. |
| | 111 | * @access private |
| | 112 | */ |
| | 113 | var $_piece_length = 524288; |
| | 114 | |
| | 115 | /** |
| | 116 | * @var array The list of files (if this is a multi-file torrent) |
| | 117 | * @access private |
| | 118 | */ |
| | 119 | var $_files = array(); |
| | 120 | |
| | 121 | /** |
| | 122 | * @var string|false The data gap used to join two files into the same piece. string if it contains data or false |
| | 123 | * @access private |
| | 124 | */ |
| | 125 | var $_data_gap = false; |
| | 126 | |
| | 127 | /** |
| | 128 | * @var resource file pointer |
| | 129 | * @access private |
| | 130 | */ |
| | 131 | var $_fp; |
| 274 | | if ($this->_isFile) { |
| 275 | | $info = $this->_addFile($this->path); |
| 276 | | if ($info !== false) { |
| 277 | | $metainfo = $this->_encodeTorrent($info); |
| 278 | | return $metainfo; |
| 279 | | } |
| 280 | | } else if ($this->_isDir) { |
| 281 | | $diradd_ok = $this->_addDir($this->path); |
| 282 | | if ($diradd_ok !== false) { |
| 283 | | $metainfo = $this->_encodeTorrent(); |
| 284 | | return $metainfo; |
| 285 | | } |
| 286 | | } else { |
| 287 | | return false; |
| 288 | | } |
| | 239 | if ($this->_is_file) { |
| | 240 | if (!$info = $this->_addFile($this->_path)) { |
| | 241 | return false; |
| | 242 | } |
| | 243 | if (!$metainfo = $this->_encodeTorrent($info)) { |
| | 244 | return false; |
| | 245 | } |
| | 246 | } else if ($this->_is_dir) { |
| | 247 | if (!$diradd_ok = $this->_addDir($this->_path)) { |
| | 248 | return false; |
| | 249 | } |
| | 250 | $metainfo = $this->_encodeTorrent(); |
| | 251 | } |
| | 252 | return $metainfo; |
| 309 | | } else if ($this->_isDir) { |
| 310 | | if ($this->data_gap !== false) { |
| 311 | | $this->pieces .= pack('H*', sha1($this->data_gap)); |
| 312 | | $this->data_gap = false; |
| 313 | | } |
| 314 | | $bencdata['info']['files'] = $this->files; |
| | 270 | } else if ($this->_is_dir) { |
| | 271 | if ($this->_data_gap !== false) { |
| | 272 | $this->_pieces .= pack('H*', sha1($this->_data_gap)); |
| | 273 | $this->_data_gap = false; |
| | 274 | } |
| | 275 | $bencdata['info']['files'] = $this->_files; |
| 318 | | $bencdata['info']['name'] = $this->name; |
| 319 | | $bencdata['info']['piece length'] = $this->piece_length; |
| 320 | | $bencdata['info']['pieces'] = $this->pieces; |
| 321 | | $bencdata['announce'] = $this->announce; |
| 322 | | //$bencdata['announce-list'] = array($this->announce) |
| 323 | | $bencdata['creation date'] = time(); |
| 324 | | $bencdata['comment'] = $this->comment; |
| 325 | | $bencdata['created by'] = $this->created_by; |
| 326 | | return $benc->encode_array($bencdata); |
| | 280 | $bencdata['info']['name'] = $this->_name; |
| | 281 | $bencdata['info']['piece length'] = $this->_piece_length; |
| | 282 | $bencdata['info']['pieces'] = $this->_pieces; |
| | 283 | $bencdata['announce'] = $this->_announce; |
| | 284 | $bencdata['creation date'] = time(); |
| | 285 | $bencdata['comment'] = $this->_comment; |
| | 286 | $bencdata['created by'] = $this->_created_by; |
| | 287 | // $bencdata['announce-list'] = array($this->_announce) |
| | 288 | // Encode it |
| | 289 | $Encoder = new File_Bittorrent_Encode; |
| | 290 | return $Encoder->encode_array($bencdata); |
| 339 | | $fp = &File_Bittorrent_MakeTorrent::_openfile($file); |
| 340 | | if ($fp) { |
| 341 | | $filelength = 0; |
| 342 | | $md5sum = md5_file($file); |
| 343 | | $piece_length = $this->piece_length; |
| 344 | | |
| 345 | | while (!feof($fp)) { |
| 346 | | $data = ''; |
| 347 | | $datalength = 0; |
| 348 | | |
| 349 | | if ($this->_isDir && $this->data_gap !== false) { |
| 350 | | $data = $this->data_gap; |
| 351 | | $datalength = strlen($data); |
| 352 | | $this->data_gap = false; |
| | 303 | if (!$this->_openFile($file)) return false; |
| | 304 | |
| | 305 | $filelength = 0; |
| | 306 | $md5sum = md5_file($file); |
| | 307 | |
| | 308 | while (!feof($this->_fp)) { |
| | 309 | $data = ''; |
| | 310 | $datalength = 0; |
| | 311 | |
| | 312 | if ($this->_is_dir && $this->_data_gap !== false) { |
| | 313 | $data = $this->_data_gap; |
| | 314 | $datalength = strlen($data); |
| | 315 | $this->_data_gap = false; |
| | 316 | } |
| | 317 | |
| | 318 | while (!feof($this->_fp) && ($datalength < $this->_piece_length)) { |
| | 319 | $readlength = 8192; |
| | 320 | if (($datalength + 8192) > $this->_piece_length) { |
| | 321 | $readlength = $this->_piece_length - $datalength; |
| 355 | | while ( !feof($fp) && ($datalength < $piece_length) ) { |
| 356 | | $readlength = 8192; |
| 357 | | if ( ($datalength + 8192) > $piece_length ) { |
| 358 | | $readlength = $piece_length - $datalength; |
| 359 | | } |
| 360 | | |
| 361 | | $tmpdata = fread($fp, $readlength); |
| 362 | | $actual_readlength = strlen($tmpdata); |
| 363 | | $datalength += $actual_readlength; |
| 364 | | $filelength += $actual_readlength; |
| 365 | | |
| 366 | | $data .= $tmpdata; |
| 367 | | |
| 368 | | flush(); |
| | 324 | $tmpdata = fread($this->_fp, $readlength); |
| | 325 | $actual_readlength = strlen($tmpdata); |
| | 326 | $datalength += $actual_readlength; |
| | 327 | $filelength += $actual_readlength; |
| | 328 | |
| | 329 | $data .= $tmpdata; |
| | 330 | |
| | 331 | flush(); |
| | 332 | } |
| | 333 | |
| | 334 | // We've either reached the end of the file, or |
| | 335 | // we have a whole piece, or both. |
| | 336 | if ($datalength == $this->_piece_length) { |
| | 337 | // We have a piece. |
| | 338 | $this->_pieces .= pack('H*', sha1($data)); |
| | 339 | } |
| | 340 | if (($datalength != $this->_piece_length) && feof($this->_fp)) { |
| | 341 | // We've reached the end of the file, and |
| | 342 | // we dont have a whole piece. |
| | 343 | if ($this->_is_dir) { |
| | 344 | $this->_data_gap = $data; |
| | 345 | } else { |
| | 346 | $this->_pieces .= pack('H*', sha1($data)); |
| 370 | | |
| 371 | | /* We've either reached the end of the file, or |
| 372 | | * we have a whole piece, or |
| 373 | | * both. |
| 374 | | */ |
| 375 | | if ($datalength == $piece_length) { |
| 376 | | // We have a piece. |
| 377 | | $this->pieces .= pack('H*', sha1($data)); |
| 378 | | } |
| 379 | | if ( ($datalength != $piece_length) && feof($fp) ) { |
| 380 | | // We've reached the end of the file, and |
| 381 | | // we dont have a whole piece. |
| 382 | | if ($this->_isDir) { |
| 383 | | $this->data_gap = $data; |
| 384 | | } else { |
| 385 | | $this->pieces .= pack('H*', sha1($data)); |
| 386 | | } |
| 387 | | } |
| 388 | | } |
| 389 | | // Close the file pointer. |
| 390 | | File_Bittorrent_MakeTorrent::_closefile($fp); |
| 391 | | $info = array( |
| 392 | | 'length' => $filelength, |
| 393 | | 'md5sum' => $md5sum |
| 394 | | ); |
| 395 | | return $info; |
| 396 | | } |
| 397 | | return false; |
| | 348 | } |
| | 349 | } |
| | 350 | |
| | 351 | // Close the file pointer. |
| | 352 | $this->_closeFile(); |
| | 353 | $info = array( |
| | 354 | 'length' => $filelength, |
| | 355 | 'md5sum' => $md5sum |
| | 356 | ); |
| | 357 | return $info; |
| 448 | | if ($file !== '.' && $file !== '..') { |
| 449 | | $current_file = $current_dir . '/' . $file; |
| 450 | | |
| 451 | | if ( is_file($current_file) ) { |
| 452 | | $file_list[] = $current_dir . '/' . $file; |
| 453 | | } else if ( is_dir($current_file) ) { |
| 454 | | $stack[] = $current_file; |
| 455 | | } |
| | 408 | if ($file{0} =='.') continue; |
| | 409 | $current_file = $current_dir . '/' . $file; |
| | 410 | if (is_file($current_file)) { |
| | 411 | $file_list[] = $current_dir . '/' . $file; |
| | 412 | } else if (is_dir($current_file)) { |
| | 413 | $stack[] = $current_file; |