{ "info": { "author": "Andrew Rabert", "author_email": "ar@nullsum.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3 :: Only" ], "description": "harmonize\n=========\n\n|PyPI Version|\n\nCreate and synchronize transcoded copies of audio folders.\n\n* Transcodes FLAC files to MP3 with tags\n* Copies everything else as-is\n* Parallelized\n* Additional runs synchronize changes since the initial run\n\n\nHistory\n-------\nMy audio library is a comprised of FLAC's, MP3's, cover images, and various\nmetadata files - totaling roughly 500GB. This is not a problem when I'm on my\ndesktop - wired into the same network as my server. However, my laptop and\nphone use often suffers from poor connectivity and limit storage capacities.\nFurther, lossless audio often is a waste as the my laptop and phone used in\nless-than-ideal environments and equipment. Thus, I decided to use only MP3's\non those devices.\n\nPreviously, I was solving this with a combination of mp3fs_ and rsync_. This\nserved me well for a number of years, but had a few drawbacks for my uses.\n\n* **Only MP3** - Cannot experiment with formats like Opus without implementing\n support in mp3fs's C codebase.\n* **Only CBR MP3** - LAME's V0 often is indistinguishable from 320 CBR while\n reducing the file size by ~15%.\n* **Uses FUSE** - Makes containerization and portability more complicated.\n* **Not Parallelized** - On a system with eight logical cores and competent\n disk speeds, encoding a one file at a time is a gross inefficiency.\n\nHarmonize transcodes to LAME V0, has no dependency on FUSE, and supports\nparallel copying and transcoding. While it currently only transcodes to MP3,\nit's written in Python. This is far more accessible to modification for a \nPythonista like myself.\n\n\nInstallation\n------------\n\n* `Arch Linux`_\n* `Docker`_\n* `PyPI`_\n\nIf installing from `PyPI`_ or using the script directly, ensure the following\nare installed:\n\n* Python 3.6+\n* FLAC\n* LAME\n\n\nUsage\n-----\n\n.. code::\n\n usage: harmonize [-h] [-n NUM_PROCESSES] [--version] source target\n\n positional arguments:\n source Source directory\n target Target directory\n\n optional arguments:\n -h, --help show this help message and exit\n -n NUM_PROCESSES Number of processes to use\n --version show program's version number and exit\n\n\n.. |PyPI Version| image:: https://img.shields.io/pypi/v/harmonize.svg?\n :target: https://pypi.org/pypi/harmonize\n.. _PyPI: https://pypi.org/pypi/harmonize\n.. _Arch Linux: https://aur.archlinux.org/packages/harmonize/\n.. _Docker: https://hub.docker.com/r/nvllsvm/harmonize/\n.. _mp3fs: https://khenriks.github.io/mp3fs/\n.. _rsync: https://rsync.samba.org/\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nvllsvm/harmonize", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "harmonize", "package_url": "https://pypi.org/project/harmonize/", "platform": "", "project_url": "https://pypi.org/project/harmonize/", "project_urls": { "Homepage": "https://github.com/nvllsvm/harmonize" }, "release_url": "https://pypi.org/project/harmonize/0.4.0/", "requires_dist": [ "mutagen (>=1.40.0)" ], "requires_python": ">=3.6", "summary": "Create and synchronize transcoded copies of audio folders", "version": "0.4.0" }, "last_serial": 6000305, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "4ce8547c53fa2c1aba6d80c35e670e58", "sha256": "8462d6a20cc4934638571c819f8cb91215404746ddf5c903f44bd729b1cfa2e2" }, "downloads": -1, "filename": "harmonize-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4ce8547c53fa2c1aba6d80c35e670e58", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3086, "upload_time": "2018-05-13T16:42:21", "url": "https://files.pythonhosted.org/packages/41/1a/9b34b5ba0e1e1c4aa0db92511524cceefcbc252b78f2ce6d3a6ef4bb8886/harmonize-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7af29fe25f8e31a32d2e91df5f0ab13b", "sha256": "7f89f1c7ec0d4b40490c86a441d3e1e4e93dbedc21fc88b32d10dc270a9f57b5" }, "downloads": -1, "filename": "harmonize-0.1.0.tar.gz", "has_sig": false, "md5_digest": "7af29fe25f8e31a32d2e91df5f0ab13b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2657, "upload_time": "2018-05-13T16:42:22", "url": "https://files.pythonhosted.org/packages/28/ef/50fcb0ad52a122301aa8d4eefaa3992881405ed4c10db50d91da03657847/harmonize-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "5ef13fe05af614fbadf57a7266cc085b", "sha256": "a35b3c1dd783afcc95d917b61c640f939e192df2978395fab43c9996f1f90821" }, "downloads": -1, "filename": "harmonize-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5ef13fe05af614fbadf57a7266cc085b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4692, "upload_time": "2018-05-14T19:43:07", "url": "https://files.pythonhosted.org/packages/8e/38/f0c7d570d765a201ea6d9c56c232e615714902cb465b6b3596aa7dd27600/harmonize-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1aa32a923b97248c5de5757f4efb3c0", "sha256": "8260fac82092781aaa62fd655773aad55c03d6387a7954ddd8667721862285ba" }, "downloads": -1, "filename": "harmonize-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a1aa32a923b97248c5de5757f4efb3c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4483, "upload_time": "2018-05-14T19:43:09", "url": "https://files.pythonhosted.org/packages/f3/c6/c152d1261666bbbbed5f0bdb1c44011c030a066b10a5a2e602e9e3d06318/harmonize-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7b4ee77cc813ae2d8ebc203f0415c85a", "sha256": "3bd4f5918c5b4540bbc845b11c1b2fd562a9ad1d5400f460425db21624cfadc4" }, "downloads": -1, "filename": "harmonize-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7b4ee77cc813ae2d8ebc203f0415c85a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4704, "upload_time": "2018-05-14T19:51:50", "url": "https://files.pythonhosted.org/packages/1d/87/73c5ef8dccc07de841e04c39c048db4f4c3526b38ec626af6759fcf9dfe0/harmonize-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3b640cac202a6aa1d26decf391ca954e", "sha256": "d7dea0a7b1f832088568248486b465fa64c52a48fb81d90216df5e393aae7727" }, "downloads": -1, "filename": "harmonize-0.1.2.tar.gz", "has_sig": false, "md5_digest": "3b640cac202a6aa1d26decf391ca954e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4626, "upload_time": "2018-05-14T19:51:51", "url": "https://files.pythonhosted.org/packages/23/19/c19bcbcfa3c24f9069899c4e142c8f8c9fb874832102d5d97e7545896c69/harmonize-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "117d6ef837e970c01b9a2e290146e22f", "sha256": "41edc9b6e3479d663268be2031843cb4f9b2736528592df046d2026971dbaf77" }, "downloads": -1, "filename": "harmonize-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "117d6ef837e970c01b9a2e290146e22f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4767, "upload_time": "2018-05-14T20:08:54", "url": "https://files.pythonhosted.org/packages/39/e9/1ff3ae34f6ee5ef995c0a6367f47d337ef2c6173bc3b8f9c580852c29add/harmonize-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d681a626f688e74f32892509727a5cb3", "sha256": "b2334c70b7e2a8e78049cc796a56c9057a97aadc0106e3d16cd54c22bba6774a" }, "downloads": -1, "filename": "harmonize-0.1.3.tar.gz", "has_sig": false, "md5_digest": "d681a626f688e74f32892509727a5cb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4725, "upload_time": "2018-05-14T20:08:55", "url": "https://files.pythonhosted.org/packages/d8/d8/d8bc1a31f81d95695c66e23b8f028f69468f895ec105d945c7f6291156ad/harmonize-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "09ca8f0ec8a0ba33fb9173efa4928db3", "sha256": "2c77600348993f49f1fd90de1366a0e8ad9743d651628449f643c452df33e559" }, "downloads": -1, "filename": "harmonize-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "09ca8f0ec8a0ba33fb9173efa4928db3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4167, "upload_time": "2018-05-14T20:31:19", "url": "https://files.pythonhosted.org/packages/dd/3c/1ad25cdb2cf1a2631abf156923be9ed964c18f1281f6080297612c060ba7/harmonize-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f088e4f0e9bad7fefe35a96ec8812f8e", "sha256": "eccbef06ea8ddfcab7bf13ddaf4f830a511b4ac0b49d3288295979a5f8263029" }, "downloads": -1, "filename": "harmonize-0.1.4.tar.gz", "has_sig": false, "md5_digest": "f088e4f0e9bad7fefe35a96ec8812f8e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4642, "upload_time": "2018-05-14T20:31:20", "url": "https://files.pythonhosted.org/packages/f0/7c/c6bd327feba104099472287d4a51ba99f68a8f1c3b9292b424e02ba4f410/harmonize-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "a13f0a7d303213469aa213d2e831edc5", "sha256": "ab718eedb40ed55237761434d75e7ecb5e0ea18dc4379461c7c8c9a7ece6a04e" }, "downloads": -1, "filename": "harmonize-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "a13f0a7d303213469aa213d2e831edc5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4193, "upload_time": "2018-05-19T19:42:15", "url": "https://files.pythonhosted.org/packages/e4/80/f62f5dacf165a073628d0a290c3e02fa0513daf2e9e14ea0aa2feb970d3c/harmonize-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "344be692de0a9da641021eebd0a57c81", "sha256": "2b861ca0f3acd4f12ca88698258e9ec6634e856280311632d3f9a8260a205a33" }, "downloads": -1, "filename": "harmonize-0.1.5.tar.gz", "has_sig": false, "md5_digest": "344be692de0a9da641021eebd0a57c81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4689, "upload_time": "2018-05-19T19:42:16", "url": "https://files.pythonhosted.org/packages/e6/36/e4d1db9b627de16adfbece8072b71266a0dc13d73b38b9293b6525cba044/harmonize-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "381f27feac2b20e54f1f53a709931813", "sha256": "3e48b720d4a72a135666b4b5db85fb01a5ebc9b4b667300b087183ea0afbdea6" }, "downloads": -1, "filename": "harmonize-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "381f27feac2b20e54f1f53a709931813", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5073, "upload_time": "2018-06-10T04:28:53", "url": "https://files.pythonhosted.org/packages/65/26/3047247723880b2fa984210f4cbd86809194785244d0221dd732cb7c1ec0/harmonize-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e9e05e98a9b4a70a3e673f9be0fc42da", "sha256": "41bd50f6f9916f0b437a79c39ac90d3b26289b63eb1d80c05c24555cf1ef122a" }, "downloads": -1, "filename": "harmonize-0.2.0.tar.gz", "has_sig": false, "md5_digest": "e9e05e98a9b4a70a3e673f9be0fc42da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4812, "upload_time": "2018-06-10T04:28:54", "url": "https://files.pythonhosted.org/packages/b9/67/2d7d042e4ef70e8b9c2a1483b40e1697697ed541cc596c68f418ad44bc88/harmonize-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "b818cf3400e3e434dd7925a7834ae135", "sha256": "053883797e6a55323868099bb41c09bca806c699b61f23522022209f430489bb" }, "downloads": -1, "filename": "harmonize-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b818cf3400e3e434dd7925a7834ae135", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5133, "upload_time": "2018-06-15T23:49:33", "url": "https://files.pythonhosted.org/packages/9f/0f/b57c6ace008418ef6181b1b68e7c91d098827e6287600351122af7c8484b/harmonize-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ae80bb753db51944fefe4e02c0ce133", "sha256": "e729f9cc83661ca3d50b1e9e2bb56264e27d987c2729734bb2d41dc10a3f1cc0" }, "downloads": -1, "filename": "harmonize-0.2.1.tar.gz", "has_sig": false, "md5_digest": "5ae80bb753db51944fefe4e02c0ce133", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4870, "upload_time": "2018-06-15T23:49:34", "url": "https://files.pythonhosted.org/packages/34/f8/c8c40e4c00ded7bc67781f40e89438039d3253ed7e16eb76c77a2fe44d73/harmonize-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "5892a6963a77e8a63a8f73e3616afb68", "sha256": "ae731bd1a42873edf89413d3e16a5f11ca52ce7600c9576059207d35032572f6" }, "downloads": -1, "filename": "harmonize-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5892a6963a77e8a63a8f73e3616afb68", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5198, "upload_time": "2018-06-17T23:55:47", "url": "https://files.pythonhosted.org/packages/ad/ef/8f9ea120106709855a936eb9d31beb152c60d68eceb08c796ba1d2a2c6cf/harmonize-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6ce7f516f26a9e3d99589a32a7a9cbec", "sha256": "9f87fb510d37a3aeb8a566a604ecdc811f9353f623e30ea776b5bb646120955d" }, "downloads": -1, "filename": "harmonize-0.2.2.tar.gz", "has_sig": false, "md5_digest": "6ce7f516f26a9e3d99589a32a7a9cbec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4976, "upload_time": "2018-06-17T23:55:48", "url": "https://files.pythonhosted.org/packages/f8/82/8b02de69f47a379a57c0e94f372868407dde235963c7012a2018ab3dd2a7/harmonize-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "6163ce991e8e5e436b1ebf6aa7ba43d1", "sha256": "237c0e80a1736e07ef720a31f370b14cd7975979bacacc77dca38ee29ca36acf" }, "downloads": -1, "filename": "harmonize-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6163ce991e8e5e436b1ebf6aa7ba43d1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5547, "upload_time": "2018-08-18T00:24:29", "url": "https://files.pythonhosted.org/packages/eb/1a/df798cbf3533acf5d98b1d4c34ef826a0126d9b7f991dc83957cbca1b8c2/harmonize-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c63002d3642ad5f56fafbc926d1a5567", "sha256": "cd1d8a4b1f649ce571c689b4763e34678a8b7779b7353f48345afb29e512376b" }, "downloads": -1, "filename": "harmonize-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c63002d3642ad5f56fafbc926d1a5567", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5098, "upload_time": "2018-08-18T00:24:30", "url": "https://files.pythonhosted.org/packages/e6/cb/cf395a43f9eb319fd7d6bd3f79f97bd1beb9eb9f23c16d61a14ee80e1e73/harmonize-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "541bf49af0e9e225577bc8d427db529f", "sha256": "0db3b8e49449a0c8808504d72fa482fb4587c4d816590658188430d3c86c6d91" }, "downloads": -1, "filename": "harmonize-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "541bf49af0e9e225577bc8d427db529f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5530, "upload_time": "2018-08-18T00:28:32", "url": "https://files.pythonhosted.org/packages/9c/63/33a403001ad64e352458289d4e062d90aef4b0093eb46e7d22af10836ba1/harmonize-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2dbe901358308c358f852a068834a733", "sha256": "d7feab799108b2566eb2011996807a89863fba298a6d6b187c299e3e17ec653a" }, "downloads": -1, "filename": "harmonize-0.3.1.tar.gz", "has_sig": false, "md5_digest": "2dbe901358308c358f852a068834a733", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5098, "upload_time": "2018-08-18T00:28:33", "url": "https://files.pythonhosted.org/packages/c0/66/21809bee9ea440d3c85b37f1fa3b7d53b04b5aa4e75d984cbec7822d7a11/harmonize-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "35c16b428190a94557cea2e0871aa49c", "sha256": "5c498854eec043d5b7aedede0a377acb3ce398ab834a8b42d1f598b3c3d0f4dc" }, "downloads": -1, "filename": "harmonize-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "35c16b428190a94557cea2e0871aa49c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9696, "upload_time": "2018-10-05T04:20:36", "url": "https://files.pythonhosted.org/packages/07/6b/e045648fb2df7210aa1bd1dbd33deab1813ee5a42750814220fe118bdf29/harmonize-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "977bc26186320e21921979b4ee097227", "sha256": "0d53eb928aa305f3d1379fcddb0a3e16ea4738032bd51a971ae192a91ae3b256" }, "downloads": -1, "filename": "harmonize-0.3.2.tar.gz", "has_sig": false, "md5_digest": "977bc26186320e21921979b4ee097227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5124, "upload_time": "2018-10-05T04:20:38", "url": "https://files.pythonhosted.org/packages/bb/b8/9ad5bdc97088534e1bc133b8772076ea18310512bd7489a1d8b115e987a1/harmonize-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "6406e1fccf398f5f6f2d1124380774a6", "sha256": "54aa2fb6ef358bd0ed1f94eb10892d0de10e7fcad5df16faa0c5105a3b1d022e" }, "downloads": -1, "filename": "harmonize-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6406e1fccf398f5f6f2d1124380774a6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 9727, "upload_time": "2019-10-19T16:26:14", "url": "https://files.pythonhosted.org/packages/90/bf/891c0e9719f5c20bb49013aed53c9b334973f4233939b070e5d3154cecb5/harmonize-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "476d82064c8e0d3e54b4e082d8174ce7", "sha256": "15b9e63396b3890b0634a5d89230e5d13c5853f0fe1149e8259d4f4dde91c507" }, "downloads": -1, "filename": "harmonize-0.4.0.tar.gz", "has_sig": false, "md5_digest": "476d82064c8e0d3e54b4e082d8174ce7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5337, "upload_time": "2019-10-19T16:26:17", "url": "https://files.pythonhosted.org/packages/95/41/8301d0d3ac44b4f3b6b3a5c4f5ea5de0bf2014e6864a10f9251f3b0a1043/harmonize-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6406e1fccf398f5f6f2d1124380774a6", "sha256": "54aa2fb6ef358bd0ed1f94eb10892d0de10e7fcad5df16faa0c5105a3b1d022e" }, "downloads": -1, "filename": "harmonize-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6406e1fccf398f5f6f2d1124380774a6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 9727, "upload_time": "2019-10-19T16:26:14", "url": "https://files.pythonhosted.org/packages/90/bf/891c0e9719f5c20bb49013aed53c9b334973f4233939b070e5d3154cecb5/harmonize-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "476d82064c8e0d3e54b4e082d8174ce7", "sha256": "15b9e63396b3890b0634a5d89230e5d13c5853f0fe1149e8259d4f4dde91c507" }, "downloads": -1, "filename": "harmonize-0.4.0.tar.gz", "has_sig": false, "md5_digest": "476d82064c8e0d3e54b4e082d8174ce7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 5337, "upload_time": "2019-10-19T16:26:17", "url": "https://files.pythonhosted.org/packages/95/41/8301d0d3ac44b4f3b6b3a5c4f5ea5de0bf2014e6864a10f9251f3b0a1043/harmonize-0.4.0.tar.gz" } ] }