Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
369 changes: 360 additions & 9 deletions controllers/api_videos.cpp

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions controllers/api_videos.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ namespace api
ADD_METHOD_TO(videos::postVideos, "/api/videos", Post, "AuthFilter");
ADD_METHOD_TO(videos::deleteVideo, "/api/videos", Delete, "AuthFilter");
ADD_METHOD_TO(videos::postExVideo, "/api/ex-videos", Post, "AuthFilter");
ADD_METHOD_TO(videos::syncExVideo, "/api/ex-videos/sync", Post, "AuthFilter");

ADD_METHOD_TO(videos::getVideo, "/api/videos/{1}", Get);
ADD_METHOD_TO(videos::patchVideo, "/api/videos/{1}", Patch, "AuthFilter");
Expand Down Expand Up @@ -47,6 +48,7 @@ namespace api
drogon::Task<drogon::HttpResponsePtr> postVideos(HttpRequestPtr req);
drogon::Task<drogon::HttpResponsePtr> deleteVideo(HttpRequestPtr req);
drogon::Task<drogon::HttpResponsePtr> postExVideo(HttpRequestPtr req);
drogon::Task<drogon::HttpResponsePtr> syncExVideo(HttpRequestPtr req);

drogon::Task<drogon::HttpResponsePtr> getVideo(HttpRequestPtr req, std::string id);
drogon::Task<drogon::HttpResponsePtr> patchVideo(HttpRequestPtr req, std::string id);
Expand Down
3 changes: 2 additions & 1 deletion docker-compose.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ services:
- MYSQL_PASSWORD=test_pass
- S3_ENDPOINT=http://test-minio:9000
- MODAL_HOST=http://127.0.0.1:9999
- YOUTUBE_API_KEY=${YOUTUBE_API_KEY}
- YOUTUBE_API_KEY=${YOUTUBE_API_KEY:-test-key}
- YOUTUBE_API_BASE_URL=http://127.0.0.1:9999
depends_on:
test-db:
condition: service_healthy
Expand Down
16 changes: 16 additions & 0 deletions docker/init.sql
Comment thread
pdpd22 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,22 @@ CREATE TABLE IF NOT EXISTS videos (
is_external TINYINT UNSIGNED NOT NULL DEFAULT 0,
type VARCHAR(32) NOT NULL DEFAULT 'internal'
);
CREATE TABLE IF NOT EXISTS external_video_statistics (
video_id VARCHAR(255) PRIMARY KEY,
provider VARCHAR(32) NOT NULL,
view_count BIGINT UNSIGNED,
like_count BIGINT UNSIGNED,
comment_count BIGINT UNSIGNED,
synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS external_video_metadata (
video_id VARCHAR(255) PRIMARY KEY,
provider VARCHAR(32) NOT NULL,
metadata JSON NOT NULL,
synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS comments (
comment_id INT AUTO_INCREMENT PRIMARY KEY,
video_id VARCHAR(255),
Expand Down
18 changes: 18 additions & 0 deletions docker/init.test.sql
Comment thread
pdpd22 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,24 @@ CREATE TABLE IF NOT EXISTS videos (
type VARCHAR(32) NOT NULL DEFAULT 'internal'
);

CREATE TABLE IF NOT EXISTS external_video_statistics (
video_id VARCHAR(255) PRIMARY KEY,
provider VARCHAR(32) NOT NULL,
view_count BIGINT UNSIGNED,
like_count BIGINT UNSIGNED,
comment_count BIGINT UNSIGNED,
synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS external_video_metadata (
video_id VARCHAR(255) PRIMARY KEY,
provider VARCHAR(32) NOT NULL,
metadata JSON NOT NULL,
synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS comments (
comment_id INT AUTO_INCREMENT PRIMARY KEY,
video_id VARCHAR(255),
Expand Down
17 changes: 17 additions & 0 deletions docker/migrations/20260822_external_video_sync.sql
Comment thread
pdpd22 marked this conversation as resolved.
Outdated
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
CREATE TABLE IF NOT EXISTS external_video_statistics (
video_id VARCHAR(255) PRIMARY KEY,
provider VARCHAR(32) NOT NULL,
view_count BIGINT UNSIGNED,
like_count BIGINT UNSIGNED,
comment_count BIGINT UNSIGNED,
synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS external_video_metadata (
video_id VARCHAR(255) PRIMARY KEY,
provider VARCHAR(32) NOT NULL,
metadata JSON NOT NULL,
synced_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(video_id) ON DELETE CASCADE
);
149 changes: 149 additions & 0 deletions docs/openapi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,155 @@ paths:
"500":
description: "サーバー内部エラー"

/api/ex-videos/sync:
post:
summary: "外部動画のデータを同期する"
description: "JSONのidsで指定した1〜50件の外部動画について、YouTubeの公開動画メタデータを1回の videos.list(1 quota unit)で取得して保存し、指定された動画情報・統計を一括同期します。同じtargetsが全動画に適用されます。YouTubeの正常応答内で動画やフィールドが欠落した場合は、取得できたデータだけを更新し、結果をpartialまたはskippedとして返します。YouTubeリクエスト自体の失敗時は更新せず、DB更新は1トランザクションで処理します。コメントは取得しません。fileDetails、processingDetails、suggestions、および公開 part 内の投稿者限定プロパティは取得結果に含めません。"
Comment thread
pdpd22 marked this conversation as resolved.
Outdated
operationId: syncExternalVideo
x-tested: true
tags:
- Video
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- ids
- targets
additionalProperties: false
properties:
ids:
type: array
minItems: 1
maxItems: 50
uniqueItems: true
description: "同期するplaybacQ内の動画ID。指定順でresultsを返します。"
items:
type: string
minLength: 1
maxLength: 255
targets:
type: object
minProperties: 1
additionalProperties: false
properties:
video:
type: object
required:
- fields
additionalProperties: false
properties:
fields:
type: array
minItems: 1
uniqueItems: true
items:
type: string
enum:
- title
- description
- duration
- type
statistics:
type: object
required:
- fields
additionalProperties: false
properties:
fields:
type: array
minItems: 1
uniqueItems: true
items:
type: string
enum:
- view_count
- like_count
- comment_count
example:
ids:
- "external-video-id-1"
- "external-video-id-2"
targets:
video:
fields:
- title
- description
- duration
- type
statistics:
fields:
- view_count
- like_count
- comment_count
responses:
"200":
description: "同期処理が完了しました。動画・フィールド単位の部分成功を含みます。"
content:
application/json:
schema:
type: object
required:
- results
- quota_units
properties:
results:
type: array
minItems: 1
description: "リクエストのidsと同じ順序の同期結果"
items:
type: object
required:
- id
- status
properties:
id:
type: string
description: "playbacQ内の動画ID"
status:
type: string
enum:
- updated
- partial
- skipped
description: "updatedは指定データをすべて更新、partialは取得できたフィールドだけ更新、skippedは動画リソース自体が返らず更新なし"
video:
$ref: "#/components/schemas/Video"
metadata:
type: object
description: "今回取得・保存したYouTubeの公開動画メタデータ。updatedまたはpartialの場合に返し、投稿者限定情報は除外済みです。"
synced:
type: object
description: "今回実際に同期したフィールドと値。updatedまたはpartialの場合に返します。"
skipped:
type: object
description: "取得結果に存在せず更新しなかったフィールドと理由。partialの場合に返します。"
reason:
type: string
enum:
- youtube_video_not_returned
description: "動画全体を更新しなかった理由。skippedの場合に返します。"
quota_units:
type: integer
const: 1
description: "この一括同期全体が消費するYouTube Data API quota unit"
"400":
description: "リクエストの形式、対象、またはフィールド指定が不正です。comments は指定できません。"
"401":
description: "認証されていません。"
"403":
description: "指定動画のいずれかの投稿者ではありません。"
"404":
description: "指定動画のいずれかが見つかりませんでした。"
"409":
description: "指定動画のいずれかが内部動画、または未対応の外部動画です。"
"500":
description: "サーバー設定またはDB処理に失敗しました。"
"502":
description: "YouTube APIリクエスト全体が失敗、またはレスポンス形式が不正で、同期を開始できませんでした。"

/api/videos/{id}:
get:
summary: "動画の取得"
Expand Down
17 changes: 17 additions & 0 deletions docs/schema.md
Comment thread
pdpd22 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,21 @@ erDiagram
TINYINT is_external
varchar type
}
external_video_statistics {
varchar video_id PK,FK
varchar provider
BIGINT view_count
BIGINT like_count
BIGINT comment_count
datetime synced_at
}

external_video_metadata {
varchar video_id PK,FK
varchar provider
json metadata
datetime synced_at
}
comments {
int comment_id PK
varchar video_id FK
Expand Down Expand Up @@ -50,5 +65,7 @@ erDiagram
videos||--o{video_tags : has
tags||--o{video_tags : tagged_with
videos||--o{video_likes : has
videos||--o|external_video_statistics : has
videos||--o|external_video_metadata : has
```

Loading
Loading