diff --git a/deluge/ui/gtkui/addtorrentdialog.py b/deluge/ui/gtkui/addtorrentdialog.py index 33310e53f..59c0d58f1 100644 --- a/deluge/ui/gtkui/addtorrentdialog.py +++ b/deluge/ui/gtkui/addtorrentdialog.py @@ -25,6 +25,7 @@ from deluge.ui.client import client from deluge.ui.common import TorrentInfo from deluge.ui.gtkui.common import listview_replace_treestore, reparent_iter from deluge.ui.gtkui.dialogs import ErrorDialog +from deluge.ui.gtkui.edittrackersdialog import trackers_tiers_from_text from deluge.ui.gtkui.path_chooser import PathChooser from deluge.ui.gtkui.torrentview_data_funcs import cell_data_size @@ -665,13 +666,12 @@ class AddTorrentDialog(component.Component): response = dialog.run() infohash = entry.get_text().strip() if response == gtk.RESPONSE_OK and deluge.common.is_infohash(infohash): - trackers = [] - b = textview.get_buffer() - lines = b.get_text(b.get_start_iter(), b.get_end_iter()).strip().split('\n') - log.debug('lines: %s', lines) - for l in lines: - if deluge.common.is_url(l): - trackers.append(l) + # Create a list of trackers from the textview buffer + tview_buf = textview.get_buffer() + trackers_text = tview_buf.get_text(*tview_buf.get_bounds()) + log.debug('Create torrent tracker lines: %s', trackers_text) + trackers = list(trackers_tiers_from_text(trackers_text).keys()) + # Convert the information to a magnet uri, this is just easier to # handle this way. log.debug('trackers: %s', trackers) diff --git a/deluge/ui/gtkui/createtorrentdialog.py b/deluge/ui/gtkui/createtorrentdialog.py index 8b287f5f7..62f645b4a 100644 --- a/deluge/ui/gtkui/createtorrentdialog.py +++ b/deluge/ui/gtkui/createtorrentdialog.py @@ -21,6 +21,7 @@ import deluge.component as component from deluge.common import get_path_size, is_url, resource_filename from deluge.configmanager import ConfigManager from deluge.ui.client import client +from deluge.ui.gtkui.edittrackersdialog import last_tier_trackers_from_liststore, trackers_tiers_from_text from deluge.ui.gtkui.torrentview_data_funcs import cell_data_size log = logging.getLogger(__name__) @@ -292,12 +293,13 @@ class CreateTorrentDialog(object): tracker = trackers[0][0] # Get a list of webseeds + textview_buf = self.builder.get_object('textview_webseeds').get_buffer() + lines = textview_buf.get_text(*textview_buf.get_bounds()).strip().split('\n') webseeds = [] - b = self.builder.get_object('textview_webseeds').get_buffer() - lines = b.get_text(b.get_start_iter(), b.get_end_iter()).strip().split('\n') - for l in lines: - if is_url(l): - webseeds.append(l) + for line in lines: + line = line.replace('\\', '/') # Fix any mistyped urls. + if is_url(line): + webseeds.append(line) # Get the piece length in bytes combo = self.builder.get_object('combo_piece_size') piece_length = self.parse_piece_size_text(combo.get_model()[combo.get_active()][0]) @@ -426,24 +428,16 @@ class CreateTorrentDialog(object): if response == gtk.RESPONSE_OK: # Create a list of trackers from the textview buffer - trackers = [] - b = textview.get_buffer() - lines = b.get_text(b.get_start_iter(), b.get_end_iter()).strip().split('\n') - self.config['createtorrent.trackers'] = lines - log.debug('lines: %s', lines) - for l in lines: - l = l.replace('\\', '/') # Fix mistyped urls. - if is_url(l): - trackers.append(l) + textview_buf = textview.get_buffer() + trackers_text = textview_buf.get_text(*textview_buf.get_bounds()) + log.debug('Create torrent tracker lines: %s', trackers_text) + self.config['createtorrent.trackers'] = trackers_text.split('/n') - # We are going to add these trackers to the highest tier + 1 - tier = 0 - for row in self.trackers_liststore: - if row[0] > tier: - tier = row[0] - - for tracker in trackers: - self.trackers_liststore.append([tier, tracker]) + # Append trackers liststore with unique trackers and tiers starting from last tier number. + last_tier, orig_trackers = last_tier_trackers_from_liststore(self.trackers_liststore) + for tracker, tier in trackers_tiers_from_text(trackers_text).items(): + if tracker not in orig_trackers: + self.trackers_liststore.append([tier + last_tier, tracker]) dialog.destroy() diff --git a/deluge/ui/gtkui/edittrackersdialog.py b/deluge/ui/gtkui/edittrackersdialog.py index d7d17d92c..56fdad8f2 100644 --- a/deluge/ui/gtkui/edittrackersdialog.py +++ b/deluge/ui/gtkui/edittrackersdialog.py @@ -24,6 +24,58 @@ from deluge.ui.gtkui.common import get_deluge_icon log = logging.getLogger(__name__) +def last_tier_trackers_from_liststore(trackers_liststore): + """Create a list of tracker from existing liststore and find last tier number. + + Args: + tracker_liststore (gtk.ListStore): A gtk.ListStore with [tier (int), tracker (str)] rows. + + Returns: + tuple(int, list): A tuple containing last tier number and list of trackers. + + """ + + last_tier = 0 + trackers_from_liststore = [] + for tier, tracker in trackers_liststore: + trackers_from_liststore.append(tracker) + if tier >= last_tier: + last_tier = tier + 1 + + return last_tier, trackers_from_liststore + + +def trackers_tiers_from_text(text_str=''): + """Create a list of trackers from text. + + Any duplicate trackers are removed. + + Args: + text_input (str): A block of text with tracker separated by newlines. + + Returns: + list: The list of trackers. + + Notes: + Trackers should be separated by newlines and empty line denotes start of new tier. + + """ + + trackers = {} + tier = 0 + + lines = text_str.strip().split('\n') + for line in lines: + if not line: + tier += 1 + continue + line = line.replace('\\', '/') # Fix any mistyped urls. + if is_url(line) and line not in trackers: + trackers[line] = tier + + return trackers + + class EditTrackersDialog(object): def __init__(self, torrent_id, parent=None): self.torrent_id = torrent_id @@ -215,16 +267,10 @@ class EditTrackersDialog(object): log.debug('on_button_add_ok_clicked') # Create a list of trackers from the textview widget - textview = self.builder.get_object('textview_trackers') - trackers = [] - b = textview.get_buffer() - lines = b.get_text(b.get_start_iter(), b.get_end_iter()).strip().split('\n') - for l in lines: - l = l.replace('\\', '/') # Fix mistyped urls. - if is_url(l): - trackers.append(l) + textview_buf = self.builder.get_object('textview_trackers').get_buffer() + trackers_text = textview_buf.get_text(*textview_buf.get_bounds()) - for tracker in trackers: + for tracker in trackers_tiers_from_text(trackers_text): # Figure out what tier number to use.. it's going to be the highest+1 # Also check for duplicates # Check if there are any entries @@ -244,7 +290,7 @@ class EditTrackersDialog(object): self.add_tracker(highest_tier + 1, tracker) # Clear the entry widget and hide the dialog - textview.get_buffer().set_text('') + textview_buf.set_text('') self.add_tracker_dialog.hide() def on_button_add_cancel_clicked(self, widget):