Files
mopidy-radionet/venv/lib/python3.7/site-packages/mopidy/internal/storage.py
2020-01-18 20:01:00 +01:00

60 lines
1.4 KiB
Python

import gzip
import json
import logging
import pathlib
import tempfile
from mopidy import models
logger = logging.getLogger(__name__)
def load(path):
"""
Deserialize data from file.
:param path: full path to import file
:type path: pathlib.Path
:return: deserialized data
:rtype: dict
"""
# TODO: raise an exception in case of error?
if not path.is_file():
logger.info("File does not exist: %s", path)
return {}
try:
with gzip.open(str(path), "rb") as fp:
return json.load(fp, object_hook=models.model_json_decoder)
except (OSError, ValueError) as exc:
logger.warning(f"Loading JSON failed: {exc}")
return {}
def dump(path, data):
"""
Serialize data to file.
:param path: full path to export file
:type path: pathlib.Path
:param data: dictionary containing data to save
:type data: dict
"""
# TODO: cleanup directory/basename.* files.
tmp = tempfile.NamedTemporaryFile(
prefix=path.name + ".", dir=str(path.parent), delete=False
)
tmp_path = pathlib.Path(tmp.name)
try:
data_string = json.dumps(
data, cls=models.ModelJSONEncoder, indent=2, separators=(",", ": ")
)
with gzip.GzipFile(fileobj=tmp, mode="wb") as fp:
fp.write(data_string.encode())
tmp_path.rename(path)
finally:
if tmp_path.exists():
tmp_path.unlink()