From 9ad190705e2767701842d9b8b22199795eff36e3 Mon Sep 17 00:00:00 2001 From: cjnaz Date: Mon, 8 Jun 2020 13:07:24 -0700 Subject: [PATCH] v1.1 --- README.md | 115 +++++++++++++++++++++++++++++++++++++++++++--------- xbsjsonedit | 65 +++++++++++++++++++++++------ 2 files changed, 149 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 266a1d3..f5269e8 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,68 @@ # xbsjsonedit -xbsjsonedit is a limited tool for modifying backup data dumped from the +xbsjsonedit is a tool for working with backup data dumped from the [xBrowserSync App](https://www.xbrowsersync.org/) ([GitHub](https://github.com/xBrowserSync)). -It was originally developed for cleanup up bookmark replication problems in early releases -of the App. This tool may be useful for pruning duplicate bookmarks and general maintenance. -If you want it to do other functions, grab the code and go for it. + +xbsjsonedit supports both interactive and command line modes/features. Interactive mode is targeted at +editing your bookmark content, specifically looking for duplicate bookmarks and errors introduced by earlier versions +of xBrowserSync. + +Command line (CLI) modes support searching and printing select views of your bookmark data. The `--html` mode outputs a +browser-loadable web page with your bookmarks organized by tag name. See more info below. + +## Notable changes in the latest release +V1.10 200608 +- Added `--html` command line mode which generates html output of your tagged bookmarks. +- Changed the command line interface so that the input file defaults to the newest xbs_backup*.json file in your specified +directory (per the JSON_PATH_DEFAULT assignment in the code). The input file may also be specified using the +`--jsonbackup` command line switch. +- Added `SearchTerm` command line mode feature, which prints matches within tags, and with the `--bookmark` switch prints matches +within bookmark titles and URLs. + ## Usage ``` $ ./xbsjsonedit -h -usage: xbsjsonedit [-h] [--print] [--tags TAGS] [--names] [-V] Infile +usage: xbsjsonedit [-h] [--bookmarks] [--print] [--tags TAGS] [--names] + [--html HTML] [--jsonbackup JSONBACKUP] [-V] + [SearchTerm] xBrowserSync json backup editor +Usages: + Command line modes: + xbsjsonedit news prints bookmarks tagged with 'news' + xbsjsonedit news --bookmarks prints bookmarks tagged with 'news' and any bookmarks or URLs containing 'news' + xbsjsonedit --print prints all bookmarks with their hierarchy + xbsjsonedit --tags 5 prints only tag names that are used at least 5 times + xbsjsonedit --tags 5 --names prints tag names and their bookmarks that are used at least 5 times + xbsjsonedit --tags 0 --names prints tag names and their bookmark that are used exactly 1 time + xbsjsonedit --html writes tagged bookmarks to the specified browsable file + + Interactive mode: + xbsjsonedit Enters interactive mode + + The path to the xbs_backup*.json file defaults to the newest in the download directory. --jsonbackup overrides the default. + positional arguments: - Infile json backup file. + SearchTerm Print bookmarks tagged with this text (CLI mode). optional arguments: -h, --help show this help message and exit - --print, -p Print bookmark hierarchy (redirect to less or a file). - --tags TAGS, -t TAGS Print tags list filtered by tags with a minimum number of uses. n=0 prints only single use tags. - --names, -n Used with --tags to enable printing the titles/names for each tag. + --bookmarks, -b Print bookmarks containing or tagged with the SearchTerm (CLI mode). + --print, -p Print complete bookmark hierarchy (redirect to less or a file) (CLI mode). + --tags TAGS, -t TAGS Print tags list filtered by tags with a minimum number of uses. n=0 prints only single use tags. (CLI mode) + --names, -n Used with --tags to enable printing the titles/names for each tag. (CLI mode) + --html HTML Path of html output file. + --jsonbackup JSONBACKUP, -j JSONBACKUP + Path to json backup file. Default is newest version at . -V, --version Return version number and exit. + ``` -## Internal command menu +## Usage notes for Interactive mode ``` -$ ./xbsjsonedit xBrowserSyncBackup_201811232150.json +$ ./xbsjsonedit --------------------------------------------------------------------- Options: @@ -53,21 +89,18 @@ Options: w: Write out the bookmarks data to a file q: Quit/exit (Do a Write first!) - -Enter option: ``` -## Usage notes -Five modes are supported Listing/Deleting based on: +By default, the most recent `xbs_backup*.json` file in your `JSON_PATH_DEFAULT` directory is opened if `--jsonbackup` is not specified on the command line. Customize the `JSON_PATH_DEFAULT` Windows and/or Linux settings in the code. + +The `p` Print function prints the full list of bookmarks in folder hierarchical form, listing the ID number and Title of each folder and bookmark. + +Interactive mode supports five modes of Listing/Deleting based on: - A search string in bookmarks or folders - Duplicate URLs in bookmarks - such as the same URL existing in two or more folders - Duplicate folder names - Folders that have tags - there is no value for folders having tags - Empty folders - which may arise if all bookmarks were deleted from a folder -The Print function prints the full list of bookmarks in folder hierarchical form, listing the ID number and Title of each folder and bookmark. The `--Print` switch may be used for getting a good visual dump of the bookmarks in less or an editor for reference while using the interactive mode. The tags on each bookmark are listed as well. - -The `--tags ` switch prints each tag where the number of bookmarks with that tag >= ``. Optionally include the `--names` switch to list the bookmark titles/names for each tag. `--tags 0` is a special case that prints only tags that have exactly one occurrence, which may be useful for finding extraneous/remnant tags usage. - A lower case letter `t/g/d/f/x/y` will list the offenders, while an upper case letter `T/G/D/F/X/Y` will allow for selective deletes of the offenders. The lower case List operation need not be run before running the upper case Delete operation. Delete functions support individual bookmark selection, or all that match the selection mode. @@ -80,6 +113,49 @@ The output file defaults to the Infile + "_OUT", and can be specified during the - **Note** [_may no longer be the case_]: xBrowserSync will allow you to restore to (blast) your current syncID, so you may want to Disable Sync, then create a new sync before restoring the modified bookmarks. - **NOTE** that tags are not restored by xBrowserSync if sync is disabled. To recover, simply enable sync and do another restore. +## Usage nodes for Command Line Interface (CLI) mode + +By default, the most recent `xbs_backup*.json` file in your `JSON_PATH_DEFAULT` directory is opened if `--jsonbackup` is not specified on the command line. Customize the `JSON_PATH_DEFAULT` Windows and/or Linux settings in the code. + +The `--Print` switch may be used for getting a good visual dump of the bookmarks in less or an editor for reference while using the interactive mode. (Same output as 'p' print in interactive mode.) + +If the optional SearchTerm command line argument is specified, all _tags_ containing the SearchTerm substring are printed, along with the names/titles of the bookmarks that have the matching tags. If the `--bookmarks` switch is also specified, then the names/titles of bookmarks that have the substring in their name, URL, or tag are also printed. For example, SearchTerm `cam` matches tags `camping` and `webcam`, and several bookmarks: +``` +$ ./xbsjsonedit cam --bookmarks +***** Bookmarks tagged with : + [camping] (2): + All Stays camping locations + Big Bend National Park Texas + + [webcam] (5): + NAU web cam 1 + ADEQ Webcams + AZ Game and Fish Webcams + ADOT traffic cams + Flagstaff webcams + + +***** Bookmarks containing or tagged with : + Cambria Bicycle Outfitter - We Outfit the world in bicycles and bicycle parts + Camping World - Home Page + NAU web cam 1 + Fry's Home Electronics | Computer Parts & Accessories, Software, Games, TVs, Cameras - Frys.com + Newegg.com - Computer Parts, Laptops, Electronics, HDTVs, Digital Cameras and More! + ADEQ Webcams + AZ Game and Fish Webcams + ADOT traffic cams + Flagstaff webcams + All Stays camping locations + Big Bend National Park Texas +``` + +The `--tags ` switch prints each tag where the number of bookmarks with that tag >= ``. Optionally include the `--names` switch to list the bookmark titles/names for each tag. `--tags 0` is a special case that prints only tags that have exactly one occurrence, which may be useful for finding extraneous/remnant tags usage. + +The `--html ` switch outputs a web page to the specified file that contains all tags with two (default) or more bookmarks. `--tags ` may be specified to override the default minimum tag usage count. +- Note that untagged bookmarks, and bookmarks with tags that are used less than the `--tags` count (default 2), are not output to the outfile.html. +- is statically generated on-demand from a backup file, and thus does track bookmark changes made within xBrowserSync. +- You probably do not want to post this output file on a publicly visible server. +- The `--html` mode/feature is intended as a prototype web page that xBrowserSync may output natively in a future release, so it may not be feature-complete for your needs. ## Known issues: @@ -88,6 +164,7 @@ The output file defaults to the Infile + "_OUT", and can be specified during the ## Version history +- 200608 v1.1 Added cli search and html features, defaulted .json file to be the newest in the download directory. - 200330 v1.0 Merged pull request #3 from mblais (add unbuffered getch input; add 'all' option), Reworked --tags and --names switches. - 191206 v0.3 Added tags dump - 191205 v0.2 Updated to xbrowsersync v1.5 and Python 3.x ONLY diff --git a/xbsjsonedit b/xbsjsonedit index dcb083e..0007372 100755 --- a/xbsjsonedit +++ b/xbsjsonedit @@ -3,12 +3,13 @@ Usages: Command line modes: - xbsjsonedit news prints bookmarks tagged with 'news' - xbsjsonedit news --bookmarks prints bookmarks tagged with 'news' and any bookmarks or URLs containing 'news' - xbsjsonedit --print prints all bookmarks with their hierarchy - xbsjsonedit --tags 5 prints only tag names that are used at least 5 times - xbsjsonedit --tags 5 --names prints tag names and their bookmarks that are used at least 5 times - xbsjsonedit --tags 0 --names prints tag names and their bookmark that are used exactly 1 time + xbsjsonedit news prints bookmarks tagged with 'news' + xbsjsonedit news --bookmarks prints bookmarks tagged with 'news' and any bookmarks or URLs containing 'news' + xbsjsonedit --print prints all bookmarks with their hierarchy + xbsjsonedit --tags 5 prints only tag names that are used at least 5 times + xbsjsonedit --tags 5 --names prints tag names and their bookmarks that are used at least 5 times + xbsjsonedit --tags 0 --names prints tag names and their bookmark that are used exactly 1 time + xbsjsonedit --html writes tagged bookmarks to the specified browsable file Interactive mode: xbsjsonedit Enters interactive mode @@ -16,13 +17,13 @@ Usages: The path to the xbs_backup*.json file defaults to the newest in the download directory. --jsonbackup overrides the default. """ -__version__ = "v1.1 200604" +__version__ = "v1.1 200608" #========================================================== # # Chris Nelson 2018 - 2020 # -# 200604 v1.1 Added cli search features, defaulted .json file to be the newest in download directory. +# 200608 v1.1 Added cli search and html features, defaulted .json file to be the newest in the download directory. # 200330 v1.0 Merged pull request #3 from mblais (add unbuffered getch input; add 'all' option), Reworked --tags and --names switches. # 191206 v0.3 Added tags dump # 191205 v0.2 Updated to xbrowsersync v1.5 and Python 3.x ONLY @@ -82,6 +83,45 @@ def main(): digin(parent=json_dict["xbrowsersync"]["data"]["bookmarks"], parent_id="", path="/", search_term="", operation="printtree") sys.exit() + + if args.html is not None: + digin(parent=json_dict["xbrowsersync"]["data"]["bookmarks"], parent_id="", path="/", search_term="", operation="GatherTags") + tags_count = 2 + if args.tags > 0: + tags_count = args.tags + + html_fout = io.open (args.html, 'wt') + html_fout.write(""" + + + xbs Tags + + + + +

Tagged bookmarks list

+ """) + html_fout.write(f'(Tags used {tags_count} or more times)
\n') + + for tag in sorted(tags_dict.keys()): + if len(tags_dict[tag]) >= tags_count: + html_fout.write(f' {tag}
\n') + html_fout.write("
\n") + + for tag in sorted(tags_dict.keys()): + if len(tags_dict[tag]) >= tags_count: + html_fout.write(f'

{tag} ({len(tags_dict[tag])}):

\n') + html_fout.write('
\n') + for bookmark in tags_dict[tag]: + html_fout.write (' {}
\n'.format(bookmark['url'], bookmark['title'])) + html_fout.write(' (top)\n') + html_fout.write('
\n') + + html_fout.write(" ") + html_fout.close() + sys.exit() + + if args.tags > -1: digin(parent=json_dict["xbrowsersync"]["data"]["bookmarks"], parent_id="", path="/", search_term="", operation="GatherTags") for tag in sorted(tags_dict.keys()): @@ -100,6 +140,7 @@ def main(): print() sys.exit() + if args.SearchTerm is not None: _search_term = args.SearchTerm.lower() print (f"***** Bookmarks tagged with <{_search_term}>:") @@ -219,10 +260,8 @@ Options: print ("\nMatches: {} Deletes: {}\n".format(match_cnt, change_cnt)) elif select == 'w': - # ans = prompt_long("Output file name (default <{}>: ".format(args.Infile + OFILESUFFIX)) ans = prompt_long("Output file name (default <{}>: ".format(infile + OFILESUFFIX)) if ans == "": - # ans = args.Infile + OFILESUFFIX ans = infile + OFILESUFFIX with io.open(ans, "w", encoding='utf8') as ofile: json.dump(json_dict, ofile, ensure_ascii=False, indent=2) @@ -396,9 +435,9 @@ def digin(parent, parent_id, path, search_term, operation, commit=False, indent= if item["tags"] != None: for tag in item["tags"]: if tag not in tags_dict: - tags_dict[tag] = [{"title":item["title"], "id":item["id"]}] + tags_dict[tag] = [{"title":item["title"], "id":item["id"], "url":item["url"]}] else: - tags_dict[tag].append({"title":item["title"], "id":item["id"]}) + tags_dict[tag].append({"title":item["title"], "id":item["id"], "url":item["url"]}) @@ -632,6 +671,8 @@ if __name__ == '__main__': help="Print tags list filtered by tags with a minimum number of uses. n=0 prints only single use tags. (CLI mode)") parser.add_argument('--names', '-n', action='store_true', help="Used with --tags to enable printing the titles/names for each tag. (CLI mode)") + parser.add_argument('--html', type=str, + help=f"Path of html output file.") parser.add_argument('--jsonbackup', '-j', type=str, help=f"Path to json backup file. Default is newest version at <{JSON_PATH_DEFAULT}xbs_backup*.json>.") parser.add_argument('-V', '--version',