@@ -7,15 +7,13 @@ use crate::{
77use colored:: Colorize ;
88use log:: { debug, info, trace, warn} ;
99use reqwest:: { StatusCode , Url , header} ;
10- use std:: sync:: {
11- Arc ,
12- atomic:: { AtomicBool , Ordering } ,
13- } ;
10+ use std:: sync:: Arc ;
1411use tokio:: {
1512 fs:: { self , File } ,
1613 io:: { self , AsyncWriteExt } ,
1714 task:: JoinSet ,
1815} ;
16+ use tokio_util:: sync:: CancellationToken ;
1917use vsd_mp4:: {
2018 boxes:: TencBox ,
2119 decrypt:: { CencDecrypter , HlsAes128Decrypter , HlsSampleAesDecrypter } ,
@@ -26,8 +24,8 @@ const PNG_HEADER: [u8; 8] = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
2624
2725pub async fn download (
2826 config : & DownloadConfig ,
29- running : & AtomicBool ,
30- pb : Progress ,
27+ progress : Progress ,
28+ token : & CancellationToken ,
3129 stream : & MediaPlaylist ,
3230) -> Result < Stream > {
3331 if let Some ( Segment {
@@ -69,7 +67,7 @@ pub async fn download(
6967
7068 let base_url = stream. uri . parse :: < Url > ( ) ?;
7169 let ext = stream. extension ( ) ;
72- let pb_handle = pb . spawn ( ) ;
70+ let progress_handle = progress . spawn ( ) ;
7371 let temp_dir = temp_file. with_extension ( "" ) ;
7472 let mut auto_increment_iv = false ;
7573 let mut decrypter = Decrypter :: None ;
@@ -97,14 +95,14 @@ pub async fn download(
9795 let mut set: JoinSet < Result < usize > > = JoinSet :: new ( ) ;
9896
9997 for ( i, segment) in stream. segments . iter ( ) . enumerate ( ) {
100- if !running . load ( Ordering :: SeqCst ) {
98+ if token . is_cancelled ( ) {
10199 break ;
102100 }
103101
104102 while set. len ( ) >= max_threads {
105103 if let Some ( Ok ( result) ) = set. join_next ( ) . await {
106104 match result {
107- Ok ( bytes) => pb . update ( bytes) ,
105+ Ok ( bytes) => progress . update ( bytes) ,
108106 Err ( e) => {
109107 set. abort_all ( ) ;
110108 return Err ( e) ;
@@ -190,7 +188,7 @@ pub async fn download(
190188
191189 if out_file. exists ( ) {
192190 let size = fs:: metadata ( & out_file) . await ?. len ( ) ;
193- pb . skip ( size as usize ) ;
191+ progress . skip ( size as usize ) ;
194192 continue ;
195193 }
196194
@@ -261,18 +259,18 @@ pub async fn download(
261259
262260 while let Some ( Ok ( result) ) = set. join_next ( ) . await {
263261 match result {
264- Ok ( bytes) => pb . update ( bytes) ,
262+ Ok ( bytes) => progress . update ( bytes) ,
265263 Err ( e) => {
266264 set. abort_all ( ) ;
267265 return Err ( e) ;
268266 }
269267 }
270268 }
271269
272- pb_handle . abort ( ) ;
273- pb . finish ( ) ;
270+ progress_handle . abort ( ) ;
271+ progress . finish ( ) ;
274272
275- if !running . load ( Ordering :: SeqCst ) {
273+ if token . is_cancelled ( ) {
276274 return Err ( Error :: DownloadInterrupted ) ;
277275 }
278276
0 commit comments