From f0f5371a945f20b24900d0a8c17d4cf4c3ba324f Mon Sep 17 00:00:00 2001 From: Manuel Hiebel Date: Fri, 7 Dec 2018 19:59:01 +0100 Subject: generated automatically magnet with one tracker --- lib/FIDD.php | 40 ++++++---- lib/magnet.php | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 lib/magnet.php diff --git a/lib/FIDD.php b/lib/FIDD.php index d2a1e5e..d15ab35 100644 --- a/lib/FIDD.php +++ b/lib/FIDD.php @@ -10,6 +10,7 @@ include 'lib/lib.php'; include 'lib/fabpot-yaml/lib/sfYaml.php'; +include 'lib/magnet.php'; /** */ @@ -133,10 +134,12 @@ class FIDD $isos = glob($dir . '/*'); foreach ($isos as $isodir) { + $data = array(); $files = glob($isodir . '/*.*'); foreach ($files as $f) { + $fi = pathinfo($f); $ext = $fi['extension']; @@ -146,30 +149,41 @@ class FIDD $key = str_replace('.iso.md5', '.iso', basename($f)); $data['file'] = $key; $data['md5'] = self::get_checksum_value($f); - $md5gpg = str_replace('.iso.md5', '.md5.gpg', basename($f)); - $data['md5.gpg'] = $md5gpg; - - break; - case 'sha1': - $data['sha1'] = self::get_checksum_value($f); - $sha1gpg = str_replace('.iso.sha1', '.sha1.gpg', basename($f)); - $data['sha1.gpg'] = $sha1gpg; - - break; - case 'sha512': $data['sha512'] = self::get_checksum_value($f); break; - case 'langs': $data['langs'] = implode(', ', explode("\n", trim(file_get_contents($f)))); break; + $md5gpg = str_replace('.iso.md5', '.md5.gpg', basename($f)); + $data['md5.gpg'] = $md5gpg; + break; + case 'sha1': + $data['sha1'] = self::get_checksum_value($f); + $sha1gpg = str_replace('.iso.sha1', '.sha1.gpg', basename($f)); + $data['sha1.gpg'] = $sha1gpg; + break; + case 'sha512': + $data['sha512'] = self::get_checksum_value($f); + $sha512gpg = str_replace('.iso.sha512', '.sha512.gpg', basename($f)); + $data['sha512.gpg'] = $sha512gpg; + break; + case 'langs': $data['langs'] = implode(', ', explode("\n", trim(file_get_contents($f)))); + break; + } } + if (null !== ($ret = self::is_correct_name($data['file']))) { $data['path'] = sprintf('%s/%s', $ret['release'] == '' ? sprintf('iso/%s', $ret['version']) : 'iso/cauldron', str_replace('.iso', '', $data['file']) ); + $torrentfile = str_replace('.iso', '.torrent', $data['file']); $data['torrent'] = sprintf('%s/%s', $ret['release'] == '' ? sprintf('iso/%s/torrents', $ret['version']) : 'iso/cauldron/torrents', - str_replace('.iso', '.torrent', $data['file']) + $torrentfile ); + $torrentfile = "var/tmp/torrents/".$torrentfile; + $data['magnet'] = sprintf('%s&dn=%s&tr=%s', + magnet($torrentfile), + str_replace('.iso', '', $data['file']), + 'udp%3A%2F%2Ftracker.torrent.eu.org%3A451'); $data['name'] = str_replace(array('-', '.iso', 'i586', 'x86_64'), array(' ', '', '32bit', '64bit'), $data['file']); $data['size'] = $filesizes[$data['file']]; diff --git a/lib/magnet.php b/lib/magnet.php new file mode 100644 index 0000000..b226f0e --- /dev/null +++ b/lib/magnet.php @@ -0,0 +1,226 @@ + magnet + + +function magnet($file){ + if(is_file($file)){ + $info=file_get_contents($file); + $desc = BDecode($info); + $info = $desc['info']; + $b_tr=BEncode($info); + $hash = sha1($b_tr);//ADD + $uri="magnet:?xt=urn:btih:".$hash; + return $uri; + } +} +//BDecode +class BDecode { + function numberdecode($wholefile, $offset) { + // Funky handling of negative numbers and zero + $negative = false; + if ($wholefile[$offset] == '-') { + $negative = true; + $offset++; + } + if ($wholefile[$offset] == '0') { + $offset++; + if ($negative) + return array(false); + if ($wholefile[$offset] == ':' || $wholefile[$offset] == 'e') + return array(0, ++$offset); + return array(false); + } + $ret[0] = 0; + for(;;) { + if ($wholefile[$offset] >= '0' && $wholefile[$offset] <= '9') { + $ret[0] *= 10; + //Added 2005.02.21 - VisiGod + //Changing the type of variable from integer to double to prevent a numeric overflow + settype($ret[0],'double'); + //Added 2005.02.21 - VisiGod + $ret[0] += ord($wholefile[$offset]) - ord('0'); + $offset++; + } else if ($wholefile[$offset] == 'e' || $wholefile[$offset] == ':') { + // Tolerate : or e because this is a multiuse function + $ret[1] = $offset+1; + if ($negative) { + if ($ret[0] == 0) + return array(false); + $ret[0] = - $ret[0]; + } + return $ret; + } else return array(false); + } + } + + function decodeEntry($wholefile, $offset=0) { + if ($wholefile[$offset] == 'd') + return $this->decodeDict($wholefile, $offset); + if ($wholefile[$offset] == 'l') + return $this->decodelist($wholefile, $offset); + if ($wholefile[$offset] == 'i') + return $this->numberdecode($wholefile, ++$offset); + // String value: decode number, then grab substring + + $info = $this->numberdecode($wholefile, $offset); + if ($info[0] === false) + return array(false); + $ret[0] = substr($wholefile, $info[1], $info[0]); + $ret[1] = $info[1]+strlen($ret[0]); + return $ret; + } + + function decodeList($wholefile, $offset) { + if ($wholefile[$offset] != 'l') + return array(false); + $offset++; + $ret = array(); + for ($i=0;;$i++) { + if ($wholefile[$offset] == 'e') + break; + $value = $this->decodeEntry($wholefile, $offset); + if ($value[0] === false) + return array(false); + $ret[$i] = $value[0]; + $offset = $value[1]; + } + // The empty list is an empty array. Seems fine. + return array(0=>$ret, 1=>++$offset); + } + + // Tries to construct an array + function decodeDict($wholefile, $offset=0) { + if ($wholefile[$offset] == 'l') + return $this->decodeList($wholefile, $offset); + if ($wholefile[$offset] != 'd') + return false; + $ret=array(); + $offset++; + for (;;) { + if ($wholefile[$offset] == 'e') { + $offset++; + break; + } + $left = $this->decodeEntry($wholefile, $offset); + if (!$left[0]) + return false; + $offset = $left[1]; + if ($wholefile[$offset] == 'd') { + // Recurse + $value = $this->decodedict($wholefile, $offset); + if (!$value[0]) + return false; + $ret[addslashes($left[0])] = $value[0]; + $offset= $value[1]; + continue; + } + if ($wholefile[$offset] == 'l') { + $value = $this->decodeList($wholefile, $offset); + if (!$value[0] && is_bool($value[0])) + return false; + $ret[addslashes($left[0])] = $value[0]; + $offset = $value[1]; + continue; + } + $value = $this->decodeEntry($wholefile, $offset); + if ($value[0] === false) + return false; + $ret[addslashes($left[0])] = $value[0]; + $offset = $value[1]; + } + return array(0=>(empty($ret)?true:$ret), 1=>$offset); + } +} + +function BDecode($wholefile) { + $decoder = new BDecode; + $return = $decoder->decodeEntry($wholefile); + return $return[0]; +} +//BEncode + +class BEncode { + // Dictionary keys must be sorted. foreach tends to iterate over the order + // the array was made, so we make a new one in sorted order. :) + function makeSorted($array) { + // Shouldn't happen! + if (empty($array)) + return $array; + $i = 0; + foreach($array as $key => $dummy) + $keys[$i++] = stripslashes($key); + sort($keys); + for ($i=0; isset($keys[$i]); $i++) + $return[addslashes($keys[$i])] = $array[addslashes($keys[$i])]; + return $return; + } + + // Encodes strings, integers and empty dictionaries. + // $unstrip is set to true when decoding dictionary keys + function encodeEntry($entry, &$fd, $unstrip = false) { + if (is_bool($entry)) { + $fd .= 'de'; + return; + } + if (is_int($entry) || is_float($entry)) { + $fd .= 'i'.$entry.'e'; + return; + } + if ($unstrip) + $myentry = stripslashes($entry); + else + $myentry = $entry; + $length = strlen($myentry); + $fd .= $length.':'.$myentry; + } + + // Encodes lists + function encodeList($array, &$fd) { + $fd .= 'l'; + // The empty list is defined as array(); + if (empty($array)) { + $fd .= 'e'; + return; + } + for ($i = 0; isset($array[$i]); $i++) + $this->decideEncode($array[$i], $fd); + $fd .= 'e'; + } + + // Passes lists and dictionaries accordingly, and has encodeEntry handle + // the strings and integers. + function decideEncode($unknown, &$fd) { + if (is_array($unknown)) { + if (isset($unknown[0]) || empty($unknown)) + return $this->encodeList($unknown, $fd); + else + return $this->encodeDict($unknown, $fd); + } + $this->encodeEntry($unknown, $fd); + } + + // Encodes dictionaries + function encodeDict($array, &$fd) { + $fd .= 'd'; + if (is_bool($array)) { + $fd .= 'e'; + return; + } + // NEED TO SORT! + $newarray = $this->makeSorted($array); + foreach($newarray as $left => $right) { + $this->encodeEntry($left, $fd, true); + $this->decideEncode($right, $fd); + } + $fd .= 'e'; + } +} + +function BEncode($array) { + $string = ''; + $encoder = new BEncode; + $encoder->decideEncode($array, $string); + return $string; +} +//BEncode -- cgit v1.2.1