Seite 1 von 1

Fast Resume mit libtorrent

Verfasst: Dienstag 16. Juni 2009, 11:23
von Barabbas
Hallo zusammen,

ich versuche mich gerade mit python und libtorrent. Allerdings scheint die Python-Portierung nicht gerade vollständig zu sein - zumindest fehlen einige Funktionen, die libtorrent eigentlich haben müsste.

Aber egal.

Ich versuche mich gerade daran, am Ende einer Torrent-Sitzung "fast resume" Daten zu speichern.

Code: Alles auswählen

        # Alert stack löschen
        ret = True
        while ret:
            ret = self.torrent.session.pop_alert()

        # Fast Resume auslösen
        num_resume_data = 0
        self.torrent.session.pause()
        for torrent in self.torrent.session.get_torrents():
            torrent.save_resume_data()
            num_resume_data += 1

       # save_resume_data arbeitet asynchron - 
       # darum müssen wir das Ergebnis mit dieser
       # Schleife auslesen:
        while num_resume_data > 0:
            ret = self.torrent.session.pop_alert()
            if ret:
                if not isinstance(ret, lt.save_resume_data_alert):
                    print "Fehler:", ret.what(), ret.message()
                else:
                    print ret.message()

                num_resume_data -= 1
Leider funktioniert das so nicht: Für jeden einzelnen Torrent wird gemeldet:
"torrent does not have a complete resume state yet"
Allerdings haben die Torrents korrekte Metadaten, sind mit dem Tracker und einigen Peers verbunden und laden auch Daten hoch / runter.

Hat jemand eine Idee, was ich übersehen haben könnte?

lG

Daniel

Verfasst: Donnerstag 18. Juni 2009, 09:39
von Barabbas
Hm, ok, das Ganze scheint ein kleines Designproblem in libtorrent zu sein: Wenn man bestimmte Befehle ausführt, die Alerts auslösen, muss man vorher den entsprechenden Alert aktiviert haben.

Das lässt sich aber recht leicht einrichten:

Code: Alles auswählen

session.set_alert_mask(lt.alert.category_t.storage_notification)
Schöne Grüße,

Daniel

Verfasst: Donnerstag 18. Juni 2009, 09:53
von EyDu
Die obere while-Schleife kannst du noch vereinfachen:

Code: Alles auswählen

while self.torrent.session.pop_alert():
    pass
Aus der letzten solltest du besser eine for-Schleife machen:

Code: Alles auswählen

for i in range(num_resume_data):
    ...
Ich kenne mich mit libtorrent nicht aus, aber ich vermute mal, dass "get_torrents" eine Liste zurück gibt. Dann könntest du "num_resume_data" auch direkt über die "len"-Funktion bestimmen.

Verfasst: Donnerstag 18. Juni 2009, 11:13
von Barabbas
Danke für die Hinweise: Da ich anfänglich Probleme mit "save resuming" hatte, habe ich den Code einfach aus einem Beispiel aus der C-Dokumentation übernommen und "portiert". Entsprechend habe ich nicht groß darüber nachgedacht, ob ich das vll. anders machen könnte. So stürzen Raketen ab :/

//edit:
Naja, die while-Schleife war da schon richtig: Immerhin muss die Schleife so oft durchlaufen werde, bis ich von jedem Torrent eine fast-resume-Nachricht erhalten habe. Mit der for-Schleife würde nur n Mal nach Nachrichten gefragt (wobei n die Anzahl der Torrents ist) - wegen der Asynchronität gehen mir dann aber ein ganzer Haufen Nachrichten durch die Lappen.