audiometa-python 1.2.1__tar.gz → 1.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {audiometa_python-1.2.1/audiometa_python.egg-info → audiometa_python-1.3.2}/PKG-INFO +11 -4
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/README.md +7 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/cli.py +91 -4
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_options.py +25 -0
- audiometa_python-1.3.2/audiometa/test/tests/unit/cli/test_cli_colorize.py +90 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2/audiometa_python.egg-info}/PKG-INFO +11 -4
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa_python.egg-info/SOURCES.txt +1 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/pyproject.toml +9 -4
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/LICENSE +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/__main__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/_audio_file.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/exceptions.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_MetadataManager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/_id3v1_preserver.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/_id3v2_flac_handler.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/_id3v2_reader.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/id3v2/_id3v2_writer.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/riff/_riff_bext_chunk.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/riff/_riff_file_structure.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/riff/_riff_info_chunk.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/_constants.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/assets/create_test_files.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/common/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v1/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v2/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/riff/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/riff/riff_metadata_setter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/scripts/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/technical_info_inspector.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/vorbis/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/conftest.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/conftest.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/options/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/options/test_include_headers.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/options/test_include_technical.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_raw_metadata_includes_unsupported_tags.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/description/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/description/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/description/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/description/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/originator/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/originator/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/originator/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/originator/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_audio_data_corruption.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_invalid_with_metadata_combinations.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_state_precedence.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_unset_with_metadata_combinations.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_fails_with_id3v1.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_with_id3v2_only.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_validation_works_without_id3v1.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_flipped_md5.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_partial_md5.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_random_md5.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_non_flac_error.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_unset_md5.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/test_audio_file.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/cli/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/header_info/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff_info_chunk_fourcc.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number/test_disc_number_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/test_isrc_format_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/test_isrc_type_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/test_musicbrainz_artistid_format_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/test_musicbrainz_artistid_type_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_format_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_type_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_uuid/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_uuid/test_uuid_format_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date/test_date_format_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number/test_track_number_validation.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/utils/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/unit/utils/test_raw_metadata_sanitizer.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/flac_md5_state.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/id3v1_genre_code_map.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/metadata_format.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/metadata_writing_strategy.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/mutagen_exception_handler.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/os_dependencies_checker/base.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/os_dependencies_checker/config.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/rating_profiles.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/raw_metadata_sanitizer.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/tool_path_resolver.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/types.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/utils/unified_metadata_key.py +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa_python.egg-info/dependency_links.txt +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa_python.egg-info/entry_points.txt +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa_python.egg-info/requires.txt +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa_python.egg-info/top_level.txt +0 -0
- {audiometa_python-1.2.1 → audiometa_python-1.3.2}/setup.cfg +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: audiometa-python
|
|
3
|
-
Version: 1.2
|
|
3
|
+
Version: 1.3.2
|
|
4
4
|
Summary: A comprehensive Python library for reading and writing audio metadata across multiple formats
|
|
5
5
|
Author: AudioMeta Python Contributors
|
|
6
6
|
Author-email: Andreas Garcia <garcia.andreas.1991@gmail.com>
|
|
7
7
|
License: Apache-2.0
|
|
8
|
-
Project-URL: Homepage, https://github.com/
|
|
9
|
-
Project-URL: Repository, https://github.com/
|
|
10
|
-
Project-URL: Issues, https://github.com/
|
|
8
|
+
Project-URL: Homepage, https://github.com/BehindTheMusicTree/audiometa
|
|
9
|
+
Project-URL: Repository, https://github.com/BehindTheMusicTree/audiometa
|
|
10
|
+
Project-URL: Issues, https://github.com/BehindTheMusicTree/audiometa/issues
|
|
11
11
|
Keywords: audio,metadata,mp3,flac,wav,id3,vorbis,riff
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -55,6 +55,8 @@ Dynamic: license-file
|
|
|
55
55
|
|
|
56
56
|
A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
|
|
57
57
|
|
|
58
|
+
**Try it**: A demo web app is available at [audiometa.themusictree.org](https://audiometa.themusictree.org).
|
|
59
|
+
|
|
58
60
|
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
59
61
|
|
|
60
62
|
## ⭐ Show Your Support
|
|
@@ -1518,6 +1520,9 @@ audiometa read song.mp3 --include-raw-binary-data
|
|
|
1518
1520
|
|
|
1519
1521
|
# Save to file
|
|
1520
1522
|
audiometa read song.mp3 --output metadata.json
|
|
1523
|
+
|
|
1524
|
+
# Colorize output (headers, keys, values) for terminal or demos
|
|
1525
|
+
audiometa read song.mp3 --format table --color
|
|
1521
1526
|
```
|
|
1522
1527
|
|
|
1523
1528
|
#### Error Handling {#cli-error-handling}
|
|
@@ -1543,6 +1548,8 @@ audiometa read "**/*.mp3" --recursive
|
|
|
1543
1548
|
- **YAML**: Human-readable structured format (requires PyYAML)
|
|
1544
1549
|
- **Table**: Simple text table format
|
|
1545
1550
|
|
|
1551
|
+
Use `--color` to colorize headers, keys, and values for terminal or demo videos (plain output by default; disabled when writing to a file). Respects the `NO_COLOR` environment variable.
|
|
1552
|
+
|
|
1546
1553
|
### Examples
|
|
1547
1554
|
|
|
1548
1555
|
```bash
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
|
|
15
15
|
|
|
16
|
+
**Try it**: A demo web app is available at [audiometa.themusictree.org](https://audiometa.themusictree.org).
|
|
17
|
+
|
|
16
18
|
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
17
19
|
|
|
18
20
|
## ⭐ Show Your Support
|
|
@@ -1476,6 +1478,9 @@ audiometa read song.mp3 --include-raw-binary-data
|
|
|
1476
1478
|
|
|
1477
1479
|
# Save to file
|
|
1478
1480
|
audiometa read song.mp3 --output metadata.json
|
|
1481
|
+
|
|
1482
|
+
# Colorize output (headers, keys, values) for terminal or demos
|
|
1483
|
+
audiometa read song.mp3 --format table --color
|
|
1479
1484
|
```
|
|
1480
1485
|
|
|
1481
1486
|
#### Error Handling {#cli-error-handling}
|
|
@@ -1501,6 +1506,8 @@ audiometa read "**/*.mp3" --recursive
|
|
|
1501
1506
|
- **YAML**: Human-readable structured format (requires PyYAML)
|
|
1502
1507
|
- **Table**: Simple text table format
|
|
1503
1508
|
|
|
1509
|
+
Use `--color` to colorize headers, keys, and values for terminal or demo videos (plain output by default; disabled when writing to a file). Respects the `NO_COLOR` environment variable.
|
|
1510
|
+
|
|
1504
1511
|
### Examples
|
|
1505
1512
|
|
|
1506
1513
|
```bash
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
import argparse
|
|
5
5
|
import json
|
|
6
|
+
import os
|
|
7
|
+
import re
|
|
6
8
|
import sys
|
|
7
9
|
from pathlib import Path
|
|
8
10
|
from typing import Any
|
|
@@ -23,6 +25,13 @@ from audiometa.exceptions import (
|
|
|
23
25
|
from audiometa.utils.metadata_format import MetadataFormat
|
|
24
26
|
from audiometa.utils.types import UnifiedMetadata
|
|
25
27
|
|
|
28
|
+
_ANSI_RESET = "\033[0m"
|
|
29
|
+
_ANSI_KEY = "\033[32m" # green
|
|
30
|
+
_ANSI_STR = "\033[33m" # yellow
|
|
31
|
+
_ANSI_NUM = "\033[36m" # cyan
|
|
32
|
+
_ANSI_LITERAL = "\033[2m" # dim
|
|
33
|
+
_ANSI_SECTION = "\033[1;36m" # bold cyan
|
|
34
|
+
|
|
26
35
|
|
|
27
36
|
def _data_for_serialization(data: Any) -> Any:
|
|
28
37
|
"""Convert data to a form suitable for YAML/JSON (UnifiedMetadataKey keys as strings)."""
|
|
@@ -35,6 +44,62 @@ def _data_for_serialization(data: Any) -> Any:
|
|
|
35
44
|
return data
|
|
36
45
|
|
|
37
46
|
|
|
47
|
+
def _colorize_json(raw: str) -> str:
|
|
48
|
+
"""Add ANSI colors to JSON: keys green, string values yellow, numbers cyan, literals dim."""
|
|
49
|
+
raw = re.sub(r'("[^"]*")\s*:', rf"{_ANSI_KEY}\1{_ANSI_RESET}:", raw)
|
|
50
|
+
raw = re.sub(r':\s*("(?:[^"\\]|\\.)*")', rf": {_ANSI_STR}\1{_ANSI_RESET}", raw)
|
|
51
|
+
raw = re.sub(r":\s*(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)", rf": {_ANSI_NUM}\1{_ANSI_RESET}", raw)
|
|
52
|
+
return re.sub(r"\b(true|false|null)\b", rf"{_ANSI_LITERAL}\1{_ANSI_RESET}", raw)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _colorize_table(raw: str) -> str:
|
|
56
|
+
"""Colorize table: section headers bold cyan, keys green, values yellow (incl. multiline)."""
|
|
57
|
+
lines = raw.split("\n")
|
|
58
|
+
out = []
|
|
59
|
+
key_val_re = re.compile(r"^(\s*)(.*?)\s*:\s*(.*)$")
|
|
60
|
+
for line in lines:
|
|
61
|
+
if line.strip().startswith("===") and line.strip().endswith("==="):
|
|
62
|
+
out.append(f"{_ANSI_SECTION}{line}{_ANSI_RESET}")
|
|
63
|
+
elif ":" in line and not line.strip().startswith("=="):
|
|
64
|
+
match = key_val_re.match(line)
|
|
65
|
+
if match:
|
|
66
|
+
pre, key_part, val_part = match.groups()
|
|
67
|
+
out.append(f"{pre}{_ANSI_KEY}{key_part}{_ANSI_RESET}: {_ANSI_STR}{val_part}{_ANSI_RESET}")
|
|
68
|
+
else:
|
|
69
|
+
out.append(line)
|
|
70
|
+
elif line.strip():
|
|
71
|
+
# Continuation line (e.g. multiline lyrics in table), color as value
|
|
72
|
+
indent = line[: len(line) - len(line.lstrip())]
|
|
73
|
+
rest = line.lstrip()
|
|
74
|
+
out.append(f"{indent}{_ANSI_STR}{rest}{_ANSI_RESET}")
|
|
75
|
+
else:
|
|
76
|
+
out.append(line)
|
|
77
|
+
return "\n".join(out)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _colorize_yaml(raw: str) -> str:
|
|
81
|
+
"""Colorize YAML: keys green, values yellow (including multiline continuation lines)."""
|
|
82
|
+
lines = raw.split("\n")
|
|
83
|
+
out = []
|
|
84
|
+
key_line_re = re.compile(r"^(\s*)([a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*(.*)$")
|
|
85
|
+
for line in lines:
|
|
86
|
+
match = key_line_re.match(line)
|
|
87
|
+
if match:
|
|
88
|
+
pre, key, val = match.groups()
|
|
89
|
+
if val.strip():
|
|
90
|
+
out.append(f"{pre}{_ANSI_KEY}{key}{_ANSI_RESET}: {_ANSI_STR}{val}{_ANSI_RESET}")
|
|
91
|
+
else:
|
|
92
|
+
out.append(f"{pre}{_ANSI_KEY}{key}{_ANSI_RESET}:{val}")
|
|
93
|
+
elif line.strip():
|
|
94
|
+
# Continuation line (e.g. multiline lyrics); not a key line, color as value
|
|
95
|
+
indent = line[: len(line) - len(line.lstrip())]
|
|
96
|
+
rest = line.lstrip()
|
|
97
|
+
out.append(f"{indent}{_ANSI_STR}{rest}{_ANSI_RESET}")
|
|
98
|
+
else:
|
|
99
|
+
out.append(line)
|
|
100
|
+
return "\n".join(out)
|
|
101
|
+
|
|
102
|
+
|
|
38
103
|
def format_output(data: Any, output_format: str) -> str:
|
|
39
104
|
"""Format output data according to specified format."""
|
|
40
105
|
serializable = _data_for_serialization(data)
|
|
@@ -164,17 +229,27 @@ def _read_metadata(args: argparse.Namespace) -> None:
|
|
|
164
229
|
include_raw_binary_data=getattr(args, "include_raw_binary_data", False),
|
|
165
230
|
)
|
|
166
231
|
|
|
167
|
-
|
|
232
|
+
plain = format_output(metadata, args.output_format)
|
|
233
|
+
use_color = getattr(args, "color", False) and not args.output
|
|
234
|
+
if os.environ.get("NO_COLOR"):
|
|
235
|
+
use_color = False
|
|
236
|
+
out = plain
|
|
237
|
+
if use_color and args.output_format == "json":
|
|
238
|
+
out = _colorize_json(plain)
|
|
239
|
+
elif use_color and args.output_format == "table":
|
|
240
|
+
out = _colorize_table(plain)
|
|
241
|
+
elif use_color and args.output_format == "yaml":
|
|
242
|
+
out = _colorize_yaml(plain)
|
|
168
243
|
|
|
169
244
|
if args.output:
|
|
170
245
|
try:
|
|
171
246
|
with Path(args.output).open("w") as f:
|
|
172
|
-
f.write(
|
|
247
|
+
f.write(plain)
|
|
173
248
|
except (PermissionError, OSError) as e:
|
|
174
249
|
_handle_file_operation_error(e, args.output, args.continue_on_error)
|
|
175
250
|
else:
|
|
176
|
-
sys.stdout.write(
|
|
177
|
-
if not
|
|
251
|
+
sys.stdout.write(out)
|
|
252
|
+
if not out.endswith("\n"):
|
|
178
253
|
sys.stdout.write("\n")
|
|
179
254
|
|
|
180
255
|
except (FileTypeNotSupportedError, FileNotFoundError, PermissionError, OSError, Exception) as e:
|
|
@@ -423,6 +498,12 @@ Examples:
|
|
|
423
498
|
read_parser.add_argument(
|
|
424
499
|
"--continue-on-error", action="store_true", help="Continue processing other files on error"
|
|
425
500
|
)
|
|
501
|
+
read_parser.add_argument(
|
|
502
|
+
"--color",
|
|
503
|
+
action="store_true",
|
|
504
|
+
dest="color",
|
|
505
|
+
help="Colorize output (headers, keys, values) for JSON, YAML, and table.",
|
|
506
|
+
)
|
|
426
507
|
read_parser.set_defaults(func=_read_metadata)
|
|
427
508
|
|
|
428
509
|
# Unified command
|
|
@@ -440,6 +521,12 @@ Examples:
|
|
|
440
521
|
unified_parser.add_argument(
|
|
441
522
|
"--continue-on-error", action="store_true", help="Continue processing other files on error"
|
|
442
523
|
)
|
|
524
|
+
unified_parser.add_argument(
|
|
525
|
+
"--color",
|
|
526
|
+
action="store_true",
|
|
527
|
+
dest="color",
|
|
528
|
+
help="Colorize output (headers, keys, values) for JSON, YAML, and table.",
|
|
529
|
+
)
|
|
443
530
|
unified_parser.set_defaults(func=_read_metadata, format_type="unified")
|
|
444
531
|
|
|
445
532
|
# Write command
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_options.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import os
|
|
2
3
|
import subprocess
|
|
3
4
|
import sys
|
|
4
5
|
|
|
@@ -86,3 +87,27 @@ class TestCLIReadOptions:
|
|
|
86
87
|
)
|
|
87
88
|
assert result.returncode == 0
|
|
88
89
|
assert "UNIFIED METADATA" in result.stdout
|
|
90
|
+
|
|
91
|
+
def test_cli_read_with_color_produces_ansi(self):
|
|
92
|
+
env = {k: v for k, v in os.environ.items() if k != "NO_COLOR"}
|
|
93
|
+
with temp_file_with_metadata({"title": "Test"}, "mp3") as test_file:
|
|
94
|
+
result = subprocess.run(
|
|
95
|
+
[sys.executable, "-m", "audiometa", "read", str(test_file), "--color", "--format", "json"],
|
|
96
|
+
capture_output=True,
|
|
97
|
+
text=True,
|
|
98
|
+
check=False,
|
|
99
|
+
env=env,
|
|
100
|
+
)
|
|
101
|
+
assert result.returncode == 0
|
|
102
|
+
assert "\033[" in result.stdout
|
|
103
|
+
|
|
104
|
+
def test_cli_read_without_color_no_ansi(self):
|
|
105
|
+
with temp_file_with_metadata({"title": "Test"}, "mp3") as test_file:
|
|
106
|
+
result = subprocess.run(
|
|
107
|
+
[sys.executable, "-m", "audiometa", "read", str(test_file), "--format", "json"],
|
|
108
|
+
capture_output=True,
|
|
109
|
+
text=True,
|
|
110
|
+
check=False,
|
|
111
|
+
)
|
|
112
|
+
assert result.returncode == 0
|
|
113
|
+
assert "\033[" not in result.stdout
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from audiometa.cli import _colorize_json, _colorize_table, _colorize_yaml
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _strip_ansi(text: str) -> str:
|
|
9
|
+
return re.sub(r"\033\[[0-9;]*m", "", text)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.mark.unit
|
|
13
|
+
class TestColorizeJson:
|
|
14
|
+
def test_keys_green(self):
|
|
15
|
+
raw = '"title": "Hello"'
|
|
16
|
+
out = _colorize_json(raw)
|
|
17
|
+
assert "\033[32m" in out
|
|
18
|
+
assert "title" in out
|
|
19
|
+
assert _strip_ansi(out) == raw
|
|
20
|
+
|
|
21
|
+
def test_string_values_yellow(self):
|
|
22
|
+
raw = '"title": "Hello"'
|
|
23
|
+
out = _colorize_json(raw)
|
|
24
|
+
assert "\033[33m" in out
|
|
25
|
+
assert "Hello" in out
|
|
26
|
+
|
|
27
|
+
def test_numbers_cyan(self):
|
|
28
|
+
raw = '"duration": 180'
|
|
29
|
+
out = _colorize_json(raw)
|
|
30
|
+
assert "\033[36m" in out
|
|
31
|
+
assert "180" in out
|
|
32
|
+
|
|
33
|
+
def test_literals_dim(self):
|
|
34
|
+
raw = '"enabled": true'
|
|
35
|
+
out = _colorize_json(raw)
|
|
36
|
+
assert "\033[2m" in out
|
|
37
|
+
assert "true" in out
|
|
38
|
+
|
|
39
|
+
def test_reset_present(self):
|
|
40
|
+
raw = '{"key": "val"}'
|
|
41
|
+
out = _colorize_json(raw)
|
|
42
|
+
assert "\033[0m" in out
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@pytest.mark.unit
|
|
46
|
+
class TestColorizeTable:
|
|
47
|
+
def test_section_headers_bold_cyan(self):
|
|
48
|
+
raw = "=== UNIFIED METADATA ==="
|
|
49
|
+
out = _colorize_table(raw)
|
|
50
|
+
assert "\033[1;36m" in out
|
|
51
|
+
assert "UNIFIED METADATA" in out
|
|
52
|
+
|
|
53
|
+
def test_key_value_line(self):
|
|
54
|
+
raw = "title : My Song"
|
|
55
|
+
out = _colorize_table(raw)
|
|
56
|
+
assert "\033[32m" in out
|
|
57
|
+
assert "\033[33m" in out
|
|
58
|
+
assert "title" in out
|
|
59
|
+
assert "My Song" in out
|
|
60
|
+
|
|
61
|
+
def test_continuation_line_colored_as_value(self):
|
|
62
|
+
raw = "title : Line one\nLine two"
|
|
63
|
+
out = _colorize_table(raw)
|
|
64
|
+
assert "\033[33m" in out
|
|
65
|
+
assert "Line one" in out
|
|
66
|
+
assert "Line two" in out
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@pytest.mark.unit
|
|
70
|
+
class TestColorizeYaml:
|
|
71
|
+
def test_key_green_value_yellow(self):
|
|
72
|
+
raw = "title: My Album"
|
|
73
|
+
out = _colorize_yaml(raw)
|
|
74
|
+
assert "\033[32m" in out
|
|
75
|
+
assert "\033[33m" in out
|
|
76
|
+
assert "title" in out
|
|
77
|
+
assert "My Album" in out
|
|
78
|
+
|
|
79
|
+
def test_continuation_line_colored(self):
|
|
80
|
+
raw = "lyrics: First line\nSecond line"
|
|
81
|
+
out = _colorize_yaml(raw)
|
|
82
|
+
assert "\033[33m" in out
|
|
83
|
+
assert "First line" in out
|
|
84
|
+
assert "Second line" in out
|
|
85
|
+
|
|
86
|
+
def test_empty_value_key_only_colored(self):
|
|
87
|
+
raw = "empty:"
|
|
88
|
+
out = _colorize_yaml(raw)
|
|
89
|
+
assert "\033[32m" in out
|
|
90
|
+
assert "empty" in out
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: audiometa-python
|
|
3
|
-
Version: 1.2
|
|
3
|
+
Version: 1.3.2
|
|
4
4
|
Summary: A comprehensive Python library for reading and writing audio metadata across multiple formats
|
|
5
5
|
Author: AudioMeta Python Contributors
|
|
6
6
|
Author-email: Andreas Garcia <garcia.andreas.1991@gmail.com>
|
|
7
7
|
License: Apache-2.0
|
|
8
|
-
Project-URL: Homepage, https://github.com/
|
|
9
|
-
Project-URL: Repository, https://github.com/
|
|
10
|
-
Project-URL: Issues, https://github.com/
|
|
8
|
+
Project-URL: Homepage, https://github.com/BehindTheMusicTree/audiometa
|
|
9
|
+
Project-URL: Repository, https://github.com/BehindTheMusicTree/audiometa
|
|
10
|
+
Project-URL: Issues, https://github.com/BehindTheMusicTree/audiometa/issues
|
|
11
11
|
Keywords: audio,metadata,mp3,flac,wav,id3,vorbis,riff
|
|
12
12
|
Classifier: Development Status :: 3 - Alpha
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -55,6 +55,8 @@ Dynamic: license-file
|
|
|
55
55
|
|
|
56
56
|
A powerful, unified Python library for reading and writing audio metadata across multiple formats. AudioMeta supports MP3, FLAC, and WAV audio files, working seamlessly with ID3v1, ID3v2, Vorbis, and RIFF metadata formats through a single, consistent API.
|
|
57
57
|
|
|
58
|
+
**Try it**: A demo web app is available at [audiometa.themusictree.org](https://audiometa.themusictree.org).
|
|
59
|
+
|
|
58
60
|
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
59
61
|
|
|
60
62
|
## ⭐ Show Your Support
|
|
@@ -1518,6 +1520,9 @@ audiometa read song.mp3 --include-raw-binary-data
|
|
|
1518
1520
|
|
|
1519
1521
|
# Save to file
|
|
1520
1522
|
audiometa read song.mp3 --output metadata.json
|
|
1523
|
+
|
|
1524
|
+
# Colorize output (headers, keys, values) for terminal or demos
|
|
1525
|
+
audiometa read song.mp3 --format table --color
|
|
1521
1526
|
```
|
|
1522
1527
|
|
|
1523
1528
|
#### Error Handling {#cli-error-handling}
|
|
@@ -1543,6 +1548,8 @@ audiometa read "**/*.mp3" --recursive
|
|
|
1543
1548
|
- **YAML**: Human-readable structured format (requires PyYAML)
|
|
1544
1549
|
- **Table**: Simple text table format
|
|
1545
1550
|
|
|
1551
|
+
Use `--color` to colorize headers, keys, and values for terminal or demo videos (plain output by default; disabled when writing to a file). Respects the `NO_COLOR` environment variable.
|
|
1552
|
+
|
|
1546
1553
|
### Examples
|
|
1547
1554
|
|
|
1548
1555
|
```bash
|
|
@@ -341,6 +341,7 @@ audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py
|
|
|
341
341
|
audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py
|
|
342
342
|
audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py
|
|
343
343
|
audiometa/test/tests/unit/cli/__init__.py
|
|
344
|
+
audiometa/test/tests/unit/cli/test_cli_colorize.py
|
|
344
345
|
audiometa/test/tests/unit/cli/test_expand_file_patterns.py
|
|
345
346
|
audiometa/test/tests/unit/metadata_managers/__init__.py
|
|
346
347
|
audiometa/test/tests/unit/metadata_managers/conftest.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "audiometa-python"
|
|
7
|
-
version = "1.2
|
|
7
|
+
version = "1.3.2"
|
|
8
8
|
description = "A comprehensive Python library for reading and writing audio metadata across multiple formats"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -53,9 +53,9 @@ yaml = [
|
|
|
53
53
|
]
|
|
54
54
|
|
|
55
55
|
[project.urls]
|
|
56
|
-
Homepage = "https://github.com/
|
|
57
|
-
Repository = "https://github.com/
|
|
58
|
-
Issues = "https://github.com/
|
|
56
|
+
Homepage = "https://github.com/BehindTheMusicTree/audiometa"
|
|
57
|
+
Repository = "https://github.com/BehindTheMusicTree/audiometa"
|
|
58
|
+
Issues = "https://github.com/BehindTheMusicTree/audiometa/issues"
|
|
59
59
|
|
|
60
60
|
[tool.setuptools.packages.find]
|
|
61
61
|
where = ["."]
|
|
@@ -104,6 +104,11 @@ ignore = ["N999", "PLR0911", "PLR0912", "PLR0913", "PLR0914", "PLR0915", "TRY301
|
|
|
104
104
|
"audiometa/test/**" = ["PLR2004"]
|
|
105
105
|
# PLR2004 is acceptable in pre-commit hooks - simple scripts where magic numbers are clear
|
|
106
106
|
".pre-commit-hooks/**" = ["PLR2004"]
|
|
107
|
+
# T201 (print) is acceptable in demo scripts - they are CLI/demo tools, not library code
|
|
108
|
+
"scripts/run_demo_tape.py" = ["T201"]
|
|
109
|
+
"scripts/demo_repl.py" = ["T201"]
|
|
110
|
+
# Release script: CLI tool; relax exception/literal and magic-number rules for clarity
|
|
111
|
+
"scripts/prepare_release.py" = ["TRY003", "EM101", "EM102", "PLR2004", "DTZ011", "RUF005", "T201"]
|
|
107
112
|
|
|
108
113
|
[tool.mypy]
|
|
109
114
|
python_version = "3.12"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/_rating_supporting/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/id3v1_raw_metadata.py
RENAMED
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py
RENAMED
|
File without changes
|
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/assets/create_test_files.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/scripts/__init__.py
RENAMED
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/technical_info_inspector.py
RENAMED
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/helpers/temp_file_with_metadata.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/__init__.py
RENAMED
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_basic.py
RENAMED
|
File without changes
|
|
File without changes
|
{audiometa_python-1.2.1 → audiometa_python-1.3.2}/audiometa/test/tests/e2e/cli/read/test_formats.py
RENAMED
|
File without changes
|
|
File without changes
|