update api endpoints
This commit is contained in:
@@ -5,6 +5,7 @@ Produces anki output
|
|||||||
|
|
||||||
# Standard Library
|
# Standard Library
|
||||||
import random
|
import random
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
# Pip
|
# Pip
|
||||||
from genanki import Deck, Model, Note, Package
|
from genanki import Deck, Model, Note, Package
|
||||||
@@ -121,7 +122,9 @@ HSK_MODEL = Model(
|
|||||||
# Proccess
|
# Proccess
|
||||||
|
|
||||||
|
|
||||||
def output_anki_dictionary(process_file: ProcessFile, results: list[DictionaryResult]):
|
def output_anki_dictionary(
|
||||||
|
process_file: ProcessFile, results: list[DictionaryResult]
|
||||||
|
) -> Path:
|
||||||
"""Creates an anki file from a dictionary results"""
|
"""Creates an anki file from a dictionary results"""
|
||||||
final_file = process_file.output_name.with_suffix(".apkg")
|
final_file = process_file.output_name.with_suffix(".apkg")
|
||||||
deck_name = "::".join(
|
deck_name = "::".join(
|
||||||
@@ -146,9 +149,12 @@ def output_anki_dictionary(process_file: ProcessFile, results: list[DictionaryRe
|
|||||||
deck.add_note(note)
|
deck.add_note(note)
|
||||||
package.media_files = audios
|
package.media_files = audios
|
||||||
package.write_to_file(final_file)
|
package.write_to_file(final_file)
|
||||||
|
return final_file
|
||||||
|
|
||||||
|
|
||||||
def output_anki_phrase(process_file: ProcessFile, results: list[TranslationResult]):
|
def output_anki_phrase(
|
||||||
|
process_file: ProcessFile, results: list[TranslationResult]
|
||||||
|
) -> Path:
|
||||||
"""Creates an anki file from a phrases results"""
|
"""Creates an anki file from a phrases results"""
|
||||||
final_file = process_file.output_name.with_suffix(".apkg")
|
final_file = process_file.output_name.with_suffix(".apkg")
|
||||||
deck_name = "::".join(
|
deck_name = "::".join(
|
||||||
@@ -170,3 +176,4 @@ def output_anki_phrase(process_file: ProcessFile, results: list[TranslationResul
|
|||||||
audios.append(result.audio_path)
|
audios.append(result.audio_path)
|
||||||
package.media_files = audios
|
package.media_files = audios
|
||||||
package.write_to_file(final_file)
|
package.write_to_file(final_file)
|
||||||
|
return final_file
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from pathlib import Path
|
|||||||
# Local
|
# Local
|
||||||
from . import DATA_FOLDER
|
from . import DATA_FOLDER
|
||||||
from .anki_generation import output_anki_dictionary, output_anki_phrase
|
from .anki_generation import output_anki_dictionary, output_anki_phrase
|
||||||
from .constants import DICT_TYPE, INPUT, LANGUAGES, PHRASES_TYPE
|
from .constants import DICT_TYPE, INPUT, LANGUAGES, OUTPUT, PHRASES_TYPE, RESOURCES
|
||||||
from .proccessor import dictionary_pre_process, dictionary_process, translator_process
|
from .proccessor import dictionary_pre_process, dictionary_process, translator_process
|
||||||
from .utility import CCCEDICT, TRANS, TTS, ProcessFile
|
from .utility import CCCEDICT, TRANS, TTS, ProcessFile
|
||||||
|
|
||||||
@@ -21,6 +21,16 @@ def get_data_folder() -> Path:
|
|||||||
return DATA_FOLDER
|
return DATA_FOLDER
|
||||||
|
|
||||||
|
|
||||||
|
def get_output_folder() -> Path:
|
||||||
|
"""Utility function, return the OUTPUT folder"""
|
||||||
|
return OUTPUT
|
||||||
|
|
||||||
|
|
||||||
|
def get_resources_folder() -> Path:
|
||||||
|
"""Utility function, return the RESOURCES folder"""
|
||||||
|
return RESOURCES
|
||||||
|
|
||||||
|
|
||||||
def list_input_files(search_path: Path = Path()) -> list[Path]:
|
def list_input_files(search_path: Path = Path()) -> list[Path]:
|
||||||
"""Return a list of files relative to the INPUT path"""
|
"""Return a list of files relative to the INPUT path"""
|
||||||
level = INPUT / search_path
|
level = INPUT / search_path
|
||||||
@@ -32,6 +42,19 @@ def is_file(file_path: Path) -> bool:
|
|||||||
return (INPUT / file_path).is_file()
|
return (INPUT / file_path).is_file()
|
||||||
|
|
||||||
|
|
||||||
|
def read_input_file(file_path: Path) -> str:
|
||||||
|
"""Reads an input file"""
|
||||||
|
return (INPUT / file_path).open(encoding="utf8", newline="\n").read()
|
||||||
|
|
||||||
|
|
||||||
|
def read_dictionary_file(process_file: ProcessFile, language_id: str) -> str:
|
||||||
|
"""Reads an dictionary resource file"""
|
||||||
|
process_file.language_id = language_id
|
||||||
|
return process_file.dictionary_resource_file.open(
|
||||||
|
encoding="utf8", newline="\n"
|
||||||
|
).read()
|
||||||
|
|
||||||
|
|
||||||
def select_file(file_path: Path) -> ProcessFile:
|
def select_file(file_path: Path) -> ProcessFile:
|
||||||
"""Given a relative path from `list_input_files`, return a ProcessFile"""
|
"""Given a relative path from `list_input_files`, return a ProcessFile"""
|
||||||
if (INPUT / file_path).is_file():
|
if (INPUT / file_path).is_file():
|
||||||
@@ -40,6 +63,40 @@ def select_file(file_path: Path) -> ProcessFile:
|
|||||||
raise ValueError(f"{file_path} is not a file")
|
raise ValueError(f"{file_path} is not a file")
|
||||||
|
|
||||||
|
|
||||||
|
def list_file_resources(file_path: ProcessFile):
|
||||||
|
"""Returns a list of a file_path resources files"""
|
||||||
|
return [file_path.resources.glob("*")]
|
||||||
|
|
||||||
|
|
||||||
|
def analize_input_files(search_path: Path = Path()) -> dict[str, list[Path]]:
|
||||||
|
"""Analaizes a path file, and returns input, resources and output files"""
|
||||||
|
data = {
|
||||||
|
"input": [],
|
||||||
|
"resources": [],
|
||||||
|
"output": [],
|
||||||
|
}
|
||||||
|
if search_path is None:
|
||||||
|
return data
|
||||||
|
input_path = INPUT / search_path
|
||||||
|
if input_path.is_file():
|
||||||
|
process_file = ProcessFile(search_path)
|
||||||
|
res_path = process_file.resources
|
||||||
|
outputs_path = process_file.out_folder
|
||||||
|
data["input"] = [search_path]
|
||||||
|
data["resources"] = [path.relative_to(RESOURCES) for path in res_path.glob("*")]
|
||||||
|
data["output"] = [
|
||||||
|
path.relative_to(OUTPUT)
|
||||||
|
for path in outputs_path.glob(f"{process_file.input_file.stem}*")
|
||||||
|
]
|
||||||
|
elif input_path.exists():
|
||||||
|
res_path = RESOURCES / search_path
|
||||||
|
outputs_path = OUTPUT / search_path
|
||||||
|
data["input"] = [path.relative_to(INPUT) for path in input_path.glob("*")]
|
||||||
|
data["resources"] = [path.relative_to(RESOURCES) for path in res_path.glob("*")]
|
||||||
|
data["output"] = [path.relative_to(OUTPUT) for path in outputs_path.glob("*")]
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def create_input_file(
|
def create_input_file(
|
||||||
name: str, file_type: str, text: str, sub_folder: Path = Path()
|
name: str, file_type: str, text: str, sub_folder: Path = Path()
|
||||||
) -> ProcessFile:
|
) -> ProcessFile:
|
||||||
@@ -57,30 +114,52 @@ def create_input_file(
|
|||||||
# write file
|
# write file
|
||||||
file_path = INPUT / relative
|
file_path = INPUT / relative
|
||||||
file_path.parent.mkdir(exist_ok=True, parents=True)
|
file_path.parent.mkdir(exist_ok=True, parents=True)
|
||||||
file_path.write_text(text, encoding="utf8")
|
file_path.write_text(text, encoding="utf8", newline="\n")
|
||||||
# create process_file for future
|
# create process_file for future
|
||||||
process_file = ProcessFile(relative)
|
process_file = ProcessFile(relative)
|
||||||
return process_file
|
return process_file
|
||||||
|
|
||||||
|
|
||||||
def process_a_file(process_file: ProcessFile, language_id: str):
|
def write_input_file(process_file: ProcessFile, text: str):
|
||||||
"""From a input_file, a language and an output type, process a file"""
|
with process_file.absolute_input_file.open(
|
||||||
|
"w", encoding="utf8", newline="\n"
|
||||||
|
) as file:
|
||||||
|
file.write(text)
|
||||||
|
|
||||||
|
|
||||||
|
def write_resource_file(process_file: ProcessFile, language_id: str, text: str):
|
||||||
|
process_file.language_id = language_id
|
||||||
|
with process_file.dictionary_resource_file.open(
|
||||||
|
"w", encoding="utf8", newline="\n"
|
||||||
|
) as file:
|
||||||
|
file.write(text)
|
||||||
|
|
||||||
|
|
||||||
|
def pre_process_a_dictionary_file(process_file: ProcessFile, language_id: str):
|
||||||
|
"""From a input_file, a language_id and an output type, process a file"""
|
||||||
|
process_file.language_id = language_id
|
||||||
|
CCCEDICT.create_cedict(language_id)
|
||||||
|
with process_file.absolute_input_file.open(
|
||||||
|
"r", encoding="utf8", newline="\n"
|
||||||
|
) as file:
|
||||||
|
words_list = [word.strip() for word in file.readlines() if word]
|
||||||
|
dictionary_pre_process(words_list, process_file)
|
||||||
|
|
||||||
|
|
||||||
|
def process_a_dictionary_file(process_file: ProcessFile, language_id: str) -> Path:
|
||||||
|
TTS.create_tts()
|
||||||
|
process_file.language_id = language_id
|
||||||
|
results = dictionary_process(process_file)
|
||||||
|
return output_anki_dictionary(process_file, results)
|
||||||
|
|
||||||
|
|
||||||
|
def process_a_phrases_file(process_file: ProcessFile, language_id: str) -> Path:
|
||||||
process_file.language_id = language_id
|
process_file.language_id = language_id
|
||||||
TTS.create_tts()
|
TTS.create_tts()
|
||||||
if PHRASES_TYPE in process_file.input_file.suffixes:
|
|
||||||
TRANS.create_translator(LANGUAGES.CN, language_id)
|
TRANS.create_translator(LANGUAGES.CN, language_id)
|
||||||
with process_file.absolute_input_file.open("r", encoding="utf8") as file:
|
with process_file.absolute_input_file.open(
|
||||||
|
"r", encoding="utf8", newline="\n"
|
||||||
|
) as file:
|
||||||
text_lines = [line.strip() for line in file.readlines()]
|
text_lines = [line.strip() for line in file.readlines()]
|
||||||
results = translator_process(text_lines, process_file)
|
results = translator_process(text_lines, process_file)
|
||||||
output_anki_phrase(process_file, results)
|
return output_anki_phrase(process_file, results)
|
||||||
elif DICT_TYPE in process_file.input_file.suffixes:
|
|
||||||
if not process_file.dictionary_resource_file.is_file():
|
|
||||||
CCCEDICT.create_cedict(language_id)
|
|
||||||
with process_file.absolute_input_file.open("r", encoding="utf8") as file:
|
|
||||||
words_list = [word.strip() for word in file.readlines()]
|
|
||||||
dictionary_pre_process(words_list, process_file)
|
|
||||||
else:
|
|
||||||
results = dictionary_process(process_file)
|
|
||||||
output_anki_dictionary(process_file, results)
|
|
||||||
else:
|
|
||||||
print("filetype not identified")
|
|
||||||
|
|||||||
@@ -184,6 +184,17 @@ class ProcessFile:
|
|||||||
"""The path for the resource tsv for dictionary files"""
|
"""The path for the resource tsv for dictionary files"""
|
||||||
return self.resources / f"dictionary.{self.language_id}.tsv"
|
return self.resources / f"dictionary.{self.language_id}.tsv"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def relative_dictionary_resource_file(self):
|
||||||
|
"""The path for the resource tsv for dictionary files"""
|
||||||
|
path = self.resources / f"dictionary.{self.language_id}.tsv"
|
||||||
|
return path.relative_to(RESOURCES)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def available_dictionary_languages(self):
|
||||||
|
"""for a Dictionary file loads the avaliable proceced languages"""
|
||||||
|
return [lan.suffixes[0][1:] for lan in self.resources.glob("dictionary.*.tsv")]
|
||||||
|
|
||||||
|
|
||||||
class TranslationResult:
|
class TranslationResult:
|
||||||
"""Result of a translated process"""
|
"""Result of a translated process"""
|
||||||
|
|||||||
Reference in New Issue
Block a user