Golang Go语言中知名视频下载工具annie的一个大重构挺有意思
Golang Go语言中知名视频下载工具annie的一个大重构挺有意思
annie 是一个视频下载工具。能够下各个视频网站的视频到本地。
然后之前它下载,都是在 main 函数里面根据 url 进行判断,然后每个包自己实现 Extract 方法。具体为有一个 download 函数
func download(videoURL string) error {
var (
domain string
err error
data []downloader.Data
)
……
switch domain {
case "douyin", "iesdouyin":
data, err = douyin.Extract(videoURL)
case "bilibili":
data, err = bilibili.Extract(videoURL)
case "bcy":
data, err = bcy.Extract(videoURL)
case "pixivision":
data, err = pixivision.Extract(videoURL)
case "youku":
data, err = youku.Extract(videoURL)
很多这边就不贴了
……
}
最近有个更新,commit 为 424f8def refactor the whole structure (#676)
, 作者重构了一下,引入了 interface 。具体实现为:
var extractorMap map[string]types.Extractor
func init() {
douyinExtractor := douyin.New()
youtubeExtractor := youtube.New()
extractorMap = map[string]types.Extractor{
"": universal.New(), // universal extractor
"douyin": douyinExtractor,
"iesdouyin": douyinExtractor,
"bilibili": bilibili.New(),
"bcy": bcy.New(),
"pixivision": pixivision.New(),
"youku": youku.New(),
"youtube": youtubeExtractor,
"youtu": youtubeExtractor, // youtu.be
……
}
}
然后 extract 里面
extractor := extractorMap[domain]
videos, err := extractor.Extract(u, option)
每个包实现了Extractor
接口 Extract 方法。
// Extractor implements video data extraction related operations.
type Extractor interface {
// Extract is the main function to extract the data.
Extract(url string, option Options) ([]*Data, error)
}
这个重构还是挺有意思,作者应该早就想改了,但是是一个大工程,不知道作者心路历程是咋样滴 。
我想问问 extractorMap[domain] 这个用法是比较 native 的吗。另外好像仅仅针对这个问题,用接口的方法没太省事儿,因为 Extractor 就一个方法,之前的那种写法也可行。感觉就是解耦跟好了?
下面是之前学习看视频的时候说用接口的好处。
更多关于Golang Go语言中知名视频下载工具annie的一个大重构挺有意思的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
工厂模式吧……
我记得之前看文章写的就是这种,当你的分支足够多的时候就可以抽象出 Map<String,Executor>来搞,最近那个 cola 框架底层我记得就是这种设计,根据不同的场景调用不同的 Executor
这个是非常常见的设计了。。
看了一下,他支持的网站挺多的,有没有人试过下载的下来么? https://imgchr.com/i/0u3qde
这不就是策略模式
需要动态选择插件的时候一般都是这么做的。以前在 c 里面做音频编解码,就是用字符串选择编解码器,达到动态桥接的效果。
就是策略模式,我天天用
没有消除重复的模式没有意义。
查了下感觉更偏向工厂模式。
这明显不是工厂模式,都不实例化叫什么工厂模式。
就一个 map,也能叫模式?
太常见的用法了
个人觉得的话,如果我要做类似这样一个东西,我会做的像工厂模式。每一个策略,在下载时会实例化一个对象,这样对不同的下载任务就可以不同的管理。
很自然的做法,谈不上设计模式
.New() 好像是实例化?
针对帖子中提到的“Golang Go语言中知名视频下载工具annie的一个大重构挺有意思”这一观点,作为IT营GO语言方面的专家,我认为这确实是一个值得关注和探讨的话题。
annie作为一款用Go语言编写的开源视频下载工具,一直以其简洁、强大的功能受到用户的喜爱。此次大重构无疑是对annie的一次全面升级和优化,可能会带来更高效、更稳定的下载体验。
重构通常意味着对代码结构、算法或系统架构进行重大调整,以改善性能、提高可扩展性或修复潜在问题。对于annie这样的视频下载工具来说,重构可能涉及到下载逻辑的优化、错误处理的改进以及用户界面的更新等方面。
从用户的角度来看,annie的大重构可能意味着更快的下载速度、更低的资源占用以及更友好的用户界面。同时,重构也有助于提高annie的兼容性和稳定性,使其能够更好地适应各种操作系统和浏览器环境。
总的来说,annie的大重构是一个值得期待的更新,它将为用户带来更好的视频下载体验。作为GO语言开发者或视频下载工具的用户,我们可以密切关注annie的后续发展,并期待它为我们带来更多惊喜。