| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -6,19 +6,30 @@ use url::Url;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				#[instrument(skip(data))]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				pub async fn store(data: &str, url: &Url) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let path = PathBuf::from("./downloaded".to_string() + url.path());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let basepath = path.ancestors().skip(1).take(1).collect::<PathBuf>();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    trace!("Save path: {:?} and base path: {:?}", &path, &basepath);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if let Err(err) = fs::create_dir_all(&basepath).await {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let ex = path.ancestors().fold(String::new(), |mut s, item| {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            s += ", ";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            s += &item.to_string_lossy().to_string();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            s
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        error!("Dir creation: {err} {:?} {ex}", basepath);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // extract data from url to save it accurately
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let url_path = PathBuf::from("./downloaded/".to_string() + url.domain().unwrap_or("UnknownDomain") + url.path());
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // if it's a file
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (basepath, filename) = if url_path.extension().is_some() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // get everything up till the file
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let basepath = url_path.ancestors().skip(1).take(1).collect::<PathBuf>();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // get the file name
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let filename = url_path.file_name().expect("This should exist").to_string_lossy();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        trace!("Save path: {:?} and base path: {:?}", &url_path, &basepath);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        (basepath, filename.to_string())
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if let Err(err) = fs::write(&path, data).await {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            error!("File creation: {err} {:?}", path);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        (url_path.clone(), "index.html".into())
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    // create the folders
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if let Err(err) = fs::create_dir_all(&basepath).await {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        error!("Dir creation: {err} {:?}", basepath);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // FIXME I don't think this handles index.html files well...
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // TODO this should probably append .html to non-described files
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // create the file if that was successful
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if let Err(err) = fs::write(&basepath.join(filename), data).await {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            error!("File creation: {err} {:?}", url_path);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					
					| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				 
 |