diff --git a/lapaella-mirror/recover_assets.py b/lapaella-mirror/recover_assets.py new file mode 100644 index 0000000..a356811 --- /dev/null +++ b/lapaella-mirror/recover_assets.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python3 +""" +Recover missing images and pages from lapaella.net mirror. + +Strategy: + 1. Scan all local HTML for wp-content/uploads/* paths not present on disk + 2. For each missing image try: + a. Direct live URL (site may still exist in cache/CDN) + b. Wayback im_ modifier with CDX-best timestamp + c. Wayback im_ with known timestamps in order + 3. Download missing HTML pages via fetch_missing-style CDX lookup + 4. Report final stats + +Run from the lapaella-mirror directory. +""" + +import os, re, sys, time, subprocess, tempfile, urllib.parse, json +from pathlib import Path +from concurrent.futures import ThreadPoolExecutor, as_completed +from threading import Lock + +SITE = Path(__file__).parent / "site" +UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" +BASE = "https://lapaella.net" +BASE_OLD = "http://www.lapaella.net" +# Most useful timestamps for this site +TS_LIST = [ + "20241130065929", + "20241014051856", + "20210603053819", + "20220101000000", + "20200601000000", + "20180101000000", + "20150101000000", + "20120601000000", +] +DELAY = 0.25 # per-worker delay between requests +print_lock = Lock() + +# ── Missing pages to recover ───────────────────────────────────────────────── +MISSING_PAGES = [ + "/otras-recetas-valencianas/all-i-oli/", + "/arroz-de-frutos-secos-garbanzos-y-nisperos/", + "/clochina-o-mejillon/", + "/receta-de-arroz-negro/", + "/receta-de-fideua", + "/otras-recetas-valencianas/", + "/enlaces/", + "/valencian-paella-introduction/", + "/paella-valenciana-recipe-english/", + "/contacto/", +] + +# ── Helpers ────────────────────────────────────────────────────────────────── + +def log(msg): + with print_lock: + print(msg, flush=True) + +def curl_fetch(url, is_image=False): + tmp = None + try: + tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".tmp") + tmp.close() + cmd = [ + "/usr/bin/curl", "-s", "-L", "--max-time", "20", + "-A", UA, + "-w", "\n__S__%{http_code}", + "-o", tmp.name, + url, + ] + r = subprocess.run(cmd, capture_output=True, text=True, timeout=30) + status = 0 + for line in r.stdout.splitlines(): + if line.startswith("__S__"): + try: status = int(line[5:].strip()) + except: pass + if status in (404, 403, 410, 0): + return None + with open(tmp.name, "rb") as f: + data = f.read() + min_size = 200 if is_image else 500 + return data if len(data) >= min_size else None + except Exception: + return None + finally: + if tmp: + try: os.unlink(tmp.name) + except: pass + +def cdx_best_ts(orig_path, from_year="2010"): + """Ask CDX for the best (closest to latest) 200-status snapshot timestamp.""" + try: + url = ( + "https://web.archive.org/cdx/search/cdx" + f"?url=lapaella.net{urllib.parse.quote(orig_path)}" + "&output=json&limit=5&fl=timestamp&filter=statuscode:200" + f"&from={from_year}0101&to=20251231&fastLatest=true" + ) + data = curl_fetch(url) + if not data: + return None + rows = json.loads(data.decode()) + # rows[0] is the header ["timestamp"] + if len(rows) > 1: + return rows[1][0] # best timestamp + except Exception: + pass + return None + +def local_path_for(orig_path): + decoded = urllib.parse.unquote(orig_path).lstrip("/") + if not decoded or decoded.endswith("/"): + return SITE / decoded / "index.html" + p = Path(decoded) + return SITE / p / "index.html" if not p.suffix else SITE / p + +def wbm_image_url(orig_path, ts): + return f"https://web.archive.org/web/{ts}im_/{BASE}{orig_path}" + +def wbm_page_url(orig_path, ts, old=False): + base = BASE_OLD if old else BASE + return f"https://web.archive.org/web/{ts}/{base}{orig_path}" + +# ── Image recovery ─────────────────────────────────────────────────────────── + +def recover_image(orig_path): + local = local_path_for(orig_path) + if local.exists(): + return "skip", orig_path + + # 1) Try live site first (fast, no WBM rate limits) + live_url = f"{BASE}{orig_path}" + data = curl_fetch(live_url, is_image=True) + if data: + local.parent.mkdir(parents=True, exist_ok=True) + local.write_bytes(data) + log(f" ✓ live {orig_path}") + return "ok", orig_path + + # 2) CDX best timestamp + best_ts = cdx_best_ts(orig_path) + ts_candidates = ([best_ts] if best_ts else []) + [ + ts for ts in TS_LIST if ts != best_ts + ] + + for ts in ts_candidates: + url = wbm_image_url(orig_path, ts) + data = curl_fetch(url, is_image=True) + if data: + local.parent.mkdir(parents=True, exist_ok=True) + local.write_bytes(data) + log(f" ✓ wbm/{ts[:8]} {orig_path}") + return "ok", orig_path + time.sleep(DELAY) + + log(f" ✗ not found {orig_path}") + return "fail", orig_path + +# ── Page recovery ──────────────────────────────────────────────────────────── + +def orig_path_from_wbm(url): + m = re.match( + r'https?://web\.archive\.org/web/\d+(?:im_|cs_|js_|oe_|if_|mp_)?/' + r'https?://(?:www\.)?lapaella\.net(/[^"\'<>\s#]*)?', + url, + ) + return (m.group(1) or "/") if m else None + +def rewrite_html(html, local_file): + html = re.sub(r'.*?', '', html, flags=re.DOTALL) + html = re.sub(r']*(?:archive\.org|wombat|athena|bundle-playback|ruffle)[^>]*>.*?', '', html, flags=re.DOTALL|re.IGNORECASE) + html = re.sub(r']*(?:archive\.org|wombat|athena|bundle-playback|ruffle)[^>]*/?>', '', html, flags=re.IGNORECASE) + html = re.sub(r']*(?:archive\.org|iconochive|banner-styles)[^>]*/?>', '', html, flags=re.IGNORECASE) + html = re.sub(r']*>\s*__wm\b.*?', '', html, flags=re.DOTALL) + + def _rewrite(url): + if "web.archive.org" not in url: + return url + orig = orig_path_from_wbm(url) + if not orig: + return "#" + rel = os.path.relpath(str(local_path_for(orig)), str(local_file.parent)) + return rel + + def _attr(m): + attr, q, url, q2 = m.group(1), m.group(2), m.group(3), m.group(4) + return f'{attr}={q}{_rewrite(url)}{q2}' + html = re.sub(r'((?:src|href|action|data-src)=)(["\'])([^"\']+)(["\'])', _attr, html) + + def _css_url(m): + url = m.group(1).strip().strip("'\"") + return f"url('{_rewrite(url)}')" + html = re.sub(r'url\(([^)]+)\)', _css_url, html) + return html + +def recover_page(orig_path): + local = local_path_for(orig_path) + if local.exists(): + return "skip", orig_path + + best_ts = cdx_best_ts(orig_path) + ts_candidates = ([best_ts] if best_ts else []) + [ + ts for ts in TS_LIST if ts != best_ts + ] + + for ts in ts_candidates: + for old in (False, True): + url = wbm_page_url(orig_path, ts, old=old) + data = curl_fetch(url) + if data: + html = data.decode("utf-8", errors="replace") + local.parent.mkdir(parents=True, exist_ok=True) + html = rewrite_html(html, local) + local.write_text(html, encoding="utf-8") + log(f" ✓ page/{ts[:8]} {orig_path}") + return "ok", orig_path + time.sleep(DELAY) + + log(f" ✗ page not found {orig_path}") + return "fail", orig_path + +# ── Main ───────────────────────────────────────────────────────────────────── + +def collect_missing_images(): + refs = set() + for f in SITE.rglob("*.html"): + txt = f.read_text(errors="replace") + for m in re.findall(r'(/wp-content/uploads/[^\"\'\s<>\)]+)', txt): + # skip CSS query-string variants and wildcards + if "?" in m or "*" in m or not re.search(r'\.(jpe?g|png|gif|webp|svg|ico|bmp)$', m, re.I): + continue + refs.add(m) + missing = [r for r in sorted(refs) if not (SITE / r.lstrip("/")).exists()] + return missing + +def main(): + missing_images = collect_missing_images() + log(f"\n{'='*60}") + log(f"Missing images : {len(missing_images)}") + log(f"Missing pages : {len(MISSING_PAGES)}") + log(f"{'='*60}\n") + + img_ok = img_fail = 0 + pg_ok = pg_fail = 0 + + # Images — parallel with 4 workers (be polite to WBM) + log("── Images ──────────────────────────────────────────────────") + with ThreadPoolExecutor(max_workers=4) as ex: + futures = {ex.submit(recover_image, p): p for p in missing_images} + for fut in as_completed(futures): + status, _ = fut.result() + if status == "ok": img_ok += 1 + elif status == "fail": img_fail += 1 + + # Pages — sequential (each page may cascade more asset fetches) + log("\n── Pages ───────────────────────────────────────────────────") + for orig_path in MISSING_PAGES: + status, _ = recover_page(orig_path) + if status == "ok": pg_ok += 1 + elif status == "fail": pg_fail += 1 + time.sleep(1.0) + + log(f"\n{'='*60}") + log(f"Images recovered: {img_ok} failed: {img_fail}") + log(f"Pages recovered: {pg_ok} failed: {pg_fail}") + log(f"{'='*60}") + +if __name__ == "__main__": + main() diff --git a/lapaella-mirror/recover_assets2.py b/lapaella-mirror/recover_assets2.py new file mode 100644 index 0000000..82b1672 --- /dev/null +++ b/lapaella-mirror/recover_assets2.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python3 +""" +Phase 2 recovery: fetch RAW WBM HTML pages, extract the actual embedded +WBM image URLs (which carry the correct serving timestamp), download each. +""" + +import os, re, subprocess, tempfile, time, urllib.parse +from pathlib import Path +from concurrent.futures import ThreadPoolExecutor, as_completed +from threading import Lock + +SITE = Path(__file__).parent / "site" +UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" +DELAY = 0.3 +lock = Lock() + +# All WBM snapshot URLs to crawl for image references +WBM_PAGES = [ + # Primary snapshot + "https://web.archive.org/web/20241130065929/https://lapaella.net/receta-paella-valenciana/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/receta-paella-de-marisco/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/receta-paella-de-verduras/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-a-banda/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-al-horno-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-negro/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-allipebrat-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-amb-bledes-con-acelgas/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-amb-fesols-i-naps-con-alubias-y-nabos/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-con-pasas-y-garbanzos/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-meloso-de-pato-setas-y-trufa-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/arroz-meloso-semicaldoso-con-brocheta-de-calamarcitos-y-gambas-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/fideua-de-marisco-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/fideua-de-marisco/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/fideua-negreta-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/fideua-negreta/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/paella-de-bogavante-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/paella-de-langosta-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/paella-de-marisco-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/paella-de-pato-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/paella-de-verduras-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroces-tipicos-de-valencia/paella-morena-2/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/otras-recetas-valencianas/all-i-pebre/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/otras-recetas-valencianas/angulas-al-ajillo/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/otras-recetas-valencianas/clochinas-al-vapor/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/otras-recetas-valencianas/espardenya/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/otras-recetas-valencianas/lubina-a-la-sal/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/otras-recetas-valencianas/pato-al-pebre-picant/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/blog/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/arroz-de-frutos-secos-garbanzos-y-nisperos/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/clochina-o-mejillon/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/coca-valenciana/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/fideua-de-pato-boletus-y-puerro/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/paella-de-coliflor-y-bacalao/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/receta-de-arroz-a-banda/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/receta-de-arroz-negro/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/fotos/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/ingredientes/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/recipiente/", + "https://web.archive.org/web/20241130065929/https://lapaella.net/trucos-y-consejos/", + # Fallback snapshot for older content + "https://web.archive.org/web/20210603053819/http://www.lapaella.net/receta-paella-valenciana/", + "https://web.archive.org/web/20210603053819/http://www.lapaella.net/receta-paella-de-marisco/", + "https://web.archive.org/web/20210603053819/http://www.lapaella.net/arroces-tipicos-de-valencia/arroz-a-banda/", + "https://web.archive.org/web/20210603053819/http://www.lapaella.net/fideua-de-pato-boletus-y-puerro/", + "https://web.archive.org/web/20210603053819/http://www.lapaella.net/clochina-o-mejillon/", +] + +IMG_PAT = re.compile( + r'https://web\.archive\.org/web/(\d+)(?:im_)?/' + r'https?://(?:www\.)?lapaella\.net' + r'(/wp-content/uploads/[^\s"\'<>)]+\.(?:jpe?g|jpeg|png|gif|webp|svg))', + re.IGNORECASE, +) + +def log(msg): + with lock: + print(msg, flush=True) + +def curl_get(url): + tmp = None + try: + tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".tmp") + tmp.close() + r = subprocess.run( + ["/usr/bin/curl", "-s", "-L", "--max-time", "25", "-A", UA, + "-w", "\n__S__%{http_code}", "-o", tmp.name, url], + capture_output=True, text=True, timeout=35, + ) + status = 0 + for line in r.stdout.splitlines(): + if line.startswith("__S__"): + try: status = int(line[5:].strip()) + except: pass + if status in (404, 403, 410, 0): + return None + with open(tmp.name, "rb") as f: + data = f.read() + return data if len(data) > 200 else None + except Exception: + return None + finally: + if tmp: + try: os.unlink(tmp.name) + except: pass + +def local_path_for(orig_path): + decoded = urllib.parse.unquote(orig_path).lstrip("/") + if not decoded or decoded.endswith("/"): + return SITE / decoded / "index.html" + p = Path(decoded) + return SITE / p / "index.html" if not p.suffix else SITE / p + +def extract_image_urls(wbm_page_url): + """Fetch a raw WBM page and extract all embedded WBM image URLs.""" + data = curl_get(wbm_page_url) + if not data: + return {} + html = data.decode("utf-8", errors="replace") + result = {} + for ts, orig_path in IMG_PAT.findall(html): + # clean trailing junk (query strings, fragments, extra chars) + orig_path = re.split(r'["\'\s&?]', orig_path)[0] + wbm_img = f"https://web.archive.org/web/{ts}im_/https://lapaella.net{orig_path}" + result[orig_path] = wbm_img + return result + +def download_image(orig_path, wbm_url): + local = local_path_for(orig_path) + if local.exists(): + return "skip", orig_path + data = curl_get(wbm_url) + if data: + local.parent.mkdir(parents=True, exist_ok=True) + local.write_bytes(data) + log(f" ✓ {orig_path}") + return "ok", orig_path + # Fallback: try without im_ modifier + wbm_plain = wbm_url.replace("im_/", "/") + data = curl_get(wbm_plain) + if data: + local.parent.mkdir(parents=True, exist_ok=True) + local.write_bytes(data) + log(f" ✓ {orig_path} (plain)") + return "ok", orig_path + log(f" ✗ {orig_path}") + return "fail", orig_path + +def main(): + print("Phase 1: crawling WBM pages for embedded image URLs...") + all_imgs = {} # orig_path -> wbm_url + for page_url in WBM_PAGES: + found = extract_image_urls(page_url) + new = {k: v for k, v in found.items() if k not in all_imgs} + if new: + print(f" {page_url.split('/web/')[1][:50]:50s} +{len(new)} images") + all_imgs.update(found) + time.sleep(DELAY) + + # Only bother with images not yet on disk + to_fetch = {k: v for k, v in all_imgs.items() + if not local_path_for(k).exists()} + print(f"\nTotal unique image URLs found : {len(all_imgs)}") + print(f"Already on disk : {len(all_imgs) - len(to_fetch)}") + print(f"To download : {len(to_fetch)}") + print("\nPhase 2: downloading images...") + + ok = fail = 0 + with ThreadPoolExecutor(max_workers=4) as ex: + futures = {ex.submit(download_image, k, v): k + for k, v in to_fetch.items()} + for fut in as_completed(futures): + status, _ = fut.result() + if status == "ok": ok += 1 + elif status == "fail": fail += 1 + + print(f"\n{'='*50}") + print(f"Recovered: {ok} Failed: {fail}") + print(f"{'='*50}") + +if __name__ == "__main__": + main() diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/1-verter-aceite-receta-paella.gif b/lapaella-mirror/site/wp-content/uploads/2011/04/1-verter-aceite-receta-paella.gif new file mode 100644 index 0000000..d8fa04b Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/1-verter-aceite-receta-paella.gif differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/6-pollo-frito-receta-paella.gif b/lapaella-mirror/site/wp-content/uploads/2011/04/6-pollo-frito-receta-paella.gif new file mode 100644 index 0000000..4dce84f Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/6-pollo-frito-receta-paella.gif differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-1-300x200.jpg b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-1-300x200.jpg new file mode 100644 index 0000000..53ebf7a Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-1-300x200.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-1.jpg b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-1.jpg new file mode 100644 index 0000000..5d568c3 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-1.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-10-300x200.jpg b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-10-300x200.jpg new file mode 100644 index 0000000..2002610 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-10-300x200.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-10.jpg b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-10.jpg new file mode 100644 index 0000000..7dc5fa4 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-10.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-12.jpg b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-12.jpg new file mode 100644 index 0000000..3883da6 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-12.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-13.jpg b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-13.jpg new file mode 100644 index 0000000..84f82c2 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2011/04/Paella-marisco-13.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/caballos_intro-150x95.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/caballos_intro-150x95.jpg new file mode 100644 index 0000000..ef7d1cb Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/caballos_intro-150x95.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/caballos_intro.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/caballos_intro.jpg new file mode 100644 index 0000000..b1a30a7 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/caballos_intro.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/paellas-vacias-300x196.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/paellas-vacias-300x196.jpg new file mode 100644 index 0000000..b8117c2 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/paellas-vacias-300x196.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/paellas-vacias.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/paellas-vacias.jpg new file mode 100644 index 0000000..6bcceef Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/paellas-vacias.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/paellavacia-150x150.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/paellavacia-150x150.jpg new file mode 100644 index 0000000..d3ff9a3 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/paellavacia-150x150.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/planta-de-arroz.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/planta-de-arroz.jpg new file mode 100644 index 0000000..b2ac789 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/planta-de-arroz.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/primerplanocortado.jpg b/lapaella-mirror/site/wp-content/uploads/2012/02/primerplanocortado.jpg new file mode 100644 index 0000000..bc89ee2 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/primerplanocortado.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2012/02/recipiente.gif b/lapaella-mirror/site/wp-content/uploads/2012/02/recipiente.gif new file mode 100644 index 0000000..c70e6c6 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2012/02/recipiente.gif differ diff --git a/lapaella-mirror/site/wp-content/uploads/2020/04/image4-300x218.jpg b/lapaella-mirror/site/wp-content/uploads/2020/04/image4-300x218.jpg new file mode 100644 index 0000000..5a723ff Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2020/04/image4-300x218.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2020/05/cropped-lapella_favicon-270x270.png b/lapaella-mirror/site/wp-content/uploads/2020/05/cropped-lapella_favicon-270x270.png new file mode 100644 index 0000000..d3017c3 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2020/05/cropped-lapella_favicon-270x270.png differ diff --git a/lapaella-mirror/site/wp-content/uploads/2020/05/lapaellanet_coca_1-768x576.jpeg b/lapaella-mirror/site/wp-content/uploads/2020/05/lapaellanet_coca_1-768x576.jpeg new file mode 100644 index 0000000..3fe97ce Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2020/05/lapaellanet_coca_1-768x576.jpeg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/fideuadepato-1-300x200.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/fideuadepato-1-300x200.jpg new file mode 100644 index 0000000..64df1d9 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/fideuadepato-1-300x200.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso1a.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso1a.jpg new file mode 100644 index 0000000..276e9e6 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso1a.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso1b.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso1b.jpg new file mode 100644 index 0000000..64ab77d Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso1b.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2a.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2a.jpg new file mode 100644 index 0000000..ad28b82 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2a.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2b.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2b.jpg new file mode 100644 index 0000000..3874cd9 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2b.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2c.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2c.jpg new file mode 100644 index 0000000..c33b995 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2c.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2d.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2d.jpg new file mode 100644 index 0000000..94e8e1a Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2d.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2e.jpg b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2e.jpg new file mode 100644 index 0000000..b22ad63 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/02/paellademarisco_paso2e.jpg differ diff --git a/lapaella-mirror/site/wp-content/uploads/2021/09/fideua.png b/lapaella-mirror/site/wp-content/uploads/2021/09/fideua.png new file mode 100644 index 0000000..f30c741 Binary files /dev/null and b/lapaella-mirror/site/wp-content/uploads/2021/09/fideua.png differ