Source code for hvpy.helpers

import time
from typing import Union, Optional
from pathlib import Path
from datetime import datetime

from hvpy.api_groups.movies.queue_movie import queueMovieInputParameters
from hvpy.api_groups.screenshots.take_screenshot import takeScreenshotInputParameters
from hvpy.facade import downloadMovie, downloadScreenshot, getMovieStatus, queueMovie, takeScreenshot
from hvpy.utils import _add_shared_docstring, save_file

__all__ = [
    "createMovie",
    "createScreenshot",
]


[docs]@_add_shared_docstring(queueMovieInputParameters) def createMovie( startTime: datetime, endTime: datetime, layers: str, events: str, eventsLabels: bool, imageScale: float, format: str = "mp4", frameRate: str = "15", maxFrames: Optional[str] = None, scale: Optional[bool] = None, scaleType: Optional[str] = None, scaleX: Optional[float] = None, scaleY: Optional[float] = None, movieLength: Optional[float] = None, watermark: bool = True, width: Optional[int] = None, height: Optional[int] = None, x0: Optional[int] = None, y0: Optional[int] = None, x1: Optional[int] = None, y1: Optional[int] = None, x2: Optional[int] = None, y2: Optional[int] = None, size: int = 0, movieIcons: Optional[int] = None, followViewport: Optional[int] = None, reqObservationDate: Optional[datetime] = None, overwrite: bool = False, filename: Optional[Union[str, Path]] = None, hq: bool = False, timeout: float = 5, ) -> Path: """ Automatically creates a movie using `queueMovie`, `getMovieStatus` and `downloadMovie` functions. Parameters ---------- overwrite Whether to overwrite the file if it already exists. Default is `False`. filename The path to save the file to. Optional, will default to ``f"{res['title']}.{format}"``. hq Download a higher-quality movie file (valid for "mp4" movies only, ignored otherwise). Default is `False`, optional. timeout The timeout in minutes to wait for the movie to be created. Default is 5 minutes. {Insert} Examples -------- >>> from hvpy import createMovie, DataSource, create_events, create_layers >>> from datetime import datetime, timedelta >>> movie_location = createMovie( ... startTime=datetime.today() - timedelta(days=15, minutes=5), ... endTime=datetime.today() - timedelta(days=15), ... layers=create_layers([(DataSource.AIA_171, 100)]), ... events=create_events(["AR"]), ... eventsLabels=True, ... imageScale=1, ... filename="my_movie", ... ) >>> # This is to cleanup the file created from the example >>> # you don't need to do this >>> from pathlib import Path >>> Path('my_movie.mp4').unlink() """ input_params = locals() # These are used later on but we want to avoid passing # them into queueMovie. overwrite = input_params.pop("overwrite") filename = input_params.pop("filename") hq = input_params.pop("hq") timeout = input_params.pop("timeout") res = queueMovie(**input_params) if res.get("error"): raise RuntimeError(res["error"]) timeout_counter = time.time() + 60 * timeout # Default 5 minutes title = "" while True: status = getMovieStatus( id=res["id"], format=format, token=res["token"], ) if status["status"] in [0, 1]: time.sleep(3) if status["status"] == 2: title = status["title"] break if time.time() > timeout_counter: raise RuntimeError(f"Exceeded timeout of {timeout} minutes.") if status["status"] == 3: raise RuntimeError(status["error"]) binary_data = downloadMovie( id=res["id"], format=format, hq=hq, ) if filename is None: filename = f"{title}.{format}" else: filename = f"{filename}.{format}" filename = save_file( data=binary_data, filename=filename, overwrite=overwrite, ) return filename
[docs]@_add_shared_docstring(takeScreenshotInputParameters) def createScreenshot( date: datetime, imageScale: float, layers: str, events: Optional[str] = None, eventLabels: bool = False, scale: bool = False, scaleType: Optional[str] = None, scaleX: Optional[int] = None, scaleY: Optional[int] = None, width: Optional[int] = None, height: Optional[int] = None, x0: Optional[int] = None, y0: Optional[int] = None, x1: Optional[int] = None, y1: Optional[int] = None, x2: Optional[int] = None, y2: Optional[int] = None, watermark: bool = False, overwrite: bool = False, filename: Optional[Union[str, Path]] = None, ) -> Path: """ Automatically creates a screenshot using `takeScreenshot`, `downloadScreenshot` functions. Parameters ---------- overwrite Whether to overwrite the file if it already exists. Default is `False`. filename The path to save the file to. Optional, will default to ``f"{res['id']}_{date.date()}.png"``. {Insert} Examples -------- >>> from hvpy import createScreenshot, DataSource, create_events, create_layers, EventType >>> from datetime import datetime, timedelta >>> screenshot_location = createScreenshot( ... date=datetime.today() - timedelta(days=15), ... layers=create_layers([(DataSource.AIA_171, 100)]), ... events=create_events([EventType.ACTIVE_REGION]), ... eventLabels=True, ... imageScale=1, ... x0=0, ... y0=0, ... width=100, ... height=100, ... filename="my_screenshot", ... ) >>> # This is to cleanup the file created from the example >>> # you don't need to do this >>> from pathlib import Path >>> Path('my_screenshot.png').unlink() """ input_params = locals() # These are used later on but we want to avoid passing # them into takeScreenshot. input_params.pop("overwrite") input_params.pop("filename") res = takeScreenshot(**input_params) if res.get("error"): raise RuntimeError(res["error"]) binary_data = downloadScreenshot( id=res["id"], ) if filename is None: filename = f"{res['id']}_{date.date()}.png" else: filename = f"{filename}.png" filename = save_file( data=binary_data, filename=filename, overwrite=overwrite, ) return filename