{"id":19156018,"url":"https://github.com/markkimsal/video-thumbnailer","last_synced_at":"2025-10-29T00:35:02.528Z","repository":{"id":66691817,"uuid":"262384762","full_name":"markkimsal/video-thumbnailer","owner":"markkimsal","description":"Network enabled API endpoint for ffmpeg.  Turn a video into a thumbnail.","archived":false,"fork":false,"pushed_at":"2022-04-21T13:08:47.000Z","size":1289,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-06T03:59:23.123Z","etag":null,"topics":["api","docker","docker-compose","ffmpeg","php","screenshot","thumbnails","video","video-thumbnailer"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/markkimsal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-05-08T17:20:57.000Z","updated_at":"2024-08-10T09:09:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"11500a13-e12c-46e7-99f5-003782590173","html_url":"https://github.com/markkimsal/video-thumbnailer","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markkimsal%2Fvideo-thumbnailer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markkimsal%2Fvideo-thumbnailer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markkimsal%2Fvideo-thumbnailer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markkimsal%2Fvideo-thumbnailer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markkimsal","download_url":"https://codeload.github.com/markkimsal/video-thumbnailer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252833966,"owners_count":21811285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","docker","docker-compose","ffmpeg","php","screenshot","thumbnails","video","video-thumbnailer"],"created_at":"2024-11-09T08:32:58.569Z","updated_at":"2025-10-29T00:34:57.486Z","avatar_url":"https://github.com/markkimsal.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Video Thumbnailer\n===\n\nDeploy with `docker-compose` or however you want.\n\nURL parameters are:\n * url:  The publically available video file\n * s:  the second into the video that the screenshot should be taken (defaults to 2)\n * fmt:  format of the image, either png, jpg, or jpeg (defaults to jpg)\n\nResponse\n===\nThe response will be the binary output of the screenshot image.  The image is currently not scaled.\n\nHeaders returned include:\n * Content-Disposition: attachment; filename=\"{unique id.png}\"\n * Content-Type: [ image/png | image/jpeg ]\n * Content-Length: [ integer num bytes ]\n\nExample\n===\n\nRun the image\n```\ndocker run --rm -d -p 9999:8080 markkimsal/video-thumbnailer:2.0.0\n```\n\nTest the service:\n```\n curl -O -J -X GET \"http://127.0.0.1:9999/index.php?url=https://github.com/markkimsal/video-thumbnailer/raw/master/fixtures/ISS-live-stream-earth-from-space-2020-05-08.mp4\u0026s=3.8\"\n```\nThis will download the file and use the header from `Content-disposition: attachment;filename=\"\"` to save the file locally.\n\nThe filename is a ULID.\n\nCaching\n===\nPublic cache-control headers are sent along with an expires for 1 month.  Adjust the nginx-vhost.conf file to suit your needs and rebuild with docker-compose.\n\nSecurity\n===\nThis is essentially an open proxy, so secure it with:\n * firewall rules\n * reverse proxy\n * docker swarm networks\n * k8s\n\nYou can restrict the video downloading to a list of known hosts via the `DOMAINS` environment variable.\n\n```\n#docker-compose.yml\n\n    environment:\n       - DOMAINS=github.com,igotaprinter.com\n```\n\nIf the requested video's host does not match something in the list, it will be rejected with `'422 Unprocesible Entity'`.\nMatching is done with the `host` component of php's `parse_url()` function.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkkimsal%2Fvideo-thumbnailer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkkimsal%2Fvideo-thumbnailer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkkimsal%2Fvideo-thumbnailer/lists"}