From 7227e70383af784921b06335e43e06269ba071c8 Mon Sep 17 00:00:00 2001 From: birdhead Date: Wed, 22 Oct 2025 00:22:33 +0000 Subject: [PATCH] Fix git merge error --- +layout.svelte | 84 +++ package-lock.json | 22 - package.json | 4 - src/hooks.server.ts | 14 +- src/routes/+layout.svelte | 16 +- src/routes/+page.svelte | 734 ---------------------- src/routes/api/process-video/+server.ts | 9 +- src/routes/api/upload-cut/+server.ts | 41 -- src/routes/api/upload-original/+server.ts | 7 +- src/routes/api/video-preview/+server.ts | 30 - src/routes/video-cut/+page.svelte | 526 +--------------- tsconfig.json | 72 ++- 12 files changed, 155 insertions(+), 1404 deletions(-) create mode 100755 +layout.svelte delete mode 100755 src/routes/+page.svelte diff --git a/+layout.svelte b/+layout.svelte new file mode 100755 index 0000000..aa38911 --- /dev/null +++ b/+layout.svelte @@ -0,0 +1,84 @@ + + +
+
+
+

BigData Server

+ + {#if data.user} + + {/if} +
+ +
+ {#if data.user} + [{data.user.role}] + {data.user.name} + + {:else} + 로그인 + {/if} +
+
+ +
+ +
+
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b3dfae6..85a2398 100755 --- a/package-lock.json +++ b/package-lock.json @@ -11,15 +11,11 @@ "@ffmpeg/core": "^0.12.10", "@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/util": "^0.12.2", -<<<<<<< HEAD - "canvas": "^3.2.0", -======= "bcrypt": "^6.0.0", "canvas": "^3.2.0", "jsonwebtoken": "^9.0.2", "mime": "^4.1.0", "mime-types": "^3.0.1", ->>>>>>> 0bab142 (add login/logout) "pg": "^8.16.3" }, "devDependencies": { @@ -2447,8 +2443,6 @@ ], "license": "MIT" }, -<<<<<<< HEAD -======= "node_modules/bcrypt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", @@ -2472,7 +2466,6 @@ "node": "^18 || ^20 || >= 21" } }, ->>>>>>> 0bab142 (add login/logout) "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2532,15 +2525,12 @@ "ieee754": "^1.1.13" } }, -<<<<<<< HEAD -======= "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, ->>>>>>> 0bab142 (add login/logout) "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -2829,8 +2819,6 @@ "dev": true, "license": "MIT" }, -<<<<<<< HEAD -======= "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -2840,7 +2828,6 @@ "safe-buffer": "^5.0.1" } }, ->>>>>>> 0bab142 (add login/logout) "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -3969,8 +3956,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, -<<<<<<< HEAD -======= "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -4007,7 +3992,6 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, ->>>>>>> 0bab142 (add login/logout) "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4085,8 +4069,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, -<<<<<<< HEAD -======= "node_modules/mime": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", @@ -4123,7 +4105,6 @@ "node": ">= 0.6" } }, ->>>>>>> 0bab142 (add login/logout) "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -4273,8 +4254,6 @@ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, -<<<<<<< HEAD -======= "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -4286,7 +4265,6 @@ "node-gyp-build-test": "build-test.js" } }, ->>>>>>> 0bab142 (add login/logout) "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/package.json b/package.json index 6255909..ed2c38f 100755 --- a/package.json +++ b/package.json @@ -51,15 +51,11 @@ "@ffmpeg/core": "^0.12.10", "@ffmpeg/ffmpeg": "^0.12.15", "@ffmpeg/util": "^0.12.2", -<<<<<<< HEAD - "canvas": "^3.2.0", -======= "bcrypt": "^6.0.0", "canvas": "^3.2.0", "jsonwebtoken": "^9.0.2", "mime": "^4.1.0", "mime-types": "^3.0.1", ->>>>>>> 0bab142 (add login/logout) "pg": "^8.16.3" } } diff --git a/src/hooks.server.ts b/src/hooks.server.ts index c9403cb..c583af0 100755 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,17 +1,5 @@ // src/hooks.server.ts -<<<<<<< HEAD -import type { Handle } from '@sveltejs/kit'; - -/** @type {import('@sveltejs/kit').Handle} */ -export const handle: Handle = async ({ event, resolve }) => { - const response = await resolve(event); - // ffmpeg.wasm이 SharedArrayBuffer를 사용하기 위해 필요한 헤더 설정 - response.headers.set('Cross-Origin-Opener-Policy', 'same-origin'); - response.headers.set('Cross-Origin-Embedder-Policy', 'require-corp'); - return response; -}; -======= import type { Handle } from '@sveltejs/kit'; import jwt from 'jsonwebtoken'; @@ -38,4 +26,4 @@ export const handle: Handle = async ({ event, resolve }) => { response.headers.set('Cross-Origin-Embedder-Policy', 'require-corp'); return response; }; ->>>>>>> 0bab142 (add login/logout) + diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index a59c156..e41aad0 100755 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -39,18 +39,7 @@ } -<<<<<<< HEAD -
-
-
-

BigData Server

-
-
-
- -
-=======
->>>>>>> 0bab142 (add login/logout) -
\ No newline at end of file + +
+ diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte deleted file mode 100755 index 029be6f..0000000 --- a/src/routes/+page.svelte +++ /dev/null @@ -1,734 +0,0 @@ - - - - - - -
- -
- -
-

Movie Index

- -
- -
-

Data Number

- -
-
- - -
-
-
- {#each crudActions as action} - - {/each} -
- {#each flowActions as action} - - {/each} -
-
-
- - - -
-
-
- {#if !selectedDataNumberInfo} -

Select a data number to view the image.

- {:else} -
- {#if !imageHasError} - {`Data imageHasError = true} - /> - {/if} - - - { if (e.key === 'Escape') deselectRect(e); }} - role="region" - aria-label="Image annotation area"> - - {#if !imageHasError} - {#if showPrevRects} - {#each prevRectsForDisplay as rect (rect.id)} - - {/each} - {/if} - {#if showCurrentRects} - {#each rectangles as rect (rect.id)} - {@const isSelected = selectedRectIds.includes(rect.id)} - handleInteractionStart(e, rect, 'move', 'body')} - /> - {#if selectedRectangles.length === 1 && selectedRectangles[0].id === rect.id} - {#each handles as handle} - {@const handleX = handle.includes('w') ? rect.x : (handle.includes('e') ? rect.x + rect.width : rect.x + rect.width / 2)} - {@const handleY = handle.includes('n') ? rect.y : (handle.includes('s') ? rect.y + rect.height : rect.y + rect.height / 2)} - handleInteractionStart(e, rect, 'resize', handle)} - /> - {/each} - {/if} - {/each} - {/if} - {/if} - - -
- {/if} -
-
-
\ No newline at end of file diff --git a/src/routes/api/process-video/+server.ts b/src/routes/api/process-video/+server.ts index 8fac884..d2ac121 100755 --- a/src/routes/api/process-video/+server.ts +++ b/src/routes/api/process-video/+server.ts @@ -1,15 +1,10 @@ import { json, type RequestHandler } from '@sveltejs/kit'; -<<<<<<< HEAD -import fs from 'fs/promises'; -import path from 'path'; -import { exec } from 'child_process'; -import util from 'util'; -======= + import * as fs from 'fs/promises'; import * as path from 'path'; import { exec } from 'child_process'; import * as util from 'util'; ->>>>>>> 0bab142 (add login/logout) + import { createCanvas, loadImage } from 'canvas'; const execPromise = util.promisify(exec); diff --git a/src/routes/api/upload-cut/+server.ts b/src/routes/api/upload-cut/+server.ts index 0d984ea..33d6dec 100644 --- a/src/routes/api/upload-cut/+server.ts +++ b/src/routes/api/upload-cut/+server.ts @@ -1,43 +1,3 @@ -<<<<<<< HEAD -import { json, type RequestHandler } from '@sveltejs/kit'; -import fs from 'fs/promises'; -import path from 'path'; - -export const POST: RequestHandler = async ({ request }) => { - try { - const data = await request.formData(); - const videoFile = data.get('video') as File | null; - - if (!videoFile) { - return json({ success: false, error: '업로드된 파일이 없습니다.' }, { status: 400 }); - } - - // 1. 오늘 날짜를 YYYYMMDD 형식으로 생성 - const today = new Date(); - const year = today.getFullYear(); - const month = String(today.getMonth() + 1).padStart(2, '0'); - const day = String(today.getDate()).padStart(2, '0'); - const dateFolder = `${year}${month}${day}`; - - // 2. 최종 저장 경로 설정 - const uploadDir = path.join('/workspace/image/movie', dateFolder); - const filePath = path.join(uploadDir, videoFile.name); - - // 3. 날짜 폴더가 없으면 생성 - await fs.mkdir(uploadDir, { recursive: true }); - - // 4. 파일 저장 - const buffer = Buffer.from(await videoFile.arrayBuffer()); - await fs.writeFile(filePath, buffer); - - console.log(`파일 저장 완료: ${filePath}`); - - return json({ success: true, filePath }); - } catch (error) { - console.error('파일 업로드 처리 중 오류:', error); - return json({ success: false, error: '서버에서 파일 처리 중 오류가 발생했습니다.' }, { status: 500 }); - } -======= // src/routes/api/upload-cut/+server.ts import { error, json } from '@sveltejs/kit'; @@ -165,5 +125,4 @@ export const POST: import('@sveltejs/kit').RequestHandler = async ({ request }) } finally { client.release(); // 클라이언트 연결 해제 } ->>>>>>> 0bab142 (add login/logout) }; \ No newline at end of file diff --git a/src/routes/api/upload-original/+server.ts b/src/routes/api/upload-original/+server.ts index cd7d36b..168dadf 100755 --- a/src/routes/api/upload-original/+server.ts +++ b/src/routes/api/upload-original/+server.ts @@ -1,13 +1,10 @@ // src/routes/api/upload-original/+server.ts import { json, type RequestHandler } from '@sveltejs/kit'; -<<<<<<< HEAD -import fs from 'fs'; -import path from 'path'; -======= + import * as fs from 'fs'; import * as path from 'path'; ->>>>>>> 0bab142 (add login/logout) + export const POST: RequestHandler = async ({ request }) => { try { diff --git a/src/routes/api/video-preview/+server.ts b/src/routes/api/video-preview/+server.ts index 90d36d3..f5ca899 100644 --- a/src/routes/api/video-preview/+server.ts +++ b/src/routes/api/video-preview/+server.ts @@ -1,32 +1,3 @@ -<<<<<<< HEAD -import { type RequestHandler } from '@sveltejs/kit'; -import fs from 'fs'; -import path from 'path'; -import { promisify } from 'util'; - -const stat = promisify(fs.stat); - -export const GET: RequestHandler = async ({ setHeaders }) => { - const videoPath = path.join(process.cwd(), 'tmp', 'process.mp4'); - - try { - const stats = await stat(videoPath); - const videoSize = stats.size; - - // 브라우저가 영상을 스트리밍할 수 있도록 헤더 설정 - setHeaders({ - 'Content-Type': 'video/mp4', - 'Content-Length': videoSize.toString(), - 'Accept-Ranges': 'bytes' - }); - - const videoStream = fs.createReadStream(videoPath); - return new Response(videoStream); - - } catch (error) { - return new Response('영상을 찾을 수 없습니다.', { status: 404 }); - } -======= // ✅ 수정된 /api/video-preview/+server.ts (SvelteKit 2.x / Kit 1.x 호환) import { error } from '@sveltejs/kit'; import * as fs from 'fs'; @@ -84,5 +55,4 @@ export const GET: import('@sveltejs/kit').RequestHandler = ({ request }) => { const fileStream = fs.createReadStream(videoPath); return new Response(Readable.toWeb(fileStream) as ReadableStream, { status: 200, headers: responseHeaders }); // 200 OK } ->>>>>>> 0bab142 (add login/logout) }; \ No newline at end of file diff --git a/src/routes/video-cut/+page.svelte b/src/routes/video-cut/+page.svelte index b94dab4..3df9b39 100755 --- a/src/routes/video-cut/+page.svelte +++ b/src/routes/video-cut/+page.svelte @@ -1,529 +1,5 @@ - -
-
-

- 🎬 내시경 BigData 동영상 편집기 (Server-Side) -

-
- -

- {message} -

- -
- {#if videoURL} -
-
-

동영상 미리보기

- {#key videoURL} - - {/key} -
-
- {/if} - -
-
-

1. 동영상 파일 선택

- - -
- {#if isUploadingOriginal} -
-

서버로 업로드 중...

- -

{uploadProgress.toFixed(0)}%

-
- {/if} - {#if isDetectingCrop} -

자동 Crop 영역 계산 중...

- {:else if cropWidth > 0 && !isUploadingOriginal} -
-

자동 Crop 영역 (수정 가능):

-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - - {/if} -
-
- - {#if videoURL} -
-

2. 구간 추가

-
- - -
-
-

시작: {startTime.toFixed(2)}초

-

종료: {endTime.toFixed(2)}초

-
- -
- {/if} -
- - {#if videoURL} -
-
-

- 3. 자르기 목록 ({segments.length}개) -

-
- {#each segments as segment (segment.id)} -
-
-

previewSegment(segment)} - title="클릭하여 구간 미리보기" - > - {segment.start.toFixed(2)}초 ~ {segment.end.toFixed(2)}초 -

- {#if segment.resultURL} -
- 다운로드 - - {#if segment.isUploading} - 업로드 중... - {:else if segment.isUploaded} - ✓ 업로드 완료 - {:else} - - {/if} -
- {/if} -
- -
- {:else} -

추가된 구간이 없습니다.

- {/each} -
-
- - - -
-
-
- {/if} -
-
-======= // --- 상태 변수 선언 --- let videoURL: string = ''; let videoElement: HTMLVideoElement; @@ -1186,4 +662,4 @@ {/if} ->>>>>>> 0bab142 (add login/logout) + diff --git a/tsconfig.json b/tsconfig.json index 579e3ff..082734a 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,64 @@ { - "compilerOptions": { - "target": "es2017", - "module": "esnext", - "moduleResolution": "node", - "lib": ["es2017", "dom"], - "skipLibCheck": true, - "strict": true - // "types" 속성을 완전히 제거 - }, - "include": ["src/**/*"] + "compilerOptions": { + "paths": { + "$components": [ + "../src/lib/components" + ], + "$components/*": [ + "../src/lib/components/*" + ], + "$utils": [ + "../src/lib/utils" + ], + "$utils/*": [ + "../src/lib/utils/*" + ], + "$lib": [ + "../src/lib" + ], + "$lib/*": [ + "../src/lib/*" + ], + "$app/types": [ + "./types/index.d.ts" + ] + }, + "rootDirs": [ + "..", + "./types" + ], + "verbatimModuleSyntax": true, + "isolatedModules": true, + "lib": [ + "esnext", + "DOM", + "DOM.Iterable" + ], + "moduleResolution": "bundler", + "module": "esnext", + "noEmit": true, + "target": "esnext" + }, + "include": [ + "ambient.d.ts", + "non-ambient.d.ts", + "./types/**/$types.d.ts", + "../vite.config.js", + "../vite.config.ts", + "../src/**/*.js", + "../src/**/*.ts", + "../src/**/*.svelte", + "../tests/**/*.js", + "../tests/**/*.ts", + "../tests/**/*.svelte" + ], + "exclude": [ + "../node_modules/**", + "../src/service-worker.js", + "../src/service-worker/**/*.js", + "../src/service-worker.ts", + "../src/service-worker/**/*.ts", + "../src/service-worker.d.ts", + "../src/service-worker/**/*.d.ts" + ] } \ No newline at end of file