Module pycollector.project
Expand source code Browse git
import os
import vipy
import warnings
import numpy as np
import pandas as pd
import json
import ast
from pycollector.globals import print, GLOBALS
from pycollector.video import Video
from pycollector.user import User
class Project(User):
"""collector.project.Project class
Projects() are sets of CollectionInstances() and Instances() in a program.
"""
def __init__(
self,
project=None,
program=None,
weeksago=None,
monthsago=None,
daysago=None,
since=None,
before=None,
alltime=False,
last=None,
retry=2,
username=None,
password=None,
):
super().__init__(username=username, password=password)
if not self.refresh().is_authenticated():
self.login()
self._projects = None
self._programid = self.cognito_username if program is None else program
self.df = pd.DataFrame()
# Get data from backend lambda function
# Invoke Lambda function
request = {
"program": self._programid,
"project": project,
"weeksago": weeksago,
"monthsago": monthsago,
"daysago": daysago,
"since": since,
"alltime": alltime,
"Video_IDs": None,
"before": before,
"week": None,
"pycollector_id": self.cognito_username,
"last": last,
}
FunctionName = self.get_ssm_param(GLOBALS["LAMBDA"]["get_project"])
for k in range(0, retry):
try:
response = self.lambda_client.invoke(
FunctionName=FunctionName,
InvocationType="RequestResponse",
LogType="Tail",
# Payload=json.dumps(request),
Payload=bytes(json.dumps(request), encoding="utf8"),
)
# Get the serialized dataframe
dict_str = response["Payload"].read().decode("UTF-8")
if dict_str == "null":
raise ValueError("Invalid lambda function response")
data_dict = ast.literal_eval(dict_str)
if 'body' in data_dict:
serialized_videos_data_dict = data_dict["body"]["videos"]
if len(serialized_videos_data_dict) > 0:
data_df = pd.read_json(serialized_videos_data_dict)
self.df = data_df
else:
self.df = []
else:
raise ValueError('Invalid request - Error "%s"' % (str(data_dict)))
except Exception as e:
if "expired" in str(e):
self.login() # try one more time
else:
raise
#print("[pycollector.project]: Returned %d videos" % len(self.df))
def __repr__(self):
return str("<pycollector.project: program=%s, videos=%d>" % (self._programid, len(self)))
def __len__(self):
return len(self.df)
def __getitem__(self, k):
if isinstance(k, int):
return Video(mp4url=self.df.iloc[k].raw_video_file_path, jsonurl=self.df.iloc[k].annotation_file_path)
elif isinstance(k, slice):
return [Video(mp4url=v, jsonurl=a) for (v, a) in zip(self.df.iloc[k].raw_video_file_path, self.df.iloc[k].annotation_file_path)]
else:
raise ValueError('Invalid index "%s"' % (str(k)))
def videos(self):
return sorted([v for v in self], key=lambda v: v.uploaded(), reverse=True)
def last(self, n=1):
assert len(self) >= n, "Invalid length (videos=%d < n=%d)" % (len(self), n)
V = self.videos()[-n:]
return V if n > 1 else V[0]
Classes
class Project (project=None, program=None, weeksago=None, monthsago=None, daysago=None, since=None, before=None, alltime=False, last=None, retry=2, username=None, password=None)-
collector.project.Project class
Projects() are sets of CollectionInstances() and Instances() in a program.
Args
username:[str]- username of pycollector.
password:[str], optional- password for the user. Defaults to None.
Expand source code Browse git
class Project(User): """collector.project.Project class Projects() are sets of CollectionInstances() and Instances() in a program. """ def __init__( self, project=None, program=None, weeksago=None, monthsago=None, daysago=None, since=None, before=None, alltime=False, last=None, retry=2, username=None, password=None, ): super().__init__(username=username, password=password) if not self.refresh().is_authenticated(): self.login() self._projects = None self._programid = self.cognito_username if program is None else program self.df = pd.DataFrame() # Get data from backend lambda function # Invoke Lambda function request = { "program": self._programid, "project": project, "weeksago": weeksago, "monthsago": monthsago, "daysago": daysago, "since": since, "alltime": alltime, "Video_IDs": None, "before": before, "week": None, "pycollector_id": self.cognito_username, "last": last, } FunctionName = self.get_ssm_param(GLOBALS["LAMBDA"]["get_project"]) for k in range(0, retry): try: response = self.lambda_client.invoke( FunctionName=FunctionName, InvocationType="RequestResponse", LogType="Tail", # Payload=json.dumps(request), Payload=bytes(json.dumps(request), encoding="utf8"), ) # Get the serialized dataframe dict_str = response["Payload"].read().decode("UTF-8") if dict_str == "null": raise ValueError("Invalid lambda function response") data_dict = ast.literal_eval(dict_str) if 'body' in data_dict: serialized_videos_data_dict = data_dict["body"]["videos"] if len(serialized_videos_data_dict) > 0: data_df = pd.read_json(serialized_videos_data_dict) self.df = data_df else: self.df = [] else: raise ValueError('Invalid request - Error "%s"' % (str(data_dict))) except Exception as e: if "expired" in str(e): self.login() # try one more time else: raise #print("[pycollector.project]: Returned %d videos" % len(self.df)) def __repr__(self): return str("<pycollector.project: program=%s, videos=%d>" % (self._programid, len(self))) def __len__(self): return len(self.df) def __getitem__(self, k): if isinstance(k, int): return Video(mp4url=self.df.iloc[k].raw_video_file_path, jsonurl=self.df.iloc[k].annotation_file_path) elif isinstance(k, slice): return [Video(mp4url=v, jsonurl=a) for (v, a) in zip(self.df.iloc[k].raw_video_file_path, self.df.iloc[k].annotation_file_path)] else: raise ValueError('Invalid index "%s"' % (str(k))) def videos(self): return sorted([v for v in self], key=lambda v: v.uploaded(), reverse=True) def last(self, n=1): assert len(self) >= n, "Invalid length (videos=%d < n=%d)" % (len(self), n) V = self.videos()[-n:] return V if n > 1 else V[0]Ancestors
Methods
def last(self, n=1)-
Expand source code Browse git
def last(self, n=1): assert len(self) >= n, "Invalid length (videos=%d < n=%d)" % (len(self), n) V = self.videos()[-n:] return V if n > 1 else V[0] def videos(self)-
Expand source code Browse git
def videos(self): return sorted([v for v in self], key=lambda v: v.uploaded(), reverse=True)
Inherited members