🎉 Media detection working!
This commit is contained in:
parent
c279cebf0a
commit
7d4714c5e5
4 changed files with 47 additions and 12 deletions
|
@ -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
|
||||
|
|
38
src/db.rs
38
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<String>,
|
||||
pub description: Option<String>,
|
||||
pub content: Option<String>
|
||||
pub content: Option<String>,
|
||||
pub date: Option<String>,
|
||||
pub media: Option<String>
|
||||
//date missing! needed for ordering!!!
|
||||
|
||||
}
|
||||
|
||||
pub fn get_feed_items(feed_id: usize) -> Vec<FeedItem>{
|
||||
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<Vec<FeedItem>> = 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<FeedItem>{
|
|||
|
||||
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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -68,7 +68,18 @@ pub fn content_area(content: &Vec<Content>) -> iced::widget::Container<Message>
|
|||
|
||||
}
|
||||
|
||||
pub fn content_view(state: &super::ui::State) -> iced::widget::Scrollable<Message> {
|
||||
pub fn media_view(state: &ui::State) -> Element<Message> {
|
||||
match state.current_item.clone().unwrap().media {
|
||||
Some(m) => {
|
||||
text(format!("<Media is available:{}>",m)).into()
|
||||
}
|
||||
None => {
|
||||
text("".to_owned()).into()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn content_view(state: &ui::State) -> iced::widget::Scrollable<Message> {
|
||||
let item = state.current_item.clone().unwrap();
|
||||
|
||||
scrollable(
|
||||
|
|
Loading…
Reference in a new issue