Treferwynd / transmission-remote-gtk

Automatically exported from code.google.com/p/transmission-remote-gtk
GNU General Public License v2.0
0 stars 0 forks source link

magnet link crash #132

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
magnet: urls can be added to trg, but then trg crashes soon after.  it gets 
confused and thinks that the torrent has finished downloading as soon as it 
gets started, which causes it to send a series of completed notifications.  
after ten or so of these, the client crashes.

Original issue reported on code.google.com by reardo...@gmail.com on 26 Sep 2011 at 11:09

GoogleCodeExporter commented 9 years ago
I don't use or know much about how magnet links work, do you have a backtrace 
for this?

Original comment by a...@eth0.org.uk on 1 Oct 2011 at 12:11

GoogleCodeExporter commented 9 years ago
This is a pretty important feature for a lot of people.  I didn't include a bt 
because the issue is not as simple as a missing ref or unref; I think some real 
work is required to properly handle.  Use the transmission web interface to 
watch the flow.

Try this url, which is a torrent for the current version of Ubuntu:

magnet:?xt=urn:btih:9cf9026863f07f1d65ad32f5ec78df30192f5efc

Here is the longer version of the same magnet url, with a name (dn) and default 
tracker included:

magnet:?xt=urn:btih:9cf9026863f07f1d65ad32f5ec78df30192f5efc&dn=ubuntu-11.04-alt
ernate-amd64.iso&tr=http://torrent.ubuntu.com:6969/announce

Note that for the first link you must have some peer exchange mechanism, for 
the second you will get a short set of peers, a seed for seeds as it were, from 
the default tracker.

trg should:

1) show a magnetized torrent as different from other torrents
2) show current magnetized state, ie "is the metadata" (roughly, the .torrent 
file which the magnet url represents) downloaded yet?
3) be nice and put trg ahead of other clients: pause the torrent once the 
metadata is available so that user can then select which files to download.
4) warn user, when adding a magnet that does not include a tracker, that DHT 
must be turned on.

Original comment by reardo...@gmail.com on 1 Oct 2011 at 4:20

GoogleCodeExporter commented 9 years ago
I just tried it and it worked quite well for me, so I'd like to see the 
backtrace and hopefully fix that crash..

I've added a warning for DHT, fixed the files model to accept updates after the 
first. It's not clear to me how to tell if a torrent is from magnet.

Some useful info here:

https://forum.transmissionbt.com/viewtopic.php?f=2&t=9583

Also Todo: 

Show/copy magnetLink

Original comment by a...@eth0.org.uk on 1 Oct 2011 at 6:18

GoogleCodeExporter commented 9 years ago
Have you tried it with "Torrent added notifications" and "Torrent completed 
notifications" turned on?  I get repeated completion notices as soon as the 
torrent is added, before it's even started downloading.

Original comment by reardo...@gmail.com on 1 Oct 2011 at 9:22

GoogleCodeExporter commented 9 years ago
Yeah, I don't see that, but now I guess it's because you already downloaded it 
and I haven't. Should be fixed now.

Original comment by a...@eth0.org.uk on 3 Oct 2011 at 10:00

GoogleCodeExporter commented 9 years ago
No, problem of endless "torrent has completed" messagers is still there.  To be 
clear: I do _not_ have the file downloaded, torrent&data have been removed, and 
I have done a clean restart of transmission-daemon to clear out DHT cache.  
Therefore, when added, the magnetized torrent will take some time (30secs in my 
case) to find metadata.  In the phase where the magnet does not have metadata 
(before you see the name change), trg will continuously send "torrent has 
completed" notifications.

Original comment by reardo...@gmail.com on 3 Oct 2011 at 1:33

GoogleCodeExporter commented 9 years ago
I also suggest that during metadata-gather phase, the Status of the magnetized 
torrent be displayed as other than "Downloading".  Something like "Finding" or 
"Searching".  When the metadata is fully available and the torrent name is 
known, and real pieces are downloading, switch Status to "Downloading".

Thoughts?

Original comment by reardo...@gmail.com on 3 Oct 2011 at 1:35

GoogleCodeExporter commented 9 years ago
I'm having a problem with today's commits and the "Metadata downloading" 
additions.  I have a torrent which is paused (and no data downloaded so far), I 
try starting it, the tracker returns an error but trg shows it as "Metadata 
downloading".  It is _not_ a magnetized torrent.

Original comment by reardo...@gmail.com on 8 Oct 2011 at 12:27

GoogleCodeExporter commented 9 years ago
Also, when I try to start this torrent, I am getting:

(transmission-remote-gtk:10181): Json-CRITICAL **: json_node_get_value: 
assertion `node != NULL' failed

Original comment by reardo...@gmail.com on 8 Oct 2011 at 12:31

GoogleCodeExporter commented 9 years ago
Played with this some more... magnets are a bit broken, they stay in the 
"Metadata downloading" phase even after metadata is complete and the torrent is 
downloading properly.

Original comment by reardo...@gmail.com on 8 Oct 2011 at 1:34

GoogleCodeExporter commented 9 years ago
Not sure why this is at the moment, I think it should only be set if metadata % 
is < 100, and a quick look at the source it seems that this should only ever be 
the case if there's no metadata. The macos client uses hasMetadata(), which 
checks if number of files is > 0.

Commented out the downloading metadata stuff until I have a closer look.

Original comment by a...@eth0.org.uk on 8 Oct 2011 at 4:16

GoogleCodeExporter commented 9 years ago
Btw can you show me the backtrace with fatal-warnings if that assertion appears 
again

Original comment by a...@eth0.org.uk on 8 Oct 2011 at 4:43

GoogleCodeExporter commented 9 years ago
Hmm, when you removed the "Metadata Downloading" stuff it went away.  However, 
the dialogs (including add torrent and server config, here) are now throwing 
this:

GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed

Program received signal SIGTRAP, Trace/breakpoint trap.
g_logv (log_domain=0x7ffff5f994ae "GLib-GObject", log_level=<optimized out>, 
format=0x7ffff5af6732 "%s: assertion `%s' failed", args1=0x7fffffffb618)
    at /build/buildd/glib2.0-2.30.0/./glib/gmessages.c:577
577     in /build/buildd/glib2.0-2.30.0/./glib/gmessages.c
(gdb) bt
#0  g_logv (log_domain=0x7ffff5f994ae "GLib-GObject", log_level=<optimized 
out>, format=0x7ffff5af6732 "%s: assertion `%s' failed", args1=0x7fffffffb618)
    at /build/buildd/glib2.0-2.30.0/./glib/gmessages.c:577
#1  0x00007ffff5ab16a2 in g_log (log_domain=<optimized out>, 
log_level=<optimized out>, format=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./glib/gmessages.c:591
#2  0x00007ffff5f70ad4 in g_object_ref (_object=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gobject.c:2649
#3  0x00007ffff5f71158 in g_value_object_collect_value (value=0x7fffdd295178, 
n_collect_values=<optimized out>, collect_values=<optimized out>, 
collect_flags=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gobject.c:3081
#4  0x00007ffff5f89380 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:2977
#5  0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#6  0x00007ffff710ac25 in IA__gtk_widget_unparent (widget=0x922e80) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkwidget.c:3125
#7  0x00007ffff6f60497 in gtk_combo_box_list_destroy (combo_box=<optimized 
out>) at /build/buildd/gtk+2.0-2.24.6/gtk/gtkcombobox.c:4005
#8  0x00007ffff6f623f1 in gtk_combo_box_finalize (object=0x16262e0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkcombobox.c:5807
#9  0x00007ffff5f709f0 in g_object_unref (_object=0x16262e0) at 
/build/buildd/glib2.0-2.30.0/./gobject/gobject.c:2746
#10 0x00007ffff7073558 in gtk_table_forall (container=<optimized out>, 
include_internals=<optimized out>, callback=0x7ffff7104690 
<IA__gtk_widget_destroy>, callback_data=0x0)
    at /build/buildd/gtk+2.0-2.24.6/gtk/gtktable.c:935
#11 0x00007ffff6f6e2ef in gtk_container_destroy (object=0x16450a0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkcontainer.c:1093
#12 0x00007ffff5f6dffa in g_closure_invoke (closure=0x6b13e0, return_value=0x0, 
n_param_values=1, param_values=0x13fe580, invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#13 0x00007ffff5f7fa78 in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x16450a0, emission_return=0x0, 
instance_and_params=0x13fe580)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3388
#14 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#15 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#16 0x00007ffff7013c60 in gtk_object_dispose (gobject=<optimized out>) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkobject.c:421
#17 0x00007ffff5f728d0 in g_object_run_dispose (object=0x16450a0) at 
/build/buildd/glib2.0-2.30.0/./gobject/gobject.c:945
#18 0x00007ffff700c926 in gtk_notebook_forall (container=<optimized out>, 
include_internals=0, callback=0x7ffff7104690 <IA__gtk_widget_destroy>, 
callback_data=0x0)
    at /build/buildd/gtk+2.0-2.24.6/gtk/gtknotebook.c:4292
#19 0x00007ffff6f6e2ef in gtk_container_destroy (object=0x9584c0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkcontainer.c:1093
#20 0x00007ffff5f6dffa in g_closure_invoke (closure=0x6b13e0, return_value=0x0, 
n_param_values=1, param_values=0x7fffdde69ce0, invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#21 0x00007ffff5f7fa78 in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x9584c0, emission_return=0x0, 
instance_and_params=0x7fffdde69ce0)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3388
#22 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#23 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#24 0x00007ffff7013c60 in gtk_object_dispose (gobject=<optimized out>) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkobject.c:421
#25 0x00007ffff5f728d0 in g_object_run_dispose (object=0x9584c0) at 
/build/buildd/glib2.0-2.30.0/./gobject/gobject.c:945
#26 0x00007ffff6f3892b in gtk_box_forall (container=0x13a68c0, 
include_internals=<optimized out>, callback=0x7ffff7104690 
<IA__gtk_widget_destroy>, callback_data=0x0)
    at /build/buildd/gtk+2.0-2.24.6/gtk/gtkbox.c:1251
#27 0x00007ffff6f6e2ef in gtk_container_destroy (object=0x13a68c0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkcontainer.c:1093
#28 0x00007ffff5f6dffa in g_closure_invoke (closure=0x6b13e0, return_value=0x0, 
n_param_values=1, param_values=0xc58d60, invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#29 0x00007ffff5f7fa78 in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x13a68c0, emission_return=0x0, instance_and_params=0xc58d60)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3388
#30 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#31 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#32 0x00007ffff7013c60 in gtk_object_dispose (gobject=<optimized out>) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkobject.c:421
#33 0x00007ffff5f728d0 in g_object_run_dispose (object=0x13a68c0) at 
/build/buildd/glib2.0-2.30.0/./gobject/gobject.c:945
---Type <return> to continue, or q <return> to quit---
#34 0x00007ffff6f6e2ef in gtk_container_destroy (object=0x1629350) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkcontainer.c:1093
#35 0x00007ffff5f6e0a4 in g_closure_invoke (closure=0x6b13e0, return_value=0x0, 
n_param_values=1, param_values=0x7fffdd522480, invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#36 0x00007ffff5f7fa78 in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x1629350, emission_return=0x0, 
instance_and_params=0x7fffdd522480)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3388
#37 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#38 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#39 0x00007ffff7013c60 in gtk_object_dispose (gobject=<optimized out>) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkobject.c:421
#40 0x00007ffff5f728d0 in g_object_run_dispose (object=0x1629350) at 
/build/buildd/glib2.0-2.30.0/./gobject/gobject.c:945
#41 0x0000000000428bed in trg_remote_prefs_response_cb (dlg=0x1629350, 
res_id=<optimized out>, data=<optimized out>) at trg-remote-prefs-dialog.c:95
#42 0x00007ffff5f6e0a4 in g_closure_invoke (closure=0x14dbc40, 
return_value=0x0, n_param_values=2, param_values=0x7fffdde688f0, 
invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#43 0x00007ffff5f8002a in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x1629350, emission_return=0x0, 
instance_and_params=0x7fffdde688f0)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3272
#44 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#45 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#46 0x00007ffff5f6e0a4 in g_closure_invoke (closure=0x1518b70, 
return_value=0x0, n_param_values=1, param_values=0x7fffde80a380, 
invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#47 0x00007ffff5f8002a in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x15e98c0, emission_return=0x0, 
instance_and_params=0x7fffde80a380)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3272
#48 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#49 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#50 0x00007ffff6f42905 in gtk_real_button_released (button=0x15e98c0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkbutton.c:1725
#51 gtk_real_button_released (button=0x15e98c0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkbutton.c:1715
#52 0x00007ffff5f6e0a4 in g_closure_invoke (closure=0x6bf800, return_value=0x0, 
n_param_values=1, param_values=0xdcf2a0, invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#53 0x00007ffff5f7f81a in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x15e98c0, emission_return=0x0, instance_and_params=0xdcf2a0)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3202
#54 0x00007ffff5f896b1 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3003
#55 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#56 0x00007ffff6f4172d in gtk_button_button_release (widget=<optimized out>, 
event=<optimized out>) at /build/buildd/gtk+2.0-2.24.6/gtk/gtkbutton.c:1617
#57 0x00007ffff6feb828 in _gtk_marshal_BOOLEAN__BOXED (closure=0x6b44e0, 
return_value=0x7fffffffda50, n_param_values=<optimized out>, 
param_values=0x7fffde7c5d30, 
    invocation_hint=<optimized out>, marshal_data=<optimized out>) at /build/buildd/gtk+2.0-2.24.6/gtk/gtkmarshalers.c:86
#58 0x00007ffff5f6e0a4 in g_closure_invoke (closure=0x6b44e0, 
return_value=0x7fffffffda50, n_param_values=2, param_values=0x7fffde7c5d30, 
invocation_hint=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gclosure.c:774
#59 0x00007ffff5f7fe5f in signal_emit_unlocked_R (node=<optimized out>, 
detail=0, instance=0x15e98c0, emission_return=0x7fffffffdbb0, 
instance_and_params=0x7fffde7c5d30)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3310
#60 0x00007ffff5f89483 in g_signal_emit_valist (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>, var_args=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3013
#61 0x00007ffff5f89852 in g_signal_emit (instance=<optimized out>, 
signal_id=<optimized out>, detail=<optimized out>) at 
/build/buildd/glib2.0-2.30.0/./gobject/gsignal.c:3060
#62 0x00007ffff7105dc1 in gtk_widget_event_internal (widget=0x15e98c0, 
event=0x9275f0) at /build/buildd/gtk+2.0-2.24.6/gtk/gtkwidget.c:4992
#63 0x00007ffff6fe9a23 in IA__gtk_propagate_event (widget=0x15e98c0, 
event=0x9275f0) at /build/buildd/gtk+2.0-2.24.6/gtk/gtkmain.c:2567
#64 0x00007ffff6fe9d83 in IA__gtk_main_do_event (event=0x9275f0) at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkmain.c:1757
#65 0x00007ffff6c5e09c in gdk_event_dispatch (source=<optimized out>, 
callback=<optimized out>, user_data=<optimized out>)
    at /build/buildd/gtk+2.0-2.24.6/gdk/x11/gdkevents-x11.c:2377
---Type <return> to continue, or q <return> to quit---
#66 0x00007ffff5aa8a5d in g_main_dispatch (context=0x680a60) at 
/build/buildd/glib2.0-2.30.0/./glib/gmain.c:2441
#67 g_main_context_dispatch (context=0x680a60) at 
/build/buildd/glib2.0-2.30.0/./glib/gmain.c:3011
#68 0x00007ffff5aa9258 in g_main_context_iterate (context=0x680a60, 
block=<optimized out>, dispatch=1, self=<optimized out>)
    at /build/buildd/glib2.0-2.30.0/./glib/gmain.c:3089
#69 0x00007ffff5aa9792 in g_main_loop_run (loop=0x86b590) at 
/build/buildd/glib2.0-2.30.0/./glib/gmain.c:3297
#70 0x00007ffff6fe8db7 in IA__gtk_main () at 
/build/buildd/gtk+2.0-2.24.6/gtk/gtkmain.c:1329
#71 0x000000000040d579 in main (argc=1, argv=0x7fffffffe078) at main.c:187

Original comment by reardo...@gmail.com on 8 Oct 2011 at 7:55

GoogleCodeExporter commented 9 years ago
It was almost certainly in the new torrent_get_metadata_percent_complete() 
then, especially as that's one of the few places where json_node_get_value is 
used (most other places would throw the assertion from object_get_member I 
think).

I'd only expect it to be null if the object member wasn't being sent by the 
server. Likely this was causing the incorrect flag as it'd return a default of 
0.0 in this case (IIRC). Though it's weird, I don't see it here and it's unlike 
the RPC to not send a member in the torrent object. Even if a member isn't 
relevant it gets sent. Added a check in here to return a default of 100 if 
node==NULL, even though it's not used at the moment.

As for the object_ref things in dialogs, I'm kinda stumped. Really can't 
reproduce it here so think our GTK's are handling something differently. Not 
sure why it's trying to ref something in the widget_destroy.

Original comment by a...@eth0.org.uk on 8 Oct 2011 at 8:06

GoogleCodeExporter commented 9 years ago
Is either magnet torrents or the _ref crash a problem still?

I wasn't able to reproduce the _ref crash bug, I'm thinking it's a bug in your 
specific version of GTK.

Original comment by a...@eth0.org.uk on 23 Jan 2012 at 10:56

GoogleCodeExporter commented 9 years ago
Issue 124 has been merged into this issue.

Original comment by a...@eth0.org.uk on 23 Jan 2012 at 10:58

GoogleCodeExporter commented 9 years ago
Issue 131 has been merged into this issue.

Original comment by a...@eth0.org.uk on 23 Jan 2012 at 10:58

GoogleCodeExporter commented 9 years ago
How is magnet support these days? I have used it a number of times recently and 
haven't noticed any major problems.

I fixed one today where the add dialog could grow way too wide because of the 
URL.

Original comment by a...@eth0.org.uk on 20 Jun 2012 at 2:30

GoogleCodeExporter commented 9 years ago

Original comment by a...@eth0.org.uk on 29 Jun 2012 at 2:22