Skip to content

Commit 6de0da4

Browse files
committed
feat(markup): support for platform tv.naver.com
1 parent c9d5c84 commit 6de0da4

File tree

5 files changed

+122
-27
lines changed

5 files changed

+122
-27
lines changed

src/clipper/clipper_types.py

+1
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,5 @@ class KnownPlatform(enum.Enum):
5151
youtube = "youtube"
5252
vlive = "vlive"
5353
naver_now_watch = "naver_now_watch"
54+
naver_tv = "naver_tv"
5455
weverse = "weverse"

src/clipper/ytc_settings.py

+2
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ def getVideoURL(settings: Settings, platform: str, videoID: str) -> str:
431431
return f"https://now.naver.com/watch/{videoID}"
432432
if platform == KnownPlatform.weverse.name:
433433
return settings["videoUrl"]
434+
if platform == KnownPlatform.naver_tv.name:
435+
return f"https://tv.naver.com/v/{videoID}"
434436

435437
logger.fatal(f"Unknown platform: {platform}")
436438
sys.exit(1)

src/markup/platforms/css/naver_tv.css

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#shortcutsTableToggleButton {
2+
width: 40px;
3+
display: inline-block;
4+
background-color: transparent;
5+
border: transparent;
6+
top: -3px;
7+
}
8+
9+
#markers-div {
10+
height: 11px;
11+
}
12+
13+
#markers-svg,
14+
#selected-marker-pair-overlay,
15+
#start-marker-numberings,
16+
#end-marker-numberings {
17+
font-size: 6.5pt;
18+
width: 100%;
19+
height: 300%;
20+
top: 2px;
21+
position: absolute;
22+
z-index: 99;
23+
paint-order: stroke;
24+
stroke: rgba(0, 0, 0, 0.25);
25+
stroke-width: 2px;
26+
}
27+
28+
#start-marker-numberings {
29+
top: -13px;
30+
height: 13px;
31+
}
32+
33+
#end-marker-numberings {
34+
top: 13px;
35+
height: 13px;
36+
}

src/markup/platforms/platforms.ts

+35-13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export enum VideoPlatforms {
55
vlive = 'vlive',
66
weverse = 'weverse',
77
naver_now_watch = 'naver_now_watch',
8+
naver_tv = 'naver_tv',
89
}
910
type VideoPlatform<T extends string | HTMLElement> = {
1011
// Contains the video element, progress bars, and controls.
@@ -43,19 +44,6 @@ type VideoPlatformSelectors = VideoPlatform<string>;
4344

4445
export type VideoPlatformHooks = VideoPlatform<HTMLElement>;
4546

46-
export function getVideoPlatformSelectors(platform: VideoPlatforms): VideoPlatformSelectors {
47-
if (platform === VideoPlatforms.youtube) {
48-
return youtubeSelectors;
49-
} else if (platform === VideoPlatforms.vlive) {
50-
return vliveSelectors;
51-
} else if (platform === VideoPlatforms.naver_now_watch) {
52-
return naver_now_watchSelectors;
53-
} else if (platform === VideoPlatforms.weverse) {
54-
return weverseSelectors;
55-
}
56-
return null;
57-
}
58-
5947
export function getVideoPlatformHooks(selectors: VideoPlatformSelectors): VideoPlatformHooks {
6048
return querySelectors(selectors);
6149
}
@@ -70,6 +58,8 @@ export function getPlatform() {
7058
return VideoPlatforms.naver_now_watch;
7159
} else if (host.includes('weverse')) {
7260
return VideoPlatforms.weverse;
61+
} else if (host.includes('tv.naver')) {
62+
return VideoPlatforms.naver_tv;
7363
} else {
7464
return VideoPlatforms.youtube;
7565
}
@@ -147,6 +137,30 @@ const naver_now_watchSelectors = {
147137
shortcutsTableButton: '.pzp-pc__bottom-buttons-right',
148138
};
149139

140+
const naver_tvSelectors = {
141+
playerContainer: 'div[class=webplayer-internal-source-shadow]',
142+
player: 'div[class=webplayer-internal-source-wrapper]',
143+
playerClickZone: '.webplayer-internal-source-wrapper',
144+
videoContainer: 'div[class=webplayer-internal-source-wrapper]',
145+
video: 'video',
146+
progressBar: '.pzp-pc__progress-slider',
147+
markersDiv: '.pzp-ui-slider__wrap',
148+
markerNumberingsDiv: '.pzp-ui-slider__wrap',
149+
theaterModeIndicator: 'placeholder',
150+
settingsEditor: 'div[class*=ArticleSection_article_section]',
151+
settingsEditorTheater: 'div[class*=ArticleSection_article_section]',
152+
shortcutsTable: 'div[class*=ArticleSection_article_section]',
153+
frameCapturerProgressBar: 'div[class*=ArticleSection_article_section]',
154+
flashMessage: 'div[class*=ArticleSection_article_section]',
155+
cropOverlay: '.webplayer-internal-source-wrapper',
156+
cropMouseManipulation: '.webplayer-internal-source-wrapper',
157+
speedChartContainer: '.webplayer-internal-video',
158+
cropChartContainer: 'div[class*=ArticleSection_article_section]',
159+
controls: '.pzp-pc__bottom',
160+
controlsGradient: '.pzp-pc__bottom-shadow',
161+
shortcutsTableButton: '.pzp-pc__bottom-buttons-right',
162+
};
163+
150164
const weverseSelectors = {
151165
playerContainer: 'div[class=webplayer-internal-source-shadow]',
152166
player: 'div[class=webplayer-internal-source-wrapper]',
@@ -170,3 +184,11 @@ const weverseSelectors = {
170184
controlsGradient: '.pzp-pc__bottom-buttons',
171185
shortcutsTableButton: '.pzp-pc__bottom-buttons-right',
172186
};
187+
188+
export const videoPlatformSelectors: Record<VideoPlatforms, VideoPlatformSelectors> = {
189+
[VideoPlatforms.youtube]: youtubeSelectors,
190+
[VideoPlatforms.weverse]: weverseSelectors,
191+
[VideoPlatforms.vlive]: vliveSelectors,
192+
[VideoPlatforms.naver_now_watch]: naver_now_watchSelectors,
193+
[VideoPlatforms.naver_tv]: naver_tvSelectors,
194+
};

src/markup/yt_clipper.ts

+48-14
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
// @match http*://*.vlive.tv/video/*
2727
// @match http*://*.vlive.tv/post/*
2828
// @match http*://*.now.naver.com/*
29-
// @match http*://*.weverse.io/*
29+
// @match http*://weverse.io/*
30+
// @match https*://tv.naver.com/*
3031
// @noframes
3132
// dummy grant to enable sandboxing
3233
// @grant GM_getValue
@@ -113,7 +114,7 @@ import {
113114
import {
114115
getPlatform,
115116
getVideoPlatformHooks,
116-
getVideoPlatformSelectors,
117+
videoPlatformSelectors,
117118
VideoPlatformHooks,
118119
VideoPlatforms,
119120
} from './platforms/platforms';
@@ -122,6 +123,7 @@ import { disableCommonBlockers, enableCommonBlockers } from './platforms/blocker
122123
const ytClipperCSS = readFileSync(__dirname + '/ui/css/yt-clipper.css', 'utf8');
123124
const vliveCSS = readFileSync(__dirname + '/platforms/css/vlive.css', 'utf8');
124125
const naver_now_watchCSS = readFileSync(__dirname + '/platforms/css/naver_now_watch.css', 'utf8');
126+
const naver_tvCSS = readFileSync(__dirname + '/platforms/css/naver_tv.css', 'utf8');
125127
const weverseCSS = readFileSync(__dirname + '/platforms/css/weverse.css', 'utf8');
126128
const shortcutsTable = readFileSync(__dirname + '/ui/shortcuts-table/shortcuts-table.html', 'utf8');
127129
const shortcutsTableStyle = readFileSync(
@@ -370,6 +372,7 @@ async function loadytClipper() {
370372
if (platform === VideoPlatforms.vlive) injectCSS(vliveCSS, 'vlive-css');
371373
if (platform === VideoPlatforms.naver_now_watch) injectCSS(naver_now_watchCSS, 'naver-now-css');
372374
if (platform === VideoPlatforms.weverse) injectCSS(weverseCSS, 'weverse-css');
375+
if (platform === VideoPlatforms.naver_tv) injectCSS(naver_tvCSS, 'naver-tv-css');
373376
initHooks();
374377
initVideoInfo();
375378
initObservers();
@@ -516,7 +519,7 @@ async function loadytClipper() {
516519
document.body.addEventListener('wheel', inheritCropPointCrop, { passive: false });
517520
}
518521

519-
const selectors = getVideoPlatformSelectors(platform);
522+
const selectors = videoPlatformSelectors[platform];
520523

521524
player = await retryUntilTruthyResult(() => document.querySelector(selectors.player));
522525
video = await retryUntilTruthyResult(() => player.querySelector(selectors.video));
@@ -558,7 +561,6 @@ async function loadytClipper() {
558561
videoInfo.title = playerData.title;
559562
videoInfo.fps = getFPS();
560563
video.seekTo = (time) => player.seekTo(time);
561-
562564
} else if (platform === VideoPlatforms.vlive) {
563565
const location = window.location;
564566

@@ -574,16 +576,24 @@ async function loadytClipper() {
574576

575577
videoInfo.fps = getFPS();
576578
video.seekTo = (time) => (video.currentTime = time);
577-
578579
} else if (platform === VideoPlatforms.naver_now_watch) {
579580
videoInfo.id = location.pathname.split('/')[2];
580-
videoInfo.title = document.querySelector('h2[class*=ArticleSection_article_title]')?.textContent
581+
videoInfo.title = document.querySelector(
582+
'h2[class*=ArticleSection_article_title]'
583+
)?.textContent;
584+
videoInfo.fps = getFPS();
585+
video.seekTo = (time) => (video.currentTime = time);
586+
} else if (platform === VideoPlatforms.naver_tv) {
587+
videoInfo.id = location.pathname.split('/')[2];
588+
videoInfo.title = document.querySelector(
589+
'h2[class*=ArticleSection_article_title]'
590+
)?.textContent;
581591
videoInfo.fps = getFPS();
582592
video.seekTo = (time) => (video.currentTime = time);
583593
} else if (platform === VideoPlatforms.weverse) {
584-
videoInfo.title = document.querySelector('h2[class*=TitleView_title]')?.textContent
594+
videoInfo.title = document.querySelector('h2[class*=TitleView_title]')?.textContent;
585595

586-
if (location.pathname.includes('media') || (location.pathname.includes('live'))) {
596+
if (location.pathname.includes('media') || location.pathname.includes('live')) {
587597
if (videoInfo.id == null) videoInfo.id = location.pathname.split('/')[3];
588598
}
589599
videoInfo.fps = getFPS();
@@ -596,7 +606,6 @@ async function loadytClipper() {
596606
}
597607
}
598608

599-
600609
function initObservers() {
601610
new ResizeObserver(resizeCropOverlay).observe(hooks.videoContainer);
602611
}
@@ -826,7 +835,7 @@ async function loadytClipper() {
826835
<svg id="start-marker-numberings"></svg>
827836
<svg id="end-marker-numberings"></svg>
828837
`;
829-
hooks.markersDiv.appendChild(markersDiv);
838+
830839
markersSvg = markersDiv.children[0] as SVGSVGElement;
831840
selectedMarkerPairOverlay = markersDiv.children[1] as SVGSVGElement;
832841

@@ -836,9 +845,21 @@ async function loadytClipper() {
836845
<svg id="start-marker-numberings"></svg>
837846
<svg id="end-marker-numberings"></svg>
838847
`;
839-
hooks.markerNumberingsDiv.appendChild(markerNumberingsDiv);
840848
startMarkerNumberings = markerNumberingsDiv.children[0] as SVGSVGElement;
841849
endMarkerNumberings = markerNumberingsDiv.children[1] as SVGSVGElement;
850+
851+
if (
852+
[VideoPlatforms.weverse, VideoPlatforms.naver_now_watch, VideoPlatforms.naver_tv].includes(
853+
platform
854+
)
855+
) {
856+
hooks.markersDiv.prepend(markersDiv);
857+
hooks.markerNumberingsDiv.prepend(markerNumberingsDiv);
858+
} else {
859+
hooks.markersDiv.appendChild(markersDiv);
860+
hooks.markerNumberingsDiv.appendChild(markerNumberingsDiv);
861+
}
862+
842863
videoInfo.fps = getFPS();
843864
}
844865

@@ -3433,7 +3454,20 @@ async function loadytClipper() {
34333454
function injectToggleShortcutsTableButton() {
34343455
shortcutsTableToggleButton = htmlToElement(shortcutsTableToggleButtonHTML) as HTMLButtonElement;
34353456
shortcutsTableToggleButton.onclick = toggleShortcutsTable;
3436-
if (platform === VideoPlatforms.naver_now_watch) shortcutsTableToggleButton.classList.add('pzp-pc__subtitle-button');
3457+
3458+
if (
3459+
[VideoPlatforms.weverse, VideoPlatforms.naver_now_watch, VideoPlatforms.naver_tv].includes(
3460+
platform
3461+
)
3462+
) {
3463+
shortcutsTableToggleButton.classList.add(
3464+
'pzp-button',
3465+
'pzp-subtitle-button',
3466+
'pzp-pc-subtitle-button',
3467+
'pzp-pc__subtitle-button'
3468+
);
3469+
}
3470+
34373471
hooks.shortcutsTableButton.insertAdjacentElement('afterbegin', shortcutsTableToggleButton);
34383472
}
34393473

@@ -3902,10 +3936,10 @@ async function loadytClipper() {
39023936
isCropOverlayVisible = false;
39033937
}
39043938

3905-
39063939
function hidePlayerControls() {
39073940
hooks.controls.originalDisplay = hooks.controls.originalDisplay ?? hooks.controls.style.display;
3908-
hooks.controlsGradient.originalDisplay = hooks.controlsGradient.originalDisplay ?? hooks.controlsGradient.style.display;
3941+
hooks.controlsGradient.originalDisplay =
3942+
hooks.controlsGradient.originalDisplay ?? hooks.controlsGradient.style.display;
39093943

39103944
hooks.controls.style.display = 'none';
39113945
hooks.controlsGradient.style.display = 'none';

0 commit comments

Comments
 (0)