{"id":20116068,"url":"https://github.com/ri0n/unboxer","last_synced_at":"2026-05-10T13:03:10.140Z","repository":{"id":71599261,"uuid":"420474838","full_name":"Ri0n/unboxer","owner":"Ri0n","description":"MP4 crawler and extractor","archived":false,"fork":false,"pushed_at":"2021-10-28T07:11:46.000Z","size":106,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-13T06:27:37.090Z","etag":null,"topics":["crawler","extractor","mp4","object-oriented-design","qt"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ri0n.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2021-10-23T17:11:10.000Z","updated_at":"2021-11-26T08:42:56.000Z","dependencies_parsed_at":"2023-07-03T20:46:13.433Z","dependency_job_id":null,"html_url":"https://github.com/Ri0n/unboxer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ri0n%2Funboxer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ri0n%2Funboxer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ri0n%2Funboxer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ri0n%2Funboxer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ri0n","download_url":"https://codeload.github.com/Ri0n/unboxer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241558192,"owners_count":19982051,"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":["crawler","extractor","mp4","object-oriented-design","qt"],"created_at":"2024-11-13T18:37:43.956Z","updated_at":"2026-05-10T13:03:10.049Z","avatar_url":"https://github.com/Ri0n.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MP4 crawler library and application\n\nThe goal of the project is parse MP4 files and extract internal data. MP4 files are comprised of \"boxes\" so it's where the project name comes from.\n\nThis is basically a test task for an employer, not a real project. If you are reading this text then most likely you're one of dev team members dedicated to review new candidates and me particularly.\n\nThe project is written with help of Qt framework. Qt has everything necessary for such kind of task and to visualize what's going on and also has perfect documentation. That will fit well the requirements and ensure fast development.\n\nThere are 3 sub-projects inside:\n\n- src - crawler library\n- tools - demo application and visualization tool\n- test - unit tests for the library\n\n## Building\n\nFirst ensure you have next packages installed\n\n- qt core dev\n- qt gui dev\n- qt widgets dev\n- cmake\n\nFor debain-based distros take a look on the Dockerfile. It has some clues what to install.\n\nNext use cmake as easy as following assuming you are in the projects directory:\n\n```bash\nmkdir -p build \u0026\u0026 cd build \u0026\u0026 cmake .. \u0026\u0026 cmake --build .\n```\n\nIf it still doesn't build, try to build with docker\n\n```bash\ndocker build . -t mp4crawler\n```\n\n## Starting up\n\nCheck `./tools` directory for a demo app.  Try `--help` too. By default it won't try to get data from HTTP. Instead it's possible to start it with `mp4crawler -u https://demo.castlabs.com/tmp/text0.mp4`. Or it's possible to download `text0.mp4` into the current directory and just start the app (or point to the file with `-u /path/to/text0.mp4`).\n\nOr with docker:\n\n```bash\ndocker run --rm -it -v/tmp:/output mp4crawler:latest -u https://demo.castlabs.com/tmp/text0.mp4 -o /output\n```\n\nAnd the extracted data will be located in `/tmp` (change it to whatever you like more).\n\n## Design and usage\n\nSo we have boxes and one of is root box. A box can emit other boxes or byte arrays depending on its type. There is also a controlling object, an entry point for all the operations. Except providing boxes the controlling object will also report any transport issues.\n\nFrom a library user perspective everything looks like following\n\n1. Create Unboxer object of some specific flavor\n2. Attach stream signals, like stream open.\n3. Get root box on stream open and attach to its signals like opening sub-boxes and/or reading  payload.\n4. For every open sub-box it's possible to change how it's treated (as an another box container or a binary blob)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fri0n%2Funboxer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fri0n%2Funboxer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fri0n%2Funboxer/lists"}