From 44da36ca859ee93b6a454e426dc473867af0d067 Mon Sep 17 00:00:00 2001 From: jwb Date: Tue, 18 Feb 2025 15:41:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=B5=8C=E5=85=A5B=E7=AB=99?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=94=AF=E6=8C=81av/bv=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/components/BilibiliPreview.vue | 22 ++++++++++++++++++---- front/components/UploadVideo.vue | 12 ++++++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/front/components/BilibiliPreview.vue b/front/components/BilibiliPreview.vue index e57a1d0c..3d7646bd 100644 --- a/front/components/BilibiliPreview.vue +++ b/front/components/BilibiliPreview.vue @@ -8,11 +8,25 @@ diff --git a/front/components/UploadVideo.vue b/front/components/UploadVideo.vue index 5ad58a8f..3fdd5caa 100644 --- a/front/components/UploadVideo.vue +++ b/front/components/UploadVideo.vue @@ -72,6 +72,7 @@ const videoType = ref(props.type) const youtubeUrl = ref('') const bilibiliUrl = ref('') const onlineUrl = ref('') +const bilibiliUrlRegs = [/src=['"]([^'"]+)['"]/, /[aA][vV](\d+)/, /([bB][vV][\w]+)/] const youtubeUrlRegs = [/v=([^&#]+)/, /youtu\.be\/(.*)\?/] const progress = ref(0) const filename = ref('') @@ -115,10 +116,17 @@ const handleUploadVideo = async (files: FileList) => { } } const confirm = (close: Function) => { - const match = bilibiliUrl.value.match(/src=['"]([^'"]+)['"]/) if (bilibiliUrl.value.trim()) { videoType.value = 'bilibili' - if (match && match.length > 1) { + let success = false + for (let i = 0; i < bilibiliUrlRegs.length; i++) { + const match = bilibiliUrl.value.match(bilibiliUrlRegs[i]) + if (match && match.length > 1) { + success = true + break + } + } + if (success) { emit('confirm', { type: videoType.value, value: bilibiliUrl.value From 7428c8b0414f404dd4f17deede773da7b99275cd Mon Sep 17 00:00:00 2001 From: jwb Date: Wed, 19 Feb 2025 08:49:54 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=A4=84=E7=90=86=E5=90=8E=E7=9A=84B?= =?UTF-8?q?=E7=AB=99=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.go | 1 + backend/migrate.go | 33 +++++++++++++++++++++++++++- front/components/BilibiliPreview.vue | 21 +----------------- front/components/UploadVideo.vue | 20 ++++++++++++++++- 4 files changed, 53 insertions(+), 22 deletions(-) diff --git a/backend/main.go b/backend/main.go index 34d9b763..9c30f7ca 100644 --- a/backend/main.go +++ b/backend/main.go @@ -89,6 +89,7 @@ func main() { } migrateTo3(tx, myLogger) + migrateBiliBiliUrl(tx, myLogger) e.HideBanner = true err = e.Start(fmt.Sprintf(":%d", cfg.Port)) diff --git a/backend/migrate.go b/backend/migrate.go index 9ab95722..36673150 100644 --- a/backend/migrate.go +++ b/backend/migrate.go @@ -4,13 +4,15 @@ import ( "encoding/json" "errors" "fmt" + "regexp" + "strings" + "github.com/kingwrcy/moments/db" "github.com/kingwrcy/moments/handler" "github.com/kingwrcy/moments/vo" "github.com/rs/zerolog" "github.com/tidwall/gjson" "gorm.io/gorm" - "strings" ) func migrateTo3(tx *gorm.DB, log zerolog.Logger) { @@ -173,3 +175,32 @@ WHERE ((createdAt NOT LIKE '%-%' AND length(createdAt) = 13) OR (updatedAt NOT LIKE '%-%' AND length(updatedAt) = 13))`) } + +func migrateBiliBiliUrl(tx *gorm.DB, log zerolog.Logger) { + var memos []db.Memo + tx.Find(&memos) + re := regexp.MustCompile(`src=['"]([^'"]+)['"]`) + for _, memo := range memos { + var ext vo.MemoExt + err := json.Unmarshal([]byte(memo.Ext), &ext) + if err != nil { + log.Warn().Msgf("memo id:%d ext属性不是标准的json格式 => %s,忽略..", memo.Id, memo.Ext) + continue + } + + if ext.Video.Type == "bilibili" && re.MatchString(ext.Video.Value) { + log.Info().Msgf("开始迁移memo id:%d 的bilibili url", memo.Id) + log.Info().Msgf("原始url:%s", ext.Video.Value) + ext.Video.Value = re.FindStringSubmatch(ext.Video.Value)[1] + "&autoplay=0&high_quality=1&as_wide=1" + log.Info().Msgf("迁移后的url:%s", ext.Video.Value) + + extContent, _ := json.Marshal(ext) + memo.Ext = string(extContent) + if err = tx.Save(&memo).Error; err != nil { + log.Error().Msgf("迁移memo id:%d 失败,原因:%v", memo.Id, err) + } else { + log.Info().Msgf("迁移memo id:%d 成功", memo.Id) + } + } + } +} diff --git a/front/components/BilibiliPreview.vue b/front/components/BilibiliPreview.vue index 3d7646bd..d1206eba 100644 --- a/front/components/BilibiliPreview.vue +++ b/front/components/BilibiliPreview.vue @@ -8,26 +8,7 @@ diff --git a/front/components/UploadVideo.vue b/front/components/UploadVideo.vue index 3fdd5caa..f7a7aeb5 100644 --- a/front/components/UploadVideo.vue +++ b/front/components/UploadVideo.vue @@ -119,17 +119,35 @@ const confirm = (close: Function) => { if (bilibiliUrl.value.trim()) { videoType.value = 'bilibili' let success = false + let type = 0 + let param = "" for (let i = 0; i < bilibiliUrlRegs.length; i++) { const match = bilibiliUrl.value.match(bilibiliUrlRegs[i]) if (match && match.length > 1) { success = true + type = i + param = match[1] break } } if (success) { + let url + switch (type) { + case 0: // 处理 iframe 嵌入代码 + url = param + "&autoplay=0&high_quality=1&as_wide=1" + break + case 1: // 处理 AV 号 + url = `//player.bilibili.com/player.html?aid=${param}&autoplay=0&high_quality=1&as_wide=1` + break + case 2: // 处理 BV 号 + url = `//player.bilibili.com/player.html?bvid=${param}&autoplay=0&high_quality=1&as_wide=1` + break + default: + url = "" + } emit('confirm', { type: videoType.value, - value: bilibiliUrl.value + value: url }) close() } else { From da9ead7a8b85b636b80c28fc9b954dc5c2767c4b Mon Sep 17 00:00:00 2001 From: xuewenG Date: Wed, 19 Feb 2025 23:00:59 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=E7=AB=99?= =?UTF-8?q?=E5=A4=96=E8=A7=86=E9=A2=91=E9=93=BE=E6=8E=A5=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.go | 2 +- backend/migrate.go | 83 ++++++++++-- front/components/BilibiliPreview.vue | 17 --- front/components/Memo.vue | 8 +- front/components/MemoEdit.vue | 3 +- front/components/UploadVideo.vue | 168 ++++++++++++++---------- front/components/VideoPreviewIframe.vue | 25 ++++ front/components/YoutubePreview.vue | 27 ---- 8 files changed, 196 insertions(+), 137 deletions(-) delete mode 100644 front/components/BilibiliPreview.vue create mode 100644 front/components/VideoPreviewIframe.vue delete mode 100644 front/components/YoutubePreview.vue diff --git a/backend/main.go b/backend/main.go index 9c30f7ca..eb8d1c30 100644 --- a/backend/main.go +++ b/backend/main.go @@ -89,7 +89,7 @@ func main() { } migrateTo3(tx, myLogger) - migrateBiliBiliUrl(tx, myLogger) + migrateIframeVideoUrl(tx, myLogger) e.HideBanner = true err = e.Start(fmt.Sprintf(":%d", cfg.Port)) diff --git a/backend/migrate.go b/backend/migrate.go index 36673150..91e46efe 100644 --- a/backend/migrate.go +++ b/backend/migrate.go @@ -176,31 +176,86 @@ WHERE (updatedAt NOT LIKE '%-%' AND length(updatedAt) = 13))`) } -func migrateBiliBiliUrl(tx *gorm.DB, log zerolog.Logger) { +func migrateIframeVideoUrl(tx *gorm.DB, log zerolog.Logger) { var memos []db.Memo tx.Find(&memos) - re := regexp.MustCompile(`src=['"]([^'"]+)['"]`) + + bilibiliUrlReg := regexp.MustCompile(`src=['"](?:https?:)?(?:\/)*([^'"]+)['"]`) + youtubeUrlRegList := []*regexp.Regexp{ + regexp.MustCompile(`v=([^&#]+)`), + regexp.MustCompile(`youtu\.be\/([^\/\?]+)`), + } + for _, memo := range memos { var ext vo.MemoExt err := json.Unmarshal([]byte(memo.Ext), &ext) if err != nil { - log.Warn().Msgf("memo id:%d ext属性不是标准的json格式 => %s,忽略..", memo.Id, memo.Ext) + log.Warn().Msgf("memo id: %d 的 ext 不是标准的 json 格式 => %s", memo.Id, memo.Ext) continue } - if ext.Video.Type == "bilibili" && re.MatchString(ext.Video.Value) { - log.Info().Msgf("开始迁移memo id:%d 的bilibili url", memo.Id) - log.Info().Msgf("原始url:%s", ext.Video.Value) - ext.Video.Value = re.FindStringSubmatch(ext.Video.Value)[1] + "&autoplay=0&high_quality=1&as_wide=1" - log.Info().Msgf("迁移后的url:%s", ext.Video.Value) + // 测试数据开始 + // if ext.Video.Value != "" { + // ext.Video.Type = "bilibili" + // ext.Video.Value = `` + // ext.Video.Value = `//player.bilibili.com/player.html?isOutside=true&aid=123&bvid=FDA1FAD&cid=123&p=1` + // ext.Video.Value = `https://player.bilibili.com/player.html?isOutside=true&aid=123&bvid=FDA1FAD&cid=123&p=1` + // } - extContent, _ := json.Marshal(ext) - memo.Ext = string(extContent) - if err = tx.Save(&memo).Error; err != nil { - log.Error().Msgf("迁移memo id:%d 失败,原因:%v", memo.Id, err) - } else { - log.Info().Msgf("迁移memo id:%d 成功", memo.Id) + // if ext.Video.Value != "" { + // ext.Video.Type = "youtube" + // ext.Video.Value = "https://www.youtube.com/watch?v=hacdT_G2Ara&q=123" + // ext.Video.Value = "https://youtu.be/hacdT_G2Ara?si=aa_a_a_aaa" + // ext.Video.Value = "https://youtu.be/hacdT_G2Ara" + // ext.Video.Value = "//www.youtube.com/embed/hacdT_G2Ara" + // ext.Video.Value = "https://www.youtube.com/embed/hacdT_G2Ara" + // } + // 测试数据结束 + + if ext.Video.Value == "" || + strings.HasPrefix(ext.Video.Value, "https://player.bilibili.com/player.html") || + strings.HasPrefix(ext.Video.Value, "https://www.youtube.com/embed") { + continue + } + + log.Info().Msgf("开始迁移 memo id: %d 的 %s url: %s", memo.Id, ext.Video.Type, ext.Video.Value) + + if strings.HasPrefix(ext.Video.Value, "//") { + ext.Video.Value = fmt.Sprintf("https:%s", ext.Video.Value) + } else if strings.HasPrefix(ext.Video.Value, "http://") { + ext.Video.Value = strings.Replace(ext.Video.Value, "http://", "https://", 1) + } else if ext.Video.Type == "bilibili" { + matchResult := bilibiliUrlReg.FindStringSubmatch(ext.Video.Value) + if matchResult == nil { + continue + } + + ext.Video.Value = fmt.Sprintf(`https://%s`, matchResult[1]) + } else if ext.Video.Type == "youtube" { + for _, youtubeUrlReg := range youtubeUrlRegList { + matchResult := youtubeUrlReg.FindStringSubmatch(ext.Video.Value) + if matchResult == nil { + continue + } + + ext.Video.Value = fmt.Sprintf( + `https://www.youtube.com/embed/%s`, + matchResult[1], + ) + break } + } else { + log.Info().Msgf("视频地址无需迁移") + continue + } + + log.Info().Msgf("迁移后的 url: %s", ext.Video.Value) + extContent, _ := json.Marshal(ext) + memo.Ext = string(extContent) + if err = tx.Save(&memo).Error; err == nil { + log.Info().Msgf("迁移 memo id: %d 成功", memo.Id) + } else { + log.Error().Msgf("迁移 memo id: %d 失败, 原因:%v", memo.Id, err) } } } diff --git a/front/components/BilibiliPreview.vue b/front/components/BilibiliPreview.vue deleted file mode 100644 index d1206eba..00000000 --- a/front/components/BilibiliPreview.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/front/components/Memo.vue b/front/components/Memo.vue index 030dfe17..91775ec1 100644 --- a/front/components/Memo.vue +++ b/front/components/Memo.vue @@ -53,12 +53,8 @@ - - - + +
- - +
diff --git a/front/components/UploadVideo.vue b/front/components/UploadVideo.vue index f7a7aeb5..d36b1281 100644 --- a/front/components/UploadVideo.vue +++ b/front/components/UploadVideo.vue @@ -51,7 +51,7 @@ 确定 - 清空 + 清空 @@ -59,25 +59,24 @@ - + diff --git a/front/components/VideoPreviewIframe.vue b/front/components/VideoPreviewIframe.vue new file mode 100644 index 00000000..56ce7255 --- /dev/null +++ b/front/components/VideoPreviewIframe.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/front/components/YoutubePreview.vue b/front/components/YoutubePreview.vue deleted file mode 100644 index 36c4317b..00000000 --- a/front/components/YoutubePreview.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - \ No newline at end of file