Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,8 @@ yarn-error.log*
.cursorrules
.gitmessage.txt

# Claude Code local settings (contains secrets)
.claude/*

temp/
.vscode
13 changes: 6 additions & 7 deletions apps/web/src/constants/artistAlias.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const artistAlias = {
'Creepy Nuts': ['ํฌ๋ฆฌํ”ผ ๋„ˆ์ธ '],

// [Gemini ์ถ”์ฒœ ์•„ํ‹ฐ์ŠคํŠธ ์ถ”๊ฐ€] ํ•œ๊ตญ ์ธ๊ธฐ ์ตœ์ƒ์œ„
Ado: ['์•„๋„', '์šฐ์„ธ์™€'],
Ado: ['์•„๋„', '์šฐ์„ธ์™€', '์‹ ์‹œ๋Œ€'],
imase: ['์ด๋งˆ์„ธ', '๋‚˜์ดํŠธ๋Œ„์„œ'],
'ONE OK ROCK': ['์›์˜คํฌ๋ฝ', '์›์˜คํฌ', '์›์˜ฅ'],
'X JAPAN': ['์—‘์Šค์žฌํŒฌ', '์—‘์Šค์ œํŒฌ'],
Expand All @@ -25,16 +25,18 @@ export const artistAlias = {
"L'Arc~en~Ciel": ['๋ผ๋ฅดํฌ', '๋ผ๋ฅดํฌ ์•™ ์‹œ์—˜'],
ๆพ็”ฐ่–ๅญ: ['๋งˆ์ธ ๋‹ค ์„ธ์ด์ฝ”'],
ๆคŽๅๆž—ๆชŽ: ['์‹œ์ด๋‚˜ ๋ง๊ณ '],
Eve: ['eve', '์ด๋ธŒ'],
็พŽๆณข: ['๋ฏธ๋‚˜๋ฏธ', 'minami', '373'],
'ASIAN KUNG-FU GENERATION': ['์•„์‹œ์•ˆ ์ฟตํ‘ธ ์ œ๋„ˆ๋ ˆ์ด์…˜', '์•„์ง€์บ‰', '์•„์ฟต์ œ'],

// ๊ธฐ์กด ๋ฐ์ดํ„ฐ
ๅต: ['์•„๋ผ์‹œ'],
ๆฑๆ–น็ฅž่ตท: ['๋™๋ฐฉ์‹ ๊ธฐ'],
ใ‚ใ„ใฟใ‚‡ใ‚“: ['์•„์ด๋ฌญ'],
็ฑณๆดฅ็Ž„ๅธซ: ['์š”๋„ค์ฆˆ ์ผ„์‹œ'],
ๆตœๅดŽใ‚ใ‚†ใฟ: ['ํ•˜๋งˆ์‚ฌํ‚ค ์•„์œ ๋ฏธ'],
ๆฐดๆจนๅฅˆใ€…: ['๋ฏธ์ฆˆํ‚ค ๋‚˜๋‚˜'],
'ใƒขใƒผใƒ‹ใƒณใ‚ฐๅจ˜ใ€‚': ['๋ชจ๋‹๊ตฌ ๋ฌด์Šค๋ฉ”'],
Official้ซญ็”ทdism: ['์˜คํ”ผ์…œํžˆ๊ฒŒ๋‹จ๋””์ฆ˜', 'ํžˆ๊ฒŒ๋‹จ'],
Official้ซญ็”ทdism: ['์˜คํ”ผ์…œํžˆ๊ฒŒ๋‹จ๋””์ฆ˜', 'ํžˆ๊ฒŒ๋‹จ', 'ํ”„๋ฆฌํ…๋”'],
ใƒจใƒซใ‚ทใ‚ซ: ['์š”๋ฃจ์‹œ์นด'],
ไธญๅณถ็พŽๅ˜‰: ['๋‚˜์นด์‹œ๋งˆ ๋ฏธ์นด'],
ๅฎ‡ๅคš็”ฐใƒ’ใ‚ซใƒซ: ['์šฐํƒ€๋‹ค ํžˆ์นด๋ฃจ'],
Expand All @@ -50,14 +52,11 @@ export const artistAlias = {
ๅ‚ๆœฌ็œŸ็ถพ: ['์‚ฌ์นด๋ชจํ†  ๋งˆ์•„์•ผ'],
็ตๆŸใƒใƒณใƒ‰: ['๊ฒฐ์† ๋ฐด๋“œ'],
ไนƒๆœจๅ‚46: ['๋…ธ๊ธฐ์ž์นด46'],
้˜ฒๅผพๅฐ‘ๅนดๅ›ฃ: ['๋ฐฉํƒ„์†Œ๋…„๋‹จ'],
ๅฐ‘ๅฅณๆ™‚ไปฃ: ['์†Œ๋…€์‹œ๋Œ€'],
ๆž—ๅŽŸใ‚ใใฟ: ['ํ•˜์•ผ์‹œ๋ฐ”๋ผ ๋ฉ”๊ตฌ๋ฏธ'],
ใƒใƒซใƒŽใ‚ฐใƒฉใƒ•ใ‚ฃใƒ†ใ‚ฃ: ['ํฌ๋ฅด๋…ธ๊ทธ๋ผํ”ผํ‹ฐ'],
ๅˆ้ŸณใƒŸใ‚ฏ: ['ํ•˜์ธ ๋„ค ๋ฏธ์ฟ '],
'DECO*27(Feat.ๅˆ้ŸณใƒŸใ‚ฏ)': ['DECO27', '๋ฐ์ฝ”๋‹ˆ๋‚˜'],
'DECO*27': ['DECO27', '๋ฐ์ฝ”๋‹ˆ๋‚˜'],
ๆพๆตฆไบœๅผฅ: ['๋งˆ์ธ ์šฐ๋ผ ์•„์•ผ'],
ใƒฆใƒณใƒŠ: ['์œคํ•˜'],
ๅ €ๆฑŸ็”ฑ่กฃ: ['ํ˜ธ๋ฆฌ์— ์œ ์ด'],
ใ‚ณใƒ–ใ‚ฏใƒญ: ['์ฝ”๋ถ€์ฟ ๋กœ'],
ใใ‚ƒใ‚Šใƒผใฑใฟใ‚…ใฑใฟใ‚…: ['์บฌ๋ฆฌ ํŒŒ๋ฎคํŒŒ๋ฎค'],
Expand Down
4 changes: 4 additions & 0 deletions apps/web/src/constants/krToJpnArtist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ export const krToJpnArtistSort = {
// A-Z
Ado: 'Ado',
Aimer: 'Aimer',
'ASIAN KUNG-FU GENERATION': '์•„์‹œ์•ˆ ์ฟตํ‘ธ ์ œ๋„ˆ๋ ˆ์ด์…˜',

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Reversed artist mapping ๐Ÿž Bug โœ“ Correctness

krToJpnArtistSort adds ASIAN KUNG-FU GENERATION in the wrong direction (officialโ†’Korean). In the
J-POP artist modal, clicking that entry will search using the Korean string, likely returning no
results when the DB stores the official artist name.
Agent Prompt
### Issue description
`krToJpnArtistSort` is used by `JpnArtistList` such that the **value** is what gets inserted into the search box and used for searching. The new ASIAN KUNG-FU GENERATION entry is inverted (value is Korean), so selecting it will search the wrong string.

### Issue Context
`JpnArtistList` does `Object.entries(krToJpnArtistSort).map(([kr, jpn]) => ...)` and onClick uses `handleSelect(jpn)`.

### Fix Focus Areas
- apps/web/src/constants/krToJpnArtist.ts[2-10]

### Suggested change
Change:
- `'ASIAN KUNG-FU GENERATION': '์•„์‹œ์•ˆ ์ฟตํ‘ธ ์ œ๋„ˆ๋ ˆ์ด์…˜'`
To:
- `'์•„์‹œ์•ˆ ์ฟตํ‘ธ ์ œ๋„ˆ๋ ˆ์ด์…˜': 'ASIAN KUNG-FU GENERATION'`

(Ensure the displayed key remains Korean and the searched value is the canonical artist string.)

โ“˜ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


DECO27: 'DECO*27',
Eve: 'Eve',
HoneyWorks: 'HoneyWorks',

imase: 'imase',
Expand All @@ -22,6 +25,7 @@ export const krToJpnArtistSort = {

// ๋งˆ
'๋ฏธ์„ธ์Šค ๊ทธ๋ฆฐ ์• ํ”Œ': 'Mrs. GREEN APPLE',
๋ฏธ๋‚˜๋ฏธ: '็พŽๆณข',

// ๋ฐ”
๋ฐ”์šด๋””: 'Vaundy',
Expand Down
6 changes: 4 additions & 2 deletions apps/web/src/hooks/useSearchSong.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,10 @@ export default function useSearchSong() {
let parsedSearch = trimSearch;

if (autoCompleteList.length === 1) {
// ์ž๋™์™„์„ฑ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜(์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋ฉด) ํ•ด๋‹น alias์˜ value๋กœ ์ž๋™ ์น˜ํ™˜
parsedSearch = autoCompleteList[0].value;
if (autoCompleteList[0].label === trimSearch) {
// ์ž๋™์™„์„ฑ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜(์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋ฉด)๊ณ  label๋„ ์ผ์น˜ํ•˜๋ฉด ํ•ด๋‹น alias์˜ value๋กœ ์ž๋™ ์น˜ํ™˜
parsedSearch = autoCompleteList[0].value;
}
Comment on lines 62 to +66

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Case-sensitive alias match ๐Ÿž Bug โœ“ Correctness

The new label === trimSearch condition is case-sensitive, but autocomplete matching is
case-insensitive. This prevents aliasโ†’official substitution for differently-cased roman aliases
(e.g., user types "Minami" but alias stored as "minami"), causing searches to miss non-Latin
canonical artist names (e.g., ็พŽๆณข).
Agent Prompt
### Issue description
Autocomplete suggestions are case-insensitive, but the new replacement condition in `handleSearch` is case-sensitive (`label === trimSearch`). This blocks aliasโ†’official substitution for romanized aliases when users type different casing (e.g., `Minami` vs stored `minami`), which is especially harmful when the canonical artist is non-Latin (e.g., `็พŽๆณข`).

### Issue Context
- `getAutoCompleteSuggestions()` lowercases the query and candidate labels.
- `handleSearch()` compares the raw input string to the candidate label with strict equality.

### Fix Focus Areas
- apps/web/src/hooks/useSearchSong.ts[56-73]

### Suggested change
Normalize both sides for the equality test, e.g.:
- `const normalizedTrim = trimSearch.toLowerCase();`
- `if (autoCompleteList[0].label.toLowerCase() === normalizedTrim) { parsedSearch = autoCompleteList[0].value; }`

Keep the existing `autoCompleteList.length === 1` guard to avoid unintended substitutions for partial matches.

โ“˜ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

} else {
// ํ•œ๊ธ€์ด ์žˆ๋‹ค๋ฉด ๊ณต๋ฐฑ ์ œ๊ฑฐ
const hasKorean = /[๊ฐ€-ํžฃใ„ฑ-ใ…Žใ…-ใ…ฃ]/.test(trimSearch);
Expand Down