Create gerar_ark.py
This commit is contained in:
parent
c9e7fc1235
commit
3b0e163bd4
255
gerar_ark.py
Normal file
255
gerar_ark.py
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
import time
|
||||||
|
import random
|
||||||
|
import os
|
||||||
|
import yaml
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Códigos de escape ANSI para cores
|
||||||
|
RESET = "\033[0m"
|
||||||
|
RED = "\033[91m"
|
||||||
|
GREEN = "\033[92m"
|
||||||
|
YELLOW = "\033[93m"
|
||||||
|
BLUE = "\033[94m"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
# Configurações iniciais para gerar o ARK
|
||||||
|
config_geral = {
|
||||||
|
|
||||||
|
"prefixo": "eM", # Você pode escolher o melhor para você ou deixar uma string vazia se não quiser usar prefixo
|
||||||
|
"qtde_digitos": 3, # Quantidade de dígitos sem contar o prefixo. Na Editora Moan estamos usando 3, mas você pode mudar de acordo com suas necessidades
|
||||||
|
"naan": "68745", # NAAN da Editora Moan na Ark Alliance
|
||||||
|
"simbolos": "23456789bBdDfFgGhHjJmMnNpPqQrRtT", # Símbolos permitidos na geração do ark. Sinta-se a vontade, se quiser mudar.
|
||||||
|
"pasta_yaml": "yaml", # Nome da pasta em que o programa verificará se já existe o ARK gerado. Nessa pasta, são armazenados os metadados em yaml do ARK gerado
|
||||||
|
"pasta_json": "json", # Nessa pasta, são armazenados os metadados em json do ARK gerado
|
||||||
|
"chave_primaria_yaml": "moan-dados" # Você pode escolher uma outra chave primária. Fazemos isso porque na Editora Moan usamos o Quarto Sistema de Publicações Científicas e os metadados sao armazenados em yaml. Mais especificamente no arquivo de configuração _quarto.yml. Como nesse arquivo existem diversas configurações, usamos a chave moan-dados para colocar os metadados que usaremos para gerar os identificadores ARK.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
print(BLUE+"\n\n================================= \n\nBem-vindo ao script Moan ARK! \n\n=================================\n"+RESET)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
func = input("\n+++++++++++++++++++++++++++++++++++++++++++\nInforme o número da função a ser executada.\n \n As Opções são:\n \n"+YELLOW+" 1 - Criar um identificador ARK\n 2 - Atualizar um identificador ARK\n 3 - Sair\n"+RESET+"+++++++++++++++++++++++++++++++++++++++++++\n➜ ")
|
||||||
|
|
||||||
|
if func == "3":
|
||||||
|
|
||||||
|
print(RED+"\nSaindo do programa...\n"+RESET)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
break # Isso sairá do loop while e encerrará o programa.
|
||||||
|
|
||||||
|
elif func not in ["1", "2", "3"]:
|
||||||
|
|
||||||
|
print(RED+"\nOpção não reconhecida. Por favor, escolha 1, 2 ou 3.\n"+RESET)
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
metadados = input("\nInsira o nome do arquivo de metadados com o caminho completo, incluindo a extensão (.yml). O arquivo deve ser um YAML e a chave inicial do arquivo .yml dve ser moan-dados.\n➜ ")
|
||||||
|
|
||||||
|
if func == "1":
|
||||||
|
|
||||||
|
nivel = input("\nQual o nível do identificador ARK deseja criar?\n \n"+YELLOW+" 1 - Nível Inicial \n 2 - Nível Secundário \n 3 - ARK de Variação\n"+RESET+"➜ ")
|
||||||
|
|
||||||
|
if nivel == "1":
|
||||||
|
|
||||||
|
criar_identificador_ARK(config_geral, metadados, nivel)
|
||||||
|
|
||||||
|
|
||||||
|
elif nivel == "2" or nivel == "3":
|
||||||
|
|
||||||
|
ark_pai = input("\nInsira o identificador ARK. Coloque o identificador ARK completo até onde você deseja criar um novo nível ou uma nova variação. Mas não coloque o rótulo ark: e nem o naan. Exemplo: ark:/68745/eM37b/pM.MG. Veja que o ARK inicial é eM37b, temos o filho pM e a variação MG. Vamos supor que queremos criar mais um filho de eM37b, então só colocaríamos eM37b. Agora, se a ideia é criar um filho para a variação MG do filho pM, colocaríamos eM37b/pM.MG. Lembre-se que os ARK filhos são partes da obra, por exemplo, fascículos de uma coleção; já, a variação ocorre quando temos formatos diferentes da mesma obra, como pdf, online, epub ou ainda com idiomas diferentes.\n➜ ")
|
||||||
|
|
||||||
|
criar_identificador_ARK(config_geral, metadados, nivel, ark_pai)
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print(RED+"\nOpção não reconhecida. Por favor, escolha 1, 2 ou 3. \n"+RESET)
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif func == "2":
|
||||||
|
|
||||||
|
atualizar_identificador_ARK()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def filtrar(config_geral, ark):
|
||||||
|
|
||||||
|
# essa função transforma o identificador ARK na forma em que os arquivos ARK são nomeados. Um ark pode ter ":" (dois pontos), "/" (barra) ou "." (ponto). Mas isso, em um nome de arquivo atrapalha a url. Assim, transformaremos : em _dp_, / em _b_ e . em _p_.
|
||||||
|
|
||||||
|
ark = ark.replace("/", "_b_").replace(".", "_p_")
|
||||||
|
|
||||||
|
ark = "ark_dp_" + ark
|
||||||
|
|
||||||
|
return ark
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def criar_identificador_ARK(config_geral, metadados, nivel, ark_pai=None):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# pegando as configurações gerais
|
||||||
|
prefixo = config_geral["prefixo"]
|
||||||
|
|
||||||
|
qtde_digitos = config_geral["qtde_digitos"]
|
||||||
|
|
||||||
|
naan = config_geral["naan"]
|
||||||
|
|
||||||
|
simbolos = config_geral["simbolos"]
|
||||||
|
|
||||||
|
pasta_yaml = config_geral["pasta_yaml"]
|
||||||
|
|
||||||
|
pasta_json = config_geral["pasta_json"]
|
||||||
|
|
||||||
|
chave_primaria_yaml = config_geral["chave_primaria_yaml"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# criando o ARK de nível 1
|
||||||
|
if nivel == "1":
|
||||||
|
|
||||||
|
print(BLUE+"\nCriando o identificador ARK...\n"+RESET)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
ark = naan + "/" + prefixo
|
||||||
|
|
||||||
|
|
||||||
|
for i in range(qtde_digitos):
|
||||||
|
|
||||||
|
numero_sorteado = random.randint(0, 31)
|
||||||
|
|
||||||
|
ark += simbolos[numero_sorteado]
|
||||||
|
|
||||||
|
|
||||||
|
ark_filtrado = filtrar(config_geral, ark)
|
||||||
|
|
||||||
|
nome_arquivo_ark_yml = ark_filtrado + ".yml"
|
||||||
|
|
||||||
|
caminho_completo_gravacao_yml = os.path.join(pasta_yaml, nome_arquivo_ark_yml)
|
||||||
|
|
||||||
|
|
||||||
|
# Verificar se o arquivo já existe na pasta yaml. Se existir, gerar um novo identificador ARK. Agora, se não existir, pega o caminho do metadados e cria o arquivo, lançando a mensagem de ARK criado com sucesso...
|
||||||
|
|
||||||
|
if os.path.exists(caminho_completo_gravacao_yml):
|
||||||
|
|
||||||
|
print(RED+f"\nO identificador 'ark:{ark}' já existe. \nVamos gerar outro. Aguarde...\n"+RESET)
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
# Verifique se o arquivo YAML com os metadados para gerar o ARK existe. Aqui na Editora Moan, usamos o arquivo _quarto.yml
|
||||||
|
if not os.path.exists(metadados):
|
||||||
|
|
||||||
|
print(RED+"\nArquivo YAML não encontrado.\n"+RESET)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
# Mensagem de ARK criado com sucesso. Iniciando a gravação dos metadados...
|
||||||
|
print(GREEN+f"\nO identificador 'ark:{ark}' foi criado com sucesso!\n\nAgora vamos gravar os metadados e gerar os arquivos nas pastas correspondentes... Aguarde...\n"+RESET)
|
||||||
|
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Carregue o arquivo YAML
|
||||||
|
with open(metadados, 'r', encoding='utf-8') as arquivo_yaml:
|
||||||
|
|
||||||
|
dados_yaml = yaml.load(arquivo_yaml, Loader=yaml.FullLoader)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Verifique se 'chave_primaria_yaml' (no caso da Editora Moan, ela é moan-dados) existe e 'ark' não existe dentro dele
|
||||||
|
if chave_primaria_yaml in dados_yaml and 'ark' not in dados_yaml[chave_primaria_yaml]:
|
||||||
|
|
||||||
|
# Adicione 'ark' ao 'chave_primaria_yaml' com o valor de ark. Quero que o ark seja a primeira chave, por isso coloquei da forma que está abaixo
|
||||||
|
dados_yaml[chave_primaria_yaml] = {'ark' : ark, **dados_yaml[chave_primaria_yaml]}
|
||||||
|
|
||||||
|
# Salve os dados atualizados no arquivo original
|
||||||
|
with open(metadados, 'w', encoding='utf-8') as arquivo_yaml:
|
||||||
|
|
||||||
|
yaml.dump(dados_yaml, arquivo_yaml, default_style='', sort_keys=False, allow_unicode=True)
|
||||||
|
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
# Ou a chave moan-dados não foi configurada no arquivo YAML com os metadados (o arquivo _quarto.yml, no caso da Editora Moan), ou então a chave ark já existe, o que indica que você deve usar a função de atualizar, e não gerar um novo ARK.
|
||||||
|
|
||||||
|
print(RED+f"\nOu a chave chave_primaria_yaml, que está registrada como {chave_primaria_yaml} no dicionário Python config_geral no início da função main, não foi configurada no arquivo YAML com os metadados (o arquivo _quarto.yml, no caso da Editora Moan), ou então a chave ark já existe, o que indica que você deve usar a função de atualizar, e não gerar um novo ARK.\n"+RESET)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Crie um novo dicionário contendo apenas os dados da chave_primaria_yaml 'moan-dados'
|
||||||
|
metadados_yaml_a_gravar = dados_yaml[chave_primaria_yaml]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Salve os dados atualizados em um novo arquivo YAML
|
||||||
|
with open(caminho_completo_gravacao_yml, 'w', encoding='utf-8') as novo_arquivo_yaml:
|
||||||
|
|
||||||
|
yaml.dump(metadados_yaml_a_gravar, novo_arquivo_yaml, default_style='', sort_keys=False, allow_unicode=True, default_flow_style=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Converta os dados para JSON
|
||||||
|
metadados_json_a_gravar = json.dumps(dados_yaml[chave_primaria_yaml], ensure_ascii=False, indent=2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Salve os dados JSON em um arquivo JSON
|
||||||
|
caminho_completo_gravacao_json = os.path.join(pasta_json, ark_filtrado + '.json')
|
||||||
|
|
||||||
|
with open(caminho_completo_gravacao_json, 'w', encoding='utf-8') as novo_arquivo_json:
|
||||||
|
|
||||||
|
novo_arquivo_json.write(metadados_json_a_gravar)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print(BLUE+f"\n*********************\n*********************\n\n"+GREEN+"O identificador "+YELLOW+f"'ark:{ark}'"+GREEN+" foi criado com sucesso e os seus "+YELLOW+"metadados foram gravados.\n\n"+BLUE+"*********************\n*********************\n"+RESET)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def atualizar_identificador_ARK():
|
||||||
|
|
||||||
|
print("Função de atualização de identificador ARK")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
main()
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user