]> git.phdru.name Git - bookmarks_db.git/blob - delete.py
Fix(Robot): Stop splitting and un-splitting URLs
[bookmarks_db.git] / delete.py
1 #! /usr/bin/env python3
2 """Run through the bookmarks database and delete bookmarks
3 listed in a file
4
5 This file is a part of Bookmarks database and Internet robot.
6 """
7
8 from __future__ import print_function
9 import sys
10
11
12 __author__ = "Oleg Broytman <phd@phdru.name>"
13 __copyright__ = "Copyright (C) 2023 PhiloSoft Design"
14 __license__ = "GNU GPL"
15
16
17 def run():
18     from getopt import getopt
19     optlist, args = getopt(sys.argv[1:], "s")
20
21     report_stats = 1
22
23     for _opt, _arg in optlist:
24         if _opt == '-s':
25             report_stats = 0
26     try:
27         del _opt, _arg
28     except NameError:
29         pass
30
31     if report_stats:
32         print("Broytman delete bookmarks, Copyright (C)"
33               " 2023 PhiloSoft Design")
34
35     if len(args) != 1:
36         sys.stderr.write("Usage: delete [-s] del_file\n")
37         sys.exit(1)
38
39     # Read the file with bookmarks to delete
40     delete_urls = set()
41
42     del_file = open(args[0], 'rt')
43     for line in del_file:
44         delete_urls.add(line[:-1])  # strip trailing newline
45     del_file.close()
46
47     from storage import storage
48     storage = storage()
49
50     if report_stats:
51         sys.stdout.write("Loading %s: " % storage.filename)
52         sys.stdout.flush()
53
54     root_folder = storage.load()
55     from bkmk_objects import make_linear, break_tree
56     make_linear(root_folder)
57     objects = len(root_folder.linear)
58
59     if report_stats:
60         print("Ok")
61
62     # Run through the list of objects and store bookmarks indices
63     deleted = 0
64     del_idx = []
65     for object_no in range(objects):
66         object = root_folder.linear[object_no]
67
68         if object.isBookmark:
69             if object.href in delete_urls:
70                 del_idx.append(object_no)
71                 deleted += 1
72
73     if deleted and report_stats:
74         sys.stdout.write("Saving %s: " % storage.filename)
75         sys.stdout.flush()
76
77     if not deleted and report_stats:
78         sys.stdout.write("No need to save data\n")
79         sys.stdout.flush()
80
81     if deleted:
82         for idx in reversed(del_idx):
83             bookmark = root_folder.linear[idx]
84             folder = bookmark.parent
85             folder_indices = []
86             for object_no in range(len(folder)):
87                 object = folder[object_no]
88                 if object.isBookmark and object.href in delete_urls:
89                     folder_indices.append(object_no)
90             for _idx in reversed(folder_indices):
91                 del folder[_idx]
92             del root_folder.linear[idx]
93         break_tree(root_folder.linear)
94         storage.store(root_folder)
95
96     if deleted and report_stats:
97         print("Ok")
98         print(objects, "objects passed")
99         print(deleted, "objects deleted")
100
101
102 if __name__ == '__main__':
103     run()