如何添加类函数以在 torrent 中获取已完成的同级?

发布于 2024-10-18 07:36:25 字数 9565 浏览 7 评论 0原文

我创建了一个脚本来生成有关 torrent 文件的信息!但我缺乏创建种子和同伴显示功能!有人告诉我,它们位于 torrent 中定义的已完成字段中。请我的类函数代码,我使用 bencode.php 显示生成的信息,该代码取出数据,并且这个名为 torrent.php 的脚本将其转换为可读形式!

<?php
include_once('bencode.php');

class Torrent
{
    // Private class members
    private $torrent;
    private $info;

    // Public error message, $error is set if load() returns false
    public $error;

    // Load torrent file data
    // $data - raw torrent file contents
    public function load( &$data )
    {
        $this->torrent = BEncode::decode( $data );

        if ( $this->torrent->get_type() == 'error' )
        {
            $this->error = $this->torrent->get_plain();
            return false;
        }
        else if ( $this->torrent->get_type() != 'dictionary' )
        {
            $this->error = 'The file was not a valid torrent file.';
            return false;
        }

        $this->info = $this->torrent->get_value('info');
        if ( !$this->info )
        {
            $this->error = 'Could not find info dictionary.';
            return false;
        }

        return true;
    }

    // Get comment
    // return - string
    public function getComment() {
        return $this->torrent->get_value('comment') ? $this->torrent->get_value('comment')->get_plain() : null;
    }

    // Get creatuion date
    // return - php date
    public function getCreationDate() {
        return  $this->torrent->get_value('creation date') ? $this->torrent->get_value('creation date')->get_plain() : null;
    }

    // Get created by
    // return - string
    public function getCreatedBy() {
        return $this->torrent->get_value('created by') ? $this->torrent->get_value('created by')->get_plain() : null;
    }

    // Get name
    // return - filename (single file torrent)
    //          directory (multi-file torrent)
    // see also - getFiles()
    public function getName() {
        return $this->info->get_value('name')->get_plain();
    }

    // Get piece length
    // return - int
    public function getPieceLength() {
        return $this->info->get_value('piece length')->get_plain();
    }

    // Get pieces
    // return - raw binary of peice hashes
    public function getPieces() {
        return $this->info->get_value('pieces')->get_plain();
    }

    // Get private flag
    // return - -1 public, implicit
    //           0 public, explicit
    //           1 private
    public function getPrivate() {
        if ( $this->info->get_value('private') )
        {
            return $this->info->get_value('private')->get_plain();
        }
        return -1;
    }

    // Get a list of files
    // return - array of Torrent_File
    public function getFiles() {
        // Load files
        $filelist = array();
        $length = $this->info->get_value('length');

        if ( $length )
        {
            $file = new Torrent_File();
            $file->name = $this->info->get_value('name')->get_plain();
            $file->length =  $this->info->get_value('length')->get_plain();
            array_push( $filelist, $file );
        }
        else if ( $this->info->get_value('files') )
        {
            $files = $this->info->get_value('files')->get_plain();
            while ( list( $key, $value ) = each( $files ) )
            {
                $file = new Torrent_File();

                $path = $value->get_value('path')->get_plain();
                while ( list( $key, $value2 ) = each( $path ) )
                {
                    $file->name .= "/" . $value2->get_plain();
                }
                $file->name = ltrim( $file->name, '/' );
                $file->length =  $value->get_value('length')->get_plain();

                array_push( $filelist, $file );
            }
        }

        return $filelist;
    }

    // Get a list of trackers
    // return - array of strings
    public function getTrackers() {
        // Load tracker list
        $trackerlist = array();

        if ( $this->torrent->get_value('announce-list') )
        {
            $trackers = $this->torrent->get_value('announce-list')->get_plain();
            while ( list( $key, $value ) = each( $trackers ) )
            {
                if ( is_array( $value->get_plain() ) ) {
                    while ( list( $key, $value2 ) = each( $value ) )
                    {
                        while ( list( $key, $value3 ) = each( $value2 ) )
                        {
                            array_push( $trackerlist, $value3->get_plain() );
                        }
                    }
                } else {
                    array_push( $trackerlist, $value->get_plain() );
                }
            }
        }
        else if ( $this->torrent->get_value('announce') )
        {
            array_push( $trackerlist, $this->torrent->get_value('announce')->get_plain() );
        }

        return $trackerlist;
    }


    // Helper function to make adding a tracker easier
    // $tracker_url - string
    public function addTracker( $tracker_url )
    {
        $trackers = $this->getTrackers();
        $trackers[] = $tracker_url;
        $this->setTrackers( $trackers );
    }

    // Replace the current trackers with the supplied list
    // $trackerlist - array of strings
    public function setTrackers( $trackerlist )
    {
        if ( count( $trackerlist ) >= 1 )
        {
            $this->torrent->remove('announce-list');
            $string = new BEncode_String( $trackerlist[0] );
            $this->torrent->set( 'announce', $string );
        }

        if ( count( $trackerlist ) > 1 )
        {
            $list = new BEncode_List();


            while ( list( $key, $value ) = each( $trackerlist ) )
            {
                $list2 = new BEncode_List();
                $string = new BEncode_String( $value );
                $list2->add( $string );
                $list->add( $list2 );
            }

            $this->torrent->set( 'announce-list', $list );
        }
    }

    // Update the list of files
    // $filelist - array of Torrent_File
    public function setFiles( $filelist )
    {
        // Load files
        $length = $this->info->get_value('length');

        if ( $length )
        {
            $filelist[0] = str_replace( '\\', '/', $filelist[0] );
            $string = new BEncode_String( $filelist[0] );
            $this->info->set( 'name', $string );
        }
        else if ( $this->info->get_value('files') )
        {
            $files = $this->info->get_value('files')->get_plain();
            for ( $i = 0; $i < count( $files ); ++$i )
            {
                $file_parts = split( '/', $filelist[$i] );
                $path = new BEncode_List();
                foreach ( $file_parts as $part )
                {
                    $string = new BEncode_String( $part );
                    $path->add( $string );
                }
                $files[$i]->set( 'path', $path );
            }
        }
    }

    // Set the comment field
    // $value - string
    public function setComment( $value )
    {
        $type = 'comment';
        $key = $this->torrent->get_value( $type );
        if ( $value == '' ) {
            $this->torrent->remove( $type );
        } elseif ( $key ) {
            $key->set( $value );
        } else {
            $string = new BEncode_String( $value );
            $this->torrent->set( $type, $string );
        }
    }

    // Set the created by field
    // $value - string
    public function setCreatedBy( $value )
    {
        $type = 'created by';
        $key = $this->torrent->get_value( $type );
        if ( $value == '' ) {
            $this->torrent->remove( $type );
        } elseif ( $key ) {
            $key->set( $value );
        } else {
            $string = new BEncode_String( $value );
            $this->torrent->set( $type, $string );
        }
    }


    // Set the creation date
    // $value - php date
    public function setCreationDate( $value )
    {
        $type = 'creation date';
        $key = $this->torrent->get_value( $type );
        if ( $value == '' ) {
            $this->torrent->remove( $type );
        } elseif ( $key ) {
            $key->set( $value );
        } else {
            $int = new BEncode_Int( $value );
            $this->torrent->set( $type, $int );
        }
    }

    // Change the private flag
    // $value - -1 public, implicit
    //           0 public, explicit
    //           1 private
    public function setPrivate( $value )
    {
        if ( $value == -1 ) {
            $this->info->remove( 'private' );
        } else {
            $int = new BEncode_Int( $value );
            $this->info->set( 'private', $int );
        }
    }

    // Bencode the torrent
    public function bencode()
    {
        return $this->torrent->encode();
    }

    // Return the torrent's hash
    public function getHash()
    {
        return strtoupper( sha1( $this->info->encode() ) );
    }
}

// Simple class to encapsulate filename and length
class Torrent_File
{
    public $name;
    public $length;
}

?>

请帮帮我!

提前致谢!

I have created a script that generates information about a torrent file! But I'm lacking in creating a seeds and peers displaying function! Someone told me that they are in the completed field defined in the torrent. Please my class function codes from which I display the generated information using a bencode.php which takes out the data and this script ,named torrent.php converts it in readable form!

<?php
include_once('bencode.php');

class Torrent
{
    // Private class members
    private $torrent;
    private $info;

    // Public error message, $error is set if load() returns false
    public $error;

    // Load torrent file data
    // $data - raw torrent file contents
    public function load( &$data )
    {
        $this->torrent = BEncode::decode( $data );

        if ( $this->torrent->get_type() == 'error' )
        {
            $this->error = $this->torrent->get_plain();
            return false;
        }
        else if ( $this->torrent->get_type() != 'dictionary' )
        {
            $this->error = 'The file was not a valid torrent file.';
            return false;
        }

        $this->info = $this->torrent->get_value('info');
        if ( !$this->info )
        {
            $this->error = 'Could not find info dictionary.';
            return false;
        }

        return true;
    }

    // Get comment
    // return - string
    public function getComment() {
        return $this->torrent->get_value('comment') ? $this->torrent->get_value('comment')->get_plain() : null;
    }

    // Get creatuion date
    // return - php date
    public function getCreationDate() {
        return  $this->torrent->get_value('creation date') ? $this->torrent->get_value('creation date')->get_plain() : null;
    }

    // Get created by
    // return - string
    public function getCreatedBy() {
        return $this->torrent->get_value('created by') ? $this->torrent->get_value('created by')->get_plain() : null;
    }

    // Get name
    // return - filename (single file torrent)
    //          directory (multi-file torrent)
    // see also - getFiles()
    public function getName() {
        return $this->info->get_value('name')->get_plain();
    }

    // Get piece length
    // return - int
    public function getPieceLength() {
        return $this->info->get_value('piece length')->get_plain();
    }

    // Get pieces
    // return - raw binary of peice hashes
    public function getPieces() {
        return $this->info->get_value('pieces')->get_plain();
    }

    // Get private flag
    // return - -1 public, implicit
    //           0 public, explicit
    //           1 private
    public function getPrivate() {
        if ( $this->info->get_value('private') )
        {
            return $this->info->get_value('private')->get_plain();
        }
        return -1;
    }

    // Get a list of files
    // return - array of Torrent_File
    public function getFiles() {
        // Load files
        $filelist = array();
        $length = $this->info->get_value('length');

        if ( $length )
        {
            $file = new Torrent_File();
            $file->name = $this->info->get_value('name')->get_plain();
            $file->length =  $this->info->get_value('length')->get_plain();
            array_push( $filelist, $file );
        }
        else if ( $this->info->get_value('files') )
        {
            $files = $this->info->get_value('files')->get_plain();
            while ( list( $key, $value ) = each( $files ) )
            {
                $file = new Torrent_File();

                $path = $value->get_value('path')->get_plain();
                while ( list( $key, $value2 ) = each( $path ) )
                {
                    $file->name .= "/" . $value2->get_plain();
                }
                $file->name = ltrim( $file->name, '/' );
                $file->length =  $value->get_value('length')->get_plain();

                array_push( $filelist, $file );
            }
        }

        return $filelist;
    }

    // Get a list of trackers
    // return - array of strings
    public function getTrackers() {
        // Load tracker list
        $trackerlist = array();

        if ( $this->torrent->get_value('announce-list') )
        {
            $trackers = $this->torrent->get_value('announce-list')->get_plain();
            while ( list( $key, $value ) = each( $trackers ) )
            {
                if ( is_array( $value->get_plain() ) ) {
                    while ( list( $key, $value2 ) = each( $value ) )
                    {
                        while ( list( $key, $value3 ) = each( $value2 ) )
                        {
                            array_push( $trackerlist, $value3->get_plain() );
                        }
                    }
                } else {
                    array_push( $trackerlist, $value->get_plain() );
                }
            }
        }
        else if ( $this->torrent->get_value('announce') )
        {
            array_push( $trackerlist, $this->torrent->get_value('announce')->get_plain() );
        }

        return $trackerlist;
    }


    // Helper function to make adding a tracker easier
    // $tracker_url - string
    public function addTracker( $tracker_url )
    {
        $trackers = $this->getTrackers();
        $trackers[] = $tracker_url;
        $this->setTrackers( $trackers );
    }

    // Replace the current trackers with the supplied list
    // $trackerlist - array of strings
    public function setTrackers( $trackerlist )
    {
        if ( count( $trackerlist ) >= 1 )
        {
            $this->torrent->remove('announce-list');
            $string = new BEncode_String( $trackerlist[0] );
            $this->torrent->set( 'announce', $string );
        }

        if ( count( $trackerlist ) > 1 )
        {
            $list = new BEncode_List();


            while ( list( $key, $value ) = each( $trackerlist ) )
            {
                $list2 = new BEncode_List();
                $string = new BEncode_String( $value );
                $list2->add( $string );
                $list->add( $list2 );
            }

            $this->torrent->set( 'announce-list', $list );
        }
    }

    // Update the list of files
    // $filelist - array of Torrent_File
    public function setFiles( $filelist )
    {
        // Load files
        $length = $this->info->get_value('length');

        if ( $length )
        {
            $filelist[0] = str_replace( '\\', '/', $filelist[0] );
            $string = new BEncode_String( $filelist[0] );
            $this->info->set( 'name', $string );
        }
        else if ( $this->info->get_value('files') )
        {
            $files = $this->info->get_value('files')->get_plain();
            for ( $i = 0; $i < count( $files ); ++$i )
            {
                $file_parts = split( '/', $filelist[$i] );
                $path = new BEncode_List();
                foreach ( $file_parts as $part )
                {
                    $string = new BEncode_String( $part );
                    $path->add( $string );
                }
                $files[$i]->set( 'path', $path );
            }
        }
    }

    // Set the comment field
    // $value - string
    public function setComment( $value )
    {
        $type = 'comment';
        $key = $this->torrent->get_value( $type );
        if ( $value == '' ) {
            $this->torrent->remove( $type );
        } elseif ( $key ) {
            $key->set( $value );
        } else {
            $string = new BEncode_String( $value );
            $this->torrent->set( $type, $string );
        }
    }

    // Set the created by field
    // $value - string
    public function setCreatedBy( $value )
    {
        $type = 'created by';
        $key = $this->torrent->get_value( $type );
        if ( $value == '' ) {
            $this->torrent->remove( $type );
        } elseif ( $key ) {
            $key->set( $value );
        } else {
            $string = new BEncode_String( $value );
            $this->torrent->set( $type, $string );
        }
    }


    // Set the creation date
    // $value - php date
    public function setCreationDate( $value )
    {
        $type = 'creation date';
        $key = $this->torrent->get_value( $type );
        if ( $value == '' ) {
            $this->torrent->remove( $type );
        } elseif ( $key ) {
            $key->set( $value );
        } else {
            $int = new BEncode_Int( $value );
            $this->torrent->set( $type, $int );
        }
    }

    // Change the private flag
    // $value - -1 public, implicit
    //           0 public, explicit
    //           1 private
    public function setPrivate( $value )
    {
        if ( $value == -1 ) {
            $this->info->remove( 'private' );
        } else {
            $int = new BEncode_Int( $value );
            $this->info->set( 'private', $int );
        }
    }

    // Bencode the torrent
    public function bencode()
    {
        return $this->torrent->encode();
    }

    // Return the torrent's hash
    public function getHash()
    {
        return strtoupper( sha1( $this->info->encode() ) );
    }
}

// Simple class to encapsulate filename and length
class Torrent_File
{
    public $name;
    public $length;
}

?>

Please help me out!

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薆情海 2024-10-25 07:36:25

有点晚了,但你说创建的课程来自:

https://github.com/torrage/Torrage

它的最初目的并不是为了检索此类数据。

为您提供种子和种子的类,包括其余数据,请参阅:

https://github.com /adriengibrat/torrent-rw

Little late but the class you say to have created comes from:

https://github.com/torrage/Torrage

It's original purpose was not intended to retrieve that kind of data.

A class that gets you seeds and peers for torrent inclusive the rest of the data see:

https://github.com/adriengibrat/torrent-rw

┊风居住的梦幻卍 2024-10-25 07:36:25

该信息不存储在 .torrent 文件中。它是高度动态的数据,在“繁忙”的 torrent 上每微秒都可能发生变化。服务器不会在每次有人下载时构建具有最新统计信息的自定义 .torrent 文件。

想一想。您在周一下载了一个 .torrent 文件,但只在下周五查看。统计数据已经发布一周并且已经过时。

但是,您可以获取 .torrent 中的跟踪器信息并查询这些跟踪器的统计信息。

That information's not stored in the .torrent file. It's highly dynamic data, which can change every microsecond on a 'busy' torrent. The server's not going to build a custom .torrent file with up-to-the-minute statistics every time someone downloads it.

Think about it for a second. You download a .torrent file on Monday, but only look at it next Friday. The stats are now a week old and stale.

You can, however, take the tracker information in the .torrent and query those trackers for the stats.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文