Commit graph

568 commits

Author SHA1 Message Date
f73314d5dc feat(app): 예능 일정 상세 화면 추가
- ScheduleDetail 모델: broadcaster, replayUrl, varietyThumbnailUrl 필드 추가
- 예능 섹션: 썸네일(블러 배경 + contain) + 정보 카드
- 방송사 뱃지(카테고리 색상), 날짜/시간, 제목, 멤버, 다시보기 버튼
- 썸네일 없을 때 카테고리 색상 배경 + Tv 아이콘 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 17:06:06 +09:00
aae606725f feat(mobile): 앨범/곡/컨셉포토 상세 페이지 뒤로가기 버튼 추가
- MobileHeader에 showBack prop 추가 (ChevronLeft + history.back)
- Layout에 showBack 전달
- 라우터에서 상세 페이지에 showBack 적용
- 개별 페이지의 중복 액션바 제거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:16:19 +09:00
901d788d9a feat(mobile): 일정 상세 페이지 액션바에 뒤로가기 버튼 추가
- ChevronLeft 아이콘 + history.back()
- 오른쪽 w-9 빈 영역으로 제목 중앙 정렬 유지

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:11:35 +09:00
1626091539 style(mobile): 일정 상세 액션바 카테고리 텍스트 font-bold로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:09:38 +09:00
aaec7fa071 style(mobile): 예능 썸네일 블러 배경 + 높이 축소
- 높이 h-52로 고정
- 배경에 동일 이미지를 scale-110 blur-2xl로 깔아서 빈 공간 채움
- 메인 이미지는 object-contain으로 원본 비율 유지

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:07:46 +09:00
45819f7a01 style(pc): 예능 상세 썸네일/정보 가로 배치, 높이 독립
- 썸네일: w-52 h-72 고정, object-cover
- 정보 카드: flex-1, 콘텐츠에 따라 높이 자유
- items-start로 서로 높이 영향 없음

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:05:37 +09:00
de3adc0ad6 refactor: 예능 상세 페이지 썸네일/정보 분리 레이아웃
- 가로 flex → 세로 분리 (썸네일 카드 + 정보 카드)
- 썸네일: object-contain으로 원본 비율 유지, max-h 제한
- 기본 이미지: 카테고리 색상 배경 + Tv 아이콘
- 제목이 길어져도 레이아웃 깨지지 않음
- PC/모바일 모두 적용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:03:48 +09:00
2a1849f608 feat: 예능 썸네일 없을 때 카테고리 색상 기본 이미지 표시
- 썸네일 없으면 카테고리 색상 배경 + Tv 아이콘 표시
- PC/모바일 모두 적용
- 항상 flex 레이아웃 유지 (썸네일 유무와 무관)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:58:57 +09:00
4bc188b4f9 feat: 모바일 예능 일정 상세 섹션 추가
- MobileVarietySection: 썸네일(w-32) + 콘텐츠 flex 레이아웃
- 방송사 뱃지, 제목, 멤버 칩, 다시보기 버튼
- PC 버전과 동일한 구조, 모바일 사이즈에 맞게 축소

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:57:03 +09:00
83dd852ffb style: 예능 다시보기 버튼을 다크 스타일로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:54:49 +09:00
de1399579f style: 예능 상세 텍스트 크기 전체적으로 확대
- 방송사 뱃지/날짜: text-xs → text-sm
- 제목: text-lg → text-xl
- 멤버 칩: text-xs → text-sm, 패딩 증가
- 다시보기 버튼: text-xs → text-sm, 패딩 증가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:53:11 +09:00
b1d890d758 style: 예능 상세 레이아웃 상단/하단 분리
- 방송사+날짜, 제목, 멤버: 상단에 붙임
- 다시보기 버튼: mt-auto로 하단에 고정
- justify-between으로 세로 공간 분배

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:52:12 +09:00
c990af41e1 style: 예능 상세 페이지 디자인 정리
- 썸네일 hover 효과 제거, 너비 w-44로 축소
- 다시보기 버튼: 멤버 칩과 같은 줄에 compact하게 배치 (회색 pill)
- 불필요한 border-t 구분선 제거
- 전체적으로 compact한 레이아웃

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:51:09 +09:00
fcbda88464 fix: 예능 상세 썸네일을 세로 포스터 레이아웃으로 변경
- 가로 전체 → 왼쪽 세로 포스터(w-52) + 오른쪽 콘텐츠 (flex 레이아웃)
- 세로 이미지가 잘리지 않도록 object-cover + 고정 너비

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:48:12 +09:00
36854a223f style: PC 예능 상세 페이지 디자인 개선
- 썸네일: aspect-video 비율, hover 시 확대 + 재생 버튼 오버레이
- 방송사 뱃지: 카테고리 색상 기반, 날짜와 한 줄로 배치
- 다시보기 버튼: 다크 pill 스타일, 유튜브면 Play 아이콘
- 전체 카드 레이아웃으로 통일

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:46:31 +09:00
6feedae267 feat: PC 예능 일정 상세 페이지 추가
- VarietySection: 썸네일, 방송사 뱃지, 제목, 날짜/시간, 멤버, 다시보기 버튼
- ScheduleDetail에서 '예능' 카테고리 분기 연결

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:45:14 +09:00
c14bd90e89 fix: 카테고리 API를 React Query로 변경 (중복 호출 방지)
- useEffect + useState → useQuery로 변경
- staleTime 10분으로 캐시하여 중복 요청 제거
- 카테고리 색상 Redis 캐시도 삭제 (DB 변경 반영)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:40:17 +09:00
48ed3bb9e0 feat(variety): 방송사 프리셋을 입력 빈도수 기반으로 변경
- GET /admin/variety/broadcasters: DB에서 빈도수 상위 10개 조회 (Redis 1시간 캐시)
- 일정 생성/수정 시 캐시 무효화
- 프론트엔드: 하드코딩 프리셋 제거, API에서 동적으로 로드

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:37:52 +09:00
a01d368728 feat(variety): 썸네일을 RustFS 이미지 업로드로 변경
- schedule/{id}/thumbnail/ 경로에 original/medium_800/thumb_400 webp 업로드
- images 테이블로 이미지 관리, schedule_variety.thumbnail_id로 참조
- 프론트엔드: URL 입력 → 파일 업로드(드래그&드롭) + 미리보기로 변경
- 수정 시 기존 썸네일 교체/삭제 지원

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 19:07:08 +09:00
c88eb1fb60 fix(variety): 날짜/시간 입력을 커스텀 DatePicker/TimePicker로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:45:28 +09:00
73f84fd7ac feat: 예능 카테고리 관리 기능 구현
- 백엔드: POST/PUT/GET /admin/variety/schedule API
- 백엔드: 일정 상세 응답에 broadcaster, replayUrl, thumbnailUrl 포함
- 프론트엔드: VarietyForm (추가), VarietyEditForm (수정) 페이지
- 방송사 프리셋 버튼 (KBS, MBC, SBS, tvN, 유튜브, 티빙 등)
- 출연 멤버 선택, 다시보기 링크, 썸네일 URL 지원
- 라우트 등록 및 일정 목록 편집 링크 연결

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:16:16 +09:00
96969e1bf0 feat: 예능 카테고리 및 schedule_variety 테이블 추가
- schedule_variety: broadcaster, replay_url, thumbnail_url
- 카테고리 ID 10 '예능' (#22c55e) 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:08:56 +09:00
9375a78d63 feat(app): 뒤로가기 두 번 눌러서 앱 종료
메인 화면에서 뒤로가기 1회 → '한 번 더 누르면 앱이 종료됩니다' 스낵바
2초 내 다시 누르면 앱 종료

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 14:11:53 +09:00
dd15958e90 fix(app): 곡 상세 화면 카드 배경 제거, 웹과 동일하게 변경
- 각 섹션 카드(Container + 흰색 배경) → Padding으로 원복
- Scaffold 배경을 흰색으로 변경 (웹과 동일)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:42:37 +09:00
68a0f89816 fix(app): 곡 상세 화면 UI 개선
- 액션바 제목 '트랙' → '앨범'
- YouTube 버튼: 빨간 배경 + 흰색 글씨로 변경
- 각 섹션(헤더, 영상, 크레딧, 가사)에 흰색 카드 배경 추가
- 앨범 이름 ellipsis 제거 (줄바꿈 허용)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:14:36 +09:00
45e69a9b9c fix(app): 홈에서 앨범 상세 이동 시 뒤로가기 안 되는 버그 수정
context.go() → context.push()로 변경.
go()는 네비게이션 스택을 교체하므로 뒤로가기가 불가했음.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:11:18 +09:00
aa750b19d4 feat(app): 곡 상세 화면 뮤직비디오 앱 내 재생 + YouTube 이동 버튼
- 썸네일+재생 버튼 → OmniVideoPlayer로 교체 (앱 내 직접 재생)
- 하단에 'YouTube에서 보기' 텍스트 버튼 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:08:14 +09:00
5f70b6852f fix(app): 곡 상세 화면 뮤직비디오/스페셜 영상 구분 표시
video_type이 'special'이면 '스페셜 영상', 그 외는 '뮤직비디오'로 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:04:03 +09:00
574662b24d fix(app): 곡 상세 화면 뮤직비디오 표시 안 되는 문제 수정
TrackDetail.fromJson에서 music_video_url → video_url로 필드명 수정.
DB 컬럼명은 video_url인데 잘못된 키로 파싱하고 있었음.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:01:30 +09:00
af6b3e1654 style: X 게시글 하이퍼링크 색상을 파란색으로 변경 (해시태그와 구분)
- 해시태그: primary (초록)
- URL 링크: blue-500 (파란)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:36:03 +09:00
78b3b4121c fix(app): 앨범 상세/곡 상세/갤러리 화면 툴바 스크롤 시 늘어남 수정
- SliverAppBar에 stretch: false 명시
- CustomScrollView에 ClampingScrollPhysics 적용 (overscroll 방지)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 14:52:01 +09:00
737247eec3 fix(app): 앨범 수록곡 TITLE 뱃지와 재생 시간 사이 여백 추가
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 14:32:59 +09:00
9e3a71e156 fix: 사진/티저 업로드·삭제 시 앨범 캐시 무효화 누락 수정
photos.js, teasers.js에서 invalidateAlbumCache 호출 추가.
앨범 생성 후 사진/티저 추가 시 캐시된 빈 데이터가 반환되던 문제 해결.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 14:31:40 +09:00
ce41fc1a60 feat(concert): 콘서트 수정 페이지 추가
- 백엔드: GET /admin/concert/schedule/:seriesId (상세 조회)
- 백엔드: PUT /admin/concert/schedule/:seriesId (수정)
- 프론트엔드: ConcertEditForm 페이지 (생성 폼 컴포넌트 재사용)
- 라우트: /admin/schedule/concert/:seriesId/edit 등록
- 일정 목록: 콘서트 카테고리 편집 버튼이 수정 페이지로 연결
- schedule.js: formatSchedule에 concertSeriesId 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:25:01 +09:00
637172ddd7 style(concert): 네이티브 select를 커스텀 드롭다운으로 변경
- 선택된 회차 + 날짜 표시, 화살표 아이콘 회전 애니메이션
- 활성 항목 primary 하이라이트
- 외부 클릭 시 자동 닫기

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:09:26 +09:00
cdb94972a3 refactor(concert): 세트리스트 회차 선택을 탭에서 드롭다운으로 변경
- 탭 UI → select 드롭다운 (회차가 많아도 깔끔)
- 드롭다운에 날짜 표시 (예: "1회차 (2026-04-01)")
- 회차 전환 시 애니메이션 제거
- framer-motion 의존성 제거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:08:39 +09:00
8ccf18e8b1 feat(concert): 회차별 세트리스트 입력 지원
- 프론트엔드: 단일 setlist → 회차별 setlists (탭 UI로 전환)
- 회차 추가 시 이전 회차의 세트리스트 자동 복사
- '다른 회차에서 복사' 기능 추가
- 백엔드: 각 concert_id별로 독립적인 세트리스트 저장
- 하위호환: 기존 setlist 필드도 지원 (단일 배열 → 첫 회차에 적용)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:03:08 +09:00
812478bc37 fix(app): X 카드 하단 'X에서 보기' 영역 모서리 둥글게 수정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:29:24 +09:00
5368c863c3 fix(app): X 카드 하단 모서리 테두리 잘림 수정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:26:11 +09:00
6918a18334 fix(app): 일정 상세 화면 하단 소프트키 영역 잘림 수정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:22:15 +09:00
998125333b fix(app): X 상세 화면 프로필 사진/표시 이름 누락 수정
- ScheduleDetail에 profileDisplayName, profileAvatarUrl 필드 추가
- X 섹션: profile.displayName으로 표시 이름, profile.avatarUrl로 프로필 사진 표시
- 아바타 URL이 없을 때 이니셜 폴백 유지
- @username 표시 수정 (displayName이 아닌 실제 username 사용)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:21:24 +09:00
fc38678fbd revert(app): X 게시글 해시태그 하이라이트 제거
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:17:18 +09:00
1f3c2f3d9b feat: X 게시글 해시태그 하이라이트 및 클릭 링크 추가
- 해시태그(#xxx): primary 색상 하이라이트, 클릭 시 x.com/hashtag/xxx로 이동
- URL: primary 색상 + 밑줄, 클릭 시 해당 URL로 이동
- 웹(모바일/PC), 앱 모두 적용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:15:58 +09:00
3cf07a8214 chore(app): omni_video_player 패키지 추가에 따른 플러그인 등록 업데이트
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:10:03 +09:00
9498559f6b fix(x-bot): 리트윗 프로필/이미지 복구 및 원본 트윗 매칭
- getProfile: bot_x에 없는 계정도 Nitter에서 직접 조회 후 Redis 캐시
- refetch-retweets 스크립트: 원본 작성자 타임라인에서 매칭 트윗 찾아 이미지/내용 복구
- 기존 21건 리트윗 데이터 재수집 완료 (이미지 포함)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:07:43 +09:00
3ce8d7ec7d fix(x-bot): 리트윗 내용 잘림, Nitter 링크, 이미지 누락 수정
- extractTextFromHtml: Nitter 프록시 t.co URL을 원본 https://t.co/ URL로 변환
- parseTweets: 리트윗 원본 작성자(originalUsername) 추출, URL을 원본 작성자 기준으로 생성
- saveTweet: 리트윗인 경우 원본 작성자를 username으로 저장
- refetch-retweets 엔드포인트 및 스크립트 추가 (기존 잘못된 데이터 재수집)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 13:59:19 +09:00
c37d7e14af feat(app): 일정 상세 화면 새 API 대응 및 YouTube 앱 내 재생
- ScheduleDetail 모델: 새 API 형식 (category 중첩 객체, YouTube/X 전용 필드)
- YouTube 섹션: omni_video_player로 앱 내 재생, 예정 플레이스홀더 추가
- X 섹션: username, content, imageUrls, postUrl 직접 사용
- 숏츠 영상 16:9 통일, 날짜 형식 웹과 동일하게 변경
- 콘서트 섹션을 기본 섹션으로 통합 (API 변경 반영)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 20:20:51 +09:00
6284d216bd feat(app): 일정 화면 새 API 대응 및 생일/데뷔 카드 추가
- Schedule 모델: dynamic id로 변경 (생일/기념일 문자열 ID 지원)
- 생일/데뷔/기념일 특별 필드 추가 (isBirthday, isDebut 등)
- BirthdayCard: 핑크-보라 그라데이션, 멤버 사진, 케이크 이모지
- DebutCard: 블루 그라데이션, DEBUT/N YEARS 아이콘, 별 장식
- 일정 목록에서 특별 일정 카드 자동 분기 렌더링
- 특별 일정 클릭 시 상세 라우팅 방지
- 달력 그리드 그림자 클리핑 수정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 19:18:57 +09:00
d6ef851b02 feat(app): 멤버 화면을 웹과 동일한 2열 그리드 + 모달 디자인으로 변경
- PageView 카드 스와이프 → 2열 그리드 레이아웃
- 상단 썸네일 인디케이터 제거
- 카드 탭 시 모달로 상세 정보 표시 (이미지, 이름, 생일, 인스타그램)
- 개별 카드 staggered 애니메이션 + 탭 scale 효과
- 컨트롤러에서 불필요한 currentIndex 상태 제거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 18:29:22 +09:00
0ddde32bed feat(app): 홈 화면 일정 API를 새 응답 형식에 맞게 업데이트
- Schedule 모델: category/source 중첩 객체, members 배열 파싱
- 일정 서비스: { schedules: [] } 래핑된 응답 처리
- 홈/웹 일정 카드: sourceName을 별도 줄로 분리하여 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 18:15:19 +09:00