You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
427 lines
16 KiB
427 lines
16 KiB
# Panel de contenido (Sveltia CMS).
|
|
#
|
|
# Escribe los mismos archivos Markdown de `src/content/`, así que nada de lo
|
|
# que ya funciona cambia: el esquema los sigue validando al compilar, git sigue
|
|
# guardando el historial de cada letra y el catálogo sigue sin hacer consultas.
|
|
#
|
|
# Los campos de aquí replican el esquema de `src/lib/content/schema.ts`. Cuando
|
|
# se añada un campo allí, hay que añadirlo también aquí, o el panel lo borrará
|
|
# al guardar una entrada.
|
|
|
|
backend:
|
|
name: github
|
|
# Cambiar por el repositorio real cuando exista. Trabajando en local no se
|
|
# usa: el flujo local abre la carpeta del proyecto desde el propio navegador.
|
|
repo: senzapaura/senzapaura
|
|
branch: main
|
|
|
|
# Dónde aterrizan las imágenes que se suban desde el panel. Si prefieres
|
|
# agruparlas por disco (static/images/<album>/), se mueven a mano después: al
|
|
# esquema le vale cualquier ruta que empiece por "/".
|
|
media_folder: static/images
|
|
public_folder: /images
|
|
|
|
collections:
|
|
# ---------------------------------------------------------------- estilos
|
|
- name: estilos
|
|
label: Estilos
|
|
label_singular: Estilo
|
|
description: Cada estilo es un segmento de la página de música.
|
|
folder: src/content/estilos
|
|
identifier_field: nombre
|
|
create: true
|
|
slug: '{{slug}}'
|
|
summary: '{{nombre}}'
|
|
fields:
|
|
- { name: nombre, label: Nombre, widget: string }
|
|
- name: resumen
|
|
label: Resumen
|
|
widget: string
|
|
required: false
|
|
hint: Una frase corta; acompaña al título del segmento.
|
|
- name: orden
|
|
label: Orden
|
|
widget: number
|
|
value_type: int
|
|
min: 0
|
|
default: 10
|
|
hint: Menor número, más arriba en la página de música.
|
|
- name: principal
|
|
label: Estilo principal
|
|
widget: boolean
|
|
default: false
|
|
required: false
|
|
hint: Solo uno puede serlo. Es el que abre la portada.
|
|
- { name: imagen, label: Imagen del segmento, widget: image, required: false }
|
|
- name: body
|
|
label: Texto introductorio
|
|
widget: markdown
|
|
required: false
|
|
|
|
# ---------------------------------------------------------------- álbumes
|
|
- name: albumes
|
|
label: Álbumes
|
|
label_singular: Álbum
|
|
description: Discos, EPs, singles y colecciones.
|
|
folder: src/content/albumes
|
|
identifier_field: titulo
|
|
create: true
|
|
slug: '{{slug}}'
|
|
summary: '{{titulo}} · {{fecha}}'
|
|
fields:
|
|
- { name: titulo, label: Título, widget: string }
|
|
- name: estilo
|
|
label: Estilo
|
|
widget: relation
|
|
collection: estilos
|
|
value_field: '{{slug}}'
|
|
display_fields: [nombre]
|
|
search_fields: [nombre]
|
|
- { name: fecha, label: Fecha de publicación, widget: datetime, date_format: 'YYYY-MM-DD', time_format: false, picker_utc: true }
|
|
- name: tipo
|
|
label: Tipo
|
|
widget: select
|
|
default: album
|
|
options: [album, ep, single, coleccion]
|
|
- { name: portada, label: Portada, widget: image, required: false }
|
|
- { name: sello, label: Sello, widget: string, required: false }
|
|
- { name: resumen, label: Resumen, widget: string, required: false }
|
|
- { name: destacado, label: Destacado, widget: boolean, default: false, required: false }
|
|
- name: edicion
|
|
label: Datos de edición
|
|
widget: object
|
|
required: false
|
|
collapsed: true
|
|
fields:
|
|
- { name: numeroCatalogo, label: Nº de catálogo, widget: string, required: false }
|
|
- name: formatos
|
|
label: Formatos
|
|
widget: select
|
|
multiple: true
|
|
required: false
|
|
options: [digital, cd, vinilo, casete]
|
|
- { name: pais, label: País, widget: string, required: false }
|
|
- name: creditos
|
|
label: Créditos del disco
|
|
widget: list
|
|
required: false
|
|
label_singular: Crédito
|
|
summary: '{{rol}}: {{nombre}}'
|
|
fields:
|
|
- { name: rol, label: Cometido, widget: string }
|
|
- { name: nombre, label: Nombre, widget: string }
|
|
- name: enlaces
|
|
label: Enlaces de escucha
|
|
widget: object
|
|
required: false
|
|
collapsed: true
|
|
fields:
|
|
- { name: spotify, label: Spotify, widget: string, required: false }
|
|
- { name: appleMusic, label: Apple Music, widget: string, required: false }
|
|
- { name: youtube, label: YouTube, widget: string, required: false }
|
|
- { name: bandcamp, label: Bandcamp, widget: string, required: false }
|
|
- name: body
|
|
label: Notas del disco
|
|
widget: markdown
|
|
required: false
|
|
|
|
# -------------------------------------------------------------- canciones
|
|
- name: canciones
|
|
label: Canciones
|
|
label_singular: Canción
|
|
description: El cuerpo del texto es la letra. Los saltos de línea se respetan.
|
|
folder: src/content/canciones
|
|
identifier_field: titulo
|
|
create: true
|
|
slug: '{{slug}}'
|
|
summary: '{{titulo}}'
|
|
fields:
|
|
- { name: titulo, label: Título, widget: string }
|
|
- name: estilo
|
|
label: Estilo
|
|
widget: relation
|
|
collection: estilos
|
|
value_field: '{{slug}}'
|
|
display_fields: [nombre]
|
|
search_fields: [nombre]
|
|
- name: album
|
|
label: Álbum
|
|
widget: relation
|
|
collection: albumes
|
|
value_field: '{{slug}}'
|
|
display_fields: [titulo]
|
|
search_fields: [titulo]
|
|
required: false
|
|
hint: Déjalo vacío si es un single suelto; irá al álbum «Singles» de su estilo.
|
|
- name: numero
|
|
label: Nº de pista
|
|
widget: number
|
|
value_type: int
|
|
min: 1
|
|
required: false
|
|
hint: Obligatorio si hay álbum. Se ignora en los singles.
|
|
- name: duracion
|
|
label: Duración
|
|
widget: string
|
|
required: false
|
|
pattern: ['^\d{1,2}:[0-5]\d$', 'Escríbela como m:ss, por ejemplo 4:12']
|
|
- { name: ano, label: Año, widget: number, value_type: int, min: 1900, max: 2200, required: false }
|
|
- name: audio
|
|
label: Archivo de audio
|
|
widget: file
|
|
required: false
|
|
media_folder: /media/audio/subidas
|
|
public_folder: subidas
|
|
hint: >-
|
|
Sube aquí el archivo completo, con el nombre que sea. Al arrancar
|
|
(`npm run dev`) se coloca en la carpeta de su disco, se genera el
|
|
fragmento de muestra y se rellena la duración si está vacía.
|
|
- { name: portada, label: Portada propia, widget: image, required: false, hint: 'Si la dejas vacía se usa la del álbum.' }
|
|
- name: interpretes
|
|
label: Intérpretes
|
|
widget: list
|
|
required: false
|
|
field: { name: nombre, label: Nombre, widget: string }
|
|
- name: letra
|
|
label: Firma de la letra
|
|
widget: list
|
|
required: false
|
|
hint: Déjalo vacío si la firmas tú.
|
|
field: { name: nombre, label: Nombre, widget: string }
|
|
- name: musica
|
|
label: Firma de la música
|
|
widget: list
|
|
required: false
|
|
hint: Déjalo vacío si la firmas tú.
|
|
field: { name: nombre, label: Nombre, widget: string }
|
|
- { name: destacada, label: Destacada, widget: boolean, default: false, required: false }
|
|
- name: instrumental
|
|
label: Instrumental
|
|
widget: boolean
|
|
default: false
|
|
required: false
|
|
hint: Sin letra. El cuerpo pasa a leerse como notas de la pieza.
|
|
- { name: alaVenta, label: A la venta, widget: boolean, required: false, hint: 'Por defecto se vende si tiene audio.' }
|
|
- name: idioma
|
|
label: Idioma de la letra
|
|
widget: select
|
|
default: es
|
|
options:
|
|
- { label: 'Español', value: es }
|
|
- { label: 'Inglés', value: en }
|
|
- { label: 'Portugués', value: pt }
|
|
- { label: 'Francés', value: fr }
|
|
- { label: 'Italiano', value: it }
|
|
- { label: 'Catalán', value: ca }
|
|
- { label: 'Gallego', value: gl }
|
|
- { label: 'Euskera', value: eu }
|
|
required: false
|
|
- name: traduccion
|
|
label: Traducción al español
|
|
widget: text
|
|
required: false
|
|
hint: >-
|
|
Solo si la letra no está en español. Se enseña en una segunda columna
|
|
al lado de la original, así que conviene respetar el corte de los
|
|
versos para que se puedan seguir en paralelo.
|
|
- name: inspiracion
|
|
label: De dónde sale
|
|
widget: text
|
|
required: false
|
|
hint: Separa los párrafos con una línea en blanco.
|
|
- name: etiquetas
|
|
label: Etiquetas
|
|
widget: list
|
|
required: false
|
|
hint: >-
|
|
De qué habla, cómo suena, con quién se canta. Cruzan el catálogo por
|
|
donde no lo hacen el estilo ni el disco.
|
|
- name: versiones
|
|
label: Alternativas musicales
|
|
widget: list
|
|
required: false
|
|
label_singular: Versión
|
|
summary: '{{nombre}}'
|
|
collapsed: true
|
|
fields:
|
|
- { name: nombre, label: Nombre del arreglo, widget: string }
|
|
- name: audio
|
|
label: Archivo de audio
|
|
widget: file
|
|
media_folder: /media/audio/subidas
|
|
public_folder: subidas
|
|
hint: El arreglo completo. Se coloca solo al arrancar, como el principal.
|
|
- name: duracion
|
|
label: Duración
|
|
widget: string
|
|
required: false
|
|
pattern: ['^\d{1,2}:[0-5]\d$', 'Escríbela como m:ss']
|
|
- { name: nota, label: Nota, widget: string, required: false }
|
|
- name: videos
|
|
label: Vídeos
|
|
widget: list
|
|
required: false
|
|
label_singular: Vídeo
|
|
summary: '{{titulo}}'
|
|
collapsed: true
|
|
fields:
|
|
- name: youtube
|
|
label: Enlace o id de YouTube
|
|
widget: string
|
|
hint: Pega el enlace tal cual; el esquema saca el id.
|
|
- { name: titulo, label: Qué es, widget: string, required: false }
|
|
- name: registro
|
|
label: Registro de la obra
|
|
widget: object
|
|
required: false
|
|
collapsed: true
|
|
fields:
|
|
- name: iswc
|
|
label: ISWC
|
|
widget: string
|
|
required: false
|
|
pattern: ['^[Tt][-\s.]?\d{3}[.\s]?\d{3}[.\s]?\d{3}[-\s]?\d$', 'Formato T-DDD.DDD.DDD-C']
|
|
hint: Identifica la OBRA. Es el mismo en todas sus versiones.
|
|
- name: isrc
|
|
label: ISRC
|
|
widget: string
|
|
required: false
|
|
pattern: ['^[A-Za-z]{2}[-\s]?[A-Za-z0-9]{3}[-\s]?\d{2}[-\s]?\d{5}$', 'Formato CC-XXX-YY-NNNNN']
|
|
hint: Identifica ESTA grabación. Cada versión tiene el suyo.
|
|
- { name: entidad, label: Entidad de gestión, widget: string, required: false }
|
|
- { name: numero, label: Nº de registro, widget: string, required: false }
|
|
- { name: editorial, label: Editorial musical, widget: string, required: false }
|
|
- name: reparto
|
|
label: Reparto de autoría
|
|
widget: list
|
|
required: false
|
|
label_singular: Parte
|
|
summary: '{{nombre}} — {{porcentaje}} %'
|
|
hint: Si lo rellenas, los porcentajes tienen que sumar exactamente 100.
|
|
fields:
|
|
- { name: nombre, label: Nombre, widget: string }
|
|
- name: rol
|
|
label: Qué firma
|
|
widget: select
|
|
default: letra y musica
|
|
options: ['letra', 'musica', 'letra y musica']
|
|
- { name: porcentaje, label: Porcentaje, widget: number, value_type: float, min: 0.01, max: 100 }
|
|
- name: enlaces
|
|
label: Enlaces de escucha
|
|
widget: object
|
|
required: false
|
|
collapsed: true
|
|
fields:
|
|
- { name: spotify, label: Spotify, widget: string, required: false }
|
|
- { name: appleMusic, label: Apple Music, widget: string, required: false }
|
|
- { name: youtube, label: YouTube, widget: string, required: false }
|
|
- name: body
|
|
label: Letra
|
|
widget: markdown
|
|
required: false
|
|
hint: Los saltos de línea se respetan; cada verso en su línea.
|
|
|
|
# ----------------------------------------------------------------- taller
|
|
- name: taller
|
|
label: Taller de letras
|
|
label_singular: Capítulo
|
|
description: Los principios del oficio y una ficha de creación por estilo.
|
|
folder: src/content/taller
|
|
identifier_field: titulo
|
|
create: true
|
|
slug: '{{slug}}'
|
|
summary: '{{titulo}}'
|
|
fields:
|
|
- { name: titulo, label: Título, widget: string }
|
|
- name: tipo
|
|
label: Tipo
|
|
widget: select
|
|
default: principio
|
|
options:
|
|
- { label: 'Principio (el curso)', value: principio }
|
|
- { label: 'Ficha de estilo', value: ficha }
|
|
- { name: orden, label: Orden dentro de su bloque, widget: number, value_type: int, min: 0, default: 10 }
|
|
- { name: resumen, label: Resumen, widget: string, required: false }
|
|
- name: ficha
|
|
label: Datos del estilo
|
|
widget: object
|
|
required: false
|
|
collapsed: true
|
|
hint: Solo para las fichas de estilo; en los principios se deja vacío.
|
|
fields:
|
|
- { name: origen, label: Origen, widget: string, required: false }
|
|
- { name: compas, label: Compás, widget: string, required: false }
|
|
- { name: tempo, label: Tempo, widget: string, required: false }
|
|
- { name: metrica, label: Métrica, widget: string, required: false }
|
|
- { name: estructura, label: Estructura, widget: string, required: false }
|
|
- { name: rima, label: Rima, widget: string, required: false }
|
|
- name: temas
|
|
label: De qué se habla
|
|
widget: list
|
|
required: false
|
|
field: { name: tema, label: Tema, widget: string }
|
|
- name: rasgos
|
|
label: Rasgos de escritura
|
|
widget: list
|
|
required: false
|
|
field: { name: rasgo, label: Rasgo, widget: string }
|
|
- { name: body, label: Texto del capítulo, widget: markdown }
|
|
|
|
# ---------------------------------------------------------------- páginas
|
|
# ------------------------------------------------------------------- blog
|
|
- name: blog
|
|
label: Blog
|
|
label_singular: Entrada
|
|
description: Apuntes fechados. El cuerpo del texto es el artículo.
|
|
folder: src/content/blog
|
|
identifier_field: titulo
|
|
create: true
|
|
slug: '{{slug}}'
|
|
summary: '{{titulo}} · {{fecha}}'
|
|
fields:
|
|
- { name: titulo, label: Título, widget: string }
|
|
- { name: fecha, label: Fecha, widget: datetime, date_format: 'YYYY-MM-DD', time_format: false, picker_utc: true }
|
|
- name: resumen
|
|
label: Resumen
|
|
widget: string
|
|
required: false
|
|
hint: Una frase; es lo que se lee en el listado y en los buscadores.
|
|
- { name: imagen, label: Imagen de cabecera, widget: image, required: false }
|
|
- name: etiquetas
|
|
label: Etiquetas
|
|
widget: list
|
|
required: false
|
|
hint: Las mismas que las canciones; así el blog cruza con el catálogo.
|
|
- name: canciones
|
|
label: Temas de los que habla
|
|
widget: relation
|
|
collection: canciones
|
|
value_field: '{{slug}}'
|
|
display_fields: [titulo]
|
|
search_fields: [titulo]
|
|
multiple: true
|
|
required: false
|
|
- name: borrador
|
|
label: Borrador
|
|
widget: boolean
|
|
default: false
|
|
required: false
|
|
hint: Mientras esté marcado no aparece en la web.
|
|
- name: body
|
|
label: Texto
|
|
widget: markdown
|
|
|
|
- name: paginas
|
|
label: Páginas
|
|
label_singular: Página
|
|
description: Textos sueltos, como la biografía.
|
|
folder: src/content/paginas
|
|
identifier_field: titulo
|
|
create: true
|
|
slug: '{{slug}}'
|
|
summary: '{{titulo}}'
|
|
fields:
|
|
- { name: titulo, label: Título, widget: string }
|
|
- { name: descripcion, label: Descripción, widget: string, required: false }
|
|
- { name: body, label: Texto, widget: markdown }
|