81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::io::{self, stdout, Write};
 | |
| use std::process::Command;
 | |
| use std::rc::Rc;
 | |
| 
 | |
| use iptvnator_rs::{setup, M3u8, Parser};
 | |
| fn main() {
 | |
|     println!("Welcome to iptvnator_rs, the port of my iptvprogram written in python, now in rust BLAZINGLY FAST\n");
 | |
|     let parser = Parser::new("iptv.m3u8".to_owned(), setup(), "watched.txt".to_owned());
 | |
| 
 | |
|     let stdin = io::stdin();
 | |
|     let mut stdout = stdout().lock();
 | |
|     let mut search_result: Option<Rc<Vec<&M3u8>>> = None;
 | |
| 
 | |
|     loop {
 | |
|         let mut buf = String::new();
 | |
| 
 | |
|         // Dont't perform a search if user has just watched, instead present the previous search
 | |
|         if search_result.is_none() {
 | |
|             print!("Search by name: ");
 | |
|             stdout.flush().unwrap();
 | |
|             stdin.read_line(&mut buf).unwrap();
 | |
|             buf = buf.trim().to_owned();
 | |
| 
 | |
|             // If they want to quit, let them-
 | |
|             if buf.trim() == "q" {
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             search_result = Some(Rc::new(parser.find(&buf)));
 | |
| 
 | |
|             if search_result.as_ref().unwrap().len() == 0 {
 | |
|                 println!("Nothing found");
 | |
|                 stdout.flush().unwrap();
 | |
|                 continue;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Let them choose which one to stream
 | |
|         for (idx, m3u8_item) in search_result.as_ref().unwrap().iter().enumerate().rev() {
 | |
|             println!("  {}: {}", idx + 1, m3u8_item);
 | |
|         }
 | |
|         print!("Which one do you wish to stream? [q | s]: ");
 | |
|         stdout.flush().unwrap();
 | |
|         buf = String::new();
 | |
|         stdin.read_line(&mut buf).unwrap();
 | |
| 
 | |
|         let user_wish = buf.trim();
 | |
|         // If they want to quit, let them-
 | |
|         if user_wish == "q" {
 | |
|             break;
 | |
|         } else if user_wish == "s" {
 | |
|             search_result = None;
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         let choosen = user_wish.parse::<usize>();
 | |
|         match choosen {
 | |
|             Ok(k) => {
 | |
|                 let search_result = search_result.as_ref().unwrap().clone();
 | |
|                 stream(&(search_result[k - 1]))
 | |
|             }
 | |
|             Err(e) => println!("Have to be a valid number! {:?}", e),
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     parser.save_watched();
 | |
| }
 | |
| 
 | |
| fn stream(m3u8item: &M3u8) {
 | |
|     // Well I know that this is frowned upon, but it's honestly the most efficient way of doing this
 | |
|     let ptr = m3u8item as *const M3u8;
 | |
|     let ptr = ptr as *mut M3u8;
 | |
|     let mut item = unsafe { &mut *ptr };
 | |
|     item.watched = true;
 | |
| 
 | |
|     Command::new("mpv")
 | |
|         .arg(&m3u8item.link)
 | |
|         .output()
 | |
|         .expect("Could not listen for output");
 | |
| }
 |