From 4d9da597ca5f30396cab7de409136d6b08eca400 Mon Sep 17 00:00:00 2001 From: Andrew Yim Date: Tue, 23 Dec 2025 18:19:17 +0900 Subject: [PATCH] fix(desktop-skills): Fix YAML frontmatter for Claude Desktop compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove 'version' field from 13 SKILL.md files - Quote descriptions containing colons (Triggers:) in 9 files - Fix 20-gtm-audit binary file (extract proper SKILL.md from ZIP) - Add missing 'description:' key in 41-jamie-brand-audit - Add new skill 44-jamie-youtube-subtitle-checker with both desktop/ and code/ versions ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../01-notion-organizer/desktop/SKILL.md | 1 - .../10-seo-technical-audit/desktop/SKILL.md | 3 +- .../11-seo-on-page-audit/desktop/SKILL.md | 3 +- .../12-seo-local-audit/desktop/SKILL.md | 3 +- .../13-seo-schema-validator/desktop/SKILL.md | 3 +- .../14-seo-schema-generator/desktop/SKILL.md | 3 +- .../15-seo-core-web-vitals/desktop/SKILL.md | 3 +- .../16-seo-search-console/desktop/SKILL.md | 3 +- .../17-seo-gateway-architect/desktop/SKILL.md | 1 - .../18-seo-gateway-builder/desktop/SKILL.md | 1 - custom-skills/20-gtm-audit/desktop/SKILL.md | Bin 44517 -> 6276 bytes .../30-ourdigital-designer/desktop/SKILL.md | 1 - .../31-ourdigital-research/desktop/SKILL.md | 1 - .../desktop/SKILL.md | 1 - .../40-jamie-brand-editor/desktop/SKILL.md | 4 +- .../41-jamie-brand-audit/desktop/SKILL.md | 4 +- .../43-jamie-youtube-manager/desktop/SKILL.md | 4 +- .../code/CLAUDE.md | 244 +++++++++++++++++ .../code/references/chapter_patterns.md | 246 ++++++++++++++++++ .../code/references/typo_dictionary.json | 126 +++++++++ .../code/references/youtube_metadata.md | 172 ++++++++++++ .../desktop/SKILL.md | 242 +++++++++++++++++ .../desktop/references/chapter_patterns.md | 246 ++++++++++++++++++ .../desktop/references/typo_dictionary.json | 126 +++++++++ .../desktop/references/youtube_metadata.md | 172 ++++++++++++ 25 files changed, 1585 insertions(+), 28 deletions(-) create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/code/CLAUDE.md create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/code/references/chapter_patterns.md create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/code/references/typo_dictionary.json create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/code/references/youtube_metadata.md create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/desktop/SKILL.md create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/chapter_patterns.md create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/typo_dictionary.json create mode 100644 custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/youtube_metadata.md diff --git a/custom-skills/01-notion-organizer/desktop/SKILL.md b/custom-skills/01-notion-organizer/desktop/SKILL.md index 5e32b2d..600321b 100644 --- a/custom-skills/01-notion-organizer/desktop/SKILL.md +++ b/custom-skills/01-notion-organizer/desktop/SKILL.md @@ -1,6 +1,5 @@ --- name: notion-organizer -version: 1.0.0 description: Notion workspace management agent for organizing, restructuring, consolidating, and maintaining databases and pages. Use when user asks to search Notion, organize databases, clean up properties, migrate data, merge databases, audit schemas, or manage Notion content. Activates for keywords like Notion, database, knowledge base, wiki, workspace organization. allowed-tools: mcp__notion__*, Read, Write, Edit, Bash(python:*), Bash(pip:*) --- diff --git a/custom-skills/10-seo-technical-audit/desktop/SKILL.md b/custom-skills/10-seo-technical-audit/desktop/SKILL.md index dab15f5..bee5b24 100644 --- a/custom-skills/10-seo-technical-audit/desktop/SKILL.md +++ b/custom-skills/10-seo-technical-audit/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-technical-audit -version: 1.0.0 -description: Technical SEO auditor for crawlability fundamentals. Triggers: robots.txt, sitemap validation, crawlability, indexing check, technical SEO. +description: "Technical SEO auditor for crawlability fundamentals. Triggers: robots.txt, sitemap validation, crawlability, indexing check, technical SEO." allowed-tools: mcp__firecrawl__*, mcp__perplexity__*, mcp__notion__* --- diff --git a/custom-skills/11-seo-on-page-audit/desktop/SKILL.md b/custom-skills/11-seo-on-page-audit/desktop/SKILL.md index b1233b7..2eeff33 100644 --- a/custom-skills/11-seo-on-page-audit/desktop/SKILL.md +++ b/custom-skills/11-seo-on-page-audit/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-on-page-audit -version: 1.0.0 -description: On-page SEO analyzer for meta tags, headings, links, images, and Open Graph. Triggers: on-page SEO, meta tags, title tag, heading structure, alt text. +description: "On-page SEO analyzer for meta tags, headings, links, images, and Open Graph. Triggers: on-page SEO, meta tags, title tag, heading structure, alt text." allowed-tools: mcp__firecrawl__*, mcp__perplexity__*, mcp__notion__* --- diff --git a/custom-skills/12-seo-local-audit/desktop/SKILL.md b/custom-skills/12-seo-local-audit/desktop/SKILL.md index 6b2c51e..f98c91a 100644 --- a/custom-skills/12-seo-local-audit/desktop/SKILL.md +++ b/custom-skills/12-seo-local-audit/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-local-audit -version: 1.0.0 -description: Local SEO auditor for NAP consistency, Google Business Profile, citations, and LocalBusiness schema. Triggers: local SEO, Google Business Profile, GBP, NAP, citations, local rankings. +description: "Local SEO auditor for NAP consistency, Google Business Profile, citations, and LocalBusiness schema. Triggers: local SEO, Google Business Profile, GBP, NAP, citations, local rankings." allowed-tools: mcp__firecrawl__*, mcp__perplexity__*, mcp__notion__* --- diff --git a/custom-skills/13-seo-schema-validator/desktop/SKILL.md b/custom-skills/13-seo-schema-validator/desktop/SKILL.md index b7cc093..d2b7a6b 100644 --- a/custom-skills/13-seo-schema-validator/desktop/SKILL.md +++ b/custom-skills/13-seo-schema-validator/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-schema-validator -version: 1.0.0 -description: Structured data validator for JSON-LD, Microdata, and RDFa. Triggers: validate schema, structured data, JSON-LD, rich results, schema.org. +description: "Structured data validator for JSON-LD, Microdata, and RDFa. Triggers: validate schema, structured data, JSON-LD, rich results, schema.org." allowed-tools: mcp__firecrawl__*, mcp__perplexity__* --- diff --git a/custom-skills/14-seo-schema-generator/desktop/SKILL.md b/custom-skills/14-seo-schema-generator/desktop/SKILL.md index d050e66..ef45139 100644 --- a/custom-skills/14-seo-schema-generator/desktop/SKILL.md +++ b/custom-skills/14-seo-schema-generator/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-schema-generator -version: 1.0.0 -description: Schema markup generator for JSON-LD structured data. Triggers: generate schema, create JSON-LD, add structured data, schema markup. +description: "Schema markup generator for JSON-LD structured data. Triggers: generate schema, create JSON-LD, add structured data, schema markup." allowed-tools: mcp__firecrawl__*, mcp__perplexity__* --- diff --git a/custom-skills/15-seo-core-web-vitals/desktop/SKILL.md b/custom-skills/15-seo-core-web-vitals/desktop/SKILL.md index 84a3b00..6429ad0 100644 --- a/custom-skills/15-seo-core-web-vitals/desktop/SKILL.md +++ b/custom-skills/15-seo-core-web-vitals/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-core-web-vitals -version: 1.0.0 -description: Core Web Vitals analyzer for LCP, FID, CLS, INP performance metrics. Triggers: Core Web Vitals, page speed, LCP, CLS, FID, INP, performance. +description: "Core Web Vitals analyzer for LCP, FID, CLS, INP performance metrics. Triggers: Core Web Vitals, page speed, LCP, CLS, FID, INP, performance." allowed-tools: mcp__firecrawl__*, mcp__perplexity__* --- diff --git a/custom-skills/16-seo-search-console/desktop/SKILL.md b/custom-skills/16-seo-search-console/desktop/SKILL.md index 56aad2c..431e05a 100644 --- a/custom-skills/16-seo-search-console/desktop/SKILL.md +++ b/custom-skills/16-seo-search-console/desktop/SKILL.md @@ -1,7 +1,6 @@ --- name: seo-search-console -version: 1.0.0 -description: Google Search Console data analyzer for rankings, CTR, impressions, and index coverage. Triggers: Search Console, GSC, rankings, search performance, impressions, CTR. +description: "Google Search Console data analyzer for rankings, CTR, impressions, and index coverage. Triggers: Search Console, GSC, rankings, search performance, impressions, CTR." allowed-tools: mcp__perplexity__*, mcp__notion__* --- diff --git a/custom-skills/17-seo-gateway-architect/desktop/SKILL.md b/custom-skills/17-seo-gateway-architect/desktop/SKILL.md index 748ec69..19807aa 100644 --- a/custom-skills/17-seo-gateway-architect/desktop/SKILL.md +++ b/custom-skills/17-seo-gateway-architect/desktop/SKILL.md @@ -1,6 +1,5 @@ --- name: seo-gateway-strategist -version: 1.0.0 description: Creates comprehensive SEO-focused gateway page strategies for Korean medical/service websites license: OurDigital internal-use ONLY --- diff --git a/custom-skills/18-seo-gateway-builder/desktop/SKILL.md b/custom-skills/18-seo-gateway-builder/desktop/SKILL.md index 3f4bb56..864f6f2 100644 --- a/custom-skills/18-seo-gateway-builder/desktop/SKILL.md +++ b/custom-skills/18-seo-gateway-builder/desktop/SKILL.md @@ -1,6 +1,5 @@ --- name: gateway-page-content-builder -version: 1.0.0 description: Systematic content generation framework for SEO-optimized gateway pages with local service focus license: OurDigital internal-use ONLY --- diff --git a/custom-skills/20-gtm-audit/desktop/SKILL.md b/custom-skills/20-gtm-audit/desktop/SKILL.md index 05ee877eaf245698d51263edc28390fef7c3909c..53088c202d6d355e05ee2ea93059df8b2c5d17aa 100644 GIT binary patch literal 6276 zcmbtYU2_|`5q#fYF{P`zNGy?(eRfi%H$}1>r7T-#Dd$vNE(+WQNtnBfJpe0-iSNIs zXMp{nrOJcjCu=zv%nW*Z8kkO}S*Z>?RG znr_vKu2ij7+L73kstdYTr709Ip^wu`~|k>s&<<=Wyg#w`zJLWsNy*+((bftqj zdS~j5E-q_o%p*KV{Y>6P|9gv6{Vbc}gtMO{@>4!uy4jer%(CHN<0(E^w~-Q|s=Ei} zsr6i>>r!nWP>gk;g|iP{03hf}CXZ`V? z>k!M7y`0f`U%uZ4B>hZRwl={s60%=rbiwC+nhFJ9H$!1>Q(?1LGkP-|{#keU7kv1) z@$j?PI8;FFLLf%JG44{`vOmx0()(7AxA~|AOm)P!&;Bx_j{**Qn-FAcNs}w^Yisfi z-2~-=T2MU?~Q~vGs zpgFTnqcf_;*34`O2S`HGJl8Cl;B_l4I%d$5Y)S%mrbW5~h-P2?9mW5v)e-*@5k?I_ zr|Vo}Md~)tWZ##U=R&M1(EbqX0c>N#Qq`8h0E5F4Py3Axh}@`>zb;FY2hU4lK;5>b z%7tKQf2|c}hNp!swg)lY9TK=4jyX#lKz9$OF6_gMPfg~)9VzG3RuWeYx019~(|R1F zjEHf9@`ZeGZ5~Zmm_j}f=#&^!z7KaaJnZ5t@PN9lb*0$ivfwnATdGuvI#+-SDlGI4 zhHR9>EDd1qnA09dZ0V9hSuZGh5@2G31CVYb`q=31DrATQLAzqOr=MYotK?`*T33R z(el`*G~r}*1lkSI4E9PTPHdQ4=eSd?D09;u)k>asffy8a?g683@)1V3KIs+<4hHPR*L8}HQPm_bT2q9JoP)XxFy0zisds<~ zQN80d6HxU)hXY-wk;r@|O+GL=w;YZMd>^oHKYL)X5bSy!qc66?0lf;)hG!6{e7>A2z}zLW5qe&DmrIUUAc`#>PpGQ(#2smN{eF_ zfi@rbr}H%MS4?@tjWi6kku$ESt>^Ja5Z@8FN}4AlN5WRa zVn{T>BXHR%)@1YEf;d6FxCV{|TKe@y?)4bteS0+48@{T>@P?ZH+Cn0PZCW>A$KXB& zm1q79U@n9UIrwB2`I(;+JStK0l?!T+)d6&aMU*amnETLe++%fH zEwp20$%Z3zN1^5^hp1qslVYp&14bxrU~$1tbz;{g%82<3)H@xL)<{o?j$u<|#+t-9 zC`TxePB87*iq08~eVgandtA|?Xp)zJv|vXIr6qDd6xN}Avn18XaRQuO+7hKmxrC4S z2BKL^aarW|u~>>yK*2>!b5yskAJfua0gYqnsMG-Z-6`%0AA(#FY1%7IIo!_pi3~#N z^0LJ{6ZPsS7+k|*{A@lJMT2$sm33`0?gbKu(AEYsmCI54sAT7+t4ePeOWXAi%RNkB z@Jy`D@Gy`zxQ58)vJ3~x8l0tfm!7~LhzB~JnLNGK@G6mzw^q>o&sPks4%r{yfYhq@ zjVZEU+c30vx;tHK$1r8Rm7+!(kWjY%6W(e{ix&wF7@J|DbY(^}=to8-Uq3LOMX?AS zLX-?{Xf)R>9tA7zeXbRKXaip|7;Xyu774FIw5Pw{e0Yx?`4#O%o0+&UDU_~GPGt)1e(DI6_uyM?w|^Wn`1<)v zzaPYkpEFF@?dRES_C>;w&p6g+ej2>=*1a?ksmL*lr|gf>YXT2C=#9rtJwkR&CXDR& z0MCUydrc<%Dktra4CRHB$r=xY%+)+1nAdSBPXc=w0fJs)mLClvbX&RQH##5}8S=Ai z^clqw?Vo?Rf)-N6maqMvnu11HV_@r zgF5O@zSXZ%Za95bp!`T1B?e39(W~y&*|ogh^YnJlyz#;sw-iYA2FF~1ZuqXnreGMn j{3HdVA9dbx>@Yu5H7gWQKw<*E?Jx?t)b~aaw#@zutT1Ld literal 44517 zcmZ^qLzE?25M^K5wr$(4v~AnAZQHhO+g7D*vy%P02aQ1w?;XcFYe&Qm1!)jaQ~&?~ z3D8wc(N3zxm>Puw075VU0ObFE&0TEi3|&nuT^N+5C1qsjZB1%5_MEpmko?Z{10Buk z+Qf@;b)0e^vaQD}c^nU;ccjZRV_*{#LLx{t04=rbZ~c4iFaaedZ}@dD$*}aV7;gRF z0T(V=Y)xtuMi*C=*HSmlN}WTOYu3v-5zBMgT3)JA?qjqxWOgS?I+J4bsc5teCdyIX znion-=m)WtYk$uU@8lxGQ>}tB?9vW*Zc-^_j!Nwsv^nOcs}6PTh;LI@qv0YwGc+us z^HCJ5Jll1as8^=noPuL7_1N%v(8tz>v^8rkKKF|AAwsYw;paLSR;kV8~#BJD?CZ=YWlQy(ACd+pY$dTjnw6BGtMl}8_c z_j89_KH5Z~%;`0pmHX&$SnH~4vg6utjzSo(=Mca5_$tV`#N~9<9iIYCYIriWpAI?# zH6Uxu7#@ed=cM?AaJ*^pnQZRt=)N*za7?+^z6<5NjQiL5NGQKjW1RVZ_+e3BKscIW z-@vH~zZ%oiQ)ZVlDZYELkiN2;QG4e`w+|oWm(uDdD7PQnH*;{QKY*oYyql)9Uzh9X zaIaT3X39ssunp3re{+o^qlJ55&_Lo)$xIE*=hCkoj!9o}y>`0Ll>8P|SEX3or~|t) zpi6zsQKz@!^b5llUTq_BJB}53b|WoYn$tA4KlZs&h>Kq;DrKJDTOjQ9WzMl%1rryM z_#!c{sLNWM36yG7pqj^v913SS+6vsU6709 zUudk5Sc=QTQnIz|{u($cw1=-{{RIEMeiU)Bpto9GuCa#Lw7d!zSms%$#ay`#({YO} zB->z5<>I`<&z_b5%mqiV<` zb<$ADm-MHjnnIKUtz(2OI@Gjgl;UGTGV%s%@GF?P?W-9Ha{JT`m0(-Ngz)h5tkp3I zFHZ08K^;Q5raOQX^Tg=F7^ihDR8xD=ko#=3SWEX>pix4@0^1y1g`8NeAYxi|OL1vB zZT35kOQLaNmCb(^l}K{fAJ6%=AhYWV}jL8W5M{%zc4e@IMlME3?p3# z^B3Ra(XJ^`CS4fYYxEH}7&*i57=GWMueB^UYXsjmp%~nq0*Hf;vh#&aNQwpbwmOGFhiR zvqwC`q5$6*(@UqT_mtoy!3aO-IcRkaGE34wEx9;v46|yS#YUOgzkICKNV?q5U9}>V zNs_BlI=0X`r2)x=CXHIi88Ahz zfbRINU*VYW!79u#`J8-pp=D8%wBckN3u)oB_c@5@(ozB4 zGE#DHbi9jp6S!NeizqCb2lbX%_thc){VQaDg~()_rOlBgz;!2rL$y|@c8#zLtn+9R z(1A491Ny5VCMnXP5*nY#`7jvn8rQxw7hZ)AxuYK#;s=JKKcar>lt`)y-aG6LI+av3 zd0w=#nNj4(S46K&@h1}jd;sd4u8mW7$pOXYypT`p$mN{Q$$sKu9XBF>eRtM(h4w{bdDYnzA*oll zC=6}@pXYt80wRxM-ju>cHzWp8Al++zVJI(fJfXtqFq9x}X#=Hnj;vp!jit+8!AX5IxxJg{zf(hk_HnjH;qBEYN?=5@L&tms}*wRjcGIa*$7$2(4Q@ zH7>C_%KiusegWr1abn?x9r0Z!+)PP35X>wwSdE>|gOTK8@!VcEicM`# zdg~sxSh@VhNzi%iYIN^s@}oTTaPLw}OQaB_r0OWu<@^=!ymuW2v6UQSRJ>k*y-cJ| zt|O2&p^Z#|wHmRg%S}M@BTg8(E-Qa|9jhpV#|GJ_yuNoYiFnRSA=dcEOu3MBze&4(@lyNs`l2;39Jk7Yu~B>hUU;}m8i4|DVHX0zg(`hQ zu0|#38X3fq#UI4FBPD#O*SRa2;x7xx!mTQ}-bFICgT5+zdy}mOg;Xc>J=w% zoVD32AI4WCB24tZ8C=!)V_I&_x9PyTRO^pzIDCu
    *$@+h7yR^P5}vi0xssC_=i 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 list[dict]: + """Parse SBV content into list of subtitle blocks.""" + blocks = content.strip().split('\n\n') + subtitles = [] + + for block in blocks: + lines = block.strip().split('\n') + if len(lines) >= 2: + timestamp = lines[0] + text = '\n'.join(lines[1:]) + + # Extract start time + match = re.match(r'(\d+:\d+:\d+\.\d+),', timestamp) + start_time = match.group(1) if match else "0:00:00.000" + + subtitles.append({ + 'timestamp': timestamp, + 'start': start_time, + 'text': text + }) + + return subtitles +``` + +### ์˜คํƒ€ ๊ต์ • + +```python +import json + +def load_typo_dict(path: str = "references/typo_dictionary.json") -> dict: + """Load typo correction dictionary.""" + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + +def correct_text(text: str, typo_dict: dict) -> tuple[str, list]: + """Apply typo corrections and return corrected text with change log.""" + corrected = text + changes = [] + + for wrong, right in typo_dict.items(): + if wrong in corrected: + changes.append({'original': wrong, 'corrected': right}) + corrected = corrected.replace(wrong, right) + + return corrected, changes +``` + +### ์ฑ•ํ„ฐ ์ถ”์ถœ + +```python +CHAPTER_KEYWORDS = { + "intro": ["์•ˆ๋…•ํ•˜์„ธ์š”", "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ", "์ •๊ธฐํ˜ธ"], + "problem": ["๊ณ ๋ฏผ", "๊ฑฑ์ •", "๋ถˆํŽธ", "๋ฌธ์ œ"], + "explanation": ["์ด๋ž€", "๋ฌด์—‡", "์–ด๋–ค", "๋ฐฉ๋ฒ•"], + "procedure": ["์ˆ˜์ˆ ", "์‹œ์ˆ ", "๊ณผ์ •", "์ง„ํ–‰"], + "benefits": ["์žฅ์ ", "ํšจ๊ณผ", "๊ฒฐ๊ณผ", "์ข‹์€"], + "recovery": ["ํšŒ๋ณต", "๊ด€๋ฆฌ", "์ฃผ์˜", "ํ›„์—"], + "closing": ["์ƒ๋‹ด", "๋ฌธ์˜", "๊ฐ์‚ฌ", "์ถ”์ฒœ"] +} + +def extract_chapters(subtitles: list[dict]) -> list[dict]: + """Extract chapter timestamps from subtitles.""" + chapters = [] + seen_types = set() + + for sub in subtitles: + for chapter_type, keywords in CHAPTER_KEYWORDS.items(): + if chapter_type not in seen_types: + if any(kw in sub['text'] for kw in keywords): + # Convert to M:SS format + start = sub['start'] + parts = start.split(':') + if len(parts) == 3: + h, m, s = parts + total_min = int(h) * 60 + int(m) + sec = int(float(s)) + formatted = f"{total_min}:{sec:02d}" + else: + formatted = start + + chapters.append({ + 'time': formatted, + 'type': chapter_type + }) + seen_types.add(chapter_type) + break + + return chapters +``` + +### SBV ์žฌ๊ตฌ์„ฑ + +```python +def rebuild_sbv(subtitles: list[dict]) -> str: + """Rebuild SBV content from subtitle blocks.""" + blocks = [] + for sub in subtitles: + blocks.append(sub['timestamp']) + blocks.append(sub['text']) + blocks.append('') + return '\n'.join(blocks) +``` + +### ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ + +```python +def generate_metadata(chapters: list, changes: list, procedure_name: str = "") -> str: + """Generate YouTube metadata markdown.""" + + chapter_text = '\n'.join([f"{c['time']} {c['type']}" for c in chapters]) + + changes_table = "| ์œ„์น˜ | ์›๋ณธ | ์ˆ˜์ • |\n|------|------|------|\n" + for c in changes[:10]: # Top 10 changes + changes_table += f"| - | {c['original']} | {c['corrected']} |\n" + + return f"""# YouTube ์˜์ƒ ์ •๋ณด + +## ์ถ”์ฒœ ์ œ๋ชฉ +{procedure_name} | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ ์ •๊ธฐํ˜ธ ์›์žฅ + +## ์ฑ•ํ„ฐ (Chapters) +{chapter_text} + +## ์˜์ƒ ์„ค๋ช… (Description) + +โฑ๏ธ ํƒ€์ž„์Šคํƒฌํ”„ +{chapter_text} + +๐Ÿฅ ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ +๐Ÿ“ ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์••๊ตฌ์ •๋กœ 136 EHL๋นŒ๋”ฉ 3์ธต +๐Ÿ“ž 02-542-2399 +๐ŸŒ https://jamie.clinic + +#์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ #{procedure_name} #์••๊ตฌ์ •์„ฑํ˜•์™ธ๊ณผ + +## ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ +{changes_table} +""" +``` + +## ์˜คํƒ€ ์‚ฌ์ „ (typo_dictionary.json) + +์ฃผ์š” ๊ต์ • ํŒจํ„ด: + +| ์นดํ…Œ๊ณ ๋ฆฌ | ์˜คํƒ€ | ์ •์ • | +|----------|------|------| +| ๋ธŒ๋žœ๋“œ | ๋ฐ์ด๋ฏธ, ์žฌ์ด๋ฏธ | ์ œ์ด๋ฏธ | +| ๋ธŒ๋žœ๋“œ | ์„ฑ์•ก๊ณผ, ์„ฑํ˜„์™ธ๊ณผ | ์„ฑํ˜•์™ธ๊ณผ | +| ์‹œ์ˆ  | ์Œ๊ฑฐํ’€, ์Œ์ปคํ’€ | ์Œ๊บผํ’€ | +| ์‹œ์ˆ  | ๋งค๋ฌผ๋ฒ•, ๋ฉ”๋ชฐ๋ฒ• | ๋งค๋ชฐ๋ฒ• | +| ์‹œ์ˆ  | ์ด๋งˆ๊ฑฐ์ƒ | ์ด๋งˆ๊ฑฐ์ƒ์ˆ  | +| ์˜ํ•™ | ์ ˆ๊ณ„, ์ ˆ๊ฒŒ | ์ ˆ๊ฐœ | +| ์˜ํ•™ | ์ˆ˜๋ฉด ๋งˆ์ทจ | ์ˆ˜๋ฉด๋งˆ์ทจ | + +## ๊ณต์‹ ์‹œ์ˆ ๋ช… + +### ๋ˆˆ ์„ฑํ˜• +- ํ€ต ๋งค๋ชฐ๋ฒ• +- ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€ +- ์•ˆ๊ฒ€ํ•˜์ˆ˜ ๋ˆˆ๋งค๊ต์ •์ˆ  +- ๋ˆˆ๋ฐ‘์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜ +- ๋“€์–ผ ํŠธ์ž„ ์ˆ˜์ˆ  + +### ์ด๋งˆ ์„ฑํ˜• +- ๋‚ด์‹œ๊ฒฝ ์ด๋งˆ ๊ฑฐ์ƒ์ˆ  +- ๋‚ด์‹œ๊ฒฝ ๋ˆˆ์น ๊ฑฐ์ƒ์ˆ  + +### ๋™์•ˆ ์„ฑํ˜• +- ์Šค๋งˆ์Šค ๋ฆฌํ”„ํŒ… +- ์ž๊ฐ€ ์ง€๋ฐฉ์ด์‹ +- ํ•˜์ดํ‘ธ ๋ฆฌํ”„ํŒ… + +## Output Files + +| ํŒŒ์ผ | ์„ค๋ช… | +|------|------| +| `{filename}_corrected.sbv` | ๊ต์ •๋œ SBV ์ž๋ง‰ | +| `youtube_video_info.md` | YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ | +| `correction_report.md` | ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ | + +## Quality Checklist + +- [ ] ๋ธŒ๋žœ๋“œ๋ช… "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" ์ •ํ™•ํžˆ ํ‘œ๊ธฐ +- [ ] ์‹œ์ˆ ๋ช… ๊ณต์‹ ๋ช…์นญ์œผ๋กœ ํ†ต์ผ +- [ ] ์ฑ•ํ„ฐ 0:00 ์ธํŠธ๋กœ ํฌํ•จ +- [ ] ํ•ด์‹œํƒœ๊ทธ 3-5๊ฐœ ํฌํ•จ + +## Reference Files + +- `references/typo_dictionary.json` - ์˜คํƒ€ ๊ต์ • ์‚ฌ์ „ +- `references/chapter_patterns.md` - ์ฑ•ํ„ฐ ์ถ”์ถœ ํŒจํ„ด +- `references/youtube_metadata.md` - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/code/references/chapter_patterns.md b/custom-skills/44-jamie-youtube-subtitle-checker/code/references/chapter_patterns.md new file mode 100644 index 0000000..64de26e --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/code/references/chapter_patterns.md @@ -0,0 +1,246 @@ +# ์ฑ•ํ„ฐ ์ถ”์ถœ ํŒจํ„ด ๊ฐ€์ด๋“œ + +> ์ •๊ธฐํ˜ธ ์›์žฅ ์˜์ƒ์˜ ๊ตฌ์กฐ์  ํŠน์ง•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฑ•ํ„ฐ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ์˜์ƒ ์œ ํ˜•๋ณ„ ๊ตฌ์กฐ + +### Type A: ์‹œ์ˆ  ์†Œ๊ฐœ ์˜์ƒ (3-10๋ถ„) + +``` +0:00 ์ธํŠธ๋กœ (์ธ์‚ฌ) + โ””โ”€ "์•ˆ๋…•ํ•˜์„ธ์š”. ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ ์ •๊ธฐํ˜ธ ์›์žฅ์ž…๋‹ˆ๋‹ค" + +0:15~ ๋ฌธ์ œ ์ œ๊ธฐ / ๊ณต๊ฐ + โ””โ”€ "~๋กœ ๊ณ ๋ฏผํ•˜์‹œ๋Š” ๋ถ„๋“ค", "~๋•Œ๋ฌธ์— ๊ฑฑ์ •" + +0:30~ ์‹œ์ˆ  ์†Œ๊ฐœ + โ””โ”€ "[์‹œ์ˆ ๋ช…]์ด๋ž€", "์–ด๋–ค ๋ฐฉ๋ฒ•", "ํŠน์ง•" + +1:00~ ์ˆ˜์ˆ  ๊ณผ์ • / ๋ฐฉ๋ฒ• + โ””โ”€ "์ˆ˜์ˆ ์€", "์ง„ํ–‰", "๊ณผ์ •", "๋ฐฉ๋ฒ•" + +2:00~ ์žฅ์  / ํšจ๊ณผ + โ””โ”€ "์žฅ์ ", "ํšจ๊ณผ", "๊ฒฐ๊ณผ", "์ข‹์€ ์ " + +3:00~ ํšŒ๋ณต / ์ฃผ์˜์‚ฌํ•ญ + โ””โ”€ "ํšŒ๋ณต ๊ธฐ๊ฐ„", "์ฃผ์˜", "๊ด€๋ฆฌ", "~ํ›„์—" + +๋งˆ์ง€๋ง‰ 20์ดˆ ๋งˆ๋ฌด๋ฆฌ / CTA + โ””โ”€ "์ƒ๋‹ด", "๋ฌธ์˜", "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค" +``` + +### Type B: ์งง์€ ์„ค๋ช… ์˜์ƒ (1-3๋ถ„) + +``` +0:00 ์ธํŠธ๋กœ +0:10~ ํ•ต์‹ฌ ์„ค๋ช… +0:40~ ์žฅ์ /ํŠน์ง• +1:20~ ๋งˆ๋ฌด๋ฆฌ +``` + +### Type C: Q&A / FAQ ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ + ์งˆ๋ฌธ ์†Œ๊ฐœ +0:15~ ๋‹ต๋ณ€ 1 +0:45~ ๋‹ต๋ณ€ 2 (์žˆ๋Š” ๊ฒฝ์šฐ) +1:15~ ์ •๋ฆฌ / ๋งˆ๋ฌด๋ฆฌ +``` + +--- + +## ์ฑ•ํ„ฐ ๊ฐ์ง€ ํ‚ค์›Œ๋“œ + +### Primary Keywords (๋†’์€ ์šฐ์„ ์ˆœ์œ„) + +| ์ฑ•ํ„ฐ ์œ ํ˜• | ํ‚ค์›Œ๋“œ | +|----------|--------| +| **์ธํŠธ๋กœ** | "์•ˆ๋…•ํ•˜์„ธ์š”", "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ", "์ •๊ธฐํ˜ธ ์›์žฅ" | +| **์‹œ์ˆ  ์†Œ๊ฐœ** | "[์‹œ์ˆ ๋ช…]์ด๋ž€", "๋ฌด์—‡์ธ๊ฐ€์š”", "์–ด๋–ค ์ˆ˜์ˆ " | +| **์ˆ˜์ˆ  ๊ณผ์ •** | "์ˆ˜์ˆ  ๊ณผ์ •", "์ง„ํ–‰", "๋ฐฉ๋ฒ•์€", "์–ด๋–ป๊ฒŒ" | +| **์žฅ์ ** | "์žฅ์ ", "์ข‹์€ ์ ", "ํšจ๊ณผ", "๊ฒฐ๊ณผ" | +| **ํšŒ๋ณต** | "ํšŒ๋ณต ๊ธฐ๊ฐ„", "ํšŒ๋ณต์€", "๊ด€๋ฆฌ", "์ฃผ์˜์‚ฌํ•ญ" | +| **๋งˆ๋ฌด๋ฆฌ** | "์ƒ๋‹ด", "๋ฌธ์˜", "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค", "์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค" | + +### Secondary Keywords (๋ณด์กฐ) + +| ์ฑ•ํ„ฐ ์œ ํ˜• | ํ‚ค์›Œ๋“œ | +|----------|--------| +| **๋ฌธ์ œ ์ œ๊ธฐ** | "๊ณ ๋ฏผ", "๊ฑฑ์ •", "๋ถˆํŽธ", "ํž˜๋“ " | +| **๋น„๊ต** | "์ฐจ์ด", "๋น„๊ต", "vs", "๋‹ค๋ฅธ ์ " | +| **๋Œ€์ƒ** | "์ ํ•ฉํ•œ ๋ถ„", "์ถ”์ฒœ", "์ด๋Ÿฐ ๋ถ„" | +| **๋น„์šฉ/์‹œ๊ฐ„** | "์‹œ๊ฐ„", "๊ธฐ๊ฐ„", "๋น„์šฉ" | + +--- + +## ์ฑ•ํ„ฐ ์ถ”์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ + +### Step 1: ํ…์ŠคํŠธ์—์„œ ํ‚ค์›Œ๋“œ ํƒ์ง€ + +```python +def detect_chapter_candidates(subtitles, keywords): + candidates = [] + for i, sub in enumerate(subtitles): + text = sub['text'] + start_time = parse_start_time(sub['timestamp']) + + for chapter_type, kw_list in keywords.items(): + for kw in kw_list: + if kw in text: + candidates.append({ + 'time': start_time, + 'type': chapter_type, + 'keyword': kw, + 'context': text + }) + break + return candidates +``` + +### Step 2: ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ์ •๋ฆฌ + +```python +def deduplicate_chapters(candidates, min_gap_seconds=15): + """ + ๊ฐ™์€ ์œ ํ˜•์˜ ์ฑ•ํ„ฐ๊ฐ€ 15์ดˆ ์ด๋‚ด์— ์žˆ์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ๋งŒ ์œ ์ง€ + """ + result = [] + last_by_type = {} + + for c in sorted(candidates, key=lambda x: x['time']): + ctype = c['type'] + if ctype in last_by_type: + if c['time'] - last_by_type[ctype] < min_gap_seconds: + continue + result.append(c) + last_by_type[ctype] = c['time'] + + return result +``` + +### Step 3: ์ฑ•ํ„ฐ ์ œ๋ชฉ ์ƒ์„ฑ + +```python +chapter_titles = { + 'intro': '์ธํŠธ๋กœ', + 'problem': '์ด๋Ÿฐ ๊ณ ๋ฏผ ์žˆ์œผ์‹ ๊ฐ€์š”?', + 'explanation': '{procedure_name}์ด๋ž€?', + 'procedure': '์ˆ˜์ˆ  ๊ณผ์ •', + 'benefits': '์žฅ์  ๋ฐ ํšจ๊ณผ', + 'recovery': 'ํšŒ๋ณต ๋ฐ ๊ด€๋ฆฌ', + 'closing': '๋งˆ๋ฌด๋ฆฌ' +} +``` + +--- + +## ์‹œ๊ฐ„ ํ˜•์‹ ๋ณ€ํ™˜ + +### SBV โ†’ YouTube ์ฑ•ํ„ฐ ํ˜•์‹ + +```python +def sbv_to_chapter_time(sbv_time): + """ + "0:01:23.450" โ†’ "1:23" + "0:00:45.120" โ†’ "0:45" + """ + parts = sbv_time.split(':') + if len(parts) == 3: + h, m, s = parts + s = s.split('.')[0] # ๋ฐ€๋ฆฌ์ดˆ ์ œ๊ฑฐ + + h, m, s = int(h), int(m), int(s) + + if h > 0: + return f"{h}:{m:02d}:{s:02d}" + else: + return f"{m}:{s:02d}" + return sbv_time +``` + +--- + +## ์ฑ•ํ„ฐ ์ถœ๋ ฅ ํ˜•์‹ + +### YouTube ์„ค๋ช…๋ž€์šฉ ํ˜•์‹ + +``` +0:00 ์ธํŠธ๋กœ +0:17 ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€์ด๋ž€? +0:33 ์ˆ˜์ˆ  ๊ณผ์ • +0:50 ์žฅ์  ๋ฐ ํŠน์ง• +1:10 ํšŒ๋ณต ๊ธฐ๊ฐ„ +1:25 ๋งˆ๋ฌด๋ฆฌ +``` + +### ์ƒ์„ธ ํ˜•์‹ (๋‚ด๋ถ€ ๋ฌธ์„œ์šฉ) + +```markdown +| ์‹œ๊ฐ„ | ์ฑ•ํ„ฐ | ๊ฐ์ง€ ํ‚ค์›Œ๋“œ | ์ปจํ…์ŠคํŠธ | +|------|------|------------|----------| +| 0:00 | ์ธํŠธ๋กœ | "์•ˆ๋…•ํ•˜์„ธ์š”" | ์ธ์‚ฌ๋ง | +| 0:17 | ์‹œ์ˆ  ์†Œ๊ฐœ | "์ด๋ž€" | "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€์ด๋ž€..." | +``` + +--- + +## ์‹œ์ˆ ๋ณ„ ์ฑ•ํ„ฐ ํ…œํ”Œ๋ฆฟ + +### ๋ˆˆ ์„ฑํ˜• ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ +0:XX [์‹œ์ˆ ๋ช…]์ด๋ž€? +0:XX ์ˆ˜์ˆ  ๋ฐฉ๋ฒ• +0:XX ์žฅ์  (์ž์—ฐ์Šค๋Ÿฌ์›€, ๋น ๋ฅธ ํšŒ๋ณต ๋“ฑ) +0:XX ํšŒ๋ณต ๊ธฐ๊ฐ„ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +### ์ด๋งˆ/๋ฆฌํ”„ํŒ… ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ +0:XX ๋…ธํ™”์˜ ์›์ธ +0:XX [์‹œ์ˆ ๋ช…] ์†Œ๊ฐœ +0:XX ์ˆ˜์ˆ  ๊ณผ์ • +0:XX ํšจ๊ณผ ๋ฐ ์œ ์ง€ ๊ธฐ๊ฐ„ +0:XX ํšŒ๋ณต ๋ฐ ๊ด€๋ฆฌ +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +### Q&A ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ ๋ฐ ์งˆ๋ฌธ ์†Œ๊ฐœ +0:XX Q1. [์งˆ๋ฌธ1] +0:XX Q2. [์งˆ๋ฌธ2] +0:XX Q3. [์งˆ๋ฌธ3] +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +--- + +## Edge Cases + +### 1. ์ฑ•ํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์ ์„ ๋•Œ + +์˜์ƒ ๊ธธ์ด ๋Œ€๋น„ ์ฑ•ํ„ฐ๊ฐ€ 2๊ฐœ ์ดํ•˜๋ฉด: +- ์˜์ƒ์„ 3๋“ฑ๋ถ„ํ•˜์—ฌ ๊ฐ•์ œ ์ฑ•ํ„ฐ ์ƒ์„ฑ +- "์ „๋ฐ˜๋ถ€", "์ค‘๋ฐ˜๋ถ€", "ํ›„๋ฐ˜๋ถ€" ์‚ฌ์šฉ + +### 2. ์ธํŠธ๋กœ๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์„ ๋•Œ + +- 0:00์— "์ธํŠธ๋กœ" ๊ฐ•์ œ ์ถ”๊ฐ€ +- ์ฒซ ๋ฒˆ์งธ ์ž๋ง‰ ๋‚ด์šฉ์œผ๋กœ ์ œ๋ชฉ ์ƒ์„ฑ + +### 3. ์งง์€ ์˜์ƒ (1๋ถ„ ๋ฏธ๋งŒ) + +- ์ฑ•ํ„ฐ ์ตœ์†Œ 2๊ฐœ๋งŒ ์ƒ์„ฑ +- 0:00 ์ธํŠธ๋กœ + ๋งˆ์ง€๋ง‰ ๊ตฌ๊ฐ„ + +--- + +*Version 1.0.0 | 2025-12-23* diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/code/references/typo_dictionary.json b/custom-skills/44-jamie-youtube-subtitle-checker/code/references/typo_dictionary.json new file mode 100644 index 0000000..d59bc7c --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/code/references/typo_dictionary.json @@ -0,0 +1,126 @@ +{ + "metadata": { + "version": "1.0.0", + "updated": "2025-12-23", + "description": "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ YouTube ์ž๋ง‰ ์˜คํƒ€ ๊ต์ • ์‚ฌ์ „" + }, + + "brand_typos": { + "๋ฐ์ด๋ฏธ": "์ œ์ด๋ฏธ", + "์žฌ์ด๋ฏธ": "์ œ์ด๋ฏธ", + "์ œ์˜๋ฏธ": "์ œ์ด๋ฏธ", + "์ œ์ด์ด๋ฏธ": "์ œ์ด๋ฏธ", + "์„ฑ์•ก๊ณผ": "์„ฑํ˜•์™ธ๊ณผ", + "์„ฑํ˜•๊ณผ": "์„ฑํ˜•์™ธ๊ณผ", + "์„ฑํ˜„์™ธ๊ณผ": "์„ฑํ˜•์™ธ๊ณผ", + "์„ฑํ˜•์™ธ๊ฐ€": "์„ฑํ˜•์™ธ๊ณผ", + "์ œ์ด๋ฏธ์„ฑ๊ณผ": "์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ", + "์ œ์ด๋ฏธ ์„ฑ๊ณผ": "์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ", + "์ œ์ด๋ฏธ์„ฑํ˜•์™€๊ณผ": "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" + }, + + "procedure_typos": { + "eye_surgery": { + "์Œ๊ฑฐํ’€": "์Œ๊บผํ’€", + "์Œ๊ฑฐํ”Œ": "์Œ๊บผํ’€", + "์Œ์ปคํ’€": "์Œ๊บผํ’€", + "์Œ์ปคํ”Œ": "์Œ๊บผํ’€", + "์Œ๊บผํ”Œ": "์Œ๊บผํ’€", + "์Œ๊ฑฐ ํ’€": "์Œ๊บผํ’€", + "๋งค๋ฌผ๋ฒ•": "๋งค๋ชฐ๋ฒ•", + "๋งค๋ชฐ๋ฐฅ": "๋งค๋ชฐ๋ฒ•", + "๋ฉ”๋ชฐ๋ฒ•": "๋งค๋ชฐ๋ฒ•", + "๋งค๋ฌผ๋ฐฅ": "๋งค๋ชฐ๋ฒ•", + "๋ˆˆ๋ฉ”๊ต์ •": "๋ˆˆ๋งค๊ต์ •", + "๋ˆˆ๋งค ๊ต์ •": "๋ˆˆ๋งค๊ต์ •", + "์•ˆ๊ฒํ•˜์ˆ˜": "์•ˆ๊ฒ€ํ•˜์ˆ˜", + "์•ˆ๊ฒ€ ํ•˜์ˆ˜": "์•ˆ๊ฒ€ํ•˜์ˆ˜", + "๋ˆˆ๋ฐ‘ ์ง€๋ฐฉ": "๋ˆˆ๋ฐ‘์ง€๋ฐฉ", + "์ง€๋ฐฉ์žฌ๋ฐฐ์น˜": "์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜", + "๋“€์–ผํŠธ์ž„": "๋“€์–ผ ํŠธ์ž„", + "๋“€์–ผํŠธ ์ž„": "๋“€์–ผ ํŠธ์ž„", + "๋ˆˆ์„ญ๋ฐ‘": "๋ˆˆ์น๋ฐ‘", + "๋ˆˆ์น ๋ฐ‘": "๋ˆˆ์น๋ฐ‘" + }, + "forehead_surgery": { + "์ด๋งˆ ๊ฑฐ์ƒ": "์ด๋งˆ๊ฑฐ์ƒ", + "์ด๋งˆ๊ฑฐ์ƒ ์ˆ ": "์ด๋งˆ๊ฑฐ์ƒ์ˆ ", + "๋ˆˆ์„ญ๊ฑฐ์ƒ": "๋ˆˆ์น๊ฑฐ์ƒ", + "๋ˆˆ์น ๊ฑฐ์ƒ": "๋ˆˆ์น๊ฑฐ์ƒ", + "๋‚ด์‹œ๊ฒฝ์ด๋งˆ": "๋‚ด์‹œ๊ฒฝ ์ด๋งˆ", + "๋‚ด์‹œ๊ฒฝ๋ˆˆ์น": "๋‚ด์‹œ๊ฒฝ ๋ˆˆ์น" + }, + "anti_aging": { + "์Šค๋งˆ ์Šค": "์Šค๋งˆ์Šค", + "SMAS": "์Šค๋งˆ์Šค", + "smas": "์Šค๋งˆ์Šค", + "์•ž๊ด‘๋Œ€๋ฆฌํ”„ํŒ…": "์•ž๊ด‘๋Œ€ ๋ฆฌํ”„ํŒ…", + "์•ž ๊ด‘๋Œ€": "์•ž๊ด‘๋Œ€", + "ํ•˜์ดํ”„": "ํ•˜์ดํ‘ธ", + "ํ•˜์ด ํ‘ธ": "ํ•˜์ดํ‘ธ", + "์ง€๋ฐฉ์ด์‹": "์ง€๋ฐฉ ์ด์‹", + "์ž๊ฐ€์ง€๋ฐฉ": "์ž๊ฐ€ ์ง€๋ฐฉ", + "์‹ค๋ฆฌํ”„ํŒ…": "์‹ค ๋ฆฌํ”„ํŒ…" + }, + "others": { + "์˜๋ ์„ฑํ˜•": "์˜๋  ์„ฑํ˜•", + "ํ‰ํ„ฐ์„ฑํ˜•": "ํ‰ํ„ฐ ์„ฑํ˜•", + "์žฌ์ˆ˜์ˆ ": "์žฌ์ˆ˜์ˆ " + } + }, + + "medical_terms": { + "์š”๋ถ„์˜": "์—ฌ๋ถ„์˜", + "์ˆ˜๋ฉด ๋งˆ์ทจ": "์ˆ˜๋ฉด๋งˆ์ทจ", + "๊ตญ์†Œ ๋งˆ์ทจ": "๊ตญ์†Œ๋งˆ์ทจ", + "์ ˆ๊ณ„": "์ ˆ๊ฐœ", + "์ ˆ๊ฒŒ": "์ ˆ๊ฐœ", + "๋ด‰ํ—™": "๋ด‰ํ•ฉ", + "๋ด‰ ํ•ฉ": "๋ด‰ํ•ฉ", + "ํšŒ๋ณต๊ธฐ๊ฐ„": "ํšŒ๋ณต ๊ธฐ๊ฐ„", + "๋ถ€๊ธฐ": "๋ถ“๊ธฐ", + "๋ฉ์ด": "๋ฉ", + "ํ†ต์ฆ์ด": "ํ†ต์ฆ", + "๋งˆ์ทจ๊ฐ€": "๋งˆ์ทจ", + "์ˆ˜์ˆ ์ด": "์ˆ˜์ˆ ", + "์‹œ์ˆ ์ด": "์‹œ์ˆ " + }, + + "common_speech_recognition_errors": { + "์ • ๊ธฐํ˜ธ": "์ •๊ธฐํ˜ธ", + "์ •๊ธฐ ํ˜ธ": "์ •๊ธฐํ˜ธ", + "๊ธฐํ˜ธ ์›์žฅ": "์ •๊ธฐํ˜ธ ์›์žฅ", + "ํ•˜์ด๋ธŒ ๋ฆฌ๋“œ": "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ", + "ํ•˜์ด ๋ธŒ๋ฆฌ๋“œ": "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ", + "๋ฆฌํ”„ ํŒ…": "๋ฆฌํ”„ํŒ…", + "๋‚ด์‹œ ๊ฒฝ": "๋‚ด์‹œ๊ฒฝ" + }, + + "spacing_fixes": { + "์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ": "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ", + "์ •๊ธฐํ˜ธ์›์žฅ": "์ •๊ธฐํ˜ธ ์›์žฅ", + "์ˆ˜์ˆ ํ›„": "์ˆ˜์ˆ  ํ›„", + "์ˆ˜์ˆ ์ „": "์ˆ˜์ˆ  ์ „", + "์‹œ์ˆ ํ›„": "์‹œ์ˆ  ํ›„", + "์‹œ์ˆ ์ „": "์‹œ์ˆ  ์ „" + }, + + "official_procedure_names": [ + "ํ€ต ๋งค๋ชฐ๋ฒ•", + "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€", + "์•ˆ๊ฒ€ํ•˜์ˆ˜ ๋ˆˆ๋งค๊ต์ •์ˆ ", + "๋ˆˆ๋ฐ‘์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜", + "๋“€์–ผ ํŠธ์ž„ ์ˆ˜์ˆ ", + "๋ˆˆ์น๋ฐ‘ ํ”ผ๋ถ€์ ˆ๊ฐœ์ˆ ", + "๋ˆˆ ์žฌ์ˆ˜์ˆ ", + "๋‚ด์‹œ๊ฒฝ ์ด๋งˆ ๊ฑฐ์ƒ์ˆ ", + "๋‚ด์‹œ๊ฒฝ ๋ˆˆ์น ๊ฑฐ์ƒ์ˆ ", + "์•ž๊ด‘๋Œ€ ๋ฆฌํ”„ํŒ…", + "์Šค๋งˆ์Šค ๋ฆฌํ”„ํŒ…", + "์ž๊ฐ€ ์ง€๋ฐฉ์ด์‹", + "์‹ค ๋ฆฌํ”„ํŒ…", + "ํ•˜์ดํ‘ธ ๋ฆฌํ”„ํŒ…", + "์˜๋  ์„ฑํ˜•", + "ํ‰ํ„ฐ ์„ฑํ˜•" + ] +} diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/code/references/youtube_metadata.md b/custom-skills/44-jamie-youtube-subtitle-checker/code/references/youtube_metadata.md new file mode 100644 index 0000000..b8064b1 --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/code/references/youtube_metadata.md @@ -0,0 +1,172 @@ +# YouTube ์˜์ƒ ์ •๋ณด ํ…œํ”Œ๋ฆฟ + +> ์ด ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ์ถ”์ฒœ ์ œ๋ชฉ + +### ์ œ๋ชฉ ๊ณต์‹ +``` +[์‹œ์ˆ ๋ช…] | [ํ•ต์‹ฌ ๋ฒ ๋„คํ•/ํ‚ค์›Œ๋“œ] | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ +``` + +### ์ œ๋ชฉ ์˜ˆ์‹œ +- `ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€ | ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ˆˆ๋งค์˜ ๋น„๊ฒฐ | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` +- `๋‚ด์‹œ๊ฒฝ ์ด๋งˆ๊ฑฐ์ƒ์ˆ  | ๋™์•ˆ ํšจ๊ณผ์˜ ์›๋ฆฌ | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` +- `ํ€ต ๋งค๋ชฐ๋ฒ• | ํ‹ฐ ์•ˆ ๋‚˜๋Š” ์Œ๊บผํ’€ | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` + +### ์ œ๋ชฉ ์ž‘์„ฑ ๊ทœ์น™ +- 60์ž ์ด๋‚ด (ํ•œ๊ธ€ ๊ธฐ์ค€ 30์ž ๋‚ด์™ธ) +- ์‹œ์ˆ ๋ช…์„ ์•ž๋ถ€๋ถ„์— ๋ฐฐ์น˜ +- ๋ธŒ๋žœ๋“œ๋ช… "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" ํฌํ•จ +- ๊ณผ์žฅ ํ‘œํ˜„ ๊ธˆ์ง€ + +--- + +## ์ฑ•ํ„ฐ (Chapters) + +### ๊ธฐ๋ณธ ํ˜•์‹ +``` +0:00 ์ธํŠธ๋กœ +0:XX [์„น์…˜1] +0:XX [์„น์…˜2] +0:XX [์„น์…˜3] +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +### ์ž‘์„ฑ ๊ทœ์น™ +- ๋ฐ˜๋“œ์‹œ 0:00์œผ๋กœ ์‹œ์ž‘ +- ์ตœ์†Œ 3๊ฐœ ์ฑ•ํ„ฐ ๊ถŒ์žฅ +- ์‹œ๊ฐ„ ํ˜•์‹: M:SS (์˜ˆ: 1:23) +- ์ฑ•ํ„ฐ๋ช…์€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ (10์ž ์ด๋‚ด) + +--- + +## ์˜์ƒ ์„ค๋ช… (Description) + +### ํ…œํ”Œ๋ฆฟ + +``` +[์‹œ์ˆ ๋ช…]์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. +์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ ์ •๊ธฐํ˜ธ ์›์žฅ์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. + +โฑ๏ธ ํƒ€์ž„์Šคํƒฌํ”„ +{์ฑ•ํ„ฐ_๋ชฉ๋ก} + +๐Ÿ“‹ ์˜์ƒ ๋‚ด์šฉ +{์˜์ƒ_์š”์•ฝ_2-3๋ฌธ์žฅ} + +๐Ÿฅ ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ +๐Ÿ“ ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์••๊ตฌ์ •๋กœ 136 EHL๋นŒ๋”ฉ 3์ธต +๐Ÿ“ž 02-542-2399 +๐ŸŒ https://jamie.clinic +๐Ÿ’ฌ ์นด์นด์˜คํ†ก: @์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ + +{ํ•ด์‹œํƒœ๊ทธ} + +--- +โ€ป ๋ณธ ์˜์ƒ์€ ์ •๋ณด ์ œ๊ณต ๋ชฉ์ ์ด๋ฉฐ, ๊ฐœ์ธ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ˆ˜์ˆ  ์ „ ๋ฐ˜๋“œ์‹œ ์ „๋ฌธ์˜์™€ ์ƒ๋‹ดํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. +``` + +--- + +## ํ•ด์‹œํƒœ๊ทธ (Hashtags) + +### ํ•„์ˆ˜ ํƒœ๊ทธ +- `#์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` +- `#์••๊ตฌ์ •์„ฑํ˜•์™ธ๊ณผ` + +### ์‹œ์ˆ ๋ณ„ ํƒœ๊ทธ + +| ์‹œ์ˆ  ์นดํ…Œ๊ณ ๋ฆฌ | ๊ถŒ์žฅ ํ•ด์‹œํƒœ๊ทธ | +|--------------|--------------| +| ๋ˆˆ ์„ฑํ˜• | `#์Œ๊บผํ’€` `#๋ˆˆ์„ฑํ˜•` `#๋ˆˆ๋งค๊ต์ •` `#๋งค๋ชฐ๋ฒ•` | +| ์ด๋งˆ ์„ฑํ˜• | `#์ด๋งˆ๊ฑฐ์ƒ์ˆ ` `#์ด๋งˆ์„ฑํ˜•` `#๋ˆˆ์น๊ฑฐ์ƒ` `#๋‚ด์‹œ๊ฒฝ์ˆ˜์ˆ ` | +| ๋™์•ˆ ์„ฑํ˜• | `#๋™์•ˆ์„ฑํ˜•` `#๋ฆฌํ”„ํŒ…` `#์•ˆํ‹ฐ์—์ด์ง•` `#์Šค๋งˆ์Šค๋ฆฌํ”„ํŒ…` | +| ์ง€๋ฐฉ์ด์‹ | `#์ง€๋ฐฉ์ด์‹` `#์ž๊ฐ€์ง€๋ฐฉ` `#๋ณผ๋ฅจ์„ฑํ˜•` | + +### ํ•ด์‹œํƒœ๊ทธ ๊ทœ์น™ +- 3-5๊ฐœ ๊ถŒ์žฅ (์ตœ๋Œ€ 15๊ฐœ) +- ์‹œ์ˆ  ๊ด€๋ จ ํƒœ๊ทธ ์šฐ์„  +- ์ง€์—ญ ํƒœ๊ทธ ํฌํ•จ (`#์••๊ตฌ์ •`, `#๊ฐ•๋‚จ์„ฑํ˜•์™ธ๊ณผ`) + +--- + +## ํƒœ๊ทธ (Tags) - YouTube Studio์šฉ + +### ๋ธŒ๋žœ๋“œ ํƒœ๊ทธ +``` +์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ, Jamie Plastic Surgery, ์••๊ตฌ์ •์„ฑํ˜•์™ธ๊ณผ, ๊ฐ•๋‚จ์„ฑํ˜•์™ธ๊ณผ +``` + +### ์‹œ์ˆ  ํƒœ๊ทธ (์˜ˆ์‹œ: ๋ˆˆ ์„ฑํ˜•) +``` +์Œ๊บผํ’€, ์Œ๊บผํ’€์ˆ˜์ˆ , ๋ˆˆ์„ฑํ˜•, ๋ˆˆ๋งค๊ต์ •, ๋งค๋ชฐ๋ฒ•, ์ ˆ๊ฐœ๋ฒ•, +ํ•˜์ด๋ธŒ๋ฆฌ๋“œ์Œ๊บผํ’€, ์•ˆ๊ฒ€ํ•˜์ˆ˜, ๋ˆˆ๋ฐ‘์ง€๋ฐฉ, ๋ˆˆ์žฌ์ˆ˜์ˆ  +``` + +### ์ผ๋ฐ˜ ํƒœ๊ทธ +``` +์„ฑํ˜•์™ธ๊ณผ, ์„ฑํ˜•์ˆ˜์ˆ , ๋ฏธ์šฉ์„ฑํ˜•, ์ •๊ธฐํ˜ธ์›์žฅ, ์„ฑํ˜•์ •๋ณด +``` + +--- + +## ์ธ๋„ค์ผ ๊ฐ€์ด๋“œ + +### ํ•„์ˆ˜ ์š”์†Œ +- ์ •๊ธฐํ˜ธ ์›์žฅ ์–ผ๊ตด ๋˜๋Š” ์‹œ์ˆ  ๊ด€๋ จ ์ด๋ฏธ์ง€ +- ์‹œ์ˆ ๋ช… ํ…์ŠคํŠธ (ํฐ ๊ธ€์”จ) +- ๋ธŒ๋žœ๋“œ ๋กœ๊ณ  (์šฐ์ธก ํ•˜๋‹จ) + +### ์ƒ‰์ƒ +- ๋ฐฐ๊ฒฝ: ๋ฐ์€ ํ†ค ๋˜๋Š” ๋ธŒ๋žœ๋“œ ๊ทธ๋ฆฐ (#79A233) +- ํ…์ŠคํŠธ: ๊ณ ๋Œ€๋น„ (๊ฒ€์ • ๋˜๋Š” ํฐ์ƒ‰) + +### ํ…์ŠคํŠธ ์˜ˆ์‹œ +``` +ํ•˜์ด๋ธŒ๋ฆฌ๋“œ +์Œ๊บผํ’€ +``` + +--- + +## ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ ๋ฆฌํฌํŠธ + +### ํ˜•์‹ +```markdown +## ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ + +**์ด ์ˆ˜์ • ๊ฑด์ˆ˜**: X๊ฑด + +| # | ์œ„์น˜ (์‹œ๊ฐ„) | ์›๋ณธ | ์ˆ˜์ • | +|---|------------|------|------| +| 1 | 0:05 | ์„ฑ์•ก๊ณผ | ์„ฑํ˜•์™ธ๊ณผ | +| 2 | 0:12 | ์Œ๊ฑฐํ’€ | ์Œ๊บผํ’€ | +| 3 | 0:28 | ๋งค๋ฌผ๋ฒ• | ๋งค๋ชฐ๋ฒ• | +``` + +### ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ง‘๊ณ„ +```markdown +### ์ˆ˜์ • ์œ ํ˜•๋ณ„ ์ง‘๊ณ„ +- ๋ธŒ๋žœ๋“œ๋ช… ์˜คํƒ€: X๊ฑด +- ์‹œ์ˆ ๋ช… ์˜คํƒ€: X๊ฑด +- ์˜ํ•™ ์šฉ์–ด ์˜คํƒ€: X๊ฑด +- ๋„์–ด์“ฐ๊ธฐ: X๊ฑด +``` + +--- + +## ์ถœ๋ ฅ ํŒŒ์ผ ๊ตฌ์กฐ + +``` +outputs/ +โ”œโ”€โ”€ {์˜์ƒ๋ช…}_corrected.sbv # ๊ต์ •๋œ ์ž๋ง‰ +โ””โ”€โ”€ youtube_video_info.md # ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€ +``` + +--- + +*Version 1.0.0 | 2025-12-23* diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/desktop/SKILL.md b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/SKILL.md new file mode 100644 index 0000000..ed85f7d --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/SKILL.md @@ -0,0 +1,242 @@ +--- +name: jamie-subtitle-editor +description: "YouTube ์ž๋ง‰ ํŽธ์ง‘๊ธฐ for Jamie Plastic Surgery Clinic. SBV ํฌ๋งท ์ž๋ง‰ ํŒŒ์ผ์˜ ์˜คํƒ€ ๊ต์ •, ์˜ํ•™ ์šฉ์–ด ํ‘œ์ค€ํ™”, ์ฑ•ํ„ฐ ํƒ€์ž„์Šคํƒฌํ”„ ์ถ”์ถœ, YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ง‰ ๊ต์ •, subtitle ์˜คํƒ€, SBV ํŽธ์ง‘, ์ฑ•ํ„ฐ ์ถ”์ถœ, ์œ ํŠœ๋ธŒ ์ž๋ง‰, caption ์ˆ˜์ •, ํƒ€์ž„์Šคํƒฌํ”„ ์ƒ์„ฑ ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•˜์„ธ์š”." +--- + +# Jamie YouTube Subtitle Editor Skill + +> **Purpose**: SBV ์ž๋ง‰ ํŒŒ์ผ ์˜คํƒ€ ๊ต์ • ๋ฐ YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ +> **Input**: YouTube์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ SBV ํฌ๋งท ์ž๋ง‰ ํŒŒ์ผ +> **Output**: ๊ต์ •๋œ SBV ํŒŒ์ผ + YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€ + +--- + +## Workflow Overview + +``` +[Input: SBV ์ž๋ง‰ ํŒŒ์ผ] + โ†“ +[1. SBV ํŒŒ์‹ฑ ๋ฐ ํ…์ŠคํŠธ ์ถ”์ถœ] + โ†“ +[2. ์˜คํƒ€ ์ž๋™ ๊ต์ • (typo_dictionary ์ ์šฉ)] + โ†“ +[3. ์˜ํ•™ ์šฉ์–ด ํ‘œ์ค€ํ™”] + โ†“ +[4. ์ฑ•ํ„ฐ ํƒ€์ž„์Šคํƒฌํ”„ ์ถ”์ถœ] + โ†“ +[5. YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ] + โ†“ +[Output: ๊ต์ •๋œ SBV + ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€] +``` + +--- + +## SBV Format Specification + +### SBV ๊ตฌ์กฐ +``` +[์‹œ์ž‘์‹œ๊ฐ„],[์ข…๋ฃŒ์‹œ๊ฐ„] +์ž๋ง‰ ํ…์ŠคํŠธ (1์ค„ ๋˜๋Š” ์—ฌ๋Ÿฌ ์ค„) + +[์‹œ์ž‘์‹œ๊ฐ„],[์ข…๋ฃŒ์‹œ๊ฐ„] +์ž๋ง‰ ํ…์ŠคํŠธ +... +``` + +### ์‹œ๊ฐ„ ํ˜•์‹ +- `H:MM:SS.sss` ๋˜๋Š” `M:SS.sss` +- ์˜ˆ: `0:00:05.120,0:00:08.450` + +### ํŒŒ์‹ฑ ๊ทœ์น™ +1. ๋นˆ ์ค„๋กœ ์ž๋ง‰ ๋ธ”๋ก ๊ตฌ๋ถ„ +2. ์ฒซ ์ค„: ํƒ€์ž„์Šคํƒฌํ”„ (์ฝค๋งˆ๋กœ ์‹œ์ž‘/์ข…๋ฃŒ ๊ตฌ๋ถ„) +3. ๋‚˜๋จธ์ง€ ์ค„: ์ž๋ง‰ ํ…์ŠคํŠธ + +--- + +## ์˜คํƒ€ ๊ต์ • ์‹œ์Šคํ…œ + +### 1. ๋ธŒ๋žœ๋“œ๋ช… ์˜คํƒ€ + +| ์˜คํƒ€ ํŒจํ„ด | ์ •์ • | +|----------|------| +| ๋ฐ์ด๋ฏธ, ์žฌ์ด๋ฏธ, ์ œ์˜๋ฏธ | ์ œ์ด๋ฏธ | +| ์„ฑ์•ก๊ณผ, ์„ฑํ˜•๊ณผ, ์„ฑํ˜„์™ธ๊ณผ | ์„ฑํ˜•์™ธ๊ณผ | +| ์ œ์ด๋ฏธ์„ฑ๊ณผ | ์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ | + +### 2. ์‹œ์ˆ ๋ช… ์˜คํƒ€ + +| ์˜คํƒ€ ํŒจํ„ด | ์ •์ • | +|----------|------| +| ์Œ๊ฑฐํ’€, ์Œ๊ฑฐํ”Œ, ์Œ์ปคํ’€ | ์Œ๊บผํ’€ | +| ๋งค๋ฌผ๋ฒ•, ๋งค๋ชฐ๋ฐฅ, ๋ฉ”๋ชฐ๋ฒ• | ๋งค๋ชฐ๋ฒ• | +| ๋ˆˆ๋งค๊ต์ •, ๋ˆˆ๋ฉ”๊ต์ • | ๋ˆˆ๋งค๊ต์ •์ˆ  | +| ์•ˆ๊ฒ€ํ•˜์ˆ˜, ์•ˆ๊ฒํ•˜์ˆ˜ | ์•ˆ๊ฒ€ํ•˜์ˆ˜ | +| ์ด๋งˆ๊ฑฐ์ƒ, ์ด๋งˆ ๊ฑฐ์ƒ | ์ด๋งˆ๊ฑฐ์ƒ์ˆ  | +| ๋ˆˆ์น๊ฑฐ์ƒ, ๋ˆˆ์„ญ๊ฑฐ์ƒ | ๋ˆˆ์น๊ฑฐ์ƒ์ˆ  | +| ์ง€๋ฐฉ์žฌ๋ฐฐ์น˜, ์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜ | ์ง€๋ฐฉ์žฌ๋ฐฐ์น˜์ˆ  | +| ์Šค๋งˆ์Šค, SMAS | ์Šค๋งˆ์Šค | +| ํ•˜์ดํ‘ธ, ํ•˜์ดํ”„ | ํ•˜์ดํ‘ธ | +| ๋“€์–ผํŠธ์ž„, ๋“€์–ผ ํŠธ์ž„ | ๋“€์–ผ ํŠธ์ž„ ์ˆ˜์ˆ  | + +### 3. ์ผ๋ฐ˜ ์˜ํ•™ ์šฉ์–ด ์˜คํƒ€ + +| ์˜คํƒ€ ํŒจํ„ด | ์ •์ • | +|----------|------| +| ์š”๋ถ„์˜ | ์—ฌ๋ถ„์˜ | +| ์ˆ˜๋ฉด๋งˆ์ทจ, ์ˆ˜๋ฉด ๋งˆ์ทจ | ์ˆ˜๋ฉด๋งˆ์ทจ | +| ๊ตญ์†Œ๋งˆ์ทจ, ๊ตญ์†Œ ๋งˆ์ทจ | ๊ตญ์†Œ๋งˆ์ทจ | +| ์ ˆ๊ณ„, ์ ˆ๊ฒŒ | ์ ˆ๊ฐœ | +| ๋ด‰ํ•ฉ, ๋ด‰ํ—™ | ๋ด‰ํ•ฉ | +| ํšŒ๋ณต๊ธฐ๊ฐ„, ํšŒ๋ณต ๊ธฐ๊ฐ„ | ํšŒ๋ณต ๊ธฐ๊ฐ„ | + +--- + +## ๊ณต์‹ ์ง„๋ฃŒ๊ณผ๋ชฉ ๋ช…์นญ + +### ๋ˆˆ ์„ฑํ˜• +- ํ€ต ๋งค๋ชฐ๋ฒ• +- ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ์ปคํ’€ +- ์•ˆ๊ฒ€ํ•˜์ˆ˜ ๋ˆˆ๋งค๊ต์ •์ˆ  +- ๋ˆˆ๋ฐ‘์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜ +- ๋“€์–ผ ํŠธ์ž„ ์ˆ˜์ˆ  +- ๋ˆˆ์น๋ฐ‘ ํ”ผ๋ถ€์ ˆ๊ฐœ์ˆ  +- ๋ˆˆ ์žฌ์ˆ˜์ˆ  + +### ์ด๋งˆ ์„ฑํ˜• +- ๋‚ด์‹œ๊ฒฝ ์ด๋งˆ ๊ฑฐ์ƒ์ˆ  +- ๋‚ด์‹œ๊ฒฝ ๋ˆˆ์น ๊ฑฐ์ƒ์ˆ  + +### ๋™์•ˆ ์„ฑํ˜• +- ์•ž๊ด‘๋Œ€ ๋ฆฌํ”„ํŒ… +- ์Šค๋งˆ์Šค ๋ฆฌํ”„ํŒ… +- ์ž๊ฐ€ ์ง€๋ฐฉ์ด์‹ +- ์‹ค ๋ฆฌํ”„ํŒ… +- ํ•˜์ดํ‘ธ ๋ฆฌํ”„ํŒ… + +--- + +## ์ฑ•ํ„ฐ ์ถ”์ถœ ๋กœ์ง + +### ์˜์ƒ ๊ตฌ์กฐ ํŒจํ„ด (์ •๊ธฐํ˜ธ ์›์žฅ ์Šคํƒ€์ผ) + +| ์„น์…˜ | ์ผ๋ฐ˜์  ์‹œ์ž‘ ์‹œ๊ฐ„ | ํ‚ค์›Œ๋“œ | +|------|-----------------|--------| +| ์ธํŠธ๋กœ | 0:00 | "์•ˆ๋…•ํ•˜์„ธ์š”", "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" | +| ๋ฌธ์ œ ์ œ๊ธฐ | 0:15~0:30 | "๊ณ ๋ฏผ", "๊ฑฑ์ •", "๋ถˆํŽธ" | +| ์‹œ์ˆ  ์†Œ๊ฐœ | 0:30~1:00 | "[์‹œ์ˆ ๋ช…]์ด๋ž€", "๋ฐฉ๋ฒ•", "ํŠน์ง•" | +| ์žฅ์ /ํšจ๊ณผ | ์ค‘๋ฐ˜๋ถ€ | "์žฅ์ ", "ํšจ๊ณผ", "๊ฒฐ๊ณผ" | +| ํšŒ๋ณต/์ฃผ์˜์‚ฌํ•ญ | ํ›„๋ฐ˜๋ถ€ | "ํšŒ๋ณต", "์ฃผ์˜", "๊ด€๋ฆฌ" | +| ๋งˆ๋ฌด๋ฆฌ/CTA | ๋งˆ์ง€๋ง‰ 20์ดˆ | "์ƒ๋‹ด", "๋ฌธ์˜", "๊ฐ์‚ฌ" | + +### ์ฑ•ํ„ฐ ํฌ๋งท + +``` +0:00 ์ธํŠธ๋กœ +0:17 [์ฃผ์ œ1 - ๋ฌธ์ œ ์ œ๊ธฐ] +0:33 [์ฃผ์ œ2 - ์‹œ์ˆ  ์„ค๋ช…] +0:50 [์ฃผ์ œ3 - ์žฅ์ /ํŠน์ง•] +1:10 [์ฃผ์ œ4 - ํšŒ๋ณต/๊ด€๋ฆฌ] +1:25 ๋งˆ๋ฌด๋ฆฌ +``` + +--- + +## Output Specifications + +### 1. ๊ต์ •๋œ SBV ํŒŒ์ผ + +**ํŒŒ์ผ๋ช…**: `{์›๋ณธํŒŒ์ผ๋ช…}_corrected.sbv` + +### 2. YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€ + +**ํŒŒ์ผ๋ช…**: `youtube_video_info.md` + +**๋‚ด์šฉ ๊ตฌ์„ฑ**: +```markdown +# YouTube ์˜์ƒ ์ •๋ณด + +## ์ถ”์ฒœ ์ œ๋ชฉ +[์‹œ์ˆ ๋ช…] | [ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ] | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ + +## ์ฑ•ํ„ฐ (Chapters) +0:00 ์ธํŠธ๋กœ +... + +## ์˜์ƒ ์„ค๋ช… (Description) +[์ฒซ 2์ค„ ์š”์•ฝ] + +โฑ๏ธ ํƒ€์ž„์Šคํƒฌํ”„ +[์ฑ•ํ„ฐ ๋ชฉ๋ก] + +๐Ÿฅ ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ +๐Ÿ“ ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์••๊ตฌ์ •๋กœ 136 EHL๋นŒ๋”ฉ 3์ธต +๐Ÿ“ž 02-542-2399 +๐ŸŒ https://jamie.clinic + +#์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ #[์‹œ์ˆ ๋ช…] #์••๊ตฌ์ •์„ฑํ˜•์™ธ๊ณผ #[๊ด€๋ จํƒœ๊ทธ] + +## ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ +| ์œ„์น˜ | ์›๋ณธ | ์ˆ˜์ • | +|------|------|------| +| 0:05 | ์„ฑ์•ก๊ณผ | ์„ฑํ˜•์™ธ๊ณผ | +... +``` + +--- + +## Usage Examples + +### ๊ธฐ๋ณธ ์‚ฌ์šฉ +``` +"์ด SBV ์ž๋ง‰ ํŒŒ์ผ ์˜คํƒ€ ๊ต์ •ํ•ด์ค˜" +"์œ ํŠœ๋ธŒ ์ž๋ง‰ ์ˆ˜์ •ํ•˜๊ณ  ์ฑ•ํ„ฐ ์ถ”์ถœํ•ด์ค˜" +``` + +### ํŒŒ์ผ ์—…๋กœ๋“œ ํ›„ +``` +"์ž๋ง‰ ํŒŒ์ผ ๊ต์ •ํ•˜๊ณ  YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋งŒ๋“ค์–ด์ค˜" +"SBV ์˜คํƒ€ ์ˆ˜์ • + ์˜์ƒ ์ •๋ณด ํŒจํ‚ค์ง€ ์ƒ์„ฑ" +``` + +### ํŠน์ • ์š”์ฒญ +``` +"์ฑ•ํ„ฐ ํƒ€์ž„์Šคํƒฌํ”„๋งŒ ์ถ”์ถœํ•ด์ค˜" +"์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ ๋ฆฌํฌํŠธ๋งŒ ์ค˜" +``` + +--- + +## Quality Checklist + +### ๊ต์ • ์™„๋ฃŒ ํ™•์ธ +- [ ] ๋ธŒ๋žœ๋“œ๋ช… "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" ์ •ํ™•ํžˆ ํ‘œ๊ธฐ +- [ ] ์‹œ์ˆ ๋ช… ๊ณต์‹ ๋ช…์นญ์œผ๋กœ ํ†ต์ผ +- [ ] ์˜ํ•™ ์šฉ์–ด ๋งž์ถค๋ฒ• ํ™•์ธ +- [ ] ๋„์–ด์“ฐ๊ธฐ ์ผ๊ด€์„ฑ + +### ์ฑ•ํ„ฐ ํ™•์ธ +- [ ] 0:00 ์ธํŠธ๋กœ ํฌํ•จ +- [ ] ์ฃผ์š” ์ „ํ™˜์  ๋ฐ˜์˜ +- [ ] ์‹œ๊ฐ„ ํ˜•์‹ ํ†ต์ผ (M:SS) + +### ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ™•์ธ +- [ ] ์ œ๋ชฉ์— ์‹œ์ˆ ๋ช… + ๋ธŒ๋žœ๋“œ ํฌํ•จ +- [ ] ํ•ด์‹œํƒœ๊ทธ 3-5๊ฐœ +- [ ] ๋ณ‘์› ์—ฐ๋ฝ์ฒ˜ ์ •ํ™• + +--- + +## Reference Files + +- `references/typo_dictionary.json` - ์˜คํƒ€ ๊ต์ • ์‚ฌ์ „ +- `references/chapter_patterns.md` - ์ฑ•ํ„ฐ ์ถ”์ถœ ํŒจํ„ด +- `references/youtube_metadata.md` - ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ…œํ”Œ๋ฆฟ + +--- + +## Notes + +- **์˜๋ฃŒ๊ด‘๊ณ ๋ฒ• ๊ณ ์ง€๋ฌธ**: ์ž๋ง‰ ํŒŒ์ผ์—๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Œ (YouTube ์„ค๋ช…๋ž€์—๋งŒ ์‚ฝ์ž…) +- **SBV ์ „์šฉ**: YouTube ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋ณธ ํฌ๋งท์ธ SBV๋งŒ ์ง€์› +- **ํ•œ๊ตญ์–ด ํŠนํ™”**: ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ ์ฝ˜ํ…์ธ  ์ „์šฉ ์˜คํƒ€ ์‚ฌ์ „ diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/chapter_patterns.md b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/chapter_patterns.md new file mode 100644 index 0000000..64de26e --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/chapter_patterns.md @@ -0,0 +1,246 @@ +# ์ฑ•ํ„ฐ ์ถ”์ถœ ํŒจํ„ด ๊ฐ€์ด๋“œ + +> ์ •๊ธฐํ˜ธ ์›์žฅ ์˜์ƒ์˜ ๊ตฌ์กฐ์  ํŠน์ง•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฑ•ํ„ฐ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ์˜์ƒ ์œ ํ˜•๋ณ„ ๊ตฌ์กฐ + +### Type A: ์‹œ์ˆ  ์†Œ๊ฐœ ์˜์ƒ (3-10๋ถ„) + +``` +0:00 ์ธํŠธ๋กœ (์ธ์‚ฌ) + โ””โ”€ "์•ˆ๋…•ํ•˜์„ธ์š”. ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ ์ •๊ธฐํ˜ธ ์›์žฅ์ž…๋‹ˆ๋‹ค" + +0:15~ ๋ฌธ์ œ ์ œ๊ธฐ / ๊ณต๊ฐ + โ””โ”€ "~๋กœ ๊ณ ๋ฏผํ•˜์‹œ๋Š” ๋ถ„๋“ค", "~๋•Œ๋ฌธ์— ๊ฑฑ์ •" + +0:30~ ์‹œ์ˆ  ์†Œ๊ฐœ + โ””โ”€ "[์‹œ์ˆ ๋ช…]์ด๋ž€", "์–ด๋–ค ๋ฐฉ๋ฒ•", "ํŠน์ง•" + +1:00~ ์ˆ˜์ˆ  ๊ณผ์ • / ๋ฐฉ๋ฒ• + โ””โ”€ "์ˆ˜์ˆ ์€", "์ง„ํ–‰", "๊ณผ์ •", "๋ฐฉ๋ฒ•" + +2:00~ ์žฅ์  / ํšจ๊ณผ + โ””โ”€ "์žฅ์ ", "ํšจ๊ณผ", "๊ฒฐ๊ณผ", "์ข‹์€ ์ " + +3:00~ ํšŒ๋ณต / ์ฃผ์˜์‚ฌํ•ญ + โ””โ”€ "ํšŒ๋ณต ๊ธฐ๊ฐ„", "์ฃผ์˜", "๊ด€๋ฆฌ", "~ํ›„์—" + +๋งˆ์ง€๋ง‰ 20์ดˆ ๋งˆ๋ฌด๋ฆฌ / CTA + โ””โ”€ "์ƒ๋‹ด", "๋ฌธ์˜", "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค" +``` + +### Type B: ์งง์€ ์„ค๋ช… ์˜์ƒ (1-3๋ถ„) + +``` +0:00 ์ธํŠธ๋กœ +0:10~ ํ•ต์‹ฌ ์„ค๋ช… +0:40~ ์žฅ์ /ํŠน์ง• +1:20~ ๋งˆ๋ฌด๋ฆฌ +``` + +### Type C: Q&A / FAQ ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ + ์งˆ๋ฌธ ์†Œ๊ฐœ +0:15~ ๋‹ต๋ณ€ 1 +0:45~ ๋‹ต๋ณ€ 2 (์žˆ๋Š” ๊ฒฝ์šฐ) +1:15~ ์ •๋ฆฌ / ๋งˆ๋ฌด๋ฆฌ +``` + +--- + +## ์ฑ•ํ„ฐ ๊ฐ์ง€ ํ‚ค์›Œ๋“œ + +### Primary Keywords (๋†’์€ ์šฐ์„ ์ˆœ์œ„) + +| ์ฑ•ํ„ฐ ์œ ํ˜• | ํ‚ค์›Œ๋“œ | +|----------|--------| +| **์ธํŠธ๋กœ** | "์•ˆ๋…•ํ•˜์„ธ์š”", "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ", "์ •๊ธฐํ˜ธ ์›์žฅ" | +| **์‹œ์ˆ  ์†Œ๊ฐœ** | "[์‹œ์ˆ ๋ช…]์ด๋ž€", "๋ฌด์—‡์ธ๊ฐ€์š”", "์–ด๋–ค ์ˆ˜์ˆ " | +| **์ˆ˜์ˆ  ๊ณผ์ •** | "์ˆ˜์ˆ  ๊ณผ์ •", "์ง„ํ–‰", "๋ฐฉ๋ฒ•์€", "์–ด๋–ป๊ฒŒ" | +| **์žฅ์ ** | "์žฅ์ ", "์ข‹์€ ์ ", "ํšจ๊ณผ", "๊ฒฐ๊ณผ" | +| **ํšŒ๋ณต** | "ํšŒ๋ณต ๊ธฐ๊ฐ„", "ํšŒ๋ณต์€", "๊ด€๋ฆฌ", "์ฃผ์˜์‚ฌํ•ญ" | +| **๋งˆ๋ฌด๋ฆฌ** | "์ƒ๋‹ด", "๋ฌธ์˜", "๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค", "์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค" | + +### Secondary Keywords (๋ณด์กฐ) + +| ์ฑ•ํ„ฐ ์œ ํ˜• | ํ‚ค์›Œ๋“œ | +|----------|--------| +| **๋ฌธ์ œ ์ œ๊ธฐ** | "๊ณ ๋ฏผ", "๊ฑฑ์ •", "๋ถˆํŽธ", "ํž˜๋“ " | +| **๋น„๊ต** | "์ฐจ์ด", "๋น„๊ต", "vs", "๋‹ค๋ฅธ ์ " | +| **๋Œ€์ƒ** | "์ ํ•ฉํ•œ ๋ถ„", "์ถ”์ฒœ", "์ด๋Ÿฐ ๋ถ„" | +| **๋น„์šฉ/์‹œ๊ฐ„** | "์‹œ๊ฐ„", "๊ธฐ๊ฐ„", "๋น„์šฉ" | + +--- + +## ์ฑ•ํ„ฐ ์ถ”์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ + +### Step 1: ํ…์ŠคํŠธ์—์„œ ํ‚ค์›Œ๋“œ ํƒ์ง€ + +```python +def detect_chapter_candidates(subtitles, keywords): + candidates = [] + for i, sub in enumerate(subtitles): + text = sub['text'] + start_time = parse_start_time(sub['timestamp']) + + for chapter_type, kw_list in keywords.items(): + for kw in kw_list: + if kw in text: + candidates.append({ + 'time': start_time, + 'type': chapter_type, + 'keyword': kw, + 'context': text + }) + break + return candidates +``` + +### Step 2: ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ์ •๋ฆฌ + +```python +def deduplicate_chapters(candidates, min_gap_seconds=15): + """ + ๊ฐ™์€ ์œ ํ˜•์˜ ์ฑ•ํ„ฐ๊ฐ€ 15์ดˆ ์ด๋‚ด์— ์žˆ์œผ๋ฉด ์ฒซ ๋ฒˆ์งธ๋งŒ ์œ ์ง€ + """ + result = [] + last_by_type = {} + + for c in sorted(candidates, key=lambda x: x['time']): + ctype = c['type'] + if ctype in last_by_type: + if c['time'] - last_by_type[ctype] < min_gap_seconds: + continue + result.append(c) + last_by_type[ctype] = c['time'] + + return result +``` + +### Step 3: ์ฑ•ํ„ฐ ์ œ๋ชฉ ์ƒ์„ฑ + +```python +chapter_titles = { + 'intro': '์ธํŠธ๋กœ', + 'problem': '์ด๋Ÿฐ ๊ณ ๋ฏผ ์žˆ์œผ์‹ ๊ฐ€์š”?', + 'explanation': '{procedure_name}์ด๋ž€?', + 'procedure': '์ˆ˜์ˆ  ๊ณผ์ •', + 'benefits': '์žฅ์  ๋ฐ ํšจ๊ณผ', + 'recovery': 'ํšŒ๋ณต ๋ฐ ๊ด€๋ฆฌ', + 'closing': '๋งˆ๋ฌด๋ฆฌ' +} +``` + +--- + +## ์‹œ๊ฐ„ ํ˜•์‹ ๋ณ€ํ™˜ + +### SBV โ†’ YouTube ์ฑ•ํ„ฐ ํ˜•์‹ + +```python +def sbv_to_chapter_time(sbv_time): + """ + "0:01:23.450" โ†’ "1:23" + "0:00:45.120" โ†’ "0:45" + """ + parts = sbv_time.split(':') + if len(parts) == 3: + h, m, s = parts + s = s.split('.')[0] # ๋ฐ€๋ฆฌ์ดˆ ์ œ๊ฑฐ + + h, m, s = int(h), int(m), int(s) + + if h > 0: + return f"{h}:{m:02d}:{s:02d}" + else: + return f"{m}:{s:02d}" + return sbv_time +``` + +--- + +## ์ฑ•ํ„ฐ ์ถœ๋ ฅ ํ˜•์‹ + +### YouTube ์„ค๋ช…๋ž€์šฉ ํ˜•์‹ + +``` +0:00 ์ธํŠธ๋กœ +0:17 ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€์ด๋ž€? +0:33 ์ˆ˜์ˆ  ๊ณผ์ • +0:50 ์žฅ์  ๋ฐ ํŠน์ง• +1:10 ํšŒ๋ณต ๊ธฐ๊ฐ„ +1:25 ๋งˆ๋ฌด๋ฆฌ +``` + +### ์ƒ์„ธ ํ˜•์‹ (๋‚ด๋ถ€ ๋ฌธ์„œ์šฉ) + +```markdown +| ์‹œ๊ฐ„ | ์ฑ•ํ„ฐ | ๊ฐ์ง€ ํ‚ค์›Œ๋“œ | ์ปจํ…์ŠคํŠธ | +|------|------|------------|----------| +| 0:00 | ์ธํŠธ๋กœ | "์•ˆ๋…•ํ•˜์„ธ์š”" | ์ธ์‚ฌ๋ง | +| 0:17 | ์‹œ์ˆ  ์†Œ๊ฐœ | "์ด๋ž€" | "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€์ด๋ž€..." | +``` + +--- + +## ์‹œ์ˆ ๋ณ„ ์ฑ•ํ„ฐ ํ…œํ”Œ๋ฆฟ + +### ๋ˆˆ ์„ฑํ˜• ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ +0:XX [์‹œ์ˆ ๋ช…]์ด๋ž€? +0:XX ์ˆ˜์ˆ  ๋ฐฉ๋ฒ• +0:XX ์žฅ์  (์ž์—ฐ์Šค๋Ÿฌ์›€, ๋น ๋ฅธ ํšŒ๋ณต ๋“ฑ) +0:XX ํšŒ๋ณต ๊ธฐ๊ฐ„ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +### ์ด๋งˆ/๋ฆฌํ”„ํŒ… ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ +0:XX ๋…ธํ™”์˜ ์›์ธ +0:XX [์‹œ์ˆ ๋ช…] ์†Œ๊ฐœ +0:XX ์ˆ˜์ˆ  ๊ณผ์ • +0:XX ํšจ๊ณผ ๋ฐ ์œ ์ง€ ๊ธฐ๊ฐ„ +0:XX ํšŒ๋ณต ๋ฐ ๊ด€๋ฆฌ +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +### Q&A ์˜์ƒ + +``` +0:00 ์ธํŠธ๋กœ ๋ฐ ์งˆ๋ฌธ ์†Œ๊ฐœ +0:XX Q1. [์งˆ๋ฌธ1] +0:XX Q2. [์งˆ๋ฌธ2] +0:XX Q3. [์งˆ๋ฌธ3] +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +--- + +## Edge Cases + +### 1. ์ฑ•ํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ์ ์„ ๋•Œ + +์˜์ƒ ๊ธธ์ด ๋Œ€๋น„ ์ฑ•ํ„ฐ๊ฐ€ 2๊ฐœ ์ดํ•˜๋ฉด: +- ์˜์ƒ์„ 3๋“ฑ๋ถ„ํ•˜์—ฌ ๊ฐ•์ œ ์ฑ•ํ„ฐ ์ƒ์„ฑ +- "์ „๋ฐ˜๋ถ€", "์ค‘๋ฐ˜๋ถ€", "ํ›„๋ฐ˜๋ถ€" ์‚ฌ์šฉ + +### 2. ์ธํŠธ๋กœ๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์„ ๋•Œ + +- 0:00์— "์ธํŠธ๋กœ" ๊ฐ•์ œ ์ถ”๊ฐ€ +- ์ฒซ ๋ฒˆ์งธ ์ž๋ง‰ ๋‚ด์šฉ์œผ๋กœ ์ œ๋ชฉ ์ƒ์„ฑ + +### 3. ์งง์€ ์˜์ƒ (1๋ถ„ ๋ฏธ๋งŒ) + +- ์ฑ•ํ„ฐ ์ตœ์†Œ 2๊ฐœ๋งŒ ์ƒ์„ฑ +- 0:00 ์ธํŠธ๋กœ + ๋งˆ์ง€๋ง‰ ๊ตฌ๊ฐ„ + +--- + +*Version 1.0.0 | 2025-12-23* diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/typo_dictionary.json b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/typo_dictionary.json new file mode 100644 index 0000000..d59bc7c --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/typo_dictionary.json @@ -0,0 +1,126 @@ +{ + "metadata": { + "version": "1.0.0", + "updated": "2025-12-23", + "description": "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ YouTube ์ž๋ง‰ ์˜คํƒ€ ๊ต์ • ์‚ฌ์ „" + }, + + "brand_typos": { + "๋ฐ์ด๋ฏธ": "์ œ์ด๋ฏธ", + "์žฌ์ด๋ฏธ": "์ œ์ด๋ฏธ", + "์ œ์˜๋ฏธ": "์ œ์ด๋ฏธ", + "์ œ์ด์ด๋ฏธ": "์ œ์ด๋ฏธ", + "์„ฑ์•ก๊ณผ": "์„ฑํ˜•์™ธ๊ณผ", + "์„ฑํ˜•๊ณผ": "์„ฑํ˜•์™ธ๊ณผ", + "์„ฑํ˜„์™ธ๊ณผ": "์„ฑํ˜•์™ธ๊ณผ", + "์„ฑํ˜•์™ธ๊ฐ€": "์„ฑํ˜•์™ธ๊ณผ", + "์ œ์ด๋ฏธ์„ฑ๊ณผ": "์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ", + "์ œ์ด๋ฏธ ์„ฑ๊ณผ": "์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ", + "์ œ์ด๋ฏธ์„ฑํ˜•์™€๊ณผ": "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" + }, + + "procedure_typos": { + "eye_surgery": { + "์Œ๊ฑฐํ’€": "์Œ๊บผํ’€", + "์Œ๊ฑฐํ”Œ": "์Œ๊บผํ’€", + "์Œ์ปคํ’€": "์Œ๊บผํ’€", + "์Œ์ปคํ”Œ": "์Œ๊บผํ’€", + "์Œ๊บผํ”Œ": "์Œ๊บผํ’€", + "์Œ๊ฑฐ ํ’€": "์Œ๊บผํ’€", + "๋งค๋ฌผ๋ฒ•": "๋งค๋ชฐ๋ฒ•", + "๋งค๋ชฐ๋ฐฅ": "๋งค๋ชฐ๋ฒ•", + "๋ฉ”๋ชฐ๋ฒ•": "๋งค๋ชฐ๋ฒ•", + "๋งค๋ฌผ๋ฐฅ": "๋งค๋ชฐ๋ฒ•", + "๋ˆˆ๋ฉ”๊ต์ •": "๋ˆˆ๋งค๊ต์ •", + "๋ˆˆ๋งค ๊ต์ •": "๋ˆˆ๋งค๊ต์ •", + "์•ˆ๊ฒํ•˜์ˆ˜": "์•ˆ๊ฒ€ํ•˜์ˆ˜", + "์•ˆ๊ฒ€ ํ•˜์ˆ˜": "์•ˆ๊ฒ€ํ•˜์ˆ˜", + "๋ˆˆ๋ฐ‘ ์ง€๋ฐฉ": "๋ˆˆ๋ฐ‘์ง€๋ฐฉ", + "์ง€๋ฐฉ์žฌ๋ฐฐ์น˜": "์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜", + "๋“€์–ผํŠธ์ž„": "๋“€์–ผ ํŠธ์ž„", + "๋“€์–ผํŠธ ์ž„": "๋“€์–ผ ํŠธ์ž„", + "๋ˆˆ์„ญ๋ฐ‘": "๋ˆˆ์น๋ฐ‘", + "๋ˆˆ์น ๋ฐ‘": "๋ˆˆ์น๋ฐ‘" + }, + "forehead_surgery": { + "์ด๋งˆ ๊ฑฐ์ƒ": "์ด๋งˆ๊ฑฐ์ƒ", + "์ด๋งˆ๊ฑฐ์ƒ ์ˆ ": "์ด๋งˆ๊ฑฐ์ƒ์ˆ ", + "๋ˆˆ์„ญ๊ฑฐ์ƒ": "๋ˆˆ์น๊ฑฐ์ƒ", + "๋ˆˆ์น ๊ฑฐ์ƒ": "๋ˆˆ์น๊ฑฐ์ƒ", + "๋‚ด์‹œ๊ฒฝ์ด๋งˆ": "๋‚ด์‹œ๊ฒฝ ์ด๋งˆ", + "๋‚ด์‹œ๊ฒฝ๋ˆˆ์น": "๋‚ด์‹œ๊ฒฝ ๋ˆˆ์น" + }, + "anti_aging": { + "์Šค๋งˆ ์Šค": "์Šค๋งˆ์Šค", + "SMAS": "์Šค๋งˆ์Šค", + "smas": "์Šค๋งˆ์Šค", + "์•ž๊ด‘๋Œ€๋ฆฌํ”„ํŒ…": "์•ž๊ด‘๋Œ€ ๋ฆฌํ”„ํŒ…", + "์•ž ๊ด‘๋Œ€": "์•ž๊ด‘๋Œ€", + "ํ•˜์ดํ”„": "ํ•˜์ดํ‘ธ", + "ํ•˜์ด ํ‘ธ": "ํ•˜์ดํ‘ธ", + "์ง€๋ฐฉ์ด์‹": "์ง€๋ฐฉ ์ด์‹", + "์ž๊ฐ€์ง€๋ฐฉ": "์ž๊ฐ€ ์ง€๋ฐฉ", + "์‹ค๋ฆฌํ”„ํŒ…": "์‹ค ๋ฆฌํ”„ํŒ…" + }, + "others": { + "์˜๋ ์„ฑํ˜•": "์˜๋  ์„ฑํ˜•", + "ํ‰ํ„ฐ์„ฑํ˜•": "ํ‰ํ„ฐ ์„ฑํ˜•", + "์žฌ์ˆ˜์ˆ ": "์žฌ์ˆ˜์ˆ " + } + }, + + "medical_terms": { + "์š”๋ถ„์˜": "์—ฌ๋ถ„์˜", + "์ˆ˜๋ฉด ๋งˆ์ทจ": "์ˆ˜๋ฉด๋งˆ์ทจ", + "๊ตญ์†Œ ๋งˆ์ทจ": "๊ตญ์†Œ๋งˆ์ทจ", + "์ ˆ๊ณ„": "์ ˆ๊ฐœ", + "์ ˆ๊ฒŒ": "์ ˆ๊ฐœ", + "๋ด‰ํ—™": "๋ด‰ํ•ฉ", + "๋ด‰ ํ•ฉ": "๋ด‰ํ•ฉ", + "ํšŒ๋ณต๊ธฐ๊ฐ„": "ํšŒ๋ณต ๊ธฐ๊ฐ„", + "๋ถ€๊ธฐ": "๋ถ“๊ธฐ", + "๋ฉ์ด": "๋ฉ", + "ํ†ต์ฆ์ด": "ํ†ต์ฆ", + "๋งˆ์ทจ๊ฐ€": "๋งˆ์ทจ", + "์ˆ˜์ˆ ์ด": "์ˆ˜์ˆ ", + "์‹œ์ˆ ์ด": "์‹œ์ˆ " + }, + + "common_speech_recognition_errors": { + "์ • ๊ธฐํ˜ธ": "์ •๊ธฐํ˜ธ", + "์ •๊ธฐ ํ˜ธ": "์ •๊ธฐํ˜ธ", + "๊ธฐํ˜ธ ์›์žฅ": "์ •๊ธฐํ˜ธ ์›์žฅ", + "ํ•˜์ด๋ธŒ ๋ฆฌ๋“œ": "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ", + "ํ•˜์ด ๋ธŒ๋ฆฌ๋“œ": "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ", + "๋ฆฌํ”„ ํŒ…": "๋ฆฌํ”„ํŒ…", + "๋‚ด์‹œ ๊ฒฝ": "๋‚ด์‹œ๊ฒฝ" + }, + + "spacing_fixes": { + "์ œ์ด๋ฏธ ์„ฑํ˜•์™ธ๊ณผ": "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ", + "์ •๊ธฐํ˜ธ์›์žฅ": "์ •๊ธฐํ˜ธ ์›์žฅ", + "์ˆ˜์ˆ ํ›„": "์ˆ˜์ˆ  ํ›„", + "์ˆ˜์ˆ ์ „": "์ˆ˜์ˆ  ์ „", + "์‹œ์ˆ ํ›„": "์‹œ์ˆ  ํ›„", + "์‹œ์ˆ ์ „": "์‹œ์ˆ  ์ „" + }, + + "official_procedure_names": [ + "ํ€ต ๋งค๋ชฐ๋ฒ•", + "ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€", + "์•ˆ๊ฒ€ํ•˜์ˆ˜ ๋ˆˆ๋งค๊ต์ •์ˆ ", + "๋ˆˆ๋ฐ‘์ง€๋ฐฉ ์žฌ๋ฐฐ์น˜", + "๋“€์–ผ ํŠธ์ž„ ์ˆ˜์ˆ ", + "๋ˆˆ์น๋ฐ‘ ํ”ผ๋ถ€์ ˆ๊ฐœ์ˆ ", + "๋ˆˆ ์žฌ์ˆ˜์ˆ ", + "๋‚ด์‹œ๊ฒฝ ์ด๋งˆ ๊ฑฐ์ƒ์ˆ ", + "๋‚ด์‹œ๊ฒฝ ๋ˆˆ์น ๊ฑฐ์ƒ์ˆ ", + "์•ž๊ด‘๋Œ€ ๋ฆฌํ”„ํŒ…", + "์Šค๋งˆ์Šค ๋ฆฌํ”„ํŒ…", + "์ž๊ฐ€ ์ง€๋ฐฉ์ด์‹", + "์‹ค ๋ฆฌํ”„ํŒ…", + "ํ•˜์ดํ‘ธ ๋ฆฌํ”„ํŒ…", + "์˜๋  ์„ฑํ˜•", + "ํ‰ํ„ฐ ์„ฑํ˜•" + ] +} diff --git a/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/youtube_metadata.md b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/youtube_metadata.md new file mode 100644 index 0000000..b8064b1 --- /dev/null +++ b/custom-skills/44-jamie-youtube-subtitle-checker/desktop/references/youtube_metadata.md @@ -0,0 +1,172 @@ +# YouTube ์˜์ƒ ์ •๋ณด ํ…œํ”Œ๋ฆฟ + +> ์ด ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ YouTube ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ์ถ”์ฒœ ์ œ๋ชฉ + +### ์ œ๋ชฉ ๊ณต์‹ +``` +[์‹œ์ˆ ๋ช…] | [ํ•ต์‹ฌ ๋ฒ ๋„คํ•/ํ‚ค์›Œ๋“œ] | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ +``` + +### ์ œ๋ชฉ ์˜ˆ์‹œ +- `ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์Œ๊บผํ’€ | ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ˆˆ๋งค์˜ ๋น„๊ฒฐ | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` +- `๋‚ด์‹œ๊ฒฝ ์ด๋งˆ๊ฑฐ์ƒ์ˆ  | ๋™์•ˆ ํšจ๊ณผ์˜ ์›๋ฆฌ | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` +- `ํ€ต ๋งค๋ชฐ๋ฒ• | ํ‹ฐ ์•ˆ ๋‚˜๋Š” ์Œ๊บผํ’€ | ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` + +### ์ œ๋ชฉ ์ž‘์„ฑ ๊ทœ์น™ +- 60์ž ์ด๋‚ด (ํ•œ๊ธ€ ๊ธฐ์ค€ 30์ž ๋‚ด์™ธ) +- ์‹œ์ˆ ๋ช…์„ ์•ž๋ถ€๋ถ„์— ๋ฐฐ์น˜ +- ๋ธŒ๋žœ๋“œ๋ช… "์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ" ํฌํ•จ +- ๊ณผ์žฅ ํ‘œํ˜„ ๊ธˆ์ง€ + +--- + +## ์ฑ•ํ„ฐ (Chapters) + +### ๊ธฐ๋ณธ ํ˜•์‹ +``` +0:00 ์ธํŠธ๋กœ +0:XX [์„น์…˜1] +0:XX [์„น์…˜2] +0:XX [์„น์…˜3] +0:XX ๋งˆ๋ฌด๋ฆฌ +``` + +### ์ž‘์„ฑ ๊ทœ์น™ +- ๋ฐ˜๋“œ์‹œ 0:00์œผ๋กœ ์‹œ์ž‘ +- ์ตœ์†Œ 3๊ฐœ ์ฑ•ํ„ฐ ๊ถŒ์žฅ +- ์‹œ๊ฐ„ ํ˜•์‹: M:SS (์˜ˆ: 1:23) +- ์ฑ•ํ„ฐ๋ช…์€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ (10์ž ์ด๋‚ด) + +--- + +## ์˜์ƒ ์„ค๋ช… (Description) + +### ํ…œํ”Œ๋ฆฟ + +``` +[์‹œ์ˆ ๋ช…]์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. +์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ ์ •๊ธฐํ˜ธ ์›์žฅ์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. + +โฑ๏ธ ํƒ€์ž„์Šคํƒฌํ”„ +{์ฑ•ํ„ฐ_๋ชฉ๋ก} + +๐Ÿ“‹ ์˜์ƒ ๋‚ด์šฉ +{์˜์ƒ_์š”์•ฝ_2-3๋ฌธ์žฅ} + +๐Ÿฅ ์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ +๐Ÿ“ ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์••๊ตฌ์ •๋กœ 136 EHL๋นŒ๋”ฉ 3์ธต +๐Ÿ“ž 02-542-2399 +๐ŸŒ https://jamie.clinic +๐Ÿ’ฌ ์นด์นด์˜คํ†ก: @์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ + +{ํ•ด์‹œํƒœ๊ทธ} + +--- +โ€ป ๋ณธ ์˜์ƒ์€ ์ •๋ณด ์ œ๊ณต ๋ชฉ์ ์ด๋ฉฐ, ๊ฐœ์ธ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ˆ˜์ˆ  ์ „ ๋ฐ˜๋“œ์‹œ ์ „๋ฌธ์˜์™€ ์ƒ๋‹ดํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. +``` + +--- + +## ํ•ด์‹œํƒœ๊ทธ (Hashtags) + +### ํ•„์ˆ˜ ํƒœ๊ทธ +- `#์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ` +- `#์••๊ตฌ์ •์„ฑํ˜•์™ธ๊ณผ` + +### ์‹œ์ˆ ๋ณ„ ํƒœ๊ทธ + +| ์‹œ์ˆ  ์นดํ…Œ๊ณ ๋ฆฌ | ๊ถŒ์žฅ ํ•ด์‹œํƒœ๊ทธ | +|--------------|--------------| +| ๋ˆˆ ์„ฑํ˜• | `#์Œ๊บผํ’€` `#๋ˆˆ์„ฑํ˜•` `#๋ˆˆ๋งค๊ต์ •` `#๋งค๋ชฐ๋ฒ•` | +| ์ด๋งˆ ์„ฑํ˜• | `#์ด๋งˆ๊ฑฐ์ƒ์ˆ ` `#์ด๋งˆ์„ฑํ˜•` `#๋ˆˆ์น๊ฑฐ์ƒ` `#๋‚ด์‹œ๊ฒฝ์ˆ˜์ˆ ` | +| ๋™์•ˆ ์„ฑํ˜• | `#๋™์•ˆ์„ฑํ˜•` `#๋ฆฌํ”„ํŒ…` `#์•ˆํ‹ฐ์—์ด์ง•` `#์Šค๋งˆ์Šค๋ฆฌํ”„ํŒ…` | +| ์ง€๋ฐฉ์ด์‹ | `#์ง€๋ฐฉ์ด์‹` `#์ž๊ฐ€์ง€๋ฐฉ` `#๋ณผ๋ฅจ์„ฑํ˜•` | + +### ํ•ด์‹œํƒœ๊ทธ ๊ทœ์น™ +- 3-5๊ฐœ ๊ถŒ์žฅ (์ตœ๋Œ€ 15๊ฐœ) +- ์‹œ์ˆ  ๊ด€๋ จ ํƒœ๊ทธ ์šฐ์„  +- ์ง€์—ญ ํƒœ๊ทธ ํฌํ•จ (`#์••๊ตฌ์ •`, `#๊ฐ•๋‚จ์„ฑํ˜•์™ธ๊ณผ`) + +--- + +## ํƒœ๊ทธ (Tags) - YouTube Studio์šฉ + +### ๋ธŒ๋žœ๋“œ ํƒœ๊ทธ +``` +์ œ์ด๋ฏธ์„ฑํ˜•์™ธ๊ณผ, Jamie Plastic Surgery, ์••๊ตฌ์ •์„ฑํ˜•์™ธ๊ณผ, ๊ฐ•๋‚จ์„ฑํ˜•์™ธ๊ณผ +``` + +### ์‹œ์ˆ  ํƒœ๊ทธ (์˜ˆ์‹œ: ๋ˆˆ ์„ฑํ˜•) +``` +์Œ๊บผํ’€, ์Œ๊บผํ’€์ˆ˜์ˆ , ๋ˆˆ์„ฑํ˜•, ๋ˆˆ๋งค๊ต์ •, ๋งค๋ชฐ๋ฒ•, ์ ˆ๊ฐœ๋ฒ•, +ํ•˜์ด๋ธŒ๋ฆฌ๋“œ์Œ๊บผํ’€, ์•ˆ๊ฒ€ํ•˜์ˆ˜, ๋ˆˆ๋ฐ‘์ง€๋ฐฉ, ๋ˆˆ์žฌ์ˆ˜์ˆ  +``` + +### ์ผ๋ฐ˜ ํƒœ๊ทธ +``` +์„ฑํ˜•์™ธ๊ณผ, ์„ฑํ˜•์ˆ˜์ˆ , ๋ฏธ์šฉ์„ฑํ˜•, ์ •๊ธฐํ˜ธ์›์žฅ, ์„ฑํ˜•์ •๋ณด +``` + +--- + +## ์ธ๋„ค์ผ ๊ฐ€์ด๋“œ + +### ํ•„์ˆ˜ ์š”์†Œ +- ์ •๊ธฐํ˜ธ ์›์žฅ ์–ผ๊ตด ๋˜๋Š” ์‹œ์ˆ  ๊ด€๋ จ ์ด๋ฏธ์ง€ +- ์‹œ์ˆ ๋ช… ํ…์ŠคํŠธ (ํฐ ๊ธ€์”จ) +- ๋ธŒ๋žœ๋“œ ๋กœ๊ณ  (์šฐ์ธก ํ•˜๋‹จ) + +### ์ƒ‰์ƒ +- ๋ฐฐ๊ฒฝ: ๋ฐ์€ ํ†ค ๋˜๋Š” ๋ธŒ๋žœ๋“œ ๊ทธ๋ฆฐ (#79A233) +- ํ…์ŠคํŠธ: ๊ณ ๋Œ€๋น„ (๊ฒ€์ • ๋˜๋Š” ํฐ์ƒ‰) + +### ํ…์ŠคํŠธ ์˜ˆ์‹œ +``` +ํ•˜์ด๋ธŒ๋ฆฌ๋“œ +์Œ๊บผํ’€ +``` + +--- + +## ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ ๋ฆฌํฌํŠธ + +### ํ˜•์‹ +```markdown +## ์˜คํƒ€ ์ˆ˜์ • ๋‚ด์—ญ + +**์ด ์ˆ˜์ • ๊ฑด์ˆ˜**: X๊ฑด + +| # | ์œ„์น˜ (์‹œ๊ฐ„) | ์›๋ณธ | ์ˆ˜์ • | +|---|------------|------|------| +| 1 | 0:05 | ์„ฑ์•ก๊ณผ | ์„ฑํ˜•์™ธ๊ณผ | +| 2 | 0:12 | ์Œ๊ฑฐํ’€ | ์Œ๊บผํ’€ | +| 3 | 0:28 | ๋งค๋ฌผ๋ฒ• | ๋งค๋ชฐ๋ฒ• | +``` + +### ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ง‘๊ณ„ +```markdown +### ์ˆ˜์ • ์œ ํ˜•๋ณ„ ์ง‘๊ณ„ +- ๋ธŒ๋žœ๋“œ๋ช… ์˜คํƒ€: X๊ฑด +- ์‹œ์ˆ ๋ช… ์˜คํƒ€: X๊ฑด +- ์˜ํ•™ ์šฉ์–ด ์˜คํƒ€: X๊ฑด +- ๋„์–ด์“ฐ๊ธฐ: X๊ฑด +``` + +--- + +## ์ถœ๋ ฅ ํŒŒ์ผ ๊ตฌ์กฐ + +``` +outputs/ +โ”œโ”€โ”€ {์˜์ƒ๋ช…}_corrected.sbv # ๊ต์ •๋œ ์ž๋ง‰ +โ””โ”€โ”€ youtube_video_info.md # ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒจํ‚ค์ง€ +``` + +--- + +*Version 1.0.0 | 2025-12-23*