{"id":23344428,"url":"https://github.com/rec/recs","last_synced_at":"2025-04-07T16:47:06.657Z","repository":{"id":57460564,"uuid":"178856362","full_name":"rec/recs","owner":"rec","description":"🎬 recs: the Universal Recorder 🎬","archived":false,"fork":false,"pushed_at":"2024-03-23T15:49:55.000Z","size":951,"stargazers_count":1,"open_issues_count":18,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-05-01T19:21:00.651Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rec.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}},"created_at":"2019-04-01T12:17:00.000Z","updated_at":"2023-11-20T10:20:03.000Z","dependencies_parsed_at":"2023-12-18T22:28:56.061Z","dependency_job_id":"2bb76698-b540-458e-9a74-7ab1fde0836b","html_url":"https://github.com/rec/recs","commit_stats":{"total_commits":5,"total_committers":1,"mean_commits":5.0,"dds":0.0,"last_synced_commit":"24d545cfa12129dc6c413f0defad08bac6f5ff14"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rec%2Frecs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rec%2Frecs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rec%2Frecs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rec%2Frecs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rec","download_url":"https://codeload.github.com/rec/recs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247693594,"owners_count":20980710,"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":[],"created_at":"2024-12-21T06:26:38.034Z","updated_at":"2025-04-07T16:47:06.622Z","avatar_url":"https://github.com/rec.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"#  🎬 recs: the Universal Recorder 🎬\n\n## Why should there be a record button at all?\n\nA long time ago, I asked myself, \"Why is there a record button and the possibility\nof missing a take? Why not record everything?\"\n\nI sometimes play music, and I have mixed bands live, and I wanted a program that would\nsimply record everything at all times which I didn't have to stop and start, that I\ncould run completely separately from my other music programs.\n\nSeparately, I wanted to digitize a huge number of cassettes and LPs, so I wanted\na program that ran in the background and recorded everything except silence, so I just\nplay the music into the machine, and have it divided into pieces\n\nNothing like that existed so I wrote it.\n\n## `recs`:  the Universal Recorder\n\n`recs` records any or every audio input on your machine, intelligently filters\nout quiet, and stores the results in named, organized files.\n\nFree, open-source, configurable, light on CPU and memory, and bulletproof\n\n### Bulletproof?\n\nIt's not difficult to record some audio. Writing a program that runs continuously and\nrecords audio even as real-world things happen is considerably harder.\n\nIt is impossible to prevent all loss, but considerable ingenuity and pulling of cables\nhas been used to mitigate and minimize this through software.  See Appendix A.\n\n### Universal?\n\nIt is a \"Universal Recorder\" because the plan to be able to record all streams of data:\naudio is simply the start.\n\nI have already [written code](https://github.com/rec/litoid) to do this for MIDI and DMX\n- it works well but it isn't productionized, and I'll be folding that in in due time,\nbut most of the difficulty and most of the value in this first step is the audio, so I\nhave focused on just audio for this first release!\n\nIt might be that video is also incorporated in the far future, but the tooling is just\nnot there for Python yet, and it would be much too heavy to sit in the background all\nthe time and almost be forgotten about, so you could call it an Almost Universal\nRecorder if you liked.\n\n### Installation\n\n`recs` is a standard PyPi package - use `poetry add recs` or `pip install recs` or your\nfavorite package manager.\n\nTo test, type `recs --info`, which prints JSON describing the input devices\nyou have. Here's a snippet from my machine:\n\n```\n[\n    {\n        \"name\": \"FLOW 8 (Recording)\",\n        \"index\": 1,\n        \"hostapi\": 0,\n        \"max_input_channels\": 10,\n        \"max_output_channels\": 4,\n        \"default_low_input_latency\": 0.01,\n        \"default_low_output_latency\": 0.004354166666666667,\n        \"default_high_input_latency\": 0.1,\n        \"default_high_output_latency\": 0.0136875,\n        \"default_samplerate\": 48000.0\n    },\n    {\n        \"name\": \"USB PnP Sound Device\",\n        \"index\": 2,\n        ...\n    },\n    ...\n]\n```\n\n### Basic Usage\n\nPick your nicest terminal program, go to a favorite directory with some free space, and\ntype:\n\n```\nrecs\n```\n\n`recs` will start recording all the active audio channels into your current directory\nand display the results in the terminal.\n\nWhat \"active\"means can be customized rather a lot, but by default when a channel becomes\ntoo quiet for more than a short time, it stops recording, and will start a new recording\nautomatically when the channel receives a signal.\n\nSome care is taken to preserve the quiet before the start or after the end of a\nrecording to prevent abrupt transitions.\n\n\n#### Appendix A: Failure modes\n\n1. Hardware crash or power loss\n2. Segfault or similar C/C++ errors\n\n\nThe aim is to be as bulletproof as possible. The pre-beta existing as I write this\n(2023/11/19) seems to handle harder cases like hybernation well, and can\ndetect if a  device goes offline and report it.\n\nThe holy grail is reconnecting to a device that comes back online: this is an\n[unsolved problem](https://github.com/spatialaudio/python-sounddevice/issues/382)\nin Python, I believe, but I am on my way to solving it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frec%2Frecs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frec%2Frecs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frec%2Frecs/lists"}