# -*- coding: utf-8 -*-
#################################################################################
# MIT License
#
# Copyright (c) 2025 Duncan Fraser
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#################################################################################
#
# File : config_dump.py
#
# Author : Duncan Fraser <dfraser@thedrunkencoder.uk>
#
# Description :
#
#################################################################################
import inspect
from typing import Any, TextIO
from .config_load import (
driveMappingConfig,
generalConfig,
kodiConfig,
movieConfig,
tvConfig,
)
[docs]
def writeAttributes(configIO: TextIO, object: Any) -> None:
"""Write Attributes or Methods of object to file
:param configIO: Writable Text I/O object
:param object: Configuration Object
"""
for field in object.__annotations__:
doc = inspect.getcomments(getattr(object, field))
if doc is not None:
configIO.writelines(["# " + i + "\n" for i in doc.split("\n")])
if type(getattr(object, field)) == str or type(getattr(object, field)) == bool:
configIO.write('{0}="{1}"'.format(field, getattr(object, field)))
else:
configIO.write("{0}={1}".format(field, getattr(object, field)))
configIO.write("\n")
[docs]
def writeGeneralConfig(
configIO: TextIO, general_config: generalConfig = generalConfig()
) -> None:
"""Write General Configuration to file
:param configIO: Writable Text I/O object
:param general_config: General Configuration
"""
doc = inspect.getdoc(general_config)
if doc is not None:
configIO.writelines(["# " + i + "\n" for i in doc.split("\n")])
configIO.write("[general]\n")
writeAttributes(configIO=configIO, object=general_config)
configIO.write("\n")
[docs]
def writeKodiConfig(configIO: TextIO, kodi_config: kodiConfig = kodiConfig()) -> None:
"""Write Kodi Configuration to file
:param configIO: Writable Text I/O object
:param kodi_config: Kodi Configuration
"""
doc = inspect.getdoc(kodi_config)
if doc is not None:
configIO.writelines(["# " + i + "\n" for i in doc.split("\n")])
configIO.write("[kodi]\n")
writeAttributes(configIO=configIO, object=kodi_config)
configIO.write("\n")
[docs]
def writeMovieConfig(
configIO: TextIO, movie_config: movieConfig = movieConfig()
) -> None:
"""Write Movie Configuration to file
:param configIO: Writable Text I/O object
:param movie_config: Movie Configuration
"""
if movie_config.outputDirectory is None:
movie_config.outputDirectory = ""
doc = inspect.getdoc(movie_config)
if doc is not None:
configIO.writelines(["# " + i + "\n" for i in doc.split("\n")])
configIO.write("[movie]\n")
writeAttributes(configIO=configIO, object=movie_config)
configIO.write("\n")
[docs]
def writeTvConfig(configIO: TextIO, tv_config: tvConfig = tvConfig()) -> None:
"""Write TV Configuration to file
:param configIO: Writable Text I/O object
:param tv_config: TV Configuration
"""
if tv_config.outputDirectory is None:
tv_config.outputDirectory = ""
doc = inspect.getdoc(tv_config)
if doc is not None:
configIO.writelines(["# " + i + "\n" for i in doc.split("\n")])
configIO.write("[tv]\n")
writeAttributes(configIO=configIO, object=tv_config)
configIO.write("\n")
[docs]
def writeDriveMapping(
configIO: TextIO,
drive_mapping: driveMappingConfig = driveMappingConfig(src="", dest=""),
) -> None:
"""Write Drive mapping configuration to file
:param configIO: Writable Text I/O object
:param drive_mapping: Drive Mapping Configuration
"""
doc = inspect.getdoc(drive_mapping)
if doc is not None:
configIO.writelines(["# " + i + "\n" for i in doc.split("\n")])
configIO.write("[[drive_mapping]]\n")
writeAttributes(configIO=configIO, object=drive_mapping)
configIO.write("\n")
[docs]
def writeDefaultConfig(configIO: TextIO) -> None:
"""Write default configuration to file
:param configIO: Writable Text I/O object
"""
writeGeneralConfig(configIO=configIO)
writeKodiConfig(configIO=configIO)
writeMovieConfig(configIO=configIO)
writeTvConfig(configIO=configIO)
writeDriveMapping(configIO=configIO)