|
| 1 | +<div align="center"> |
| 2 | + |
| 3 | +# YouTube Music |
| 4 | + |
| 5 | +[](https://github.com/th-ch/youtube-music/releases/) |
| 6 | +[](https://github.com/th-ch/youtube-music/blob/master/LICENSE) |
| 7 | +[](https://github.com/th-ch/youtube-music/blob/master/.eslintrc.js) |
| 8 | +[](https://GitHub.com/th-ch/youtube-music/releases/) |
| 9 | +[](https://GitHub.com/th-ch/youtube-music/releases/) |
| 10 | +[](https://aur.archlinux.org/packages/youtube-music-bin) |
| 11 | +[](https://snyk.io/test/github/th-ch/youtube-music) |
| 12 | + |
| 13 | +</div> |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | +<div align="center"> |
| 19 | + <a href="https://github.com/th-ch/youtube-music/releases/latest"> |
| 20 | + <img src="/web/youtube-music.svg" width="400" height="100" alt="YouTube Music SVG"> |
| 21 | + </a> |
| 22 | +</div> |
| 23 | + |
| 24 | +**Electron wrapper de YouTube Music con las siguientes características:** |
| 25 | + |
| 26 | +- Apariencia y sensación nativa, tiene como objetivo mantener la interfaz original |
| 27 | +- Framework para plugins personalizados: cambia YouTube Music según tus necesidades (estilo, contenido, funciones), habilita/deshabilita plugins con un solo clic |
| 28 | + |
| 29 | +## Imagen de demostración |
| 30 | + |
| 31 | +| Pantalla del reproductor (color del álbum como tema y luz ambiental) | |
| 32 | +|:---------------------------------------------------------------------------------------------------------:| |
| 33 | +|| |
| 34 | + |
| 35 | +## Contenido |
| 36 | + |
| 37 | +- [Características](#características) |
| 38 | +- [Plugins disponibles](#plugins-disponibles) |
| 39 | +- [Traducción](#traducción) |
| 40 | +- [Descarga](#descarga) |
| 41 | + - [Arch Linux](#arch-linux) |
| 42 | + - [macOS](#macos) |
| 43 | + - [Windows](#windows) |
| 44 | + - [Cómo instalar sin conexión a internet? (en Windows)](#cómo-instalar-sin-conexión-a-internet-en-windows) |
| 45 | +- [Temas](#temas) |
| 46 | +- [Dev](#dev) |
| 47 | +- [Crea tus propios plugins](#crea-tus-propios-plugins) |
| 48 | + - [Creación de un plugin](#creación-de-un-plugin) |
| 49 | + - [Casos de uso comunes](#casos-de-uso-comunes) |
| 50 | +- [Compilar](#compilar) |
| 51 | +- [Vista previa de producción](#vista-previa-de-producción) |
| 52 | +- [Tests](#tests) |
| 53 | +- [Licencia](#licencia) |
| 54 | +- [Preguntas frecuentes](#preguntas-frecuentes) |
| 55 | + |
| 56 | +## Características: |
| 57 | + |
| 58 | +- **Confirmación automática al pausar** (Siempre habilitado): desactiva |
| 59 | + el mensaje emergente ["¿Continuar reproduciendo?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png) |
| 60 | + que pausa la música después de cierto tiempo |
| 61 | + |
| 62 | +- Y más ... |
| 63 | + |
| 64 | +## Plugins disponibles: |
| 65 | + |
| 66 | +- **Bloqueador de Anuncios**: Bloquea todos los anuncios y rastreadores de forma predeterminada |
| 67 | + |
| 68 | +- **Acciones de Álbum**: Agrega botones de deshacer No me gusta, No me gusta, Me gusta, y Deshacer me gusta a todas las canciones de una lista de reproducción o álbum |
| 69 | + |
| 70 | +- **Tema de Color del Álbum**: Aplica un tema dinámico y efectos visuales basados en la paleta de colores del álbum |
| 71 | + |
| 72 | +- **Modo Ambiente**: Aplica un efecto de iluminación proyectando colores suaves del video en el fondo de tu pantalla |
| 73 | + |
| 74 | +- **Compresor de Audio**: Aplica compresión al audio (reduce el volumen de las partes más fuertes de la señal y aumenta el |
| 75 | + volumen de las partes más suaves) |
| 76 | + |
| 77 | +- **Barra de Navegación Difuminada**: hace que la barra de navegación sea transparente y borrosa |
| 78 | + |
| 79 | +- **Omitir Restricciones de Edades**: omite la verificación de edad de YouTube |
| 80 | + |
| 81 | +- **Selector de Subtítulos**: Habilita los subtítulos |
| 82 | + |
| 83 | +- **Barra Lateral Compacta**: Siempre muestra la barra lateral en modo compacto |
| 84 | + |
| 85 | +- **Crossfade**: Transición suave entre canciones |
| 86 | + |
| 87 | +- **Desactivar Reproducción Automática**: Hace que cada canción comience en modo "pausado" |
| 88 | + |
| 89 | +- **[Discord](https://discord.com/) Rich Presence**: Muestra a tus amigos lo que estás escuchando |
| 90 | + con [Rich Presence](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png) |
| 91 | + |
| 92 | +- **Descargador**: Descarga |
| 93 | + MP3 [directamente desde la interfaz](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) [(youtube-dl)](https://github.com/ytdl-org/youtube-dl) |
| 94 | + |
| 95 | +- **Volumen Exponencial**: Hace que el control de volumen |
| 96 | + sea [exponencial](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/) para facilitar la |
| 97 | + selección de volúmenes más bajos |
| 98 | + |
| 99 | +- **Menú en la Aplicación**: [da a las barras un aspecto elegante y oscuro](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png) |
| 100 | + |
| 101 | + > (consulta [esta publicación](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709) si tienes problemas |
| 102 | + para acceder al menú después de habilitar este plugin y la opción hide-menu) |
| 103 | + |
| 104 | +- **Scrobbler**: Agrega soporte para scrobbling en [Last.fm](https://www.last.fm/) y [ListenBrainz](https://listenbrainz.org/) |
| 105 | + |
| 106 | +- **Lumia Stream**: Agrega soporte para [Lumia Stream](https://lumiastream.com/) |
| 107 | + |
| 108 | +- **Letras Genius**: Agrega soporte de letras para la mayoría de las canciones |
| 109 | + |
| 110 | +- **Music Together**: Comparte una lista de reproducción con otros. Cuando el anfitrión reproduce una canción, todos los demás escucharán la misma canción |
| 111 | + |
| 112 | +- **Navegación**: Flechas de siguiente/anterior integradas directamente en la interfaz, como en tu navegador favorito |
| 113 | + |
| 114 | +- **Sin Inicio de Sesión de Google**: Elimina los botones y enlaces de inicio de sesión de Google de la interfaz |
| 115 | + |
| 116 | +- **Notificaciones**: Muestra una notificación cuando comienza una canción |
| 117 | + a reproducirse ([notificaciones interactivas](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) |
| 118 | + están disponibles en Windows) |
| 119 | + |
| 120 | +- **Picture-in-picture**: permite cambiar la aplicación al modo picture-in-picture |
| 121 | + |
| 122 | +- **Velocidad de Reproducción**: Escucha rápido, escucha |
| 123 | + lento! [Agrega un deslizador que controla la velocidad de reproducción de las canciones](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png) |
| 124 | + |
| 125 | +- **Volumen Preciso**: Controla el volumen de forma precisa utilizando la rueda del mouse/atajos de teclado, con un HUD personalizado y pasos de volumen personalizables |
| 126 | + |
| 127 | +- **Atajos (& MPRIS)**: Permite configurar atajos globales para la reproducción (reproducir/pausar/siguiente/anterior) + |
| 128 | + desactivar [osd multimedia](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) |
| 129 | + al anular las teclas multimedia + habilitar Ctrl/CMD + F para buscar + habilitar el soporte mpris de Linux para |
| 130 | + teclas multimedia + [atajos personalizados](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) |
| 131 | + para [usuarios avanzados](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902) |
| 132 | + |
| 133 | +- **Saltar Canción no Gustada**: Salta las canciones que no te gustan |
| 134 | + |
| 135 | +- **Saltar Silencios**: Salta automáticamente las secciones de silencio |
| 136 | + |
| 137 | +- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): Salta automáticamente las partes que no son de música, como la introducción/final o |
| 138 | + partes de videos musicales donde no se reproduce la canción |
| 139 | + |
| 140 | +- **Control Multimedia en la Barra de Tareas**: Controla la reproducción desde |
| 141 | + la [barra de tareas de Windows](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png) |
| 142 | + |
| 143 | +- **TouchBar**: Diseño personalizado de TouchBar para macOS |
| 144 | + |
| 145 | +- **Tuna OBS**: Integración con el complemento [Tuna](https://obsproject.com/forum/resources/tuna.843/) de [OBS](https://obsproject.com/) |
| 146 | + |
| 147 | +- **Cambiador de Calidad de Video**: Permite cambiar la calidad del video con |
| 148 | + un [botón](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png) en |
| 149 | + la superposición de video |
| 150 | + |
| 151 | +- **Alternar Video**: Agrega |
| 152 | + un [botón](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png) para |
| 153 | + alternar entre el modo de video/canción. también puede eliminar opcionalmente toda la pestaña de video |
| 154 | + |
| 155 | +- **Visualizador**: Diferentes visualizadores de música |
| 156 | + |
| 157 | +## Traducción |
| 158 | + |
| 159 | +Puedes ayudar con la traducción en [Hosted Weblate](https://hosted.weblate.org/projects/youtube-music/). |
| 160 | + |
| 161 | +<a href="https://hosted.weblate.org/engage/youtube-music/"> |
| 162 | + <img src="https://hosted.weblate.org/widget/youtube-music/i18n/multi-auto.svg" alt="estado de traducción" /> |
| 163 | + <img src="https://hosted.weblate.org/widget/youtube-music/i18n/287x66-black.png" alt="estado de traducción 2" /> |
| 164 | +</a> |
| 165 | + |
| 166 | +## Descarga |
| 167 | + |
| 168 | +Puedes consultar la [última versión](https://github.com/th-ch/youtube-music/releases/latest) para encontrar rápidamente la versión más reciente. |
| 169 | + |
| 170 | +### Arch Linux |
| 171 | + |
| 172 | +Instala el paquete [`youtube-music-bin`](https://aur.archlinux.org/packages/youtube-music-bin) desde AUR. Para obtener instrucciones de instalación de AUR, consulta esta [página del wiki](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages). |
| 173 | + |
| 174 | +### macOS |
| 175 | + |
| 176 | +Puedes instalar la aplicación usando Homebrew (consulta la [definición de cask](https://github.com/th-ch/homebrew-youtube-music)): |
| 177 | + |
| 178 | +```bash |
| 179 | +brew install th-ch/youtube-music/youtube-music |
| 180 | +``` |
| 181 | + |
| 182 | +Si instalas la aplicación manualmente y obtienes un error "está dañado y no se puede abrir" al iniciar la aplicación, ejecuta lo siguiente en la Terminal: |
| 183 | + |
| 184 | +```bash |
| 185 | +xattr -cr /Applications/YouTube\ Music.app |
| 186 | +``` |
| 187 | + |
| 188 | +### Windows |
| 189 | + |
| 190 | +Puedes usar el [administrador de paquetes Scoop](https://scoop.sh) para instalar el paquete `youtube-music` desde |
| 191 | +el [`extras` bucket](https://github.com/ScoopInstaller/Extras). |
| 192 | + |
| 193 | +```bash |
| 194 | +scoop bucket add extras |
| 195 | +scoop install extras/youtube-music |
| 196 | +``` |
| 197 | + |
| 198 | +Alternativamente, puedes usar [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/), el administrador de paquetes CLI oficial de Windows 11 para instalar el paquete `th-ch.YouTubeMusic`. |
| 199 | + |
| 200 | +*Nota: Microsoft Defender SmartScreen podría bloquear la instalación ya que proviene de un "editor desconocido". Esto también esválido para la instalación manual al intentar ejecutar el ejecutable (.exe) después de una descarga manual aquí en GitHub (mismo archivo).* |
| 201 | + |
| 202 | +```bash |
| 203 | +winget install th-ch.YouTubeMusic |
| 204 | +``` |
| 205 | + |
| 206 | +#### Cómo instalar sin conexión a Internet? (en Windows) |
| 207 | + |
| 208 | +- Descarga el archivo `*.nsis.7z` para _la arquitectura de tu dispositivo_ en la [página de lanzamientos](https://github.com/th-ch/youtube-music/releases/latest). |
| 209 | + - `x64` para Windows de 64 bits |
| 210 | + - `ia32` para Windows de 32 bits |
| 211 | + - `arm64` para Windows ARM64 |
| 212 | +- Descarga el instalador en la página de lanzamientos. (`*-Setup.exe`) |
| 213 | +- Colócalos en el **mismo directorio**. |
| 214 | +- Ejecuta el instalador. |
| 215 | + |
| 216 | +## Temas |
| 217 | + |
| 218 | +Puedes cargar archivos CSS para cambiar la apariencia de la aplicación (Opciones > Ajustes visuales > Tema). |
| 219 | + |
| 220 | +Algunos temas predefinidos están disponibles en https://github.com/kerichdev/themes-for-ytmdesktop-player. |
| 221 | + |
| 222 | +## Dev |
| 223 | + |
| 224 | +```bash |
| 225 | +git clone https://github.com/th-ch/youtube-music |
| 226 | +cd youtube-music |
| 227 | +pnpm install --frozen-lockfile |
| 228 | +pnpm dev |
| 229 | +``` |
| 230 | + |
| 231 | +## Crea tus propios plugins |
| 232 | + |
| 233 | +Usando plugins, puedes: |
| 234 | + |
| 235 | +- manipular la aplicación - se pasa el `BrowserWindow` de electron al controlador del plugin |
| 236 | +- cambiar la interfaz manipulando el HTML/CSS |
| 237 | + |
| 238 | +### Creación de un plugin |
| 239 | + |
| 240 | +Crea una carpeta en `src/plugins/NOMBRE-DEL-PLUGIN`: |
| 241 | + |
| 242 | +- `index.ts`: el archivo principal del plugin |
| 243 | +```typescript |
| 244 | +import style from './style.css?inline'; // importar estilo como inline |
| 245 | + |
| 246 | +import { createPlugin } from '@/utils'; |
| 247 | + |
| 248 | +export default createPlugin({ |
| 249 | + name: "Plugin Label", |
| 250 | + restartNeeded: true, // si el valor es true, ytmusic muestra el diálogo de reinicio |
| 251 | + config: { |
| 252 | + enabled: false, |
| 253 | + }, // tu configuración personalizada |
| 254 | + stylesheets: [style], // tu estilo personalizado, |
| 255 | + menu: async ({ getConfig, setConfig }) => { |
| 256 | + // Todos los métodos *Config están envueltos en Promise<T> |
| 257 | + const config = await getConfig(); |
| 258 | + return [ |
| 259 | + { |
| 260 | + label: "menu", |
| 261 | + submenu: [1, 2, 3].map((value) => ({ |
| 262 | + label: `value ${value}`, |
| 263 | + type: "radio", |
| 264 | + checked: config.value === value, |
| 265 | + click() { |
| 266 | + setConfig({ value }); |
| 267 | + }, |
| 268 | + })), |
| 269 | + }, |
| 270 | + ]; |
| 271 | + }, |
| 272 | + backend: { |
| 273 | + start({ window, ipc }) { |
| 274 | + window.maximize(); |
| 275 | + |
| 276 | + // puedes comunicarte con el plugin de renderizado |
| 277 | + ipc.handle("some-event", () => { |
| 278 | + return "hello"; |
| 279 | + }); |
| 280 | + }, |
| 281 | + // se activa cuando cambia la configuración |
| 282 | + onConfigChange(newConfig) { /* ... */ }, |
| 283 | + // se activa cuando se desactiva el plugin |
| 284 | + stop(context) { /* ... */ }, |
| 285 | + }, |
| 286 | + renderer: { |
| 287 | + async start(context) { |
| 288 | + console.log(await context.ipc.invoke("some-event")); |
| 289 | + }, |
| 290 | + // Solo disponible en el plugin de renderizado |
| 291 | + onPlayerApiReady(api: YoutubePlayer, context: RendererContext) { |
| 292 | + // establecer la configuración del plugin fácilmente |
| 293 | + context.setConfig({ myConfig: api.getVolume() }); |
| 294 | + }, |
| 295 | + onConfigChange(newConfig) { /* ... */ }, |
| 296 | + stop(_context) { /* ... */ }, |
| 297 | + }, |
| 298 | + preload: { |
| 299 | + async start({ getConfig }) { |
| 300 | + const config = await getConfig(); |
| 301 | + }, |
| 302 | + onConfigChange(newConfig) {}, |
| 303 | + stop(_context) {}, |
| 304 | + }, |
| 305 | +}); |
| 306 | + |
| 307 | +``` |
| 308 | + |
| 309 | +### Casos de uso comunes |
| 310 | + |
| 311 | +- inyectar CSS personalizado: crea un archivo `style.css` en la misma carpeta y luego: |
| 312 | + |
| 313 | +```typescript |
| 314 | +// index.ts |
| 315 | +import style from './style.css?inline'; // importar estilo como inline |
| 316 | + |
| 317 | +import { createPlugin } from '@/utils'; |
| 318 | + |
| 319 | +export default createPlugin({ |
| 320 | + name: 'Plugin Label', |
| 321 | + restartNeeded: true, // si el valor es true, ytmusic mostrará el diálogo de reinicio |
| 322 | + config: { |
| 323 | + enabled: false, |
| 324 | + }, // tu configuración personalizada |
| 325 | + stylesheets: [style], // tu estilo personalizado |
| 326 | + renderer() {} // define el hook del renderizador |
| 327 | +}); |
| 328 | +``` |
| 329 | + |
| 330 | +- Si quieres cambiar el HTML: |
| 331 | + |
| 332 | +```typescript |
| 333 | +import { createPlugin } from '@/utils'; |
| 334 | + |
| 335 | +export default createPlugin({ |
| 336 | + name: 'Plugin Label', |
| 337 | + restartNeeded: true, // si el valor es true, ytmusic mostrará el diálogo de reinicio |
| 338 | + config: { |
| 339 | + enabled: false, |
| 340 | + }, // tu configuración personalizada |
| 341 | + renderer() { |
| 342 | + // Elimina el botón de inicio de sesión |
| 343 | + document.querySelector(".sign-in-link.ytmusic-nav-bar").remove(); |
| 344 | + } // define el hook del renderizador |
| 345 | +}); |
| 346 | +``` |
| 347 | + |
| 348 | +- comunicación entre el front y el back: se puede hacer utilizando el módulo ipcMain de electron. Ver archivo `index.ts` y |
| 349 | + ejemplo en el plugin `sponsorblock`. |
| 350 | + |
| 351 | +## Compilar |
| 352 | + |
| 353 | +1. Clonar el repositorio |
| 354 | +2. Seguir [esta guía](https://pnpm.io/es/installation) para instalar `pnpm` |
| 355 | +3. Ejecutar `pnpm install --frozen-lockfile` para instalar las dependencias |
| 356 | +4. Ejecutar `pnpm build:OS` |
| 357 | + |
| 358 | +- `pnpm dist:win` - Windows |
| 359 | +- `pnpm dist:linux` - Linux (amd64) |
| 360 | +- `pnpm dist:linux:deb-arm64` - Linux (arm64 para Debian) |
| 361 | +- `pnpm dist:linux:rpm-arm64` - Linux (arm64 para Fedora) |
| 362 | +- `pnpm dist:mac` - macOS (amd64) |
| 363 | +- `pnpm dist:mac:arm64` - macOS (arm64) |
| 364 | + |
| 365 | +Construye la aplicación para macOS, Linux y Windows, |
| 366 | +utilizando [electron-builder](https://github.com/electron-userland/electron-builder). |
| 367 | + |
| 368 | +## Vista previa de producción |
| 369 | + |
| 370 | +```bash |
| 371 | +pnpm start |
| 372 | +``` |
| 373 | + |
| 374 | +## Tests |
| 375 | + |
| 376 | +```bash |
| 377 | +pnpm test |
| 378 | +``` |
| 379 | + |
| 380 | +Utiliza [Playwright](https://playwright.dev/) para probar la aplicación. |
| 381 | + |
| 382 | +## Licencia |
| 383 | + |
| 384 | +MIT © [th-ch](https://github.com/th-ch/youtube-music) |
| 385 | + |
| 386 | +## Preguntas frecuentes |
| 387 | + |
| 388 | +### ¿Por qué no se muestra el menú de aplicaciones? |
| 389 | + |
| 390 | +Si la opción `Ocultar menú` está activada - puedes mostrar el menú con la tecla <kbd>alt</kbd> (o <kbd>\`</kbd> [acento grave] si estás utilizando el plugin in-app-menu) |
0 commit comments