From 263e46ba4d12ac8386a3342e92370ac1d9ab6e01 Mon Sep 17 00:00:00 2001 From: Jayden Pyles <111098627+jaypyles@users.noreply.github.com> Date: Sat, 17 May 2025 16:31:34 -0500 Subject: [PATCH] feat: add media viewer + other fixes (#79) * feat: add media viewer + other fixes * chore: remove logging [skip ci] * chore: remove logging [skip ci] * feat: add unit test for media * feat: add unit test for media * feat: add unit test for media [skip ci] * feat: add unit test for media [skip ci] * feat: add unit test for media [skip ci] * feat: add unit test for media [skip ci] * chore: update docs [skip ci] --- .github/actions/run-cypress-tests/action.yaml | 2 +- .gitignore | 16 +- Makefile | 8 +- README.md | 4 +- api/backend/constants.py | 10 + api/backend/job/scraping/collect_media.py | 19 +- api/backend/job/scraping/scraping_utils.py | 4 +- api/backend/routers/job_router.py | 29 +- api/backend/scraping.py | 20 +- api/backend/worker/job_worker.py | 1 + cypress/e2e/submit-job.cy.ts | 54 +++ docker-compose.dev.yml | 6 + docker-compose.yml | 6 - docs/main_page.png | Bin 47917 -> 49215 bytes src/components/ai/JobSelector.tsx | 113 ++--- .../dialog/advanced-job-options-dialog.tsx | 1 + src/components/common/csv-table/csv-table.tsx | 5 +- .../media-viewer/audio/audio-viewer.tsx | 40 ++ .../common/media-viewer/audio/index.ts | 1 + .../media-viewer/image/image-viewer.tsx | 36 ++ .../common/media-viewer/image/index.ts | 1 + src/components/common/media-viewer/index.ts | 1 + .../common/media-viewer/media-viewer.tsx | 75 ++++ .../common/media-viewer/pdf-viewer/index.ts | 1 + .../media-viewer/pdf-viewer/pdf-viewer.tsx | 33 ++ .../media-viewer/tile-grid-view/index.ts | 1 + .../tile-grid-view/tile-grid-view.tsx | 114 +++++ .../common/media-viewer/video/index.ts | 1 + .../media-viewer/video/video-viewer.tsx | 39 ++ .../common/nav-drawer/nav-items/nav-items.tsx | 7 +- src/components/jobs/JobQueue.tsx | 26 +- src/components/pages/media/id/id.tsx | 392 ++++++++++++++++++ src/components/pages/media/id/index.ts | 1 + src/lib/helpers/parse-job-options.ts | 4 + src/pages/api/media/get-media.ts | 24 ++ src/pages/api/media/index.ts | 33 ++ src/pages/media/index.tsx | 1 + src/types/job.ts | 2 +- 38 files changed, 1047 insertions(+), 84 deletions(-) create mode 100644 src/components/common/media-viewer/audio/audio-viewer.tsx create mode 100644 src/components/common/media-viewer/audio/index.ts create mode 100644 src/components/common/media-viewer/image/image-viewer.tsx create mode 100644 src/components/common/media-viewer/image/index.ts create mode 100644 src/components/common/media-viewer/index.ts create mode 100644 src/components/common/media-viewer/media-viewer.tsx create mode 100644 src/components/common/media-viewer/pdf-viewer/index.ts create mode 100644 src/components/common/media-viewer/pdf-viewer/pdf-viewer.tsx create mode 100644 src/components/common/media-viewer/tile-grid-view/index.ts create mode 100644 src/components/common/media-viewer/tile-grid-view/tile-grid-view.tsx create mode 100644 src/components/common/media-viewer/video/index.ts create mode 100644 src/components/common/media-viewer/video/video-viewer.tsx create mode 100644 src/components/pages/media/id/id.tsx create mode 100644 src/components/pages/media/id/index.ts create mode 100644 src/pages/api/media/get-media.ts create mode 100644 src/pages/api/media/index.ts create mode 100644 src/pages/media/index.tsx diff --git a/.github/actions/run-cypress-tests/action.yaml b/.github/actions/run-cypress-tests/action.yaml index a4d845b..e657886 100644 --- a/.github/actions/run-cypress-tests/action.yaml +++ b/.github/actions/run-cypress-tests/action.yaml @@ -15,7 +15,7 @@ runs: - name: Setup Docker project shell: bash - run: make build up-dev + run: make build-ci up-ci - name: Install dependencies shell: bash diff --git a/.gitignore b/.gitignore index f74c7d3..8ac86da 100644 --- a/.gitignore +++ b/.gitignore @@ -188,6 +188,18 @@ postgres_data .vscode ollama data -media + +media/images +media/videos +media/audio +media/pdfs +media/spreadsheets +media/presentations +media/documents +media/recordings +media/download_summary.txt + cypress/screenshots -cypress/videos \ No newline at end of file +cypress/videos + +docker-compose.dev.local.yml \ No newline at end of file diff --git a/Makefile b/Makefile index b33f273..94bc27d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .DEFAULT_GOAL := help -COMPOSE_DEV = docker compose -f docker-compose.yml -f docker-compose.dev.yml +COMPOSE_DEV = docker compose -f docker-compose.yml -f docker-compose.dev.local.yml COMPOSE_PROD = docker compose -f docker-compose.yml .PHONY: help deps build pull up up-dev down setup deploy @@ -53,5 +53,11 @@ setup: deploy: ansible-playbook -i ./ansible/inventory.yaml ./ansible/deploy_site.yaml -v +build-ci: + docker compose -f docker-compose.yml -f docker-compose.dev.yml build + +up-ci: + docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --force-recreate + cypress-start: DISPLAY=:0 npx cypress open \ No newline at end of file diff --git a/README.md b/README.md index 03c7580..ed586f0 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ ## 📋 Overview -Scraperr enables you to extract data from websites with precision using XPath selectors. This self-hosted application provides a clean interface to manage scraping jobs, view results, and export data. +Scrape websites without writing a single line of code. > 📚 **[Check out the docs](https://scraperr-docs.pages.dev)** for a comprehensive quickstart guide and detailed information. @@ -29,7 +29,7 @@ Scraperr enables you to extract data from websites with precision using XPath se - **Custom Headers**: Add JSON headers to your scraping requests - **Media Downloads**: Automatically download images, videos, and other media - **Results Visualization**: View scraped data in a structured table format -- **Data Export**: Export your results in various formats +- **Data Export**: Export your results in markdown and csv formats - **Notifcation Channels**: Send completion notifcations, through various channels ## 🚀 Getting Started diff --git a/api/backend/constants.py b/api/backend/constants.py index d009219..0939855 100644 --- a/api/backend/constants.py +++ b/api/backend/constants.py @@ -4,3 +4,13 @@ import os DATABASE_PATH = "data/database.db" RECORDINGS_DIR = Path("media/recordings") RECORDINGS_ENABLED = os.getenv("RECORDINGS_ENABLED", "true").lower() == "true" +MEDIA_DIR = Path("media") +MEDIA_TYPES = [ + "audio", + "documents", + "images", + "pdfs", + "presentations", + "spreadsheets", + "videos", +] diff --git a/api/backend/job/scraping/collect_media.py b/api/backend/job/scraping/collect_media.py index 6cab8f3..e62f587 100644 --- a/api/backend/job/scraping/collect_media.py +++ b/api/backend/job/scraping/collect_media.py @@ -1,6 +1,7 @@ import os from pathlib import Path -from urllib.parse import urlparse +import re +from urllib.parse import urljoin, urlparse from typing import Dict, List import aiohttp @@ -9,12 +10,12 @@ from playwright.async_api import Page from api.backend.utils import LOG -async def collect_media(page: Page) -> dict[str, list[dict[str, str]]]: +async def collect_media(id: str, page: Page) -> dict[str, list[dict[str, str]]]: media_types = { "images": "img", "videos": "video", "audio": "audio", - "pdfs": 'a[href$=".pdf"]', + "pdfs": 'a[href$=".pdf"], a[href*=".pdf#page="]', "documents": 'a[href$=".doc"], a[href$=".docx"], a[href$=".txt"], a[href$=".rtf"]', "presentations": 'a[href$=".ppt"], a[href$=".pptx"]', "spreadsheets": 'a[href$=".xls"], a[href$=".xlsx"], a[href$=".csv"]', @@ -48,6 +49,11 @@ async def collect_media(page: Page) -> dict[str, list[dict[str, str]]]: root_domain = f"{root_url.scheme}://{root_url.netloc}" url = f"{root_domain}{url}" + if url and re.match(r"^[\w\-]+/", url): + root_url = urlparse(page.url) + root_domain = f"{root_url.scheme}://{root_url.netloc}" + url = urljoin(root_domain + "/", url) + if url and url.startswith(("http://", "https://")): try: parsed = urlparse(url) @@ -67,15 +73,20 @@ async def collect_media(page: Page) -> dict[str, list[dict[str, str]]]: }.get(media_type, "") filename += ext - file_path = media_dir / filename + if not os.path.exists(media_dir / id): + os.makedirs(media_dir / id, exist_ok=True) + + file_path = media_dir / id / f"{filename}" async with session.get(url) as response: response.raise_for_status() + with open(file_path, "wb") as f: while True: chunk = await response.content.read(8192) if not chunk: break + f.write(chunk) urls.append({"url": url, "local_path": str(file_path)}) diff --git a/api/backend/job/scraping/scraping_utils.py b/api/backend/job/scraping/scraping_utils.py index bd71043..bffceaf 100644 --- a/api/backend/job/scraping/scraping_utils.py +++ b/api/backend/job/scraping/scraping_utils.py @@ -8,7 +8,7 @@ from api.backend.job.scraping.collect_media import collect_media as collect_medi async def scrape_content( - page: Page, pages: Set[Tuple[str, str]], collect_media: bool + id: str, page: Page, pages: Set[Tuple[str, str]], collect_media: bool ) -> str: last_height = await page.evaluate("document.body.scrollHeight") @@ -27,6 +27,6 @@ async def scrape_content( if collect_media: LOG.info("Collecting media") - await collect_media_utils(page) + await collect_media_utils(id, page) return html diff --git a/api/backend/routers/job_router.py b/api/backend/routers/job_router.py index 13c1be5..2a13b90 100644 --- a/api/backend/routers/job_router.py +++ b/api/backend/routers/job_router.py @@ -42,7 +42,7 @@ from api.backend.job.cron_scheduling.cron_scheduling import ( from api.backend.job.utils.clean_job_format import clean_job_format from api.backend.job.utils.stream_md_from_job_results import stream_md_from_job_results -from api.backend.constants import RECORDINGS_DIR +from api.backend.constants import MEDIA_DIR, MEDIA_TYPES, RECORDINGS_DIR LOG = logging.getLogger(__name__) @@ -244,3 +244,30 @@ async def get_recording(id: str): return FileResponse( path, headers={"Content-Type": "video/mp4", "Accept-Ranges": "bytes"} ) + + +@job_router.get("/get-media") +async def get_media(id: str): + try: + files: dict[str, list[str]] = {} + + for media_type in MEDIA_TYPES: + path = MEDIA_DIR / media_type / f"{id}" + + files[media_type] = [file.name for file in path.glob("*")] + + return JSONResponse(content={"files": files}) + except Exception as e: + LOG.error(f"Exception occurred: {e}") + traceback.print_exc() + return JSONResponse(content={"error": str(e)}, status_code=500) + + +@job_router.get("/media") +async def get_media_file(id: str, type: str, file: str): + path = MEDIA_DIR / type / f"{id}" / file + + if not path.exists(): + return JSONResponse(content={"error": "Media file not found."}, status_code=404) + + return FileResponse(path) diff --git a/api/backend/scraping.py b/api/backend/scraping.py index 6024e28..21b7699 100644 --- a/api/backend/scraping.py +++ b/api/backend/scraping.py @@ -1,5 +1,4 @@ import logging -from pickle import FALSE import random from typing import Any, Optional, cast @@ -40,6 +39,7 @@ def sxpath(context: etree._Element, xpath: str): async def make_site_request( + id: str, url: str, headers: Optional[dict[str, Any]], multi_page_scrape: bool = False, @@ -71,14 +71,14 @@ async def make_site_request( try: await page.goto(url, timeout=60000) - await page.wait_for_load_state("networkidle", timeout=10000) + await page.wait_for_load_state("networkidle") final_url = page.url visited_urls.add(url) visited_urls.add(final_url) - html_content = await scrape_content(page, pages, collect_media) + html_content = await scrape_content(id, page, pages, collect_media) html_content = await page.content() pages.add((html_content, final_url)) @@ -112,6 +112,7 @@ async def make_site_request( if link not in visited_urls and is_same_domain(link, original_url): await make_site_request( + id, link, headers=headers, multi_page_scrape=multi_page_scrape, @@ -136,11 +137,20 @@ async def collect_scraped_elements(page: tuple[str, str], xpaths: list[Element]) for e in el: # type: ignore text = ( - "\t".join(str(t) for t in e.itertext()) + " ".join(str(t) for t in e.itertext()) if isinstance(e, etree._Element) else str(e) # type: ignore ) + text = text.strip() + text = text.replace("\n", " ") + text = text.replace("\t", " ") + text = text.replace("\r", " ") + text = text.replace("\f", " ") + text = text.replace("\v", " ") + text = text.replace("\b", " ") + text = text.replace("\a", " ") + captured_element = CapturedElement( xpath=elem.xpath, text=text, name=elem.name ) @@ -154,6 +164,7 @@ async def collect_scraped_elements(page: tuple[str, str], xpaths: list[Element]) async def scrape( + id: str, url: str, xpaths: list[Element], headers: Optional[dict[str, Any]] = None, @@ -167,6 +178,7 @@ async def scrape( pages: set[tuple[str, str]] = set() await make_site_request( + id, url, headers=headers, multi_page_scrape=multi_page_scrape, diff --git a/api/backend/worker/job_worker.py b/api/backend/worker/job_worker.py index e550a39..e8a130e 100644 --- a/api/backend/worker/job_worker.py +++ b/api/backend/worker/job_worker.py @@ -76,6 +76,7 @@ async def process_job(): proxies = [] scraped = await scrape( + job["id"], job["url"], [Element(**j) for j in job["elements"]], job["job_options"]["custom_headers"], diff --git a/cypress/e2e/submit-job.cy.ts b/cypress/e2e/submit-job.cy.ts index 4d4ccf1..e36824b 100644 --- a/cypress/e2e/submit-job.cy.ts +++ b/cypress/e2e/submit-job.cy.ts @@ -30,5 +30,59 @@ describe.only("Job", () => { "exist" ); cy.contains("div", "Completed", { timeout: 20000 }).should("exist"); + + cy.get("tbody tr") + .first() + .within(() => { + cy.get('input[type="checkbox"]').click(); + }); + + cy.get("[data-testid='DeleteIcon']").click(); + + cy.contains("div", "https://example.com", { timeout: 10000 }).should( + "not.exist" + ); + }); + + it("should create a job with advanced options (media)", () => { + cy.intercept("POST", "/api/submit-scrape-job").as("submitScrapeJob"); + + cy.visit("/"); + + cy.get("button").contains("Advanced Job Options").click(); + + cy.get('[data-cy="collect-media-checkbox"]').click(); + cy.get("body").type("{esc}"); + + cy.get('[data-cy="url-input"]').type("https://books.toscrape.com"); + cy.get('[data-cy="name-field"]').type("example"); + cy.get('[data-cy="xpath-field"]').type("//body"); + cy.get('[data-cy="add-button"]').click(); + + cy.get("button").contains("Submit").click(); + + cy.get("li").contains("Jobs").click(); + + cy.contains("div", "https://books.toscrape.com", { timeout: 10000 }).should( + "exist" + ); + + cy.contains("div", "Completed", { timeout: 20000 }).should("exist"); + cy.get("li").contains("Media").click(); + + cy.get("div[id='select-job']").click(); + cy.get("li[role='option']").click(); + + cy.get("[data-testid='media-grid']", { timeout: 10000 }).should("exist"); + + cy.get("li").contains("Jobs").click(); + + cy.get("tbody tr") + .first() + .within(() => { + cy.get('input[type="checkbox"]').click(); + }); + + cy.get("[data-testid='DeleteIcon']").click(); }); }); diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 9306d8c..c44c1f2 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,6 +1,9 @@ version: "3" services: scraperr: + build: + context: . + dockerfile: docker/frontend/Dockerfile command: ["npm", "run", "dev"] volumes: - "$PWD/src:/app/src" @@ -10,6 +13,9 @@ services: - "$PWD/package-lock.json:/app/package-lock.json" - "$PWD/tsconfig.json:/app/tsconfig.json" scraperr_api: + build: + context: . + dockerfile: docker/api/Dockerfile environment: - LOG_LEVEL=INFO volumes: diff --git a/docker-compose.yml b/docker-compose.yml index 7625d5c..e5d5e2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,9 +1,6 @@ services: scraperr: image: jpyles0524/scraperr:latest - build: - context: . - dockerfile: docker/frontend/Dockerfile container_name: scraperr command: ["npm", "run", "start"] environment: @@ -16,9 +13,6 @@ services: scraperr_api: init: True image: jpyles0524/scraperr_api:latest - build: - context: . - dockerfile: docker/api/Dockerfile environment: - LOG_LEVEL=INFO container_name: scraperr_api diff --git a/docs/main_page.png b/docs/main_page.png index ea94c173a8fa253cb5494644a36786bffbff5b7d..1e351a390392f2fed8a5e2a2e95652d61e6bc982 100644 GIT binary patch literal 49215 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%0A1vB=xCTZg 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 literal 47917 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 | ((job: Job) => void); @@ -44,6 +49,12 @@ export const JobSelector = ({ const open = Boolean(anchorEl); + useEffect(() => { + if (!open) { + setAnchorEl(null); + } + }, [open]); + return ( @@ -80,57 +91,63 @@ export const JobSelector = ({ ) : null} - - {popoverJob && ( - + - - {popoverJob.url} - -
- - {popoverJob.time_created - ? new Date(popoverJob.time_created).toLocaleString() - : "Unknown"} - -
-
- )} -
+ + {popoverJob.url} + +
+ + {popoverJob.time_created + ? new Date(popoverJob.time_created).toLocaleString() + : "Unknown"} + +
+
+ )} + + + )} ); }; diff --git a/src/components/common/advanced-job-options/dialog/advanced-job-options-dialog.tsx b/src/components/common/advanced-job-options/dialog/advanced-job-options-dialog.tsx index 588bcc0..6cd7148 100644 --- a/src/components/common/advanced-job-options/dialog/advanced-job-options-dialog.tsx +++ b/src/components/common/advanced-job-options/dialog/advanced-job-options-dialog.tsx @@ -140,6 +140,7 @@ export const AdvancedJobOptionsDialog = ({ } label={ diff --git a/src/components/common/csv-table/csv-table.tsx b/src/components/common/csv-table/csv-table.tsx index c5ef4ed..d6fd934 100644 --- a/src/components/common/csv-table/csv-table.tsx +++ b/src/components/common/csv-table/csv-table.tsx @@ -131,8 +131,9 @@ export const CsvTable: React.FC = ({ csv, className }) => { {row.text ? row.text - .replace(/(\r\n|\n|\r)/g, " ") - .replace(/\t/g, " ") + .replace(/[\n\t\r]+/g, " ") + .replace(/\s+/g, " ") + .trim() : "No text available"} diff --git a/src/components/common/media-viewer/audio/audio-viewer.tsx b/src/components/common/media-viewer/audio/audio-viewer.tsx new file mode 100644 index 0000000..930768e --- /dev/null +++ b/src/components/common/media-viewer/audio/audio-viewer.tsx @@ -0,0 +1,40 @@ + +import { Box, Typography } from "@mui/material"; + +interface AudioViewerProps { + mediaUrl: string; + selectedMedia: string; + onError: () => void; +} + +export const AudioViewer = ({ + mediaUrl, + selectedMedia, + onError, +}: AudioViewerProps) => { + return ( + + {selectedMedia} + + + ); +}; diff --git a/src/components/common/media-viewer/audio/index.ts b/src/components/common/media-viewer/audio/index.ts new file mode 100644 index 0000000..349d620 --- /dev/null +++ b/src/components/common/media-viewer/audio/index.ts @@ -0,0 +1 @@ +export * from "./audio-viewer"; diff --git a/src/components/common/media-viewer/image/image-viewer.tsx b/src/components/common/media-viewer/image/image-viewer.tsx new file mode 100644 index 0000000..10decf0 --- /dev/null +++ b/src/components/common/media-viewer/image/image-viewer.tsx @@ -0,0 +1,36 @@ +import { Box, useTheme } from "@mui/material"; + +export const ImageViewer = ({ + mediaUrl, + selectedMedia, +}: { + mediaUrl: string; + selectedMedia: string; +}) => { + const theme = useTheme(); + return ( + + {selectedMedia} + + ); +}; diff --git a/src/components/common/media-viewer/image/index.ts b/src/components/common/media-viewer/image/index.ts new file mode 100644 index 0000000..44b51d7 --- /dev/null +++ b/src/components/common/media-viewer/image/index.ts @@ -0,0 +1 @@ +export * from "./image-viewer"; diff --git a/src/components/common/media-viewer/index.ts b/src/components/common/media-viewer/index.ts new file mode 100644 index 0000000..bb46356 --- /dev/null +++ b/src/components/common/media-viewer/index.ts @@ -0,0 +1 @@ +export * from "./media-viewer"; diff --git a/src/components/common/media-viewer/media-viewer.tsx b/src/components/common/media-viewer/media-viewer.tsx new file mode 100644 index 0000000..70e2407 --- /dev/null +++ b/src/components/common/media-viewer/media-viewer.tsx @@ -0,0 +1,75 @@ +import { Box, Typography } from "@mui/material"; +import { ImageViewer } from "./image"; +import { VideoViewer } from "./video"; +import { AudioViewer } from "./audio"; +import { PDFViewer } from "./pdf-viewer"; + +interface MediaViewerProps { + selectedMedia: string; + activeTab: string; + getMediaUrl: (fileName: string) => string; + onError: (error: string) => void; +} + +export const MediaViewer = ({ + selectedMedia, + activeTab, + getMediaUrl, + onError, +}: MediaViewerProps) => { + if (!selectedMedia) { + return ( + + + Select a file to view + + + ); + } + + const mediaUrl = getMediaUrl(selectedMedia); + + switch (activeTab) { + case "images": + return ; + case "videos": + return ( + onError("Error loading video")} + /> + ); + case "audio": + return ( + onError("Error loading audio")} + /> + ); + case "pdfs": + return ; + default: + return ( + + + {selectedMedia} - Download this file to view it + + + ); + } +}; diff --git a/src/components/common/media-viewer/pdf-viewer/index.ts b/src/components/common/media-viewer/pdf-viewer/index.ts new file mode 100644 index 0000000..e1ce37f --- /dev/null +++ b/src/components/common/media-viewer/pdf-viewer/index.ts @@ -0,0 +1 @@ +export * from "./pdf-viewer"; diff --git a/src/components/common/media-viewer/pdf-viewer/pdf-viewer.tsx b/src/components/common/media-viewer/pdf-viewer/pdf-viewer.tsx new file mode 100644 index 0000000..63318dd --- /dev/null +++ b/src/components/common/media-viewer/pdf-viewer/pdf-viewer.tsx @@ -0,0 +1,33 @@ +import { Box, useTheme } from "@mui/material"; + +interface PDFViewerProps { + mediaUrl: string; + selectedMedia: string; +} + +export const PDFViewer = ({ mediaUrl, selectedMedia }: PDFViewerProps) => { + const theme = useTheme(); + + return ( + +