audiometa-python 0.7.1__tar.gz → 0.8.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.7.1/audiometa_python.egg-info → audiometa_python-0.8.1}/PKG-INFO +11 -11
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/README.md +10 -10
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/__init__.py +60 -18
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/_audio_file.py +11 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +59 -1
- audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +35 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +32 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +90 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_invalid_md5/test_flipped_md5.py +0 -7
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_invalid_md5/test_partial_md5.py +0 -9
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_invalid_md5/test_random_md5.py +0 -9
- audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +63 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_unset_md5.py +0 -18
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +1 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +306 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +174 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +306 -0
- audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +105 -0
- audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
- audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1/audiometa_python.egg-info}/PKG-INFO +11 -11
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/SOURCES.txt +26 -18
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/pyproject.toml +1 -1
- audiometa_python-0.7.1/audiometa/test/tests/integration/audio_format/wav/test_wav_with_id3v2_tags.py +0 -83
- audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies/test_sync_strategy.py +0 -279
- audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -42
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/LICENSE +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/__main__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/cli.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/exceptions.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_MetadataManager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/_constants.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/assets/create_test_files.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/common/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/riff/riff_metadata_setter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/scripts/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/technical_info_inspector.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/conftest.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/conftest.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_audio_data_corruption.py +0 -0
- /audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_valid_md5.py → /audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_invalid_with_metadata_combinations.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_state_precedence.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_unset_with_metadata_combinations.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_validation_fails_with_id3v1.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_validation_with_id3v2_only.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_validation_works_without_id3v1.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/writing → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5 → audiometa_python-0.8.1/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/test_non_flac_error.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_file.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields → audiometa_python-0.8.1/audiometa/test/tests/integration/writing}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit → audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/audio_file → audiometa_python-0.8.1/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/audio_file/technical_info → audiometa_python-0.8.1/audiometa/test/tests/unit}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/cli → audiometa_python-0.8.1/audiometa/test/tests/unit/audio_file}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers → audiometa_python-0.8.1/audiometa/test/tests/unit/audio_file/technical_info}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/header_info → audiometa_python-0.8.1/audiometa/test/tests/unit/cli}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/header_info}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values}/__init__.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
- {audiometa_python-0.7.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing → audiometa_python-0.8.1/audiometa/test/tests/unit/metadata_managers/metadata_field/rating}/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/flac_md5_state.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/id3v1_genre_code_map.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/metadata_format.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/metadata_writing_strategy.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/mutagen_exception_handler.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/base.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/config.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/macos.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/rating_profiles.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/tool_path_resolver.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/types.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa/utils/unified_metadata_key.py +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/dependency_links.txt +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/entry_points.txt +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/requires.txt +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.1}/audiometa_python.egg-info/top_level.txt +0 -0
- {audiometa_python-0.7.1 → audiometa_python-0.8.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.8.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>
|
|
@@ -41,29 +41,29 @@ Requires-Dist: PyYAML==6.0; extra == "yaml"
|
|
|
41
41
|
Dynamic: license-file
|
|
42
42
|
|
|
43
43
|
<div align="center">
|
|
44
|
-
<img src="https://raw.githubusercontent.com/
|
|
44
|
+
<img src="https://raw.githubusercontent.com/BehindTheMusicTree/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
|
|
45
45
|
</div>
|
|
46
46
|
|
|
47
47
|
# AudioMeta Python
|
|
48
48
|
|
|
49
|
-
[](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml)
|
|
50
50
|
[](https://www.python.org/)
|
|
51
51
|
[](LICENSE)
|
|
52
52
|
[](https://pypi.org/project/audiometa-python/)
|
|
53
53
|
[](https://pepy.tech/project/audiometa-python)
|
|
54
|
-
[](https://github.com/BehindTheMusicTree/audiometa/stargazers)
|
|
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
|
-
**Author**: [Andreas Garcia](https://github.com/
|
|
58
|
+
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
59
59
|
|
|
60
60
|
## ⭐ Show Your Support
|
|
61
61
|
|
|
62
62
|
If you find AudioMeta Python useful, please consider:
|
|
63
63
|
|
|
64
64
|
- ⭐ **Starring this repository** - It helps others discover the project
|
|
65
|
-
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/
|
|
66
|
-
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/
|
|
65
|
+
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
66
|
+
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions) or [feature requests](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
67
67
|
- 🤝 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for ways to help
|
|
68
68
|
- 📢 **Sharing** - Tell others about AudioMeta Python
|
|
69
69
|
|
|
@@ -111,7 +111,7 @@ Your support helps make this project better for everyone! 🎵
|
|
|
111
111
|
- [📝 Changelog](#-changelog)
|
|
112
112
|
- [🤝 Contributing](#-contributing)
|
|
113
113
|
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
114
|
-
- [Security Policy](https://github.com/
|
|
114
|
+
- [Security Policy](https://github.com/BehindTheMusicTree/audiometa/security/policy)
|
|
115
115
|
- [License](#license)
|
|
116
116
|
|
|
117
117
|
## ✨ Features
|
|
@@ -1561,11 +1561,11 @@ Whether you're fixing bugs, adding features, improving documentation, or sharing
|
|
|
1561
1561
|
|
|
1562
1562
|
**Ways to contribute:**
|
|
1563
1563
|
|
|
1564
|
-
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/
|
|
1565
|
-
- 💡 **Suggest features** - Use the [feature request template](https://github.com/
|
|
1564
|
+
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=bug_report.yml)
|
|
1565
|
+
- 💡 **Suggest features** - Use the [feature request template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=feature_request.yml)
|
|
1566
1566
|
- 🔧 **Submit pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
|
|
1567
1567
|
- 📝 **Improve documentation** - Fix typos, clarify explanations, add examples
|
|
1568
|
-
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/
|
|
1568
|
+
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions)
|
|
1569
1569
|
- ⭐ **Star the repo** - Help others discover the project
|
|
1570
1570
|
|
|
1571
1571
|
For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/
|
|
2
|
+
<img src="https://raw.githubusercontent.com/BehindTheMusicTree/audiometa/main/assets/logo.png" alt="AudioMeta Logo" width="200"/>
|
|
3
3
|
</div>
|
|
4
4
|
|
|
5
5
|
# AudioMeta Python
|
|
6
6
|
|
|
7
|
-
[](https://github.com/BehindTheMusicTree/audiometa/actions/workflows/ci.yml)
|
|
8
8
|
[](https://www.python.org/)
|
|
9
9
|
[](LICENSE)
|
|
10
10
|
[](https://pypi.org/project/audiometa-python/)
|
|
11
11
|
[](https://pepy.tech/project/audiometa-python)
|
|
12
|
-
[](https://github.com/BehindTheMusicTree/audiometa/stargazers)
|
|
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
|
-
**Author**: [Andreas Garcia](https://github.com/
|
|
16
|
+
**Author**: [Andreas Garcia](https://github.com/BehindTheMusicTree)
|
|
17
17
|
|
|
18
18
|
## ⭐ Show Your Support
|
|
19
19
|
|
|
20
20
|
If you find AudioMeta Python useful, please consider:
|
|
21
21
|
|
|
22
22
|
- ⭐ **Starring this repository** - It helps others discover the project
|
|
23
|
-
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/
|
|
24
|
-
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/
|
|
23
|
+
- 🐛 **Reporting bugs** - Help improve the library by [opening an issue](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
24
|
+
- 💡 **Suggesting features** - Share your ideas via [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions) or [feature requests](https://github.com/BehindTheMusicTree/audiometa/issues)
|
|
25
25
|
- 🤝 **Contributing** - See [CONTRIBUTING.md](CONTRIBUTING.md) for ways to help
|
|
26
26
|
- 📢 **Sharing** - Tell others about AudioMeta Python
|
|
27
27
|
|
|
@@ -69,7 +69,7 @@ Your support helps make this project better for everyone! 🎵
|
|
|
69
69
|
- [📝 Changelog](#-changelog)
|
|
70
70
|
- [🤝 Contributing](#-contributing)
|
|
71
71
|
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
72
|
-
- [Security Policy](https://github.com/
|
|
72
|
+
- [Security Policy](https://github.com/BehindTheMusicTree/audiometa/security/policy)
|
|
73
73
|
- [License](#license)
|
|
74
74
|
|
|
75
75
|
## ✨ Features
|
|
@@ -1519,11 +1519,11 @@ Whether you're fixing bugs, adding features, improving documentation, or sharing
|
|
|
1519
1519
|
|
|
1520
1520
|
**Ways to contribute:**
|
|
1521
1521
|
|
|
1522
|
-
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/
|
|
1523
|
-
- 💡 **Suggest features** - Use the [feature request template](https://github.com/
|
|
1522
|
+
- 🐛 **Report bugs** - Use the [bug report template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=bug_report.yml)
|
|
1523
|
+
- 💡 **Suggest features** - Use the [feature request template](https://github.com/BehindTheMusicTree/audiometa/issues/new?template=feature_request.yml)
|
|
1524
1524
|
- 🔧 **Submit pull requests** - See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
|
|
1525
1525
|
- 📝 **Improve documentation** - Fix typos, clarify explanations, add examples
|
|
1526
|
-
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/
|
|
1526
|
+
- 💬 **Join discussions** - Share ideas and help others in [GitHub Discussions](https://github.com/BehindTheMusicTree/audiometa/discussions)
|
|
1527
1527
|
- ⭐ **Star the repo** - Help others discover the project
|
|
1528
1528
|
|
|
1529
1529
|
For detailed contribution guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
@@ -553,6 +553,7 @@ def update_metadata(
|
|
|
553
553
|
metadata_strategy: MetadataWritingStrategy | None = None,
|
|
554
554
|
metadata_format: MetadataFormat | None = None,
|
|
555
555
|
fail_on_unsupported_field: bool = False,
|
|
556
|
+
warn_on_unsupported_field: bool = True,
|
|
556
557
|
) -> None:
|
|
557
558
|
"""Update metadata in an audio file.
|
|
558
559
|
|
|
@@ -575,6 +576,9 @@ def update_metadata(
|
|
|
575
576
|
If False (default), unsupported fields are filtered out with individual warnings for each field.
|
|
576
577
|
For SYNC strategy, this applies per-format: unsupported fields are skipped for each format that
|
|
577
578
|
doesn't support them, while still syncing all supported fields.
|
|
579
|
+
warn_on_unsupported_field: If True (default), issues warnings when unsupported fields are encountered.
|
|
580
|
+
If False, suppresses warnings about unsupported fields. Automatically set to False when
|
|
581
|
+
fail_on_unsupported_field is True.
|
|
578
582
|
|
|
579
583
|
Returns:
|
|
580
584
|
None
|
|
@@ -600,8 +604,9 @@ def update_metadata(
|
|
|
600
604
|
|
|
601
605
|
When metadata_strategy is used, unsupported metadata fields are handled based on the
|
|
602
606
|
fail_on_unsupported_field parameter: True raises MetadataFieldNotSupportedByMetadataFormatError, False (default)
|
|
603
|
-
filters unsupported fields and warns about each one individually
|
|
604
|
-
are skipped per-format, allowing supported fields to sync while warning
|
|
607
|
+
filters unsupported fields and warns about each one individually (unless warn_on_unsupported_field is False).
|
|
608
|
+
For SYNC strategy, unsupported fields are skipped per-format, allowing supported fields to sync while warning
|
|
609
|
+
about unsupported ones.
|
|
605
610
|
|
|
606
611
|
Data Filtering:
|
|
607
612
|
For list-type metadata fields (e.g., ARTISTS, GENRES), empty strings and None values
|
|
@@ -642,6 +647,9 @@ def update_metadata(
|
|
|
642
647
|
}
|
|
643
648
|
# Results in: ["Artist 1", "Artist 2"] - empty strings and None filtered out
|
|
644
649
|
update_metadata("song.mp3", metadata)
|
|
650
|
+
|
|
651
|
+
# Suppress warnings about unsupported fields
|
|
652
|
+
update_metadata("song.mp3", metadata, warn_on_unsupported_field=False)
|
|
645
653
|
"""
|
|
646
654
|
audio_file = _AudioFile(file)
|
|
647
655
|
|
|
@@ -655,6 +663,11 @@ def update_metadata(
|
|
|
655
663
|
)
|
|
656
664
|
raise MetadataWritingConflictParametersError(msg)
|
|
657
665
|
|
|
666
|
+
# Automatically disable warnings when failing on unsupported fields
|
|
667
|
+
# This provides a more intuitive API where fail takes precedence over warn
|
|
668
|
+
if fail_on_unsupported_field:
|
|
669
|
+
warn_on_unsupported_field = False
|
|
670
|
+
|
|
658
671
|
# Default to SYNC strategy if not specified
|
|
659
672
|
if metadata_strategy is None:
|
|
660
673
|
metadata_strategy = MetadataWritingStrategy.SYNC
|
|
@@ -677,6 +690,7 @@ def update_metadata(
|
|
|
677
690
|
id3v2_version,
|
|
678
691
|
metadata_format,
|
|
679
692
|
fail_on_unsupported_field,
|
|
693
|
+
warn_on_unsupported_field,
|
|
680
694
|
)
|
|
681
695
|
|
|
682
696
|
|
|
@@ -688,6 +702,7 @@ def _handle_metadata_strategy(
|
|
|
688
702
|
id3v2_version: tuple[int, int, int] | None,
|
|
689
703
|
target_format: MetadataFormat | None = None,
|
|
690
704
|
fail_on_unsupported_field: bool = False,
|
|
705
|
+
warn_on_unsupported_field: bool = True,
|
|
691
706
|
) -> None:
|
|
692
707
|
"""Handle metadata strategy-specific behavior for all strategies."""
|
|
693
708
|
|
|
@@ -743,11 +758,12 @@ def _handle_metadata_strategy(
|
|
|
743
758
|
msg = f"Fields not supported by {target_format_actual.value} format: {unsupported_fields}"
|
|
744
759
|
raise MetadataFieldNotSupportedByMetadataFormatError(msg)
|
|
745
760
|
# Warn about each unsupported field individually
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
761
|
+
if warn_on_unsupported_field:
|
|
762
|
+
for unsupported_field in unsupported_fields:
|
|
763
|
+
field_warn_msg = (
|
|
764
|
+
f"Field {unsupported_field} not supported by {target_format_actual.value} format, skipped"
|
|
765
|
+
)
|
|
766
|
+
warnings.warn(field_warn_msg, stacklevel=2)
|
|
751
767
|
# Create filtered metadata without unsupported fields
|
|
752
768
|
filtered_metadata = {k: v for k, v in unified_metadata.items() if k not in unsupported_fields}
|
|
753
769
|
unified_metadata = filtered_metadata
|
|
@@ -784,11 +800,12 @@ def _handle_metadata_strategy(
|
|
|
784
800
|
unsupported_fields.append(field)
|
|
785
801
|
if unsupported_fields:
|
|
786
802
|
# Warn about each unsupported field individually for target format
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
803
|
+
if warn_on_unsupported_field:
|
|
804
|
+
for unsupported_field in unsupported_fields:
|
|
805
|
+
field_warn_msg = (
|
|
806
|
+
f"Field {unsupported_field} not supported by {target_format_actual.value} format, skipped"
|
|
807
|
+
)
|
|
808
|
+
warnings.warn(field_warn_msg, stacklevel=2)
|
|
792
809
|
# Create filtered metadata without unsupported fields
|
|
793
810
|
filtered_metadata = {k: v for k, v in unified_metadata.items() if k not in unsupported_fields}
|
|
794
811
|
unified_metadata = filtered_metadata
|
|
@@ -799,8 +816,9 @@ def _handle_metadata_strategy(
|
|
|
799
816
|
target_manager.update_metadata(unified_metadata)
|
|
800
817
|
except MetadataFieldNotSupportedByMetadataFormatError as e:
|
|
801
818
|
# For SYNC strategy, log warning but continue with other formats
|
|
802
|
-
|
|
803
|
-
|
|
819
|
+
if warn_on_unsupported_field:
|
|
820
|
+
format_warn_msg = f"Format {target_format_actual} doesn't support some metadata fields: {e}"
|
|
821
|
+
warnings.warn(format_warn_msg, stacklevel=2)
|
|
804
822
|
except Exception as e:
|
|
805
823
|
# Re-raise user errors (like InvalidRatingValueError) immediately
|
|
806
824
|
from .exceptions import ConfigurationError, InvalidRatingValueError
|
|
@@ -812,6 +830,28 @@ def _handle_metadata_strategy(
|
|
|
812
830
|
# Then sync all other available formats
|
|
813
831
|
# Note: We need to be careful about the order to avoid conflicts
|
|
814
832
|
for fmt_name, manager in other_managers.items():
|
|
833
|
+
# Check if this format has existing metadata (for SYNC strategy)
|
|
834
|
+
has_existing = False
|
|
835
|
+
if fmt_name == "id3v1":
|
|
836
|
+
has_existing = audio_file._has_id3v1_tags()
|
|
837
|
+
elif fmt_name == "id3v2":
|
|
838
|
+
# Check if file starts with ID3
|
|
839
|
+
try:
|
|
840
|
+
from pathlib import Path
|
|
841
|
+
|
|
842
|
+
with Path(audio_file.file_path).open("rb") as f:
|
|
843
|
+
header = f.read(3)
|
|
844
|
+
has_existing = header == b"ID3"
|
|
845
|
+
except Exception:
|
|
846
|
+
has_existing = False
|
|
847
|
+
elif fmt_name == "vorbis":
|
|
848
|
+
has_existing = audio_file.file_extension == ".flac" # Vorbis is native for FLAC
|
|
849
|
+
elif fmt_name == "riff":
|
|
850
|
+
has_existing = audio_file.file_extension == ".wav" # RIFF is native for WAV
|
|
851
|
+
|
|
852
|
+
if not has_existing:
|
|
853
|
+
continue
|
|
854
|
+
|
|
815
855
|
# For non-target formats, filter out unsupported fields and warn about them
|
|
816
856
|
# This allows syncing supported fields even when some fields are not supported
|
|
817
857
|
unsupported_fields = []
|
|
@@ -828,9 +868,10 @@ def _handle_metadata_strategy(
|
|
|
828
868
|
)
|
|
829
869
|
|
|
830
870
|
# Warn about each unsupported field individually for non-target formats
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
871
|
+
if warn_on_unsupported_field:
|
|
872
|
+
for unsupported_field in unsupported_fields:
|
|
873
|
+
field_warn_msg = f"Field {unsupported_field} not supported by {fmt_name} format, skipped"
|
|
874
|
+
warnings.warn(field_warn_msg, stacklevel=2)
|
|
834
875
|
|
|
835
876
|
# Try to update with supported fields only
|
|
836
877
|
if format_metadata: # Only update if there are supported fields
|
|
@@ -868,7 +909,8 @@ def _handle_metadata_strategy(
|
|
|
868
909
|
unsupported_warn_msg = (
|
|
869
910
|
f"Fields not supported by {target_format_actual.value} format will be skipped: {unsupported_fields}"
|
|
870
911
|
)
|
|
871
|
-
|
|
912
|
+
if warn_on_unsupported_field:
|
|
913
|
+
warnings.warn(unsupported_warn_msg, stacklevel=2)
|
|
872
914
|
# Create filtered metadata without unsupported fields
|
|
873
915
|
filtered_metadata = {k: v for k, v in unified_metadata.items() if k not in unsupported_fields}
|
|
874
916
|
unified_metadata = filtered_metadata
|
|
@@ -5,6 +5,7 @@ import json
|
|
|
5
5
|
import subprocess
|
|
6
6
|
import tempfile
|
|
7
7
|
import types
|
|
8
|
+
import warnings
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
from typing import cast
|
|
10
11
|
|
|
@@ -356,6 +357,16 @@ class _AudioFile:
|
|
|
356
357
|
msg = "The file is not a FLAC file"
|
|
357
358
|
raise FileTypeNotSupportedError(msg)
|
|
358
359
|
|
|
360
|
+
# Warn if ID3v1 tags will be removed during re-encoding
|
|
361
|
+
if self._has_id3v1_tags():
|
|
362
|
+
warnings.warn(
|
|
363
|
+
"ID3v1 tags detected in FLAC file. These tags will be removed during MD5 repair "
|
|
364
|
+
"as they are non-standard in FLAC format and interfere with integrity validation. "
|
|
365
|
+
"Consider backing up ID3v1 metadata before repair if you need to preserve it.",
|
|
366
|
+
UserWarning,
|
|
367
|
+
stacklevel=3,
|
|
368
|
+
)
|
|
369
|
+
|
|
359
370
|
# Create a temporary file to store the corrected FLAC content
|
|
360
371
|
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".flac")
|
|
361
372
|
temp_path = temp_file.name
|
|
@@ -6,8 +6,18 @@ capabilities and limitations.
|
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
|
-
from audiometa import
|
|
9
|
+
from audiometa import (
|
|
10
|
+
FlacMd5State,
|
|
11
|
+
delete_all_metadata,
|
|
12
|
+
fix_md5_checking,
|
|
13
|
+
get_bitrate,
|
|
14
|
+
get_duration_in_sec,
|
|
15
|
+
get_unified_metadata,
|
|
16
|
+
is_flac_md5_valid,
|
|
17
|
+
update_metadata,
|
|
18
|
+
)
|
|
10
19
|
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
20
|
+
from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
|
|
11
21
|
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
12
22
|
|
|
13
23
|
|
|
@@ -97,6 +107,54 @@ class TestFormatSpecificWorkflows:
|
|
|
97
107
|
assert bitrate > 0
|
|
98
108
|
assert duration > 0
|
|
99
109
|
|
|
110
|
+
def test_flac_md5_validity_workflow(self):
|
|
111
|
+
"""E2E test for FLAC MD5 validity checking and correction workflow."""
|
|
112
|
+
# Create a FLAC file with initial metadata
|
|
113
|
+
initial_metadata = {
|
|
114
|
+
"title": "MD5 Test FLAC Title",
|
|
115
|
+
"artist": "MD5 Test FLAC Artist",
|
|
116
|
+
"album": "MD5 Test FLAC Album",
|
|
117
|
+
}
|
|
118
|
+
with temp_file_with_metadata(initial_metadata, "flac") as test_file:
|
|
119
|
+
# Ensure the file has a valid MD5 checksum
|
|
120
|
+
ensure_flac_has_md5(test_file)
|
|
121
|
+
|
|
122
|
+
# 1. Verify initial MD5 is valid
|
|
123
|
+
initial_md5_state = is_flac_md5_valid(test_file)
|
|
124
|
+
assert initial_md5_state == FlacMd5State.VALID, "Initial FLAC file should have valid MD5"
|
|
125
|
+
|
|
126
|
+
# 2. Corrupt the MD5 checksum
|
|
127
|
+
corrupt_md5(test_file, "random")
|
|
128
|
+
|
|
129
|
+
# 3. Verify MD5 is now invalid
|
|
130
|
+
corrupted_md5_state = is_flac_md5_valid(test_file)
|
|
131
|
+
assert corrupted_md5_state == FlacMd5State.INVALID, "Corrupted MD5 should be detected as invalid"
|
|
132
|
+
|
|
133
|
+
# 4. Correct the MD5 checksum
|
|
134
|
+
corrected_file_path = fix_md5_checking(test_file)
|
|
135
|
+
|
|
136
|
+
# 5. Verify the corrected file has valid MD5
|
|
137
|
+
corrected_md5_state = is_flac_md5_valid(corrected_file_path)
|
|
138
|
+
assert corrected_md5_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
|
|
139
|
+
|
|
140
|
+
# 6. Update metadata on the corrected file
|
|
141
|
+
test_metadata = {
|
|
142
|
+
UnifiedMetadataKey.TITLE: "Updated MD5 Test Title",
|
|
143
|
+
UnifiedMetadataKey.ARTISTS: ["Updated MD5 Test Artist"],
|
|
144
|
+
UnifiedMetadataKey.ALBUM: "Updated MD5 Test Album",
|
|
145
|
+
}
|
|
146
|
+
update_metadata(corrected_file_path, test_metadata)
|
|
147
|
+
|
|
148
|
+
# 7. Verify metadata was updated
|
|
149
|
+
updated_metadata = get_unified_metadata(corrected_file_path)
|
|
150
|
+
assert updated_metadata.get(UnifiedMetadataKey.TITLE) == "Updated MD5 Test Title"
|
|
151
|
+
assert updated_metadata.get(UnifiedMetadataKey.ARTISTS) == ["Updated MD5 Test Artist"]
|
|
152
|
+
assert updated_metadata.get(UnifiedMetadataKey.ALBUM) == "Updated MD5 Test Album"
|
|
153
|
+
|
|
154
|
+
# 8. Verify MD5 is still valid after metadata update
|
|
155
|
+
final_md5_state = is_flac_md5_valid(corrected_file_path)
|
|
156
|
+
assert final_md5_state == FlacMd5State.VALID, "MD5 should remain valid after metadata update"
|
|
157
|
+
|
|
100
158
|
def test_complete_metadata_workflow_wav(self):
|
|
101
159
|
# Use external script to set initial metadata
|
|
102
160
|
initial_metadata = {"title": "Initial WAV Title", "artist": "Initial WAV Artist", "album": "Initial WAV Album"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Test invalid MD5 validation."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from audiometa import FlacMd5State, is_flac_md5_valid
|
|
6
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
7
|
+
from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.mark.integration
|
|
11
|
+
class TestInvalidMd5:
|
|
12
|
+
def test_is_flac_md5_valid_detects_random_md5_corruption(self):
|
|
13
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
14
|
+
ensure_flac_has_md5(test_file)
|
|
15
|
+
corrupt_md5(test_file, "random")
|
|
16
|
+
|
|
17
|
+
assert (
|
|
18
|
+
is_flac_md5_valid(test_file) == FlacMd5State.INVALID
|
|
19
|
+
), "Random MD5 corruption should be detected as INVALID"
|
|
20
|
+
|
|
21
|
+
def test_is_flac_md5_valid_detects_partial_md5_corruption(self):
|
|
22
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
23
|
+
ensure_flac_has_md5(test_file)
|
|
24
|
+
corrupt_md5(test_file, "partial")
|
|
25
|
+
|
|
26
|
+
assert (
|
|
27
|
+
is_flac_md5_valid(test_file) == FlacMd5State.INVALID
|
|
28
|
+
), "Partially corrupted MD5 should be detected as INVALID"
|
|
29
|
+
|
|
30
|
+
def test_is_flac_md5_valid_detects_flipped_md5(self):
|
|
31
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
32
|
+
ensure_flac_has_md5(test_file)
|
|
33
|
+
corrupt_md5(test_file, "flip_all")
|
|
34
|
+
|
|
35
|
+
assert is_flac_md5_valid(test_file) == FlacMd5State.INVALID, "Flipped MD5 should be detected as INVALID"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Test unset MD5 validation."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from audiometa import FlacMd5State, is_flac_md5_valid
|
|
6
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
7
|
+
from audiometa.test.tests.integration.technical_info.flac_md5.conftest import (
|
|
8
|
+
corrupt_md5,
|
|
9
|
+
create_flac_without_md5,
|
|
10
|
+
ensure_flac_has_md5,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@pytest.mark.integration
|
|
15
|
+
class TestUnsetMd5:
|
|
16
|
+
def test_is_flac_md5_valid_with_naturally_unset_md5(self):
|
|
17
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
18
|
+
# Create FLAC file without MD5 (naturally unset, not corrupted)
|
|
19
|
+
create_flac_without_md5(test_file)
|
|
20
|
+
|
|
21
|
+
# Unset MD5 (all zeros) should be detected as UNSET
|
|
22
|
+
result = is_flac_md5_valid(test_file)
|
|
23
|
+
assert result == FlacMd5State.UNSET, "Unset MD5 should be detected as UNSET"
|
|
24
|
+
|
|
25
|
+
def test_is_flac_md5_valid_with_corrupted_to_unset_md5(self):
|
|
26
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
27
|
+
ensure_flac_has_md5(test_file)
|
|
28
|
+
corrupt_md5(test_file, "zeros")
|
|
29
|
+
|
|
30
|
+
# Unset MD5 (all zeros) should be detected as UNSET
|
|
31
|
+
result = is_flac_md5_valid(test_file)
|
|
32
|
+
assert result == FlacMd5State.UNSET, "Unset MD5 should be detected as UNSET"
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Test delete_original parameter behavior in get_file_with_corrected_md5."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from unittest.mock import patch
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from audiometa import FlacMd5State, is_flac_md5_valid
|
|
9
|
+
from audiometa._audio_file import _AudioFile
|
|
10
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
11
|
+
from audiometa.test.tests.integration.technical_info.flac_md5.conftest import corrupt_md5, ensure_flac_has_md5
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@pytest.mark.integration
|
|
15
|
+
class TestDeleteOriginalParameter:
|
|
16
|
+
"""Test the delete_original parameter in get_file_with_corrected_md5."""
|
|
17
|
+
|
|
18
|
+
def test_delete_original_false_preserves_original_file(self):
|
|
19
|
+
"""Test that delete_original=False (default) preserves the original file."""
|
|
20
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
21
|
+
ensure_flac_has_md5(test_file)
|
|
22
|
+
corrupt_md5(test_file, "flip_all")
|
|
23
|
+
|
|
24
|
+
# Verify initial state
|
|
25
|
+
assert Path(test_file).exists(), "Original file should exist before repair"
|
|
26
|
+
initial_state = is_flac_md5_valid(test_file)
|
|
27
|
+
assert initial_state == FlacMd5State.INVALID, "File should have invalid MD5 needing repair"
|
|
28
|
+
|
|
29
|
+
# Repair with delete_original=False (default)
|
|
30
|
+
audio_file = _AudioFile(test_file)
|
|
31
|
+
corrected_file_path = audio_file.get_file_with_corrected_md5(delete_original=False)
|
|
32
|
+
|
|
33
|
+
# Verify results
|
|
34
|
+
assert Path(test_file).exists(), "Original file should still exist after repair"
|
|
35
|
+
assert Path(corrected_file_path).exists(), "Corrected file should exist"
|
|
36
|
+
|
|
37
|
+
# Verify corrected file has valid MD5
|
|
38
|
+
final_state = is_flac_md5_valid(corrected_file_path)
|
|
39
|
+
assert final_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
|
|
40
|
+
|
|
41
|
+
def test_delete_original_true_deletes_original_file(self):
|
|
42
|
+
"""Test that delete_original=True deletes the original file."""
|
|
43
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
44
|
+
ensure_flac_has_md5(test_file)
|
|
45
|
+
corrupt_md5(test_file, "flip_all")
|
|
46
|
+
|
|
47
|
+
# Verify initial state
|
|
48
|
+
assert Path(test_file).exists(), "Original file should exist before repair"
|
|
49
|
+
initial_state = is_flac_md5_valid(test_file)
|
|
50
|
+
assert initial_state == FlacMd5State.INVALID, "File should have invalid MD5 needing repair"
|
|
51
|
+
|
|
52
|
+
# Repair with delete_original=True
|
|
53
|
+
audio_file = _AudioFile(test_file)
|
|
54
|
+
corrected_file_path = audio_file.get_file_with_corrected_md5(delete_original=True)
|
|
55
|
+
|
|
56
|
+
# Verify results
|
|
57
|
+
assert not Path(test_file).exists(), "Original file should be deleted after repair"
|
|
58
|
+
assert Path(corrected_file_path).exists(), "Corrected file should exist"
|
|
59
|
+
|
|
60
|
+
# Verify corrected file has valid MD5
|
|
61
|
+
final_state = is_flac_md5_valid(corrected_file_path)
|
|
62
|
+
assert final_state == FlacMd5State.VALID, "Corrected file should have valid MD5"
|
|
63
|
+
|
|
64
|
+
def test_delete_original_handles_deletion_error(self):
|
|
65
|
+
"""Test that OSError is raised when original file deletion fails."""
|
|
66
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
67
|
+
ensure_flac_has_md5(test_file)
|
|
68
|
+
corrupt_md5(test_file, "flip_all")
|
|
69
|
+
|
|
70
|
+
# Verify initial state
|
|
71
|
+
assert Path(test_file).exists(), "Original file should exist before repair"
|
|
72
|
+
|
|
73
|
+
# Mock Path.unlink to raise OSError
|
|
74
|
+
with patch.object(Path, "unlink") as mock_unlink:
|
|
75
|
+
mock_unlink.side_effect = OSError("Permission denied")
|
|
76
|
+
|
|
77
|
+
# Attempt repair with delete_original=True
|
|
78
|
+
audio_file = _AudioFile(test_file)
|
|
79
|
+
with pytest.raises(RuntimeError) as exc_info:
|
|
80
|
+
audio_file.get_file_with_corrected_md5(delete_original=True)
|
|
81
|
+
|
|
82
|
+
assert "Failed to execute FLAC command" in str(exc_info.value)
|
|
83
|
+
assert "Failed to delete original file" in str(exc_info.value)
|
|
84
|
+
assert "Permission denied" in str(exc_info.value)
|
|
85
|
+
|
|
86
|
+
# Verify unlink was called (indicating the deletion attempt was made)
|
|
87
|
+
mock_unlink.assert_called_once()
|
|
88
|
+
|
|
89
|
+
# Original file should still exist since deletion failed (mocked)
|
|
90
|
+
assert Path(test_file).exists(), "Original file should still exist when deletion fails"
|
|
@@ -9,13 +9,6 @@ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import co
|
|
|
9
9
|
|
|
10
10
|
@pytest.mark.integration
|
|
11
11
|
class TestFlippedMd5:
|
|
12
|
-
def test_is_flac_md5_valid_detects_flipped_md5(self):
|
|
13
|
-
with temp_file_with_metadata({}, "flac") as test_file:
|
|
14
|
-
ensure_flac_has_md5(test_file)
|
|
15
|
-
corrupt_md5(test_file, "flip_all")
|
|
16
|
-
|
|
17
|
-
assert is_flac_md5_valid(test_file) == FlacMd5State.INVALID, "Flipped MD5 should be detected as INVALID"
|
|
18
|
-
|
|
19
12
|
def test_fix_md5_checking_flac(self):
|
|
20
13
|
with temp_file_with_metadata({}, "flac") as test_file:
|
|
21
14
|
ensure_flac_has_md5(test_file)
|
|
@@ -9,15 +9,6 @@ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import co
|
|
|
9
9
|
|
|
10
10
|
@pytest.mark.integration
|
|
11
11
|
class TestPartialMd5:
|
|
12
|
-
def test_is_flac_md5_valid_detects_partial_md5_corruption(self):
|
|
13
|
-
with temp_file_with_metadata({}, "flac") as test_file:
|
|
14
|
-
ensure_flac_has_md5(test_file)
|
|
15
|
-
corrupt_md5(test_file, "partial")
|
|
16
|
-
|
|
17
|
-
assert (
|
|
18
|
-
is_flac_md5_valid(test_file) == FlacMd5State.INVALID
|
|
19
|
-
), "Partially corrupted MD5 should be detected as INVALID"
|
|
20
|
-
|
|
21
12
|
def test_fix_md5_checking_with_partial_corruption(self):
|
|
22
13
|
with temp_file_with_metadata({}, "flac") as test_file:
|
|
23
14
|
ensure_flac_has_md5(test_file)
|
|
@@ -9,15 +9,6 @@ from audiometa.test.tests.integration.technical_info.flac_md5.conftest import co
|
|
|
9
9
|
|
|
10
10
|
@pytest.mark.integration
|
|
11
11
|
class TestRandomMd5:
|
|
12
|
-
def test_is_flac_md5_valid_detects_random_md5_corruption(self):
|
|
13
|
-
with temp_file_with_metadata({}, "flac") as test_file:
|
|
14
|
-
ensure_flac_has_md5(test_file)
|
|
15
|
-
corrupt_md5(test_file, "random")
|
|
16
|
-
|
|
17
|
-
assert (
|
|
18
|
-
is_flac_md5_valid(test_file) == FlacMd5State.INVALID
|
|
19
|
-
), "Random MD5 corruption should be detected as INVALID"
|
|
20
|
-
|
|
21
12
|
def test_fix_md5_checking_with_random_corruption(self):
|
|
22
13
|
with temp_file_with_metadata({}, "flac") as test_file:
|
|
23
14
|
ensure_flac_has_md5(test_file)
|