Changeset 6156


Ignore:
Timestamp:
Jun 12, 2008, 2:11:54 AM (13 years ago)
Author:
charles
Message:

(cli) #938 - transmissioncli won't scrape

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/cli/transmissioncli.c

    r6148 r6156  
    3131
    3232#include <libtransmission/transmission.h>
     33#include <libtransmission/bencode.h>
    3334#include <libtransmission/makemeta.h>
    3435#include <libtransmission/metainfo.h> /* tr_metainfoFree */
    3536#include <libtransmission/utils.h> /* tr_wait */
     37#include <libtransmission/web.h> /* tr_webRun */
    3638
    3739
     
    102104}
    103105
     106static int
     107is_rfc2396_alnum( char ch )
     108{
     109    return     ( '0' <= ch && ch <= '9' )
     110            || ( 'A' <= ch && ch <= 'Z' )
     111            || ( 'a' <= ch && ch <= 'z' );
     112}
     113
     114static void
     115escape( char * out, const uint8_t * in, int in_len ) /* rfc2396 */
     116{
     117    const uint8_t *end = in + in_len;
     118    while( in != end )
     119        if( is_rfc2396_alnum(*in) )
     120            *out++ = (char) *in++;
     121        else
     122            out += snprintf( out, 4, "%%%02X", (unsigned int)*in++ );
     123    *out = '\0';
     124}
     125
     126
    104127#define LINEWIDTH 80
    105128
     
    110133{
    111134    system( finishCall );
     135}
     136
     137static int leftToScrape = 0;
     138
     139static void
     140scrapeDoneFunc( struct tr_handle    * session UNUSED,
     141                long                  response_code,
     142                const void          * response,
     143                size_t                response_byte_count,
     144                void                * host )
     145{
     146    tr_benc top, *files;
     147
     148    if( !tr_bencLoad( response, response_byte_count, &top, NULL )
     149        && tr_bencDictFindDict( &top, "files", &files )
     150        && files->val.l.count >= 2 )
     151    {
     152        int64_t complete=-1, incomplete=-1, downloaded=-1;
     153        tr_benc * hash = &files->val.l.vals[1];
     154        tr_bencDictFindInt( hash, "complete", &complete );
     155        tr_bencDictFindInt( hash, "incomplete", &incomplete );
     156        tr_bencDictFindInt( hash, "downloaded", &downloaded );
     157        printf( "%4d seeders, %4d leechers, %5d downloads at %s\n",
     158                (int)complete, (int)incomplete, (int)downloaded, (char*)host );
     159        tr_bencFree( &top );
     160    }
     161    else
     162        printf( "unable to parse response (http code %lu) at %s", response_code, (char*)host );
     163
     164    --leftToScrape;
    112165}
    113166
     
    207260    ctor = tr_ctorNew( h );
    208261    tr_ctorSetMetainfoFromFile( ctor, torrentPath );
    209     tr_ctorSetPaused( ctor, TR_FORCE, 0 );
     262    tr_ctorSetPaused( ctor, TR_FORCE, showScrape );
    210263    tr_ctorSetDownloadDir( ctor, TR_FORCE, downloadDir );
     264
     265    if( showScrape )
     266    {
     267        tr_info info;
     268
     269        if( !tr_torrentParse( h, ctor, &info ) )
     270        {
     271            int i;
     272            const time_t start = time( NULL );
     273            for( i=0; i<info.trackerCount; ++i )
     274            {
     275                if( info.trackers[i].scrape )
     276                {
     277                    const char * scrape = info.trackers[i].scrape;
     278                    char escaped[SHA_DIGEST_LENGTH*3 + 1];
     279                    char *url, *host;
     280                    escape( escaped, info.hash, SHA_DIGEST_LENGTH );
     281                    url = tr_strdup_printf( "%s%cinfo_hash=%s",
     282                                            scrape,
     283                                            strchr(scrape,'?')?'&':'?',
     284                                            escaped );
     285                    tr_httpParseURL( scrape, -1, &host, NULL, NULL );
     286                    ++leftToScrape;
     287                    tr_webRun( h, url, NULL, scrapeDoneFunc, host );
     288                    tr_free( url );
     289                }
     290            }
     291
     292            fprintf( stderr, "scraping %d trackers:\n", leftToScrape );
     293
     294            while( leftToScrape>0 && ((time(NULL)-start)<20) )
     295                tr_wait( 250 );
     296        }
     297        goto cleanup;
     298    }
    211299
    212300    if( showInfo )
     
    256344    }
    257345
    258 
    259346    tor = tr_torrentNew( h, ctor, &error );
    260347    tr_ctorFree( ctor );
     
    264351        tr_sessionClose( h );
    265352        return EXIT_FAILURE;
    266     }
    267 
    268     if( showScrape )
    269     {
    270         const struct tr_stat * stats;
    271         const uint64_t start = tr_date( );
    272         printf( "Scraping, Please wait...\n" );
    273        
    274         do
    275         {
    276             stats = tr_torrentStat( tor );
    277             if( !stats || tr_date() - start > 20000 )
    278             {
    279                 printf( "Scrape failed.\n" );
    280                 goto cleanup;
    281             }
    282             tr_wait( 2000 );
    283         }
    284         while( stats->completedFromTracker == -1 || stats->leechers == -1 || stats->seeders == -1 );
    285        
    286         printf( "%d seeder(s), %d leecher(s), %d download(s).\n",
    287             stats->seeders, stats->leechers, stats->completedFromTracker );
    288 
    289         goto cleanup;
    290353    }
    291354
Note: See TracChangeset for help on using the changeset viewer.