audiometa-python 0.11.0__tar.gz → 1.0.0__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.11.0/audiometa_python.egg-info → audiometa_python-1.0.0}/PKG-INFO +9 -5
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/README.md +8 -4
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/__init__.py +66 -1
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/cli.py +13 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_MetadataManager.py +73 -15
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +36 -474
- audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v1_preserver.py +94 -0
- audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v2_flac_handler.py +140 -0
- audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v2_reader.py +258 -0
- audiometa_python-1.0.0/audiometa/manager/_rating_supporting/id3v2/_id3v2_writer.py +327 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_RiffManager.py +3 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +4 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +90 -1
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_manual_metadata_creator.py +34 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_metadata_setter.py +9 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +30 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_comprehensive.py +15 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_comprehensive.py +14 -0
- audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options/test_include_cover.py +30 -0
- audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options/test_include_headers.py +106 -0
- audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options/test_include_technical.py +69 -0
- audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_deleting.py +43 -0
- audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_reading.py +95 -0
- audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid/test_writing.py +209 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +2 -2
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/test_musicbrainz_artistid_format_validation.py +49 -0
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid/test_musicbrainz_artistid_type_validation.py +34 -0
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_format_validation.py +39 -0
- audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_format_validation.py → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_uuid/test_uuid_format_validation.py +36 -35
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date/__init__.py +0 -0
- audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/config.py +19 -4
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/macos.py +5 -5
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/unified_metadata_key.py +3 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0/audiometa_python.egg-info}/PKG-INFO +9 -5
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/SOURCES.txt +17 -1
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/pyproject.toml +1 -1
- audiometa_python-0.11.0/audiometa/test/tests/integration/get_full_metadata/test_options.py +0 -207
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/LICENSE +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/__main__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/_audio_file.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/exceptions.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/id3v2/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_bext_chunk.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_constants.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_file_structure.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/riff/_riff_info_chunk.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/vorbis/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/_Id3v1Manager.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/_constants.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/id3v1_raw_metadata.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/manager/id3v1/id3v1_raw_metadata_key.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/assets/create_test_files.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/common/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/common/audio_file_creator.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/common/external_tool_runner.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_header_verifier.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_header_verifier.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_header_verifier.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_metadata_deleter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/riff/riff_metadata_getter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/scripts/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/technical_info_inspector.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/temp_file_with_metadata.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_header_verifier.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/conftest.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_basic.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_formats.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_metadata_content.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_multiple_files.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_options.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/read/test_unified.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/test_delete.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/test_formatting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/test_help.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_basic.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_force_format.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_integer_fields.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_list_fields.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_rating.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_string_fields.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/cli/write/test_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_core_workflows.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/e2e/workflows/test_rating_workflows.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/conftest.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/encoding/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/encoding/test_encoding.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field → audiometa_python-1.0.0/audiometa/test/tests/integration/get_full_metadata/options}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_consistency.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_performance.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/get_full_metadata/test_structure.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/album → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/album_artists → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/album}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/artists → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/album_artists}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/bpm → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/artists}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/artists/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/artists/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/comment → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/bpm}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/composer → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/comment}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/comment/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/comment/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/copyright → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/composer}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/composer/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/composer/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/description → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/copyright}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/disc_number → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/description}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/description/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/description/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/description/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/field_not_supported → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/disc_number}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/genre → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/field_not_supported}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/genre/reading → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/genre}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/genre/reading}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/language → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/genre/test_writing.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/lyrics → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/language}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/language/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/language/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/language/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/lyrics}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/originator → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_artistid}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/publisher → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/musicbrainz_trackid/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/originator}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/originator/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/originator/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/originator/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating/reading → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/publisher}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating/writing → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating/reading}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/release_date → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating/writing}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/title → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/track_number → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/release_date}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/metadata_field/track_number/reading → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/title}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/title/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/real_audio_files → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/track_number}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info → audiometa_python-1.0.0/audiometa/test/tests/integration/metadata_field/track_number/reading}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/reading/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/reading/test_reading_error_handling.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5 → audiometa_python-1.0.0/audiometa/test/tests/integration/real_audio_files}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/real_audio_files/test_reading.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/real_audio_files/test_writing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_audio_data_corruption.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_file.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_invalid_md5.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5 → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/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.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_state_precedence.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/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.11.0 → audiometa_python-1.0.0}/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.11.0 → audiometa_python-1.0.0}/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.11.0 → audiometa_python-1.0.0}/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.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_metadata_combinations/test_md5_with_metadata_combinations.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_checking/test_unset_md5.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/writing → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_delete_original.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/writing/writing_strategies → audiometa_python-1.0.0/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_flipped_md5.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_partial_md5.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_invalid_md5/test_random_md5.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_md5_repair_with_metadata.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_non_flac_error.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/flac_md5/md5_repair/test_unset_md5.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_channels.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/test_audio_file.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields → audiometa_python-1.0.0/audiometa/test/tests/integration/writing}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_forced_format.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/test_partial_update.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit → audiometa_python-1.0.0/audiometa/test/tests/integration/writing/writing_strategies}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_flac_sync.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_mp3_sync.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/sync_strategy/test_wav_sync.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/audio_file → audiometa_python-1.0.0/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/audio_file/technical_info → audiometa_python-1.0.0/audiometa/test/tests/unit}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/cli → audiometa_python-1.0.0/audiometa/test/tests/unit/audio_file}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers → audiometa_python-1.0.0/audiometa/test/tests/unit/audio_file/technical_info}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_context_manager.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_file_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_is_audio_file.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_operations.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/audio_file/test_path_handling.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/header_info → audiometa_python-1.0.0/audiometa/test/tests/unit/cli}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/cli/test_expand_file_patterns.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/conftest.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/header_info}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/disc_number/test_disc_number_validation.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/test_isrc_format_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/isrc/test_isrc_type_validation.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_artistid}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_trackid/test_musicbrainz_trackid_type_validation.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/musicbrainz_uuid}/__init__.py +0 -0
- {audiometa_python-0.11.0/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number → audiometa_python-1.0.0/audiometa/test/tests/unit/metadata_managers/metadata_field/rating}/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/release_date/test_date_format_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/metadata_field/track_number/test_track_number_validation.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/flac_md5_state.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/id3v1_genre_code_map.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/metadata_format.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/metadata_writing_strategy.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/mutagen_exception_handler.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/__init__.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/base.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/ubuntu.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/os_dependencies_checker/windows.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/rating_profiles.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/tool_path_resolver.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa/utils/types.py +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/dependency_links.txt +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/entry_points.txt +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/requires.txt +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/audiometa_python.egg-info/top_level.txt +0 -0
- {audiometa_python-0.11.0 → audiometa_python-1.0.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: audiometa-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.0
|
|
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>
|
|
@@ -413,7 +413,7 @@ except MetadataFieldNotSupportedByMetadataFormatError as e:
|
|
|
413
413
|
|
|
414
414
|
#### Reading Full Metadata From All Formats Including Headers and Technical Info
|
|
415
415
|
|
|
416
|
-
**`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
|
|
416
|
+
**`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
|
|
417
417
|
|
|
418
418
|
Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
|
|
419
419
|
|
|
@@ -462,7 +462,7 @@ See [Pre-Update Validation Function](#pre-update-validation-function) for detail
|
|
|
462
462
|
from audiometa import update_metadata
|
|
463
463
|
|
|
464
464
|
# Update metadata (use UnifiedMetadataKey for explicit typing)
|
|
465
|
-
from audiometa
|
|
465
|
+
from audiometa import UnifiedMetadataKey
|
|
466
466
|
|
|
467
467
|
new_metadata = {
|
|
468
468
|
UnifiedMetadataKey.TITLE: 'New Song Title',
|
|
@@ -688,7 +688,7 @@ id3v2_rating = get_unified_metadata_field("song.mp3", UnifiedMetadataKey.RATING,
|
|
|
688
688
|
|
|
689
689
|
#### Reading Full Metadata From All Formats Including Headers and Technical Info
|
|
690
690
|
|
|
691
|
-
**`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
|
|
691
|
+
**`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
|
|
692
692
|
|
|
693
693
|
Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
|
|
694
694
|
|
|
@@ -738,6 +738,7 @@ print(f"Raw Vorbis Comments: {full_metadata['raw_metadata']['vorbis']['comments'
|
|
|
738
738
|
- `file_path`: Path to the audio file (str or Path)
|
|
739
739
|
- `include_headers`: Whether to include format-specific header information (default: True)
|
|
740
740
|
- `include_technical`: Whether to include technical audio information (default: True)
|
|
741
|
+
- `include_cover`: Whether to include cover/art image info in raw_metadata (default: True)
|
|
741
742
|
|
|
742
743
|
**Returns:**
|
|
743
744
|
A comprehensive dictionary containing:
|
|
@@ -865,6 +866,9 @@ metadata_only = get_full_metadata("song.mp3", include_technical=False)
|
|
|
865
866
|
# Get only technical info without headers
|
|
866
867
|
tech_only = get_full_metadata("song.mp3", include_headers=False)
|
|
867
868
|
|
|
869
|
+
# Exclude cover/art from raw metadata
|
|
870
|
+
no_cover = get_full_metadata("song.mp3", include_cover=False)
|
|
871
|
+
|
|
868
872
|
# Check if file has specific format headers
|
|
869
873
|
if full_info['headers']['id3v2']['present']:
|
|
870
874
|
print("File has ID3v2 tags")
|
|
@@ -971,7 +975,7 @@ Updates metadata in a file. The function automatically calls pre-update validati
|
|
|
971
975
|
from audiometa import update_metadata
|
|
972
976
|
|
|
973
977
|
# Basic writing (recommended: use UnifiedMetadataKey constants)
|
|
974
|
-
from audiometa
|
|
978
|
+
from audiometa import UnifiedMetadataKey
|
|
975
979
|
|
|
976
980
|
update_metadata("song.mp3", {
|
|
977
981
|
UnifiedMetadataKey.TITLE: 'New Title',
|
|
@@ -371,7 +371,7 @@ except MetadataFieldNotSupportedByMetadataFormatError as e:
|
|
|
371
371
|
|
|
372
372
|
#### Reading Full Metadata From All Formats Including Headers and Technical Info
|
|
373
373
|
|
|
374
|
-
**`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
|
|
374
|
+
**`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
|
|
375
375
|
|
|
376
376
|
Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
|
|
377
377
|
|
|
@@ -420,7 +420,7 @@ See [Pre-Update Validation Function](#pre-update-validation-function) for detail
|
|
|
420
420
|
from audiometa import update_metadata
|
|
421
421
|
|
|
422
422
|
# Update metadata (use UnifiedMetadataKey for explicit typing)
|
|
423
|
-
from audiometa
|
|
423
|
+
from audiometa import UnifiedMetadataKey
|
|
424
424
|
|
|
425
425
|
new_metadata = {
|
|
426
426
|
UnifiedMetadataKey.TITLE: 'New Song Title',
|
|
@@ -646,7 +646,7 @@ id3v2_rating = get_unified_metadata_field("song.mp3", UnifiedMetadataKey.RATING,
|
|
|
646
646
|
|
|
647
647
|
#### Reading Full Metadata From All Formats Including Headers and Technical Info
|
|
648
648
|
|
|
649
|
-
**`get_full_metadata(file_path, include_headers=True, include_technical=True)`**
|
|
649
|
+
**`get_full_metadata(file_path, include_headers=True, include_technical=True, include_cover=True)`**
|
|
650
650
|
|
|
651
651
|
Gets comprehensive metadata including all available information from a file, including headers and technical details even when no metadata is present.
|
|
652
652
|
|
|
@@ -696,6 +696,7 @@ print(f"Raw Vorbis Comments: {full_metadata['raw_metadata']['vorbis']['comments'
|
|
|
696
696
|
- `file_path`: Path to the audio file (str or Path)
|
|
697
697
|
- `include_headers`: Whether to include format-specific header information (default: True)
|
|
698
698
|
- `include_technical`: Whether to include technical audio information (default: True)
|
|
699
|
+
- `include_cover`: Whether to include cover/art image info in raw_metadata (default: True)
|
|
699
700
|
|
|
700
701
|
**Returns:**
|
|
701
702
|
A comprehensive dictionary containing:
|
|
@@ -823,6 +824,9 @@ metadata_only = get_full_metadata("song.mp3", include_technical=False)
|
|
|
823
824
|
# Get only technical info without headers
|
|
824
825
|
tech_only = get_full_metadata("song.mp3", include_headers=False)
|
|
825
826
|
|
|
827
|
+
# Exclude cover/art from raw metadata
|
|
828
|
+
no_cover = get_full_metadata("song.mp3", include_cover=False)
|
|
829
|
+
|
|
826
830
|
# Check if file has specific format headers
|
|
827
831
|
if full_info['headers']['id3v2']['present']:
|
|
828
832
|
print("File has ID3v2 tags")
|
|
@@ -929,7 +933,7 @@ Updates metadata in a file. The function automatically calls pre-update validati
|
|
|
929
933
|
from audiometa import update_metadata
|
|
930
934
|
|
|
931
935
|
# Basic writing (recommended: use UnifiedMetadataKey constants)
|
|
932
|
-
from audiometa
|
|
936
|
+
from audiometa import UnifiedMetadataKey
|
|
933
937
|
|
|
934
938
|
update_metadata("song.mp3", {
|
|
935
939
|
UnifiedMetadataKey.TITLE: 'New Title',
|
|
@@ -36,6 +36,36 @@ from .utils.metadata_writing_strategy import MetadataWritingStrategy
|
|
|
36
36
|
from .utils.types import UnifiedMetadata, UnifiedMetadataValue
|
|
37
37
|
from .utils.unified_metadata_key import UnifiedMetadataKey
|
|
38
38
|
|
|
39
|
+
__all__ = [
|
|
40
|
+
"UnifiedMetadataKey",
|
|
41
|
+
"FlacMd5State",
|
|
42
|
+
"MetadataFormat",
|
|
43
|
+
"MetadataWritingStrategy",
|
|
44
|
+
"UnifiedMetadata",
|
|
45
|
+
"UnifiedMetadataValue",
|
|
46
|
+
"FileCorruptedError",
|
|
47
|
+
"FileTypeNotSupportedError",
|
|
48
|
+
"InvalidMetadataFieldTypeError",
|
|
49
|
+
"MetadataFieldNotSupportedByLibError",
|
|
50
|
+
"MetadataFieldNotSupportedByMetadataFormatError",
|
|
51
|
+
"MetadataFormatNotSupportedByAudioFormatError",
|
|
52
|
+
"MetadataWritingConflictParametersError",
|
|
53
|
+
"get_unified_metadata",
|
|
54
|
+
"get_unified_metadata_field",
|
|
55
|
+
"validate_metadata_for_update",
|
|
56
|
+
"update_metadata",
|
|
57
|
+
"delete_all_metadata",
|
|
58
|
+
"get_bitrate",
|
|
59
|
+
"get_channels",
|
|
60
|
+
"get_file_size",
|
|
61
|
+
"get_sample_rate",
|
|
62
|
+
"is_audio_file",
|
|
63
|
+
"get_duration_in_sec",
|
|
64
|
+
"is_flac_md5_valid",
|
|
65
|
+
"fix_md5_checking",
|
|
66
|
+
"get_full_metadata",
|
|
67
|
+
]
|
|
68
|
+
|
|
39
69
|
FILE_EXTENSION_NOT_HANDLED_MESSAGE = "The file's format is not handled by the service."
|
|
40
70
|
|
|
41
71
|
METADATA_FORMAT_MANAGER_CLASS_MAP: dict[MetadataFormat, type] = {
|
|
@@ -478,6 +508,16 @@ def _validate_metadata_field_formats(unified_metadata: UnifiedMetadata) -> None:
|
|
|
478
508
|
):
|
|
479
509
|
_MetadataManager.validate_musicbrainz_trackid(musicbrainz_trackid_value)
|
|
480
510
|
|
|
511
|
+
# Validate MusicBrainz Artist ID format if present and non-empty
|
|
512
|
+
if UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS in unified_metadata:
|
|
513
|
+
musicbrainz_artistids_value = unified_metadata[UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS]
|
|
514
|
+
if (
|
|
515
|
+
musicbrainz_artistids_value is not None
|
|
516
|
+
and isinstance(musicbrainz_artistids_value, list)
|
|
517
|
+
and musicbrainz_artistids_value
|
|
518
|
+
):
|
|
519
|
+
_MetadataManager.validate_musicbrainz_artistids(musicbrainz_artistids_value)
|
|
520
|
+
|
|
481
521
|
|
|
482
522
|
def validate_metadata_for_update(
|
|
483
523
|
unified_metadata: dict[UnifiedMetadataKey, Any] | UnifiedMetadata,
|
|
@@ -1221,7 +1261,10 @@ def fix_md5_checking(file: PublicFileType) -> str:
|
|
|
1221
1261
|
|
|
1222
1262
|
|
|
1223
1263
|
def get_full_metadata(
|
|
1224
|
-
file: PublicFileType,
|
|
1264
|
+
file: PublicFileType,
|
|
1265
|
+
include_headers: bool = True,
|
|
1266
|
+
include_technical: bool = True,
|
|
1267
|
+
include_cover: bool = True,
|
|
1225
1268
|
) -> dict[str, Any]:
|
|
1226
1269
|
"""Get comprehensive metadata including all available information from a file.
|
|
1227
1270
|
|
|
@@ -1237,6 +1280,7 @@ def get_full_metadata(
|
|
|
1237
1280
|
file: Audio file path (str or Path)
|
|
1238
1281
|
include_headers: Whether to include format-specific header information (default: True)
|
|
1239
1282
|
include_technical: Whether to include technical audio information (default: True)
|
|
1283
|
+
include_cover: Whether to include cover/art image info in raw_metadata (default: True)
|
|
1240
1284
|
|
|
1241
1285
|
Returns:
|
|
1242
1286
|
Comprehensive dictionary containing all available metadata and technical information
|
|
@@ -1383,4 +1427,25 @@ def get_full_metadata(
|
|
|
1383
1427
|
"chunk_structure": {},
|
|
1384
1428
|
}
|
|
1385
1429
|
|
|
1430
|
+
if not include_cover:
|
|
1431
|
+
id3v2_raw = raw_metadata_dict.get("id3v2", {})
|
|
1432
|
+
frames = id3v2_raw.get("frames", {})
|
|
1433
|
+
if "APIC:" in frames:
|
|
1434
|
+
raw_metadata_dict["id3v2"] = {
|
|
1435
|
+
**id3v2_raw,
|
|
1436
|
+
"frames": {k: v for k, v in frames.items() if k != "APIC:"},
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
riff_raw = raw_metadata_dict.get("riff", {})
|
|
1440
|
+
riff_cover_parsed_keys = frozenset({"ICON"})
|
|
1441
|
+
riff_cover_chunk_keys = frozenset({"cover", "image"})
|
|
1442
|
+
parsed = riff_raw.get("parsed_fields", {})
|
|
1443
|
+
chunk = riff_raw.get("chunk_structure", {})
|
|
1444
|
+
if riff_cover_parsed_keys & frozenset(parsed) or riff_cover_chunk_keys & frozenset(chunk):
|
|
1445
|
+
raw_metadata_dict["riff"] = {
|
|
1446
|
+
**riff_raw,
|
|
1447
|
+
"parsed_fields": {k: v for k, v in parsed.items() if k not in riff_cover_parsed_keys},
|
|
1448
|
+
"chunk_structure": {k: v for k, v in chunk.items() if k not in riff_cover_chunk_keys},
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1386
1451
|
return result
|
|
@@ -95,6 +95,7 @@ def format_as_table(data: dict[str, Any]) -> str:
|
|
|
95
95
|
"archival_location",
|
|
96
96
|
"isrc",
|
|
97
97
|
"musicbrainz_trackid",
|
|
98
|
+
"musicbrainz_artistids",
|
|
98
99
|
"description",
|
|
99
100
|
"originator",
|
|
100
101
|
}
|
|
@@ -146,6 +147,7 @@ def _read_metadata(args: argparse.Namespace) -> None:
|
|
|
146
147
|
file_path,
|
|
147
148
|
include_headers=not getattr(args, "no_headers", False),
|
|
148
149
|
include_technical=not getattr(args, "no_technical", False),
|
|
150
|
+
include_cover=not getattr(args, "no_cover", False),
|
|
149
151
|
)
|
|
150
152
|
|
|
151
153
|
output = format_output(metadata, args.output_format)
|
|
@@ -203,6 +205,10 @@ def _write_metadata(args: argparse.Namespace) -> None:
|
|
|
203
205
|
metadata[UnifiedMetadataKey.MUSICBRAINZ_TRACKID] = args.musicbrainz_track_id
|
|
204
206
|
|
|
205
207
|
# List fields (can be specified multiple times)
|
|
208
|
+
if args.musicbrainz_artist_ids:
|
|
209
|
+
artist_ids = [aid.strip() for aid in args.musicbrainz_artist_ids if aid and aid.strip()]
|
|
210
|
+
if artist_ids:
|
|
211
|
+
metadata[UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS] = artist_ids
|
|
206
212
|
if args.artist:
|
|
207
213
|
artists = [a.strip() for a in args.artist if a and a.strip()]
|
|
208
214
|
if artists:
|
|
@@ -385,6 +391,7 @@ Examples:
|
|
|
385
391
|
read_parser.add_argument("--output", "-o", help="Output file (default: stdout)")
|
|
386
392
|
read_parser.add_argument("--no-headers", action="store_true", help="Exclude header information")
|
|
387
393
|
read_parser.add_argument("--no-technical", action="store_true", help="Exclude technical information")
|
|
394
|
+
read_parser.add_argument("--no-cover", action="store_true", help="Exclude cover/art image from raw metadata")
|
|
388
395
|
read_parser.add_argument("--recursive", "-r", action="store_true", help="Process directories recursively")
|
|
389
396
|
read_parser.add_argument(
|
|
390
397
|
"--continue-on-error", action="store_true", help="Continue processing other files on error"
|
|
@@ -448,6 +455,12 @@ Examples:
|
|
|
448
455
|
dest="musicbrainz_track_id",
|
|
449
456
|
help="MusicBrainz Track ID (Recording ID) - UUID format (e.g., '9d6f6f7c-9d52-4c76-8f9e-01d18d8f8ec6')",
|
|
450
457
|
)
|
|
458
|
+
write_parser.add_argument(
|
|
459
|
+
"--musicbrainz-artist-ids",
|
|
460
|
+
action="append",
|
|
461
|
+
dest="musicbrainz_artist_ids",
|
|
462
|
+
help="MusicBrainz Artist IDs - UUID format (can be specified multiple times for multiple artists)",
|
|
463
|
+
)
|
|
451
464
|
write_parser.add_argument(
|
|
452
465
|
"--force-format",
|
|
453
466
|
choices=["id3v2", "id3v1", "vorbis", "riff"],
|
|
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, TypeVar, Union, cast
|
|
|
4
4
|
|
|
5
5
|
from mutagen._file import FileType as MutagenMetadata
|
|
6
6
|
|
|
7
|
-
from audiometa.exceptions import InvalidMetadataFieldFormatError
|
|
7
|
+
from audiometa.exceptions import InvalidMetadataFieldFormatError, InvalidMetadataFieldTypeError
|
|
8
8
|
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
9
9
|
|
|
10
10
|
if TYPE_CHECKING:
|
|
@@ -255,6 +255,33 @@ class _MetadataManager:
|
|
|
255
255
|
isrc,
|
|
256
256
|
)
|
|
257
257
|
|
|
258
|
+
@staticmethod
|
|
259
|
+
def _validate_musicbrainz_uuid_format(uuid_str: str, field_key: UnifiedMetadataKey) -> None:
|
|
260
|
+
"""Validate a single MusicBrainz UUID string format.
|
|
261
|
+
|
|
262
|
+
Accepts 36-character hyphenated UUID or 32-character hex string. Empty strings are allowed.
|
|
263
|
+
|
|
264
|
+
Raises:
|
|
265
|
+
InvalidMetadataFieldFormatError: If the UUID format is invalid
|
|
266
|
+
"""
|
|
267
|
+
if not uuid_str:
|
|
268
|
+
return
|
|
269
|
+
|
|
270
|
+
# 36-character hyphenated UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
271
|
+
if re.match(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", uuid_str):
|
|
272
|
+
return
|
|
273
|
+
|
|
274
|
+
# 32-character hex string without hyphens
|
|
275
|
+
if re.match(r"^[0-9a-fA-F]{32}$", uuid_str):
|
|
276
|
+
return
|
|
277
|
+
|
|
278
|
+
raise InvalidMetadataFieldFormatError(
|
|
279
|
+
field_key.value,
|
|
280
|
+
"36-character hyphenated UUID (e.g., '9d6f6f7c-9d52-4c76-8f9e-01d18d8f8ec6') or "
|
|
281
|
+
"32-character hex string (e.g., '9d6f6f7c9d524c768f9e01d18d8f8ec6')",
|
|
282
|
+
uuid_str,
|
|
283
|
+
)
|
|
284
|
+
|
|
258
285
|
@staticmethod
|
|
259
286
|
def validate_musicbrainz_trackid(track_id: str) -> None:
|
|
260
287
|
"""Validate MusicBrainz Track ID (UUID) format.
|
|
@@ -279,23 +306,28 @@ class _MetadataManager:
|
|
|
279
306
|
>>> _MetadataManager.validate_musicbrainz_trackid("not-a-uuid")
|
|
280
307
|
# Raises InvalidMetadataFieldFormatError
|
|
281
308
|
"""
|
|
282
|
-
|
|
283
|
-
return
|
|
309
|
+
_MetadataManager._validate_musicbrainz_uuid_format(track_id, UnifiedMetadataKey.MUSICBRAINZ_TRACKID)
|
|
284
310
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
311
|
+
@staticmethod
|
|
312
|
+
def validate_musicbrainz_artistids(artist_ids: list[str]) -> None:
|
|
313
|
+
"""Validate MusicBrainz Artist ID(s) (UUID) format.
|
|
288
314
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
return
|
|
315
|
+
Each Artist ID must be a valid UUID (36-char hyphenated or 32-char hex).
|
|
316
|
+
Empty list or list with empty strings is allowed.
|
|
292
317
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
318
|
+
Raises:
|
|
319
|
+
InvalidMetadataFieldFormatError: If any Artist ID format is invalid
|
|
320
|
+
InvalidMetadataFieldTypeError: If artist_ids is not a list
|
|
321
|
+
"""
|
|
322
|
+
if not isinstance(artist_ids, list):
|
|
323
|
+
raise InvalidMetadataFieldTypeError(
|
|
324
|
+
UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS.value,
|
|
325
|
+
"list of strings",
|
|
326
|
+
type(artist_ids).__name__,
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
for artist_id in artist_ids:
|
|
330
|
+
_MetadataManager._validate_musicbrainz_uuid_format(artist_id, UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS)
|
|
299
331
|
|
|
300
332
|
@abstractmethod
|
|
301
333
|
def _extract_mutagen_metadata(self) -> MutagenMetadata:
|
|
@@ -714,6 +746,32 @@ class _MetadataManager:
|
|
|
714
746
|
return self._get_genres_from_raw_clean_metadata_uppercase_keys(
|
|
715
747
|
self.raw_clean_metadata_uppercase_keys, raw_metadata_key
|
|
716
748
|
)
|
|
749
|
+
if unified_metadata_key == UnifiedMetadataKey.MUSICBRAINZ_ARTISTIDS:
|
|
750
|
+
# First apply smart parsing to handle separator-based values
|
|
751
|
+
if unified_metadata_key.can_semantically_have_multiple_values():
|
|
752
|
+
if self._should_apply_smart_parsing(values_list_str):
|
|
753
|
+
# Apply parsing for single entry (legacy data detection)
|
|
754
|
+
parsed_values = self._apply_smart_parsing(values_list_str)
|
|
755
|
+
values_list_str = parsed_values if parsed_values else []
|
|
756
|
+
else:
|
|
757
|
+
# No parsing - filter empty/whitespace values
|
|
758
|
+
values_list_str = [val.strip() for val in values_list_str if val.strip()]
|
|
759
|
+
|
|
760
|
+
# Then normalize UUIDs: convert 32-char hex to 36-char hyphenated format if needed
|
|
761
|
+
normalized_ids = []
|
|
762
|
+
uuid_hex_length = 32
|
|
763
|
+
for artist_id in values_list_str:
|
|
764
|
+
if artist_id and artist_id.strip():
|
|
765
|
+
normalized_id = artist_id.strip()
|
|
766
|
+
if len(normalized_id) == uuid_hex_length and all(
|
|
767
|
+
c in "0123456789abcdefABCDEF" for c in normalized_id
|
|
768
|
+
):
|
|
769
|
+
normalized_id = (
|
|
770
|
+
f"{normalized_id[:8]}-{normalized_id[8:12]}-"
|
|
771
|
+
f"{normalized_id[12:16]}-{normalized_id[16:20]}-{normalized_id[20:32]}"
|
|
772
|
+
)
|
|
773
|
+
normalized_ids.append(normalized_id)
|
|
774
|
+
return normalized_ids if normalized_ids else None
|
|
717
775
|
if unified_metadata_key.can_semantically_have_multiple_values():
|
|
718
776
|
# Apply smart parsing logic for semantically multi-value fields
|
|
719
777
|
if self._should_apply_smart_parsing(values_list_str):
|