@jjlmoya/utils-social 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +60 -0
- package/src/category/i18n/en.ts +23 -0
- package/src/category/i18n/es.ts +23 -0
- package/src/category/i18n/fr.ts +23 -0
- package/src/category/index.ts +13 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +27 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/redditFormatter/bibliography.astro +14 -0
- package/src/tool/redditFormatter/component.astro +246 -0
- package/src/tool/redditFormatter/i18n/en.ts +193 -0
- package/src/tool/redditFormatter/i18n/es.ts +193 -0
- package/src/tool/redditFormatter/i18n/fr.ts +193 -0
- package/src/tool/redditFormatter/index.ts +34 -0
- package/src/tool/redditFormatter/logic.ts +24 -0
- package/src/tool/redditFormatter/seo.astro +14 -0
- package/src/tool/redditFormatter/ui.ts +13 -0
- package/src/tool/safeZones/bibliography.astro +14 -0
- package/src/tool/safeZones/component.astro +857 -0
- package/src/tool/safeZones/i18n/en.ts +244 -0
- package/src/tool/safeZones/i18n/es.ts +244 -0
- package/src/tool/safeZones/i18n/fr.ts +244 -0
- package/src/tool/safeZones/index.ts +34 -0
- package/src/tool/safeZones/logic.ts +137 -0
- package/src/tool/safeZones/seo.astro +14 -0
- package/src/tool/safeZones/ui.ts +34 -0
- package/src/tool/socialImageResizer/bibliography.astro +14 -0
- package/src/tool/socialImageResizer/component.astro +498 -0
- package/src/tool/socialImageResizer/i18n/en.ts +211 -0
- package/src/tool/socialImageResizer/i18n/es.ts +211 -0
- package/src/tool/socialImageResizer/i18n/fr.ts +211 -0
- package/src/tool/socialImageResizer/index.ts +34 -0
- package/src/tool/socialImageResizer/logic.ts +133 -0
- package/src/tool/socialImageResizer/seo.astro +14 -0
- package/src/tool/socialImageResizer/ui.ts +7 -0
- package/src/tool/socialValueCalculator/bibliography.astro +14 -0
- package/src/tool/socialValueCalculator/component.astro +829 -0
- package/src/tool/socialValueCalculator/i18n/en.ts +310 -0
- package/src/tool/socialValueCalculator/i18n/es.ts +310 -0
- package/src/tool/socialValueCalculator/i18n/fr.ts +310 -0
- package/src/tool/socialValueCalculator/index.ts +34 -0
- package/src/tool/socialValueCalculator/logic.ts +60 -0
- package/src/tool/socialValueCalculator/seo.astro +14 -0
- package/src/tool/socialValueCalculator/ui.ts +31 -0
- package/src/tool/tinderPhotoOptimizer/bibliography.astro +14 -0
- package/src/tool/tinderPhotoOptimizer/component.astro +1514 -0
- package/src/tool/tinderPhotoOptimizer/i18n/en.ts +248 -0
- package/src/tool/tinderPhotoOptimizer/i18n/es.ts +248 -0
- package/src/tool/tinderPhotoOptimizer/i18n/fr.ts +248 -0
- package/src/tool/tinderPhotoOptimizer/index.ts +34 -0
- package/src/tool/tinderPhotoOptimizer/logic.ts +199 -0
- package/src/tool/tinderPhotoOptimizer/seo.astro +14 -0
- package/src/tool/tinderPhotoOptimizer/ui.ts +37 -0
- package/src/tool/youtubeThumbnail/bibliography.astro +14 -0
- package/src/tool/youtubeThumbnail/component.astro +419 -0
- package/src/tool/youtubeThumbnail/i18n/en.ts +207 -0
- package/src/tool/youtubeThumbnail/i18n/es.ts +207 -0
- package/src/tool/youtubeThumbnail/i18n/fr.ts +207 -0
- package/src/tool/youtubeThumbnail/index.ts +34 -0
- package/src/tool/youtubeThumbnail/logic.ts +7 -0
- package/src/tool/youtubeThumbnail/seo.astro +14 -0
- package/src/tool/youtubeThumbnail/ui.ts +13 -0
- package/src/tool/youtubeThumbnailPreviewer/bibliography.astro +14 -0
- package/src/tool/youtubeThumbnailPreviewer/component.astro +791 -0
- package/src/tool/youtubeThumbnailPreviewer/i18n/en.ts +321 -0
- package/src/tool/youtubeThumbnailPreviewer/i18n/es.ts +321 -0
- package/src/tool/youtubeThumbnailPreviewer/i18n/fr.ts +321 -0
- package/src/tool/youtubeThumbnailPreviewer/index.ts +34 -0
- package/src/tool/youtubeThumbnailPreviewer/seo.astro +14 -0
- package/src/tool/youtubeThumbnailPreviewer/ui.ts +19 -0
- package/src/tools.ts +10 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { YoutubeThumbnailUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'extractor-miniaturas-youtube';
|
|
6
|
+
const title = 'Extractor de Miniaturas de YouTube (HD)';
|
|
7
|
+
const description =
|
|
8
|
+
'Extrae y descarga la imagen en miniatura original de cualquier vídeo de YouTube a máxima resolución y sin marcas de agua usando solo la URL.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿A qué resolución se extraen las miniaturas?',
|
|
13
|
+
answer:
|
|
14
|
+
"La herramienta intenta siempre obtener la imagen en resolución 'MaxRes' (1280x720 o 1920x1080), que es la calidad original subida por el creador del video. Si el autor no subió una miniatura en HD, automáticamente mostrará la siguiente resolución más alta disponible.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: '¿Qué tipos de enlaces soporta?',
|
|
18
|
+
answer:
|
|
19
|
+
'Soporta URLs tradicionales de youtube.com/watch, enlaces cortos de youtu.be, enlaces desde el móvil, e incluso URLs de YouTube Shorts de manera transparente.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: '¿Es legal descargar miniaturas de YouTube?',
|
|
23
|
+
answer:
|
|
24
|
+
'Sí, la descarga es completamente legal para uso personal, diseño, parodias e inspiración (Fair Use). Ten cuidado si vas a utilizar miniaturas protegidas con derechos de autor con fines puramente comerciales, en esos casos es importante consultar la licencia del video.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: '¿Hay algún límite de uso diario?',
|
|
28
|
+
answer:
|
|
29
|
+
'No hay límites mensuales ni diarios. Como este software opera de forma client-side resolviendo el patrón de URL internamente en tu navegador, no interactuamos con las APIs restrictivas tradicionales.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Copia la URL del vídeo',
|
|
36
|
+
text: 'Ve a YouTube y copia el enlace del vídeo desde la barra del navegador o desde el botón de compartir.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Pega el enlace',
|
|
40
|
+
text: 'Introduce la URL en el campo del extractor o usa el botón de pegar desde portapapeles.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Selecciona la calidad',
|
|
44
|
+
text: 'La herramienta mostrará todas las resoluciones disponibles, desde la máxima calidad (1080p) hasta la más baja.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Descarga la imagen',
|
|
48
|
+
text: "Haz clic en el botón de descargar para guardar la miniatura en tu dispositivo.",
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'es',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<YoutubeThumbnailUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Documentación y Referencias',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'YouTube Help: Añadir una imagen en miniatura personalizada',
|
|
96
|
+
url: 'https://support.google.com/youtube/answer/72431',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'YouTube Creator Academy: Cómo crear miniaturas efectivas',
|
|
100
|
+
url: 'https://creatoracademy.youtube.com/',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Google Developers: YouTube Data API — Thumbnails',
|
|
104
|
+
url: 'https://developers.google.com/youtube/v3/docs/thumbnails',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
howTo: howToData,
|
|
108
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
109
|
+
seo: [
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'Descargar Miniaturas de YouTube en HD Gratis',
|
|
113
|
+
level: 2,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: 'Si necesitas <strong>descargar la miniatura de un vídeo de YouTube</strong> en su tamaño original o máxima calidad (Full HD o 4K), esta herramienta gratuita es la solución más rápida. Podrás obtener la imagen de portada de cualquier canal para inspirarte, crear tus propios diseños o utilizarla en presentaciones.',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'tip',
|
|
121
|
+
title: 'Extraer Foto de Portada sin Programas',
|
|
122
|
+
html: '<p>No hace falta instalar software ni registrarse. Solo tienes que copiar y pegar el enlace del vídeo y podrás <strong>guardar la miniatura de YouTube</strong> directamente en tu ordenador o móvil.</p>',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'title',
|
|
126
|
+
text: '¿Cómo conseguir la miniatura de un vídeo de YouTube?',
|
|
127
|
+
level: 3,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: 'El proceso para <strong>sacar la foto a un vídeo de YouTube</strong> es muy sencillo. Sigue estos pasos para obtener la imagen en segundos:',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'list',
|
|
135
|
+
items: [
|
|
136
|
+
'<strong>1. Copia la URL:</strong> Ve a YouTube y copia el enlace del vídeo (ya sea desde la barra del navegador o desde el botón de compartir).',
|
|
137
|
+
'<strong>2. Pega el enlace:</strong> Introduce la URL en el buscador de nuestro extractor de miniaturas.',
|
|
138
|
+
'<strong>3. Selecciona la calidad:</strong> Te mostraremos todas las resoluciones disponibles, desde la máxima calidad (1080p) hasta la más baja (360p).',
|
|
139
|
+
'<strong>4. Descarga la imagen:</strong> Haz clic en el botón de descargar para guardar la <i>thumbnail</i> en tu dispositivo.',
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: 'Formatos y Resoluciones Soportadas',
|
|
145
|
+
level: 3,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Descargar portadas de vídeos de YouTube nunca fue tan fácil. La herramienta busca automáticamente la mejor imagen posible (conocida como <strong>maxresdefault</strong>), que suelen ser diseños trabajados en Photoshop por los YouTubers. Si el creador no subió una imagen en HD, te daremos la siguiente mejor opción (<strong>hqdefault</strong> o <strong>mqdefault</strong>).',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'paragraph',
|
|
153
|
+
html: 'Esta utilidad es perfecta para <i>Community Managers</i>, diseñadores gráficos, creadores de contenido, creadores de memes, o cualquier persona que necesite <strong>descargar la carátula de un vídeo</strong> para sus proyectos. Además, es compatible con los <strong>YouTube Shorts</strong>, por lo que también podrás conseguir sus miniaturas de igual forma.',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'title',
|
|
157
|
+
text: 'Usos Profesionales de las Miniaturas de YouTube',
|
|
158
|
+
level: 2,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'paragraph',
|
|
162
|
+
html: 'Las miniaturas de YouTube son activos visuales de alto valor. Representan horas de trabajo de diseño, pruebas A/B y optimización de CTR por parte de los creadores. Saber cómo acceder a ellas y descargarlas abre un abanico de posibilidades profesionales.',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'grid',
|
|
166
|
+
columns: [
|
|
167
|
+
{
|
|
168
|
+
type: 'card',
|
|
169
|
+
title: 'Creadores de Contenido',
|
|
170
|
+
html: '<p>Analiza las miniaturas de vídeos virales en tu nicho para entender qué elementos visuales generan más clics: tipografía, colores dominantes, uso de rostros o texto.</p><ul><li><strong>Benchmarking visual:</strong> Compara tus miniaturas con las de los líderes de tu sector.</li><li><strong>Iteración de diseño:</strong> Descarga y usa miniaturas como referencia en Photoshop o Canva.</li><li><strong>Archivo de inspiración:</strong> Construye una biblioteca de thumbnails de alta conversión.</li></ul>',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
type: 'card',
|
|
174
|
+
title: 'Diseñadores y Marketers',
|
|
175
|
+
html: '<p>Para un diseñador gráfico o un <i>social media manager</i>, acceder rápidamente a las miniaturas de YouTube es esencial para presentaciones, propuestas de cliente y auditorías visuales.</p><ul><li><strong>Presentaciones de cliente:</strong> Incluye capturas reales de la competencia en tus propuestas.</li><li><strong>Auditorías de marca:</strong> Evalúa la coherencia visual de un canal de YouTube.</li><li><strong>Moodboards:</strong> Recopila referencias visuales de alta calidad sin capturas de pantalla borrosas.</li></ul>',
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
type: 'title',
|
|
181
|
+
text: 'Compatibilidad con YouTube Shorts',
|
|
182
|
+
level: 3,
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'paragraph',
|
|
186
|
+
html: 'El extractor funciona perfectamente con <strong>YouTube Shorts</strong>. Los Shorts tienen su propio formato de miniatura vertical (9:16) que se genera automáticamente desde el vídeo. Esta herramienta reconoce las URLs de Shorts (<code>youtube.com/shorts/ID</code>) y extrae la mejor miniatura disponible de la misma manera que con los vídeos estándar.',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'tip',
|
|
190
|
+
title: 'Privacidad Garantizada',
|
|
191
|
+
html: '<p>Toda la extracción ocurre en tu navegador. No se envían URLs ni datos a ningún servidor externo.</p>',
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
ui: {
|
|
195
|
+
urlPlaceholder: 'Pega el enlace de YouTube aquí...',
|
|
196
|
+
pasteAriaLabel: 'Pegar desde portapapeles',
|
|
197
|
+
helperText: 'Formatos soportados: youtube.com, youtu.be, shorts.',
|
|
198
|
+
ribbonLabel: 'Máxima Calidad',
|
|
199
|
+
downloadBtn: 'Descargar en Máxima Resolución',
|
|
200
|
+
qualityMedium: 'Calidad Media',
|
|
201
|
+
qualityStandard: 'Calidad Estándar',
|
|
202
|
+
qualityLow: 'Baja Calidad',
|
|
203
|
+
viewImage: 'Ver Imagen',
|
|
204
|
+
errorInvalid: 'URL de YouTube no válida. Por favor, compruébala.',
|
|
205
|
+
imgAlt: 'Miniatura HD de YouTube',
|
|
206
|
+
},
|
|
207
|
+
};
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { YoutubeThumbnailUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'extracteur-miniatures-youtube';
|
|
6
|
+
const title = 'Extracteur de Miniatures YouTube (HD)';
|
|
7
|
+
const description =
|
|
8
|
+
"Extrayez et téléchargez l'image miniature originale de n'importe quelle vidéo YouTube en résolution maximale et sans filigrane, en utilisant uniquement l'URL.";
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'À quelle résolution les miniatures sont-elles extraites ?',
|
|
13
|
+
answer:
|
|
14
|
+
"L'outil tente toujours d'obtenir l'image en résolution 'MaxRes' (1280x720 ou 1920x1080), qui est la qualité originale téléversée par le créateur de la vidéo. Si l'auteur n'a pas téléversé de miniature en HD, la résolution disponible suivante sera affichée automatiquement.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: "Quels types de liens sont pris en charge ?",
|
|
18
|
+
answer:
|
|
19
|
+
"Il prend en charge les URLs traditionnelles youtube.com/watch, les liens courts youtu.be, les liens mobiles, ainsi que les URLs YouTube Shorts de manière transparente.",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: "Est-il légal de télécharger des miniatures YouTube ?",
|
|
23
|
+
answer:
|
|
24
|
+
"Oui, le téléchargement est tout à fait légal pour un usage personnel, la conception, les parodies et l'inspiration (Fair Use). Soyez prudent si vous prévoyez d'utiliser des miniatures protégées par le droit d'auteur à des fins purement commerciales — dans ces cas, il est important de vérifier la licence de la vidéo.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: "Y a-t-il une limite d'utilisation quotidienne ?",
|
|
28
|
+
answer:
|
|
29
|
+
"Il n'y a pas de limites mensuelles ni quotidiennes. Ce logiciel fonctionnant côté client en résolvant le schéma d'URL directement dans votre navigateur, nous n'interagissons pas avec les APIs restrictives traditionnelles.",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: "Copiez l'URL de la vidéo",
|
|
36
|
+
text: "Rendez-vous sur YouTube et copiez le lien de la vidéo depuis la barre d'adresse du navigateur ou le bouton de partage.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Collez le lien',
|
|
40
|
+
text: "Entrez l'URL dans le champ de l'extracteur ou utilisez le bouton pour coller depuis le presse-papiers.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Sélectionnez la qualité',
|
|
44
|
+
text: "L'outil affichera toutes les résolutions disponibles, de la qualité maximale (1080p) jusqu'à la plus basse.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "Téléchargez l'image",
|
|
48
|
+
text: 'Cliquez sur le bouton de téléchargement pour enregistrer la miniature sur votre appareil.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'UtilityApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
83
|
+
inLanguage: 'fr',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<YoutubeThumbnailUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faqTitle: 'Questions Fréquentes',
|
|
91
|
+
faq: faqData,
|
|
92
|
+
bibliographyTitle: 'Documentation et Références',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{
|
|
95
|
+
name: 'YouTube Aide : Ajouter une miniature personnalisée',
|
|
96
|
+
url: 'https://support.google.com/youtube/answer/72431',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'YouTube Creator Academy : Créer de bonnes miniatures',
|
|
100
|
+
url: 'https://creatoracademy.youtube.com/',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Google Developers : YouTube Data API — Thumbnails',
|
|
104
|
+
url: 'https://developers.google.com/youtube/v3/docs/thumbnails',
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
howTo: howToData,
|
|
108
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
109
|
+
seo: [
|
|
110
|
+
{
|
|
111
|
+
type: 'title',
|
|
112
|
+
text: 'Télécharger des Miniatures YouTube en HD Gratuitement',
|
|
113
|
+
level: 2,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'paragraph',
|
|
117
|
+
html: "Si vous avez besoin de <strong>télécharger la miniature d'une vidéo YouTube</strong> dans sa taille originale ou en qualité maximale (Full HD ou 4K), cet outil gratuit est la solution la plus rapide. Vous pouvez obtenir l'image de couverture de n'importe quelle chaîne pour vous inspirer, créer vos propres designs ou l'utiliser dans des présentations.",
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'tip',
|
|
121
|
+
title: 'Extraire des Images de Couverture sans Logiciel',
|
|
122
|
+
html: "<p>Pas besoin d'installer un logiciel ni de s'inscrire. Il suffit de copier et coller le lien de la vidéo pour <strong>enregistrer la miniature YouTube</strong> directement sur votre ordinateur ou téléphone.</p>",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'title',
|
|
126
|
+
text: "Comment Obtenir la Miniature d'une Vidéo YouTube ?",
|
|
127
|
+
level: 3,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'paragraph',
|
|
131
|
+
html: "Le processus pour <strong>récupérer l'image d'une vidéo YouTube</strong> est très simple. Suivez ces étapes pour obtenir l'image en quelques secondes :",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
type: 'list',
|
|
135
|
+
items: [
|
|
136
|
+
"<strong>1. Copiez l'URL :</strong> Rendez-vous sur YouTube et copiez le lien de la vidéo (depuis la barre d'adresse du navigateur ou le bouton de partage).",
|
|
137
|
+
"<strong>2. Collez le lien :</strong> Entrez l'URL dans le champ de recherche de notre extracteur de miniatures.",
|
|
138
|
+
"<strong>3. Sélectionnez la qualité :</strong> Nous afficherons toutes les résolutions disponibles, de la qualité maximale (1080p) jusqu'à la plus basse (360p).",
|
|
139
|
+
"<strong>4. Téléchargez l'image :</strong> Cliquez sur le bouton de téléchargement pour enregistrer la <i>thumbnail</i> sur votre appareil.",
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: 'Formats et Résolutions Pris en Charge',
|
|
145
|
+
level: 3,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: "Télécharger les images de couverture de vidéos YouTube n'a jamais été aussi simple. L'outil récupère automatiquement la meilleure image possible (connue sous le nom de <strong>maxresdefault</strong>), généralement des designs réalisés sous Photoshop par les YouTubeurs. Si le créateur n'a pas téléversé d'image en HD, vous obtiendrez la meilleure option disponible (<strong>hqdefault</strong> ou <strong>mqdefault</strong>).",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'paragraph',
|
|
153
|
+
html: "Cet outil est parfait pour les <i>Community Managers</i>, les graphistes, les créateurs de contenu, les créateurs de mèmes, ou toute personne ayant besoin de <strong>télécharger la jaquette d'une vidéo</strong> pour ses projets. Il est également compatible avec les <strong>YouTube Shorts</strong>, ce qui vous permet d'en obtenir les miniatures de la même manière.",
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'title',
|
|
157
|
+
text: 'Utilisations Professionnelles des Miniatures YouTube',
|
|
158
|
+
level: 2,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
type: 'paragraph',
|
|
162
|
+
html: "Les miniatures YouTube sont des actifs visuels de grande valeur. Elles représentent des heures de travail de design, des tests A/B et une optimisation du CTR de la part des créateurs. Savoir comment y accéder et les télécharger ouvre un large éventail de possibilités professionnelles.",
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'grid',
|
|
166
|
+
columns: [
|
|
167
|
+
{
|
|
168
|
+
type: 'card',
|
|
169
|
+
title: 'Créateurs de Contenu',
|
|
170
|
+
html: "<p>Analysez les miniatures de vidéos virales dans votre niche pour comprendre quels éléments visuels génèrent le plus de clics : typographie, couleurs dominantes, utilisation de visages ou de texte.</p><ul><li><strong>Benchmarking visuel :</strong> Comparez vos miniatures avec celles des leaders de votre secteur.</li><li><strong>Itération de design :</strong> Téléchargez des miniatures comme références dans Photoshop ou Canva.</li><li><strong>Archive d'inspiration :</strong> Constituez une bibliothèque de thumbnails à fort taux de conversion.</li></ul>",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
type: 'card',
|
|
174
|
+
title: 'Designers et Marketeurs',
|
|
175
|
+
html: "<p>Pour un graphiste ou un <i>social media manager</i>, accéder rapidement aux miniatures YouTube est essentiel pour les présentations, les propositions clients et les audits visuels.</p><ul><li><strong>Présentations client :</strong> Incluez de vraies captures de la concurrence dans vos propositions.</li><li><strong>Audits de marque :</strong> Évaluez la cohérence visuelle d'une chaîne YouTube.</li><li><strong>Moodboards :</strong> Collectez des références visuelles de qualité sans captures d'écran floues.</li></ul>",
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
type: 'title',
|
|
181
|
+
text: 'Compatibilité avec YouTube Shorts',
|
|
182
|
+
level: 3,
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
type: 'paragraph',
|
|
186
|
+
html: "L'extracteur fonctionne parfaitement avec les <strong>YouTube Shorts</strong>. Les Shorts ont leur propre format de miniature vertical (9:16) qui est généré automatiquement depuis la vidéo. Cet outil reconnaît les URLs de Shorts (<code>youtube.com/shorts/ID</code>) et extrait la meilleure miniature disponible exactement de la même manière que pour les vidéos standard.",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'tip',
|
|
190
|
+
title: 'Confidentialité Garantie',
|
|
191
|
+
html: "<p>Toute l'extraction se fait dans votre navigateur. Aucune URL ni donnée n'est envoyée à un serveur externe.</p>",
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
ui: {
|
|
195
|
+
urlPlaceholder: 'Collez le lien YouTube ici...',
|
|
196
|
+
pasteAriaLabel: 'Coller depuis le presse-papiers',
|
|
197
|
+
helperText: 'Formats supportés : youtube.com, youtu.be, shorts.',
|
|
198
|
+
ribbonLabel: 'Qualité Maximale',
|
|
199
|
+
downloadBtn: 'Télécharger en Résolution Maximale',
|
|
200
|
+
qualityMedium: 'Qualité Moyenne',
|
|
201
|
+
qualityStandard: 'Qualité Standard',
|
|
202
|
+
qualityLow: 'Qualité Basse',
|
|
203
|
+
viewImage: "Voir l'Image",
|
|
204
|
+
errorInvalid: "URL YouTube invalide. Veuillez vérifier et réessayer.",
|
|
205
|
+
imgAlt: 'Miniature YouTube HD',
|
|
206
|
+
},
|
|
207
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { SocialToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
|
|
2
|
+
|
|
3
|
+
import YoutubeThumbnailComponent from './component.astro';
|
|
4
|
+
import YoutubeThumbnailSEO from './seo.astro';
|
|
5
|
+
import YoutubeThumbnailBibliography from './bibliography.astro';
|
|
6
|
+
|
|
7
|
+
import type { YoutubeThumbnailUI } from './ui';
|
|
8
|
+
export type YoutubeThumbnailLocaleContent = ToolLocaleContent<YoutubeThumbnailUI>;
|
|
9
|
+
|
|
10
|
+
import { content as es } from './i18n/es';
|
|
11
|
+
import { content as en } from './i18n/en';
|
|
12
|
+
import { content as fr } from './i18n/fr';
|
|
13
|
+
|
|
14
|
+
export const youtubeThumbnail: SocialToolEntry<YoutubeThumbnailUI> = {
|
|
15
|
+
id: 'youtube-thumbnail',
|
|
16
|
+
icons: {
|
|
17
|
+
bg: 'mdi:youtube',
|
|
18
|
+
fg: 'mdi:image-search',
|
|
19
|
+
},
|
|
20
|
+
i18n: {
|
|
21
|
+
es: async () => es,
|
|
22
|
+
en: async () => en,
|
|
23
|
+
fr: async () => fr,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { YoutubeThumbnailComponent, YoutubeThumbnailSEO, YoutubeThumbnailBibliography };
|
|
28
|
+
|
|
29
|
+
export const YOUTUBE_THUMBNAIL_TOOL: ToolDefinition = {
|
|
30
|
+
entry: youtubeThumbnail,
|
|
31
|
+
Component: YoutubeThumbnailComponent,
|
|
32
|
+
SEOComponent: YoutubeThumbnailSEO,
|
|
33
|
+
BibliographyComponent: YoutubeThumbnailBibliography,
|
|
34
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const YT_REGEX =
|
|
2
|
+
/(?:youtube\.com\/(?:[^/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/|youtube\.com\/shorts\/)([^"&?/\s]{11})/i;
|
|
3
|
+
|
|
4
|
+
export function extractVideoId(url: string): string | null {
|
|
5
|
+
const match = url.match(YT_REGEX);
|
|
6
|
+
return match ? match[1] : null;
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { youtubeThumbnail } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await youtubeThumbnail.i18n[locale]?.();
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
---
|
|
14
|
+
<SEORenderer content={{ locale: locale as string, sections: content.seo }} />
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface YoutubeThumbnailUI extends Record<string, string> {
|
|
2
|
+
urlPlaceholder: string;
|
|
3
|
+
pasteAriaLabel: string;
|
|
4
|
+
helperText: string;
|
|
5
|
+
ribbonLabel: string;
|
|
6
|
+
downloadBtn: string;
|
|
7
|
+
qualityMedium: string;
|
|
8
|
+
qualityStandard: string;
|
|
9
|
+
qualityLow: string;
|
|
10
|
+
viewImage: string;
|
|
11
|
+
errorInvalid: string;
|
|
12
|
+
imgAlt: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { youtubeThumbnailPreviewer } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await youtubeThumbnailPreviewer.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|