Fast Resume mit libtorrent

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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.
Antworten