9 Commits

Author SHA1 Message Date
59ef3274b6 Add CLAUDE.md project documentation for session context
Provides automatic context loading for new Claude Code sessions,
documenting architecture, filters, sources, and conventions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:58:01 +01:00
27e5b05f88 Add Bazoš.cz as new apartment scraper source
New scraper for reality.bazos.cz with full HTML parsing (no API),
GPS extraction from Google Maps links, panel/sídliště filtering,
floor/area parsing from free text, and pagination fix for Bazoš's
numeric locality codes. Integrated into merge pipeline and map
with purple (#7B1FA2) markers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 09:47:37 +01:00
63663e4b6b Merge pull request 'Move Realingo scraper to run last' (#6) from fix/scraper-order into main
All checks were successful
Build and Push / build (push) Successful in 6s
Reviewed-on: #6
2026-02-27 21:19:29 +00:00
8c052840cd Move Realingo scraper to run last in pipeline
Reorder scrapers: Sreality → Bezrealitky → iDNES → PSN+CityHome → Realingo → Merge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 21:35:54 +01:00
39e4b9ce2a Merge pull request 'Reliability improvements and cleanup' (#5) from improve/reliability-and-fixes into main
Reviewed-on: #5
2026-02-27 10:26:04 +00:00
Jan Novak
fd3991f8d6 Remove regen_map.py references from Dockerfile and README
All checks were successful
Build and Push / build (push) Successful in 6s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 10:44:08 +01:00
Jan Novak
27a7834eb6 Reliability improvements: retry logic, validation, ratings sync
Some checks failed
Build and Push / build (push) Failing after 4s
- Add 3-attempt retry with exponential backoff to Sreality, Realingo,
  Bezrealitky, and PSN scrapers (CityHome and iDNES already had it)
- Add shared validate_listing() in scraper_stats.py; all 6 scrapers now
  validate GPS bounds, price, area, and required fields before output
- Wire ratings to server /api/ratings on page load (merge with
  localStorage) and save (async POST); ratings now persist across
  browsers and devices
- Namespace JS hash IDs as {source}_{id} to prevent rating collisions
  between listings from different portals with the same numeric ID
- Replace manual Czech diacritic table with unicodedata.normalize()
  in merge_and_map.py for correct deduplication of all edge cases
- Correct README schedule docs: every 4 hours, not twice daily

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 10:36:37 +01:00
57a9f6f21a Add NEW badge for recent listings, text input for price filter, cleanup
- New listings (≤1 day) show yellow NEW badge instead of oversized marker
- Price filter changed from dropdown to text input (max 14M)
- Cap price filter at 14M in JS
- Remove unused regen_map.py
- Remove unused HTMLParser import in scrape_idnes.py

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 21:14:48 +01:00
0ea31d3013 Remove tracked generated/data files and fix map link on status page
- Remove byty_*.json, mapa_bytu.html, .DS_Store and settings.local.json from git tracking
  (already in .gitignore, files kept locally)
- Fix "Otevřít mapu" link on scraper status page: / → /mapa_bytu.html

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 20:42:35 +01:00
26 changed files with 955 additions and 4678 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1,31 +0,0 @@
{
"permissions": {
"allow": [
"WebFetch(domain:github.com)",
"WebFetch(domain:www.sreality.cz)",
"WebFetch(domain:webscraping.pro)",
"WebFetch(domain:raw.githubusercontent.com)",
"Bash(python3:*)",
"Bash(open:*)",
"WebFetch(domain:www.realingo.cz)",
"WebFetch(domain:api.realingo.cz)",
"Bash(curl:*)",
"Bash(grep:*)",
"WebFetch(domain:www.realitni-pes.cz)",
"WebFetch(domain:www.bezrealitky.cz)",
"WebFetch(domain:apify.com)",
"WebFetch(domain:www.bezrealitky.com)",
"WebFetch(domain:reality.idnes.cz)",
"Bash(# Final checks: robots.txt and response time for rate limiting clues curl -s -L -H \"\"User-Agent: Mozilla/5.0 \\(Windows NT 10.0; Win64; x64\\) AppleWebKit/537.36 \\(KHTML, like Gecko\\) Chrome/120.0.0.0 Safari/537.36\"\" \"\"https://reality.idnes.cz/robots.txt\"\")",
"WebFetch(domain:www.cityhome.cz)",
"WebFetch(domain:www.psn.cz)",
"WebFetch(domain:www.city-home.cz)",
"WebFetch(domain:psn.cz)",
"WebFetch(domain:api.psn.cz)",
"Bash(done)",
"Bash(# Final summary: count total units across all projects\n# Get the total count from the unitsCountData we already extracted\necho \"\"From unitsCountData on /prodej page:\"\"\necho \"\" type_id 0 \\(Prodej bytů a ateliérů\\): 146\"\"\necho \"\" type_id 1 \\(Prodej komerčních nemovitostí\\): 14\"\"\necho \"\" type_id 2 \\(Pronájem bytů\\): 3\"\"\necho \"\" type_id 3 \\(Pronájem komerčních nemovitostí\\): 48\"\"\necho \"\"\"\"\necho \"\"Total for-sale projects: 19\"\"\necho \"\"\"\"\necho \"\"Disposition counts from the data:\"\"\npython3 << 'PYEOF'\n# Extract disposition counts from prodej page\nimport re\n\nwith open\\('/tmp/psn_prodej_p1.html', 'r', encoding='utf-8'\\) as f:\n html = f.read\\(\\)\n\n# Find disposition data\nidx = html.find\\('\\\\\\\\\"disposition\\\\\\\\\":['\\)\nif idx >= 0:\n chunk = html[idx:idx+2000].replace\\('\\\\\\\\\"', '\"'\\)\n # Extract name and count pairs\n import re\n pairs = re.findall\\(r'\"name\":\"\\([^\"]+\\)\",\"count\":\\(\\\\d+\\)', chunk\\)\n for name, count in pairs:\n print\\(f\" {name}: {count}\"\\)\nPYEOF)",
"Bash(ls:*)",
"Bash(chmod:*)"
]
}
}

2
.gitignore vendored
View File

@@ -1,6 +1,8 @@
.vscode/
__pycache__/
.DS_Store
byty_*.json
*.json
*.log
mapa_bytu.html

124
CLAUDE.md Normal file
View File

@@ -0,0 +1,124 @@
# Maru hledá byt
Projekt pro hledání bytů v Praze. Scrapuje inzeráty ze 7 realitních portálů, filtruje, deduplikuje a generuje interaktivní mapu.
**Jazyk komunikace:** Čeština (uživatelka Marie). Kód a komentáře v kódu jsou mix CZ/EN.
## Architektura
```
run_all.sh (orchestrátor)
├─ scrape_and_map.py → byty_sreality.json (Sreality API)
├─ scrape_bezrealitky.py → byty_bezrealitky.json (HTML Apollo cache)
├─ scrape_idnes.py → byty_idnes.json (HTML regex)
├─ scrape_psn.py } → byty_psn.json (React API + curl)
├─ scrape_cityhome.py } → byty_cityhome.json (HTML tabulky)
├─ scrape_bazos.py → byty_bazos.json (HTML regex)
└─ scrape_realingo.py → byty_realingo.json (Next.js __NEXT_DATA__)
merge_and_map.py
├─ byty_merged.json (deduplikovaná data)
└─ mapa_bytu.html (Leaflet.js mapa)
generate_status.py → status.json + scraper_history.json
server.py (port 8080) → servíruje mapu + status page + ratings API
```
## Filtry (společné všem scraperům)
| Parametr | Hodnota | Poznámka |
|----------|---------|----------|
| Max cena | 13.5M Kč (Sreality/Realingo/Bezrealitky/iDNES), 14M Kč (PSN/CityHome/Bazoš) | Rozdíl je záměrný |
| Min plocha | 69 m² | |
| Min patro | 2. NP | 2. NP se na mapě označí varováním |
| Dispozice | 3+kk, 3+1, 4+kk, 4+1, 5+kk, 5+1, 6+ | |
| Region | Praha | |
| Vyloučit | panelové domy, sídliště | regex v popisu/polích |
## Klíčové soubory
- **scrape_and_map.py** — Sreality scraper + `generate_map()` funkce (sdílená, generuje HTML mapu)
- **merge_and_map.py** — sloučí 7 JSON zdrojů, deduplikuje (klíč: ulice + cena + plocha), volá `generate_map()`
- **scraper_stats.py** — utility: `validate_listing()` (validace povinných polí + GPS bounds) a `write_stats()`
- **generate_status.py** — generuje status.json a scraper_history.json z výstupů scraperů
- **server.py** — HTTP server (port 8080), endpointy: `/mapa_bytu.html`, `/scrapers-status`, `/api/ratings`, `/api/status`
- **run_all.sh** — orchestrátor, spouští scrapery postupně (PSN+CityHome paralelně), pak merge + status
## Mapa (mapa_bytu.html)
- Leaflet.js + CARTO tiles
- Barvy markerů podle ceny/m² (modrá < 110k → červená > 165k, šedá = neuvedeno)
- PSN/CityHome = srdíčkové markery (❤️)
- Nové inzeráty (≤ 1 den) = žlutý badge "NEW"
- Zamítnuté = zprůhledněné + 🚫 SVG overlay
- Oblíbené = hvězdička (⭐)
- Filtry: patro, max cena (input, default 13.5M, max 14M), datum přidání, skrýt zamítnuté, klik na cenový pás
- Ratings uložené v localStorage + sync na server `/api/ratings`
## Barvy zdrojů na mapě
```python
source_colors = {
"sreality": "#1976D2", # modrá
"realingo": "#00897B", # teal
"bezrealitky": "#E91E63", # růžová
"idnes": "#FF6F00", # oranžová
"psn": "#D32F2F", # červená
"cityhome": "#D32F2F", # červená
"bazos": "#7B1FA2", # fialová
}
```
## Deduplikace (merge_and_map.py)
- Klíč: `normalize_street(locality) + price + area`
- Normalizace ulice: první část před čárkou, lowercase, odstranění diakritiky, jen alfanumerické znaky
- PSN a CityHome mají prioritu (načtou se první)
## Vývoj
- **Git remote:** `https://gitea.home.hrajfrisbee.cz/littlemeat/maru-hleda-byt.git`
- **Gitea API token:** uložen v `.claude/settings.local.json`
- **Python 3.9+** kompatibilita (`from __future__ import annotations`)
- **Žádné pip závislosti** — jen stdlib (urllib, json, re, logging, pathlib, subprocess)
- **Docker:** `build/Dockerfile` (python:3.13-alpine), cron každé 4 hodiny
- Generované soubory (`byty_*.json`, `mapa_bytu.html`, `*.log`) jsou v `.gitignore`
## Typické úlohy
```bash
# Rychlý test scraperu
python3 scrape_bazos.py --max-pages 1 --max-properties 5 --log-level DEBUG
# Lokální validace (všechny scrapery s limity)
make validation-local
# Vygenerovat mapu z existujících dat
python3 merge_and_map.py
# Spustit server
python3 server.py # nebo: make serve
# Plný scrape
./run_all.sh
```
## Pořadí scraperů v run_all.sh
1. Sreality
2. Bezrealitky
3. iDNES
4. PSN + CityHome (paralelně)
5. Bazoš
6. Realingo (poslední — uživatelka ho nemá ráda)
7. Merge + mapa
8. Status generování
## Konvence
- Commit messages v angličtině, PR popis v angličtině
- Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- PRy přes Gitea API (viz create_pr.sh pattern v historii)
- Nové scrapery kopírují vzor z `scrape_bezrealitky.py`
- Každý scraper má argparse s `--max-pages`, `--max-properties`, `--log-level`

View File

@@ -83,10 +83,6 @@ Merges all `byty_*.json` files into `byty_merged.json` and generates `mapa_bytu.
**Deduplication logic:** Two listings are considered duplicates if they share the same normalized street name + price + area. PSN and CityHome have priority during dedup (loaded first), so their listings are kept over duplicates from other portals.
### `regen_map.py`
Regenerates the map from existing `byty_sreality.json` data without re-scraping. Fetches missing area values from the Sreality API, fixes URLs, and re-applies the area filter. Useful for tweaking map output after data has already been collected.
## Interactive map (`mapa_bytu.html`)
The generated map is a standalone HTML file using Leaflet.js with CARTO basemap tiles. Features:
@@ -151,7 +147,7 @@ The project includes a Docker setup for unattended operation with a cron-based s
│ PID 1: python3 -m http.server :8080 │
│ serves /app/data/ │
│ │
│ crond: runs run_all.sh at 06:00/18:00
│ crond: runs run_all.sh every 4 hours
│ Europe/Prague timezone │
│ │
│ /app/ -- scripts (.py, .sh) │
@@ -160,7 +156,7 @@ The project includes a Docker setup for unattended operation with a cron-based s
└─────────────────────────────────────────┘
```
On startup, the HTTP server starts immediately. The initial scrape runs in the background. Subsequent cron runs update data in-place twice daily at 06:00 and 18:00 CET/CEST.
On startup, the HTTP server starts immediately. The initial scrape runs in the background. Subsequent cron runs update data in-place every 4 hours.
### Quick start
@@ -201,14 +197,13 @@ Validation targets run scrapers with `--max-pages 1 --max-properties 10` for a f
├── scrape_psn.py # PSN scraper
├── scrape_cityhome.py # CityHome scraper
├── merge_and_map.py # Merge all sources + generate final map
├── regen_map.py # Regenerate map from cached Sreality data
├── run_all.sh # Orchestrator script (runs all scrapers + merge)
├── mapa_bytu.html # Generated interactive map (output)
├── Makefile # Docker management + validation shortcuts
├── build/
│ ├── Dockerfile # Container image definition (python:3.13-alpine)
│ ├── entrypoint.sh # Container entrypoint (HTTP server + cron + initial scrape)
│ ├── crontab # Cron schedule (06:00 and 18:00 CET)
│ ├── crontab # Cron schedule (every 4 hours)
│ └── CONTAINER.md # Container-specific documentation
└── .gitignore # Ignores byty_*.json, __pycache__, .vscode
```

View File

@@ -11,7 +11,7 @@ WORKDIR /app
COPY scrape_and_map.py scrape_realingo.py scrape_bezrealitky.py \
scrape_idnes.py scrape_psn.py scrape_cityhome.py \
merge_and_map.py regen_map.py generate_status.py scraper_stats.py \
merge_and_map.py generate_status.py scraper_stats.py \
run_all.sh server.py ./
COPY build/crontab /etc/crontabs/root

View File

@@ -1,488 +0,0 @@
[
{
"hash_id": 957149,
"name": "Prodej bytu 3+kk 85 m²",
"price": 13499900,
"price_formatted": "13 499 900 Kč",
"locality": "Hořejší nábřeží, Praha - Smíchov",
"lat": 50.0723994,
"lon": 14.4102987,
"disposition": "3+kk",
"floor": 3,
"area": 85,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/957149-nabidka-prodej-bytu-horejsi-nabrezi-hlavni-mesto-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 994376,
"name": "Prodej bytu 3+1 81 m²",
"price": 11000000,
"price_formatted": "11 000 000 Kč",
"locality": "Volutová, Praha - Stodůlky",
"lat": 50.050274,
"lon": 14.338419380808,
"disposition": "3+1",
"floor": 7,
"area": 81,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/994376-nabidka-prodej-bytu-volutova-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 993725,
"name": "Prodej bytu 3+kk 83 m²",
"price": 13190000,
"price_formatted": "13 190 000 Kč",
"locality": "Práčská, Praha - Záběhlice",
"lat": 50.0531887,
"lon": 14.5100177,
"disposition": "3+kk",
"floor": 2,
"area": 83,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/993725-nabidka-prodej-bytu-pracska-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 972406,
"name": "Prodej bytu 3+kk 83 m²",
"price": 10490000,
"price_formatted": "10 490 000 Kč",
"locality": "Na Výrovně, Praha - Stodůlky",
"lat": 50.0396067,
"lon": 14.3167022,
"disposition": "3+kk",
"floor": 2,
"area": 83,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/972406-nabidka-prodej-bytu-na-vyrovne",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 972686,
"name": "Prodej bytu 3+kk 80 m²",
"price": 11950000,
"price_formatted": "11 950 000 Kč",
"locality": "Dělnická, Praha - Holešovice",
"lat": 50.1034183,
"lon": 14.4549189,
"disposition": "3+kk",
"floor": 6,
"area": 80,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/972686-nabidka-prodej-bytu-delnicka-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 993441,
"name": "Prodej bytu 4+1 85 m²",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Brixiho, Praha - Břevnov",
"lat": 50.0901839,
"lon": 14.3569292,
"disposition": "4+1",
"floor": 3,
"area": 85,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/993441-nabidka-prodej-bytu-brixiho-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 955010,
"name": "Prodej bytu 3+kk 70 m²",
"price": 11900000,
"price_formatted": "11 900 000 Kč",
"locality": "Břeclavská, Praha - Kyje",
"lat": 50.0951045,
"lon": 14.5454237,
"disposition": "3+kk",
"floor": 2,
"area": 70,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/955010-nabidka-prodej-bytu-breclavska-hlavni-mesto-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 967142,
"name": "Prodej bytu 3+kk 78 m²",
"price": 11648000,
"price_formatted": "11 648 000 Kč",
"locality": "Na Míčánkách, Praha - Vršovice",
"lat": 50.0713284,
"lon": 14.4638722,
"disposition": "3+kk",
"floor": 6,
"area": 78,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/967142-nabidka-prodej-bytu-na-micankach",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 981890,
"name": "Prodej bytu 3+1 84 m²",
"price": 12980000,
"price_formatted": "12 980 000 Kč",
"locality": "Novákových, Praha - Libeň",
"lat": 50.103273,
"lon": 14.4746894,
"disposition": "3+1",
"floor": 2,
"area": 84,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/981890-nabidka-prodej-bytu-novakovych-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 991217,
"name": "Prodej bytu 3+kk 71 m²",
"price": 11490000,
"price_formatted": "11 490 000 Kč",
"locality": "Kolbenova, Praha - Vysočany",
"lat": 50.1113213,
"lon": 14.5106858,
"disposition": "3+kk",
"floor": 3,
"area": 71,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/991217-nabidka-prodej-bytu-kolbenova-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 955977,
"name": "Prodej bytu 4+kk 75 m²",
"price": 10363000,
"price_formatted": "10 363 000 Kč",
"locality": "Karla Guta, Praha - Uhříněves",
"lat": 50.03017,
"lon": 14.5940072,
"disposition": "4+kk",
"floor": 4,
"area": 75,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/955977-nabidka-prodej-bytu-karla-guta",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 868801,
"name": "Prodej bytu 3+kk 109 m²",
"price": 7299000,
"price_formatted": "7 299 000 Kč",
"locality": "Pod Karlovem, Praha - Vinohrady",
"lat": 50.0676313,
"lon": 14.432498,
"disposition": "3+kk",
"floor": 5,
"area": 109,
"building_type": "Cihlová",
"ownership": "Družstevní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/868801-nabidka-prodej-bytu-pod-karlovem-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 868795,
"name": "Prodej bytu 3+kk 106 m²",
"price": 6299000,
"price_formatted": "6 299 000 Kč",
"locality": "Pod Karlovem, Praha - Vinohrady",
"lat": 50.0676313,
"lon": 14.432498,
"disposition": "3+kk",
"floor": 2,
"area": 106,
"building_type": "Cihlová",
"ownership": "Družstevní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/868795-nabidka-prodej-bytu-pod-karlovem-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 980187,
"name": "Prodej bytu 3+kk 75 m²",
"price": 12600000,
"price_formatted": "12 600 000 Kč",
"locality": "Jeseniova, Praha - Žižkov",
"lat": 50.0866062,
"lon": 14.4586719,
"disposition": "3+kk",
"floor": 7,
"area": 75,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/980187-nabidka-prodej-bytu-jeseniova-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 990183,
"name": "Prodej bytu 3+kk 86 m²",
"price": 10385000,
"price_formatted": "10 385 000 Kč",
"locality": "Ke Tvrzi, Praha - Královice",
"lat": 50.0390519,
"lon": 14.63862,
"disposition": "3+kk",
"floor": 2,
"area": 86,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/990183-nabidka-prodej-bytu-ke-tvrzi-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 981278,
"name": "Prodej bytu 3+kk 70 m²",
"price": 11890000,
"price_formatted": "11 890 000 Kč",
"locality": "Argentinská, Praha - Holešovice",
"lat": 50.1026043,
"lon": 14.4435365,
"disposition": "3+kk",
"floor": 3,
"area": 70,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/981278-nabidka-prodej-bytu-argentinska-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 974557,
"name": "Prodej bytu 4+kk 94 m²",
"price": 13249900,
"price_formatted": "13 249 900 Kč",
"locality": "V Dolině, Praha - Michle",
"lat": 50.0579963,
"lon": 14.4682887,
"disposition": "4+kk",
"floor": 8,
"area": 94,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/974557-nabidka-prodej-bytu-v-doline-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 989862,
"name": "Prodej bytu 3+kk 73 m²",
"price": 12790000,
"price_formatted": "12 790 000 Kč",
"locality": "Vrázova, Praha - Smíchov",
"lat": 50.0711312,
"lon": 14.4076652,
"disposition": "3+kk",
"floor": 3,
"area": 73,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/989862-nabidka-prodej-bytu-vrazova-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 989817,
"name": "Prodej bytu 3+kk 88 m²",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Miroslava Hajna, Praha - Letňany",
"lat": 50.1406487,
"lon": 14.5207541,
"disposition": "3+kk",
"floor": 2,
"area": 88,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/989817-nabidka-prodej-bytu-miroslava-hajna-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 988498,
"name": "Prodej bytu 3+1 75 m²",
"price": 11250000,
"price_formatted": "11 250 000 Kč",
"locality": "5. května, Praha - Nusle",
"lat": 50.0604096,
"lon": 14.4326302,
"disposition": "3+1",
"floor": 4,
"area": 75,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/988498-nabidka-prodej-bytu-5-kvetna-praha",
"source": "bezrealitky",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 965526,
"name": "Prodej bytu 3+kk 77 m²",
"price": 11890000,
"price_formatted": "11 890 000 Kč",
"locality": "Vinohradská, Praha - Strašnice",
"lat": 50.0776726,
"lon": 14.4870072,
"disposition": "3+kk",
"floor": 16,
"area": 77,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/965526-nabidka-prodej-bytu-vinohradska-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 924811,
"name": "Prodej bytu 3+kk 75 m²",
"price": 13390000,
"price_formatted": "13 390 000 Kč",
"locality": "Waltariho, Praha - Hloubětín",
"lat": 50.1076717,
"lon": 14.5248559,
"disposition": "3+kk",
"floor": 4,
"area": 75,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/924811-nabidka-prodej-bytu-waltariho-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 985859,
"name": "Prodej bytu 3+1 80 m²",
"price": 9000000,
"price_formatted": "9 000 000 Kč",
"locality": "Staňkova, Praha - Háje",
"lat": 50.0377128,
"lon": 14.5311557,
"disposition": "3+1",
"floor": 2,
"area": 80,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/985859-nabidka-prodej-bytu-stankova-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 985583,
"name": "Prodej bytu 3+kk 76 m²",
"price": 10850000,
"price_formatted": "10 850 000 Kč",
"locality": "Boloňská, Praha - Horní Měcholupy",
"lat": 50.047328,
"lon": 14.5565277,
"disposition": "3+kk",
"floor": 4,
"area": 76,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/985583-nabidka-prodej-bytu-bolonska-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 981178,
"name": "Prodej bytu 4+kk 86 m²",
"price": 11990000,
"price_formatted": "11 990 000 Kč",
"locality": "Sušilova, Praha - Uhříněves",
"lat": 50.032081,
"lon": 14.5885148,
"disposition": "4+kk",
"floor": 2,
"area": 86,
"building_type": "SKELET",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/981178-nabidka-prodej-bytu-susilova-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 973216,
"name": "Prodej bytu 4+1 82 m²",
"price": 11357000,
"price_formatted": "11 357 000 Kč",
"locality": "Nad Kapličkou, Praha - Strašnice",
"lat": 50.0839509,
"lon": 14.4904493,
"disposition": "4+1",
"floor": 2,
"area": 82,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/973216-nabidka-prodej-bytu-nad-kaplickou-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 976276,
"name": "Prodej bytu 3+kk 75 m²",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Svornosti, Praha - Smíchov",
"lat": 50.0673284,
"lon": 14.4095087,
"disposition": "3+kk",
"floor": 2,
"area": 75,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/976276-nabidka-prodej-bytu-svornosti-praha",
"source": "bezrealitky",
"image": ""
},
{
"hash_id": 950787,
"name": "Prodej bytu 3+kk 70 m²",
"price": 9999000,
"price_formatted": "9 999 000 Kč",
"locality": "Sečská, Praha - Strašnice",
"lat": 50.071191,
"lon": 14.5035501,
"disposition": "3+kk",
"floor": 3,
"area": 70,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.bezrealitky.cz/nemovitosti-byty-domy/950787-nabidka-prodej-bytu-secska-praha",
"source": "bezrealitky",
"image": ""
}
]

View File

@@ -1,42 +0,0 @@
[
{
"hash_id": "cityhome_na-vaclavce-34_Byt A2.3",
"name": "Prodej bytu 3+1, 99 m² — Na Václavce 34",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Na Václavce 34, Praha 5",
"lat": 50.0652858,
"lon": 14.3931318,
"disposition": "3+1",
"floor": 2,
"area": 99.1,
"building_type": "Cihlová",
"ownership": "neuvedeno",
"url": "https://www.city-home.cz/projekty/na-vaclavce-34/nabidka-nemovitosti/byt-a23",
"source": "cityhome",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "cityhome_na-vaclavce-34_Byt A3.2",
"name": "Prodej bytu 3+1, 95 m² — Na Václavce 34",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Na Václavce 34, Praha 5",
"lat": 50.0652858,
"lon": 14.3931318,
"disposition": "3+1",
"floor": 3,
"area": 95.6,
"building_type": "Cihlová",
"ownership": "neuvedeno",
"url": "https://www.city-home.cz/projekty/na-vaclavce-34/nabidka-nemovitosti/byt-a32",
"source": "cityhome",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
}
]

View File

@@ -1,302 +0,0 @@
[
{
"hash_id": "699c14efa272ce2cb70fdaa9",
"name": "Prodej bytu 3+1 114 m²",
"price": 12990000,
"price_formatted": "12 990 000 Kč",
"locality": "Ortenovo náměstí, Praha 7 - Holešovice, okres Praha",
"lat": 50.1090652,
"lon": 14.4472586,
"disposition": "3+1",
"floor": 6,
"area": 114,
"building_type": "1905",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-7-ortenovo-namesti/699c14efa272ce2cb70fdaa9/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "69a0108318a49f688f07c503",
"name": "Prodej bytu 4+kk 73 m²",
"price": 9490000,
"price_formatted": "9 490 000 Kč",
"locality": "Hlavní, Praha 4 - Záběhlice",
"lat": 50.047243965755754,
"lon": 14.486543203609836,
"disposition": "4+kk",
"floor": 9,
"area": 73,
"building_type": "1961",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-4-hlavni/69a0108318a49f688f07c503/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "699c78a809e67614380916ba",
"name": "Prodej bytu 3+1 85 m²",
"price": 13350000,
"price_formatted": "13 350 000 Kč",
"locality": "Rejskova, Praha 2 - Vinohrady",
"lat": 50.06661305,
"lon": 14.43407117,
"disposition": "3+1",
"floor": 5,
"area": 85,
"building_type": "Cihlová",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-2-rejskova/699c78a809e67614380916ba/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "69a03719a7891063a20f14e4",
"name": "Prodej bytu 3+kk 74 m²",
"price": 12890000,
"price_formatted": "12 890 000 Kč",
"locality": "U michelského mlýna, Praha 4 - Michle, okres Praha",
"lat": 50.0542667,
"lon": 14.4510382,
"disposition": "3+kk",
"floor": 7,
"area": 74,
"building_type": "2009",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-4-u-michelskeho-mlyna/69a03719a7891063a20f14e4/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "69708aa7667a2fa3780f8a16",
"name": "Prodej bytu 3+1 71 m²",
"price": 8350000,
"price_formatted": "8 350 000 Kč",
"locality": "Hlavní, Praha 4 - Záběhlice",
"lat": 50.047489,
"lon": 14.490741,
"disposition": "3+1",
"floor": 9,
"area": 71,
"building_type": "Cihlová",
"ownership": "družstevní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-4-hlavni/69708aa7667a2fa3780f8a16/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "6960e610326c8e2aa50b0e25",
"name": "Prodej bytu 3+kk 80 m²",
"price": 12490000,
"price_formatted": "12 490 000 Kč",
"locality": "Krnkova, Praha",
"lat": 50.056095198944,
"lon": 14.467427477184,
"disposition": "3+kk",
"floor": 6,
"area": 80,
"building_type": "2020",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-krnkova/6960e610326c8e2aa50b0e25/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "68c4c9a1345e0bffba03d7e0",
"name": "Prodej bytu 3+kk 112 m²",
"price": 10990000,
"price_formatted": "10 990 000 Kč",
"locality": "U Prefy, Praha 8 - Ďáblice",
"lat": 50.1445055631,
"lon": 14.4834831086,
"disposition": "3+kk",
"floor": 2,
"area": 112,
"building_type": "Cihlová",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-8-u-prefy/68c4c9a1345e0bffba03d7e0/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "69a00a243781d89dcc03c8bb",
"name": "Prodej bytu 3+1 78 m²",
"price": 9499000,
"price_formatted": "9 499 000 Kč",
"locality": "U kombinátu, Praha 10 - Strašnice",
"lat": 50.076586,
"lon": 14.501454,
"disposition": "3+1",
"floor": 4,
"area": 78,
"building_type": "Cihlová",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-10-u-kombinatu/69a00a243781d89dcc03c8bb/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "64edfa5ce31ee12cdb097cf9",
"name": "Prodej bytu 3+kk 74 m²",
"price": 11634400,
"price_formatted": "11 634 400 Kč",
"locality": "Jáchymovská, Praha 5 - Řeporyje",
"lat": 50.03524802,
"lon": 14.31407393,
"disposition": "3+kk",
"floor": 6,
"area": 74,
"building_type": "Smíšená",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-13-jachymovska/64edfa5ce31ee12cdb097cf9/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "696e54943b8203c996011547",
"name": "Prodej bytu 4+kk 84 m²",
"price": 11990000,
"price_formatted": "11 990 000 Kč",
"locality": "Karla Guta, Praha 10 - Uhříněves",
"lat": 50.030126,
"lon": 14.59409,
"disposition": "4+kk",
"floor": 5,
"area": 84,
"building_type": "Smíšená",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-22-karla-guta/696e54943b8203c996011547/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "689986fe58c2bcbb110a517d",
"name": "Prodej bytu 4+kk 93 m²",
"price": 11008200,
"price_formatted": "11 008 200 Kč",
"locality": "Kuttelwascherova, Praha 9 - Černý Most",
"lat": 50.104792349,
"lon": 14.579679032,
"disposition": "4+kk",
"floor": 5,
"area": 93,
"building_type": "Skeletová",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-14-kuttelwascherova/689986fe58c2bcbb110a517d/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "6859393a57fe2ea99e09a067",
"name": "Prodej bytu 3+1 88 m²",
"price": 9350000,
"price_formatted": "9 350 000 Kč",
"locality": "Cementářská, Praha 5 - Lochkov",
"lat": 50.0034203152,
"lon": 14.3523860807,
"disposition": "3+1",
"floor": 3,
"area": 88,
"building_type": "Cihlová",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-16-cementarska/6859393a57fe2ea99e09a067/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "6992d0c6dffd9162130a26e8",
"name": "Prodej bytu 3+kk 69 m²",
"price": 11853625,
"price_formatted": "11 853 625 Kč",
"locality": "Nekonečného, Praha 5 - Stodůlky",
"lat": 50.042287368666926,
"lon": 14.30696945790677,
"disposition": "3+kk",
"floor": 4,
"area": 69,
"building_type": "Dřevěná",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-13-nekonecneho/6992d0c6dffd9162130a26e8/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "690c2c7b22e38ce1f50ec0c6",
"name": "Prodej bytu 3+1 74 m²",
"price": 12691991,
"price_formatted": "12 691 991 Kč",
"locality": "Svitákova, Praha 5 - Stodůlky",
"lat": 50.0480552778,
"lon": 14.3019416667,
"disposition": "3+1",
"floor": 8,
"area": 74,
"building_type": "Cihlová",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-13-svitakova/690c2c7b22e38ce1f50ec0c6/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": "68d6a0afbe5e2703bd0b1981",
"name": "Prodej bytu 3+kk 82 m²",
"price": 12390000,
"price_formatted": "12 390 000 Kč",
"locality": "Plzeňská, Praha 5 - Košíře",
"lat": 50.071718,
"lon": 14.389139,
"disposition": "3+kk",
"floor": 4,
"area": 82,
"building_type": "Smíšená",
"ownership": "osobní",
"url": "https://reality.idnes.cz/detail/prodej/byt/praha-5-plzenska/68d6a0afbe5e2703bd0b1981/",
"source": "idnes",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +0,0 @@
[
{
"hash_id": "8941",
"name": "Prodej bytu 3+kk, 102 m² — JITRO",
"price": 13994000,
"price_formatted": "13 994 000 Kč",
"locality": "Litevská 1174/8, Praha 10",
"lat": 50.0729,
"lon": 14.4767,
"disposition": "3+kk",
"floor": 2,
"area": 102.7,
"building_type": "neuvedeno",
"ownership": "osobní",
"url": "https://psn.cz/prodej/ubytovaci-jednotka-3-kk-litevska-praha-10-vrsovice-lit4219",
"source": "psn",
"image": "",
"scraped_at": "2026-02-25"
}
]

View File

@@ -1,158 +0,0 @@
[
{
"hash_id": 24516572,
"name": "Prodej bytu Atypický None m²",
"price": 7509000,
"price_formatted": "7 509 000 Kč",
"locality": "Praha, 130 00",
"lat": 50.087602,
"lon": 14.470882,
"disposition": "Atypický",
"floor": null,
"area": null,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": "https://www.realingo.cz/prodej/byt-ostatni-byty-praha-130-00/24516572",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 24516564,
"name": "Prodej bytu Atypický None m²",
"price": 4600000,
"price_formatted": "4 600 000 Kč",
"locality": "Praha, 147 00",
"lat": 50.036745,
"lon": 14.415436,
"disposition": "Atypický",
"floor": null,
"area": null,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": "https://www.realingo.cz/prodej/byt-ostatni-byty-praha-147-00/24516564",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 24516481,
"name": "Prodej bytu Atypický None m²",
"price": 7890000,
"price_formatted": "7 890 000 Kč",
"locality": "Praha, 160 00",
"lat": 50.112102,
"lon": 14.37767,
"disposition": "Atypický",
"floor": null,
"area": null,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": "https://www.realingo.cz/prodej/byt-ostatni-byty-praha-160-00/24516481",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 24516474,
"name": "Prodej bytu Atypický None m²",
"price": 400000,
"price_formatted": "400 000 Kč",
"locality": "Praha, 110 00",
"lat": 50.087334,
"lon": 14.421111,
"disposition": "Atypický",
"floor": null,
"area": null,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": "https://www.realingo.cz/prodej/byt-ostatni-byty-praha-110-00/24516474",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 24516425,
"name": "Prodej bytu Atypický None m²",
"price": 5500000,
"price_formatted": "5 500 000 Kč",
"locality": "Praha, 169 00",
"lat": 50.084959,
"lon": 14.367027,
"disposition": "Atypický",
"floor": null,
"area": null,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": "https://www.realingo.cz/prodej/byt-ostatni-byty-praha-169-00/24516425",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 24516357,
"name": "Prodej bytu Atypický None m²",
"price": 11990000,
"price_formatted": "11 990 000 Kč",
"locality": "Praha, 155 21",
"lat": 50.061933,
"lon": 14.278193,
"disposition": "Atypický",
"floor": null,
"area": null,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": "https://www.realingo.cz/prodej/byt-ostatni-byty-praha-155-21/24516357",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 24515963,
"name": "Prodej bytu 3+kk 83 m²",
"price": 11390000,
"price_formatted": "11 390 000 Kč",
"locality": "Kytlická, Praha",
"lat": 50.1251431182,
"lon": 14.5077027612,
"disposition": "3+kk",
"floor": 4,
"area": 83,
"building_type": "WIREFRAME",
"ownership": "Osobní",
"url": "https://www.realingo.cz/prodej/byt-3+kk-kytlicka-praha/24515963",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-25"
},
{
"hash_id": 24515884,
"name": "Prodej bytu 3+kk 81 m²",
"price": 13000000,
"price_formatted": "13 000 000 Kč",
"locality": "Hlučkova 869, Praha",
"lat": 50.142303781599,
"lon": 14.522362316941,
"disposition": "3+kk",
"floor": 5,
"area": 81,
"building_type": "OTHER",
"ownership": "Osobní",
"url": "https://www.realingo.cz/prodej/byt-3+kk-hluckova-869-praha/24515884",
"source": "realingo",
"image": "",
"scraped_at": "2026-02-25"
}
]

View File

@@ -1,844 +0,0 @@
[
{
"hash_id": 2212697420,
"name": "Prodej bytu 3+kk 72 m²",
"price": 11597281,
"price_formatted": "11 597 281 Kč",
"locality": "Marie Podvalové, Praha - Čakovice",
"lat": 50.157696,
"lon": 14.519159,
"disposition": "3+kk",
"floor": 2,
"area": 72,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-marie-podvalove/2212697420",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/kBfrbpoeNBFLmuEg8FriINk/3911.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-25"
},
{
"hash_id": 3719308108,
"name": "Prodej bytu 3+kk 72 m²",
"price": 12863000,
"price_formatted": "12 863 000 Kč",
"locality": "Toufarova, Praha 5 - Stodůlky",
"lat": 50.042961,
"lon": 14.312009,
"disposition": "3+kk",
"floor": 3,
"area": 72,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-stodulky-toufarova/3719308108",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_D/kY1K2LlXQCEs3VE7BF4VZQX/e29c.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1837527884,
"name": "Prodej bytu 3+kk 73 m² (Jednopodlažní)",
"price": 12790000,
"price_formatted": "12 790 000 Kč",
"locality": "Vrázova, Praha - Smíchov",
"lat": 50.071224,
"lon": 14.407872,
"disposition": "3+kk",
"floor": 3,
"area": 73,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-smichov-vrazova/1837527884",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/nPXMbbUsvqW7e6HoBFuXCRZ/a9bd.png?fl=res,400,300,3|shr,,20|jpg,90"
},
{
"hash_id": 151528268,
"name": "Prodej bytu 3+kk 86 m²",
"price": 11390000,
"price_formatted": "11 390 000 Kč",
"locality": "Spojovací, Praha",
"lat": 50.101852,
"lon": 14.486118,
"disposition": "3+kk",
"floor": 2,
"area": 86,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha--spojovaci/151528268",
"image": "https://d18-a.sdn.cz/d_18/c_img_of_C/kPxr1WDRoIBXSQV6LE550j7/1607.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-25"
},
{
"hash_id": 1909416780,
"name": "Prodej bytu 3+kk 71 m² (Jednopodlažní)",
"price": 12550000,
"price_formatted": "12 550 000 Kč",
"locality": "Hindlova, Praha 9 - Vysočany",
"lat": 50.110931,
"lon": 14.519487,
"disposition": "3+kk",
"floor": 3,
"area": 71,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-hindlova/1909416780",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_B/nPVpfd5QLLDoMo7DJhFyicrF/b128.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 2090386252,
"name": "Prodej bytu 3+kk 71 m² (Jednopodlažní)",
"price": 11990000,
"price_formatted": "11 990 000 Kč",
"locality": "Hindlova, Praha 9 - Vysočany",
"lat": 50.110931,
"lon": 14.519487,
"disposition": "3+kk",
"floor": 9,
"area": 71,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-hindlova/2090386252",
"image": "https://d18-a.sdn.cz/d_18/c_img_oe_B/nO1Ur3YPjB17k9miElAvH7/f738.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1652388428,
"name": "Prodej bytu 3+kk 72 m²",
"price": 12793080,
"price_formatted": "12 793 080 Kč",
"locality": "Kolbenova, Praha 9 - Vysočany",
"lat": 50.11219,
"lon": 14.506794,
"disposition": "3+kk",
"floor": 2,
"area": 72,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-kolbenova/1652388428",
"image": "https://d18-a.sdn.cz/d_18/c_img_oX_C/kb9Yg2GWeC36sVf5CpMXaz/5362.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3911689036,
"name": "Prodej bytu 3+kk 84 m²",
"price": 12614240,
"price_formatted": "12 614 240 Kč",
"locality": "Strašnická, Praha 10 - Záběhlice",
"lat": 50.058334,
"lon": 14.513746,
"disposition": "3+kk",
"floor": 2,
"area": 84,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-zabehlice-strasnicka/3911689036",
"image": "https://d18-a.sdn.cz/d_18/c_img_oa_D/nO7kYQIzllD73rqCuJDkZI2p/67e2.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 938877772,
"name": "Prodej bytu 3+kk 99 m²",
"price": 12990000,
"price_formatted": "12 990 000 Kč",
"locality": "Čeljabinská, Praha 10 - Vršovice",
"lat": 50.069641,
"lon": 14.470198,
"disposition": "3+kk",
"floor": 3,
"area": 99,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vrsovice-celjabinska/938877772",
"image": "https://d18-a.sdn.cz/d_18/c_img_p7_D/kBfrbpoeNBLdvLCneFodIxL/21cc.jpeg?fl=res,400,300,3|shr,,20|jpg,90"
},
{
"hash_id": 1021510476,
"name": "Prodej bytu 3+kk 80 m²",
"price": 12690000,
"price_formatted": "12 690 000 Kč",
"locality": "Novotného, Praha 5 - Hlubočepy",
"lat": 50.027798,
"lon": 14.365065,
"disposition": "3+kk",
"floor": 5,
"area": 80,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-hlubocepy-novotneho/1021510476",
"image": "https://d18-a.sdn.cz/d_18/c_img_p7_B/kOzkBkwYBTDPt7SN3RFeuwx2/31bb.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3939726156,
"name": "Prodej bytu 3+kk 91 m²",
"price": 10480000,
"price_formatted": "10 480 000 Kč",
"locality": "Danielova, Praha 9 - Čakovice",
"lat": 50.153698,
"lon": 14.530779,
"disposition": "3+kk",
"floor": 2,
"area": 91,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-danielova/3939726156",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/nPXMbbUsvqB8gfpFRBFqbRqp/042a.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 21418828,
"name": "Prodej bytu 3+kk 95 m²",
"price": 11650000,
"price_formatted": "11 650 000 Kč",
"locality": "Na Harfě, Praha 9 - Vysočany",
"lat": 50.102989,
"lon": 14.501802,
"disposition": "3+kk",
"floor": 6,
"area": 95,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-na-harfe/21418828",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/kY1K2LlXQBsPCGDivF180IZ/5caf.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3226313292,
"name": "Prodej bytu 3+kk 83 m²",
"price": 13500000,
"price_formatted": "13 500 000 Kč",
"locality": "Na Neklance, Praha 5 - Smíchov",
"lat": 50.060715,
"lon": 14.401836,
"disposition": "3+kk",
"floor": 4,
"area": 83,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-smichov-na-neklance/3226313292",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/kBfrbpoeND2I1YDy2Fq7ErU/6389.jpeg?fl=res,400,300,3|shr,,20|jpg,90"
},
{
"hash_id": 1671439692,
"name": "Prodej bytu 3+kk 77 m²",
"price": 12556524,
"price_formatted": "12 556 524 Kč",
"locality": "Marie Podvalové, Praha - Čakovice",
"lat": 50.157696,
"lon": 14.519159,
"disposition": "3+kk",
"floor": 3,
"area": 77,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-marie-podvalove/1671439692",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/nPXMbbUsvqW7e6HmhFuWvTy/67cb.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3596645196,
"name": "Prodej bytu 3+kk 88 m²",
"price": 13499000,
"price_formatted": "13 499 000 Kč",
"locality": "Plzeňská, Praha 5 - Stodůlky",
"lat": 50.061039,
"lon": 14.306672,
"disposition": "3+kk",
"floor": 2,
"area": 88,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-stodulky-plzenska/3596645196",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_B/kY1K2LlXQD1lSJBBqFwbfKY/2e73.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1313456972,
"name": "Prodej bytu 3+kk 87 m²",
"price": 3641309,
"price_formatted": "3 641 309 Kč",
"locality": "Praha 9",
"lat": 50.106956,
"lon": 14.510207,
"disposition": "3+kk",
"floor": 5,
"area": 87,
"building_type": "Smíšená",
"ownership": "Družstevní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-praha-9-/1313456972",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_B/kY1K2LlXQBsPCGXMFvI8II/9010.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3330433868,
"name": "Prodej bytu 3+kk 93 m²",
"price": 11890000,
"price_formatted": "11 890 000 Kč",
"locality": "Kříženeckého náměstí, Praha 5 - Hlubočepy",
"lat": 50.03138,
"lon": 14.391757,
"disposition": "3+kk",
"floor": 2,
"area": 93,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-hlubocepy-krizeneckeho-namesti/3330433868",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLChvUCFgIF2b8p9/bffb.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3248993100,
"name": "Prodej bytu 3+kk 106 m² (Jednopodlažní)",
"price": 12490000,
"price_formatted": "12 490 000 Kč",
"locality": "Na Plískavě, Praha 10 - Hostivař",
"lat": 50.051746,
"lon": 14.526683,
"disposition": "3+kk",
"floor": 2,
"area": 106,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-hostivar-na-pliskave/3248993100",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLBPLz5G96F4N0ox/1ed0.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1137623884,
"name": "Prodej bytu 3+kk 71 m²",
"price": 12318349,
"price_formatted": "12 318 349 Kč",
"locality": "Praha 9",
"lat": 50.106956,
"lon": 14.510207,
"disposition": "3+kk",
"floor": 4,
"area": 71,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-praha-9-/1137623884",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_B/nPVpfd5QLLksKHbwFvjCd6/56ac.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3621479244,
"name": "Prodej bytu 3+kk 79 m² (Mezonet)",
"price": 12900000,
"price_formatted": "12 900 000 Kč",
"locality": "Bulharská, Praha 10 - Vršovice",
"lat": 50.071842,
"lon": 14.46282,
"disposition": "3+kk",
"floor": 5,
"area": 79,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vrsovice-bulharska/3621479244",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_B/kY1K2LlXQBsPCGCYTFziI73/ff9c.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3802198860,
"name": "Prodej bytu 3+kk 82 m²",
"price": 11133000,
"price_formatted": "11 133 000 Kč",
"locality": "K Vinoři, Praha - Kbely",
"lat": 50.133003,
"lon": 14.56198,
"disposition": "3+kk",
"floor": 2,
"area": 82,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-kbely-k-vinori/3802198860",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/kY1K2LlXQBdLY8CyQF0JORJ/7bca.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3672994636,
"name": "Prodej bytu 3+kk 81 m²",
"price": 12390000,
"price_formatted": "12 390 000 Kč",
"locality": "Stochovská, Praha 6 - Ruzyně",
"lat": 50.082985,
"lon": 14.311815,
"disposition": "3+kk",
"floor": 3,
"area": 81,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-ruzyne-stochovska/3672994636",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLD53UiFNrF2fBro/c20c.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3540804428,
"name": "Prodej bytu 3+kk 86 m²",
"price": 10990000,
"price_formatted": "10 990 000 Kč",
"locality": "Žateckých, Praha 4 - Nusle",
"lat": 50.060452,
"lon": 14.434322,
"disposition": "3+kk",
"floor": 3,
"area": 86,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-nusle-zateckych/3540804428",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLDqzReFdYF2mM3n/96cd.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 4070581580,
"name": "Prodej bytu 3+kk 77 m²",
"price": 12207113,
"price_formatted": "12 207 113 Kč",
"locality": "Marie Podvalové, Praha - Čakovice",
"lat": 50.157696,
"lon": 14.519159,
"disposition": "3+kk",
"floor": 2,
"area": 77,
"building_type": "Skeletová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-marie-podvalove/4070581580",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/kBfrbpoeNBFLmuFzPFuWw0w/0867.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 2185458508,
"name": "Prodej bytu 3+kk 76 m²",
"price": 11978000,
"price_formatted": "11 978 000 Kč",
"locality": "Matoušova, Praha - Smíchov",
"lat": 50.074284,
"lon": 14.405826,
"disposition": "3+kk",
"floor": 2,
"area": 76,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-smichov-matousova/2185458508",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLD53UiGQ6F3vZse/37db.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 975307596,
"name": "Prodej bytu 3+kk 75 m²",
"price": 11550000,
"price_formatted": "11 550 000 Kč",
"locality": "K Lahovské, Praha 5 - Lochkov",
"lat": 50.003479,
"lon": 14.362226,
"disposition": "3+kk",
"floor": 2,
"area": 75,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-lochkov-k-lahovske/975307596",
"image": "https://d18-a.sdn.cz/d_18/c_img_p7_D/kBfrbpoeNBP53ED7tFobUOy/4b5c.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1196299084,
"name": "Prodej bytu 3+kk 90 m²",
"price": 13450000,
"price_formatted": "13 450 000 Kč",
"locality": "Mantovská, Praha 10 - Horní Měcholupy",
"lat": 50.041126,
"lon": 14.569748,
"disposition": "3+kk",
"floor": 3,
"area": 90,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-horni-mecholupy-mantovska/1196299084",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_A/nPXMbbUsvqB6axWJHGFuUhM9/ab40.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 65700684,
"name": "Prodej bytu 3+kk 77 m²",
"price": 12391000,
"price_formatted": "12 391 000 Kč",
"locality": "Kutnohorská, Praha 10 - Dolní Měcholupy",
"lat": 50.057732,
"lon": 14.561535,
"disposition": "3+kk",
"floor": 2,
"area": 77,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-dolni-mecholupy-kutnohorska/65700684",
"image": "https://d18-a.sdn.cz/d_18/c_img_og_C/nDJ4VEZEqxmIDGjIFPUKAS/9490.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3704697676,
"name": "Prodej bytu 3+kk 72 m²",
"price": 8000000,
"price_formatted": "8 000 000 Kč",
"locality": "Litevská, Praha 10 - Vršovice",
"lat": 50.072536,
"lon": 14.476557,
"disposition": "3+kk",
"floor": 5,
"area": 72,
"building_type": "Cihlová",
"ownership": "Družstevní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vrsovice-litevska/3704697676",
"image": "https://d18-a.sdn.cz/d_18/c_img_of_A/nOztZkD4ZlC2Y2EU6E0MiZv/15fc.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 961934156,
"name": "Prodej bytu 3+kk 71 m²",
"price": 13220749,
"price_formatted": "13 220 749 Kč",
"locality": "Vršní, Praha 8 - Kobylisy",
"lat": 50.124489,
"lon": 14.453209,
"disposition": "3+kk",
"floor": 2,
"area": 71,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+kk/praha-kobylisy-vrsni/961934156",
"image": "https://d18-a.sdn.cz/d_18/c_img_oc_D/nO0bgvR9rXB3JbECjvEL5uOS/a3c9.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 868311884,
"name": "Prodej bytu 3+1 85 m² (Jednopodlažní)",
"price": 13350000,
"price_formatted": "13 350 000 Kč",
"locality": "Rejskova, Praha 2 - Vinohrady",
"lat": 50.066612,
"lon": 14.43407,
"disposition": "3+1",
"floor": 2,
"area": 85,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-vinohrady-rejskova/868311884",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLEA4WVFjPF2n27n/5da6.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 793797452,
"name": "Prodej bytu 3+1 97 m²",
"price": 9290000,
"price_formatted": "9 290 000 Kč",
"locality": "Oldřichova, Praha 2 - Nusle",
"lat": 50.065617,
"lon": 14.428337,
"disposition": "3+1",
"floor": 5,
"area": 97,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-nusle-oldrichova/793797452",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLbHLYGD3F3FBWE/510b.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1071539020,
"name": "Prodej bytu 3+1 99 m²",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Na Václavce, Praha 5 - Smíchov",
"lat": 50.065289,
"lon": 14.393119,
"disposition": "3+1",
"floor": 2,
"area": 99,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-smichov-na-vaclavce/1071539020",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/kY1K2LlXQB7HUzD4bF2mEWg/29a9.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 977601356,
"name": "Prodej bytu 3+1 71 m²",
"price": 8350000,
"price_formatted": "8 350 000 Kč",
"locality": "Hlavní, Praha 4 - Záběhlice",
"lat": 50.047489,
"lon": 14.490741,
"disposition": "3+1",
"floor": 6,
"area": 71,
"building_type": "Cihlová",
"ownership": "Družstevní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-zabehlice-hlavni/977601356",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/kY1K2LlXQBdLY89XF4Rua9/f98c.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 2792387404,
"name": "Prodej bytu 3+1 94 m² (Mezonet)",
"price": 10990000,
"price_formatted": "10 990 000 Kč",
"locality": "Spojařů, Praha 5 - Zbraslav",
"lat": 49.964233,
"lon": 14.395434,
"disposition": "3+1",
"floor": 3,
"area": 94,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-zbraslav-spojaru/2792387404",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/kY1K2LlXQDnuVLD5PF2jXiq/d294.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3881198412,
"name": "Prodej bytu 3+1 77 m² (Jednopodlažní)",
"price": 9499000,
"price_formatted": "9 499 000 Kč",
"locality": "U kombinátu, Praha 10 - Strašnice",
"lat": 50.076588,
"lon": 14.501454,
"disposition": "3+1",
"floor": 4,
"area": 77,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-strasnice-u-kombinatu/3881198412",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLbHLYHCQF4N96R/5bd2.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1180791628,
"name": "Prodej bytu 3+1 70 m² (Jednopodlažní)",
"price": 8880000,
"price_formatted": "8 880 000 Kč",
"locality": "V předpolí, Praha 10 - Strašnice",
"lat": 50.070919,
"lon": 14.482954,
"disposition": "3+1",
"floor": 2,
"area": 70,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-strasnice-v-predpoli/1180791628",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLDqk1BGpqF368WL/336a.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3469083468,
"name": "Prodej bytu 3+1 97 m² (Jednopodlažní)",
"price": 11099000,
"price_formatted": "11 099 000 Kč",
"locality": "Školní, Praha 4 - Braník",
"lat": 50.037449,
"lon": 14.413369,
"disposition": "3+1",
"floor": 2,
"area": 97,
"building_type": "Smíšená",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-branik-skolni/3469083468",
"image": "https://d18-a.sdn.cz/d_18/c_img_p7_C/nDJ4VEZEqCaOxZXb4Fir3Ja/a5fd.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 3475837772,
"name": "Prodej bytu 3+1 77 m²",
"price": 9400000,
"price_formatted": "9 400 000 Kč",
"locality": "Žitavského, Praha - Zbraslav",
"lat": 49.968777,
"lon": 14.394235,
"disposition": "3+1",
"floor": 2,
"area": 77,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-zbraslav-zitavskeho/3475837772",
"image": "https://d18-a.sdn.cz/d_18/c_img_og_B/kOzkBkwYBTBCGZ9ErEFK4fVz/a27d.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 77820748,
"name": "Prodej bytu 3+1 80 m² (Jednopodlažní)",
"price": 9990000,
"price_formatted": "9 990 000 Kč",
"locality": "U Svépomoci, Praha - Nusle",
"lat": 50.054306,
"lon": 14.441881,
"disposition": "3+1",
"floor": 2,
"area": 80,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-nusle-u-svepomoci/77820748",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLEA4WVEEhF0vEN4/6425.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 2609607500,
"name": "Prodej bytu 3+1 84 m² (Jednopodlažní)",
"price": 13300000,
"price_formatted": "13 300 000 Kč",
"locality": "Bubenské nábřeží, Praha 7 - Holešovice",
"lat": 50.098339,
"lon": 14.447381,
"disposition": "3+1",
"floor": 3,
"area": 84,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-holesovice-bubenske-nabrezi/2609607500",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLChvUCDwJF0SNOF/fc50.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 2119304012,
"name": "Prodej bytu 3+1 70 m² (Jednopodlažní)",
"price": 8490000,
"price_formatted": "8 490 000 Kč",
"locality": "Plzeňská, Praha 5 - Smíchov",
"lat": 50.070713,
"lon": 14.37893,
"disposition": "3+1",
"floor": 2,
"area": 70,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-smichov-plzenska/2119304012",
"image": "https://d18-a.sdn.cz/d_18/c_img_p7_B/kOzkBkwYBTDPt7SOGcFfM6Tu/dbaa.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 266232652,
"name": "Prodej bytu 3+1 96 m²",
"price": 13490000,
"price_formatted": "13 490 000 Kč",
"locality": "Na Václavce, Praha 5 - Smíchov",
"lat": 50.065289,
"lon": 14.393119,
"disposition": "3+1",
"floor": 3,
"area": 96,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-smichov-na-vaclavce/266232652",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLDoMo7HHbF2mEnR/2364.jpeg?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1547395660,
"name": "Prodej bytu 3+1 85 m² (Mezonet)",
"price": 10750000,
"price_formatted": "10 750 000 Kč",
"locality": "Březová, Praha 8 - Kobylisy",
"lat": 50.135719,
"lon": 14.477155,
"disposition": "3+1",
"floor": 2,
"area": 85,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-kobylisy-brezova/1547395660",
"image": "https://d18-a.sdn.cz/d_18/c_img_oX_E/kb9Yg2GWeDo8QnqrCwThxx/b96e.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
},
{
"hash_id": 1954308940,
"name": "Prodej bytu 3+1 91 m²",
"price": 13500000,
"price_formatted": "13 500 000 Kč",
"locality": "Biskupcova, Praha 3 - Žižkov",
"lat": 50.089592,
"lon": 14.470283,
"disposition": "3+1",
"floor": 2,
"area": 91,
"building_type": "Cihlová",
"ownership": "Osobní",
"url": "https://www.sreality.cz/detail/prodej/byt/3+1/praha-zizkov-biskupcova/1954308940",
"image": "https://d18-a.sdn.cz/d_18/c_img_p8_C/nPVpfd5QLLDqzReDNNFzuek8/dd6c.png?fl=res,400,300,3|shr,,20|jpg,90",
"scraped_at": "2026-02-26",
"first_seen": "2026-02-26",
"last_changed": "2026-02-26"
}
]

View File

@@ -1,693 +0,0 @@
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Byty v Praze — mapa (96 bytů)</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: system-ui, -apple-system, sans-serif; }
#map { width: 100%; height: 100vh; }
.heart-icon { background: none !important; border: none !important; }
.star-icon { background: none !important; border: none !important; }
.rate-btn:hover { background: #f0f0f0 !important; }
.rate-btn.active-fav { background: #FFF9C4 !important; border-color: #FFC107 !important; }
.rate-btn.active-rej { background: #FFEBEE !important; border-color: #F44336 !important; }
@keyframes pulse-glow {
0% { box-shadow: 0 0 4px 2px rgba(255, 193, 7, 0.4); }
50% { box-shadow: 0 0 10px 5px rgba(255, 193, 7, 0.7); }
100% { box-shadow: 0 0 4px 2px rgba(255, 193, 7, 0.4); }
}
.marker-favorite { animation: pulse-glow 2s ease-in-out infinite; border-radius: 50%; }
.heart-icon-fav svg path { stroke: gold !important; stroke-width: 2.5 !important; filter: drop-shadow(0 0 4px rgba(255,193,7,0.7)); }
.heart-icon-rej { opacity: 0.4 !important; filter: grayscale(1); }
.reject-overlay { background: none !important; border: none !important; pointer-events: none !important; }
@keyframes pulse-new {
0% { stroke-opacity: 1; stroke-width: 3px; r: 11; }
50% { stroke-opacity: 0.4; stroke-width: 6px; r: 12; }
100% { stroke-opacity: 1; stroke-width: 3px; r: 11; }
}
.marker-new { animation: pulse-new 2s ease-in-out infinite; }
.info-panel {
position: absolute; top: 10px; right: 10px; z-index: 1000;
background: white; padding: 16px; border-radius: 10px;
box-shadow: 0 2px 12px rgba(0,0,0,0.15); max-width: 260px;
font-size: 13px; line-height: 1.5;
transition: transform 0.3s ease, opacity 0.3s ease;
}
.info-panel.collapsed {
transform: translateX(calc(100% + 20px));
opacity: 0; pointer-events: none;
}
.panel-open-btn {
position: absolute; top: 10px; right: 10px; z-index: 1001;
width: 40px; height: 40px; border-radius: 8px;
background: white; border: none; cursor: pointer;
box-shadow: 0 2px 12px rgba(0,0,0,0.15);
font-size: 20px; display: flex; align-items: center; justify-content: center;
transition: opacity 0.3s ease;
}
.panel-open-btn.hidden { opacity: 0; pointer-events: none; }
.panel-close-btn {
position: absolute; top: 8px; right: 8px;
width: 28px; height: 28px; border-radius: 6px;
background: none; border: 1px solid #ddd; cursor: pointer;
font-size: 16px; display: flex; align-items: center; justify-content: center;
color: #888;
}
.panel-close-btn:hover { background: #f0f0f0; color: #333; }
.info-panel h2 { font-size: 16px; margin-bottom: 8px; }
.info-panel .stats { color: #666; margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px solid #eee; }
.filter-section { margin-top: 10px; padding-top: 10px; border-top: 1px solid #eee; }
.filter-section label { display: flex; align-items: center; gap: 6px; margin: 3px 0; cursor: pointer; }
.price-band { cursor: pointer; transition: background 0.12s; }
.price-band:hover { background: #f0f0f0; }
.price-band.active { border-color: #333 !important; background: #e8f0fe; }
.price-band.dimmed { opacity: 0.35; }
.filter-section input[type="checkbox"] { accent-color: #1976D2; }
#floor-filter { margin-top: 8px; }
#floor-filter select { width: 100%; padding: 4px; border-radius: 4px; border: 1px solid #ccc; }
.status-link { display: block; margin-top: 10px; padding-top: 10px; border-top: 1px solid #eee; text-align: center; }
.status-link a { color: #1976D2; text-decoration: none; font-size: 12px; }
@media (max-width: 600px) {
.info-panel { max-width: calc(100vw - 60px); right: 10px; }
.info-panel.collapsed { transform: translateX(calc(100% + 20px)); }
.panel-close-btn { top: 6px; right: 6px; }
}
</style>
</head>
<body>
<div id="map"></div>
<button class="panel-open-btn hidden" id="panel-open-btn" onclick="togglePanel()"></button>
<div class="info-panel" id="info-panel">
<button class="panel-close-btn" id="panel-close-btn" onclick="togglePanel()"></button>
<h2>Byty v Praze</h2>
<div class="stats">
<div>Celkem: <b id="visible-count">96</b> bytů</div>
<div>Cena: 400 000 Kč — 13 994 000 Kč</div>
<div>Průměr: 11 284 590 Kč</div>
</div>
<div style="margin-bottom:4px;font-size:12px;color:#555;font-weight:600;">Cena / m²:</div><div class="price-band" data-color="#1565C0" onclick="toggleColorFilter('#1565C0')" style="display:flex;align-items:center;gap:6px;margin:2px 0;padding:2px 4px;border-radius:4px;border:2px solid transparent;"><span style="width:14px;height:14px;border-radius:50%;background:#1565C0;display:inline-block;border:2px solid white;box-shadow:0 1px 3px rgba(0,0,0,0.3);flex-shrink:0;"></span><span>< 110 000 /m²</span></div><div class="price-band" data-color="#42A5F5" onclick="toggleColorFilter('#42A5F5')" style="display:flex;align-items:center;gap:6px;margin:2px 0;padding:2px 4px;border-radius:4px;border:2px solid transparent;"><span style="width:14px;height:14px;border-radius:50%;background:#42A5F5;display:inline-block;border:2px solid white;box-shadow:0 1px 3px rgba(0,0,0,0.3);flex-shrink:0;"></span><span>110 130 000 Kč/m²</span></div><div class="price-band" data-color="#66BB6A" onclick="toggleColorFilter('#66BB6A')" style="display:flex;align-items:center;gap:6px;margin:2px 0;padding:2px 4px;border-radius:4px;border:2px solid transparent;"><span style="width:14px;height:14px;border-radius:50%;background:#66BB6A;display:inline-block;border:2px solid white;box-shadow:0 1px 3px rgba(0,0,0,0.3);flex-shrink:0;"></span><span>130 150 000 Kč/m²</span></div><div class="price-band" data-color="#EF6C00" onclick="toggleColorFilter('#EF6C00')" style="display:flex;align-items:center;gap:6px;margin:2px 0;padding:2px 4px;border-radius:4px;border:2px solid transparent;"><span style="width:14px;height:14px;border-radius:50%;background:#EF6C00;display:inline-block;border:2px solid white;box-shadow:0 1px 3px rgba(0,0,0,0.3);flex-shrink:0;"></span><span>150 165 000 Kč/m²</span></div><div class="price-band" data-color="#C62828" onclick="toggleColorFilter('#C62828')" style="display:flex;align-items:center;gap:6px;margin:2px 0;padding:2px 4px;border-radius:4px;border:2px solid transparent;"><span style="width:14px;height:14px;border-radius:50%;background:#C62828;display:inline-block;border:2px solid white;box-shadow:0 1px 3px rgba(0,0,0,0.3);flex-shrink:0;"></span><span>> 165 000 Kč/m²</span></div><div class="price-band" data-color="#9E9E9E" onclick="toggleColorFilter('#9E9E9E')" style="display:flex;align-items:center;gap:6px;margin:2px 0;padding:2px 4px;border-radius:4px;border:2px solid transparent;"><span style="width:14px;height:14px;border-radius:50%;background:#9E9E9E;display:inline-block;border:2px solid white;box-shadow:0 1px 3px rgba(0,0,0,0.3);flex-shrink:0;"></span><span>cena/plocha neuvedena</span></div><div id="price-filter-reset" style="display:none;margin:3px 0 0 4px;"><a href="#" onclick="resetColorFilter();return false;" style="font-size:11px;color:#1976D2;text-decoration:none;">✕ Zobrazit všechny ceny</a></div><div style="display:flex;align-items:center;gap:6px;margin:6px 0 0 0;padding-top:6px;border-top:1px solid #eee;"><span style="width:18px;height:18px;border-radius:50%;background:#66BB6A;display:inline-block;box-shadow:0 1px 4px rgba(0,0,0,0.35);flex-shrink:0;"></span><span>Nové (z dnešního scrapu) — větší</span></div><div style="margin-top:8px;padding-top:6px;border-top:1px solid #eee;font-size:12px;color:#666;">3+kk (57), 3+1 (25), 4+kk (6), 4+1 (2)</div><div style="display:flex;align-items:center;gap:6px;margin:8px 0 3px 0;padding-top:6px;border-top:1px solid #eee;"><svg width="14" height="14" viewBox="0 0 24 24"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 C2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" fill="#D32F2F"/></svg><span>PSN / CityHome (3)</span></div>
<div class="filter-section">
<b>Filtry:</b>
<div id="floor-filter">
<label>Patro od:
<select id="min-floor" onchange="applyFilters()">
<option value="2">2. NP (vše)</option>
<option value="3">3. NP+</option>
<option value="4">4. NP+</option>
<option value="5">5. NP+</option>
</select>
</label>
</div>
<div style="margin-top:6px;">
<label>Max cena:
<select id="max-price" onchange="applyFilters()">
<option value="13500000">13 500 000 Kč</option>
<option value="12000000">12 000 000 Kč</option>
<option value="10000000">10 000 000 Kč</option>
<option value="8000000">8 000 000 Kč</option>
</select>
</label>
</div>
<div style="margin-top:6px;">
<label>Přidáno / změněno:
<select id="days-filter" onchange="applyFilters()" style="width:100%;padding:4px;border-radius:4px;border:1px solid #ccc;">
<option value="0">Vše</option>
<option value="1">za 1 den</option>
<option value="2">za 2 dny</option>
<option value="3">za 3 dny</option>
<option value="4">za 4 dny</option>
<option value="5">za 5 dní</option>
<option value="7">za 7 dní</option>
<option value="14">za 14 dní</option>
<option value="30">za 30 dní</option>
</select>
</label>
</div>
</div>
<div class="filter-section">
<div id="rating-counts" style="margin-bottom:6px;font-size:12px;color:#666;">
⭐ 0 oblíbených, 🚫 0 zamítnutých
</div>
<label>
<input type="checkbox" id="hide-rejected" onchange="applyFilters()">
Skrýt zamítnuté
</label>
</div>
<div class="status-link"><a href="/scrapers-status">Scraper status</a></div>
</div>
<script>
// Prague center
var map = L.map('map').setView([50.075, 14.437], 12);
L.tileLayer('https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}{r}.png', {
attribution: '&copy; OpenStreetMap contributors &copy; CARTO',
maxZoom: 19,
subdomains: 'abcd',
}).addTo(map);
// Labels as separate layer on top (so markers sit between background and labels)
L.tileLayer('https://{s}.basemaps.cartocdn.com/light_only_labels/{z}/{x}/{y}{r}.png', {
maxZoom: 19,
subdomains: 'abcd',
pane: 'shadowPane',
}).addTo(map);
var selectedColors = [];
function toggleColorFilter(color) {
var idx = selectedColors.indexOf(color);
if (idx >= 0) selectedColors.splice(idx, 1);
else selectedColors.push(color);
document.querySelectorAll('.price-band').forEach(function(el) {
var c = el.getAttribute('data-color');
if (selectedColors.length === 0) {
el.classList.remove('active', 'dimmed');
} else if (selectedColors.indexOf(c) >= 0) {
el.classList.add('active'); el.classList.remove('dimmed');
} else {
el.classList.add('dimmed'); el.classList.remove('active');
}
});
document.getElementById('price-filter-reset').style.display =
selectedColors.length > 0 ? 'block' : 'none';
applyFilters();
}
function resetColorFilter() {
selectedColors = [];
document.querySelectorAll('.price-band').forEach(function(el) {
el.classList.remove('active', 'dimmed');
});
document.getElementById('price-filter-reset').style.display = 'none';
applyFilters();
}
var allMarkers = [];
function addMarker(lat, lon, color, popup, hashId, firstSeen, lastChanged) {
var marker = L.circleMarker([lat, lon], {
radius: 8,
fillColor: color,
color: '#fff',
weight: 2,
opacity: 1,
fillOpacity: 0.85,
}).bindPopup(popup);
marker._data = { lat: lat, lon: lon, color: color, hashId: hashId, firstSeen: firstSeen || '', lastChanged: lastChanged || '' };
allMarkers.push(marker);
marker.addTo(map);
}
function addNewMarker(lat, lon, color, popup, hashId, firstSeen, lastChanged) {
var marker = L.circleMarker([lat, lon], {
radius: 12,
fillColor: color,
color: color,
weight: 4,
opacity: 0.35,
fillOpacity: 0.95,
}).bindPopup(popup);
marker._data = { lat: lat, lon: lon, color: color, hashId: hashId, isNew: true, firstSeen: firstSeen || '', lastChanged: lastChanged || '' };
allMarkers.push(marker);
marker.addTo(map);
marker.on('add', function() {
if (marker._path) marker._path.classList.add('marker-new');
});
}
function heartIcon(color) {
var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">'
+ '<path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 '
+ 'C2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 '
+ '14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 '
+ '11.54L12 21.35z" fill="' + color + '" stroke="white" stroke-width="1.5"/></svg>';
return L.divIcon({
html: svg,
className: 'heart-icon',
iconSize: [24, 24],
iconAnchor: [12, 22],
popupAnchor: [0, -18],
});
}
function starIcon() {
var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24">'
+ '<path d="M12 2l3.09 6.26L22 9.27l-5 4.87L18.18 22 12 18.27 '
+ '5.82 22 7 14.14 2 9.27l6.91-1.01L12 2z" '
+ 'fill="#FFC107" stroke="#F57F17" stroke-width="1" '
+ 'filter="drop-shadow(0 1px 3px rgba(0,0,0,0.3))"/></svg>';
return L.divIcon({
html: svg,
className: 'star-icon',
iconSize: [28, 28],
iconAnchor: [14, 14],
popupAnchor: [0, -14],
});
}
function addHeartMarker(lat, lon, color, popup, hashId, firstSeen, lastChanged) {
var marker = L.marker([lat, lon], {
icon: heartIcon(color),
}).bindPopup(popup);
marker._data = { lat: lat, lon: lon, color: color, hashId: hashId, isHeart: true, firstSeen: firstSeen || '', lastChanged: lastChanged || '' };
allMarkers.push(marker);
marker.addTo(map);
}
addHeartMarker(50.0729, 14.4767, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="8941" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 994 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#D32F2F;color:white;padding:1px 6px;border-radius:3px;">PSN</span><br><span style="color:#666;">3+kk | 102.7 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Litevská 1174/8, Praha 10</b><br>Stavba: neuvedeno<br>Vlastnictví: osobní<br><br><a href="https://psn.cz/prodej/ubytovaci-jednotka-3-kk-litevska-praha-10-vrsovice-lit4219" target="_blank" style="color:#D32F2F;text-decoration:none;font-weight:bold;">→ Otevřít na PSN</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '8941', '', '');
addHeartMarker(50.0652858, 14.3931318, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="cityhome_na-vaclavce-34_Byt A2.3" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#D32F2F;color:white;padding:1px 6px;border-radius:3px;">CityHome</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 99.1 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Na Václavce 34, Praha 5</b><br>Stavba: Cihlová<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.city-home.cz/projekty/na-vaclavce-34/nabidka-nemovitosti/byt-a23" target="_blank" style="color:#D32F2F;text-decoration:none;font-weight:bold;">→ Otevřít na CityHome</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', 'cityhome_na-vaclavce-34_Byt A2.3', '2026-02-26', '2026-02-26');
addHeartMarker(50.0652858, 14.3931318, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="cityhome_na-vaclavce-34_Byt A3.2" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#D32F2F;color:white;padding:1px 6px;border-radius:3px;">CityHome</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 95.6 m² | 3. NP</span><br><br><b>Na Václavce 34, Praha 5</b><br>Stavba: Cihlová<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.city-home.cz/projekty/na-vaclavce-34/nabidka-nemovitosti/byt-a32" target="_blank" style="color:#D32F2F;text-decoration:none;font-weight:bold;">→ Otevřít na CityHome</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', 'cityhome_na-vaclavce-34_Byt A3.2', '2026-02-26', '2026-02-26');
addMarker(50.157696, 14.519159, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="2212697420" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 597 281 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><br><span style="color:#666;">3+kk | 72 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Marie Podvalové, Praha - Čakovice</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-marie-podvalove/2212697420" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '2212697420', '', '');
addNewMarker(50.042961, 14.312009, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3719308108" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 863 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 72 m² | 3. NP</span><br><br><b>Toufarova, Praha 5 - Stodůlky</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-stodulky-toufarova/3719308108" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3719308108', '2026-02-26', '2026-02-26');
addMarker(50.071224, 14.407872, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1837527884" data-first-seen="" data-last-changed=""><b style="font-size:14px;">12 790 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><br><span style="color:#666;">3+kk | 73 m² | 3. NP</span><br><br><b>Vrázova, Praha - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-smichov-vrazova/1837527884" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1837527884', '', '');
addMarker(50.101852, 14.486118, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="151528268" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 390 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><br><span style="color:#666;">3+kk | 86 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Spojovací, Praha</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha--spojovaci/151528268" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '151528268', '', '');
addNewMarker(50.110931, 14.519487, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1909416780" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 550 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 71 m² | 3. NP</span><br><br><b>Hindlova, Praha 9 - Vysočany</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-hindlova/1909416780" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1909416780', '2026-02-26', '2026-02-26');
addNewMarker(50.110931, 14.519487, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="2090386252" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 71 m² | 9. NP</span><br><br><b>Hindlova, Praha 9 - Vysočany</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-hindlova/2090386252" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '2090386252', '2026-02-26', '2026-02-26');
addNewMarker(50.11219, 14.506794, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1652388428" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 793 080 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 72 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Kolbenova, Praha 9 - Vysočany</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-kolbenova/1652388428" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1652388428', '2026-02-26', '2026-02-26');
addNewMarker(50.058334, 14.513746, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3911689036" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 614 240 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 84 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Strašnická, Praha 10 - Záběhlice</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-zabehlice-strasnicka/3911689036" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3911689036', '2026-02-26', '2026-02-26');
addMarker(50.069641, 14.470198, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="938877772" data-first-seen="" data-last-changed=""><b style="font-size:14px;">12 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><br><span style="color:#666;">3+kk | 99 m² | 3. NP</span><br><br><b>Čeljabinská, Praha 10 - Vršovice</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vrsovice-celjabinska/938877772" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '938877772', '', '');
addNewMarker(50.027798, 14.365065, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1021510476" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 690 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 80 m² | 5. NP</span><br><br><b>Novotného, Praha 5 - Hlubočepy</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-hlubocepy-novotneho/1021510476" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1021510476', '2026-02-26', '2026-02-26');
addNewMarker(50.153698, 14.530779, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3939726156" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">10 480 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 91 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Danielova, Praha 9 - Čakovice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-danielova/3939726156" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3939726156', '2026-02-26', '2026-02-26');
addNewMarker(50.102989, 14.501802, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="21418828" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 650 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 95 m² | 6. NP</span><br><br><b>Na Harfě, Praha 9 - Vysočany</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vysocany-na-harfe/21418828" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '21418828', '2026-02-26', '2026-02-26');
addMarker(50.060715, 14.401836, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3226313292" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 500 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><br><span style="color:#666;">3+kk | 83 m² | 4. NP</span><br><br><b>Na Neklance, Praha 5 - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-smichov-na-neklance/3226313292" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3226313292', '', '');
addNewMarker(50.157696, 14.519159, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1671439692" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 556 524 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 77 m² | 3. NP</span><br><br><b>Marie Podvalové, Praha - Čakovice</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-marie-podvalove/1671439692" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1671439692', '2026-02-26', '2026-02-26');
addNewMarker(50.061039, 14.306672, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3596645196" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 499 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 88 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Plzeňská, Praha 5 - Stodůlky</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-stodulky-plzenska/3596645196" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3596645196', '2026-02-26', '2026-02-26');
addNewMarker(50.106956, 14.510207, '#1565C0', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1313456972" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">3 641 309 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 87 m² | 5. NP</span><br><br><b>Praha 9</b><br>Stavba: Smíšená<br>Vlastnictví: Družstevní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-praha-9-/1313456972" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1313456972', '2026-02-26', '2026-02-26');
addNewMarker(50.03138, 14.391757, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3330433868" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 890 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 93 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Kříženeckého náměstí, Praha 5 - Hlubočepy</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-hlubocepy-krizeneckeho-namesti/3330433868" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3330433868', '2026-02-26', '2026-02-26');
addNewMarker(50.051746, 14.526683, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3248993100" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 106 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Na Plískavě, Praha 10 - Hostivař</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-hostivar-na-pliskave/3248993100" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3248993100', '2026-02-26', '2026-02-26');
addNewMarker(50.106956, 14.510207, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1137623884" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 318 349 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 71 m² | 4. NP</span><br><br><b>Praha 9</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-praha-9-/1137623884" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1137623884', '2026-02-26', '2026-02-26');
addNewMarker(50.071842, 14.46282, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3621479244" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 900 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 79 m² | 5. NP</span><br><br><b>Bulharská, Praha 10 - Vršovice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vrsovice-bulharska/3621479244" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3621479244', '2026-02-26', '2026-02-26');
addNewMarker(50.133003, 14.56198, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3802198860" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 133 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 82 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>K Vinoři, Praha - Kbely</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-kbely-k-vinori/3802198860" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3802198860', '2026-02-26', '2026-02-26');
addNewMarker(50.082985, 14.311815, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3672994636" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 390 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 81 m² | 3. NP</span><br><br><b>Stochovská, Praha 6 - Ruzyně</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-ruzyne-stochovska/3672994636" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3672994636', '2026-02-26', '2026-02-26');
addNewMarker(50.060452, 14.434322, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3540804428" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">10 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 86 m² | 3. NP</span><br><br><b>Žateckých, Praha 4 - Nusle</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-nusle-zateckych/3540804428" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3540804428', '2026-02-26', '2026-02-26');
addNewMarker(50.157696, 14.519159, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="4070581580" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 207 113 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 77 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Marie Podvalové, Praha - Čakovice</b><br>Stavba: Skeletová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-cakovice-marie-podvalove/4070581580" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '4070581580', '2026-02-26', '2026-02-26');
addNewMarker(50.074284, 14.405826, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="2185458508" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 978 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 76 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Matoušova, Praha - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-smichov-matousova/2185458508" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '2185458508', '2026-02-26', '2026-02-26');
addNewMarker(50.003479, 14.362226, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="975307596" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 550 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 75 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>K Lahovské, Praha 5 - Lochkov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-lochkov-k-lahovske/975307596" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '975307596', '2026-02-26', '2026-02-26');
addNewMarker(50.041126, 14.569748, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1196299084" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 450 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 90 m² | 3. NP</span><br><br><b>Mantovská, Praha 10 - Horní Měcholupy</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-horni-mecholupy-mantovska/1196299084" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1196299084', '2026-02-26', '2026-02-26');
addNewMarker(50.057732, 14.561535, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="65700684" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 391 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 77 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Kutnohorská, Praha 10 - Dolní Měcholupy</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-dolni-mecholupy-kutnohorska/65700684" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '65700684', '2026-02-26', '2026-02-26');
addNewMarker(50.072536, 14.476557, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3704697676" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">8 000 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 72 m² | 5. NP</span><br><br><b>Litevská, Praha 10 - Vršovice</b><br>Stavba: Cihlová<br>Vlastnictví: Družstevní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-vrsovice-litevska/3704697676" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3704697676', '2026-02-26', '2026-02-26');
addNewMarker(50.124489, 14.453209, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="961934156" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 220 749 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 71 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Vršní, Praha 8 - Kobylisy</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+kk/praha-kobylisy-vrsni/961934156" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '961934156', '2026-02-26', '2026-02-26');
addNewMarker(50.066612, 14.43407, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="868311884" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 350 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 85 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Rejskova, Praha 2 - Vinohrady</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-vinohrady-rejskova/868311884" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '868311884', '2026-02-26', '2026-02-26');
addNewMarker(50.065617, 14.428337, '#1565C0', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="793797452" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 290 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 97 m² | 5. NP</span><br><br><b>Oldřichova, Praha 2 - Nusle</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-nusle-oldrichova/793797452" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '793797452', '2026-02-26', '2026-02-26');
addNewMarker(50.065289, 14.393119, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1071539020" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 99 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Na Václavce, Praha 5 - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-smichov-na-vaclavce/1071539020" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1071539020', '2026-02-26', '2026-02-26');
addNewMarker(50.047489, 14.490741, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="977601356" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">8 350 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 71 m² | 6. NP</span><br><br><b>Hlavní, Praha 4 - Záběhlice</b><br>Stavba: Cihlová<br>Vlastnictví: Družstevní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-zabehlice-hlavni/977601356" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '977601356', '2026-02-26', '2026-02-26');
addNewMarker(49.964233, 14.395434, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="2792387404" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">10 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 94 m² | 3. NP</span><br><br><b>Spojařů, Praha 5 - Zbraslav</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-zbraslav-spojaru/2792387404" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '2792387404', '2026-02-26', '2026-02-26');
addNewMarker(50.076588, 14.501454, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3881198412" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 499 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 77 m² | 4. NP</span><br><br><b>U kombinátu, Praha 10 - Strašnice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-strasnice-u-kombinatu/3881198412" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3881198412', '2026-02-26', '2026-02-26');
addNewMarker(50.070919, 14.482954, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1180791628" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">8 880 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 70 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>V předpolí, Praha 10 - Strašnice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-strasnice-v-predpoli/1180791628" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1180791628', '2026-02-26', '2026-02-26');
addNewMarker(50.037449, 14.413369, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3469083468" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 099 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 97 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Školní, Praha 4 - Braník</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-branik-skolni/3469083468" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3469083468', '2026-02-26', '2026-02-26');
addNewMarker(49.968777, 14.394235, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="3475837772" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 400 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 77 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Žitavského, Praha - Zbraslav</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-zbraslav-zitavskeho/3475837772" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '3475837772', '2026-02-26', '2026-02-26');
addNewMarker(50.054306, 14.441881, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="77820748" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 80 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>U Svépomoci, Praha - Nusle</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-nusle-u-svepomoci/77820748" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '77820748', '2026-02-26', '2026-02-26');
addNewMarker(50.098339, 14.447381, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="2609607500" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 300 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 84 m² | 3. NP</span><br><br><b>Bubenské nábřeží, Praha 7 - Holešovice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-holesovice-bubenske-nabrezi/2609607500" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '2609607500', '2026-02-26', '2026-02-26');
addNewMarker(50.070713, 14.37893, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="2119304012" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">8 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 70 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Plzeňská, Praha 5 - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-smichov-plzenska/2119304012" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '2119304012', '2026-02-26', '2026-02-26');
addNewMarker(50.065289, 14.393119, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="266232652" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 96 m² | 3. NP</span><br><br><b>Na Václavce, Praha 5 - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-smichov-na-vaclavce/266232652" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '266232652', '2026-02-26', '2026-02-26');
addNewMarker(50.135719, 14.477155, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1547395660" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">10 750 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 85 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Březová, Praha 8 - Kobylisy</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-kobylisy-brezova/1547395660" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1547395660', '2026-02-26', '2026-02-26');
addNewMarker(50.089592, 14.470283, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="1954308940" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">13 500 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#1976D2;color:white;padding:1px 6px;border-radius:3px;">Sreality</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 91 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Biskupcova, Praha 3 - Žižkov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.sreality.cz/detail/prodej/byt/3+1/praha-zizkov-biskupcova/1954308940" target="_blank" style="color:#1976D2;text-decoration:none;font-weight:bold;">→ Otevřít na Sreality</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '1954308940', '2026-02-26', '2026-02-26');
addNewMarker(50.087602, 14.470882, '#9E9E9E', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24516572" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">7 509 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">Atypický | neuvedeno | neuvedeno</span><br><br><b>Praha, 130 00</b><br>Stavba: neuvedeno<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.realingo.cz/prodej/byt-ostatni-byty-praha-130-00/24516572" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24516572', '2026-02-26', '2026-02-26');
addNewMarker(50.036745, 14.415436, '#9E9E9E', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24516564" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">4 600 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">Atypický | neuvedeno | neuvedeno</span><br><br><b>Praha, 147 00</b><br>Stavba: neuvedeno<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.realingo.cz/prodej/byt-ostatni-byty-praha-147-00/24516564" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24516564', '2026-02-26', '2026-02-26');
addNewMarker(50.112102, 14.37767, '#9E9E9E', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24516481" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">7 890 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">Atypický | neuvedeno | neuvedeno</span><br><br><b>Praha, 160 00</b><br>Stavba: neuvedeno<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.realingo.cz/prodej/byt-ostatni-byty-praha-160-00/24516481" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24516481', '2026-02-26', '2026-02-26');
addNewMarker(50.087334, 14.421111, '#9E9E9E', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24516474" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">400 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">Atypický | neuvedeno | neuvedeno</span><br><br><b>Praha, 110 00</b><br>Stavba: neuvedeno<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.realingo.cz/prodej/byt-ostatni-byty-praha-110-00/24516474" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24516474', '2026-02-26', '2026-02-26');
addNewMarker(50.084959, 14.367027, '#9E9E9E', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24516425" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">5 500 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">Atypický | neuvedeno | neuvedeno</span><br><br><b>Praha, 169 00</b><br>Stavba: neuvedeno<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.realingo.cz/prodej/byt-ostatni-byty-praha-169-00/24516425" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24516425', '2026-02-26', '2026-02-26');
addNewMarker(50.061933, 14.278193, '#9E9E9E', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24516357" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">Atypický | neuvedeno | neuvedeno</span><br><br><b>Praha, 155 21</b><br>Stavba: neuvedeno<br>Vlastnictví: neuvedeno<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://www.realingo.cz/prodej/byt-ostatni-byty-praha-155-21/24516357" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24516357', '2026-02-26', '2026-02-26');
addMarker(50.1251431182, 14.5077027612, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24515963" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 390 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><br><span style="color:#666;">3+kk | 83 m² | 4. NP</span><br><br><b>Kytlická, Praha</b><br>Stavba: WIREFRAME<br>Vlastnictví: Osobní<br><br><a href="https://www.realingo.cz/prodej/byt-3+kk-kytlicka-praha/24515963" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24515963', '', '');
addMarker(50.142303781599, 14.522362316941, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="24515884" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 000 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#00897B;color:white;padding:1px 6px;border-radius:3px;">Realingo</span><br><span style="color:#666;">3+kk | 81 m² | 5. NP</span><br><br><b>Hlučkova 869, Praha</b><br>Stavba: OTHER<br>Vlastnictví: Osobní<br><br><a href="https://www.realingo.cz/prodej/byt-3+kk-hluckova-869-praha/24515884" target="_blank" style="color:#00897B;text-decoration:none;font-weight:bold;">→ Otevřít na Realingo</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '24515884', '', '');
addMarker(50.0723994, 14.4102987, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="957149" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 499 900 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 85 m² | 3. NP</span><br><br><b>Hořejší nábřeží, Praha - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/957149-nabidka-prodej-bytu-horejsi-nabrezi-hlavni-mesto-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '957149', '', '');
addMarker(50.050274, 14.338419380808, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="994376" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 000 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+1 | 81 m² | 7. NP</span><br><br><b>Volutová, Praha - Stodůlky</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/994376-nabidka-prodej-bytu-volutova-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '994376', '', '');
addMarker(50.0531887, 14.5100177, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="993725" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 190 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 83 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Práčská, Praha - Záběhlice</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/993725-nabidka-prodej-bytu-pracska-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '993725', '', '');
addMarker(50.0396067, 14.3167022, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="972406" data-first-seen="" data-last-changed=""><b style="font-size:14px;">10 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 83 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Na Výrovně, Praha - Stodůlky</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/972406-nabidka-prodej-bytu-na-vyrovne" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '972406', '', '');
addMarker(50.1034183, 14.4549189, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="972686" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 950 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 80 m² | 6. NP</span><br><br><b>Dělnická, Praha - Holešovice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/972686-nabidka-prodej-bytu-delnicka-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '972686', '', '');
addMarker(50.0901839, 14.3569292, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="993441" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">4+1 | 85 m² | 3. NP</span><br><br><b>Brixiho, Praha - Břevnov</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/993441-nabidka-prodej-bytu-brixiho-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '993441', '', '');
addMarker(50.0951045, 14.5454237, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="955010" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 900 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 70 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Břeclavská, Praha - Kyje</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/955010-nabidka-prodej-bytu-breclavska-hlavni-mesto-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '955010', '', '');
addMarker(50.0713284, 14.4638722, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="967142" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 648 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 78 m² | 6. NP</span><br><br><b>Na Míčánkách, Praha - Vršovice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/967142-nabidka-prodej-bytu-na-micankach" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '967142', '', '');
addMarker(50.103273, 14.4746894, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="981890" data-first-seen="" data-last-changed=""><b style="font-size:14px;">12 980 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+1 | 84 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Novákových, Praha - Libeň</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/981890-nabidka-prodej-bytu-novakovych-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '981890', '', '');
addMarker(50.1113213, 14.5106858, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="991217" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 71 m² | 3. NP</span><br><br><b>Kolbenova, Praha - Vysočany</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/991217-nabidka-prodej-bytu-kolbenova-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '991217', '', '');
addMarker(50.03017, 14.5940072, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="955977" data-first-seen="" data-last-changed=""><b style="font-size:14px;">10 363 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">4+kk | 75 m² | 4. NP</span><br><br><b>Karla Guta, Praha - Uhříněves</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/955977-nabidka-prodej-bytu-karla-guta" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '955977', '', '');
addMarker(50.0676313, 14.432498, '#1565C0', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="868801" data-first-seen="" data-last-changed=""><b style="font-size:14px;">7 299 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 109 m² | 5. NP</span><br><br><b>Pod Karlovem, Praha - Vinohrady</b><br>Stavba: Cihlová<br>Vlastnictví: Družstevní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/868801-nabidka-prodej-bytu-pod-karlovem-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '868801', '', '');
addMarker(50.0676313, 14.432498, '#1565C0', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="868795" data-first-seen="" data-last-changed=""><b style="font-size:14px;">6 299 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 106 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Pod Karlovem, Praha - Vinohrady</b><br>Stavba: Cihlová<br>Vlastnictví: Družstevní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/868795-nabidka-prodej-bytu-pod-karlovem-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '868795', '', '');
addMarker(50.0866062, 14.4586719, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="980187" data-first-seen="" data-last-changed=""><b style="font-size:14px;">12 600 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 75 m² | 7. NP</span><br><br><b>Jeseniova, Praha - Žižkov</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/980187-nabidka-prodej-bytu-jeseniova-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '980187', '', '');
addMarker(50.0390519, 14.63862, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="990183" data-first-seen="" data-last-changed=""><b style="font-size:14px;">10 385 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 86 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Ke Tvrzi, Praha - Královice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/990183-nabidka-prodej-bytu-ke-tvrzi-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '990183', '', '');
addMarker(50.1026043, 14.4435365, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="981278" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 890 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 70 m² | 3. NP</span><br><br><b>Argentinská, Praha - Holešovice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/981278-nabidka-prodej-bytu-argentinska-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '981278', '', '');
addMarker(50.0579963, 14.4682887, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="974557" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 249 900 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">4+kk | 94 m² | 8. NP</span><br><br><b>V Dolině, Praha - Michle</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/974557-nabidka-prodej-bytu-v-doline-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '974557', '', '');
addMarker(50.1406487, 14.5207541, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="989817" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 88 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Miroslava Hajna, Praha - Letňany</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/989817-nabidka-prodej-bytu-miroslava-hajna-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '989817', '', '');
addMarker(50.0604096, 14.4326302, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="988498" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 250 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+1 | 75 m² | 4. NP</span><br><br><b>5. května, Praha - Nusle</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/988498-nabidka-prodej-bytu-5-kvetna-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '988498', '', '');
addMarker(50.0776726, 14.4870072, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="965526" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 890 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 77 m² | 16. NP</span><br><br><b>Vinohradská, Praha - Strašnice</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/965526-nabidka-prodej-bytu-vinohradska-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '965526', '', '');
addMarker(50.1076717, 14.5248559, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="924811" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 390 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 75 m² | 4. NP</span><br><br><b>Waltariho, Praha - Hloubětín</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/924811-nabidka-prodej-bytu-waltariho-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '924811', '', '');
addMarker(50.0377128, 14.5311557, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="985859" data-first-seen="" data-last-changed=""><b style="font-size:14px;">9 000 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+1 | 80 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Staňkova, Praha - Háje</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/985859-nabidka-prodej-bytu-stankova-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '985859', '', '');
addMarker(50.047328, 14.5565277, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="985583" data-first-seen="" data-last-changed=""><b style="font-size:14px;">10 850 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 76 m² | 4. NP</span><br><br><b>Boloňská, Praha - Horní Měcholupy</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/985583-nabidka-prodej-bytu-bolonska-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '985583', '', '');
addMarker(50.032081, 14.5885148, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="981178" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">4+kk | 86 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Sušilova, Praha - Uhříněves</b><br>Stavba: SKELET<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/981178-nabidka-prodej-bytu-susilova-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '981178', '', '');
addMarker(50.0839509, 14.4904493, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="973216" data-first-seen="" data-last-changed=""><b style="font-size:14px;">11 357 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">4+1 | 82 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Nad Kapličkou, Praha - Strašnice</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/973216-nabidka-prodej-bytu-nad-kaplickou-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '973216', '', '');
addMarker(50.0673284, 14.4095087, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="976276" data-first-seen="" data-last-changed=""><b style="font-size:14px;">13 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 75 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>Svornosti, Praha - Smíchov</b><br>Stavba: Cihlová<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/976276-nabidka-prodej-bytu-svornosti-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '976276', '', '');
addMarker(50.071191, 14.5035501, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="950787" data-first-seen="" data-last-changed=""><b style="font-size:14px;">9 999 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#E91E63;color:white;padding:1px 6px;border-radius:3px;">Bezrealitky</span><br><span style="color:#666;">3+kk | 70 m² | 3. NP</span><br><br><b>Sečská, Praha - Strašnice</b><br>Stavba: Smíšená<br>Vlastnictví: Osobní<br><br><a href="https://www.bezrealitky.cz/nemovitosti-byty-domy/950787-nabidka-prodej-bytu-secska-praha" target="_blank" style="color:#E91E63;text-decoration:none;font-weight:bold;">→ Otevřít na Bezrealitky</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '950787', '', '');
addNewMarker(50.1090652, 14.4472586, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="699c14efa272ce2cb70fdaa9" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 114 m² | 6. NP</span><br><br><b>Ortenovo náměstí, Praha 7 - Holešovice, okres Praha</b><br>Stavba: 1905<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-7-ortenovo-namesti/699c14efa272ce2cb70fdaa9/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '699c14efa272ce2cb70fdaa9', '2026-02-26', '2026-02-26');
addNewMarker(50.047243965755754, 14.486543203609836, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="69a0108318a49f688f07c503" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">4+kk | 73 m² | 9. NP</span><br><br><b>Hlavní, Praha 4 - Záběhlice</b><br>Stavba: 1961<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-4-hlavni/69a0108318a49f688f07c503/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '69a0108318a49f688f07c503', '2026-02-26', '2026-02-26');
addNewMarker(50.0542667, 14.4510382, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="69a03719a7891063a20f14e4" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 890 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 74 m² | 7. NP</span><br><br><b>U michelského mlýna, Praha 4 - Michle, okres Praha</b><br>Stavba: 2009<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-4-u-michelskeho-mlyna/69a03719a7891063a20f14e4/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '69a03719a7891063a20f14e4', '2026-02-26', '2026-02-26');
addNewMarker(50.056095198944, 14.467427477184, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="6960e610326c8e2aa50b0e25" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 490 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 80 m² | 6. NP</span><br><br><b>Krnkova, Praha</b><br>Stavba: 2020<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-krnkova/6960e610326c8e2aa50b0e25/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '6960e610326c8e2aa50b0e25', '2026-02-26', '2026-02-26');
addNewMarker(50.1445055631, 14.4834831086, '#1565C0', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="68c4c9a1345e0bffba03d7e0" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">10 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 112 m² | 2. NP</span><br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span><br><br><b>U Prefy, Praha 8 - Ďáblice</b><br>Stavba: Cihlová<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-8-u-prefy/68c4c9a1345e0bffba03d7e0/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '68c4c9a1345e0bffba03d7e0', '2026-02-26', '2026-02-26');
addNewMarker(50.076586, 14.501454, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="69a00a243781d89dcc03c8bb" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 499 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 78 m² | 4. NP</span><br><br><b>U kombinátu, Praha 10 - Strašnice</b><br>Stavba: Cihlová<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-10-u-kombinatu/69a00a243781d89dcc03c8bb/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '69a00a243781d89dcc03c8bb', '2026-02-26', '2026-02-26');
addNewMarker(50.03524802, 14.31407393, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="64edfa5ce31ee12cdb097cf9" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 634 400 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 74 m² | 6. NP</span><br><br><b>Jáchymovská, Praha 5 - Řeporyje</b><br>Stavba: Smíšená<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-13-jachymovska/64edfa5ce31ee12cdb097cf9/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '64edfa5ce31ee12cdb097cf9', '2026-02-26', '2026-02-26');
addNewMarker(50.030126, 14.59409, '#66BB6A', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="696e54943b8203c996011547" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 990 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">4+kk | 84 m² | 5. NP</span><br><br><b>Karla Guta, Praha 10 - Uhříněves</b><br>Stavba: Smíšená<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-22-karla-guta/696e54943b8203c996011547/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '696e54943b8203c996011547', '2026-02-26', '2026-02-26');
addNewMarker(50.104792349, 14.579679032, '#42A5F5', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="689986fe58c2bcbb110a517d" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 008 200 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">4+kk | 93 m² | 5. NP</span><br><br><b>Kuttelwascherova, Praha 9 - Černý Most</b><br>Stavba: Skeletová<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-14-kuttelwascherova/689986fe58c2bcbb110a517d/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '689986fe58c2bcbb110a517d', '2026-02-26', '2026-02-26');
addNewMarker(50.0034203152, 14.3523860807, '#1565C0', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="6859393a57fe2ea99e09a067" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">9 350 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 88 m² | 3. NP</span><br><br><b>Cementářská, Praha 5 - Lochkov</b><br>Stavba: Cihlová<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-16-cementarska/6859393a57fe2ea99e09a067/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '6859393a57fe2ea99e09a067', '2026-02-26', '2026-02-26');
addNewMarker(50.042287368666926, 14.30696945790677, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="6992d0c6dffd9162130a26e8" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">11 853 625 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 69 m² | 4. NP</span><br><br><b>Nekonečného, Praha 5 - Stodůlky</b><br>Stavba: Dřevěná<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-13-nekonecneho/6992d0c6dffd9162130a26e8/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '6992d0c6dffd9162130a26e8', '2026-02-26', '2026-02-26');
addNewMarker(50.0480552778, 14.3019416667, '#C62828', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="690c2c7b22e38ce1f50ec0c6" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 691 991 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+1 | 74 m² | 8. NP</span><br><br><b>Svitákova, Praha 5 - Stodůlky</b><br>Stavba: Cihlová<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-13-svitakova/690c2c7b22e38ce1f50ec0c6/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '690c2c7b22e38ce1f50ec0c6', '2026-02-26', '2026-02-26');
addNewMarker(50.071718, 14.389139, '#EF6C00', '<div style="min-width:280px;font-family:system-ui,sans-serif;" data-hashid="68d6a0afbe5e2703bd0b1981" data-first-seen="2026-02-26" data-last-changed="2026-02-26"><b style="font-size:14px;">12 390 000 Kč</b><span style="margin-left:8px;font-size:11px;background:#FF6F00;color:white;padding:1px 6px;border-radius:3px;">iDNES</span><span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;padding:1px 6px;border-radius:3px;font-weight:bold;">NOVÉ</span><br><span style="color:#666;">3+kk | 82 m² | 4. NP</span><br><br><b>Plzeňská, Praha 5 - Košíře</b><br>Stavba: Smíšená<br>Vlastnictví: osobní<br><span style="font-size:11px;color:#888;">Přidáno: 2026-02-26</span><br><br><a href="https://reality.idnes.cz/detail/prodej/byt/praha-5-plzenska/68d6a0afbe5e2703bd0b1981/" target="_blank" style="color:#FF6F00;text-decoration:none;font-weight:bold;">→ Otevřít na iDNES</a><div style="margin-top:10px;padding-top:8px;border-top:1px solid #eee;"><div style="display:flex;gap:6px;align-items:center;"><button class="rate-btn fav-btn" data-action="fav" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">⭐</button><button class="rate-btn rej-btn" data-action="reject" style="padding:4px 12px;border:1px solid #ccc;border-radius:4px;cursor:pointer;font-size:16px;background:#fff;">🚫</button><span class="rating-status" style="margin-left:6px;font-size:12px;color:#999;"></span></div><textarea class="rating-note" placeholder="Poznámka..." style="width:100%;margin-top:6px;padding:4px;border:1px solid #ddd;border-radius:4px;font-size:12px;resize:vertical;min-height:32px;display:none;font-family:system-ui,sans-serif;"></textarea></div></div>', '68d6a0afbe5e2703bd0b1981', '2026-02-26', '2026-02-26');
// ── Rating system ──────────────────────────────────────────────
var RATINGS_KEY = 'byty_ratings';
function loadRatings() {
try {
var data = localStorage.getItem(RATINGS_KEY);
return data ? JSON.parse(data) : {};
} catch(e) { return {}; }
}
function saveRatings(ratings) {
localStorage.setItem(RATINGS_KEY, JSON.stringify(ratings));
}
function addRejectStrike(marker) {
removeRejectStrike(marker);
var color = marker._data.color || '#999';
// SVG "no entry" icon — circle with diagonal line, colored to match marker
var svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">'
+ '<circle cx="12" cy="12" r="10" fill="none" stroke="' + color + '" stroke-width="2.5" opacity="0.85"/>'
+ '<line x1="5.5" y1="5.5" x2="18.5" y2="18.5" stroke="' + color + '" stroke-width="2.5" stroke-linecap="round" opacity="0.85"/>'
+ '</svg>';
var icon = L.divIcon({
className: 'reject-overlay',
html: svg,
iconSize: [20, 20],
iconAnchor: [10, 10],
});
var m = L.marker([marker._data.lat, marker._data.lon], {
icon: icon,
interactive: false,
pane: 'markerPane',
});
m.addTo(map);
marker._rejectStrike = m;
}
function removeRejectStrike(marker) {
if (marker._rejectStrike) {
map.removeLayer(marker._rejectStrike);
marker._rejectStrike = null;
}
}
function applyMarkerStyle(marker, status) {
if (marker._data.isHeart) {
var el = marker._icon;
if (!el) return;
el.classList.remove('heart-icon-fav', 'heart-icon-rej');
el.style.transform = el.style.transform.replace(/scale\([^)]*\)/, '');
if (status === 'fav') {
el.classList.add('heart-icon-fav');
el.style.transform += ' scale(1.3)';
} else if (status === 'reject') {
el.classList.add('heart-icon-rej');
}
} else {
if (status === 'fav') {
removeRejectStrike(marker);
if (!marker._data._origCircle) marker._data._origCircle = true;
var popup = marker.getPopup();
var popupContent = popup ? popup.getContent() : '';
var wasOnMap = map.hasLayer(marker);
if (wasOnMap) map.removeLayer(marker);
var starMarker = L.marker([marker._data.lat, marker._data.lon], {
icon: starIcon(),
}).bindPopup(popupContent);
starMarker._data = marker._data;
var idx = allMarkers.indexOf(marker);
if (idx !== -1) allMarkers[idx] = starMarker;
if (wasOnMap) starMarker.addTo(map);
} else if (status === 'reject') {
if (marker._data._origCircle && !(marker instanceof L.CircleMarker)) {
revertToCircle(marker, { radius: 6, fillOpacity: 0.35, fillColor: marker._data.color, color: '#fff', weight: 1 });
} else {
marker.setStyle({
radius: 6, fillOpacity: 0.35, fillColor: marker._data.color, color: '#fff', weight: 1,
});
if (marker._path) marker._path.classList.remove('marker-favorite');
}
// Add strikethrough line over the marker
addRejectStrike(marker);
} else {
if (marker._data._origCircle && !(marker instanceof L.CircleMarker)) {
revertToCircle(marker, { radius: 8, fillColor: marker._data.color, color: '#fff', weight: 2, fillOpacity: 0.85 });
} else {
marker.setStyle({
radius: 8, fillColor: marker._data.color, color: '#fff',
weight: 2, fillOpacity: 0.85,
});
if (marker._path) marker._path.classList.remove('marker-favorite');
}
if (marker._path) marker._path.classList.remove('marker-rejected');
removeRejectStrike(marker);
}
}
}
function revertToCircle(marker, style) {
var popup = marker.getPopup();
var popupContent = popup ? popup.getContent() : '';
var wasOnMap = map.hasLayer(marker);
if (wasOnMap) map.removeLayer(marker);
var cm = L.circleMarker([marker._data.lat, marker._data.lon], style).bindPopup(popupContent);
cm._data = marker._data;
delete cm._data._starRef;
var idx = allMarkers.indexOf(marker);
if (idx !== -1) allMarkers[idx] = cm;
if (wasOnMap) cm.addTo(map);
}
function rateMarker(marker, action) {
var hashId = marker._data.hashId;
var ratings = loadRatings();
var current = ratings[hashId];
if (current && current.status === action) {
delete ratings[hashId];
saveRatings(ratings);
applyMarkerStyle(marker, null);
updateRatingCounts();
applyFilters();
return null;
} else {
var note = (current && current.note) || '';
ratings[hashId] = { status: action, note: note };
saveRatings(ratings);
applyMarkerStyle(marker, action);
updateRatingCounts();
applyFilters();
return action;
}
}
function setNote(hashId, note) {
var ratings = loadRatings();
if (ratings[hashId]) {
ratings[hashId].note = note;
saveRatings(ratings);
}
}
function updateRatingCounts() {
var ratings = loadRatings();
var favCount = 0, rejCount = 0;
for (var id in ratings) {
if (ratings[id].status === 'fav') favCount++;
if (ratings[id].status === 'reject') rejCount++;
}
var el = document.getElementById('rating-counts');
if (el) el.innerHTML = '⭐ ' + favCount + ' oblíbených, 🚫 ' + rejCount + ' zamítnutých';
}
function restoreRatings() {
var ratings = loadRatings();
allMarkers.forEach(function(m) {
var r = ratings[m._data.hashId];
if (r) applyMarkerStyle(m, r.status);
});
updateRatingCounts();
}
// ── Popup rating handler ───────────────────────────────────────
map.on('popupopen', function(e) {
var container = e.popup.getElement();
if (!container) return;
var wrapper = container.querySelector('[data-hashid]');
if (!wrapper) return;
var hashId = wrapper.getAttribute('data-hashid');
var marker = null;
for (var i = 0; i < allMarkers.length; i++) {
if (String(allMarkers[i]._data.hashId) === String(hashId)) {
marker = allMarkers[i]; break;
}
}
if (!marker) return;
var ratings = loadRatings();
var current = ratings[hashId];
var favBtn = container.querySelector('.fav-btn');
var rejBtn = container.querySelector('.rej-btn');
var statusEl = container.querySelector('.rating-status');
var noteEl = container.querySelector('.rating-note');
// Restore state in popup
favBtn.classList.remove('active-fav');
rejBtn.classList.remove('active-rej');
statusEl.textContent = '';
noteEl.style.display = 'none';
noteEl.value = '';
if (current) {
if (current.status === 'fav') {
favBtn.classList.add('active-fav');
statusEl.textContent = 'Oblíbený';
statusEl.style.color = '#F9A825';
} else if (current.status === 'reject') {
rejBtn.classList.add('active-rej');
statusEl.textContent = 'Zamítnutý';
statusEl.style.color = '#E53935';
}
noteEl.style.display = 'block';
noteEl.value = current.note || '';
}
favBtn.onclick = function() {
var result = rateMarker(marker, 'fav');
favBtn.classList.remove('active-fav');
rejBtn.classList.remove('active-rej');
if (result === 'fav') {
favBtn.classList.add('active-fav');
statusEl.textContent = 'Oblíbený';
statusEl.style.color = '#F9A825';
noteEl.style.display = 'block';
} else {
statusEl.textContent = '';
noteEl.style.display = 'none';
noteEl.value = '';
}
};
rejBtn.onclick = function() {
var result = rateMarker(marker, 'reject');
favBtn.classList.remove('active-fav');
rejBtn.classList.remove('active-rej');
if (result === 'reject') {
rejBtn.classList.add('active-rej');
statusEl.textContent = 'Zamítnutý';
statusEl.style.color = '#E53935';
noteEl.style.display = 'block';
} else {
statusEl.textContent = '';
noteEl.style.display = 'none';
noteEl.value = '';
}
};
var noteTimer = null;
noteEl.oninput = function() {
clearTimeout(noteTimer);
noteTimer = setTimeout(function() {
setNote(hashId, noteEl.value);
}, 500);
};
});
// ── Filters ────────────────────────────────────────────────────
function applyFilters() {
var minFloor = parseInt(document.getElementById('min-floor').value);
var maxPrice = parseInt(document.getElementById('max-price').value);
var hideRejected = document.getElementById('hide-rejected').checked;
var daysFilter = parseInt(document.getElementById('days-filter').value) || 0;
var ratings = loadRatings();
var visible = 0;
var cutoff = null;
if (daysFilter > 0) {
cutoff = new Date();
cutoff.setDate(cutoff.getDate() - daysFilter);
cutoff.setHours(0, 0, 0, 0);
}
allMarkers.forEach(function(m) {
var popup = m.getPopup().getContent();
var floorMatch = popup.match(/(\d+)\. NP/);
var priceMatch = popup.match(/([\d\s]+)\sKč/);
var floor = floorMatch ? parseInt(floorMatch[1]) : null;
var price = priceMatch ? parseInt(priceMatch[1].replace(/\s/g, '')) : 0;
var show = true;
if (floor !== null && floor < minFloor) show = false;
if (price > maxPrice) show = false;
if (cutoff) {
var fs = m._data.firstSeen ? new Date(m._data.firstSeen) : null;
var lc = m._data.lastChanged ? new Date(m._data.lastChanged) : null;
if (!((fs && fs >= cutoff) || (lc && lc >= cutoff))) show = false;
}
if (selectedColors.length > 0 && selectedColors.indexOf(m._data.color) < 0) show = false;
var r = ratings[m._data.hashId];
if (hideRejected && r && r.status === 'reject') show = false;
if (show) {
if (!map.hasLayer(m)) m.addTo(map);
visible++;
// Show strike line if rejected and visible
if (m._rejectStrike && !map.hasLayer(m._rejectStrike)) m._rejectStrike.addTo(map);
} else {
if (map.hasLayer(m)) map.removeLayer(m);
// Hide strike line when marker hidden
if (m._rejectStrike && map.hasLayer(m._rejectStrike)) map.removeLayer(m._rejectStrike);
}
});
// Re-apply styles for markers that were just added to map
allMarkers.forEach(function(m) {
if (map.hasLayer(m)) {
var r = ratings[m._data.hashId];
if (r) applyMarkerStyle(m, r.status);
}
});
document.getElementById('visible-count').textContent = visible;
}
// Initialize ratings on load
restoreRatings();
// ── Panel toggle ──────────────────────────────────────────────
function togglePanel() {
var panel = document.getElementById('info-panel');
var openBtn = document.getElementById('panel-open-btn');
var isOpen = !panel.classList.contains('collapsed');
if (isOpen) {
panel.classList.add('collapsed');
openBtn.classList.remove('hidden');
} else {
panel.classList.remove('collapsed');
openBtn.classList.add('hidden');
}
}
// On mobile, start with panel collapsed
if (window.innerWidth <= 600) {
document.getElementById('info-panel').classList.add('collapsed');
document.getElementById('panel-open-btn').classList.remove('hidden');
}
</script>
</body>
</html>

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3
"""
Sloučí data ze Sreality, Realinga, Bezrealitek, iDNES, PSN a CityHome,
Sloučí data ze Sreality, Realinga, Bezrealitek, iDNES, PSN, CityHome a Bazoše,
deduplikuje a vygeneruje mapu.
Deduplikace: stejná ulice (z locality) + stejná cena + stejná plocha = duplikát.
PSN a CityHome mají při deduplikaci prioritu (načtou se první).
@@ -9,6 +9,7 @@ from __future__ import annotations
import json
import re
import unicodedata
from pathlib import Path
from scrape_and_map import generate_map, format_price
@@ -19,14 +20,8 @@ def normalize_street(locality: str) -> str:
# "Studentská, Praha 6 - Dejvice" → "studentska"
# "Rýnská, Praha" → "rynska"
street = locality.split(",")[0].strip().lower()
# Remove diacritics (simple Czech)
replacements = {
"á": "a", "č": "c", "ď": "d", "é": "e", "ě": "e",
"í": "i", "ň": "n", "ó": "o", "ř": "r", "š": "s",
"ť": "t", "ú": "u", "ů": "u", "ý": "y", "ž": "z",
}
for src, dst in replacements.items():
street = street.replace(src, dst)
# Remove diacritics using Unicode decomposition (handles all Czech characters)
street = unicodedata.normalize("NFKD", street).encode("ascii", "ignore").decode("ascii")
# Remove non-alphanumeric
street = re.sub(r"[^a-z0-9]", "", street)
return street
@@ -49,6 +44,7 @@ def main():
("Realingo", "byty_realingo.json"),
("Bezrealitky", "byty_bezrealitky.json"),
("iDNES", "byty_idnes.json"),
("Bazoš", "byty_bazos.json"),
]
all_estates = []

View File

@@ -1,114 +0,0 @@
#!/usr/bin/env python3
"""
Přegeneruje mapu z již stažených dat (byty_sreality.json).
Doplní chybějící plochy ze Sreality API, opraví URL, aplikuje filtry.
"""
from __future__ import annotations
import json
import time
import urllib.request
from pathlib import Path
from scrape_and_map import (
generate_map, format_price, MIN_AREA, HEADERS, DETAIL_API
)
def api_get(url: str) -> dict:
req = urllib.request.Request(url, headers=HEADERS)
with urllib.request.urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode("utf-8"))
def fix_sreality_url(estate: dict) -> str:
"""Fix the Sreality URL to include disposition segment (only if missing)."""
disp = estate.get("disposition", "")
slug_map = {
"1+kk": "1+kk", "1+1": "1+1", "2+kk": "2+kk", "2+1": "2+1",
"3+kk": "3+kk", "3+1": "3+1", "4+kk": "4+kk", "4+1": "4+1",
"5+kk": "5+kk", "5+1": "5+1", "6+": "6-a-vice", "Atypický": "atypicky",
}
slug = slug_map.get(disp, "byt")
old_url = estate.get("url", "")
parts = old_url.split("/")
try:
byt_idx = parts.index("byt")
# Only insert if disposition slug is not already there
if byt_idx + 1 < len(parts) and parts[byt_idx + 1] == slug:
return old_url # already correct
parts.insert(byt_idx + 1, slug)
return "/".join(parts)
except ValueError:
return old_url
def fetch_area(hash_id: int) -> int | None:
"""Fetch area from detail API."""
try:
url = DETAIL_API.format(hash_id)
detail = api_get(url)
for item in detail.get("items", []):
name = item.get("name", "")
if "žitná ploch" in name or "zitna ploch" in name.lower():
return int(item["value"])
except Exception:
pass
return None
def main():
json_path = Path("byty_sreality.json")
if not json_path.exists():
print("Soubor byty_sreality.json nenalezen. Nejprve spusť scrape_and_map.py")
return
estates = json.loads(json_path.read_text(encoding="utf-8"))
print(f"Načteno {len(estates)} bytů z byty_sreality.json")
# Step 1: Fetch missing areas
missing_area = [e for e in estates if e.get("area") is None]
print(f"Doplňuji plochu u {len(missing_area)} bytů...")
for i, e in enumerate(missing_area):
time.sleep(0.3)
area = fetch_area(e["hash_id"])
if area is not None:
e["area"] = area
if (i + 1) % 50 == 0:
print(f" {i + 1}/{len(missing_area)} ...")
# Count results
with_area = sum(1 for e in estates if e.get("area") is not None)
print(f"Plocha doplněna: {with_area}/{len(estates)}")
# Step 2: Fix URLs
for e in estates:
e["url"] = fix_sreality_url(e)
# Step 3: Filter by min area
filtered = []
excluded = 0
for e in estates:
area = e.get("area")
if area is not None and area < MIN_AREA:
excluded += 1
continue
filtered.append(e)
print(f"Vyloučeno (< {MIN_AREA} m²): {excluded}")
print(f"Zbývá: {len(filtered)} bytů")
# Save updated data
filtered_path = Path("byty_sreality.json")
filtered_path.write_text(
json.dumps(filtered, ensure_ascii=False, indent=2),
encoding="utf-8",
)
# Generate map
generate_map(filtered)
if __name__ == "__main__":
main()

View File

@@ -13,7 +13,7 @@ RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'
TOTAL=6
TOTAL=7
CURRENT=0
FAILED=0
START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S")
@@ -84,9 +84,6 @@ exec > >(tee -a "$LOG_FILE") 2>&1
step "Sreality"
python3 scrape_and_map.py $SCRAPER_ARGS || { echo -e "${RED}✗ Sreality selhalo${NC}"; FAILED=$((FAILED + 1)); }
step "Realingo"
python3 scrape_realingo.py $SCRAPER_ARGS || { echo -e "${RED}✗ Realingo selhalo${NC}"; FAILED=$((FAILED + 1)); }
step "Bezrealitky"
python3 scrape_bezrealitky.py $SCRAPER_ARGS || { echo -e "${RED}✗ Bezrealitky selhalo${NC}"; FAILED=$((FAILED + 1)); }
@@ -101,6 +98,12 @@ PID_CH=$!
wait $PID_PSN || { echo -e "${RED}✗ PSN selhalo${NC}"; FAILED=$((FAILED + 1)); }
wait $PID_CH || { echo -e "${RED}✗ CityHome selhalo${NC}"; FAILED=$((FAILED + 1)); }
step "Bazoš"
python3 scrape_bazos.py $SCRAPER_ARGS || { echo -e "${RED}✗ Bazoš selhalo${NC}"; FAILED=$((FAILED + 1)); }
step "Realingo"
python3 scrape_realingo.py $SCRAPER_ARGS || { echo -e "${RED}✗ Realingo selhalo${NC}"; FAILED=$((FAILED + 1)); }
# ── Sloučení + mapa ──────────────────────────────────────────
step "Sloučení dat a generování mapy"
@@ -117,7 +120,7 @@ python3 generate_status.py --start-time "$START_TIME" --duration "$DURATION" $KE
echo ""
echo "============================================================"
if [ $FAILED -eq 0 ]; then
echo -e "${GREEN}${BOLD}Hotovo! Všech 6 zdrojů úspěšně staženo.${NC}"
echo -e "${GREEN}${BOLD}Hotovo! Všech 7 zdrojů úspěšně staženo.${NC}"
else
echo -e "${RED}${BOLD}Hotovo s $FAILED chybami.${NC}"
fi

View File

@@ -13,9 +13,9 @@ import math
import time
import urllib.request
import urllib.parse
from datetime import datetime
from datetime import datetime, timedelta
from pathlib import Path
from scraper_stats import write_stats
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_sreality.json"
@@ -45,19 +45,26 @@ HEADERS = {
def api_get(url: str) -> dict:
"""Fetch JSON from Sreality API."""
logger.debug(f"HTTP GET request: {url}")
logger.debug(f"Headers: {HEADERS}")
req = urllib.request.Request(url, headers=HEADERS)
try:
with urllib.request.urlopen(req, timeout=30) as resp:
response_data = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(response_data)} bytes")
logger.debug(f"Response preview: {response_data[:200]}")
return json.loads(response_data)
except (urllib.error.URLError, ConnectionError, OSError) as e:
logger.error(f"HTTP request failed for {url}: {e}", exc_info=True)
raise
"""Fetch JSON from Sreality API with retry."""
for attempt in range(3):
logger.debug(f"HTTP GET request (attempt {attempt + 1}/3): {url}")
req = urllib.request.Request(url, headers=HEADERS)
try:
with urllib.request.urlopen(req, timeout=30) as resp:
response_data = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(response_data)} bytes")
logger.debug(f"Response preview: {response_data[:200]}")
return json.loads(response_data)
except urllib.error.HTTPError:
raise
except (urllib.error.URLError, ConnectionError, OSError) as e:
if attempt < 2:
wait = (attempt + 1) * 2
logger.warning(f"Connection error (retry {attempt + 1}/3 after {wait}s): {e}")
time.sleep(wait)
else:
logger.error(f"HTTP request failed after 3 attempts: {e}", exc_info=True)
raise
def build_list_url(disposition: int, page: int = 1) -> str:
@@ -356,6 +363,8 @@ def scrape(max_pages: int | None = None, max_properties: int | None = None):
"first_seen": cached.get("first_seen", datetime.now().strftime("%Y-%m-%d")) if cached else datetime.now().strftime("%Y-%m-%d"),
"last_changed": datetime.now().strftime("%Y-%m-%d"),
}
if not validate_listing(result, "sreality"):
continue
results.append(result)
details_fetched += 1
@@ -448,9 +457,13 @@ def generate_map(estates: list[dict], output_path: str = "mapa_bytu.html"):
price_legend_items += (
'<div style="display:flex;align-items:center;gap:6px;margin:6px 0 0 0;'
'padding-top:6px;border-top:1px solid #eee;">'
'<span style="width:18px;height:18px;border-radius:50%;background:#66BB6A;'
'display:inline-block;box-shadow:0 1px 4px rgba(0,0,0,0.35);flex-shrink:0;"></span>'
'<span>Nové (z dnešního scrapu) — větší</span></div>'
'<span style="display:inline-flex;align-items:center;gap:3px;flex-shrink:0;">'
'<span style="width:14px;height:14px;border-radius:50%;background:#66BB6A;'
'display:inline-block;box-shadow:0 1px 3px rgba(0,0,0,0.3);"></span>'
'<span style="font-size:8px;font-weight:700;background:#FFD600;color:#333;'
'padding:1px 3px;border-radius:2px;">NEW</span>'
'</span>'
'<span>Nové (≤ 1 den)</span></div>'
)
markers_js = ""
@@ -467,16 +480,18 @@ def generate_map(estates: list[dict], output_path: str = "mapa_bytu.html"):
floor_note = '<br><span style="color:#FF9800;font-weight:bold;">⚠ 2. NP — zvážit klidnost lokality</span>'
source = e.get("source", "sreality")
source_labels = {"sreality": "Sreality", "realingo": "Realingo", "bezrealitky": "Bezrealitky", "idnes": "iDNES", "psn": "PSN", "cityhome": "CityHome"}
source_colors = {"sreality": "#1976D2", "realingo": "#00897B", "bezrealitky": "#E91E63", "idnes": "#FF6F00", "psn": "#D32F2F", "cityhome": "#D32F2F"}
source_labels = {"sreality": "Sreality", "realingo": "Realingo", "bezrealitky": "Bezrealitky", "idnes": "iDNES", "psn": "PSN", "cityhome": "CityHome", "bazos": "Bazoš"}
source_colors = {"sreality": "#1976D2", "realingo": "#00897B", "bezrealitky": "#E91E63", "idnes": "#FF6F00", "psn": "#D32F2F", "cityhome": "#D32F2F", "bazos": "#7B1FA2"}
source_label = source_labels.get(source, source)
source_color = source_colors.get(source, "#999")
hash_id = e.get("hash_id", "")
hash_id = f"{source}_{e.get('hash_id', '')}"
first_seen = e.get("first_seen", "")
last_changed = e.get("last_changed", "")
is_new = first_seen == datetime.now().strftime("%Y-%m-%d")
today = datetime.now().strftime("%Y-%m-%d")
yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
is_new = first_seen in (today, yesterday)
new_badge = (
'<span style="margin-left:6px;font-size:11px;background:#FFD600;color:#333;'
@@ -603,12 +618,12 @@ def generate_map(estates: list[dict], output_path: str = "mapa_bytu.html"):
.heart-icon-fav svg path {{ stroke: gold !important; stroke-width: 2.5 !important; filter: drop-shadow(0 0 4px rgba(255,193,7,0.7)); }}
.heart-icon-rej {{ opacity: 0.4 !important; filter: grayscale(1); }}
.reject-overlay {{ background: none !important; border: none !important; pointer-events: none !important; }}
@keyframes pulse-new {{
0% {{ stroke-opacity: 1; stroke-width: 3px; r: 11; }}
50% {{ stroke-opacity: 0.4; stroke-width: 6px; r: 12; }}
100% {{ stroke-opacity: 1; stroke-width: 3px; r: 11; }}
.new-badge-icon {{ background: none !important; border: none !important; pointer-events: none !important; }}
.new-badge {{
font-size: 9px; font-weight: 700; color: #333; background: #FFD600;
padding: 1px 4px; border-radius: 3px; white-space: nowrap;
box-shadow: 0 1px 3px rgba(0,0,0,0.3); letter-spacing: 0.5px;
}}
.marker-new {{ animation: pulse-new 2s ease-in-out infinite; }}
.info-panel {{
position: absolute; top: 10px; right: 10px; z-index: 1000;
background: white; padding: 16px; border-radius: 10px;
@@ -683,12 +698,9 @@ def generate_map(estates: list[dict], output_path: str = "mapa_bytu.html"):
</div>
<div style="margin-top:6px;">
<label>Max cena:
<select id="max-price" onchange="applyFilters()">
<option value="13500000">13 500 000 Kč</option>
<option value="12000000">12 000 000 Kč</option>
<option value="10000000">10 000 000 Kč</option>
<option value="8000000">8 000 000 Kč</option>
</select>
<input type="number" id="max-price" value="13500000" max="14000000" step="500000"
style="width:130px;padding:2px 4px;border:1px solid #ccc;border-radius:3px;"
onchange="applyFilters()" onkeyup="applyFilters()"> Kč
</label>
</div>
<div style="margin-top:6px;">
@@ -784,19 +796,28 @@ function addMarker(lat, lon, color, popup, hashId, firstSeen, lastChanged) {{
function addNewMarker(lat, lon, color, popup, hashId, firstSeen, lastChanged) {{
var marker = L.circleMarker([lat, lon], {{
radius: 12,
radius: 8,
fillColor: color,
color: color,
weight: 4,
opacity: 0.35,
fillOpacity: 0.95,
color: '#fff',
weight: 2,
opacity: 1,
fillOpacity: 0.85,
}}).bindPopup(popup);
marker._data = {{ lat: lat, lon: lon, color: color, hashId: hashId, isNew: true, firstSeen: firstSeen || '', lastChanged: lastChanged || '' }};
allMarkers.push(marker);
marker.addTo(map);
marker.on('add', function() {{
if (marker._path) marker._path.classList.add('marker-new');
var badge = L.marker([lat, lon], {{
icon: L.divIcon({{
className: 'new-badge-icon',
html: '<span class="new-badge">NEW</span>',
iconSize: [32, 14],
iconAnchor: [-6, 7],
}}),
interactive: false,
pane: 'markerPane',
}});
badge.addTo(map);
marker._newBadge = badge;
}}
function heartIcon(color) {{
@@ -852,6 +873,11 @@ function loadRatings() {{
function saveRatings(ratings) {{
localStorage.setItem(RATINGS_KEY, JSON.stringify(ratings));
fetch('/api/ratings', {{
method: 'POST',
headers: {{'Content-Type': 'application/json'}},
body: JSON.stringify(ratings)
}}).catch(function() {{}});
}}
function addRejectStrike(marker) {{
@@ -899,6 +925,7 @@ function applyMarkerStyle(marker, status) {{
}} else {{
if (status === 'fav') {{
removeRejectStrike(marker);
if (marker._newBadge && map.hasLayer(marker._newBadge)) map.removeLayer(marker._newBadge);
if (!marker._data._origCircle) marker._data._origCircle = true;
var popup = marker.getPopup();
var popupContent = popup ? popup.getContent() : '';
@@ -922,6 +949,7 @@ function applyMarkerStyle(marker, status) {{
}}
// Add strikethrough line over the marker
addRejectStrike(marker);
if (marker._newBadge && map.hasLayer(marker._newBadge)) map.removeLayer(marker._newBadge);
}} else {{
if (marker._data._origCircle && !(marker instanceof L.CircleMarker)) {{
revertToCircle(marker, {{ radius: 8, fillColor: marker._data.color, color: '#fff', weight: 2, fillOpacity: 0.85 }});
@@ -934,6 +962,7 @@ function applyMarkerStyle(marker, status) {{
}}
if (marker._path) marker._path.classList.remove('marker-rejected');
removeRejectStrike(marker);
if (marker._newBadge && !map.hasLayer(marker._newBadge)) marker._newBadge.addTo(map);
}}
}}
}}
@@ -1089,7 +1118,9 @@ map.on('popupopen', function(e) {{
// ── Filters ────────────────────────────────────────────────────
function applyFilters() {{
var minFloor = parseInt(document.getElementById('min-floor').value);
var maxPrice = parseInt(document.getElementById('max-price').value);
var maxPriceEl = document.getElementById('max-price');
var maxPrice = parseInt(maxPriceEl.value) || 14000000;
if (maxPrice > 14000000) {{ maxPrice = 14000000; maxPriceEl.value = 14000000; }}
var hideRejected = document.getElementById('hide-rejected').checked;
var daysFilter = parseInt(document.getElementById('days-filter').value) || 0;
var ratings = loadRatings();
@@ -1130,10 +1161,12 @@ function applyFilters() {{
visible++;
// Show strike line if rejected and visible
if (m._rejectStrike && !map.hasLayer(m._rejectStrike)) m._rejectStrike.addTo(map);
if (m._newBadge && !map.hasLayer(m._newBadge)) m._newBadge.addTo(map);
}} else {{
if (map.hasLayer(m)) map.removeLayer(m);
// Hide strike line when marker hidden
if (m._rejectStrike && map.hasLayer(m._rejectStrike)) map.removeLayer(m._rejectStrike);
if (m._newBadge && map.hasLayer(m._newBadge)) map.removeLayer(m._newBadge);
}}
}});
@@ -1148,8 +1181,25 @@ function applyFilters() {{
document.getElementById('visible-count').textContent = visible;
}}
// Initialize ratings on load
restoreRatings();
// Initialize ratings: load from server, merge with localStorage, then restore
function initRatings() {{
var local = loadRatings();
fetch('/api/ratings')
.then(function(r) {{ return r.ok ? r.json() : null; }})
.then(function(server) {{
if (server && typeof server === 'object') {{
var merged = Object.assign({{}}, local, server);
localStorage.setItem(RATINGS_KEY, JSON.stringify(merged));
}}
restoreRatings();
updateRatingCounts();
}})
.catch(function() {{
restoreRatings();
updateRatingCounts();
}});
}}
initRatings();
// ── Panel toggle ──────────────────────────────────────────────
function togglePanel() {{

560
scrape_bazos.py Normal file
View File

@@ -0,0 +1,560 @@
#!/usr/bin/env python3
"""
Bazoš.cz scraper.
Stáhne byty na prodej v Praze a vyfiltruje podle kritérií.
Výstup: byty_bazos.json
"""
from __future__ import annotations
import argparse
from datetime import datetime
import json
import logging
import math
import re
import time
import urllib.request
import urllib.parse
from pathlib import Path
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_bazos.json"
logger = logging.getLogger(__name__)
# ── Konfigurace ─────────────────────────────────────────────────────────────
MAX_PRICE = 14_000_000
MIN_AREA = 69
MIN_FLOOR = 2
PER_PAGE = 20 # Bazoš vrací 20 na stránku
WANTED_DISPOSITIONS = {"3+kk", "3+1", "4+kk", "4+1", "5+kk", "5+1", "6+kk", "6+1"}
# Regex patterns pro parsování dispozice, plochy a patra z textu
DISP_RE = re.compile(r'(\d)\s*\+\s*(kk|1)', re.IGNORECASE)
AREA_RE = re.compile(r'(\d+(?:[.,]\d+)?)\s*m[²2\s,.]', re.IGNORECASE)
FLOOR_RE = re.compile(r'(\d+)\s*[./]\s*(\d+)\s*(?:NP|patr|podlaž|floor)', re.IGNORECASE)
FLOOR_RE2 = re.compile(r'(\d+)\.\s*(?:NP|patr[eouě]|podlaž[ií])', re.IGNORECASE)
FLOOR_RE3 = re.compile(r'(?:patr[eouě]|podlaž[ií]|NP)\s*[:\s]*(\d+)', re.IGNORECASE)
PANEL_RE = re.compile(r'panel(?:ov|ák|\.)', re.IGNORECASE)
SIDLISTE_RE = re.compile(r'sídliště|sidliste|panelák', re.IGNORECASE)
HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml",
"Accept-Language": "cs,en;q=0.9",
}
BASE_URL = "https://reality.bazos.cz"
SEARCH_PARAMS = "hledat=&rubriky=reality&hlokalita=Praha&humkreis=25&cenado={max_price}&kitx=ano"
def fetch_url(url: str, retries: int = 3) -> str:
"""Fetch URL and return HTML string with retry on transient errors."""
for attempt in range(retries):
try:
logger.debug(f"HTTP GET request (attempt {attempt + 1}/{retries}): {url}")
req = urllib.request.Request(url, headers=HEADERS)
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8", errors="replace")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
return html
except urllib.error.HTTPError:
raise
except (ConnectionResetError, ConnectionError, urllib.error.URLError, OSError) as e:
if attempt < retries - 1:
wait = (attempt + 1) * 3
logger.warning(f"Connection error (retry {attempt + 1}/{retries} after {wait}s): {e}")
time.sleep(wait)
else:
logger.error(f"HTTP request failed after {retries} attempts: {e}", exc_info=True)
raise
def format_price(price: int) -> str:
s = str(price)
parts = []
while s:
parts.append(s[-3:])
s = s[:-3]
return " ".join(reversed(parts)) + ""
def parse_price(text: str) -> int:
"""Parse price from text like '5 250 000 Kč' → 5250000."""
cleaned = re.sub(r'[^\d]', '', text)
return int(cleaned) if cleaned else 0
def parse_disposition(text: str) -> str | None:
"""Parse disposition from title/description like '3+kk', '4+1'."""
m = DISP_RE.search(text)
if m:
rooms = m.group(1)
suffix = m.group(2).lower()
return f"{rooms}+{suffix}"
return None
def parse_area(text: str) -> float | None:
"""Parse area from text like '82 m²' → 82.0."""
m = AREA_RE.search(text)
if m:
return float(m.group(1).replace(',', '.'))
return None
def parse_floor(text: str) -> int | None:
"""Parse floor number from description."""
for pattern in [FLOOR_RE, FLOOR_RE2, FLOOR_RE3]:
m = pattern.search(text)
if m:
return int(m.group(1))
return None
def is_panel(text: str) -> bool:
"""Check if description mentions panel construction."""
return bool(PANEL_RE.search(text))
def is_sidliste(text: str) -> bool:
"""Check if description mentions housing estate."""
return bool(SIDLISTE_RE.search(text))
def fetch_listing_page(offset: int = 0, pagination_params: str | None = None) -> tuple[list[dict], int, str | None]:
"""
Fetch a page of listings from Bazoš.
Returns (list of basic listing dicts, total count, pagination_params for next pages).
"""
if pagination_params and offset > 0:
# Use resolved numeric params from first page's pagination links
url = f"{BASE_URL}/prodam/byt/{offset}/?{pagination_params}"
else:
params = SEARCH_PARAMS.format(max_price=MAX_PRICE)
if offset > 0:
url = f"{BASE_URL}/prodam/byt/{offset}/?{params}"
else:
url = f"{BASE_URL}/prodam/byt/?{params}"
html = fetch_url(url)
# Parse total count: "Zobrazeno 1-20 z 727"
total = 0
total_match = re.search(r'z\s+([\d\s]+)\s', html)
if total_match:
total = int(total_match.group(1).replace(' ', ''))
# Extract resolved pagination params from first page (Bazoš converts
# hlokalita=Praha → hlokalita=11000, and pagination only works with numeric form)
resolved_params = None
pag_link = re.search(r'href="/prodam/byt/\d+/\?([^"]+)"', html)
if pag_link:
resolved_params = pag_link.group(1)
# Parse listings — split by listing blocks (class="inzeraty inzeratyflex")
listings = []
all_blocks = re.split(r'<div class="inzeraty\s+inzeratyflex">', html)[1:] # skip before first
for block in all_blocks:
# Extract URL and ID from first link (/inzerat/XXXXXX/slug.php)
url_match = re.search(r'href="(/inzerat/(\d+)/[^"]*)"', block)
if not url_match:
continue
detail_path = url_match.group(1)
listing_id = int(url_match.group(2))
# Title — class=nadpis (without quotes) or class="nadpis"
title_match = re.search(r'class=.?nadpis.?[^>]*>\s*<a[^>]*>([^<]+)</a>', block)
title = title_match.group(1).strip() if title_match else ""
# Price — inside <span translate="no"> within inzeratycena
price_match = re.search(r'class="inzeratycena"[^>]*>.*?<span[^>]*>([^<]+)</span>', block, re.DOTALL)
if not price_match:
# Fallback: direct text in inzeratycena
price_match = re.search(r'class="inzeratycena"[^>]*>\s*(?:<b>)?([^<]+)', block)
price_text = price_match.group(1).strip() if price_match else ""
price = parse_price(price_text)
# Location
loc_match = re.search(r'class="inzeratylok"[^>]*>(.*?)</div>', block, re.DOTALL)
location = ""
if loc_match:
location = re.sub(r'<[^>]+>', ' ', loc_match.group(1)).strip()
location = re.sub(r'\s+', ' ', location)
# Date — [5.3. 2026]
date_match = re.search(r'\[(\d+\.\d+\.\s*\d{4})\]', block)
date_str = date_match.group(1).strip() if date_match else ""
# Description preview — class=popis (without quotes) or class="popis"
desc_match = re.search(r'class=.?popis.?[^>]*>(.*?)</div>', block, re.DOTALL)
description = ""
if desc_match:
description = re.sub(r'<[^>]+>', ' ', desc_match.group(1)).strip()
description = re.sub(r'\s+', ' ', description)
# Image — <img ... class="obrazek" ... src="...">
img_match = re.search(r'<img[^>]*src="([^"]+)"[^>]*class="obrazek"', block)
if not img_match:
img_match = re.search(r'class="obrazek"[^>]*src="([^"]+)"', block)
image = img_match.group(1) if img_match else ""
if "empty.gif" in image:
image = ""
listings.append({
"id": listing_id,
"title": title,
"price": price,
"location": location,
"date": date_str,
"description": description,
"detail_path": detail_path,
"image": image,
})
logger.debug(f"Offset {offset}: found {len(listings)} listings, total={total}")
return listings, total, resolved_params
def fetch_detail(path: str) -> dict | None:
"""Fetch listing detail page and extract GPS, full description."""
try:
url = f"{BASE_URL}{path}"
html = fetch_url(url)
result = {}
# GPS from Google Maps link
gps_match = re.search(r'google\.com/maps[^"]*place/([\d.]+),([\d.]+)', html)
if gps_match:
result["lat"] = float(gps_match.group(1))
result["lon"] = float(gps_match.group(2))
# Full description — Bazoš uses unquoted class=popisdetail
desc_match = re.search(r'class=.?popisdetail.?[^>]*>(.*?)</div>', html, re.DOTALL)
if desc_match:
desc = re.sub(r'<[^>]+>', ' ', desc_match.group(1)).strip()
desc = re.sub(r'\s+', ' ', desc)
result["description"] = desc
# Location from detail
loc_match = re.search(r'Lokalita:</td>\s*<td[^>]*>(.*?)</td>', html, re.DOTALL)
if loc_match:
loc = re.sub(r'<[^>]+>', ' ', loc_match.group(1)).strip()
loc = re.sub(r'\s+', ' ', loc)
result["detail_location"] = loc
return result
except Exception as e:
logger.warning(f"Detail fetch failed for {path}: {e}")
return None
def load_cache(json_path: str = "byty_bazos.json") -> dict[int, dict]:
"""Load previously scraped data as cache keyed by hash_id."""
path = Path(json_path)
if not path.exists():
return {}
try:
data = json.loads(path.read_text(encoding="utf-8"))
return {e["hash_id"]: e for e in data if "hash_id" in e}
except (json.JSONDecodeError, KeyError):
return {}
def scrape(max_pages: int | None = None, max_properties: int | None = None):
_run_start = time.time()
_run_ts = datetime.now().isoformat(timespec="seconds")
cache = load_cache()
today = datetime.now().strftime("%Y-%m-%d")
logger.info("=" * 60)
logger.info("Stahuji inzeráty z Bazoš.cz")
logger.info(f"Cena: do {format_price(MAX_PRICE)}")
logger.info(f"Min. plocha: {MIN_AREA}")
logger.info(f"Patro: od {MIN_FLOOR}. NP")
logger.info(f"Region: Praha")
if cache:
logger.info(f"Cache: {len(cache)} bytů z minulého běhu")
if max_pages:
logger.info(f"Max. stran: {max_pages}")
if max_properties:
logger.info(f"Max. bytů: {max_properties}")
logger.info("=" * 60)
# Step 1: Fetch listing pages
logger.info("\nFáze 1: Stahování seznamu inzerátů...")
all_listings = {} # id -> listing dict (dedup)
page = 1
offset = 0
total = None
pagination_params = None # resolved numeric params from first page
while True:
if max_pages and page > max_pages:
logger.debug(f"Max pages limit reached: {max_pages}")
break
logger.info(f"Strana {page} (offset {offset}) ...")
listings, total_count, resolved = fetch_listing_page(offset, pagination_params)
if resolved and not pagination_params:
pagination_params = resolved
logger.debug(f"Resolved pagination params: {pagination_params}")
if total is None and total_count > 0:
total = total_count
total_pages = math.ceil(total / PER_PAGE)
logger.info(f"→ Celkem {total} inzerátů, ~{total_pages} stran")
if not listings:
logger.debug(f"No listings found on page {page}, stopping")
break
for lst in listings:
lid = lst["id"]
if lid not in all_listings:
all_listings[lid] = lst
page += 1
offset += PER_PAGE
if total and offset >= total:
break
time.sleep(0.5)
logger.info(f"\nStaženo: {len(all_listings)} unikátních inzerátů")
# Step 2: Pre-filter by disposition, price, area from listing data
pre_filtered = []
excluded_disp = 0
excluded_price = 0
excluded_area = 0
excluded_no_disp = 0
for lst in all_listings.values():
title_and_desc = f"{lst['title']} {lst['description']}"
# Parse disposition
disp = parse_disposition(title_and_desc)
if not disp:
excluded_no_disp += 1
logger.debug(f"Filter: id={lst['id']} - excluded (no disposition found in '{lst['title']}')")
continue
if disp not in WANTED_DISPOSITIONS:
excluded_disp += 1
logger.debug(f"Filter: id={lst['id']} - excluded (disposition {disp})")
continue
# Price
price = lst["price"]
if price <= 0 or price > MAX_PRICE:
excluded_price += 1
logger.debug(f"Filter: id={lst['id']} - excluded (price {price})")
continue
# Area (if parseable from listing)
area = parse_area(title_and_desc)
if area is not None and area < MIN_AREA:
excluded_area += 1
logger.debug(f"Filter: id={lst['id']} - excluded (area {area} m²)")
continue
lst["_disposition"] = disp
lst["_area"] = area
pre_filtered.append(lst)
logger.info(f"\nPo předfiltraci:")
logger.info(f" Vyloučeno (bez dispozice): {excluded_no_disp}")
logger.info(f" Vyloučeno (dispozice): {excluded_disp}")
logger.info(f" Vyloučeno (cena): {excluded_price}")
logger.info(f" Vyloučeno (plocha): {excluded_area}")
logger.info(f" Zbývá: {len(pre_filtered)}")
# Step 3: Fetch details (for GPS + full description)
logger.info(f"\nFáze 2: Stahování detailů ({len(pre_filtered)} bytů)...")
results = []
excluded_panel = 0
excluded_floor = 0
excluded_no_gps = 0
excluded_detail = 0
excluded_area_detail = 0
cache_hits = 0
properties_fetched = 0
for i, lst in enumerate(pre_filtered):
if max_properties and properties_fetched >= max_properties:
logger.debug(f"Max properties limit reached: {max_properties}")
break
listing_id = lst["id"]
price = lst["price"]
# Check cache
cached = cache.get(listing_id)
if cached and cached.get("price") == price:
cache_hits += 1
logger.debug(f"Cache hit for id={listing_id}")
results.append(cached)
continue
time.sleep(0.4)
detail = fetch_detail(lst["detail_path"])
if not detail:
excluded_detail += 1
logger.debug(f"Filter: id={listing_id} - excluded (detail fetch failed)")
continue
# GPS required
lat = detail.get("lat")
lon = detail.get("lon")
if not lat or not lon:
excluded_no_gps += 1
logger.debug(f"Filter: id={listing_id} - excluded (no GPS)")
continue
# Full text for filtering
full_desc = detail.get("description", "")
full_text = f"{lst['title']} {lst['description']} {full_desc}"
# Panel check
if is_panel(full_text):
excluded_panel += 1
logger.info(f"✗ Vyloučen #{listing_id}: panelová stavba")
continue
# Sídliště check
if is_sidliste(full_text):
excluded_panel += 1
logger.info(f"✗ Vyloučen #{listing_id}: sídliště")
continue
# Floor
floor = parse_floor(full_text)
if floor is not None and floor < MIN_FLOOR:
excluded_floor += 1
logger.debug(f"Filter: id={listing_id} - excluded (floor {floor})")
continue
# Area — re-check from detail if not found before
area = lst.get("_area") or parse_area(full_desc)
if area is not None and area < MIN_AREA:
excluded_area_detail += 1
logger.debug(f"Filter: id={listing_id} - excluded (area {area} m² from detail)")
continue
disp = lst["_disposition"]
locality = detail.get("detail_location") or lst["location"]
result = {
"hash_id": listing_id,
"name": f"Prodej bytu {disp} {int(area) if area else '?'}",
"price": price,
"price_formatted": format_price(price),
"locality": locality,
"lat": lat,
"lon": lon,
"disposition": disp,
"floor": floor,
"area": area,
"building_type": "neuvedeno",
"ownership": "neuvedeno",
"url": f"{BASE_URL}{lst['detail_path']}",
"source": "bazos",
"image": lst.get("image", ""),
"scraped_at": today,
"first_seen": cached.get("first_seen", today) if cached else today,
"last_changed": today if not cached or cached.get("price") != price else cached.get("last_changed", today),
}
if not validate_listing(result, "bazos"):
continue
results.append(result)
properties_fetched += 1
if (i + 1) % 20 == 0:
logger.info(f"Zpracováno {i + 1}/{len(pre_filtered)} ...")
logger.info(f"\n{'=' * 60}")
logger.info(f"Výsledky Bazoš:")
logger.info(f" Předfiltrováno: {len(pre_filtered)}")
logger.info(f" Z cache (přeskočeno): {cache_hits}")
logger.info(f" Vyloučeno (panel/síd): {excluded_panel}")
logger.info(f" Vyloučeno (patro): {excluded_floor}")
logger.info(f" Vyloučeno (bez GPS): {excluded_no_gps}")
logger.info(f" Vyloučeno (bez detailu): {excluded_detail}")
logger.info(f" Vyloučeno (plocha det): {excluded_area_detail}")
logger.info(f" ✓ Vyhovující byty: {len(results)}")
logger.info(f"{'=' * 60}")
write_stats(STATS_FILE, {
"source": "Bazoš",
"timestamp": _run_ts,
"duration_sec": round(time.time() - _run_start, 1),
"success": True,
"accepted": len(results),
"fetched": len(all_listings),
"pages": page - 1,
"cache_hits": cache_hits,
"excluded": {
"bez dispozice": excluded_no_disp,
"dispozice": excluded_disp,
"cena": excluded_price,
"plocha": excluded_area + excluded_area_detail,
"bez GPS": excluded_no_gps,
"panel/síd": excluded_panel,
"patro": excluded_floor,
"bez detailu": excluded_detail,
},
})
return results
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Scrape apartments from Bazoš.cz")
parser.add_argument("--max-pages", type=int, default=None,
help="Maximum number of listing pages to scrape")
parser.add_argument("--max-properties", type=int, default=None,
help="Maximum number of properties to fetch details for")
parser.add_argument("--log-level", type=str, default="INFO", choices=["DEBUG", "INFO", "WARNING", "ERROR"],
help="Logging level (default: INFO)")
args = parser.parse_args()
logging.basicConfig(
level=getattr(logging, args.log_level),
format="[%(levelname)s] %(asctime)s - %(name)s - %(message)s",
handlers=[logging.StreamHandler()]
)
_run_ts = datetime.now().isoformat(timespec="seconds")
start = time.time()
try:
estates = scrape(max_pages=args.max_pages, max_properties=args.max_properties)
except Exception as e:
logger.error(f"Scraper failed: {e}", exc_info=True)
write_stats(STATS_FILE, {
"source": "Bazoš",
"timestamp": _run_ts,
"duration_sec": round(time.time() - start, 1),
"success": False,
"accepted": 0,
"fetched": 0,
"error": str(e),
})
raise
if estates:
json_path = Path("byty_bazos.json")
json_path.write_text(
json.dumps(estates, ensure_ascii=False, indent=2),
encoding="utf-8",
)
elapsed = time.time() - start
logger.info(f"\n✓ Data uložena: {json_path.resolve()}")
logger.info(f"⏱ Celkový čas: {elapsed:.0f} s")
else:
logger.info("\nŽádné byty z Bazoše neodpovídají kritériím :(")

View File

@@ -15,7 +15,7 @@ import re
import time
import urllib.request
from pathlib import Path
from scraper_stats import write_stats
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_bezrealitky.json"
@@ -71,62 +71,71 @@ HEADERS = {
BASE_URL = "https://www.bezrealitky.cz"
def fetch_url(url: str, retries: int = 3) -> str:
"""Fetch URL and return HTML string with retry on transient errors."""
for attempt in range(retries):
try:
logger.debug(f"HTTP GET request (attempt {attempt + 1}/{retries}): {url}")
req = urllib.request.Request(url, headers=HEADERS)
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
return html
except urllib.error.HTTPError:
raise
except (ConnectionResetError, ConnectionError, urllib.error.URLError, OSError) as e:
if attempt < retries - 1:
wait = (attempt + 1) * 2
logger.warning(f"Connection error (retry {attempt + 1}/{retries} after {wait}s): {e}")
time.sleep(wait)
else:
logger.error(f"HTTP request failed after {retries} attempts: {e}", exc_info=True)
raise
def fetch_page(page: int) -> tuple[list[dict], int]:
"""
Fetch a listing page from Bezrealitky.
Returns (list of advert dicts from Apollo cache, total count).
"""
url = f"{BASE_URL}/vypis/nabidka-prodej/byt/praha?page={page}"
logger.debug(f"HTTP GET request: {url}")
logger.debug(f"Headers: {HEADERS}")
req = urllib.request.Request(url, headers=HEADERS)
try:
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
html = fetch_url(url)
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script>',
html, re.DOTALL
)
if not match:
logger.debug("No __NEXT_DATA__ script found in HTML")
return [], 0
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script>',
html, re.DOTALL
)
if not match:
logger.debug("No __NEXT_DATA__ script found in HTML")
return [], 0
data = json.loads(match.group(1))
cache = data["props"]["pageProps"]["apolloCache"]
data = json.loads(match.group(1))
cache = data["props"]["pageProps"]["apolloCache"]
# Extract adverts from cache
adverts = []
for key, val in cache.items():
if key.startswith("Advert:") and isinstance(val, dict) and val.get("__typename") == "Advert":
adverts.append(val)
# Extract adverts from cache
adverts = []
for key, val in cache.items():
if key.startswith("Advert:") and isinstance(val, dict) and val.get("__typename") == "Advert":
adverts.append(val)
# Get total count from ROOT_QUERY
total = 0
root = cache.get("ROOT_QUERY", {})
for key, val in root.items():
if "listAdverts" in key and isinstance(val, dict):
tc = val.get("totalCount")
if tc and tc > total:
total = tc
# Get total count from ROOT_QUERY
total = 0
root = cache.get("ROOT_QUERY", {})
for key, val in root.items():
if "listAdverts" in key and isinstance(val, dict):
tc = val.get("totalCount")
if tc and tc > total:
total = tc
logger.debug(f"Page {page}: found {len(adverts)} adverts, total={total}")
return adverts, total
except (urllib.error.URLError, ConnectionError, OSError) as e:
logger.error(f"HTTP request failed for {url}: {e}", exc_info=True)
raise
logger.debug(f"Page {page}: found {len(adverts)} adverts, total={total}")
return adverts, total
def fetch_detail(uri: str) -> dict | None:
"""Fetch detail page for a listing."""
try:
url = f"{BASE_URL}/nemovitosti-byty-domy/{uri}"
logger.debug(f"HTTP GET request: {url}")
req = urllib.request.Request(url, headers=HEADERS)
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
html = fetch_url(url)
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script>',
@@ -365,6 +374,8 @@ def scrape(max_pages: int | None = None, max_properties: int | None = None):
"first_seen": cached.get("first_seen", datetime.now().strftime("%Y-%m-%d")) if cached else datetime.now().strftime("%Y-%m-%d"),
"last_changed": datetime.now().strftime("%Y-%m-%d"),
}
if not validate_listing(result, "bezrealitky"):
continue
results.append(result)
properties_fetched += 1

View File

@@ -14,7 +14,7 @@ import time
import urllib.request
from datetime import datetime
from pathlib import Path
from scraper_stats import write_stats
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_cityhome.json"
@@ -375,6 +375,8 @@ def scrape(max_pages: int | None = None, max_properties: int | None = None):
"first_seen": _prev_cache.get(f"cityhome_{slug}_{listing['unit_name']}", {}).get("first_seen", datetime.now().strftime("%Y-%m-%d")),
"last_changed": datetime.now().strftime("%Y-%m-%d") if _prev_cache.get(f"cityhome_{slug}_{listing['unit_name']}", {}).get("price") != price else _prev_cache[f"cityhome_{slug}_{listing['unit_name']}"].get("last_changed", datetime.now().strftime("%Y-%m-%d")),
}
if not validate_listing(result, "cityhome"):
continue
results.append(result)
properties_fetched += 1

View File

@@ -15,9 +15,8 @@ import re
import time
import urllib.request
import urllib.parse
from html.parser import HTMLParser
from pathlib import Path
from scraper_stats import write_stats
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_idnes.json"
@@ -468,6 +467,8 @@ def scrape(max_pages: int | None = None, max_properties: int | None = None):
"first_seen": cached.get("first_seen", datetime.now().strftime("%Y-%m-%d")) if cached else datetime.now().strftime("%Y-%m-%d"),
"last_changed": datetime.now().strftime("%Y-%m-%d"),
}
if not validate_listing(result, "idnes"):
continue
results.append(result)
properties_fetched += 1

View File

@@ -15,7 +15,7 @@ import time
from datetime import datetime
from pathlib import Path
from urllib.parse import urlencode
from scraper_stats import write_stats
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_psn.json"
@@ -38,19 +38,25 @@ BASE_URL = "https://psn.cz"
UNITS_API = f"{BASE_URL}/api/units-list"
def fetch_json(url: str) -> dict:
"""Fetch JSON via curl (urllib SSL may fail on Cloudflare)."""
logger.debug(f"HTTP GET: {url}")
result = subprocess.run(
["curl", "-s", "-L", "--max-time", "30",
"-H", f"User-Agent: {UA}",
"-H", "Accept: application/json",
url],
capture_output=True, text=True, timeout=60
)
if result.returncode != 0:
raise RuntimeError(f"curl failed ({result.returncode}): {result.stderr[:200]}")
return json.loads(result.stdout)
def fetch_json(url: str, retries: int = 3) -> dict:
"""Fetch JSON via curl (urllib SSL may fail on Cloudflare) with retry."""
for attempt in range(retries):
logger.debug(f"HTTP GET (attempt {attempt + 1}/{retries}): {url}")
result = subprocess.run(
["curl", "-s", "-L", "--max-time", "30",
"-H", f"User-Agent: {UA}",
"-H", "Accept: application/json",
url],
capture_output=True, text=True, timeout=60
)
if result.returncode == 0:
return json.loads(result.stdout)
if attempt < retries - 1:
wait = (attempt + 1) * 2
logger.warning(f"curl failed (retry {attempt + 1}/{retries} after {wait}s): {result.stderr[:200]}")
time.sleep(wait)
else:
raise RuntimeError(f"curl failed after {retries} attempts ({result.returncode}): {result.stderr[:200]}")
def fix_gps(lat, lng):
@@ -255,6 +261,8 @@ def scrape(max_properties: int | None = None):
"first_seen": _prev_cache.get(str(unit_id), {}).get("first_seen", datetime.now().strftime("%Y-%m-%d")),
"last_changed": datetime.now().strftime("%Y-%m-%d") if _prev_cache.get(str(unit_id), {}).get("price") != int(price) else _prev_cache[str(unit_id)].get("last_changed", datetime.now().strftime("%Y-%m-%d")),
}
if not validate_listing(result, "psn"):
continue
results.append(result)
properties_fetched += 1

View File

@@ -15,7 +15,7 @@ import re
import time
import urllib.request
from pathlib import Path
from scraper_stats import write_stats
from scraper_stats import write_stats, validate_listing
STATS_FILE = "stats_realingo.json"
@@ -56,6 +56,28 @@ HEADERS = {
BASE_URL = "https://www.realingo.cz"
def fetch_url(url: str, retries: int = 3) -> str:
"""Fetch URL and return HTML string with retry on transient errors."""
for attempt in range(retries):
try:
logger.debug(f"HTTP GET request (attempt {attempt + 1}/{retries}): {url}")
req = urllib.request.Request(url, headers=HEADERS)
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
return html
except urllib.error.HTTPError:
raise
except (ConnectionResetError, ConnectionError, urllib.error.URLError, OSError) as e:
if attempt < retries - 1:
wait = (attempt + 1) * 2
logger.warning(f"Connection error (retry {attempt + 1}/{retries} after {wait}s): {e}")
time.sleep(wait)
else:
logger.error(f"HTTP request failed after {retries} attempts: {e}", exc_info=True)
raise
def fetch_listing_page(page: int = 1) -> tuple[list[dict], int]:
"""Fetch a page of Prague listings. Returns (items, total_count)."""
if page == 1:
@@ -63,41 +85,26 @@ def fetch_listing_page(page: int = 1) -> tuple[list[dict], int]:
else:
url = f"{BASE_URL}/prodej_byty/praha/{page}_strana/"
logger.debug(f"HTTP GET request: {url}")
logger.debug(f"Headers: {HEADERS}")
req = urllib.request.Request(url, headers=HEADERS)
try:
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
html = fetch_url(url)
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script>',
html, re.DOTALL
)
if not match:
logger.debug("No __NEXT_DATA__ script found in HTML")
return [], 0
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script>',
html, re.DOTALL
)
if not match:
logger.debug("No __NEXT_DATA__ script found in HTML")
return [], 0
data = json.loads(match.group(1))
offer_list = data["props"]["pageProps"]["store"]["offer"]["list"]
logger.debug(f"Page {page}: found {len(offer_list['data'])} items, total={offer_list['total']}")
return offer_list["data"], offer_list["total"]
except (urllib.error.URLError, ConnectionError, OSError) as e:
logger.error(f"HTTP request failed for {url}: {e}", exc_info=True)
raise
data = json.loads(match.group(1))
offer_list = data["props"]["pageProps"]["store"]["offer"]["list"]
logger.debug(f"Page {page}: found {len(offer_list['data'])} items, total={offer_list['total']}")
return offer_list["data"], offer_list["total"]
def fetch_detail(listing_url: str) -> dict | None:
"""Fetch detail page for a listing to get floor, building type, etc."""
try:
url = f"{BASE_URL}{listing_url}"
logger.debug(f"HTTP GET request: {url}")
req = urllib.request.Request(url, headers=HEADERS)
resp = urllib.request.urlopen(req, timeout=30)
html = resp.read().decode("utf-8")
logger.debug(f"HTTP response: status={resp.status}, size={len(html)} bytes")
html = fetch_url(url)
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.*?)</script>',
html, re.DOTALL
@@ -324,6 +331,8 @@ def scrape(max_pages: int | None = None, max_properties: int | None = None):
"first_seen": cached.get("first_seen", datetime.now().strftime("%Y-%m-%d")) if cached else datetime.now().strftime("%Y-%m-%d"),
"last_changed": datetime.now().strftime("%Y-%m-%d"),
}
if not validate_listing(result, "realingo"):
continue
results.append(result)
properties_fetched += 1

View File

@@ -1,13 +1,53 @@
"""Shared utility for writing per-scraper run statistics to JSON."""
"""Shared utilities for scraper run statistics and listing validation."""
from __future__ import annotations
import json
import logging
import os
from pathlib import Path
HERE = Path(__file__).parent
DATA_DIR = Path(os.environ.get("DATA_DIR", HERE))
_val_log = logging.getLogger(__name__)
_REQUIRED_FIELDS = ("hash_id", "price", "locality", "lat", "lon", "url", "source")
def validate_listing(listing: dict, context: str = "") -> bool:
"""
Validate a listing dict before it is written to the output JSON.
Returns True if valid, False if the listing should be skipped.
Logs a warning for each invalid listing.
"""
prefix = f"[{context}] " if context else ""
for field in _REQUIRED_FIELDS:
val = listing.get(field)
if val is None or val == "":
_val_log.warning(f"{prefix}Skipping listing — missing field '{field}': {listing.get('hash_id', '?')}")
return False
price = listing.get("price")
if not isinstance(price, (int, float)) or price <= 0:
_val_log.warning(f"{prefix}Skipping listing — invalid price={price!r}: {listing.get('hash_id', '?')}")
return False
lat, lon = listing.get("lat"), listing.get("lon")
if not isinstance(lat, (int, float)) or not isinstance(lon, (int, float)):
_val_log.warning(f"{prefix}Skipping listing — non-numeric GPS lat={lat!r} lon={lon!r}: {listing.get('hash_id', '?')}")
return False
if not (47.0 <= lat <= 52.0) or not (12.0 <= lon <= 19.0):
_val_log.warning(f"{prefix}Skipping listing — GPS outside Czech Republic lat={lat} lon={lon}: {listing.get('hash_id', '?')}")
return False
area = listing.get("area")
if area is not None and (not isinstance(area, (int, float)) or area <= 0):
_val_log.warning(f"{prefix}Skipping listing — invalid area={area!r}: {listing.get('hash_id', '?')}")
return False
return True
def write_stats(filename: str, stats: dict) -> None:
"""Write scraper run stats dict to the data directory."""

View File

@@ -312,7 +312,7 @@ def _render_status_html(status: dict | None, history: list, is_running: bool = F
f'<title>Scraper status</title>\n<style>{_CSS}</style>\n'
)
page_header = '<h1>Scraper status</h1>\n<div class="subtitle">maru-hleda-byt</div>\n'
footer = '<div class="link-row"><a href="/">Otevřít mapu</a></div>'
footer = '<div class="link-row"><a href="/mapa_bytu.html">Otevřít mapu</a></div>'
if status is None:
return (