forked from cvisionai/tator-py
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfind_empty_media.py
93 lines (85 loc) · 3.68 KB
/
find_empty_media.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python3
import argparse
import logging
import sys
from textwrap import dedent
import tator
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def parse_args():
parser = argparse.ArgumentParser(description=dedent('''\
Finds media that contains no streaming, no archival, or neither media.
Example:
python3 find_empty_media.py --host https://cloud.tator.io --token asdf --project 1 --section 1
'''), formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--host', help='Host containing source project.', required=True)
parser.add_argument('--token', help='Token for host containing source project.', required=True)
parser.add_argument('--project', help='Unique integer identifying project containing data to '
'be migrated.', required=True, type=int)
parser.add_argument('--sections', help='Section IDs to search for empty media.', nargs='+',
type=int)
return parser.parse_args()
def _delete_media(api, project, medias):
BATCH_SIZE = 100
num_deleted = 0
media_ids = [media.id for media in medias]
choice = input(f"This will delete {len(media_ids)} media. Continue [y/N]? ")
if choice == 'y':
for idx in range(0, len(media_ids), BATCH_SIZE):
response = api.delete_media_list(project, media_id=media_ids[idx:idx+BATCH_SIZE])
assert(isinstance(response, tator.models.MessageResponse))
num_deleted += BATCH_SIZE
logger.info(f"Deleted {num_deleted} media...")
logger.info(f"Deleted {len(media_ids)} media!")
else:
logger.info(f"Delete aborted!")
if __name__ == '__main__':
args = parse_args()
api = tator.get_api(host=args.host, token=args.token)
if args.sections:
medias = []
for section in args.sections:
medias += api.get_media_list(args.project, section=section)
else:
medias = api.get_media_list(project=args.project)
no_archival = []
no_streaming = []
neither = []
for media in medias:
if media.media_files is None:
no_archival.append(media)
no_streaming.append(media)
neither.append(media)
else:
has_archival = True
has_streaming = True
if media.media_files.archival is None:
has_archival = False
else:
if len(media.media_files.archival) == 0:
has_archival = False
if media.media_files.streaming is None:
has_streaming = False
else:
if len(media.media_files.streaming) == 0:
has_streaming = False
if not has_streaming:
no_streaming.append(media)
if not has_archival:
no_archival.append(media)
if not has_streaming and not has_archival:
neither.append(media)
logger.info(f"{len(no_streaming)} media have no streaming files.")
logger.info(f"{len(no_archival)} media have no archival files.")
logger.info(f"{len(neither)} media have neither streaming or archival files.")
choice = input("Delete empty media? \n 0: Do nothing.\n 1: Delete files with no streaming.\n "
"2: Delete files with no archival.\n 3: Delete files with no streaming or "
"archival.\n Selection [0/1/2/3]? ")
if choice == '1':
_delete_media(api, args.project, no_streaming)
elif choice == '2':
_delete_media(api, args.project, no_archival)
elif choice == '3':
_delete_media(api, args.project, neither)
else:
logger.info("No action taken!")