class EarthExplorer(object): """Access Earth Explorer portal.""" def __init__(self, username, password): """Access Earth Explorer portal.""" self.session = requests.session() self.login(username, password) self.api = API(username, password) def logged_in(self): """Check if the log-in has been successfull. Search for the log-out URL in the portal html body. """ rsp = self.session.get(EE_URL) return EE_LOGOUT_URL in rsp.text def login(self, username, password): """Login to Earth Explorer.""" rsp = self.session.get(EE_LOGIN_URL) csrf, ncform = _get_tokens(rsp.text) payload = { 'username': username, 'password': password, 'csrf_token': csrf, '__ncforminfo': ncform } rsp = self.session.post(EE_LOGIN_URL, data=payload, allow_redirects=False) if not self.logged_in(): raise EarthExplorerError('EE: login failed.') def logout(self): """Log out from Earth Explorer.""" self.session.get(EE_LOGOUT_URL) def _download(self, url, output_dir, file_size, chunk_size=1024): """Download remote file given its URL.""" with tqdm(total=file_size, unit_scale=True, unit='B') as pbar: with self.session.get(url, stream=True, allow_redirects=True) as r: local_filename = r.headers['Content-Disposition'].split( '=')[-1] local_filename = os.path.join(output_dir, local_filename) with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=chunk_size): if chunk: f.write(chunk) pbar.update(chunk_size) return local_filename def download(self, scene_id, output_dir): """Download a Landsat scene given its identifier and an output directory. """ dataset = guess_dataset(scene_id) if is_product_id(scene_id): scene_id = self.api.lookup(dataset, [scene_id], inverse=True)[0] url = EE_DOWNLOAD_URL.format(folder=EE_FOLDER[dataset], sid=scene_id) filename = self._download(url, output_dir, file_size=SIZES[dataset]) return filename
class EarthExplorer(object): """Access Earth Explorer portal.""" def __init__(self, username, password): """Access Earth Explorer portal.""" self.session = requests.session() self.login(username, password) self.api = API(username, password) def logged_in(self): """Check if the log-in has been successfull based on session cookies.""" eros_sso = self.session.cookies.get("EROS_SSO_production_secure") return bool(eros_sso) def login(self, username, password): """Login to Earth Explorer.""" rsp = self.session.get(EE_LOGIN_URL) csrf, ncform = _get_tokens(rsp.text) payload = { 'username': username, 'password': password, 'csrf': csrf, '__ncforminfo': ncform } rsp = self.session.post(EE_LOGIN_URL, data=payload, allow_redirects=True) if not self.logged_in(): raise EarthExplorerError('EE: login failed.') def logout(self): """Log out from Earth Explorer.""" self.session.get(EE_LOGOUT_URL) def _download(self, url, output_dir, chunk_size=1024): """Download remote file given its URL.""" with self.session.get(url, stream=True, allow_redirects=True) as r: file_size = int(r.headers.get("Content-Length")) with tqdm(total=file_size, unit_scale=True, unit='B', unit_divisor=1024) as pbar: local_filename = r.headers['Content-Disposition'].split( '=')[-1] local_filename = local_filename.replace("\"", "") local_filename = os.path.join(output_dir, local_filename) with open(local_filename, 'wb') as f: for chunk in r.iter_content(chunk_size=chunk_size): if chunk: f.write(chunk) pbar.update(chunk_size) return local_filename def download(self, scene_id, output_dir): """Download a Landsat scene given its identifier and an output directory. """ os.makedirs(output_dir, exist_ok=True) dataset = guess_dataset(scene_id) if is_product_id(scene_id): scene_id = self.api.lookup(dataset, [scene_id], inverse=True)[0] url = EE_DOWNLOAD_URL.format(dataset_id=DATASETS[dataset], scene_id=scene_id) filename = self._download(url, output_dir) return filename