megadetector 5.0.10__py3-none-any.whl → 5.0.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of megadetector might be problematic. Click here for more details.

Files changed (226) hide show
  1. {megadetector-5.0.10.dist-info → megadetector-5.0.11.dist-info}/LICENSE +0 -0
  2. {megadetector-5.0.10.dist-info → megadetector-5.0.11.dist-info}/METADATA +12 -11
  3. megadetector-5.0.11.dist-info/RECORD +5 -0
  4. megadetector-5.0.11.dist-info/top_level.txt +1 -0
  5. api/__init__.py +0 -0
  6. api/batch_processing/__init__.py +0 -0
  7. api/batch_processing/api_core/__init__.py +0 -0
  8. api/batch_processing/api_core/batch_service/__init__.py +0 -0
  9. api/batch_processing/api_core/batch_service/score.py +0 -439
  10. api/batch_processing/api_core/server.py +0 -294
  11. api/batch_processing/api_core/server_api_config.py +0 -98
  12. api/batch_processing/api_core/server_app_config.py +0 -55
  13. api/batch_processing/api_core/server_batch_job_manager.py +0 -220
  14. api/batch_processing/api_core/server_job_status_table.py +0 -152
  15. api/batch_processing/api_core/server_orchestration.py +0 -360
  16. api/batch_processing/api_core/server_utils.py +0 -92
  17. api/batch_processing/api_core_support/__init__.py +0 -0
  18. api/batch_processing/api_core_support/aggregate_results_manually.py +0 -46
  19. api/batch_processing/api_support/__init__.py +0 -0
  20. api/batch_processing/api_support/summarize_daily_activity.py +0 -152
  21. api/batch_processing/data_preparation/__init__.py +0 -0
  22. api/batch_processing/data_preparation/manage_local_batch.py +0 -2391
  23. api/batch_processing/data_preparation/manage_video_batch.py +0 -327
  24. api/batch_processing/integration/digiKam/setup.py +0 -6
  25. api/batch_processing/integration/digiKam/xmp_integration.py +0 -465
  26. api/batch_processing/integration/eMammal/test_scripts/config_template.py +0 -5
  27. api/batch_processing/integration/eMammal/test_scripts/push_annotations_to_emammal.py +0 -126
  28. api/batch_processing/integration/eMammal/test_scripts/select_images_for_testing.py +0 -55
  29. api/batch_processing/postprocessing/__init__.py +0 -0
  30. api/batch_processing/postprocessing/add_max_conf.py +0 -64
  31. api/batch_processing/postprocessing/categorize_detections_by_size.py +0 -163
  32. api/batch_processing/postprocessing/combine_api_outputs.py +0 -249
  33. api/batch_processing/postprocessing/compare_batch_results.py +0 -958
  34. api/batch_processing/postprocessing/convert_output_format.py +0 -397
  35. api/batch_processing/postprocessing/load_api_results.py +0 -195
  36. api/batch_processing/postprocessing/md_to_coco.py +0 -310
  37. api/batch_processing/postprocessing/md_to_labelme.py +0 -330
  38. api/batch_processing/postprocessing/merge_detections.py +0 -401
  39. api/batch_processing/postprocessing/postprocess_batch_results.py +0 -1904
  40. api/batch_processing/postprocessing/remap_detection_categories.py +0 -170
  41. api/batch_processing/postprocessing/render_detection_confusion_matrix.py +0 -661
  42. api/batch_processing/postprocessing/repeat_detection_elimination/find_repeat_detections.py +0 -211
  43. api/batch_processing/postprocessing/repeat_detection_elimination/remove_repeat_detections.py +0 -82
  44. api/batch_processing/postprocessing/repeat_detection_elimination/repeat_detections_core.py +0 -1631
  45. api/batch_processing/postprocessing/separate_detections_into_folders.py +0 -731
  46. api/batch_processing/postprocessing/subset_json_detector_output.py +0 -696
  47. api/batch_processing/postprocessing/top_folders_to_bottom.py +0 -223
  48. api/synchronous/__init__.py +0 -0
  49. api/synchronous/api_core/animal_detection_api/__init__.py +0 -0
  50. api/synchronous/api_core/animal_detection_api/api_backend.py +0 -152
  51. api/synchronous/api_core/animal_detection_api/api_frontend.py +0 -266
  52. api/synchronous/api_core/animal_detection_api/config.py +0 -35
  53. api/synchronous/api_core/animal_detection_api/data_management/annotations/annotation_constants.py +0 -47
  54. api/synchronous/api_core/animal_detection_api/detection/detector_training/copy_checkpoints.py +0 -43
  55. api/synchronous/api_core/animal_detection_api/detection/detector_training/model_main_tf2.py +0 -114
  56. api/synchronous/api_core/animal_detection_api/detection/process_video.py +0 -543
  57. api/synchronous/api_core/animal_detection_api/detection/pytorch_detector.py +0 -304
  58. api/synchronous/api_core/animal_detection_api/detection/run_detector.py +0 -627
  59. api/synchronous/api_core/animal_detection_api/detection/run_detector_batch.py +0 -1029
  60. api/synchronous/api_core/animal_detection_api/detection/run_inference_with_yolov5_val.py +0 -581
  61. api/synchronous/api_core/animal_detection_api/detection/run_tiled_inference.py +0 -754
  62. api/synchronous/api_core/animal_detection_api/detection/tf_detector.py +0 -165
  63. api/synchronous/api_core/animal_detection_api/detection/video_utils.py +0 -495
  64. api/synchronous/api_core/animal_detection_api/md_utils/azure_utils.py +0 -174
  65. api/synchronous/api_core/animal_detection_api/md_utils/ct_utils.py +0 -262
  66. api/synchronous/api_core/animal_detection_api/md_utils/directory_listing.py +0 -251
  67. api/synchronous/api_core/animal_detection_api/md_utils/matlab_porting_tools.py +0 -97
  68. api/synchronous/api_core/animal_detection_api/md_utils/path_utils.py +0 -416
  69. api/synchronous/api_core/animal_detection_api/md_utils/process_utils.py +0 -110
  70. api/synchronous/api_core/animal_detection_api/md_utils/sas_blob_utils.py +0 -509
  71. api/synchronous/api_core/animal_detection_api/md_utils/string_utils.py +0 -59
  72. api/synchronous/api_core/animal_detection_api/md_utils/url_utils.py +0 -144
  73. api/synchronous/api_core/animal_detection_api/md_utils/write_html_image_list.py +0 -226
  74. api/synchronous/api_core/animal_detection_api/md_visualization/visualization_utils.py +0 -841
  75. api/synchronous/api_core/tests/__init__.py +0 -0
  76. api/synchronous/api_core/tests/load_test.py +0 -110
  77. classification/__init__.py +0 -0
  78. classification/aggregate_classifier_probs.py +0 -108
  79. classification/analyze_failed_images.py +0 -227
  80. classification/cache_batchapi_outputs.py +0 -198
  81. classification/create_classification_dataset.py +0 -627
  82. classification/crop_detections.py +0 -516
  83. classification/csv_to_json.py +0 -226
  84. classification/detect_and_crop.py +0 -855
  85. classification/efficientnet/__init__.py +0 -9
  86. classification/efficientnet/model.py +0 -415
  87. classification/efficientnet/utils.py +0 -610
  88. classification/evaluate_model.py +0 -520
  89. classification/identify_mislabeled_candidates.py +0 -152
  90. classification/json_to_azcopy_list.py +0 -63
  91. classification/json_validator.py +0 -695
  92. classification/map_classification_categories.py +0 -276
  93. classification/merge_classification_detection_output.py +0 -506
  94. classification/prepare_classification_script.py +0 -194
  95. classification/prepare_classification_script_mc.py +0 -228
  96. classification/run_classifier.py +0 -286
  97. classification/save_mislabeled.py +0 -110
  98. classification/train_classifier.py +0 -825
  99. classification/train_classifier_tf.py +0 -724
  100. classification/train_utils.py +0 -322
  101. data_management/__init__.py +0 -0
  102. data_management/annotations/__init__.py +0 -0
  103. data_management/annotations/annotation_constants.py +0 -34
  104. data_management/camtrap_dp_to_coco.py +0 -238
  105. data_management/cct_json_utils.py +0 -395
  106. data_management/cct_to_md.py +0 -176
  107. data_management/cct_to_wi.py +0 -289
  108. data_management/coco_to_labelme.py +0 -272
  109. data_management/coco_to_yolo.py +0 -662
  110. data_management/databases/__init__.py +0 -0
  111. data_management/databases/add_width_and_height_to_db.py +0 -33
  112. data_management/databases/combine_coco_camera_traps_files.py +0 -206
  113. data_management/databases/integrity_check_json_db.py +0 -477
  114. data_management/databases/subset_json_db.py +0 -115
  115. data_management/generate_crops_from_cct.py +0 -149
  116. data_management/get_image_sizes.py +0 -188
  117. data_management/importers/add_nacti_sizes.py +0 -52
  118. data_management/importers/add_timestamps_to_icct.py +0 -79
  119. data_management/importers/animl_results_to_md_results.py +0 -158
  120. data_management/importers/auckland_doc_test_to_json.py +0 -372
  121. data_management/importers/auckland_doc_to_json.py +0 -200
  122. data_management/importers/awc_to_json.py +0 -189
  123. data_management/importers/bellevue_to_json.py +0 -273
  124. data_management/importers/cacophony-thermal-importer.py +0 -796
  125. data_management/importers/carrizo_shrubfree_2018.py +0 -268
  126. data_management/importers/carrizo_trail_cam_2017.py +0 -287
  127. data_management/importers/cct_field_adjustments.py +0 -57
  128. data_management/importers/channel_islands_to_cct.py +0 -913
  129. data_management/importers/eMammal/copy_and_unzip_emammal.py +0 -180
  130. data_management/importers/eMammal/eMammal_helpers.py +0 -249
  131. data_management/importers/eMammal/make_eMammal_json.py +0 -223
  132. data_management/importers/ena24_to_json.py +0 -275
  133. data_management/importers/filenames_to_json.py +0 -385
  134. data_management/importers/helena_to_cct.py +0 -282
  135. data_management/importers/idaho-camera-traps.py +0 -1407
  136. data_management/importers/idfg_iwildcam_lila_prep.py +0 -294
  137. data_management/importers/jb_csv_to_json.py +0 -150
  138. data_management/importers/mcgill_to_json.py +0 -250
  139. data_management/importers/missouri_to_json.py +0 -489
  140. data_management/importers/nacti_fieldname_adjustments.py +0 -79
  141. data_management/importers/noaa_seals_2019.py +0 -181
  142. data_management/importers/pc_to_json.py +0 -365
  143. data_management/importers/plot_wni_giraffes.py +0 -123
  144. data_management/importers/prepare-noaa-fish-data-for-lila.py +0 -359
  145. data_management/importers/prepare_zsl_imerit.py +0 -131
  146. data_management/importers/rspb_to_json.py +0 -356
  147. data_management/importers/save_the_elephants_survey_A.py +0 -320
  148. data_management/importers/save_the_elephants_survey_B.py +0 -332
  149. data_management/importers/snapshot_safari_importer.py +0 -758
  150. data_management/importers/snapshot_safari_importer_reprise.py +0 -665
  151. data_management/importers/snapshot_serengeti_lila.py +0 -1067
  152. data_management/importers/snapshotserengeti/make_full_SS_json.py +0 -150
  153. data_management/importers/snapshotserengeti/make_per_season_SS_json.py +0 -153
  154. data_management/importers/sulross_get_exif.py +0 -65
  155. data_management/importers/timelapse_csv_set_to_json.py +0 -490
  156. data_management/importers/ubc_to_json.py +0 -399
  157. data_management/importers/umn_to_json.py +0 -507
  158. data_management/importers/wellington_to_json.py +0 -263
  159. data_management/importers/wi_to_json.py +0 -441
  160. data_management/importers/zamba_results_to_md_results.py +0 -181
  161. data_management/labelme_to_coco.py +0 -548
  162. data_management/labelme_to_yolo.py +0 -272
  163. data_management/lila/__init__.py +0 -0
  164. data_management/lila/add_locations_to_island_camera_traps.py +0 -97
  165. data_management/lila/add_locations_to_nacti.py +0 -147
  166. data_management/lila/create_lila_blank_set.py +0 -557
  167. data_management/lila/create_lila_test_set.py +0 -151
  168. data_management/lila/create_links_to_md_results_files.py +0 -106
  169. data_management/lila/download_lila_subset.py +0 -177
  170. data_management/lila/generate_lila_per_image_labels.py +0 -515
  171. data_management/lila/get_lila_annotation_counts.py +0 -170
  172. data_management/lila/get_lila_image_counts.py +0 -111
  173. data_management/lila/lila_common.py +0 -300
  174. data_management/lila/test_lila_metadata_urls.py +0 -132
  175. data_management/ocr_tools.py +0 -874
  176. data_management/read_exif.py +0 -681
  177. data_management/remap_coco_categories.py +0 -84
  178. data_management/remove_exif.py +0 -66
  179. data_management/resize_coco_dataset.py +0 -189
  180. data_management/wi_download_csv_to_coco.py +0 -246
  181. data_management/yolo_output_to_md_output.py +0 -441
  182. data_management/yolo_to_coco.py +0 -676
  183. detection/__init__.py +0 -0
  184. detection/detector_training/__init__.py +0 -0
  185. detection/detector_training/model_main_tf2.py +0 -114
  186. detection/process_video.py +0 -703
  187. detection/pytorch_detector.py +0 -337
  188. detection/run_detector.py +0 -779
  189. detection/run_detector_batch.py +0 -1219
  190. detection/run_inference_with_yolov5_val.py +0 -917
  191. detection/run_tiled_inference.py +0 -935
  192. detection/tf_detector.py +0 -188
  193. detection/video_utils.py +0 -606
  194. docs/source/conf.py +0 -43
  195. md_utils/__init__.py +0 -0
  196. md_utils/azure_utils.py +0 -174
  197. md_utils/ct_utils.py +0 -612
  198. md_utils/directory_listing.py +0 -246
  199. md_utils/md_tests.py +0 -968
  200. md_utils/path_utils.py +0 -1044
  201. md_utils/process_utils.py +0 -157
  202. md_utils/sas_blob_utils.py +0 -509
  203. md_utils/split_locations_into_train_val.py +0 -228
  204. md_utils/string_utils.py +0 -92
  205. md_utils/url_utils.py +0 -323
  206. md_utils/write_html_image_list.py +0 -225
  207. md_visualization/__init__.py +0 -0
  208. md_visualization/plot_utils.py +0 -293
  209. md_visualization/render_images_with_thumbnails.py +0 -275
  210. md_visualization/visualization_utils.py +0 -1537
  211. md_visualization/visualize_db.py +0 -551
  212. md_visualization/visualize_detector_output.py +0 -406
  213. megadetector-5.0.10.dist-info/RECORD +0 -224
  214. megadetector-5.0.10.dist-info/top_level.txt +0 -8
  215. taxonomy_mapping/__init__.py +0 -0
  216. taxonomy_mapping/map_lila_taxonomy_to_wi_taxonomy.py +0 -491
  217. taxonomy_mapping/map_new_lila_datasets.py +0 -154
  218. taxonomy_mapping/prepare_lila_taxonomy_release.py +0 -142
  219. taxonomy_mapping/preview_lila_taxonomy.py +0 -591
  220. taxonomy_mapping/retrieve_sample_image.py +0 -71
  221. taxonomy_mapping/simple_image_download.py +0 -218
  222. taxonomy_mapping/species_lookup.py +0 -834
  223. taxonomy_mapping/taxonomy_csv_checker.py +0 -159
  224. taxonomy_mapping/taxonomy_graph.py +0 -346
  225. taxonomy_mapping/validate_lila_category_mappings.py +0 -83
  226. {megadetector-5.0.10.dist-info → megadetector-5.0.11.dist-info}/WHEEL +0 -0
@@ -1,246 +0,0 @@
1
- """
2
-
3
- directory_listing.py
4
-
5
- Script for creating Apache-style HTML directory listings for a local directory
6
- and all its subdirectories.
7
-
8
- Also includes a preview of a jpg file (the first in an alphabetical list),
9
- if present.
10
-
11
- """
12
-
13
- #%% Imports
14
-
15
- import os
16
- import sys
17
- import argparse
18
- import re
19
-
20
- import azure.common
21
- from azure.storage.blob import BlobServiceClient, ContentSettings
22
-
23
- from md_utils.path_utils import is_image_file
24
-
25
-
26
- #%% Directory enumeration functions
27
-
28
- def create_plain_index(root, dirs, files, dirname=None):
29
- """
30
- Creates the fairly plain HTML folder index including a preview of a single image file,
31
- if any is present.
32
-
33
- Args:
34
- root (str): path to the root directory, all paths in [dirs] and
35
- [files] are relative to this root folder
36
- dirs (list): list of strings, the directories in [root]
37
- files (list): list of strings, the files in [root]
38
- dirname (str, optional): name to print in the html,
39
- which may be different than [root]
40
-
41
- Returns:
42
- str: HTML source of the directory listing
43
- """
44
-
45
- if dirname is None:
46
- dirname = root or '/'
47
-
48
- html = "<!DOCTYPE html>\n"
49
- html += "<html lang='en'><head>"
50
- html += "<title>Index of {}</title>\n".format(dirname)
51
- html += "<meta charset='UTF-8'>\n"
52
- html += "<style>\n"
53
- html += "body { font-family: Segoe UI, Helvetica, Arial, sans-serif; }\n"
54
- html += "a { text-decoration:none; }\n"
55
- html += "</style>\n"
56
- html += "</head><body>\n"
57
-
58
- html += "<h1>Index of {}</h1>\n".format(dirname)
59
-
60
- # Insert preview image
61
- jpg_files = [f for f in files if is_image_file(f)]
62
-
63
- if len(jpg_files) > 0:
64
-
65
- # This is slow, so defaulting to just the first image:
66
- #
67
- # Use the largest image file as this is most likely to contain
68
- # useful content.
69
- #
70
- # jpg_file_sizes = [os.path.getsize(f) for f in jpg_files]
71
- # largest_file_index = max(range(len(jpg_files)), key=lambda x: jpg_file_sizes[x])
72
-
73
- html += "<a href='{0}'><img style='height:200px; float:right;' src='{0}' alt='Preview image'></a>\n".format(jpg_files[0])
74
- else:
75
- html += "\n"
76
- # html += "<p style='width:15em; float:right; margin:0;'>[No preview available]</p>\n"
77
-
78
- if root:
79
- html += "<p><a href='../index.html'>To parent directory</a></p>\n"
80
- else:
81
- html += "\n"
82
- # html += "<p>This is the root directory.</p>\n"
83
-
84
- html += "<h2>Folders</h2>\n"
85
- if len(dirs) > 0:
86
- html += "<ul style='list-style-type: none; padding-left:1em;'>\n"
87
- for dir in sorted(dirs):
88
- html += "<li>&#128193; <a href='{0}/index.html'>{0}</a></li>\n".format(dir)
89
- html += "</ul>\n"
90
- else:
91
- html += "<p style='padding-left:1em;'>No folders</p>\n"
92
-
93
- html += "<h2>Files</h2>\n"
94
- if len(files) > 0:
95
- html += "<ul style='list-style-type: none; padding-left:1em;'>\n"
96
- for fname in sorted(files):
97
- if is_image_file(fname):
98
- html += "<li>&#128443; <a href='{0}'>{0}</a></li>\n".format(fname)
99
- else:
100
- html += "<li>&#128442; <a href='{0}'>{0}</a></li>\n".format(fname)
101
- html += "</ul>\n"
102
- else:
103
- html += "<p style = 'padding-left:1em;'>No files</p>\n"
104
-
105
- # Add some space at the bottom because the browser's status bar might hide stuff
106
- html += "<p style='margin:2em;'>&nbsp;</p>\n"
107
- html += "</body></html>\n"
108
- return html
109
-
110
- # ...def create_plain_index(...)
111
-
112
-
113
- def traverse_and_create_index(dir, sas_url=None, overwrite_files=False,
114
- template_fun=create_plain_index, basepath=None):
115
- """
116
- Recursively traverses the local directory [dir] and generates a index
117
- file for each folder using [template_fun] to generate the HTML output.
118
- Excludes hidden files.
119
-
120
- Args:
121
- dir (str): directory to process
122
- sas_url (str, optional): write-capable SAS URL that points to the same place as
123
- [dir], used for the very esoteric scenario where [dir] is really a mounted
124
- blob container, and we want to set the content-type on each file so the resulting
125
- index can be viewed in a browser
126
- overwrite_files (bool, optional): whether to over-write existing index file
127
- template_fun (func, optional): function taking three arguments (string,
128
- list of string, list of string) representing the current root, the list of folders,
129
- and the list of files. Should return the HTML source of the index file.
130
- basepath (str, optional): if not None, the name used for each subfolder in [dir]
131
- in the output files will be relative to [basepath]
132
- """
133
-
134
- print('Traversing {}'.format(dir))
135
-
136
- # Make sure we remove the trailing /
137
- dir = os.path.normpath(dir)
138
-
139
- # If we want to set the content type in blob storage using a SAS URL
140
- if sas_url:
141
-
142
- # Example: sas_url = 'https://accname.blob.core.windows.net/bname/path/to/folder?st=...&se=...&sp=...&...'
143
- if '?' in sas_url:
144
- # 'https://accname.blob.core.windows.net/bname/path/to/folder' and 'st=...&se=...&sp=...&...'
145
- base_url, sas_token = sas_url.split('?', 1)
146
- else:
147
- # 'https://accname.blob.core.windows.net/bname/path/to/folder' and None
148
- base_url, sas_token = sas_url, None
149
- # Remove https:// from base url
150
- # 'accname.blob.core.windows.net/bname/path/to/folder'
151
- base_url = base_url.split("//", 1)[1]
152
- # Everything up to the first dot is account name
153
- # 'accname'
154
- account_name = base_url.split(".", 1)[0]
155
- # get everything after the first /
156
- # 'bname/path/to/folder'
157
- query_string = base_url.split("/", 1)[1]
158
- # Get container name and subfolder
159
- if '/' in query_string:
160
- # 'bname', 'path/to/folder'
161
- container_name, container_folder = query_string.split("/", 1)
162
- else:
163
- container_name, container_folder = query_string, ''
164
-
165
- # Prepare the storage access
166
- target_settings = ContentSettings(content_type='text/html')
167
- blob_service = BlobServiceClient(
168
- account_url=f'{account_name}.blob.core.windows.net',
169
- credential=sas_token)
170
-
171
- # Traverse directory and all sub directories, excluding hidden files
172
- for root, dirs, files in os.walk(dir):
173
-
174
- # Exclude files and folders that are hidden
175
- files = [f for f in files if not f[0] == '.']
176
- dirs[:] = [d for d in dirs if not d[0] == '.']
177
-
178
- # Output is written to file *root*/index.html
179
- output_file = os.path.join(root, "index.html")
180
-
181
- if not overwrite_files and os.path.isfile(output_file):
182
- print('Skipping {}, file exists'.format(output_file))
183
- continue
184
-
185
- print("Generating {}".format(output_file))
186
-
187
- # Generate HTML with template function
188
- dirname = None
189
- if basepath is not None:
190
- dirname = os.path.relpath(root,basepath)
191
- html = template_fun(root[len(dir):], dirs, files, dirname)
192
-
193
- # Write to file
194
- with open(output_file, 'wt') as fi:
195
- fi.write(html)
196
-
197
- # Set content type in blob storage
198
- if sas_url:
199
- if container_folder:
200
- output_blob_path = container_folder + '/' + output_file[len(dir) + 1:]
201
- else:
202
- output_blob_path = output_file[len(dir) + 1:]
203
- try:
204
- blob_client = blob_service.get_blob_client(container_name, output_blob_path)
205
- blob_client.set_http_headers(content_settings=target_settings)
206
- except azure.common.AzureMissingResourceHttpError:
207
- print('ERROR: It seems the SAS URL is incorrect or does not allow setting properties.')
208
- return
209
-
210
- # ...def traverse_and_create_index(...)
211
-
212
-
213
- #%% Command-line driver
214
-
215
- def main():
216
-
217
- parser = argparse.ArgumentParser()
218
-
219
- parser.add_argument("directory", type=str,
220
- help='Path to directory which should be traversed.')
221
- parser.add_argument("--basepath", type=str,
222
- help='Folder names will be printed relative to basepath, if specified',
223
- default=None)
224
- parser.add_argument("--sas_url", type=str,
225
- help='Blobfuse does not set the content-type property ' + \
226
- 'properly and hence index.html won\'t be accessible in the browser. If you want to set the ' + \
227
- 'content-type in the corresponding blob storage, provide the SAS URL that corresponds to the ' + \
228
- 'directory, e.g. if *directory* is /mountpoint/path/to/folder, then *--sas_url* looks like ' + \
229
- '"https://accname.blob.core.windows.net/bname/path/to/folder?st=...&se=...&sp=...&..."')
230
- parser.add_argument("--enable_overwrite", action='store_true', default=False,
231
- help='If set, the script will overwrite existing index.html files.')
232
-
233
- if len(sys.argv[1:]) == 0:
234
- parser.print_help()
235
- parser.exit()
236
-
237
- args = parser.parse_args()
238
-
239
- assert os.path.isdir(args.directory), "{} is not a valid directory".format(args.directory)
240
- assert re.match('https?://[^\.]+\.blob\.core\.windows\.net/.+', args.sas_url), "--sas_url does not " + \
241
- "match the format https://accname.blob.core.windows.net/bname/path/to/folder?..."
242
-
243
- traverse_and_create_index(args.directory, overwrite_files=args.enable_overwrite, sas_url=args.sas_url, basepath=args.basepath)
244
-
245
- if __name__ == '__main__':
246
- main()