audiometa-python 0.6.0__py3-none-any.whl
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/__init__.py +1297 -0
- audiometa/__main__.py +6 -0
- audiometa/_audio_file.py +607 -0
- audiometa/cli.py +476 -0
- audiometa/exceptions.py +167 -0
- audiometa/manager/_MetadataManager.py +768 -0
- audiometa/manager/__init__.py +1 -0
- audiometa/manager/_rating_supporting/_RatingSupportingMetadataManager.py +250 -0
- audiometa/manager/_rating_supporting/__init__.py +1 -0
- audiometa/manager/_rating_supporting/id3v2/_Id3v2Manager.py +1032 -0
- audiometa/manager/_rating_supporting/id3v2/__init__.py +25 -0
- audiometa/manager/_rating_supporting/id3v2/_id3v2_constants.py +11 -0
- audiometa/manager/_rating_supporting/riff/_RiffManager.py +1002 -0
- audiometa/manager/_rating_supporting/riff/__init__.py +25 -0
- audiometa/manager/_rating_supporting/riff/_riff_constants.py +17 -0
- audiometa/manager/_rating_supporting/vorbis/_VorbisManager.py +542 -0
- audiometa/manager/_rating_supporting/vorbis/__init__.py +17 -0
- audiometa/manager/_rating_supporting/vorbis/_vorbis_constants.py +6 -0
- audiometa/manager/id3v1/_Id3v1Manager.py +512 -0
- audiometa/manager/id3v1/__init__.py +1 -0
- audiometa/manager/id3v1/_constants.py +8 -0
- audiometa/manager/id3v1/id3v1_raw_metadata.py +242 -0
- audiometa/manager/id3v1/id3v1_raw_metadata_key.py +13 -0
- audiometa/test/__init__.py +1 -0
- audiometa/test/assets/create_test_files.py +72 -0
- audiometa/test/helpers/__init__.py +51 -0
- audiometa/test/helpers/common/__init__.py +6 -0
- audiometa/test/helpers/common/audio_file_creator.py +68 -0
- audiometa/test/helpers/common/external_tool_runner.py +74 -0
- audiometa/test/helpers/id3v1/__init__.py +8 -0
- audiometa/test/helpers/id3v1/id3v1_header_verifier.py +18 -0
- audiometa/test/helpers/id3v1/id3v1_metadata_deleter.py +37 -0
- audiometa/test/helpers/id3v1/id3v1_metadata_getter.py +61 -0
- audiometa/test/helpers/id3v1/id3v1_metadata_setter.py +82 -0
- audiometa/test/helpers/id3v2/__init__.py +28 -0
- audiometa/test/helpers/id3v2/id3v2_frame_manual_creator.py +349 -0
- audiometa/test/helpers/id3v2/id3v2_header_verifier.py +38 -0
- audiometa/test/helpers/id3v2/id3v2_metadata_deleter.py +56 -0
- audiometa/test/helpers/id3v2/id3v2_metadata_getter.py +189 -0
- audiometa/test/helpers/id3v2/id3v2_metadata_setter.py +506 -0
- audiometa/test/helpers/riff/__init__.py +8 -0
- audiometa/test/helpers/riff/riff_header_verifier.py +85 -0
- audiometa/test/helpers/riff/riff_manual_metadata_creator.py +298 -0
- audiometa/test/helpers/riff/riff_metadata_deleter.py +56 -0
- audiometa/test/helpers/riff/riff_metadata_getter.py +219 -0
- audiometa/test/helpers/riff/riff_metadata_setter.py +374 -0
- audiometa/test/helpers/scripts/__init__.py +0 -0
- audiometa/test/helpers/technical_info_inspector.py +115 -0
- audiometa/test/helpers/temp_file_with_metadata.py +82 -0
- audiometa/test/helpers/vorbis/__init__.py +8 -0
- audiometa/test/helpers/vorbis/vorbis_header_verifier.py +31 -0
- audiometa/test/helpers/vorbis/vorbis_metadata_deleter.py +49 -0
- audiometa/test/helpers/vorbis/vorbis_metadata_getter.py +67 -0
- audiometa/test/helpers/vorbis/vorbis_metadata_setter.py +221 -0
- audiometa/test/tests/__init__.py +0 -0
- audiometa/test/tests/conftest.py +276 -0
- audiometa/test/tests/e2e/__init__.py +0 -0
- audiometa/test/tests/e2e/cli/__init__.py +0 -0
- audiometa/test/tests/e2e/cli/error_handling/__init__.py +1 -0
- audiometa/test/tests/e2e/cli/error_handling/test_command_structure_errors.py +77 -0
- audiometa/test/tests/e2e/cli/error_handling/test_file_access_errors.py +130 -0
- audiometa/test/tests/e2e/cli/error_handling/test_format_output_errors.py +118 -0
- audiometa/test/tests/e2e/cli/error_handling/test_input_validation_errors.py +172 -0
- audiometa/test/tests/e2e/cli/error_handling/test_missing_fields_validation.py +49 -0
- audiometa/test/tests/e2e/cli/error_handling/test_multiple_files_errors.py +160 -0
- audiometa/test/tests/e2e/cli/error_handling/test_rating_validation.py +90 -0
- audiometa/test/tests/e2e/cli/error_handling/test_year_validation.py +51 -0
- audiometa/test/tests/e2e/cli/read/__init__.py +0 -0
- audiometa/test/tests/e2e/cli/read/test_basic.py +58 -0
- audiometa/test/tests/e2e/cli/read/test_comprehensive.py +240 -0
- audiometa/test/tests/e2e/cli/read/test_formats.py +55 -0
- audiometa/test/tests/e2e/cli/read/test_metadata_content.py +164 -0
- audiometa/test/tests/e2e/cli/read/test_multiple_files.py +149 -0
- audiometa/test/tests/e2e/cli/read/test_options.py +88 -0
- audiometa/test/tests/e2e/cli/read/test_unified.py +84 -0
- audiometa/test/tests/e2e/cli/test_delete.py +20 -0
- audiometa/test/tests/e2e/cli/test_formatting.py +31 -0
- audiometa/test/tests/e2e/cli/test_help.py +41 -0
- audiometa/test/tests/e2e/cli/write/__init__.py +0 -0
- audiometa/test/tests/e2e/cli/write/test_basic.py +51 -0
- audiometa/test/tests/e2e/cli/write/test_comprehensive.py +210 -0
- audiometa/test/tests/e2e/cli/write/test_force_format.py +336 -0
- audiometa/test/tests/e2e/cli/write/test_integer_fields.py +145 -0
- audiometa/test/tests/e2e/cli/write/test_list_fields.py +107 -0
- audiometa/test/tests/e2e/cli/write/test_rating.py +74 -0
- audiometa/test/tests/e2e/cli/write/test_string_fields.py +54 -0
- audiometa/test/tests/e2e/cli/write/test_validation.py +85 -0
- audiometa/test/tests/e2e/scenarios/__init__.py +0 -0
- audiometa/test/tests/e2e/scenarios/test_user_scenarios.py +166 -0
- audiometa/test/tests/e2e/workflows/__init__.py +0 -0
- audiometa/test/tests/e2e/workflows/test_core_workflows.py +166 -0
- audiometa/test/tests/e2e/workflows/test_deletion_workflows.py +318 -0
- audiometa/test/tests/e2e/workflows/test_error_handling_workflows.py +165 -0
- audiometa/test/tests/e2e/workflows/test_format_specific_workflows.py +129 -0
- audiometa/test/tests/e2e/workflows/test_rating_workflows.py +124 -0
- audiometa/test/tests/integration/__init__.py +0 -0
- audiometa/test/tests/integration/audio_format/__init__.py +0 -0
- audiometa/test/tests/integration/audio_format/flac/__init__.py +0 -0
- audiometa/test/tests/integration/audio_format/flac/test_flac_delete_all.py +108 -0
- audiometa/test/tests/integration/audio_format/flac/test_flac_reading_all.py +61 -0
- audiometa/test/tests/integration/audio_format/flac/test_flac_reading_field.py +65 -0
- audiometa/test/tests/integration/audio_format/flac/test_flac_writing.py +69 -0
- audiometa/test/tests/integration/audio_format/mp3/__init__.py +0 -0
- audiometa/test/tests/integration/audio_format/mp3/test_mp3_delete_all.py +79 -0
- audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_all.py +61 -0
- audiometa/test/tests/integration/audio_format/mp3/test_mp3_reading_field.py +67 -0
- audiometa/test/tests/integration/audio_format/mp3/test_mp3_writing.py +60 -0
- audiometa/test/tests/integration/audio_format/wav/__init__.py +0 -0
- audiometa/test/tests/integration/audio_format/wav/test_wav_delete_all.py +87 -0
- audiometa/test/tests/integration/audio_format/wav/test_wav_reading_all.py +62 -0
- audiometa/test/tests/integration/audio_format/wav/test_wav_reading_field.py +57 -0
- audiometa/test/tests/integration/audio_format/wav/test_wav_with_id3v2_tags.py +83 -0
- audiometa/test/tests/integration/audio_format/wav/test_wav_writing.py +62 -0
- audiometa/test/tests/integration/conftest.py +29 -0
- audiometa/test/tests/integration/delete_all_metadata/__init__.py +1 -0
- audiometa/test/tests/integration/delete_all_metadata/test_audio_format_all.py +102 -0
- audiometa/test/tests/integration/delete_all_metadata/test_audio_format_header_deletion.py +77 -0
- audiometa/test/tests/integration/delete_all_metadata/test_basic_functionality.py +47 -0
- audiometa/test/tests/integration/delete_all_metadata/test_error_handling.py +24 -0
- audiometa/test/tests/integration/encoding/__init__.py +1 -0
- audiometa/test/tests/integration/encoding/test_encoding.py +88 -0
- audiometa/test/tests/integration/encoding/test_special_characters_edge_cases.py +223 -0
- audiometa/test/tests/integration/get_full_metadata/__init__.py +0 -0
- audiometa/test/tests/integration/get_full_metadata/test_audio_formats.py +122 -0
- audiometa/test/tests/integration/get_full_metadata/test_binary_data_filtering.py +250 -0
- audiometa/test/tests/integration/get_full_metadata/test_consistency.py +67 -0
- audiometa/test/tests/integration/get_full_metadata/test_edge_cases.py +123 -0
- audiometa/test/tests/integration/get_full_metadata/test_error_handling.py +40 -0
- audiometa/test/tests/integration/get_full_metadata/test_get_full_metadata.py +43 -0
- audiometa/test/tests/integration/get_full_metadata/test_options.py +207 -0
- audiometa/test/tests/integration/get_full_metadata/test_performance.py +95 -0
- audiometa/test/tests/integration/get_full_metadata/test_riff_bext.py +128 -0
- audiometa/test/tests/integration/get_full_metadata/test_structure.py +161 -0
- audiometa/test/tests/integration/metadata_field/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/album/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/album/test_deleting.py +73 -0
- audiometa/test/tests/integration/metadata_field/album/test_reading.py +36 -0
- audiometa/test/tests/integration/metadata_field/album/test_writing.py +50 -0
- audiometa/test/tests/integration/metadata_field/album_artists/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/album_artists/test_deleting.py +83 -0
- audiometa/test/tests/integration/metadata_field/album_artists/test_reading.py +38 -0
- audiometa/test/tests/integration/metadata_field/album_artists/test_writing.py +52 -0
- audiometa/test/tests/integration/metadata_field/artists/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/artists/test_deleting.py +68 -0
- audiometa/test/tests/integration/metadata_field/artists/test_reading.py +36 -0
- audiometa/test/tests/integration/metadata_field/artists/test_writing.py +46 -0
- audiometa/test/tests/integration/metadata_field/bpm/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/bpm/test_deleting.py +75 -0
- audiometa/test/tests/integration/metadata_field/bpm/test_reading.py +32 -0
- audiometa/test/tests/integration/metadata_field/bpm/test_writing.py +56 -0
- audiometa/test/tests/integration/metadata_field/comment/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/comment/test_deleting.py +68 -0
- audiometa/test/tests/integration/metadata_field/comment/test_reading.py +36 -0
- audiometa/test/tests/integration/metadata_field/comment/test_writing.py +49 -0
- audiometa/test/tests/integration/metadata_field/composer/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/composer/test_deleting.py +75 -0
- audiometa/test/tests/integration/metadata_field/composer/test_reading.py +34 -0
- audiometa/test/tests/integration/metadata_field/composer/test_writing.py +41 -0
- audiometa/test/tests/integration/metadata_field/copyright/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/copyright/test_deleting.py +81 -0
- audiometa/test/tests/integration/metadata_field/copyright/test_reading.py +35 -0
- audiometa/test/tests/integration/metadata_field/copyright/test_writing.py +41 -0
- audiometa/test/tests/integration/metadata_field/disc_number/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/disc_number/test_deleting.py +97 -0
- audiometa/test/tests/integration/metadata_field/disc_number/test_reading.py +92 -0
- audiometa/test/tests/integration/metadata_field/disc_number/test_writing.py +153 -0
- audiometa/test/tests/integration/metadata_field/field_not_supported/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/field_not_supported/test_deleting.py +56 -0
- audiometa/test/tests/integration/metadata_field/field_not_supported/test_reading.py +54 -0
- audiometa/test/tests/integration/metadata_field/field_not_supported/test_writing.py +61 -0
- audiometa/test/tests/integration/metadata_field/genre/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py +65 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py +25 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py +58 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py +61 -0
- audiometa/test/tests/integration/metadata_field/genre/reading/test_smart_reading.py +191 -0
- audiometa/test/tests/integration/metadata_field/genre/test_deleting.py +62 -0
- audiometa/test/tests/integration/metadata_field/genre/test_writing.py +64 -0
- audiometa/test/tests/integration/metadata_field/isrc/__init__.py +1 -0
- audiometa/test/tests/integration/metadata_field/isrc/test_deleting.py +31 -0
- audiometa/test/tests/integration/metadata_field/isrc/test_reading.py +35 -0
- audiometa/test/tests/integration/metadata_field/isrc/test_writing.py +165 -0
- audiometa/test/tests/integration/metadata_field/language/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/language/test_deleting.py +75 -0
- audiometa/test/tests/integration/metadata_field/language/test_reading.py +39 -0
- audiometa/test/tests/integration/metadata_field/language/test_writing.py +43 -0
- audiometa/test/tests/integration/metadata_field/lyrics/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/lyrics/test_deleting.py +129 -0
- audiometa/test/tests/integration/metadata_field/lyrics/test_reading.py +57 -0
- audiometa/test/tests/integration/metadata_field/lyrics/test_writing.py +59 -0
- audiometa/test/tests/integration/metadata_field/publisher/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/publisher/test_deleting.py +88 -0
- audiometa/test/tests/integration/metadata_field/publisher/test_reading.py +32 -0
- audiometa/test/tests/integration/metadata_field/publisher/test_writing.py +47 -0
- audiometa/test/tests/integration/metadata_field/rating/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/rating/reading/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/rating/reading/test_base_100_proportional.py +81 -0
- audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_non_proportional.py +33 -0
- audiometa/test/tests/integration/metadata_field/rating/reading/test_base_255_proportional.py +58 -0
- audiometa/test/tests/integration/metadata_field/rating/test_deleting.py +117 -0
- audiometa/test/tests/integration/metadata_field/rating/test_error_handling.py +137 -0
- audiometa/test/tests/integration/metadata_field/rating/writing/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_id3v2.py +77 -0
- audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_riff.py +55 -0
- audiometa/test/tests/integration/metadata_field/rating/writing/metadata_format/test_vorbis.py +57 -0
- audiometa/test/tests/integration/metadata_field/rating/writing/test_comprehensive.py +192 -0
- audiometa/test/tests/integration/metadata_field/release_date/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/release_date/test_deleting.py +74 -0
- audiometa/test/tests/integration/metadata_field/release_date/test_error_handling.py +82 -0
- audiometa/test/tests/integration/metadata_field/release_date/test_reading.py +59 -0
- audiometa/test/tests/integration/metadata_field/release_date/test_writing.py +49 -0
- audiometa/test/tests/integration/metadata_field/test_metadata_field_validation.py +135 -0
- audiometa/test/tests/integration/metadata_field/title/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/title/test_deleting.py +73 -0
- audiometa/test/tests/integration/metadata_field/title/test_error_handling.py +47 -0
- audiometa/test/tests/integration/metadata_field/title/test_reading.py +36 -0
- audiometa/test/tests/integration/metadata_field/title/test_writing.py +64 -0
- audiometa/test/tests/integration/metadata_field/track_number/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/track_number/reading/__init__.py +0 -0
- audiometa/test/tests/integration/metadata_field/track_number/reading/test_edge_cases.py +43 -0
- audiometa/test/tests/integration/metadata_field/track_number/reading/test_metadata_format.py +32 -0
- audiometa/test/tests/integration/metadata_field/track_number/test_deleting.py +59 -0
- audiometa/test/tests/integration/metadata_field/track_number/test_writing.py +73 -0
- audiometa/test/tests/integration/multiple_values/__init__.py +1 -0
- audiometa/test/tests/integration/multiple_values/reading/__init__.py +1 -0
- audiometa/test/tests/integration/multiple_values/reading/metadata_format/__init__.py +1 -0
- audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v1.py +23 -0
- audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_3.py +92 -0
- audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_id3v2_4.py +216 -0
- audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_riff.py +84 -0
- audiometa/test/tests/integration/multiple_values/reading/metadata_format/test_vorbis.py +169 -0
- audiometa/test/tests/integration/multiple_values/reading/test_performance_large_data.py +209 -0
- audiometa/test/tests/integration/multiple_values/reading/test_smart_parsing_scenarios.py +198 -0
- audiometa/test/tests/integration/multiple_values/reading/test_unicode_handling.py +24 -0
- audiometa/test/tests/integration/multiple_values/writing/__init__.py +1 -0
- audiometa/test/tests/integration/multiple_values/writing/metadata_format/__init__.py +1 -0
- audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v1.py +62 -0
- audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_3.py +36 -0
- audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_id3v2_4.py +34 -0
- audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_riff.py +32 -0
- audiometa/test/tests/integration/multiple_values/writing/metadata_format/test_vorbis.py +54 -0
- audiometa/test/tests/integration/multiple_values/writing/test_error_handling.py +42 -0
- audiometa/test/tests/integration/multiple_values/writing/test_large_values.py +98 -0
- audiometa/test/tests/integration/reading/__init__.py +1 -0
- audiometa/test/tests/integration/reading/test_read_multiple_metadata.py +80 -0
- audiometa/test/tests/integration/reading/test_reading_error_handling.py +36 -0
- audiometa/test/tests/integration/real_audio_files/__init__.py +0 -0
- audiometa/test/tests/integration/real_audio_files/test_reading.py +146 -0
- audiometa/test/tests/integration/real_audio_files/test_writing.py +198 -0
- audiometa/test/tests/integration/technical_info/__init__.py +0 -0
- audiometa/test/tests/integration/technical_info/flac_md5/__init__.py +0 -0
- audiometa/test/tests/integration/technical_info/flac_md5/conftest.py +103 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/__init__.py +0 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_audio_data_corruption.py +21 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_flipped_md5.py +29 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_non_flac_error.py +13 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_partial_md5.py +29 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_random_md5.py +29 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_invalid_md5/test_unset_md5.py +56 -0
- audiometa/test/tests/integration/technical_info/flac_md5/test_valid_md5.py +21 -0
- audiometa/test/tests/integration/technical_info/test_bitrate.py +79 -0
- audiometa/test/tests/integration/technical_info/test_channels.py +38 -0
- audiometa/test/tests/integration/technical_info/test_duration_in_sec.py +38 -0
- audiometa/test/tests/integration/technical_info/test_sample_rate.py +40 -0
- audiometa/test/tests/integration/test_audio_file.py +35 -0
- audiometa/test/tests/integration/test_audio_format_readable_after_update_all_metadata_formats.py +95 -0
- audiometa/test/tests/integration/writing/__init__.py +0 -0
- audiometa/test/tests/integration/writing/test_error_handling.py +44 -0
- audiometa/test/tests/integration/writing/test_forced_format.py +224 -0
- audiometa/test/tests/integration/writing/test_multiple_format_preservation.py +223 -0
- audiometa/test/tests/integration/writing/test_partial_update.py +36 -0
- audiometa/test/tests/integration/writing/writing_strategies/__init__.py +0 -0
- audiometa/test/tests/integration/writing/writing_strategies/test_cleanup_strategy.py +79 -0
- audiometa/test/tests/integration/writing/writing_strategies/test_preserve_strategy.py +76 -0
- audiometa/test/tests/integration/writing/writing_strategies/test_sync_strategy.py +215 -0
- audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/__init__.py +0 -0
- audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_fail_behavior.py +42 -0
- audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_no_writing_on_failure.py +93 -0
- audiometa/test/tests/integration/writing/writing_strategies/unsupported_fields/test_strategy_specific.py +99 -0
- audiometa/test/tests/unit/__init__.py +0 -0
- audiometa/test/tests/unit/audio_file/__init__.py +0 -0
- audiometa/test/tests/unit/audio_file/technical_info/__init__.py +0 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_bitrate.py +26 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_channels.py +31 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_duration_in_sec.py +38 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_error_handling.py +190 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_file_size.py +51 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_format_name.py +28 -0
- audiometa/test/tests/unit/audio_file/technical_info/test_sample_rate.py +31 -0
- audiometa/test/tests/unit/audio_file/test_context_manager.py +30 -0
- audiometa/test/tests/unit/audio_file/test_file_validation.py +40 -0
- audiometa/test/tests/unit/audio_file/test_is_audio_file.py +49 -0
- audiometa/test/tests/unit/audio_file/test_operations.py +20 -0
- audiometa/test/tests/unit/audio_file/test_path_handling.py +23 -0
- audiometa/test/tests/unit/cli/__init__.py +0 -0
- audiometa/test/tests/unit/cli/test_expand_file_patterns.py +234 -0
- audiometa/test/tests/unit/metadata_managers/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/conftest.py +142 -0
- audiometa/test/tests/unit/metadata_managers/header_info/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/header_info/test_id3v1.py +49 -0
- audiometa/test/tests/unit/metadata_managers/header_info/test_id3v2.py +66 -0
- audiometa/test/tests/unit/metadata_managers/header_info/test_riff.py +343 -0
- audiometa/test/tests/unit/metadata_managers/header_info/test_vorbis.py +53 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/reading/test_smart_parsing.py +186 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_separator_selection.py +142 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/multiple_values/writing/test_value_filtering.py +76 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_normalization.py +152 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/reading/test_profiles_values.py +23 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/test_rating_validation.py +77 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/__init__.py +0 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_configuration_error.py +43 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_validation.py +151 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/rating/writing/test_writing_profiles.py +61 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_date_format_validation.py +135 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_disc_number_validation.py +75 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_format_validation.py +121 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_isrc_type_validation.py +30 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_track_number_validation.py +46 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_type_validation_exception.py +22 -0
- audiometa/test/tests/unit/metadata_managers/metadata_field/test_validation.py +83 -0
- audiometa/test/tests/unit/metadata_managers/test_metadata_format_managers_write_and_read.py +74 -0
- audiometa/test/tests/unit/metadata_managers/test_riff_configuration_error.py +26 -0
- audiometa/utils/__init__.py +1 -0
- audiometa/utils/id3v1_genre_code_map.py +205 -0
- audiometa/utils/metadata_format.py +31 -0
- audiometa/utils/metadata_writing_strategy.py +16 -0
- audiometa/utils/mutagen_exception_handler.py +24 -0
- audiometa/utils/os_dependencies_checker/__init__.py +24 -0
- audiometa/utils/os_dependencies_checker/base.py +62 -0
- audiometa/utils/os_dependencies_checker/config.py +77 -0
- audiometa/utils/os_dependencies_checker/macos.py +236 -0
- audiometa/utils/os_dependencies_checker/ubuntu.py +95 -0
- audiometa/utils/os_dependencies_checker/windows.py +227 -0
- audiometa/utils/rating_profiles.py +110 -0
- audiometa/utils/tool_path_resolver.py +135 -0
- audiometa/utils/types.py +82 -0
- audiometa/utils/unified_metadata_key.py +87 -0
- audiometa_python-0.6.0.dist-info/METADATA +1593 -0
- audiometa_python-0.6.0.dist-info/RECORD +352 -0
- audiometa_python-0.6.0.dist-info/WHEEL +5 -0
- audiometa_python-0.6.0.dist-info/entry_points.txt +2 -0
- audiometa_python-0.6.0.dist-info/licenses/LICENSE +202 -0
- audiometa_python-0.6.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata_field
|
|
4
|
+
from audiometa.test.helpers.id3v2.id3v2_metadata_setter import ID3v2MetadataSetter
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.test.helpers.vorbis.vorbis_metadata_setter import VorbisMetadataSetter
|
|
7
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.mark.integration
|
|
11
|
+
class TestDiscNumberReading:
|
|
12
|
+
def test_id3v2_with_total(self):
|
|
13
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
14
|
+
ID3v2MetadataSetter.set_metadata(test_file, {"disc_number": "1/2"})
|
|
15
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
16
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
17
|
+
assert disc_number == 1
|
|
18
|
+
assert disc_total == 2
|
|
19
|
+
|
|
20
|
+
def test_id3v2_without_total(self):
|
|
21
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
22
|
+
ID3v2MetadataSetter.set_metadata(test_file, {"disc_number": "1"})
|
|
23
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
24
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
25
|
+
assert disc_number == 1
|
|
26
|
+
assert disc_total is None
|
|
27
|
+
|
|
28
|
+
def test_id3v2_max_value(self):
|
|
29
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
30
|
+
ID3v2MetadataSetter.set_metadata(test_file, {"disc_number": "99/99"})
|
|
31
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
32
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
33
|
+
assert disc_number == 99
|
|
34
|
+
assert disc_total == 99
|
|
35
|
+
|
|
36
|
+
def test_vorbis_with_total(self):
|
|
37
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
38
|
+
VorbisMetadataSetter.set_metadata(test_file, {"disc_number": "1", "disc_total": "2"})
|
|
39
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
40
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
41
|
+
assert disc_number == 1
|
|
42
|
+
assert disc_total == 2
|
|
43
|
+
|
|
44
|
+
def test_vorbis_without_total(self):
|
|
45
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
46
|
+
VorbisMetadataSetter.set_metadata(test_file, {"disc_number": "2"})
|
|
47
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
48
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
49
|
+
assert disc_number == 2
|
|
50
|
+
assert disc_total is None
|
|
51
|
+
|
|
52
|
+
def test_id3v1_not_supported(self):
|
|
53
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
|
|
54
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
55
|
+
|
|
56
|
+
with temp_file_with_metadata({}, "id3v1") as test_file:
|
|
57
|
+
with pytest.raises(
|
|
58
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
59
|
+
match="UnifiedMetadataKey.DISC_NUMBER metadata not supported by ID3v1 format",
|
|
60
|
+
):
|
|
61
|
+
get_unified_metadata_field(
|
|
62
|
+
test_file, UnifiedMetadataKey.DISC_NUMBER, metadata_format=MetadataFormat.ID3V1
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
with pytest.raises(
|
|
66
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
67
|
+
match="UnifiedMetadataKey.DISC_TOTAL metadata not supported by ID3v1 format",
|
|
68
|
+
):
|
|
69
|
+
get_unified_metadata_field(
|
|
70
|
+
test_file, UnifiedMetadataKey.DISC_TOTAL, metadata_format=MetadataFormat.ID3V1
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def test_riff_not_supported(self):
|
|
74
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
|
|
75
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
76
|
+
|
|
77
|
+
with temp_file_with_metadata({}, "wav") as test_file:
|
|
78
|
+
with pytest.raises(
|
|
79
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
80
|
+
match="UnifiedMetadataKey.DISC_NUMBER metadata not supported by RIFF format",
|
|
81
|
+
):
|
|
82
|
+
get_unified_metadata_field(
|
|
83
|
+
test_file, UnifiedMetadataKey.DISC_NUMBER, metadata_format=MetadataFormat.RIFF
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
with pytest.raises(
|
|
87
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
88
|
+
match="UnifiedMetadataKey.DISC_TOTAL metadata not supported by RIFF format",
|
|
89
|
+
):
|
|
90
|
+
get_unified_metadata_field(
|
|
91
|
+
test_file, UnifiedMetadataKey.DISC_TOTAL, metadata_format=MetadataFormat.RIFF
|
|
92
|
+
)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata_field, update_metadata
|
|
4
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
5
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
6
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestDiscNumberWriting:
|
|
11
|
+
@pytest.mark.parametrize(
|
|
12
|
+
("disc_number", "disc_total", "expected_disc_number", "expected_disc_total"),
|
|
13
|
+
[
|
|
14
|
+
(1, None, 1, None),
|
|
15
|
+
(1, 2, 1, 2),
|
|
16
|
+
(99, 99, 99, 99),
|
|
17
|
+
],
|
|
18
|
+
)
|
|
19
|
+
def test_id3v2_disc_number_writing(self, disc_number, disc_total, expected_disc_number, expected_disc_total):
|
|
20
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
21
|
+
metadata = {UnifiedMetadataKey.DISC_NUMBER: disc_number}
|
|
22
|
+
if disc_total is not None:
|
|
23
|
+
metadata[UnifiedMetadataKey.DISC_TOTAL] = disc_total
|
|
24
|
+
update_metadata(test_file, metadata, metadata_format=MetadataFormat.ID3V2)
|
|
25
|
+
|
|
26
|
+
result_disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
27
|
+
result_disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
28
|
+
assert result_disc_number == expected_disc_number
|
|
29
|
+
assert result_disc_total == expected_disc_total
|
|
30
|
+
|
|
31
|
+
@pytest.mark.parametrize(
|
|
32
|
+
("disc_number", "disc_total", "expected_disc_number", "expected_disc_total"),
|
|
33
|
+
[
|
|
34
|
+
(1, None, 1, None),
|
|
35
|
+
(1, 2, 1, 2),
|
|
36
|
+
(99, 99, 99, 99),
|
|
37
|
+
],
|
|
38
|
+
)
|
|
39
|
+
def test_vorbis_disc_number_writing(self, disc_number, disc_total, expected_disc_number, expected_disc_total):
|
|
40
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
41
|
+
metadata = {UnifiedMetadataKey.DISC_NUMBER: disc_number}
|
|
42
|
+
if disc_total is not None:
|
|
43
|
+
metadata[UnifiedMetadataKey.DISC_TOTAL] = disc_total
|
|
44
|
+
update_metadata(test_file, metadata, metadata_format=MetadataFormat.VORBIS)
|
|
45
|
+
|
|
46
|
+
result_disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
47
|
+
result_disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
48
|
+
assert result_disc_number == expected_disc_number
|
|
49
|
+
assert result_disc_total == expected_disc_total
|
|
50
|
+
|
|
51
|
+
def test_id3v2_disc_number_with_total_combines_format(self):
|
|
52
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
53
|
+
update_metadata(
|
|
54
|
+
test_file,
|
|
55
|
+
{UnifiedMetadataKey.DISC_NUMBER: 1, UnifiedMetadataKey.DISC_TOTAL: 2},
|
|
56
|
+
metadata_format=MetadataFormat.ID3V2,
|
|
57
|
+
)
|
|
58
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
59
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
60
|
+
assert disc_number == 1
|
|
61
|
+
assert disc_total == 2
|
|
62
|
+
|
|
63
|
+
def test_id3v2_disc_number_without_total_writes_simple_format(self):
|
|
64
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
65
|
+
update_metadata(test_file, {UnifiedMetadataKey.DISC_NUMBER: 1}, metadata_format=MetadataFormat.ID3V2)
|
|
66
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
67
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
68
|
+
assert disc_number == 1
|
|
69
|
+
assert disc_total is None
|
|
70
|
+
|
|
71
|
+
def test_vorbis_disc_number_writes_separate_fields(self):
|
|
72
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
73
|
+
update_metadata(
|
|
74
|
+
test_file,
|
|
75
|
+
{UnifiedMetadataKey.DISC_NUMBER: 1, UnifiedMetadataKey.DISC_TOTAL: 2},
|
|
76
|
+
metadata_format=MetadataFormat.VORBIS,
|
|
77
|
+
)
|
|
78
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
79
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
80
|
+
assert disc_number == 1
|
|
81
|
+
assert disc_total == 2
|
|
82
|
+
|
|
83
|
+
def test_id3v2_disc_number_max_value_truncated(self):
|
|
84
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
85
|
+
update_metadata(
|
|
86
|
+
test_file,
|
|
87
|
+
{UnifiedMetadataKey.DISC_NUMBER: 256, UnifiedMetadataKey.DISC_TOTAL: 300},
|
|
88
|
+
metadata_format=MetadataFormat.ID3V2,
|
|
89
|
+
)
|
|
90
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
91
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
92
|
+
assert disc_number == 255
|
|
93
|
+
assert disc_total == 255
|
|
94
|
+
|
|
95
|
+
def test_vorbis_disc_number_no_limit(self):
|
|
96
|
+
with temp_file_with_metadata({}, "flac") as test_file:
|
|
97
|
+
update_metadata(
|
|
98
|
+
test_file,
|
|
99
|
+
{UnifiedMetadataKey.DISC_NUMBER: 256, UnifiedMetadataKey.DISC_TOTAL: 300},
|
|
100
|
+
metadata_format=MetadataFormat.VORBIS,
|
|
101
|
+
)
|
|
102
|
+
disc_number = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_NUMBER)
|
|
103
|
+
disc_total = get_unified_metadata_field(test_file, UnifiedMetadataKey.DISC_TOTAL)
|
|
104
|
+
assert disc_number == 256
|
|
105
|
+
assert disc_total == 300
|
|
106
|
+
|
|
107
|
+
def test_id3v1_not_supported(self):
|
|
108
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
|
|
109
|
+
|
|
110
|
+
with temp_file_with_metadata({}, "mp3") as test_file:
|
|
111
|
+
with pytest.raises(
|
|
112
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
113
|
+
match="UnifiedMetadataKey.DISC_NUMBER metadata not supported by ID3v1 format",
|
|
114
|
+
):
|
|
115
|
+
update_metadata(
|
|
116
|
+
test_file,
|
|
117
|
+
{UnifiedMetadataKey.DISC_NUMBER: 1},
|
|
118
|
+
metadata_format=MetadataFormat.ID3V1,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
with pytest.raises(
|
|
122
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
123
|
+
match="UnifiedMetadataKey.DISC_TOTAL metadata not supported by ID3v1 format",
|
|
124
|
+
):
|
|
125
|
+
update_metadata(
|
|
126
|
+
test_file,
|
|
127
|
+
{UnifiedMetadataKey.DISC_TOTAL: 2},
|
|
128
|
+
metadata_format=MetadataFormat.ID3V1,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
def test_riff_not_supported(self):
|
|
132
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
|
|
133
|
+
|
|
134
|
+
with temp_file_with_metadata({}, "wav") as test_file:
|
|
135
|
+
with pytest.raises(
|
|
136
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
137
|
+
match="UnifiedMetadataKey.DISC_NUMBER metadata not supported by RIFF format",
|
|
138
|
+
):
|
|
139
|
+
update_metadata(
|
|
140
|
+
test_file,
|
|
141
|
+
{UnifiedMetadataKey.DISC_NUMBER: 1},
|
|
142
|
+
metadata_format=MetadataFormat.RIFF,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
with pytest.raises(
|
|
146
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
147
|
+
match="UnifiedMetadataKey.DISC_TOTAL metadata not supported by RIFF format",
|
|
148
|
+
):
|
|
149
|
+
update_metadata(
|
|
150
|
+
test_file,
|
|
151
|
+
{UnifiedMetadataKey.DISC_TOTAL: 2},
|
|
152
|
+
metadata_format=MetadataFormat.RIFF,
|
|
153
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import update_metadata
|
|
4
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByMetadataFormatError
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
7
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.mark.integration
|
|
11
|
+
class TestFieldNotSupportedDeleting:
|
|
12
|
+
def test_delete_field_not_supported_id3v2(self):
|
|
13
|
+
with (
|
|
14
|
+
temp_file_with_metadata({}, "mp3") as test_file,
|
|
15
|
+
pytest.raises(
|
|
16
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
17
|
+
match="UnifiedMetadataKey.ARCHIVAL_LOCATION metadata not supported by ID3v2 format",
|
|
18
|
+
),
|
|
19
|
+
):
|
|
20
|
+
update_metadata(
|
|
21
|
+
test_file, {UnifiedMetadataKey.ARCHIVAL_LOCATION: None}, metadata_format=MetadataFormat.ID3V2
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def test_delete_field_not_supported_id3v1(self):
|
|
25
|
+
with (
|
|
26
|
+
temp_file_with_metadata({}, "mp3") as test_file,
|
|
27
|
+
pytest.raises(
|
|
28
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
29
|
+
match="UnifiedMetadataKey.ARCHIVAL_LOCATION metadata not supported by ID3v1 format",
|
|
30
|
+
),
|
|
31
|
+
):
|
|
32
|
+
update_metadata(
|
|
33
|
+
test_file, {UnifiedMetadataKey.ARCHIVAL_LOCATION: None}, metadata_format=MetadataFormat.ID3V1
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def test_delete_field_not_supported_riff(self):
|
|
37
|
+
with (
|
|
38
|
+
temp_file_with_metadata({}, "wav") as test_file,
|
|
39
|
+
pytest.raises(
|
|
40
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
41
|
+
match="UnifiedMetadataKey.PUBLISHER metadata not supported by RIFF format",
|
|
42
|
+
),
|
|
43
|
+
):
|
|
44
|
+
update_metadata(test_file, {UnifiedMetadataKey.PUBLISHER: None}, metadata_format=MetadataFormat.RIFF)
|
|
45
|
+
|
|
46
|
+
def test_delete_field_not_supported_vorbis(self):
|
|
47
|
+
with (
|
|
48
|
+
temp_file_with_metadata({}, "flac") as test_file,
|
|
49
|
+
pytest.raises(
|
|
50
|
+
MetadataFieldNotSupportedByMetadataFormatError,
|
|
51
|
+
match="UnifiedMetadataKey.ARCHIVAL_LOCATION metadata not supported by Vorbis format",
|
|
52
|
+
),
|
|
53
|
+
):
|
|
54
|
+
update_metadata(
|
|
55
|
+
test_file, {UnifiedMetadataKey.ARCHIVAL_LOCATION: None}, metadata_format=MetadataFormat.VORBIS
|
|
56
|
+
)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata_field
|
|
4
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByLibError
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestFieldNotSupportedReading:
|
|
11
|
+
def test_field_not_supported_all_formats(self):
|
|
12
|
+
with (
|
|
13
|
+
temp_file_with_metadata({}, "mp3") as test_file,
|
|
14
|
+
pytest.raises(
|
|
15
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
16
|
+
),
|
|
17
|
+
):
|
|
18
|
+
get_unified_metadata_field(test_file, "FIELD_NOT_SUPPORTED")
|
|
19
|
+
|
|
20
|
+
def test_id3v1(self):
|
|
21
|
+
with (
|
|
22
|
+
temp_file_with_metadata({"title": "Test Song"}, "id3v1") as test_file,
|
|
23
|
+
pytest.raises(
|
|
24
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
25
|
+
),
|
|
26
|
+
):
|
|
27
|
+
get_unified_metadata_field(test_file, "FIELD_NOT_SUPPORTED", metadata_format=MetadataFormat.ID3V1)
|
|
28
|
+
|
|
29
|
+
def test_id3v2(self):
|
|
30
|
+
with (
|
|
31
|
+
temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file,
|
|
32
|
+
pytest.raises(
|
|
33
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
34
|
+
),
|
|
35
|
+
):
|
|
36
|
+
get_unified_metadata_field(test_file, "FIELD_NOT_SUPPORTED", metadata_format=MetadataFormat.ID3V2)
|
|
37
|
+
|
|
38
|
+
def test_vorbis(self):
|
|
39
|
+
with (
|
|
40
|
+
temp_file_with_metadata({"title": "Test Song"}, "flac") as test_file,
|
|
41
|
+
pytest.raises(
|
|
42
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
43
|
+
),
|
|
44
|
+
):
|
|
45
|
+
get_unified_metadata_field(test_file, "FIELD_NOT_SUPPORTED", metadata_format=MetadataFormat.VORBIS)
|
|
46
|
+
|
|
47
|
+
def test_riff(self):
|
|
48
|
+
with (
|
|
49
|
+
temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file,
|
|
50
|
+
pytest.raises(
|
|
51
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
52
|
+
),
|
|
53
|
+
):
|
|
54
|
+
get_unified_metadata_field(test_file, "FIELD_NOT_SUPPORTED", metadata_format=MetadataFormat.RIFF)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import update_metadata
|
|
4
|
+
from audiometa.exceptions import MetadataFieldNotSupportedByLibError
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.utils.metadata_format import MetadataFormat
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestFieldNotSupportedWriting:
|
|
11
|
+
def test_id3v1(self):
|
|
12
|
+
with (
|
|
13
|
+
temp_file_with_metadata({}, "mp3") as test_file,
|
|
14
|
+
pytest.raises(
|
|
15
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
16
|
+
),
|
|
17
|
+
):
|
|
18
|
+
update_metadata(
|
|
19
|
+
test_file,
|
|
20
|
+
{"FIELD_NOT_SUPPORTED": "Test Field Not Supported"},
|
|
21
|
+
metadata_format=MetadataFormat.ID3V1,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def test_id3v2(self):
|
|
25
|
+
with (
|
|
26
|
+
temp_file_with_metadata({}, "mp3") as test_file,
|
|
27
|
+
pytest.raises(
|
|
28
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
29
|
+
),
|
|
30
|
+
):
|
|
31
|
+
update_metadata(
|
|
32
|
+
test_file,
|
|
33
|
+
{"FIELD_NOT_SUPPORTED": "Test Field Not Supported"},
|
|
34
|
+
metadata_format=MetadataFormat.ID3V2,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def test_riff(self):
|
|
38
|
+
with (
|
|
39
|
+
temp_file_with_metadata({}, "wav") as test_file,
|
|
40
|
+
pytest.raises(
|
|
41
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
42
|
+
),
|
|
43
|
+
):
|
|
44
|
+
update_metadata(
|
|
45
|
+
test_file,
|
|
46
|
+
{"FIELD_NOT_SUPPORTED": "Test Field Not Supported"},
|
|
47
|
+
metadata_format=MetadataFormat.RIFF,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def test_vorbis(self):
|
|
51
|
+
with (
|
|
52
|
+
temp_file_with_metadata({}, "flac") as test_file,
|
|
53
|
+
pytest.raises(
|
|
54
|
+
MetadataFieldNotSupportedByLibError, match="FIELD_NOT_SUPPORTED metadata not supported by the library."
|
|
55
|
+
),
|
|
56
|
+
):
|
|
57
|
+
update_metadata(
|
|
58
|
+
test_file,
|
|
59
|
+
{"FIELD_NOT_SUPPORTED": "Test Field Not Supported"},
|
|
60
|
+
metadata_format=MetadataFormat.VORBIS,
|
|
61
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v1_reading.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata_field
|
|
4
|
+
from audiometa.test.helpers.id3v1 import ID3v1MetadataSetter
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestId3v1GenreReading:
|
|
11
|
+
def test_id3v1_genre_code_17_rock(self):
|
|
12
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
13
|
+
ID3v1MetadataSetter.set_genre(test_file, "17")
|
|
14
|
+
|
|
15
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
16
|
+
|
|
17
|
+
assert genres == ["Rock"]
|
|
18
|
+
|
|
19
|
+
def test_id3v1_genre_code_0_blues(self):
|
|
20
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
21
|
+
ID3v1MetadataSetter.set_genre(test_file, "0")
|
|
22
|
+
|
|
23
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
24
|
+
|
|
25
|
+
assert genres == ["Blues"]
|
|
26
|
+
|
|
27
|
+
def test_id3v1_genre_code_32_classical(self):
|
|
28
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
29
|
+
ID3v1MetadataSetter.set_genre(test_file, "32")
|
|
30
|
+
|
|
31
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
32
|
+
|
|
33
|
+
assert genres == ["Classical"]
|
|
34
|
+
|
|
35
|
+
def test_id3v1_genre_code_80_folk(self):
|
|
36
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
37
|
+
ID3v1MetadataSetter.set_genre(test_file, "80")
|
|
38
|
+
|
|
39
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
40
|
+
|
|
41
|
+
assert genres == ["Folk"]
|
|
42
|
+
|
|
43
|
+
def test_id3v1_genre_code_131_indie(self):
|
|
44
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
45
|
+
ID3v1MetadataSetter.set_genre(test_file, "131")
|
|
46
|
+
|
|
47
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
48
|
+
|
|
49
|
+
assert genres == ["Indie"]
|
|
50
|
+
|
|
51
|
+
def test_id3v1_genre_code_189_dubstep(self):
|
|
52
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
53
|
+
ID3v1MetadataSetter.set_genre(test_file, "189")
|
|
54
|
+
|
|
55
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
56
|
+
|
|
57
|
+
assert genres == ["Dubstep"]
|
|
58
|
+
|
|
59
|
+
def test_id3v1_genre_code_255_unknown(self):
|
|
60
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
61
|
+
ID3v1MetadataSetter.set_genre(test_file, "255")
|
|
62
|
+
|
|
63
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
64
|
+
|
|
65
|
+
assert genres is None
|
audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_id3v2_reading.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata_field
|
|
4
|
+
from audiometa.test.helpers.id3v2 import ID3v2MetadataSetter
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestId3v2GenreReading:
|
|
11
|
+
def test_id3v2_single_genre(self):
|
|
12
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
13
|
+
ID3v2MetadataSetter.set_genre(test_file, "Rock")
|
|
14
|
+
|
|
15
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
16
|
+
|
|
17
|
+
assert genres == ["Rock"]
|
|
18
|
+
|
|
19
|
+
def test_id3v2_multiple_genres_separate_frames(self):
|
|
20
|
+
with temp_file_with_metadata({"title": "Test Song"}, "mp3") as test_file:
|
|
21
|
+
ID3v2MetadataSetter.set_genres(test_file, ["Rock", "Alternative", "Indie"])
|
|
22
|
+
|
|
23
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
24
|
+
|
|
25
|
+
assert genres == ["Rock", "Alternative", "Indie"]
|
audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_riff_reading.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata_field
|
|
4
|
+
from audiometa.test.helpers.riff import RIFFMetadataSetter
|
|
5
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
6
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestRiffGenreParsing:
|
|
11
|
+
def test_riff_genre_codes_only_semicolon(self):
|
|
12
|
+
with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
|
|
13
|
+
RIFFMetadataSetter.set_genre_text(test_file, "17; 20; 131")
|
|
14
|
+
|
|
15
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
16
|
+
|
|
17
|
+
assert genres == ["Rock", "Alternative", "Indie"]
|
|
18
|
+
|
|
19
|
+
def test_riff_genre_mixed_codes_and_names(self):
|
|
20
|
+
with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
|
|
21
|
+
RIFFMetadataSetter.set_genre_text(test_file, "Rock; 20; Indie")
|
|
22
|
+
|
|
23
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
24
|
+
|
|
25
|
+
assert genres == ["Rock", "Alternative", "Indie"]
|
|
26
|
+
|
|
27
|
+
def test_riff_genre_single_code(self):
|
|
28
|
+
with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
|
|
29
|
+
RIFFMetadataSetter.set_genre_text(test_file, "17")
|
|
30
|
+
|
|
31
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
32
|
+
|
|
33
|
+
assert genres == ["Rock"]
|
|
34
|
+
|
|
35
|
+
def test_riff_genre_single_name(self):
|
|
36
|
+
with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
|
|
37
|
+
RIFFMetadataSetter.set_genre_text(test_file, "Rock")
|
|
38
|
+
|
|
39
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
40
|
+
|
|
41
|
+
assert genres == ["Rock"]
|
|
42
|
+
|
|
43
|
+
def test_riff_genre_unknown_code(self):
|
|
44
|
+
with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
|
|
45
|
+
RIFFMetadataSetter.set_genre_text(test_file, "999")
|
|
46
|
+
|
|
47
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
48
|
+
|
|
49
|
+
assert genres is None
|
|
50
|
+
|
|
51
|
+
def test_riff_genre_very_long_text(self):
|
|
52
|
+
with temp_file_with_metadata({"title": "Test Song"}, "wav") as test_file:
|
|
53
|
+
long_genre = "Very Long Genre Name That Might Exceed Normal Limits And Test Edge Cases"
|
|
54
|
+
RIFFMetadataSetter.set_genre_text(test_file, long_genre)
|
|
55
|
+
|
|
56
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
57
|
+
|
|
58
|
+
assert genres == [long_genre]
|
audiometa/test/tests/integration/metadata_field/genre/reading/metadata_format/test_vorbis_reading.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from audiometa import get_unified_metadata, get_unified_metadata_field
|
|
4
|
+
from audiometa.test.helpers.temp_file_with_metadata import temp_file_with_metadata
|
|
5
|
+
from audiometa.test.helpers.vorbis.vorbis_metadata_setter import VorbisMetadataSetter
|
|
6
|
+
from audiometa.utils.unified_metadata_key import UnifiedMetadataKey
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.integration
|
|
10
|
+
class TestVorbisGenreReading:
|
|
11
|
+
def test_vorbis_single_genre(self):
|
|
12
|
+
with temp_file_with_metadata({"title": "Test Song"}, "flac") as test_file:
|
|
13
|
+
VorbisMetadataSetter.set_genre(test_file, "Rock")
|
|
14
|
+
|
|
15
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
16
|
+
|
|
17
|
+
assert genres == ["Rock"]
|
|
18
|
+
|
|
19
|
+
def test_vorbis_multiple_genres_separate_entries(self):
|
|
20
|
+
with temp_file_with_metadata({"title": "Test Song"}, "flac") as test_file:
|
|
21
|
+
VorbisMetadataSetter.set_genre(test_file, "Rock; Alternative; Indie")
|
|
22
|
+
|
|
23
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
24
|
+
|
|
25
|
+
assert genres == ["Rock", "Alternative", "Indie"]
|
|
26
|
+
|
|
27
|
+
def test_vorbis_genre_with_double_backslash_separator(self):
|
|
28
|
+
with temp_file_with_metadata({"title": "Test Song"}, "flac") as test_file:
|
|
29
|
+
VorbisMetadataSetter.set_genre(test_file, "Rock\\\\Alternative\\\\Indie")
|
|
30
|
+
|
|
31
|
+
genres = get_unified_metadata_field(test_file, UnifiedMetadataKey.GENRES_NAMES)
|
|
32
|
+
|
|
33
|
+
assert genres == ["Rock", "Alternative", "Indie"]
|
|
34
|
+
|
|
35
|
+
def test_vorbis_genre_custom_genre_names(self):
|
|
36
|
+
custom_genres = [
|
|
37
|
+
"Post-Rock",
|
|
38
|
+
"Shoegaze",
|
|
39
|
+
"Dream Pop",
|
|
40
|
+
"Chillwave",
|
|
41
|
+
"Vaporwave",
|
|
42
|
+
"Synthwave",
|
|
43
|
+
"Retrowave",
|
|
44
|
+
"Outrun",
|
|
45
|
+
"Future Funk",
|
|
46
|
+
"Lo-Fi Hip Hop",
|
|
47
|
+
"Ambient",
|
|
48
|
+
"Drone",
|
|
49
|
+
"Noise",
|
|
50
|
+
"Experimental",
|
|
51
|
+
"Avant-garde",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
for genre in custom_genres:
|
|
55
|
+
with temp_file_with_metadata({"title": "Test Song"}, "flac") as test_file:
|
|
56
|
+
VorbisMetadataSetter.set_genre(test_file, genre)
|
|
57
|
+
|
|
58
|
+
metadata = get_unified_metadata(test_file)
|
|
59
|
+
genres = metadata.get(UnifiedMetadataKey.GENRES_NAMES)
|
|
60
|
+
|
|
61
|
+
assert genres == [genre]
|