Skip to content

Commit abfb84a

Browse files
committed
time added
1 parent eb3729e commit abfb84a

13 files changed

Lines changed: 664 additions & 478 deletions

File tree

.github/workflows/build.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ name: Deploy Scraper and Index to Elastic Cloud
33
on:
44
push:
55
branches:
6-
- build
7-
schedule:
8-
- cron: '*/10 * * * *'
6+
- master
7+
# schedule:
8+
# - cron: '*/10 * * * *'
99

1010
jobs:
1111
deploy:

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ All scraping and indexing are automated using GitHub Actions on a scheduled cron
3434
| GET | `/stats` | Total events, upcoming, cities, categories |
3535
| GET | `/trending` | Trending upcoming events |
3636
| GET | `/recommendations` | Similar events by category and city |
37-
| GET | `/calendar` | Events grouped by date for a given month |
3837
| POST | `/favorites/{event_id}` | Add event to favorites |
3938
| DELETE | `/favorites/{event_id}` | Remove event from favorites |
4039
| GET | `/favorites` | Get favorite events |

elastic/elastic_script.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
from elasticsearch import helpers
2-
from into_db.connection import get_db_events
32
from scrape.casaevents import get_casa_events
43
from scrape.eventbrit import get_event_brit
54
from scrape.eventsma import get_events_ma
65
from scrape.guichet import get_guichet
76
import hashlib
8-
from elastic_client import get_es_client
7+
from elastic.elastic_client import get_es_client
98
import logging
109
import os
1110
from concurrent.futures import ThreadPoolExecutor, as_completed

main.py

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -324,47 +324,6 @@ async def get_favorites(user_id: str = Query("guest")):
324324
return JSONResponse({"error": str(e), "favorites": [], "count": 0}, status_code=500)
325325

326326

327-
@app.get("/calendar")
328-
async def get_calendar_events(month: int = Query(1), year: int = Query(2026)):
329-
try:
330-
start_date = f"{year}-{month:02d}-01"
331-
if month == 12:
332-
end_date = f"{year+1}-01-01"
333-
else:
334-
end_date = f"{year}-{month+1:02d}-01"
335-
336-
response = es.search(
337-
index="events_index",
338-
query={
339-
"range": {
340-
"date.startAt": {
341-
"gte": start_date,
342-
"lt": end_date
343-
}
344-
}
345-
},
346-
size=1000
347-
)
348-
349-
events_by_date = {}
350-
for hit in response["hits"]["hits"]:
351-
event = hit["_source"]
352-
date_key = event.get("date", {}).get("startAt", "").split("T")[0]
353-
if date_key:
354-
if date_key not in events_by_date:
355-
events_by_date[date_key] = []
356-
events_by_date[date_key].append(event)
357-
358-
return {
359-
"month": month,
360-
"year": year,
361-
"events": events_by_date
362-
}
363-
364-
except Exception as e:
365-
return JSONResponse({"error": str(e), "events": {}}, status_code=500)
366-
367-
368327
@app.get("/recommendations")
369328
async def get_recommendations(event_id: str = Query("")):
370329
"""Get recommended events based on similar events"""

scrape/casaevents.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ def get_casa_events():
1010
response = requests.get("https://casaevents.ma/actualites/")
1111
soup = BeautifulSoup(response.text, "html.parser")
1212
results = []
13-
14-
# Fixed: changed "srcipt" to "script"
15-
items = soup.select_one("html > body > div:nth-of-type(3) > script > div:nth-of-type(1) > div > div > div:nth-of-type(2) > div > div > div > div > div > div")
13+
items = soup.select_one("html > body > div:nth-of-type(3) > srcipt > div:nth-of-type(1) > div > div > div:nth-of-type(2) > div > div > div > div > div > div")
1614
if not items:
1715
print("Warning: Could not find events container in casaevents.ma")
1816
return results
@@ -24,27 +22,26 @@ def get_casa_events():
2422
link = item.find("a")['href']
2523
title = item.find("a")['title']
2624
img = item.find("img")['src'] if item.find("img") else ""
27-
date = item.find_all("div")[1].find_all("div")[1].text.strip() if len(item.find_all("div")[1].find_all("div")) > 1 else ""
25+
date = item.find_all("div")[1].find_all("div")[1].text.strip() if len(item.find_all("div")[1].find_all("div")) > 1 else None
2826

2927
resp = requests.get(link)
3028
inside_soup = BeautifulSoup(resp.text, "html.parser")
3129
desc = inside_soup.select_one("div.post_ctn.clearfix div.entry")
3230
categ = inside_soup.select("div.post_ctn.clearfix div.post-info a")
3331

34-
if title != "" and date != "":
32+
if title != "" and date is not None:
3533
send_event = Events(
3634
id = "",
3735
name = title,
3836
img = img,
3937
description = desc.text.strip() if desc and desc.text else "No description available",
4038
date = {
41-
"customDate": "",
39+
"customDate": None,
4240
"startAt": date,
43-
"endAt": "",
41+
"endAt": None,
4442
},
4543
city = "Casablanca",
4644
place = "Casablanca",
47-
# Don't geocode with empty string; use city name instead
4845
coordinates = get_event_coords("Casablanca"),
4946
producer = "Casablanca Events & Animation",
5047
category = [name.text.strip() for name in categ if name.get("rel", []) == ['category', 'tag']] or ["Event"],

scrape/eventbrit.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
from struct_events.get_coords import get_event_coords
55

66

7+
8+
def concat_datetime(date, time):
9+
if date and time:
10+
return f"{date} {time}"
11+
return date or None
12+
713
def get_event_brit():
814

915
results = []
@@ -51,8 +57,6 @@ def get_event_brit():
5157
for obj in data.get("events", []):
5258
place = obj.get("primary_venue", {}).get("address", {}).get("address_1", "")
5359
city = obj.get("primary_venue", {}).get("address", {}).get("city", "")
54-
55-
# Only geocode if city is Casablanca and we have location info
5660
coords = None
5761
if city and "casablanca" in city.lower():
5862
coords = get_event_coords(place) if place else get_event_coords(city)
@@ -63,9 +67,9 @@ def get_event_brit():
6367
img = obj.get("image", {}).get("original", {}).get("url", ""),
6468
description = obj.get("summary", "") or "No description available",
6569
date = {
66-
"customDate": obj.get("published", ""),
67-
"startAt": obj.get("start_date", "") + obj.get("start_time", ""),
68-
"endAt": obj.get("end_date", "") + obj.get("end_time", ""),
70+
"customDate": obj.get("published", None),
71+
"startAt": concat_datetime(obj.get("start_date", None), obj.get("start_time", None)),
72+
"endAt": concat_datetime(obj.get("end_date", None), obj.get("end_time", None)),
6973
},
7074
city = city or "Unknown",
7175
place = place or "Unknown",

scrape/eventsma.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ def get_event(data):
1414

1515
city = event.get("scene", {}).get("city", {}).get("name", "") if event.get("scene", {}) else ""
1616
place = str(event.get("scene", {}).get("libelle", "")) +" "+ str(event.get("scene", {}).get("address", "")) if event.get("scene", {}) else ""
17-
18-
# Only geocode for Casablanca with valid place info
1917
coords = None
2018
if city and "casablanca" in city.lower():
2119
coords = get_event_coords(place) if place and place.strip() else get_event_coords(city)
@@ -26,9 +24,9 @@ def get_event(data):
2624
img = event.get("main_image", ""),
2725
description = event.get("meta_description", "") or "No description available",
2826
date = {
29-
"customDate": event.get("customDate", ""),
30-
"startAt": event.get("date_start", ""),
31-
"endAt": event.get("date_end", ""),
27+
"customDate": event.get("customDate", None),
28+
"startAt": event.get("date_start", None),
29+
"endAt": event.get("date_end", None),
3230
},
3331
city = city or "Unknown",
3432
place = place or "Unknown",

scrape/guichet.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ def get_guichet():
4949
for event in data.get("events", []):
5050
city=event.get("city", {}).get("name", "")
5151
place=event.get("place", {}).get("name", "")
52-
53-
# Only geocode for Casablanca with valid place
5452
coords = None
5553
if city and "casablanca" in city.lower():
5654
coords = get_event_coords(place) if place else get_event_coords(city)
@@ -61,9 +59,9 @@ def get_guichet():
6159
img=event.get("meta", {}).get("image", ""),
6260
description=event.get("meta", {}).get("description", "") or "No description available",
6361
date={
64-
"customDate": event.get("customDate", ""),
65-
"startAt": event.get("startAt", ""),
66-
"endAt": event.get("closingTime", ""),
62+
"customDate": event.get("customDate", None),
63+
"startAt": event.get("startAt", None),
64+
"endAt": event.get("closingTime", None),
6765
},
6866
city=city or "Unknown",
6967
place=place or "Unknown",

static/favicon.svg

Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)