60 lines
1.4 KiB
Python
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()
|