# ๐Ÿ“น Video URL Analyzer ๋น„๋””์˜ค URL์˜ ์žฌ์ƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋ถ„์„ํ•˜๋Š” Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. [![Java](https://img.shields.io/badge/Java-17-orange.svg)](https://www.oracle.com/java/) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) ## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ - โœ… **๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ์ง€์›**: ๋„ค์ด๋ฒ„TV, ์นด์นด์˜คTV, YouTube, Vimeo, TikTok, Twitter, ์›จ์ด๋ณด ๋“ฑ - โœ… **๊ฒฐ๊ณผ**: URL ํ™•์ธ ๊ฒฐ๊ณผ ## ๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ### ์„ค์น˜ #### Gradle ```gradle dependencies { implementation 'com.caliverse.analyzer:video-url-analyzer:1.0.0' } ``` #### Maven ```xml com.caliverse.analyzer video-url-analyzer 1.0.0 ``` #### JAR ํŒŒ์ผ ์ง์ ‘ ์‚ฌ์šฉ ```bash ./gradlew clean build # build/libs/video-url-analyzer-1.0.0.jar ์ƒ์„ฑ๋จ ``` ### ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• ```java import com.caliverse.analyzer.VideoAnalyzer; import com.caliverse.analyzer.model.VideoAnalysisResult; // 1. VideoAnalyzer ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ VideoAnalyzer analyzer = new VideoAnalyzer(); // 2. URL ๋ถ„์„ VideoAnalysisResult result = analyzer.analyzeUrl("https://tv.naver.com/v/84373511"); // 3. ๊ฒฐ๊ณผ ํ™•์ธ if (result.isSuccess()) { System.out.println("โœ… ์žฌ์ƒ ๊ฐ€๋Šฅ: " + result.getReason()); } else { System.out.println("โŒ ์žฌ์ƒ ๋ถˆ๊ฐ€: " + result.getReason()); } ``` ## ๐Ÿ“– ์ƒ์„ธ ์‚ฌ์šฉ ์˜ˆ์ œ ### 1. ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ URL ๋ถ„์„ ```java VideoAnalyzer analyzer = new VideoAnalyzer(); // ๋„ค์ด๋ฒ„TV (VOD, Clip, Live) VideoAnalysisResult result1 = analyzer.analyzeUrl("https://tv.naver.com/v/84373511"); VideoAnalysisResult result2 = analyzer.analyzeUrl("https://tv.naver.com/h/87349660"); // ์นด์นด์˜คTV VideoAnalysisResult result3 = analyzer.analyzeUrl("https://tv.kakao.com/channel/10210483/cliplink/459147379"); // YouTube VideoAnalysisResult result4 = analyzer.analyzeUrl("https://www.youtube.com/watch?v=4dpreJ9wUs8"); // ์›จ์ด๋ณด VideoAnalysisResult result5 = analyzer.analyzeUrl("https://weibo.com/tv/show/1034:4872947210436638"); ``` ### 2. ์ผ๋ฐ˜ ๋น„๋””์˜ค URL ๋ถ„์„ ```java VideoAnalysisResult result = analyzer.analyzeUrl("https://example.com/video.mp4"); if (!result.isSuccess()) { // ์‹คํŒจ ์ด์œ  ์ƒ์„ธ ํ™•์ธ System.out.println(result.getReason()); /* ์ถœ๋ ฅ ์˜ˆ์‹œ: * ์žฌ์ƒ ๋ถˆ๊ฐ€ ์‚ฌ์œ : * - ๋ณดํ˜ธ๋œ URL: DRM ๋ณดํ˜ธ ํ‚ค์›Œ๋“œ ๊ฐ์ง€: widevine * - 3D ๋น„๋””์˜ค: 3D ๋น„๋””์˜ค ํ—ค๋” ๊ฐ์ง€ */ } ``` ### 3. ์ง€์› ํ”Œ๋žซํผ ํ™•์ธ ```java VideoAnalyzer analyzer = new VideoAnalyzer(); String[] platforms = analyzer.getSupportedPlatforms(); System.out.println("์ง€์› ํ”Œ๋žซํผ: " + String.join(", ", platforms)); // ์ถœ๋ ฅ: ์ง€์› ํ”Œ๋žซํผ: ๋„ค์ด๋ฒ„TV, ์นด์นด์˜คTV, YouTube, Vimeo, TikTok, Twitter, ์›จ์ด๋ณด, DirectURL ``` ## ๐Ÿ” ๋ถ„์„ ๊ธฐ์ค€ ### โœ… ์žฌ์ƒ ๊ฐ€๋Šฅ ์กฐ๊ฑด (๋ชจ๋‘ ์ถฉ์กฑ ์‹œ) 1. **๋ณดํ˜ธ๋˜์ง€ ์•Š์Œ**: DRM, ์„œ๋ช… ์—†์Œ 2. **AVPlayer ์ง€์›**: mp4, m3u8, mov ๋“ฑ ์ง€์› ํฌ๋งท ### โŒ ์žฌ์ƒ ๋ถˆ๊ฐ€ ์กฐ๊ฑด (ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น ์‹œ) - DRM์œผ๋กœ ๋ณดํ˜ธ๋œ URL - ์„œ๋ช…๋œ URL (ํ† ํฐ/ํ‚ค ํ•„์š”) - ์ง€์›๋˜์ง€ ์•Š๋Š” ๋น„๋””์˜ค ํฌ๋งท ## ๐Ÿ“Š ์ง€์› ํ”Œ๋žซํผ | ํ”Œ๋žซํผ | ์ง€์› ์—ฌ๋ถ€ | ๋ถ„์„ ๋ฐฉ์‹ | ๋น„๊ณ  | |--------|--------|----------|------| | ๋„ค์ด๋ฒ„TV | โœ… | VOD, Clip, Live ์ง€์› | | ์นด์นด์˜คTV | โœ… | ํด๋ฆฝ ๋ฐ ์ฑ„๋„ ์ง€์› | | YouTube | โœ… | ์ผ๋ฐ˜ ๋™์˜์ƒ ๋ฐ Shorts | | TikTok | โœ… | ๋™์˜์ƒ ๊ณต์œ  ๋งํฌ | | ์›จ์ด๋ณด | โœ… | TV Show | | ์ผ๋ฐ˜ URL | โœ… | mp4, m3u8, mov ๋“ฑ | ## ๐Ÿ› ๏ธ API ๋ฌธ์„œ ### VideoAnalyzer ๋ฉ”์ธ ํด๋ž˜์Šค๋กœ ๋น„๋””์˜ค URL ๋ถ„์„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. #### ๋ฉ”์†Œ๋“œ ```java /** * URL์„ ๋ถ„์„ํ•˜์—ฌ ์žฌ์ƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. * * @param url ๋ถ„์„ํ•  ๋น„๋””์˜ค URL * @return VideoAnalysisResult ๋ถ„์„ ๊ฒฐ๊ณผ */ public VideoAnalysisResult analyzeUrl(String url) /** * ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * * @return String[] ํ”Œ๋žซํผ ์ด๋ฆ„ ๋ฐฐ์—ด */ public String[] getSupportedPlatforms() ``` ### VideoAnalysisResult ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. #### ๋ฉ”์†Œ๋“œ ```java /** * ์ „์ฒด ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์„ฑ๊ณต์ธ์ง€ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * * @return boolean ์žฌ์ƒ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ */ public boolean isSuccess() /** * ๋ถ„์„ ๊ฒฐ๊ณผ์˜ ์ด์œ ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * ์„ฑ๊ณต ์‹œ "๋ชจ๋“  ๊ฒ€์‚ฌ ํ†ต๊ณผ", ์‹คํŒจ ์‹œ ์ƒ์„ธ ์ด์œ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. * * @return String ๊ฒฐ๊ณผ ์ด์œ  */ public String getReason() ``` ## ๐Ÿ“‹ ์š”๊ตฌ์‚ฌํ•ญ - **Java**: 17 ์ด์ƒ - **Gradle**: 7.0 ์ด์ƒ (๋นŒ๋“œ ์‹œ) ## ๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ๊ฐœ์„ ์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? [CONTRIBUTING.md](CONTRIBUTING.md)์—์„œ ๊ธฐ์—ฌ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”! ## ๐Ÿ“ ๋ฒ„์ „ ํžˆ์Šคํ† ๋ฆฌ ### v1.0.0 (2025-01-XX) - โœจ ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์ฆˆ - โœ… ํ”Œ๋žซํผ ์ง€์› (๋„ค์ด๋ฒ„TV, ์นด์นด์˜คTV, YouTube, TikTok, ์›จ์ด๋ณด, DirectURL) - โœ… DRM/๋ณดํ˜ธ URL ๊ฐ์ง€ - โœ… AVPlayer ํ˜ธํ™˜์„ฑ ์ฒดํฌ