Compare commits

...

13 Commits

Author SHA1 Message Date
462cb71dd7 chore(deps): update actions/upload-artifact action to v6 2026-02-12 13:45:47 +00:00
e2f1ff50dd feat(synced-lyrics): Added Hindi & Bengali romanization support for lyrics (#3933)
Co-authored-by: pranjol <pranjol@pranjols-iMac-Pro.local>
2026-02-11 08:00:36 +09:00
3f1ceca39c chore(i18n): Translated using Weblate (Telugu)
Currently translated at 2.7% (13 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/te/
2026-02-10 10:09:44 +00:00
37277b2764 chore(i18n): Added translation using Weblate (Telugu) 2026-02-09 11:03:37 +01:00
ba89772b09 chore(i18n): Translated using Weblate (Turkish)
Currently translated at 100.0% (469 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/tr/
2026-02-07 19:09:44 +00:00
13a0e8e2ab chore(i18n): Translated using Weblate (Italian)
Currently translated at 99.7% (468 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/it/
2026-02-05 18:01:49 +01:00
faddaea403 chore(i18n): Translated using Weblate (Korean)
Currently translated at 100.0% (469 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/ko/
2026-02-04 14:02:00 +00:00
f50025f1f6 fix: pin deps 2026-02-03 19:06:04 +09:00
0f3a01718c fix: fix deps 2026-02-03 19:01:36 +09:00
3b4a1444f1 chore(deps): update deps 2026-02-03 19:00:19 +09:00
f403700bf7 refactor(music-together): Removed delay dependency (#4201) 2026-02-03 18:55:51 +09:00
eab9f8ebcb chore(i18n): Translated using Weblate (French)
Currently translated at 100.0% (469 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/fr/
2026-02-03 05:18:43 +00:00
8a074a6f37 chore(i18n): Translated using Weblate (Slovak)
Currently translated at 87.2% (409 of 469 strings)

Translation: pear-devs/pear-desktop/i18n
Translate-URL: https://hosted.weblate.org/projects/youtube-music/i18n/sk/
2026-02-03 05:18:41 +00:00
13 changed files with 594 additions and 577 deletions

View File

@ -87,7 +87,7 @@ jobs:
pnpm dist:win
- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: build-artifacts-${{ matrix.os }}
path: pack/

View File

@ -46,7 +46,7 @@
"pnpm": {
"overrides": {
"vite": "npm:rolldown-vite@7.3.1",
"node-gyp": "11.5.0",
"node-gyp": "12.2.0",
"xml2js": "0.6.2",
"node-fetch": "3.3.2",
"@electron/universal": "3.0.2",
@ -64,7 +64,7 @@
},
"dependencies": {
"@dehoist/romanize-thai": "1.0.0",
"@electron-toolkit/tsconfig": "1.0.1",
"@electron-toolkit/tsconfig": "2.0.0",
"@electron/remote": "2.1.3",
"@ffmpeg.wasm/core-mt": "0.12.0",
"@ffmpeg.wasm/main": "0.12.0",
@ -75,13 +75,14 @@
"@hono/node-server": "1.19.9",
"@hono/node-ws": "1.3.0",
"@hono/swagger-ui": "0.5.3",
"@hono/zod-openapi": "1.2.0",
"@hono/zod-openapi": "1.2.1",
"@hono/zod-validator": "0.7.6",
"@indic-transliteration/sanscript": "1.3.3",
"@jellybrick/dbus-next": "0.10.3",
"@jellybrick/electron-better-web-request": "2.0.0",
"@jellybrick/mpris-service": "2.1.5",
"@jimp/plugin-color": "1.6.0",
"@mdui/icons": "^1.0.3",
"@mdui/icons": "1.0.3",
"@skyra/jaro-winkler": "1.1.1",
"@xhayper/discord-rpc": "1.3.0",
"async-mutex": "0.5.0",
@ -89,27 +90,26 @@
"butterchurn": "3.0.0-beta.5",
"butterchurn-presets": "3.0.0-beta.4",
"color": "5.0.3",
"conf": "14.0.0",
"conf": "15.0.2",
"custom-electron-prompt": "1.6.1",
"deepmerge-ts": "7.1.5",
"delay": "6.0.0",
"electron-debug": "4.1.0",
"electron-is": "3.0.0",
"electron-localshortcut": "3.2.1",
"electron-store": "10.1.0",
"electron-store": "11.0.2",
"electron-unhandled": "5.0.0",
"electron-updater": "6.7.3",
"es-hangul": "2.3.8",
"fast-average-color": "9.5.0",
"fast-equals": "5.4.0",
"fast-equals": "6.0.0",
"fflate": "0.8.2",
"filenamify": "6.0.0",
"filenamify": "7.0.1",
"hanja": "1.1.5",
"happy-dom": "20.4.0",
"happy-dom": "20.5.0",
"hono": "4.11.7",
"howler": "2.2.4",
"html-to-text": "9.0.5",
"i18next": "25.5.2",
"i18next": "25.8.0",
"jimp": "1.6.0",
"keyboardevent-from-electron-accelerator": "2.0.0",
"keyboardevents-areequal": "0.2.2",
@ -134,14 +134,14 @@
"virtua": "0.48.5",
"vudio": "2.1.1",
"x11": "2.3.0",
"youtubei.js": "^16.0.1",
"zod": "4.2.1"
"youtubei.js": "16.0.1",
"zod": "4.3.6"
},
"devDependencies": {
"@electron-toolkit/tsconfig": "1.0.1",
"@eslint/js": "9.39.2",
"@malept/flatpak-bundler": "0.4.0",
"@playwright/test": "1.58.0",
"@playwright/test": "1.58.1",
"@stylistic/eslint-plugin": "5.7.1",
"@total-typescript/ts-reset": "0.6.1",
"@types/electron-localshortcut": "3.1.3",
@ -152,11 +152,11 @@
"bufferutil": "4.1.0",
"builtin-modules": "5.0.0",
"cross-env": "10.1.0",
"del-cli": "6.0.0",
"discord-api-types": "0.38.37",
"del-cli": "7.0.0",
"discord-api-types": "0.38.38",
"electron": "40.1.0",
"electron-builder": "26.4.0",
"electron-builder-squirrel-windows": "26.4.0",
"electron-builder": "26.7.0",
"electron-builder-squirrel-windows": "26.7.0",
"electron-devtools-installer": "4.0.0",
"electron-vite": "5.0.0",
"eslint": "9.39.2",
@ -166,11 +166,11 @@
"eslint-plugin-import": "2.32.0",
"eslint-plugin-prettier": "5.5.5",
"eslint-plugin-solid": "0.14.5",
"glob": "11.1.0",
"node-gyp": "11.5.0",
"glob": "13.0.0",
"node-gyp": "12.2.0",
"ts-morph": "27.0.2",
"typescript": "5.9.3",
"typescript-eslint": "8.53.1",
"typescript-eslint": "8.54.0",
"utf-8-validate": "6.0.6",
"vite": "npm:rolldown-vite@7.3.1",
"vite-plugin-inspect": "11.3.3",
@ -184,4 +184,4 @@
"unreleased": true,
"output": "changelog.md"
}
}
}

856
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -161,7 +161,8 @@
"default": "Par défaut",
"force-show": "Forcer à apparaître",
"hide": "Cacher",
"label": "Boutons « J'aime »"
"label": "Boutons « J'aime »",
"swap": "Inverser l'order des boutons like"
},
"remove-upgrade-button": "Supprimer le bouton de mise à niveau",
"theme": {
@ -412,6 +413,17 @@
"no-captions": "Aucun sous-titres disponibles pour cette chanson"
}
},
"clock": {
"description": "Ajoute une horloge a la barre de navigation",
"menu": {
"format": {
"24-hour-format": "Format 24 heures",
"display-seconds": "Afficher les secondes",
"label": "Format"
}
},
"name": "Horloge"
},
"compact-sidebar": {
"description": "Toujours définir la barre latérale en mode compact",
"name": "Barre latérale compacte"

View File

@ -161,7 +161,8 @@
"default": "Predefinito",
"force-show": "Forza la visualizzazione",
"hide": "Nascondi",
"label": "Pulsanti Like"
"label": "Pulsanti Like",
"swap": "Scambia l'ordine dei pulsanti like"
},
"remove-upgrade-button": "Rimuovi il pulsante aggiorna",
"theme": {
@ -412,6 +413,17 @@
"no-captions": "Nessun sottotitolo disponibile per questa canzone"
}
},
"clock": {
"description": "Aggiungi un orologio alla barra di navigazione",
"menu": {
"format": {
"24-hour-format": "Formato in 24 ore",
"display-seconds": "Mostra Secondi",
"label": "Formato"
}
},
"name": "Orologio"
},
"compact-sidebar": {
"description": "Imposta sempre la barra laterale in modalità compatta",
"name": "Barra laterale compatta"

View File

@ -2,13 +2,13 @@
"common": {
"console": {
"plugins": {
"execute-failed": "확장 {{pluginName}}::{{contextName}}을(를) 실행하지 못했습니다",
"execute-failed": "확장 {{pluginName}}::{{contextName}}을(를) 실행 실패함",
"executed-at-ms": "확장 {{pluginName}}::{{contextName}}이 {{ms}}ms 만에 실행됨",
"initialize-failed": "확장 \"{{pluginName}}\"을(를) 초기화하지 못했습니다",
"initialize-failed": "확장 \"{{pluginName}}\"을(를) 초기화 실패함",
"load-all": "모든 확장 로드 중",
"load-failed": "확장 \"{{pluginName}}\"을(를) 로드하지 못했습니다",
"loaded": "확장 \"{{pluginName}}\" 로드됨",
"unload-failed": "확장 \"{{pluginName}}\"을(를) 언로드하지 못했습니다",
"unload-failed": "확장 \"{{pluginName}}\"을(를) 언로드 실패함",
"unloaded": "확장 \"{{pluginName}}\" 언로드 됨"
}
}
@ -21,7 +21,7 @@
"main": {
"console": {
"did-finish-load": {
"dev-tools": "로드 완료되었습니다. 개발자 도구가 열렸습니다"
"dev-tools": "로드 완료. 개발자 도구 실행됨"
},
"i18n": {
"loaded": "국제화 로드됨"
@ -30,32 +30,32 @@
"receive-command": "프로토콜을 통해 명령을 받았습니다: \"{{command}}\""
},
"theme": {
"css-file-not-found": "CSS 파일 \"{{cssFile}}\"이(가) 존재하지 않습니다. 무시합니다"
"css-file-not-found": "CSS 파일 \"{{cssFile}}\"이(가) 존재하지 않. 무시"
},
"unresponsive": {
"details": "응답 없음 오류!\n{{error}}"
},
"when-ready": {
"clearing-cache-after-20s": "앱 캐시 지우"
"clearing-cache-after-20s": "앱 캐시 지우는 중"
},
"window": {
"tried-to-render-offscreen": "창이 오프스크린 렌더링을 시도했습니다. windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
"tried-to-render-offscreen": "창이 오프스크린 렌더링을 시도했습니다, windowSize={{windowSize}}, displaySize={{displaySize}}, position={{position}}"
}
},
"dialog": {
"hide-menu-enabled": {
"detail": "'Alt' 키를 눌러 숨겨진 메뉴를 표시할 수 있습니다 (인앱 메뉴를 사용하는 경우 'Esc' 키를 사용)",
"message": "메뉴 숨기기가 활성화되어 있습니다",
"message": "메뉴 숨기기가 활성화되어 있",
"title": "메뉴 숨기기 활성화됨"
},
"need-to-restart": {
"buttons": {
"later": "나중에 하기",
"later": "나중에",
"restart-now": "지금 재시작하기"
},
"detail": "\"{{pluginName}}\" 확장을 적용하려면 재시작해야 합니다",
"message": "\"{{pluginName}}\"은(는) 재시작이 필요합니다",
"title": "재시작 필요"
"title": "재시작 필요"
},
"unresponsive": {
"buttons": {
@ -63,17 +63,17 @@
"relaunch": "재시작",
"wait": "기다리기"
},
"detail": "불편을 드려 죄송합니다! 방법을 선택해 주세요:",
"detail": "불편을 드려 죄송합니다! 다음 중 하나를 선택해 주세요.",
"message": "애플리케이션이 응답하지 않습니다",
"title": "창이 응답하지 않음"
},
"update-available": {
"buttons": {
"disable": "업데이트 비활성화",
"disable": "업데이트 비활성화하기",
"download": "다운로드",
"ok": "확인"
},
"detail": "새 버전이 출시되었습니다. {{downloadLink}}에서 다운로드할 수 있습니다",
"detail": "새 버전 {{downloadLink}}에서 설치할 수 있습니다",
"message": "새 버전을 사용할 수 있습니다",
"title": "업데이트 사용 가능"
}
@ -96,23 +96,23 @@
"advanced-options": {
"label": "고급 설정",
"submenu": {
"auto-reset-app-cache": "앱 시작 시 앱 캐시 초기화",
"auto-reset-app-cache": "앱 시작 시 앱 캐시 초기화하기",
"disable-hardware-acceleration": "하드웨어 가속 비활성화",
"edit-config-json": "config.json 편집",
"override-user-agent": "User-Agent 재정의",
"restart-on-config-changes": "설정 변경 시 재시작",
"override-user-agent": "User-Agent 재정의하기",
"restart-on-config-changes": "설정 변경 시 재시작하기",
"set-proxy": {
"label": "프록시 설정",
"label": "프록시 설정하기",
"prompt": {
"label": "프록시 주소를 입력하세요: (비워두면 비활성화됨)",
"label": "프록시 주소를 입력하세요: (비어있을 시 비활성화됨)",
"placeholder": "예제: SOCKS5://127.0.0.1:9999",
"title": "프록시 설정"
"title": "프록시 설정하기"
}
},
"toggle-dev-tools": "DevTools 열기"
}
},
"always-on-top": "항상 최상단에 표시",
"always-on-top": "항상 최상단에 표시하기",
"auto-update": "자동 업데이트",
"hide-menu": {
"dialog": {
@ -153,15 +153,16 @@
"custom-window-title": {
"label": "사용자 정의 앱 제목",
"prompt": {
"label": "앱 제목으로 표시할 내용 : (빈 칸 일시 비활성화)",
"label": "앱 제목으로 표시할 내용: (빈칸일 시 비활성화)",
"placeholder": "예: {{applicationName}}"
}
},
"like-buttons": {
"default": "기본",
"force-show": "강제로 표시",
"force-show": "강제로 표시하기",
"hide": "숨기기",
"label": "좋아요 버튼"
"label": "좋아요 버튼",
"swap": "\"좋아요\" 버튼 순서 변경하기"
},
"remove-upgrade-button": "업그레이드 버튼 제거",
"theme": {
@ -186,7 +187,7 @@
"plugins": {
"enabled": "활성화",
"label": "확장",
"new": "NEW"
"new": "새 플러그인"
},
"view": {
"label": "보기",
@ -215,7 +216,7 @@
},
"plugins": {
"ad-speedup": {
"description": "광고가 재생될 때, 오디오가 음소거고 재생 속도 16배로 설정니다",
"description": "광고가 재생될 때 소리를 음소거고 재생 속도 16배로 설정니다",
"name": "광고 배속"
},
"adblocker": {
@ -243,7 +244,7 @@
"name": "앨범 컬러 기반 테마"
},
"ambient-mode": {
"description": "영상의 간접 조명을 화면 배경에 투사합니다",
"description": "영상의 간접 조명을 화면 배경에 투사하여 조명 효과를 적용합니다",
"menu": {
"blur-amount": {
"label": "흐림 효과 강도",
@ -252,7 +253,7 @@
}
},
"buffer": {
"label": "버퍼",
"label": "버퍼",
"submenu": {
"buffer": "{{buffer}}"
}
@ -289,7 +290,7 @@
},
"amuse": {
"description": "6K Labs Amuse의 'now playing' 위젯에 {{applicationName}} 지원 추가",
"name": "Amuseio AB",
"name": "Amuse (어뮤즈)",
"response": {
"query": "Amuse API 서버가 실행 중입니다. GET /query로 노래 정보를 가져오세요."
}
@ -358,10 +359,10 @@
"name": "오디오 컴프레서"
},
"auth-proxy-adapter": {
"description": "아이디/패스워드가 필요한 프록시를 지원합니다",
"description": "인증이 필요한 프록시를 지원합니다",
"menu": {
"disable": "프록시 어댑터 차단",
"enable": "프록시 어댑터 허용",
"disable": "프록시 어댑터 비활성화",
"enable": "프록시 어댑터 활성화",
"hostname": {
"label": "호스트 명"
},
@ -372,11 +373,11 @@
"name": "권한 프록시 어댑터",
"prompt": {
"hostname": {
"label": "로컬 프록시 서버의 호스트명 을 입력 해주세요 (재시이 필요합니다):",
"label": "로컬 프록시 서버의 호스트명을 입력해주세요 (재시이 필요합니다):",
"title": "프록시 호스트명"
},
"port": {
"label": "로컬 프록시 서버의 포트를 입력 해주세요 (재시이 필요합니다):",
"label": "로컬 프록시 서버의 포트를 입력 해주세요 (재시이 필요합니다):",
"title": "프록시 포트"
}
}
@ -386,7 +387,7 @@
"name": "탐색 바 흐림 효과"
},
"bypass-age-restrictions": {
"description": "음악 플레이어의 연령 확인 우회합니다",
"description": "플레이어의 연령 확인 인증 우회",
"name": "나이 제한 우회"
},
"captions-selector": {
@ -408,10 +409,21 @@
},
"toast": {
"caption-changed": "자막 언어가 {{language}}(으)로 변경되었습니다",
"caption-disabled": "자막 비활성화 되었습니다",
"caption-disabled": "자막 비활성화",
"no-captions": "이 곡에는 자막이 없습니다"
}
},
"clock": {
"description": "네비게이션 바 옆 시계 추가하기",
"menu": {
"format": {
"24-hour-format": "24시간 형식",
"display-seconds": "초 표시하기",
"label": "형식"
}
},
"name": "시계"
},
"compact-sidebar": {
"description": "사이드바를 항상 컴팩트 모드로 설정합니다",
"name": "컴팩트 사이드바"
@ -439,9 +451,9 @@
}
},
"custom-output-device": {
"description": "미디어 출력 장치 구성",
"description": "미디어 출력할­ 장치 구성하기",
"menu": {
"device-selector": "장치 선택"
"device-selector": "장치 선택하세요"
},
"name": "출력 장치 커스텀",
"prompt": {
@ -461,16 +473,16 @@
"discord": {
"backend": {
"already-connected": "활성화 된 연결에 연결을 시도했습니다",
"connected": "디스코드에 연결됨",
"disconnected": "디스코드에서 연결이 끊김"
"connected": "Discord에 연결됨",
"disconnected": "Discord에서 연결이 끊김"
},
"description": "활동 상태를 사용하여 친구들에게 내가 듣는 음악을 보여주세요",
"description": "Rich Presence를 사용하여 친구들에게 내가 듣는 음악을 보여주세요",
"menu": {
"auto-reconnect": "자동 연결",
"auto-reconnect": "자동 연결",
"clear-activity": "활동 제거",
"clear-activity-after-timeout": "시간 초과 시 활동 제거",
"connected": "연결 됨",
"disconnected": "연결 해제 됨",
"connected": "연결됨",
"disconnected": "연결 해제됨",
"hide-duration-left": "남은 재생 시간 숨기기",
"hide-github-button": "GitHub 링크 버튼 숨기기",
"play-on-application": "{{applicationName}} 에서 재생",
@ -484,7 +496,7 @@
}
}
},
"name": "디스코드 활동 상태",
"name": "Discord 활동 상태",
"prompt": {
"set-inactivity-timeout": {
"label": "비활성 시간 제한을 초 단위로 입력하세요:",
@ -499,7 +511,7 @@
"buttons": {
"ok": "확인"
},
"message": "죄송합니다. 다운로드가 실패했습니다…",
"message": "앗! 죄송합니다. 다운로드가 실패했습니다…",
"title": "다운로드 중 오류 발생!"
},
"start-download-playlist": {
@ -512,7 +524,7 @@
}
},
"feedback": {
"conversion-progress": "변환: {{percent}}%",
"conversion-progress": "변환: {{percent}}%",
"converting": "변환 중…",
"done": "완료: {{filePath}}",
"download-info": "{{artist}} - {{title}} [{{videoId}} 다운로드 중",
@ -527,7 +539,7 @@
"playlist-has-only-one-song": "재생목록에 한 항목만 존재합니다. 직접 다운로드합니다",
"playlist-id-not-found": "재생목록 ID를 찾을 수 없습니다",
"playlist-is-empty": "재생목록이 비어있습니다",
"playlist-is-mix-or-private": "재생목록 정보 가져오는 중 오류 발생: 비공개 재생목록 또는 '유튜브 Mix' 재생목록이 아닌지 확인하세요\n\n{{error}}",
"playlist-is-mix-or-private": "재생목록 정보 가져오는 중 오류 발생: 비공개 재생목록 또는 \"나만을 위한 맞춤 믹스\" 재생목록이 아닌지 확인하세요\n\n{{error}}",
"preparing-file": "파일 준비 중…",
"saving": "저장 중…",
"trying-to-get-playlist-id": "재생목록 ID를 가져오는 중: {{playlistId}}",

View File

@ -396,6 +396,17 @@
"no-captions": "Pre túto skladbu nie sú dostupné žiadne titulky"
}
},
"clock": {
"description": "Pridať hodiny do navigačnej lišty",
"menu": {
"format": {
"24-hour-format": "24-hodinový formát",
"display-seconds": "Zobraz sekundy",
"label": "Formát"
}
},
"name": "Hodiny"
},
"compact-sidebar": {
"description": "Vždy nastaviť bočný panel do kompaktného režimu",
"name": "Kompaktný bočný panel"
@ -462,8 +473,8 @@
"set-status-display-type": {
"label": "Text stavu",
"submenu": {
"artist": "Aktuálne si prehráva {artist}",
"application": "Počúvať {{applicationName}}",
"artist": "Aktuálne si prehráva {artist}",
"title": "Aktuálne si prehráva {song title}"
}
}

View File

@ -0,0 +1,31 @@
{
"common": {
"console": {
"plugins": {
"execute-failed": "{{pluginName}}::{{contextName}} ప్లగిన్‌ను అమలు చేయడంలో విఫలమైంది",
"executed-at-ms": "{{pluginName}}::{{contextName}} ప్లగిన్ అమలు చేయబడిన సమయం {{ms}} మిల్లీసెకను",
"initialize-failed": "\"{{pluginName}}\" ప్లగిన్‌ను ప్రారంభించడంలో విఫలమైంది",
"load-all": "అన్నీ ప్లగిన్లను లోడ్ చెయ్యబడుతోంది",
"load-failed": "\"{{pluginName}}\" ప్లగిన్ లోడ్ చేయడంలో విఫలమైంది",
"loaded": "ప్లగిన్ \"{{pluginName}}\" లోడ్ చేయబడింది",
"unload-failed": "“{{pluginName}}” ప్లగిన్‌ను అన్‌లోడ్ చేయడంలో విఫలమైంది",
"unloaded": "\"{{pluginName}}\" ప్లగిన్ అన్‌లోడ్ చేయబడింది"
}
}
},
"language": {
"code": "te",
"local-name": "తెలుగు",
"name": "Telugu"
},
"main": {
"console": {
"did-finish-load": {
"dev-tools": "లోడ్ చేయడం పూర్తయింది. డెవ్‌టూల్స్ తెరవబడ్డాయి"
},
"i18n": {
"loaded": "i18n లోడ్ చేయబడింది"
}
}
}
}

View File

@ -53,9 +53,9 @@
"later": "Daha Sonra",
"restart-now": "Şimdi yeniden başlat"
},
"detail": "\"{{pluginName}}\" eklentisinin çalışabilmesi için yeniden başlatman gerekiyor",
"message": "\"{{pluginName}}\" için yeniden başlatman gerekiyor",
"title": "Uygulamayı yeniden başlatman gerekiyor"
"detail": "\"{{pluginName}}\" eklentisinin çalışması için uygulamanın yeniden başlatılması gerekiyor",
"message": "\"{{pluginName}}\" eklentisi için uygulamanın yeniden başlatılması gerekiyor",
"title": "Uygulamanın yeniden başlatılması gerekiyor"
},
"unresponsive": {
"buttons": {
@ -161,7 +161,8 @@
"default": "Varsayılan",
"force-show": "Zorla göster",
"hide": "Gizle",
"label": "Beğenme düğmeleri"
"label": "Beğenme düğmeleri",
"swap": "Beğenme butonlarının sıralamasını değiştir"
},
"remove-upgrade-button": "Yükseltme düğmesini kaldır",
"theme": {
@ -412,6 +413,17 @@
"no-captions": "Bu şarkı için altyazı mevcut değil"
}
},
"clock": {
"description": "Navigasyon barına bir saat ekle",
"menu": {
"format": {
"24-hour-format": "24-Saat Formatı, Biçimi",
"display-seconds": "Saniyeleri göster",
"label": "Format, Biçim"
}
},
"name": "Saat"
},
"compact-sidebar": {
"description": "Her zaman kompakt kenar çubugu",
"name": "Kompakt Kenar Çubuğu"

View File

@ -1,15 +1,9 @@
import {
type DataConnection,
Peer,
type PeerError,
PeerErrorType,
} from 'peerjs';
import delay from 'delay';
import { type DataConnection, Peer, type PeerError } from 'peerjs';
import type { Permission, Profile, VideoData } from './types';
export type ConnectionEventMap = {
CLEAR_QUEUE: {};
CLEAR_QUEUE: null;
ADD_SONGS: { videoList: VideoData[]; index?: number };
REMOVE_SONG: { index: number };
MOVE_SONG: { fromIndex: number; toIndex: number };
@ -104,16 +98,14 @@ export class Connection {
this.peer.disconnect();
this.peer.destroy();
});
this.peer.on('error', async (err) => {
if (err.type === PeerErrorType.Network) {
// retrying after 10 seconds
await delay(10000);
try {
this.peer.reconnect();
return;
} catch {
//ignored
}
this.peer.on('error', (err) => {
if (err.type === 'network') {
setTimeout(() => {
try {
this.peer.reconnect();
} catch {}
}, 10000);
return;
}
this.waitOpen.reject(err);
@ -176,7 +168,9 @@ export class Connection {
after?: ConnectionEventUnion[],
) {
await Promise.all(
this.getConnections().map((conn) => conn.send({ type, payload, after })),
this.getConnections().map(
(conn) => conn.send({ type, payload, after }) ?? Promise.resolve(),
),
);
}

View File

@ -224,7 +224,7 @@ export default createPlugin<
}
this.queue?.clear();
await this.connection?.broadcast('CLEAR_QUEUE', {});
await this.connection?.broadcast('CLEAR_QUEUE', null);
break;
}
case 'SET_INDEX': {
@ -413,7 +413,7 @@ export default createPlugin<
this.ignoreChange = true;
switch (event.type) {
case 'CLEAR_QUEUE': {
await this.connection?.broadcast('CLEAR_QUEUE', {});
await this.connection?.broadcast('CLEAR_QUEUE', null);
break;
}
case 'SET_INDEX': {

View File

@ -316,7 +316,7 @@ export class Queue {
this.ignoreFlag = true;
this.broadcast({
type: 'CLEAR_QUEUE',
payload: {},
payload: null,
});
return;
}

View File

@ -7,6 +7,7 @@ import * as pinyin from 'tiny-pinyin';
import { romanize as romanizeThaiFrag } from '@dehoist/romanize-thai';
import { lazy } from 'lazy-var';
import { detect } from 'tinyld';
import Sanscript from '@indic-transliteration/sanscript';
import { waitForElement } from '@/utils/wait-for-element';
import { LyricsRenderer, setIsVisible } from './renderer';
@ -155,6 +156,12 @@ const hasChinese = (lines: string[]) =>
const hasThai = (lines: string[]) =>
lines.some((line) => /[\u0E00-\u0E7F]+/.test(line));
const hasBengali = (lines: string[]) =>
lines.some((line) => /[\u0980-\u09FF]+/.test(line));
const hasHindi = (lines: string[]) =>
lines.some((line) => /[\u0900-\u097F]+/.test(line));
export const romanizeJapanese = async (line: string) =>
(await kuroshiro.get()).convert(line, {
to: 'romaji',
@ -190,11 +197,35 @@ export const romanizeThai = (line: string) => {
return latin;
};
export const romanizeBengali = (line: string) => {
try {
let out = Sanscript.t(line, 'bengali', 'iast');
out = out.normalize('NFD');
out = out.replace(/[\u0300-\u036f]/g, '');
out = out.replace(/[\u09BC\u09BE-\u09CD]/g, '');
return out.toLowerCase();
} catch {
return line;
}
};
export const romanizeHindi = (line: string) => {
try {
let out = Sanscript.t(line, 'devanagari', 'iast');
out = out.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); // strip accents
return out.replace(/[^a-zA-Z\s]/g, '') || line; // remove any remaining symbols
} catch {
return line;
}
};
const handlers: Record<string, (line: string) => Promise<string> | string> = {
ja: romanizeJapanese,
ko: romanizeHangul,
zh: romanizeChinese,
th: romanizeThai,
bn: romanizeBengali,
hi: romanizeHindi,
};
export const romanize = async (line: string) => {
@ -210,6 +241,8 @@ export const romanize = async (line: string) => {
if (hasKorean([line])) line = romanizeHangul(line);
if (hasChinese([line])) line = romanizeChinese(line);
if (hasThai([line])) line = romanizeThai(line);
if (hasBengali([line])) line = romanizeBengali(line);
if (hasHindi([line])) line = romanizeHindi(line);
return line;
};