背景

近期将mooc上的视频(1000+)从一个云服务商(Azure)转移到另一个云服务商(七牛云)。做个记录。

视频迁移的思路是通用的,如果你使用的云服务商有镜像存储功能,这篇文章可能就有用。

思路

思路很简单,使用七牛云的镜像存储功能,将Azure的视频镜像到七牛云上。

镜像前后的视频url只有host不同。

操作流程

  1. 允许Azure视频存储容器的访问策略调整为:匿名读取访问容器和blob
  2. 将Azure上的视频url导出为url列表(csv)
  3. 配置好七牛云的镜像
  4. 写一个触发程序(类似url点击),触发url列表的镜像缓存

前三点在对应云平台都有教程,在此不赘述。下边分享一下触发程序

触发程序

talk is cheap show you the code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# python >= 3.5
import pandas as pd
import aiohttp
import asyncio
import time

df = pd.read_csv('qiniu_url.csv')


async def job(session, url):
    response = await session.options(url)
    if response.status != 200:
        print(f"bad_url:{url}")


async def main(loop):
    async with aiohttp.ClientSession() as session:
        tasks = [loop.create_task(job(session, url)) for url in df['qiniu_url'] if "mp4" in url.lower()] # 推荐每次跑100个 df['qiniu_url'][0:100]
        finished, unfinished = await asyncio.wait(tasks)
        all_results = [r.result() for r in finished]
        print(len(all_results))


t1 = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
print("Async total time:", time.time() - t1)

至此完成视频迁移,需要注意的是七牛云的镜像存储缓存时间默认是30天,最长是一年。所以需要留意到期的问题。如果要继续使用,再此镜像也很轻松。

mooc课程内链接替换

视频迁移完之后,我们还需要在mooc课程内,替换相应url。如果url很少,可以手动替换,如果数量很大的话,推荐使用批量替换。下边记录批量替换的过程。

open edx的课程包内容是纯文本(xml),所以我们可以导出课程包,解压后,替换完链接再导入回去。

我们前头提到,迁移前后,视频链接的唯一变化就是host,假设迁移前的host为:video.example1.com, 迁移后的host为:video.example2.com。我们只要全局替换课程包里的视频host就行。

首先在studio中导出课程包,形如:course.D3ztEC.tar.gz,这是个tar包,接下来我们需要解压它,但我每次都记不住解压的命令,所以我们可以使用cheat/tldr(pip install cheat)来看看tar的常见用法:cheat tar,cheat会列出目录指令的典型用法,而不是像man一样事无巨细,看着头疼。

1
2
3
4
5
tar -xzvf course.D3ztEC.tar.gz  # 解压到目录 course
cd course
git init # 使用git记录目录变化,以便于没有弄坏东西 ,记得最后清理掉.git:  rm -rf .git
git add .
git commit -m '1st'

接下来开始将video.example1.com替为video.example2.com

在一个目录里递归替换文件里的字符串,linux社区习惯用sed,mac下sed有问题,与linux不一致,再者sed的正则和转义神烦。推荐直接使用vscode,简单清晰。

替换完成后,git diff看一下是否符合预期,如果符合,就把.git目录删掉

最后把course目录压缩回tar包

1
2
# To create a .gz archive:
tar -czvf replaceurlcourse.D3ztEC.tar.gz  course

上传替换好的课程包到课程里(studio中)

完毕!

一些tips

url处理

我们将视频从Azure迁往七牛云,前后的连接变化有两处:

  • https变为http
  • host调整
  • 不需要url参数

尽管我们可以用正则来做这些事,但会很丑,推荐使用furl

1
2
3
4
5
from furl import furl
u1 = "https://video.example1.com/a/b.mp4?q=1"
u2 = furl(u).set(host='video.example2.com',scheme="http").remove(query=True)
print(str(u2))
# http://video.example2.com/a/b.mp4

csv新增一栏替换后的url

使用pandas批量替换host,新增一栏:

df['qiniu_url'] = df.apply(lambda row: str(furl(row["SAS URL"]).set(host="video.example2.com",scheme="http").remove(query=True)), axis=1)