diff --git a/Cargo.toml b/Cargo.toml index 8ca265e..883b512 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ chrono = "0.4.41" rss_content = { git = "https://code.gabe.rocks/gabriel/rss_content", version = "0.1.1" } bytes = "1.10.1" scraper = "0.23.1" +iced_video_player = "0.5.0" [profile.dev] debug=true diff --git a/src/db.rs b/src/db.rs index ef21a56..4756da4 100644 --- a/src/db.rs +++ b/src/db.rs @@ -45,6 +45,8 @@ const ITEMS_TABLE_CREATE: &str = "CREATE TABLE IF NOT EXISTS 'items' ( 'description' TEXT, 'content' TEXT, 'read' INTEGER DEFAULT 0, + 'date' text default '', + 'media' text default '', PRIMARY KEY('itemID'), FOREIGN KEY('feedID') REFERENCES 'feeds'('feedID') );"; @@ -105,15 +107,23 @@ pub fn add_feed(url: &str) { pub fn store_items(feed: rss::Channel,feed_id: usize) { let conn = Connection::open(get_db_path()).unwrap(); feed.items.into_iter().for_each(|i: rss::Item| { + let t = i.clone(); conn.execute( - "insert into items(url,title,description,content,feedID) - values(?1,?2,?3,?4,?5)", + "insert into items(url,title,description,content,feedID,date,media) + values(?1,?2,?3,?4,?5,?6,?7)", [ i.link, i.title, i.description, i.content, - Some(feed_id.to_string()) + Some(feed_id.to_string()), + i.pub_date.clone(), + { + match t.enclosure() { + Some(e) => {Some(e.url().to_owned())} + None => {Some("".to_owned())} + } + } ], ) .ok(); @@ -129,22 +139,26 @@ pub struct FeedItem { pub url: String, pub icon: Option, pub description: Option, - pub content: Option + pub content: Option, + pub date: Option, + pub media: Option //date missing! needed for ordering!!! } pub fn get_feed_items(feed_id: usize) -> Vec{ let conn = get_db(); - let mut stmt = conn.prepare("select itemID,title,url,icon,description,content from items where feedID = ?1").unwrap(); + let mut stmt = conn.prepare("select itemID,title,url,date,media,description,content from items where feedID = ?1 order by date(date)").unwrap(); let items:Result> = stmt.query_map([feed_id], |row| { Ok(FeedItem{ item_id: row.get(0).unwrap(), title: row.get(1).unwrap(), url: row.get(2).unwrap(), - icon: row.get(3).unwrap(), - description: row.get(4).unwrap(), - content: row.get(5).unwrap() + date: row.get(3).unwrap(), + media: row.get(4).unwrap(), + description: row.get(5).unwrap(), + content: row.get(6).unwrap(), + icon: None, }) }).unwrap().collect(); match items { @@ -155,7 +169,7 @@ pub fn get_feed_items(feed_id: usize) -> Vec{ pub fn get_item(item_id: usize) -> FeedItem { let conn = get_db(); - let mut stmt = conn.prepare("select itemID,title,url,icon,description,content from items where itemID = ?1").unwrap(); + let mut stmt = conn.prepare("select itemID,title,url,icon,date,media,description,content from items where itemID = ?1").unwrap(); let item:FeedItem = stmt.query_one([item_id],|row| { Ok( FeedItem{ @@ -163,8 +177,10 @@ pub fn get_item(item_id: usize) -> FeedItem { title: row.get(1).unwrap(), url: row.get(2).unwrap(), icon: row.get(3).unwrap(), - description: row.get(4).unwrap(), - content: row.get(5).unwrap(), + date: row.get(4).unwrap(), + media: row.get(5).unwrap(), + description: row.get(6).unwrap(), + content: row.get(7).unwrap(), }) }).unwrap(); item diff --git a/src/ui.rs b/src/ui.rs index fadd905..d94e815 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -1,5 +1,6 @@ use crate::db::FeedItem; use crate::widgets::content_view; +use crate::widgets::media_view; use super::db; use super::widgets; @@ -163,12 +164,18 @@ fn feed_layout(state: &State) -> Element<'_, Message> { } fn item_view(state: &State) -> Element<'_, Message> { + let title = match state.current_item.clone() { + Some(i) => {i.title} + None => {"".to_owned()} + }; container(column!( row!( button(text("Home")).on_press(Message::ChangePage(Page::Home)), button(text("Feed")).on_press(Message::ChangePage(Page::FeedView)) ) .spacing(10), + text(title).size(34), + media_view(state), content_view(state), )) .height(Fill) diff --git a/src/widgets.rs b/src/widgets.rs index 5e88422..eadc0da 100644 --- a/src/widgets.rs +++ b/src/widgets.rs @@ -68,7 +68,18 @@ pub fn content_area(content: &Vec) -> iced::widget::Container } -pub fn content_view(state: &super::ui::State) -> iced::widget::Scrollable { +pub fn media_view(state: &ui::State) -> Element { + match state.current_item.clone().unwrap().media { + Some(m) => { + text(format!("",m)).into() + } + None => { + text("".to_owned()).into() + } + } +} + +pub fn content_view(state: &ui::State) -> iced::widget::Scrollable { let item = state.current_item.clone().unwrap(); scrollable(