bringup farmacity

This commit is contained in:
Cat /dev/Nulo 2024-02-06 23:20:04 -03:00
parent d1d496514c
commit 1118bcf75d
6 changed files with 64 additions and 0 deletions

View file

@ -3,25 +3,31 @@ export enum Supermercado {
Carrefour = "Carrefour", Carrefour = "Carrefour",
Coto = "Coto", Coto = "Coto",
Jumbo = "Jumbo", Jumbo = "Jumbo",
Farmacity = "Farmacity",
} }
export const supermercados: Supermercado[] = [ export const supermercados: Supermercado[] = [
Supermercado.Carrefour, Supermercado.Carrefour,
Supermercado.Coto, Supermercado.Coto,
Supermercado.Dia, Supermercado.Dia,
Supermercado.Jumbo, Supermercado.Jumbo,
Supermercado.Farmacity,
]; ];
export const hosts: { [host: string]: Supermercado } = { export const hosts: { [host: string]: Supermercado } = {
"diaonline.supermercadosdia.com.ar": Supermercado.Dia, "diaonline.supermercadosdia.com.ar": Supermercado.Dia,
"www.carrefour.com.ar": Supermercado.Carrefour, "www.carrefour.com.ar": Supermercado.Carrefour,
"www.cotodigital3.com.ar": Supermercado.Coto, "www.cotodigital3.com.ar": Supermercado.Coto,
"www.jumbo.com.ar": Supermercado.Jumbo, "www.jumbo.com.ar": Supermercado.Jumbo,
"www.farmacity.com": Supermercado.Farmacity,
}; };
export const hostBySupermercado = Object.fromEntries( export const hostBySupermercado = Object.fromEntries(
Object.entries(hosts).map(([a, b]) => [b, a]) Object.entries(hosts).map(([a, b]) => [b, a])
) as Record<Supermercado, string>; ) as Record<Supermercado, string>;
// también actualizar en sitio/src/routes/ean/[ean]/+page.svelte
export const colorBySupermercado: { [supermercado in Supermercado]: string } = { export const colorBySupermercado: { [supermercado in Supermercado]: string } = {
[Supermercado.Dia]: "#d52b1e", [Supermercado.Dia]: "#d52b1e",
[Supermercado.Carrefour]: "#19549d", [Supermercado.Carrefour]: "#19549d",
[Supermercado.Coto]: "#e20025", [Supermercado.Coto]: "#e20025",
[Supermercado.Jumbo]: "#2dc850", [Supermercado.Jumbo]: "#2dc850",
[Supermercado.Farmacity]: "#EF7603",
}; };

View file

@ -285,6 +285,7 @@ async fn get_urls(supermercado: &Supermercado) -> Result<Vec<String>, anyhow::Er
Supermercado::Jumbo => sites::jumbo::get_urls().await?, Supermercado::Jumbo => sites::jumbo::get_urls().await?,
Supermercado::Carrefour => sites::carrefour::get_urls().await?, Supermercado::Carrefour => sites::carrefour::get_urls().await?,
Supermercado::Coto => sites::coto::get_urls().await?, Supermercado::Coto => sites::coto::get_urls().await?,
Supermercado::Farmacity => sites::farmacity::get_urls().await?,
}) })
} }
@ -305,6 +306,9 @@ async fn scrap_url(
sites::coto::parse(url, &tl::parse(body, tl::ParserOptions::default())?) sites::coto::parse(url, &tl::parse(body, tl::ParserOptions::default())?)
} }
"www.jumbo.com.ar" => sites::jumbo::scrap(client, url, body).await, "www.jumbo.com.ar" => sites::jumbo::scrap(client, url, body).await,
"www.farmacity.com" => {
sites::farmacity::parse(url, &tl::parse(body, tl::ParserOptions::default())?)
}
s => bail!("Unknown host {}", s), s => bail!("Unknown host {}", s),
} }
} }

View file

@ -0,0 +1,50 @@
use anyhow::Context;
use simple_error::bail;
use crate::sites::common;
use crate::PrecioPoint;
use super::vtex;
use super::vtex::find_product_ld;
use super::vtex::AvailabilityLd;
pub fn parse(url: String, dom: &tl::VDom) -> Result<PrecioPoint, anyhow::Error> {
let ean = common::get_meta_content(dom, "product:retailer_item_id")
.context("Parsing EAN")?
.to_string();
let precio_centavos = common::price_from_meta(dom)?;
let (name, image_url, in_stock) = match find_product_ld(dom) {
Some(pm) => {
let p = pm?;
(
Some(p.name),
Some(p.image),
Some(
p.offers.offers.first().context("No offer")?.availability
== AvailabilityLd::InStock,
),
)
}
None => bail!("No JSON/LD"),
};
Ok(PrecioPoint {
ean,
fetched_at: crate::now_sec(),
in_stock,
name,
image_url,
parser_version: 5,
precio_centavos,
url,
})
}
pub async fn get_urls() -> anyhow::Result<Vec<String>> {
let urls = vec![
"https://www.farmacity.com/sitemap/product-0.xml",
"https://www.farmacity.com/sitemap/product-1.xml",
];
vtex::get_urls_from_sitemap(urls).await
}

View file

@ -2,5 +2,6 @@ pub mod carrefour;
mod common; mod common;
pub mod coto; pub mod coto;
pub mod dia; pub mod dia;
pub mod farmacity;
pub mod jumbo; pub mod jumbo;
pub mod vtex; pub mod vtex;

View file

@ -6,6 +6,7 @@ pub enum Supermercado {
Jumbo, Jumbo,
Carrefour, Carrefour,
Coto, Coto,
Farmacity,
} }
impl Supermercado { impl Supermercado {
pub fn host(&self) -> &'static str { pub fn host(&self) -> &'static str {
@ -14,6 +15,7 @@ impl Supermercado {
Self::Carrefour => "www.carrefour.com.ar", Self::Carrefour => "www.carrefour.com.ar",
Self::Coto => "www.cotodigital3.com.ar", Self::Coto => "www.cotodigital3.com.ar",
Self::Jumbo => "www.jumbo.com.ar", Self::Jumbo => "www.jumbo.com.ar",
Self::Farmacity => "www.farmacity.com",
} }
} }
} }

View file

@ -18,6 +18,7 @@
[Supermercado.Carrefour]: "bg-[#19549d] focus:ring-[#19549d]", [Supermercado.Carrefour]: "bg-[#19549d] focus:ring-[#19549d]",
[Supermercado.Coto]: "bg-[#e20025] focus:ring-[#e20025]", [Supermercado.Coto]: "bg-[#e20025] focus:ring-[#e20025]",
[Supermercado.Jumbo]: "bg-[#2dc850] focus:ring-[#2dc850]", [Supermercado.Jumbo]: "bg-[#2dc850] focus:ring-[#2dc850]",
[Supermercado.Farmacity]: "bg-[#EF7603] focus:ring-[#EF7603]",
}; };
</script> </script>