diff --git a/readme.md b/README.md similarity index 98% rename from readme.md rename to README.md index 20ff6d5b..2c82dda2 100644 --- a/readme.md +++ b/README.md @@ -20,6 +20,8 @@ +Read this in other languages: [๐ฐ๐ท](./docs/readme/README-ko.md) + **Electron wrapper around YouTube Music featuring:** - Native look & feel, aims at keeping the original interface @@ -253,7 +255,7 @@ export default createPlugin({ }, // it fired when config changed onConfigChange(newConfig) { /* ... */ }, - // you can also clean up plugin + // it fired when plugin disabled stop(context) { /* ... */ }, }, renderer: { @@ -317,7 +319,7 @@ const builder = createPlugin({ }); ``` -- communicating between the front and back: can be done using the ipcMain module from electron. See `utils.js` file and +- communicating between the front and back: can be done using the ipcMain module from electron. See `index.ts` file and example in `sponsorblock` plugin. ## Build diff --git a/docs/readme/README-ko.md b/docs/readme/README-ko.md new file mode 100644 index 00000000..1d921e37 --- /dev/null +++ b/docs/readme/README-ko.md @@ -0,0 +1,327 @@ +# ์ ํ๋ธ ๋ฎค์ง (YouTube Music) + +
+
+
+## ๋ค์ด๋ก๋
+
+[์ต์ ๋ฆด๋ฆฌ์ฆ](https://github.com/th-ch/youtube-music/releases/latest)๋ฅผ ํ์ธํ์ฌ ์ต์ ๋ฒ์ ์ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
+
+### Arch Linux
+
+AUR์์ `youtube-music-bin` ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค. AUR ์ค์น ์ง์นจ์ [์ด ์ํค ํ์ด์ง](https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages)๋ฅผ ์ฐธ์กฐํ์ธ์.
+
+### MacOS
+
+Homebrew๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ์ค์นํ ์ ์์ต๋๋ค:
+```bash
+brew install --cask https://raw.githubusercontent.com/th-ch/youtube-music/master/youtube-music.rb
+```
+
+(์ฑ์ ์๋์ผ๋ก ์ค์นํ๊ณ ) ์ฑ์ ์คํํ ๋ `์์๋์๊ธฐ ๋๋ฌธ์ ์ด ์ ์์ต๋๋ค.`๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํฐ๋ฏธ๋์์ ๋ค์์ ์คํํ์ธ์:
+
+```bash
+xattr -cr /Applications/YouTube\ Music.app
+```
+
+### Windows
+
+[Scoop ํจํค์ง ๋งค๋์ ](https://scoop.sh)๋ฅผ ์ฌ์ฉํ์ฌ [`extras` ๋ฒํท](https://github.com/ScoopInstaller/Extras)์์ `youtube-music` ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ต๋๋ค.
+
+```bash
+scoop bucket add extras
+scoop install extras/youtube-music
+```
+
+๋๋ Windows 11์ ๊ณต์ CLI ํจํค์ง ๊ด๋ฆฌ์์ธ [Winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/)์ ์ฌ์ฉํ์ฌ `th-ch.YouTubeMusic` ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ต๋๋ค.
+
+*์ฐธ๊ณ : "์ ์ ์๋ ๊ฒ์์"์ ํ์ผ์ด๊ธฐ ๋๋ฌธ์ Microsoft Defender์ SmartScreen์์ ์ค์น๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค. ์ด๋ GitHub์์ ๋์ผ ํ์ผ์ ์๋์ผ๋ก ๋ค์ด๋ก๋ํ ํ ์คํ ํ์ผ(.exe)์ ์คํํ๋ ค๊ณ ํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ํฉ๋๋ค.*
+
+```bash
+winget install th-ch.YouTubeMusic
+```
+
+#### (Windows์์) ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ์ง ์๊ณ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ์?
+
+- [๋ฆด๋ฆฌ์ฆ ํ์ด์ง](https://github.com/th-ch/youtube-music/releases/latest)์์ _๋ณธ์ธ ๊ธฐ๊ธฐ ์ํคํ
์ฒ_์ ๋ง๋ `*.nsis.7z` ํ์ผ์ ๋ค์ด๋ก๋ํ์ธ์.
+ - `x64`๋ 64๋นํธ Windows ์ฉ์
๋๋ค.
+ - `ia32`๋ 32๋นํธ Windows ์ฉ์
๋๋ค.
+ - `arm64`๋ ARM64 Windows ์ฉ์
๋๋ค.
+- ๋ฆด๋ฆฌ์ฆ ํ์ด์ง์์ ์ค์น๊ธฐ๋ฅผ ๋ค์ด๋ก๋ํ์ธ์. (`*-Setup.exe`)
+- ๋ ํ์ผ์ **๋์ผํ ์์น**์ ๋์์ฃผ์ธ์.
+- ์ค์น๊ธฐ๋ฅผ ์คํํ์ธ์.
+
+## ๊ธฐ๋ฅ:
+
+- **์ผ์ ์ ์ง ์ ์๋ ํ์ธ** (ํญ์ ํ์ฑํ ๋จ): ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์์
์ ์ผ์ ์ ์งํ๋ ["๊ณ์ ์์ฒญํ์๊ฒ ์ต๋๊น?"](https://user-images.githubusercontent.com/61631665/129977894-01c60740-7ec6-4bf0-9a2c-25da24491b0e.png) ํ์
์ ๋นํ์ฑํํฉ๋๋ค.
+
+- ์ด์ธ์ ๋ ๋ง์ ๊ธฐ๋ฅ ...
+
+## ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ฌ๊ทธ์ธ:
+
+- **์ ๋๋ธ๋ก**: ๋ชจ๋ ๊ด๊ณ ์ ํธ๋์ปค๋ฅผ ์ฆ์ ์ฐจ๋จํฉ๋๋ค
+
+- **์จ๋ฒ ์ปฌ๋ฌ ๊ธฐ๋ฐ ํ
๋ง**: ์จ๋ฒ ์์ ํ๋ ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ํ
๋ง ๋ฐ ์๊ฐ ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค
+
+- **์ฐ๋น์ธํธ ๋ชจ๋**: ์์์ ๊ฐ์ ์กฐ๋ช
์ ํ๋ฉด ๋ฐฐ๊ฒฝ์ ํฌ์ฌํฉ๋๋ค.
+
+- **์ค๋์ค ์ปดํ๋ ์**: ์ค๋์ค์ ์ปดํ๋ ์๋ฅผ ์ ์ฉํฉ๋๋ค (์ ํธ์์ ๊ฐ์ฅ ์๋๋ฌ์ด ๋ถ๋ถ์ ์๋์ ๋ฎ์ถ๊ณ ๊ฐ์ฅ ์กฐ์ฉํ ๋ถ๋ถ์ ์๋์ ๋์)
+
+- **๋ค๋น๊ฒ์ด์
๋ฐ ํ๋ฆผ ํจ๊ณผ**: ๋ด๋น๊ฒ์ด์
๋ฐ๋ฅผ ํฌ๋ช
ํ๊ณ ํ๋ฆฟํ๊ฒ ๋ง๋ญ๋๋ค
+
+- **๋์ด ์ ํ ์ฐํ**: ์ ํ๋ธ์ ๋์ด ์ ํ์ ์ฐํํฉ๋๋ค
+
+- **์๋ง ์ ํ๊ธฐ**: ์๋ง์ ํ์ฑํํฉ๋๋ค
+
+- **์ปดํฉํธ ์ฌ์ด๋๋ฐ**: ์ฌ์ด๋๋ฐ๋ฅผ ํญ์ ์ปดํฉํธ ๋ชจ๋๋ก ์ค์ ํฉ๋๋ค
+
+- **ํฌ๋ก์คํ์ด๋**: ๋
ธ๋ ์ฌ์ด์ ํฌ๋ก์คํ์ด๋ ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค
+
+- **์๋ ์ฌ์ ํด์ **: ๋
ธ๋๋ฅผ '์ผ์ ์ ์ง' ๋ชจ๋๋ก ์์ํ๊ฒ ํฉ๋๋ค
+
+- [**๋์ค์ฝ๋ ํ๋ ์ํ**](https://discord.com/): [ํ๋ ์ํ (Rich Presence)](https://user-images.githubusercontent.com/28219076/104362104-a7a0b980-5513-11eb-9744-bb89eabe0016.png)๋ฅผ ์ฌ์ฉํ์ฌ ์น๊ตฌ๋ค์๊ฒ ๋ด๊ฐ ๋ฃ๋ ์์
์ ๋ณด์ฌ์ฃผ์ธ์
+
+- **๋ค์ด๋ก๋**: UI์์ [์ง์ ](https://user-images.githubusercontent.com/61631665/129977677-83a7d067-c192-45e1-98ae-b5a4927393be.png) MP3/์์ค ์ค๋์ค๋ฅผ ๋ค์ด๋ก๋ํ์ธ์
+
+- **์ง์ ๋ณผ๋ฅจ**: ์๋ ์ฌ๋ผ์ด๋๋ฅผ [์ง์์ ](https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/)์ผ๋ก ๋ง๋ค์ด ๋ ๋ฎ์ ์๋์ ์ฝ๊ฒ ์ ํํ ์ ์๋๋ก ํฉ๋๋ค.
+
+- **์ธ์ฑ ๋ฉ๋ด**: [๋ฉ๋ด ํ์์ค์ ๋ ๋ฉ์ง๊ฒ, ๊ทธ๋ฆฌ๊ณ ๋คํฌ ๋๋ ์จ๋ฒ์ ์์์ผ๋ก ๋ง๋ญ๋๋ค](https://user-images.githubusercontent.com/78568641/112215894-923dbf00-8c29-11eb-95c3-3ce15db27eca.png)
+
+ > (์ด ํ๋ฌ๊ทธ์ธ ๋ฐ ๋ฉ๋ด ์จ๊ธฐ๊ธฐ ์ต์
์ ํ์ฑํํ ํ ๋ฉ๋ด์ ์ก์ธ์คํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ [์ด ๊ธ](https://github.com/th-ch/youtube-music/issues/410#issuecomment-952060709)์ ์ฐธ์กฐํ์ธ์)
+
+- [**Last.fm**](https://www.last.fm/): Last.fm์ ๋ํ ์คํฌ๋ฌ๋ธ ์ง์์ ์ถ๊ฐํฉ๋๋ค
+
+- **Lumia Stream**: [Lumia Stream](https://lumiastream.com/) ์ง์์ ์ถ๊ฐํฉ๋๋ค
+
+- **Genius ๊ฐ์ฌ**: ๋ ๋ง์ ๊ณก์ ๋ํด ๊ฐ์ฌ ์ง์์ ์ถ๊ฐํฉ๋๋ค
+
+- **๋ค๋น๊ฒ์ด์
**: ๋ธ๋ผ์ฐ์ ์์์ฒ๋ผ, UI์ ์ง์ ํตํฉ๋ ์์ผ๋ก/๋ค๋ก ํ์ํ๋ ํ์ดํ๋ฅผ ์ถ๊ฐํฉ๋๋ค
+
+- **Google ๋ก๊ทธ์ธ ์ ๊ฑฐ**: UI์์ Google ๋ก๊ทธ์ธ ๋ฒํผ ๋ฐ ๋งํฌ ์ ๊ฑฐํ๊ธฐ
+
+- **์๋ฆผ**: ๋
ธ๋ ์ฌ์์ด ์์๋๋ฉด ์๋ฆผ์ ํ์ (Windows์์๋ [๋ํํ ์๋ฆผ](https://user-images.githubusercontent.com/78568641/114102651-63ce0e00-98d0-11eb-9dfe-c5a02bb54f9c.png) ์ฌ์ฉ ๊ฐ๋ฅ)
+
+- **PiP**: ์ฑ์ PiP ๋ชจ๋๋ก ์ ํํ ์ ์๊ฒ ํ์ฉํฉ๋๋ค
+
+- **์ฌ์ ์๋**: ๋นจ๋ฆฌ ๋ฃ๊ฑฐ๋, ์ฒ์ฒํ ๋ค์ด๋ณด์ธ์! [๋
ธ๋ ์๋๋ฅผ ์ ์ดํ๋ ์ฌ๋ผ์ด๋๋ฅผ ์ถ๊ฐํฉ๋๋ค](https://user-images.githubusercontent.com/61631665/129976003-e55db5ba-bf42-448c-a059-26a009775e68.png)
+
+- **์ ํํ ์๋**: ์ฌ์ฉ์ ์ง์ HUD์ ์ฌ์ฉ์ ์ง์ ์๋ ๋จ๊ณ ๋ฐ ๋ง์ฐ์ค ํ /๋จ์ถํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ์ ํํ๊ฒ ์ ์ดํ์ธ์
+
+- **์์ ํ์ง ์ฒด์ธ์ **: ์์ ์ค๋ฒ๋ ์ด์ [๋ฒํผ](https://user-images.githubusercontent.com/78568641/138574366-70324a5e-2d64-4f6a-acdd-dc2a2b9cecc5.png)์ผ๋ก ์์ ํ์ง์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํฉ๋๋ค
+
+- **๋จ์ถํค (& MPRIS)**: ์ฌ์์ ์ํ ์ ์ญ ๋จ์ถํค ์ค์ ํ์ฉ (์ฌ์/์ผ์ ์ ์ง/๋ค์/์ด์ ) + ๋ฏธ๋์ด ํค๋ฅผ ์ฌ์ ์ํ์ฌ [๋ฏธ๋์ด osd](https://user-images.githubusercontent.com/84923831/128601225-afa38c1f-dea8-4209-9f72-0f84c1dd8b54.png) ๋นํ์ฑํ + Ctrl/CMD + F ๊ฒ์ ํ์ฑํ + ๋ฏธ๋์ด ํค์ ๋ํ ๋ฆฌ๋
์ค MPRIS ์ง์ ํ์ฑํ + [๊ณ ๊ธ ์ฌ์ฉ์](https://github.com/th-ch/youtube-music/issues/106#issuecomment-952156902)๋ฅผ ์ํ [์ฌ์ฉ์ ์ง์ ๋จ์ถํค](https://github.com/Araxeus/youtube-music/blob/1e591d6a3df98449bcda6e63baab249b28026148/providers/song-controls.js#L13-L50) ์ง์
+
+- **๋ฌด์ ๊ฑด๋๋ฐ๊ธฐ** - ๋
ธ๋์ ๋ฌด์ ๋ถ๋ถ์ ์๋์ผ๋ก ๊ฑด๋๋๋๋ค
+
+- [**SponsorBlock**](https://github.com/ajayyy/SponsorBlock): ์ธํธ๋ก/์์ํธ๋ก์ ๊ฐ์ ์์
์ด ์๋ ๋ถ๋ถ์ด๋, ๋
ธ๋๊ฐ ์ฌ์๋์ง ์๋ ๋ฎค์ง ๋น๋์ค์ ์ผ๋ถ๋ฅผ ์๋์ผ๋ก ๊ฑด๋๋๋๋ค
+
+- **์์
ํ์์ค ๋ฏธ๋์ด ์ปจํธ๋กค**: [Windows ์์
ํ์์ค](https://user-images.githubusercontent.com/78568641/111916130-24a35e80-8a82-11eb-80c8-5021c1aa27f4.png)์์ ์ฌ์์ ์ ์ดํ์ธ์
+
+- **TouchBar**: macOS ์ฌ์ฉ์๋ฅผ ์ํ TouchBar ์์ ฏ์ ์ถ๊ฐํฉ๋๋ค
+
+- **Tuna-OBS**: [OBS](https://obsproject.com/)์ ํ๋ฌ๊ทธ์ธ, [Tuna](https://obsproject.com/forum/resources/tuna.843/)์ ํตํฉ์ ํ์ฑํํฉ๋๋ค
+
+- **์์ ์ ํ**: ์์/๋
ธ๋ ๋ชจ๋๋ฅผ ์ ํํ๋ [๋ฒํผ](https://user-images.githubusercontent.com/28893833/173663950-63e6610e-a532-49b7-9afa-54cb57ddfc15.png)์ ์ถ๊ฐํฉ๋๋ค. ์ ํ์ ์ผ๋ก ์ ์ฒด ์์ ํญ์ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค
+
+- **๋น์ฃผ์ผ๋ผ์ด์ **: ํ๋ ์ด์ด์ ์๊ฐํ ๋๊ตฌ ์ถ๊ฐ
+
+## ํ
๋ง
+
+CSS ํ์ผ์ ๋ก๋ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(์ค์ > ์๊ฐ์ ๋ณ๊ฒฝ > ํ
๋ง).
+
+์ผ๋ถ ์ฌ์ ์ ์ ํ
๋ง๋ https://github.com/kerichdev/themes-for-ytmdesktop-player ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+## ๊ฐ๋ฐ
+
+```bash
+git clone https://github.com/th-ch/youtube-music
+cd youtube-music
+pnpm install --frozen-lockfile
+pnpm dev
+```
+
+## ๋๋ง์ ํ๋ฌ๊ทธ์ธ ๋ง๋ค๊ธฐ
+
+ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ํ ์ ์๋ ๊ฒ๋ค:
+
+- ์ฑ ์กฐ์ - Electron์์ `BrowserWindow`๊ฐ ํ๋ฌ๊ทธ์ธ ํธ๋ค๋ฌ๋ก ์ ๋ฌ
+- HTML/CSS๋ฅผ ์กฐ์ํ์ฌ ํ๋ก ํธ์๋๋ฅผ ๋ณ๊ฒฝ
+
+### ํ๋ฌ๊ทธ์ธ ๋ง๋ค๊ธฐ
+
+`plugins/๋๋ง์-ํ๋ฌ๊ทธ์ธ-์ด๋ฆ`์ ํด๋๋ฅผ ๋ง๋ญ๋๋ค:
+
+- `index.ts`: ํ๋ฌ๊ทธ์ธ์ ๋ฉ์ธ ํ์ผ์
๋๋ค.
+```typescript
+import style from './style.css?inline'; // ์คํ์ผ์ ์ธ๋ผ์ธ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค
+
+import { createPlugin } from '@/utils';
+
+export default createPlugin({
+ name: 'Plugin Label',
+ restartNeeded: true, // ๊ฐ์ด true๋ฉด, YTM์ ์ฌ์์ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ํ์ํฉ๋๋ค
+ config: {
+ enabled: false,
+ }, // ๋์ ์ปค์คํ
config
+ stylesheets: [style], // ๋์ ์คํ์ผ
+ menu: async ({ getConfig, setConfig }) => {
+ // ๋ชจ๋ *Config ๋ฉ์๋๋ Promise