audiometa-python 0.5.0__tar.gz → 0.6.1__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-0.5.0/audiometa_python.egg-info → audiometa_python-0.6.1}/PKG-INFO +38 -40
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/README.md +37 -39
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/__init__.py +130 -99
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/_audio_file.py +4 -4
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/cli.py +4 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_MetadataManager.py +40 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +2 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +5 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +2 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/common/external_tool_runner.py +12 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +8 -6
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/riff/riff_metadata_setter.py +1 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/conftest.py +15 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +9 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/test_formatting.py +1 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +9 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +1 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +1 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +1 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_options.py +1 -1
- audiometa_python-0.6.1/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +1 -0
- audiometa_python-0.6.1/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +31 -0
- audiometa_python-0.6.1/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +35 -0
- audiometa_python-0.6.1/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +165 -0
- audiometa_python-0.6.1/audiometa/test/tests/integration/technical_info/test_bitrate.py +79 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/test_sync_strategy.py +64 -0
- audiometa_python-0.6.1/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +121 -0
- audiometa_python-0.6.1/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +30 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/tool_path_resolver.py +2 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/types.py +1 -1
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/unified_metadata_key.py +2 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1/audiometa_python.egg-info}/PKG-INFO +38 -40
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa_python.egg-info/SOURCES.txt +6 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/pyproject.toml +1 -1
- audiometa_python-0.5.0/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -38
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/LICENSE +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/__main__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/exceptions.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/id3v1/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/id3v1/_constants.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/assets/create_test_files.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/common/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v1/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v2/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/riff/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/scripts/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/technical_info_inspector.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/vorbis/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_with_id3v2_tags.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/conftest.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_audio_data_corruption.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_flipped_md5.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_non_flac_error.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_partial_md5.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_random_md5.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_unset_md5.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/flac_md5/test_valid_md5.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/test_audio_file.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/cli/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/header_info/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/id3v1_genre_code_map.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/metadata_format.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/metadata_writing_strategy.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/mutagen_exception_handler.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/os_dependencies_checker/base.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/os_dependencies_checker/config.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa/utils/rating_profiles.py +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa_python.egg-info/dependency_links.txt +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa_python.egg-info/entry_points.txt +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa_python.egg-info/requires.txt +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/audiometa_python.egg-info/top_level.txt +0 -0
- {audiometa_python-0.5.0 → audiometa_python-0.6.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: audiometa-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.1
|
|
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>
|
|
@@ -480,6 +480,8 @@ from audiometa.utils.MetadataFormat import MetadataFormat
|
|
|
480
480
|
update_metadata("song.wav", new_metadata, metadata_format=MetadataFormat.RIFF)
|
|
481
481
|
```
|
|
482
482
|
|
|
483
|
+
**For comprehensive documentation** on writing strategies, format handling, and unsupported field management, see the **[Writing Metadata Guide](docs/WRITING_METADATA.md)**.
|
|
484
|
+
|
|
483
485
|
### Deleting Metadata
|
|
484
486
|
|
|
485
487
|
There are two ways to remove metadata from audio files:
|
|
@@ -579,7 +581,7 @@ if is_audio_file("path/to/your/audio.flac"):
|
|
|
579
581
|
file_size = get_file_size("path/to/your/audio.flac")
|
|
580
582
|
|
|
581
583
|
print(f"Duration: {duration} seconds")
|
|
582
|
-
print(f"Bitrate: {bitrate} kbps")
|
|
584
|
+
print(f"Bitrate: {bitrate} bps ({bitrate // 1000} kbps)")
|
|
583
585
|
print(f"Sample Rate: {sample_rate} Hz")
|
|
584
586
|
print(f"Channels: {channels}")
|
|
585
587
|
print(f"File Size: {file_size} bytes")
|
|
@@ -711,7 +713,7 @@ print(f"Artists: {full_metadata['unified_metadata'][UnifiedMetadataKey.ARTISTS]}
|
|
|
711
713
|
|
|
712
714
|
# Access technical information
|
|
713
715
|
print(f"Duration: {full_metadata['technical_info']['duration_seconds']} seconds")
|
|
714
|
-
print(f"Bitrate: {full_metadata['technical_info']['
|
|
716
|
+
print(f"Bitrate: {full_metadata['technical_info']['bitrate_bps']} bps ({full_metadata['technical_info']['bitrate_bps'] // 1000} kbps)")
|
|
715
717
|
print(f"Sample Rate: {full_metadata['technical_info']['sample_rate_hz']} Hz")
|
|
716
718
|
print(f"Channels: {full_metadata['technical_info']['channels']}")
|
|
717
719
|
print(f"File Size: {full_metadata['technical_info']['file_size_bytes']} bytes")
|
|
@@ -751,7 +753,7 @@ A comprehensive dictionary containing:
|
|
|
751
753
|
},
|
|
752
754
|
'technical_info': {
|
|
753
755
|
'duration_seconds': 180.5,
|
|
754
|
-
'
|
|
756
|
+
'bitrate_bps': 320000,
|
|
755
757
|
'sample_rate_hz': 44100,
|
|
756
758
|
'channels': 2,
|
|
757
759
|
'file_size_bytes': 7234567,
|
|
@@ -936,6 +938,10 @@ validate_metadata_for_update({UnifiedMetadataKey.RELEASE_DATE: "2024/01/01"})
|
|
|
936
938
|
|
|
937
939
|
### Writing Metadata (API Reference)
|
|
938
940
|
|
|
941
|
+
**For comprehensive writing metadata documentation**, including writing strategies, format handling, unsupported field management, and advanced examples, see the dedicated guide:
|
|
942
|
+
|
|
943
|
+
**[Writing Metadata Guide](docs/WRITING_METADATA.md)**
|
|
944
|
+
|
|
939
945
|
For validation before writing, see [Pre-Update Validation (API Reference)](#pre-update-validation-api-reference).
|
|
940
946
|
|
|
941
947
|
#### Metadata Dictionary Structure
|
|
@@ -1057,6 +1063,7 @@ The library provides flexible control over how metadata is written to files that
|
|
|
1057
1063
|
1. **`SYNC` (Default)**: Write to native format and synchronize other metadata formats that are already present
|
|
1058
1064
|
2. **`PRESERVE`**: Write to native format only, preserve existing metadata in other formats
|
|
1059
1065
|
3. **`CLEANUP`**: Write to native format and remove all non-native metadata formats
|
|
1066
|
+
4. **`FORCE`**: Write only to the specified format (when `metadata_format` is provided), fail on unsupported fields
|
|
1060
1067
|
|
|
1061
1068
|
##### Usage Examples
|
|
1062
1069
|
|
|
@@ -1075,35 +1082,17 @@ update_metadata("song.wav", {"title": "New Title"},
|
|
|
1075
1082
|
# PRESERVE strategy - keep other formats unchanged
|
|
1076
1083
|
update_metadata("song.wav", {"title": "New Title"},
|
|
1077
1084
|
metadata_strategy=MetadataWritingStrategy.PRESERVE)
|
|
1085
|
+
|
|
1086
|
+
# FORCE strategy - write only to specified format
|
|
1087
|
+
from audiometa.utils.MetadataFormat import MetadataFormat
|
|
1088
|
+
update_metadata("song.mp3", {"title": "New Title"},
|
|
1089
|
+
metadata_format=MetadataFormat.ID3V2)
|
|
1078
1090
|
```
|
|
1079
1091
|
|
|
1080
1092
|
##### Default Behavior
|
|
1081
1093
|
|
|
1082
1094
|
By default, the library uses the **SYNC strategy** which writes metadata to the native format and synchronizes other metadata formats that are already present. This provides the best user experience by writing metadata where possible and handling unsupported fields gracefully.
|
|
1083
1095
|
|
|
1084
|
-
- **MP3 files**: Writes to ID3v2 and syncs other formats
|
|
1085
|
-
- **FLAC files**: Writes to Vorbis comments and syncs other formats
|
|
1086
|
-
- **WAV files**: Writes to RIFF and syncs other formats
|
|
1087
|
-
|
|
1088
|
-
#### Forced Format Behavior
|
|
1089
|
-
|
|
1090
|
-
When you specify a `metadata_format` parameter, you **cannot** also specify a `metadata_strategy`:
|
|
1091
|
-
|
|
1092
|
-
- **Write only to the specified format**: Other formats are left completely untouched
|
|
1093
|
-
- **Fail fast on unsupported fields**: Raises `MetadataFieldNotSupportedByMetadataFormatError` for any unsupported metadata
|
|
1094
|
-
- **Predictable behavior**: No side effects on other metadata formats
|
|
1095
|
-
|
|
1096
|
-
```python
|
|
1097
|
-
# Correct usage - specify only the format
|
|
1098
|
-
update_metadata("song.mp3", metadata,
|
|
1099
|
-
metadata_format=MetadataFormat.RIFF) # Writes only to RIFF, ignores ID3v2
|
|
1100
|
-
|
|
1101
|
-
# This will raise MetadataWritingConflictParametersError - cannot specify both parameters
|
|
1102
|
-
update_metadata("song.mp3", metadata,
|
|
1103
|
-
metadata_format=MetadataFormat.RIFF,
|
|
1104
|
-
metadata_strategy=MetadataWritingStrategy.CLEANUP) # Raises MetadataWritingConflictParametersError
|
|
1105
|
-
```
|
|
1106
|
-
|
|
1107
1096
|
#### Usage Examples
|
|
1108
1097
|
|
|
1109
1098
|
**Default Behavior (SYNC strategy)**
|
|
@@ -1111,13 +1100,14 @@ update_metadata("song.mp3", metadata,
|
|
|
1111
1100
|
```python
|
|
1112
1101
|
from audiometa import update_metadata
|
|
1113
1102
|
|
|
1114
|
-
# WAV file with existing ID3v1 tags (30-char limit)
|
|
1115
|
-
update_metadata("song.wav", {"title": "This is a Very Long Title That Exceeds ID3v1 Limits"
|
|
1103
|
+
# WAV file with existing ID3v1 tags (30-char limit and no album artist support)
|
|
1104
|
+
update_metadata("song.wav", {"title": "This is a Very Long Title That Exceeds ID3v1 Limits",
|
|
1105
|
+
"album_artist": "Various Artists"})
|
|
1116
1106
|
|
|
1117
1107
|
# Result:
|
|
1118
|
-
# - RIFF tags: Updated with full title (native format)
|
|
1119
|
-
# - ID3v1 tags: Synchronized with truncated title (
|
|
1120
|
-
# - When reading: RIFF title is returned (higher precedence)
|
|
1108
|
+
# - RIFF tags: Updated with full title (native format) and album artist
|
|
1109
|
+
# - ID3v1 tags: Synchronized only with truncated 30-char truncated title and no album artist (not supported)
|
|
1110
|
+
# - When reading: RIFF title is returned (higher precedence) and album artist is available
|
|
1121
1111
|
# Note: ID3v1 title becomes "This is a Very Long Title Th" (truncated)
|
|
1122
1112
|
```
|
|
1123
1113
|
|
|
@@ -1152,11 +1142,15 @@ update_metadata("song.wav", {"title": "New Title"},
|
|
|
1152
1142
|
# Note: SYNC preserves and updates ALL existing metadata formats
|
|
1153
1143
|
```
|
|
1154
1144
|
|
|
1155
|
-
**Format-Specific Writing**
|
|
1145
|
+
**FORCE Strategy - Format-Specific Writing**
|
|
1156
1146
|
|
|
1157
1147
|
```python
|
|
1158
1148
|
from audiometa.utils.MetadataFormat import MetadataFormat
|
|
1159
1149
|
|
|
1150
|
+
# Write specifically to ID3v1 format
|
|
1151
|
+
update_metadata("song.flac", {"title": "New Title"},
|
|
1152
|
+
metadata_format=MetadataFormat.ID3V1)
|
|
1153
|
+
|
|
1160
1154
|
# Write specifically to ID3v2 format (even for WAV files)
|
|
1161
1155
|
update_metadata("song.wav", {"title": "New Title"},
|
|
1162
1156
|
metadata_format=MetadataFormat.ID3V2)
|
|
@@ -1164,6 +1158,10 @@ update_metadata("song.wav", {"title": "New Title"},
|
|
|
1164
1158
|
# Write specifically to RIFF format
|
|
1165
1159
|
update_metadata("song.wav", {"title": "New Title"},
|
|
1166
1160
|
metadata_format=MetadataFormat.RIFF)
|
|
1161
|
+
|
|
1162
|
+
# Write specifically to Vorbis format
|
|
1163
|
+
update_metadata("song.flac", {"title": "New Title"},
|
|
1164
|
+
metadata_format=MetadataFormat.VORBIS)
|
|
1167
1165
|
```
|
|
1168
1166
|
|
|
1169
1167
|
### Deleting Metadata (API Reference)
|
|
@@ -1344,17 +1342,17 @@ For comprehensive documentation on all exceptions that can be raised by the libr
|
|
|
1344
1342
|
The library handles unsupported metadata consistently across all strategies:
|
|
1345
1343
|
|
|
1346
1344
|
- **Forced format** (when `metadata_format` is specified): Always fails fast by raising `MetadataFieldNotSupportedByMetadataFormatError` for any unsupported field. **No writing is performed** - the file remains completely unchanged.
|
|
1347
|
-
- **All strategies (SYNC, PRESERVE, CLEANUP) with `fail_on_unsupported_field=False` (default)**: Handle unsupported fields gracefully by logging warnings and continuing with supported fields
|
|
1345
|
+
- **All strategies (SYNC, PRESERVE, CLEANUP) with `fail_on_unsupported_field=False` (default)**: Handle unsupported fields gracefully by logging individual warnings for each unsupported field and continuing with supported fields. For SYNC strategy, unsupported fields are filtered per-format, allowing all supported fields to sync to each format.
|
|
1348
1346
|
- **All strategies (SYNC, PRESERVE, CLEANUP) with `fail_on_unsupported_field=True`**: Fails fast if any field is not supported by the target format. **No writing is performed** - the file remains completely unchanged (atomic operation).
|
|
1349
1347
|
|
|
1350
1348
|
#### Format-Specific Limitations
|
|
1351
1349
|
|
|
1352
|
-
| Format | Forced Format | All Strategies with `fail_on_unsupported_field=False`
|
|
1353
|
-
| -------------- | --------------------------------- |
|
|
1354
|
-
| **RIFF (WAV)** | Always fails fast, **no writing** | Logs warnings
|
|
1355
|
-
| **ID3v1** | Always fails fast, **no writing** | Logs warnings
|
|
1356
|
-
| **ID3v2** | Always fails fast, **no writing** | All fields supported
|
|
1357
|
-
| **Vorbis** | Always fails fast, **no writing** | All fields supported
|
|
1350
|
+
| Format | Forced Format | All Strategies with `fail_on_unsupported_field=False` | All Strategies with `fail_on_unsupported_field=True` |
|
|
1351
|
+
| -------------- | --------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- |
|
|
1352
|
+
| **RIFF (WAV)** | Always fails fast, **no writing** | Logs individual warnings per unsupported field, writes supported ones | Fails fast for unsupported fields, **no writing** |
|
|
1353
|
+
| **ID3v1** | Always fails fast, **no writing** | Logs individual warnings per unsupported field, writes supported ones | Fails fast for unsupported fields, **no writing** |
|
|
1354
|
+
| **ID3v2** | Always fails fast, **no writing** | All fields supported | All fields supported |
|
|
1355
|
+
| **Vorbis** | Always fails fast, **no writing** | All fields supported | All fields supported |
|
|
1358
1356
|
|
|
1359
1357
|
#### Atomic Write Operations
|
|
1360
1358
|
|
|
@@ -438,6 +438,8 @@ from audiometa.utils.MetadataFormat import MetadataFormat
|
|
|
438
438
|
update_metadata("song.wav", new_metadata, metadata_format=MetadataFormat.RIFF)
|
|
439
439
|
```
|
|
440
440
|
|
|
441
|
+
**For comprehensive documentation** on writing strategies, format handling, and unsupported field management, see the **[Writing Metadata Guide](docs/WRITING_METADATA.md)**.
|
|
442
|
+
|
|
441
443
|
### Deleting Metadata
|
|
442
444
|
|
|
443
445
|
There are two ways to remove metadata from audio files:
|
|
@@ -537,7 +539,7 @@ if is_audio_file("path/to/your/audio.flac"):
|
|
|
537
539
|
file_size = get_file_size("path/to/your/audio.flac")
|
|
538
540
|
|
|
539
541
|
print(f"Duration: {duration} seconds")
|
|
540
|
-
print(f"Bitrate: {bitrate} kbps")
|
|
542
|
+
print(f"Bitrate: {bitrate} bps ({bitrate // 1000} kbps)")
|
|
541
543
|
print(f"Sample Rate: {sample_rate} Hz")
|
|
542
544
|
print(f"Channels: {channels}")
|
|
543
545
|
print(f"File Size: {file_size} bytes")
|
|
@@ -669,7 +671,7 @@ print(f"Artists: {full_metadata['unified_metadata'][UnifiedMetadataKey.ARTISTS]}
|
|
|
669
671
|
|
|
670
672
|
# Access technical information
|
|
671
673
|
print(f"Duration: {full_metadata['technical_info']['duration_seconds']} seconds")
|
|
672
|
-
print(f"Bitrate: {full_metadata['technical_info']['
|
|
674
|
+
print(f"Bitrate: {full_metadata['technical_info']['bitrate_bps']} bps ({full_metadata['technical_info']['bitrate_bps'] // 1000} kbps)")
|
|
673
675
|
print(f"Sample Rate: {full_metadata['technical_info']['sample_rate_hz']} Hz")
|
|
674
676
|
print(f"Channels: {full_metadata['technical_info']['channels']}")
|
|
675
677
|
print(f"File Size: {full_metadata['technical_info']['file_size_bytes']} bytes")
|
|
@@ -709,7 +711,7 @@ A comprehensive dictionary containing:
|
|
|
709
711
|
},
|
|
710
712
|
'technical_info': {
|
|
711
713
|
'duration_seconds': 180.5,
|
|
712
|
-
'
|
|
714
|
+
'bitrate_bps': 320000,
|
|
713
715
|
'sample_rate_hz': 44100,
|
|
714
716
|
'channels': 2,
|
|
715
717
|
'file_size_bytes': 7234567,
|
|
@@ -894,6 +896,10 @@ validate_metadata_for_update({UnifiedMetadataKey.RELEASE_DATE: "2024/01/01"})
|
|
|
894
896
|
|
|
895
897
|
### Writing Metadata (API Reference)
|
|
896
898
|
|
|
899
|
+
**For comprehensive writing metadata documentation**, including writing strategies, format handling, unsupported field management, and advanced examples, see the dedicated guide:
|
|
900
|
+
|
|
901
|
+
**[Writing Metadata Guide](docs/WRITING_METADATA.md)**
|
|
902
|
+
|
|
897
903
|
For validation before writing, see [Pre-Update Validation (API Reference)](#pre-update-validation-api-reference).
|
|
898
904
|
|
|
899
905
|
#### Metadata Dictionary Structure
|
|
@@ -1015,6 +1021,7 @@ The library provides flexible control over how metadata is written to files that
|
|
|
1015
1021
|
1. **`SYNC` (Default)**: Write to native format and synchronize other metadata formats that are already present
|
|
1016
1022
|
2. **`PRESERVE`**: Write to native format only, preserve existing metadata in other formats
|
|
1017
1023
|
3. **`CLEANUP`**: Write to native format and remove all non-native metadata formats
|
|
1024
|
+
4. **`FORCE`**: Write only to the specified format (when `metadata_format` is provided), fail on unsupported fields
|
|
1018
1025
|
|
|
1019
1026
|
##### Usage Examples
|
|
1020
1027
|
|
|
@@ -1033,35 +1040,17 @@ update_metadata("song.wav", {"title": "New Title"},
|
|
|
1033
1040
|
# PRESERVE strategy - keep other formats unchanged
|
|
1034
1041
|
update_metadata("song.wav", {"title": "New Title"},
|
|
1035
1042
|
metadata_strategy=MetadataWritingStrategy.PRESERVE)
|
|
1043
|
+
|
|
1044
|
+
# FORCE strategy - write only to specified format
|
|
1045
|
+
from audiometa.utils.MetadataFormat import MetadataFormat
|
|
1046
|
+
update_metadata("song.mp3", {"title": "New Title"},
|
|
1047
|
+
metadata_format=MetadataFormat.ID3V2)
|
|
1036
1048
|
```
|
|
1037
1049
|
|
|
1038
1050
|
##### Default Behavior
|
|
1039
1051
|
|
|
1040
1052
|
By default, the library uses the **SYNC strategy** which writes metadata to the native format and synchronizes other metadata formats that are already present. This provides the best user experience by writing metadata where possible and handling unsupported fields gracefully.
|
|
1041
1053
|
|
|
1042
|
-
- **MP3 files**: Writes to ID3v2 and syncs other formats
|
|
1043
|
-
- **FLAC files**: Writes to Vorbis comments and syncs other formats
|
|
1044
|
-
- **WAV files**: Writes to RIFF and syncs other formats
|
|
1045
|
-
|
|
1046
|
-
#### Forced Format Behavior
|
|
1047
|
-
|
|
1048
|
-
When you specify a `metadata_format` parameter, you **cannot** also specify a `metadata_strategy`:
|
|
1049
|
-
|
|
1050
|
-
- **Write only to the specified format**: Other formats are left completely untouched
|
|
1051
|
-
- **Fail fast on unsupported fields**: Raises `MetadataFieldNotSupportedByMetadataFormatError` for any unsupported metadata
|
|
1052
|
-
- **Predictable behavior**: No side effects on other metadata formats
|
|
1053
|
-
|
|
1054
|
-
```python
|
|
1055
|
-
# Correct usage - specify only the format
|
|
1056
|
-
update_metadata("song.mp3", metadata,
|
|
1057
|
-
metadata_format=MetadataFormat.RIFF) # Writes only to RIFF, ignores ID3v2
|
|
1058
|
-
|
|
1059
|
-
# This will raise MetadataWritingConflictParametersError - cannot specify both parameters
|
|
1060
|
-
update_metadata("song.mp3", metadata,
|
|
1061
|
-
metadata_format=MetadataFormat.RIFF,
|
|
1062
|
-
metadata_strategy=MetadataWritingStrategy.CLEANUP) # Raises MetadataWritingConflictParametersError
|
|
1063
|
-
```
|
|
1064
|
-
|
|
1065
1054
|
#### Usage Examples
|
|
1066
1055
|
|
|
1067
1056
|
**Default Behavior (SYNC strategy)**
|
|
@@ -1069,13 +1058,14 @@ update_metadata("song.mp3", metadata,
|
|
|
1069
1058
|
```python
|
|
1070
1059
|
from audiometa import update_metadata
|
|
1071
1060
|
|
|
1072
|
-
# WAV file with existing ID3v1 tags (30-char limit)
|
|
1073
|
-
update_metadata("song.wav", {"title": "This is a Very Long Title That Exceeds ID3v1 Limits"
|
|
1061
|
+
# WAV file with existing ID3v1 tags (30-char limit and no album artist support)
|
|
1062
|
+
update_metadata("song.wav", {"title": "This is a Very Long Title That Exceeds ID3v1 Limits",
|
|
1063
|
+
"album_artist": "Various Artists"})
|
|
1074
1064
|
|
|
1075
1065
|
# Result:
|
|
1076
|
-
# - RIFF tags: Updated with full title (native format)
|
|
1077
|
-
# - ID3v1 tags: Synchronized with truncated title (
|
|
1078
|
-
# - When reading: RIFF title is returned (higher precedence)
|
|
1066
|
+
# - RIFF tags: Updated with full title (native format) and album artist
|
|
1067
|
+
# - ID3v1 tags: Synchronized only with truncated 30-char truncated title and no album artist (not supported)
|
|
1068
|
+
# - When reading: RIFF title is returned (higher precedence) and album artist is available
|
|
1079
1069
|
# Note: ID3v1 title becomes "This is a Very Long Title Th" (truncated)
|
|
1080
1070
|
```
|
|
1081
1071
|
|
|
@@ -1110,11 +1100,15 @@ update_metadata("song.wav", {"title": "New Title"},
|
|
|
1110
1100
|
# Note: SYNC preserves and updates ALL existing metadata formats
|
|
1111
1101
|
```
|
|
1112
1102
|
|
|
1113
|
-
**Format-Specific Writing**
|
|
1103
|
+
**FORCE Strategy - Format-Specific Writing**
|
|
1114
1104
|
|
|
1115
1105
|
```python
|
|
1116
1106
|
from audiometa.utils.MetadataFormat import MetadataFormat
|
|
1117
1107
|
|
|
1108
|
+
# Write specifically to ID3v1 format
|
|
1109
|
+
update_metadata("song.flac", {"title": "New Title"},
|
|
1110
|
+
metadata_format=MetadataFormat.ID3V1)
|
|
1111
|
+
|
|
1118
1112
|
# Write specifically to ID3v2 format (even for WAV files)
|
|
1119
1113
|
update_metadata("song.wav", {"title": "New Title"},
|
|
1120
1114
|
metadata_format=MetadataFormat.ID3V2)
|
|
@@ -1122,6 +1116,10 @@ update_metadata("song.wav", {"title": "New Title"},
|
|
|
1122
1116
|
# Write specifically to RIFF format
|
|
1123
1117
|
update_metadata("song.wav", {"title": "New Title"},
|
|
1124
1118
|
metadata_format=MetadataFormat.RIFF)
|
|
1119
|
+
|
|
1120
|
+
# Write specifically to Vorbis format
|
|
1121
|
+
update_metadata("song.flac", {"title": "New Title"},
|
|
1122
|
+
metadata_format=MetadataFormat.VORBIS)
|
|
1125
1123
|
```
|
|
1126
1124
|
|
|
1127
1125
|
### Deleting Metadata (API Reference)
|
|
@@ -1302,17 +1300,17 @@ For comprehensive documentation on all exceptions that can be raised by the libr
|
|
|
1302
1300
|
The library handles unsupported metadata consistently across all strategies:
|
|
1303
1301
|
|
|
1304
1302
|
- **Forced format** (when `metadata_format` is specified): Always fails fast by raising `MetadataFieldNotSupportedByMetadataFormatError` for any unsupported field. **No writing is performed** - the file remains completely unchanged.
|
|
1305
|
-
- **All strategies (SYNC, PRESERVE, CLEANUP) with `fail_on_unsupported_field=False` (default)**: Handle unsupported fields gracefully by logging warnings and continuing with supported fields
|
|
1303
|
+
- **All strategies (SYNC, PRESERVE, CLEANUP) with `fail_on_unsupported_field=False` (default)**: Handle unsupported fields gracefully by logging individual warnings for each unsupported field and continuing with supported fields. For SYNC strategy, unsupported fields are filtered per-format, allowing all supported fields to sync to each format.
|
|
1306
1304
|
- **All strategies (SYNC, PRESERVE, CLEANUP) with `fail_on_unsupported_field=True`**: Fails fast if any field is not supported by the target format. **No writing is performed** - the file remains completely unchanged (atomic operation).
|
|
1307
1305
|
|
|
1308
1306
|
#### Format-Specific Limitations
|
|
1309
1307
|
|
|
1310
|
-
| Format | Forced Format | All Strategies with `fail_on_unsupported_field=False`
|
|
1311
|
-
| -------------- | --------------------------------- |
|
|
1312
|
-
| **RIFF (WAV)** | Always fails fast, **no writing** | Logs warnings
|
|
1313
|
-
| **ID3v1** | Always fails fast, **no writing** | Logs warnings
|
|
1314
|
-
| **ID3v2** | Always fails fast, **no writing** | All fields supported
|
|
1315
|
-
| **Vorbis** | Always fails fast, **no writing** | All fields supported
|
|
1308
|
+
| Format | Forced Format | All Strategies with `fail_on_unsupported_field=False` | All Strategies with `fail_on_unsupported_field=True` |
|
|
1309
|
+
| -------------- | --------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------- |
|
|
1310
|
+
| **RIFF (WAV)** | Always fails fast, **no writing** | Logs individual warnings per unsupported field, writes supported ones | Fails fast for unsupported fields, **no writing** |
|
|
1311
|
+
| **ID3v1** | Always fails fast, **no writing** | Logs individual warnings per unsupported field, writes supported ones | Fails fast for unsupported fields, **no writing** |
|
|
1312
|
+
| **ID3v2** | Always fails fast, **no writing** | All fields supported | All fields supported |
|
|
1313
|
+
| **Vorbis** | Always fails fast, **no writing** | All fields supported | All fields supported |
|
|
1316
1314
|
|
|
1317
1315
|
#### Atomic Write Operations
|
|
1318
1316
|
|