rust下载文件

背景

最近晚上给娃听故事

这页面不能连续播放,想着下载下来用默认播放器播放好了, 刚好最近在学rust,就用rust实现mp4下载.

动手

  1. 整理下载链接

        由于链接可能涉及不必要的纠纷就先不明文列出来了

  1. 编码
  • 解析json
use serde::{Deserialize,Serialize};
use serde_json;


#[derive(Debug,Deserialize,Serialize)]
struct Audio {
    title:String,
    src:String,
}

fn main() {
    println!("download mp4!");
    let json_urls = r#"[
        {"title":"第一辑 吃饭","src":"http://tcv.clewm.net"},
        {"title":"第一辑.大声回应","src":"http://tcv.clewm.net"},
        {"title":"第一辑.好朋友","src":"http://tcv.clewm.net"},
        {"title":"第一辑.拉粑粑","src":"http://tcv.clewm.net"},
        {"title":"第一辑.你好","src":"http://tcv.clewm.net"},
        {"title":"第一辑.尿床了","src":"http://tcv.clewm.net"},
        {"title":"第一辑.刷牙","src":"http://tcv.clewm.net"},
        {"title":"第一辑.谁哭了","src":"http://tcv.clewm.net"},
        {"title":"第一辑.睡觉","src":"http://tcv.clewm.net"},
        {"title":"第一辑.洗澡","src":"http://tcv.clewm.net"},
        {"title":"第二辑.对不起","src":"http://tcv.clewm.net"},
        {"title":"第二辑.多吃蔬菜","src":"http://tcv.clewm.net"},
        {"title":"第二辑.多吃水果","src":"http://tcv.clewm.net"},
        {"title":"第二辑.过生日","src":"http://tcv.clewm.net"},
        {"title":"第二辑.排好队","src":"http://tcv.clewm.net"},
        {"title":"第二辑.散步","src":"http://tcv.clewm.net"},
        {"title":"第二辑.收起来","src":"http://tcv.clewm.net"},
        {"title":"第二辑.我会穿鞋子","src":"http://tcv.clewm.net"},
        {"title":"第二辑.我会穿衣服","src":"http://tcv.clewm.net"},
        {"title":"第二辑.有危险","src":"http://tcv.clewm.net"},
        {"title":"第三辑.不赖床","src":"http://tcv.clewm.net"},
        {"title":"第三辑.插座上的洞洞","src":"http://tcv.clewm.net"},
        {"title":"第三辑.地上的东西是糖吗","src":"http://tcv.clewm.net"},
        {"title":"第三辑.好烫的水","src":"http://tcv.clewm.net"},
        {"title":"第三辑.客人来我家","src":"http://tcv.clewm.net"},
        {"title":"第三辑.妈妈不见了","src":"http://tcv.clewm.net"},
        {"title":"第三辑.勤洗手","src":"http://tcv.clewm.net"},
        {"title":"第三辑.讨厌的桌角","src":"http://tcv.clewm.net"},
        {"title":"第三辑.谢谢","src":"http://tcv.clewm.net"},
        {"title":"第三辑.站在椅子上","src":"http://tcv.clewm.net"}
    ]"#;

    let audios = serde_json::from_str::<Vec<Audio>>(json_urls).unwrap();
  • 下载文件
use std::fs::File;
use std::path::Path;
use std::io::prelude::*;
use reqwest;


async fn download(audio:Audio)->std::result::Result<(),Box<dyn std::error::Error>>{
    println!("downloading {}",audio.title);
    let client = reqwest::Client::new();
    let body = client.get(&audio.src).send().await.unwrap().bytes().await.unwrap();
    let title = String::from("./")+&audio.title+".mp4";
    let path = Path::new(&title);
    let mut file = File::create(&path).unwrap();
    let content = body.bytes();
    let data:std::result::Result<Vec<_>,_> = content.collect();
    file.write_all(&data.unwrap()).unwrap();

    println!("downloaded {}",audio.title);
    Ok(())
}
  • 完整代码
use serde::{Deserialize,Serialize};
use serde_json;

use std::fs::File;
use std::path::Path;
use std::io::prelude::*;
use reqwest;

#[derive(Debug,Deserialize,Serialize)]
struct Audio {
    title:String,
    src:String,
}


async fn download(audio:Audio)->std::result::Result<(),Box<dyn std::error::Error>>{
    println!("downloading {}",audio.title);
    let client = reqwest::Client::new();
    let body = client.get(&audio.src).send().await.unwrap().bytes().await.unwrap();
    let title = String::from("./")+&audio.title+".mp4";
    let path = Path::new(&title);
    let mut file = File::create(&path).unwrap();
    let content = body.bytes();
    let data:std::result::Result<Vec<_>,_> = content.collect();
    file.write_all(&data.unwrap()).unwrap();

    println!("downloaded {}",audio.title);
    Ok(())
}
#[tokio::main]
async fn main() {
    println!("download mp4!");
    let json_urls = r#"[
        {"title":"第一辑 吃饭","src":"http://tcv.clewm.net"},
        {"title":"第一辑.大声回应","src":"http://tcv.clewm.net"},
        {"title":"第一辑.好朋友","src":"http://tcv.clewm.net"},
        {"title":"第一辑.拉粑粑","src":"http://tcv.clewm.net"},
        {"title":"第一辑.你好","src":"http://tcv.clewm.net"},
        {"title":"第一辑.尿床了","src":"http://tcv.clewm.net"},
        {"title":"第一辑.刷牙","src":"http://tcv.clewm.net"},
        {"title":"第一辑.谁哭了","src":"http://tcv.clewm.net"},
        {"title":"第一辑.睡觉","src":"http://tcv.clewm.net"},
        {"title":"第一辑.洗澡","src":"http://tcv.clewm.net"},
        {"title":"第二辑.对不起","src":"http://tcv.clewm.net"},
        {"title":"第二辑.多吃蔬菜","src":"http://tcv.clewm.net"},
        {"title":"第二辑.多吃水果","src":"http://tcv.clewm.net"},
        {"title":"第二辑.过生日","src":"http://tcv.clewm.net"},
        {"title":"第二辑.排好队","src":"http://tcv.clewm.net"},
        {"title":"第二辑.散步","src":"http://tcv.clewm.net"},
        {"title":"第二辑.收起来","src":"http://tcv.clewm.net"},
        {"title":"第二辑.我会穿鞋子","src":"http://tcv.clewm.net"},
        {"title":"第二辑.我会穿衣服","src":"http://tcv.clewm.net"},
        {"title":"第二辑.有危险","src":"http://tcv.clewm.net"},
        {"title":"第三辑.不赖床","src":"http://tcv.clewm.net"},
        {"title":"第三辑.插座上的洞洞","src":"http://tcv.clewm.net"},
        {"title":"第三辑.地上的东西是糖吗","src":"http://tcv.clewm.net"},
        {"title":"第三辑.好烫的水","src":"http://tcv.clewm.net"},
        {"title":"第三辑.客人来我家","src":"http://tcv.clewm.net"},
        {"title":"第三辑.妈妈不见了","src":"http://tcv.clewm.net"},
        {"title":"第三辑.勤洗手","src":"http://tcv.clewm.net"},
        {"title":"第三辑.讨厌的桌角","src":"http://tcv.clewm.net"},
        {"title":"第三辑.谢谢","src":"http://tcv.clewm.net"},
        {"title":"第三辑.站在椅子上","src":"http://tcv.clewm.net"}
    ]"#;

    let audios = serde_json::from_str::<Vec<Audio>>(json_urls).unwrap();

    for audio in audios {
        let _ = download(audio).await;
    }
}
  • 结果

相关推荐

  1. rust 项目的文件结构

    2024-02-23 16:18:01       45 阅读
  2. Rust 读写csv文件

    2024-02-23 16:18:01       24 阅读
  3. 【前端】下载文件方法

    2024-02-23 16:18:01       37 阅读
  4. Qt下载http文件

    2024-02-23 16:18:01       33 阅读
  5. 浏览器文件下载

    2024-02-23 16:18:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-23 16:18:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-23 16:18:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-23 16:18:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-23 16:18:01       18 阅读

热门阅读

  1. phpspreadsheet导出数据和图片到excel

    2024-02-23 16:18:01       30 阅读
  2. 如何快速跑lvs来dbug

    2024-02-23 16:18:01       28 阅读
  3. SpringBoot3整合elasticsearch8

    2024-02-23 16:18:01       28 阅读
  4. LeetCode 889. 根据前序和后序遍历构造二叉树

    2024-02-23 16:18:01       25 阅读
  5. 关于OpenAI的Sora的基本介绍

    2024-02-23 16:18:01       33 阅读
  6. Docker安装Postgresql12

    2024-02-23 16:18:01       25 阅读