id3taginator 0.8

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.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.idea/.gitignore +8 -0
  4. data/.idea/ID3Taginator.iml +73 -0
  5. data/.idea/misc.xml +4 -0
  6. data/.idea/modules.xml +8 -0
  7. data/.idea/vcs.xml +6 -0
  8. data/.rspec +3 -0
  9. data/.rubocop.yml +26 -0
  10. data/CHANGELOG.md +5 -0
  11. data/CODE_OF_CONDUCT.md +84 -0
  12. data/Gemfile +12 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.md +408 -0
  15. data/Rakefile +12 -0
  16. data/bin/console +15 -0
  17. data/bin/setup +8 -0
  18. data/id3taginator.gemspec +37 -0
  19. data/lib/id3taginator/audio_file.rb +136 -0
  20. data/lib/id3taginator/errors/id3_tag_error.rb +12 -0
  21. data/lib/id3taginator/extensions/argument_check.rb +88 -0
  22. data/lib/id3taginator/extensions/comparable.rb +28 -0
  23. data/lib/id3taginator/extensions/encodable.rb +215 -0
  24. data/lib/id3taginator/extensions/optionable.rb +73 -0
  25. data/lib/id3taginator/frames/buffer/entities/buffer.rb +26 -0
  26. data/lib/id3taginator/frames/buffer/rbuf_recommended_buffer_size_frame.rb +59 -0
  27. data/lib/id3taginator/frames/buffer_frames.rb +32 -0
  28. data/lib/id3taginator/frames/comment/comm_comment_frame.rb +56 -0
  29. data/lib/id3taginator/frames/comment/entities/comment.rb +26 -0
  30. data/lib/id3taginator/frames/comment_frames.rb +42 -0
  31. data/lib/id3taginator/frames/count/entities/popularimeter.rb +26 -0
  32. data/lib/id3taginator/frames/count/pcnt_play_counter_frame.rb +40 -0
  33. data/lib/id3taginator/frames/count/popm_popularimeter_frame.rb +52 -0
  34. data/lib/id3taginator/frames/count_frames.rb +51 -0
  35. data/lib/id3taginator/frames/custom_frame.rb +39 -0
  36. data/lib/id3taginator/frames/custom_frames.rb +54 -0
  37. data/lib/id3taginator/frames/encryption/aenc_audio_encryption.rb +54 -0
  38. data/lib/id3taginator/frames/encryption/encr_encryption_method_frame.rb +49 -0
  39. data/lib/id3taginator/frames/encryption/entities/audio_encryption.rb +28 -0
  40. data/lib/id3taginator/frames/encryption/entities/encryption_method.rb +26 -0
  41. data/lib/id3taginator/frames/encryption_frames.rb +77 -0
  42. data/lib/id3taginator/frames/frameable.rb +75 -0
  43. data/lib/id3taginator/frames/geo/entities/encapsulated_object.rb +28 -0
  44. data/lib/id3taginator/frames/geo/geob_general_encapsulated_object_frame.rb +59 -0
  45. data/lib/id3taginator/frames/geo_frames.rb +41 -0
  46. data/lib/id3taginator/frames/grouping/entities/group_identification.rb +26 -0
  47. data/lib/id3taginator/frames/grouping/grid_group_identification_frame.rb +49 -0
  48. data/lib/id3taginator/frames/grouping/grp1_grouping_frame.rb +40 -0
  49. data/lib/id3taginator/frames/grouping_frames.rb +61 -0
  50. data/lib/id3taginator/frames/has_id.rb +51 -0
  51. data/lib/id3taginator/frames/id3v23_frame_flags.rb +64 -0
  52. data/lib/id3taginator/frames/id3v24_frame_flags.rb +80 -0
  53. data/lib/id3taginator/frames/id3v2_frame.rb +249 -0
  54. data/lib/id3taginator/frames/id3v2_frame_factory.rb +98 -0
  55. data/lib/id3taginator/frames/ipl/entities/involved_person.rb +24 -0
  56. data/lib/id3taginator/frames/ipl/ipls_involved_people_frame.rb +48 -0
  57. data/lib/id3taginator/frames/ipl_frames.rb +31 -0
  58. data/lib/id3taginator/frames/lyrics/entities/unsync_lyrics.rb +26 -0
  59. data/lib/id3taginator/frames/lyrics/uslt_unsync_lyrics_frame.rb +56 -0
  60. data/lib/id3taginator/frames/lyrics_frames.rb +42 -0
  61. data/lib/id3taginator/frames/mcdi/mcdi_music_cd_identifier_frame.rb +40 -0
  62. data/lib/id3taginator/frames/mcdi_frames.rb +28 -0
  63. data/lib/id3taginator/frames/picture/apic_picture_frame.rb +106 -0
  64. data/lib/id3taginator/frames/picture/entities/picture.rb +32 -0
  65. data/lib/id3taginator/frames/picture_frames.rb +51 -0
  66. data/lib/id3taginator/frames/private/entities/private_frame.rb +24 -0
  67. data/lib/id3taginator/frames/private/priv_private_frame.rb +45 -0
  68. data/lib/id3taginator/frames/private_frames.rb +40 -0
  69. data/lib/id3taginator/frames/text/entities/copyright.rb +24 -0
  70. data/lib/id3taginator/frames/text/entities/date.rb +24 -0
  71. data/lib/id3taginator/frames/text/entities/part_of_set.rb +24 -0
  72. data/lib/id3taginator/frames/text/entities/time.rb +24 -0
  73. data/lib/id3taginator/frames/text/entities/track_number.rb +24 -0
  74. data/lib/id3taginator/frames/text/entities/user_info.rb +24 -0
  75. data/lib/id3taginator/frames/text/talb_album_frame.rb +40 -0
  76. data/lib/id3taginator/frames/text/tbpm_bpm_frame.rb +40 -0
  77. data/lib/id3taginator/frames/text/tcom_composer_frame.rb +42 -0
  78. data/lib/id3taginator/frames/text/tcon_genre_frame.rb +104 -0
  79. data/lib/id3taginator/frames/text/tcop_copyright_frame.rb +55 -0
  80. data/lib/id3taginator/frames/text/tdat_date_frame.rb +60 -0
  81. data/lib/id3taginator/frames/text/tdly_playlist_delay_frame.rb +40 -0
  82. data/lib/id3taginator/frames/text/tenc_encoded_by_frame.rb +40 -0
  83. data/lib/id3taginator/frames/text/text_writers_frame.rb +43 -0
  84. data/lib/id3taginator/frames/text/tflt_file_type_frame.rb +71 -0
  85. data/lib/id3taginator/frames/text/time_time_frame.rb +60 -0
  86. data/lib/id3taginator/frames/text/tit1_content_group_description_frame.rb +40 -0
  87. data/lib/id3taginator/frames/text/tit2_title_frame.rb +40 -0
  88. data/lib/id3taginator/frames/text/tit3_subtitle_frame.rb +40 -0
  89. data/lib/id3taginator/frames/text/tkey_initial_key_frame.rb +40 -0
  90. data/lib/id3taginator/frames/text/tlan_language_frame.rb +48 -0
  91. data/lib/id3taginator/frames/text/tlen_length_frame.rb +40 -0
  92. data/lib/id3taginator/frames/text/tmed_media_type_frame.rb +40 -0
  93. data/lib/id3taginator/frames/text/toal_original_album_frame.rb +40 -0
  94. data/lib/id3taginator/frames/text/tofn_original_filename_frame.rb +40 -0
  95. data/lib/id3taginator/frames/text/toly_original_writers_frame.rb +43 -0
  96. data/lib/id3taginator/frames/text/tope_original_artists_frame.rb +43 -0
  97. data/lib/id3taginator/frames/text/tory_original_release_year_frame.rb +42 -0
  98. data/lib/id3taginator/frames/text/town_file_owner_frame.rb +40 -0
  99. data/lib/id3taginator/frames/text/tpe1_artist_frame.rb +43 -0
  100. data/lib/id3taginator/frames/text/tpe2_album_artist_frame.rb +40 -0
  101. data/lib/id3taginator/frames/text/tpe3_conductor_frame.rb +40 -0
  102. data/lib/id3taginator/frames/text/tpe4_modified_by_frame.rb +40 -0
  103. data/lib/id3taginator/frames/text/tpos_part_of_set_frame.rb +50 -0
  104. data/lib/id3taginator/frames/text/tpub_publisher_frame.rb +40 -0
  105. data/lib/id3taginator/frames/text/trck_track_number_frame.rb +50 -0
  106. data/lib/id3taginator/frames/text/trda_recording_dates_frame.rb +42 -0
  107. data/lib/id3taginator/frames/text/trsn_internet_radio_station_frame.rb +40 -0
  108. data/lib/id3taginator/frames/text/tsiz_size_frame.rb +41 -0
  109. data/lib/id3taginator/frames/text/tsoa_album_sort_order_frame.rb +40 -0
  110. data/lib/id3taginator/frames/text/tsop_performer_sort_order_frame.rb +40 -0
  111. data/lib/id3taginator/frames/text/tsot_title_sort_order_frame.rb +40 -0
  112. data/lib/id3taginator/frames/text/tsrc_isrc_frame.rb +40 -0
  113. data/lib/id3taginator/frames/text/tsse_encoder_frame.rb +40 -0
  114. data/lib/id3taginator/frames/text/txxx_user_text_info_frame.rb +51 -0
  115. data/lib/id3taginator/frames/text/tyer_year_frame.rb +42 -0
  116. data/lib/id3taginator/frames/text_frames.rb +840 -0
  117. data/lib/id3taginator/frames/tos/entities/ownership.rb +26 -0
  118. data/lib/id3taginator/frames/tos/entities/terms_of_use.rb +24 -0
  119. data/lib/id3taginator/frames/tos/owne_ownership_frame.rb +53 -0
  120. data/lib/id3taginator/frames/tos/user_terms_of_use_frame.rb +49 -0
  121. data/lib/id3taginator/frames/tos_frames.rb +54 -0
  122. data/lib/id3taginator/frames/ufid/entities/ufid_info.rb +24 -0
  123. data/lib/id3taginator/frames/ufid/ufid_unique_file_identifier_frame.rb +47 -0
  124. data/lib/id3taginator/frames/ufid_frames.rb +40 -0
  125. data/lib/id3taginator/frames/url/entities/user_info.rb +24 -0
  126. data/lib/id3taginator/frames/url/wcom_commercial_url_frame.rb +40 -0
  127. data/lib/id3taginator/frames/url/wcop_copyright_url_frame.rb +40 -0
  128. data/lib/id3taginator/frames/url/woaf_official_file_webpage_frame.rb +40 -0
  129. data/lib/id3taginator/frames/url/woar_official_artist_webpage_frame.rb +40 -0
  130. data/lib/id3taginator/frames/url/woas_official_source_webpage_frame.rb +40 -0
  131. data/lib/id3taginator/frames/url/wors_official_radio_station_homepage_frame.rb +40 -0
  132. data/lib/id3taginator/frames/url/wpay_payment_url_frame.rb +40 -0
  133. data/lib/id3taginator/frames/url/wpub_official_publisher_webpage_frame.rb +40 -0
  134. data/lib/id3taginator/frames/url/wxxx_user_url_link_frame.rb +50 -0
  135. data/lib/id3taginator/frames/url_frames.rb +195 -0
  136. data/lib/id3taginator/genres.rb +168 -0
  137. data/lib/id3taginator/header/id3v23_extended_header.rb +37 -0
  138. data/lib/id3taginator/header/id3v24_extended_header.rb +100 -0
  139. data/lib/id3taginator/header/id3v2_flags.rb +64 -0
  140. data/lib/id3taginator/id3v1_tag.rb +156 -0
  141. data/lib/id3taginator/id3v22_tag.rb +30 -0
  142. data/lib/id3taginator/id3v23_tag.rb +63 -0
  143. data/lib/id3taginator/id3v24_tag.rb +75 -0
  144. data/lib/id3taginator/id3v2_tag.rb +241 -0
  145. data/lib/id3taginator/options/options.rb +33 -0
  146. data/lib/id3taginator/util/compress_util.rb +25 -0
  147. data/lib/id3taginator/util/math_util.rb +68 -0
  148. data/lib/id3taginator/util/sync_util.rb +65 -0
  149. data/lib/id3taginator.rb +449 -0
  150. metadata +198 -0
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class FileTypeFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TFT, :TFLT, :TFLT
10
+
11
+ attr_accessor :file_type
12
+
13
+ # builds the writers frame
14
+ #
15
+ # @param file_type [Symbol, String] the file type, all FileTypes are in Text::FileTypes
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(file_type = :MPEG_1_2_LAYER_III, options = nil, id3_version: 3)
21
+ supported?('TFLT', id3_version, options)
22
+
23
+ argument_not_nil(file_type, 'file_type')
24
+
25
+ raise ArgumentError, "File_type isn't valid: #{file_type}" unless FileTypes.valid?(file_type)
26
+
27
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
28
+ frame.file_type = file_type
29
+ frame
30
+ end
31
+
32
+ def process_content(content)
33
+ @file_type = FileTypes.type_by_value(decode_using_encoding_byte(content))
34
+ end
35
+
36
+ def content_to_bytes
37
+ content = FileTypes.type(@file_type)
38
+ encode_and_add_encoding_byte(content)
39
+ end
40
+ end
41
+
42
+ module FileTypes
43
+ MPEG_AUDIO = 'MPG'
44
+ MPEG_1_2_LAYER_I = '/1'
45
+ MPEG_1_2_LAYER_II = '/2'
46
+ MPEG_1_2_LAYER_III = '/3'
47
+ MPEG_2_5 = '/2.5'
48
+ AAC = '/AAC'
49
+ VQF = 'VQF'
50
+ PCM = 'PCM'
51
+
52
+ def self.type(type)
53
+ return MPEG_1_2_LAYER_III unless valid?(type)
54
+
55
+ const_get(type)
56
+ end
57
+
58
+ def self.type_by_value(value)
59
+ res = constants.find { |c| const_get(c) == value }
60
+ res.nil? ? :MPEG_1_2_LAYER_III : res
61
+ end
62
+
63
+ def self.valid?(type)
64
+ const_get(type)
65
+ rescue NameError
66
+ false
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class TimeFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TIM, :TIME, :TIME
10
+
11
+ attr_accessor :hours, :minutes
12
+
13
+ # builds the time frame
14
+ #
15
+ # @param hours [String, Integer] the hours
16
+ # @param minutes [String, Integer] the minutes
17
+ # @param options [Options::Options] options to use
18
+ # @param id3_version [Integer] the id3 version to build the frame for
19
+ #
20
+ # @return [Id3v2Frame] the resulting id3v2 frame
21
+ def self.build_frame(hours, minutes, options = nil, id3_version: 3)
22
+ supported?('TIME', id3_version, options)
23
+
24
+ argument_not_nil(hours, 'hours')
25
+ argument_not_nil(minutes, 'minutes')
26
+ hours = pad_right(hours.to_s, 2)
27
+ minutes = pad_right(minutes.to_s, 2)
28
+ argument_less_than_chars(hours, 'hours', 2)
29
+ argument_less_than_chars(minutes, 'minutes', 2)
30
+
31
+ hours = pad_right(hours, 2, '0')
32
+ minutes = pad_right(minutes, 2, '0')
33
+
34
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
35
+ frame.hours = hours
36
+ frame.minutes = minutes
37
+ frame
38
+ end
39
+
40
+ def process_content(content)
41
+ content = decode_using_encoding_byte(content)
42
+ if content.length != 4
43
+ @hours = '0'
44
+ @minutes = '0'
45
+ else
46
+ @hours = content[0..1]
47
+ @minutes = content[2..3]
48
+ end
49
+ end
50
+
51
+ def content_to_bytes
52
+ @hours ||= '0'
53
+ @minutes ||= '0'
54
+ content = "#{pad_right(@hours.to_s, 2, '0')}#{pad_right(@minutes.to_s, 2, '0')}"
55
+ encode_and_add_encoding_byte(content)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class ContentGroupDescriptionFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TT1, :TIT1, :TIT1
10
+
11
+ attr_accessor :content_description
12
+
13
+ # builds the content group description frame
14
+ #
15
+ # @param content_description [String] the content group description
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(content_description, options = nil, id3_version: 3)
21
+ supported?('TIT1', id3_version, options)
22
+
23
+ argument_not_nil(content_description, 'content_description')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.content_description = content_description
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @content_description = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@content_description)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class TitleFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TT2, :TIT2, :TIT2
10
+
11
+ attr_accessor :title
12
+
13
+ # builds the title frame
14
+ #
15
+ # @param title [String] the title
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(title, options = nil, id3_version: 3)
21
+ supported?('TIT2', id3_version, options)
22
+
23
+ argument_not_nil(title, 'title')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.title = title
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @title = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@title)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class SubtitleFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TT3, :TIT3, :TIT3
10
+
11
+ attr_accessor :subtitle
12
+
13
+ # builds the subtitle frame
14
+ #
15
+ # @param subtitle [String] the subtitle
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(subtitle, options = nil, id3_version: 3)
21
+ supported?('TIT3', id3_version, options)
22
+
23
+ argument_not_nil(subtitle, 'subtitle')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.subtitle = subtitle
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @subtitle = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@subtitle)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class InitialKeyFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TKE, :TKEY, :TKEY
10
+
11
+ attr_accessor :initial_key
12
+
13
+ # builds the initial key frame
14
+ #
15
+ # @param initial_key [String] the initial key, can have up to 3 characters
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(initial_key, options = nil, id3_version: 3)
21
+ supported?('TKEY', id3_version, options)
22
+
23
+ argument_less_than_chars(initial_key, 'initial_key', 3)
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.initial_key = initial_key
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @initial_key = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@initial_key)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class LanguageFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TLA, :TLAN, :TLAN
10
+
11
+ attr_accessor :languages
12
+
13
+ # builds the language frame
14
+ #
15
+ # @param languages [Array<String>, String] the 3 character language(s)
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(languages, options = nil, id3_version: 3)
21
+ supported?('TLAN', id3_version, options)
22
+
23
+ argument_not_empty(languages, 'languages')
24
+
25
+ langs = languages.is_a?(Array) ? languages : [languages]
26
+
27
+ raise ArgumentError, 'Languages should be 3 characters, ISO-639-2.' if langs.any? { |l| l.length != 3 }
28
+
29
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
30
+ frame.languages = langs
31
+ frame
32
+ end
33
+
34
+ def process_content(content)
35
+ languages_str = decode_using_encoding_byte(content)
36
+ @languages = languages_str.split("\x00").map(&:strip)
37
+ end
38
+
39
+ def content_to_bytes
40
+ @languages ||= ['und']
41
+ content = @languages.join("\x00")
42
+ content += "\x00" if @languages.length > 1
43
+ encode_and_add_encoding_byte(content)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class LengthFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TLE, :TLEN, :TLEN
10
+
11
+ attr_accessor :length
12
+
13
+ # builds the length frame
14
+ #
15
+ # @param length [String, Integer] the length in ms
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(length, options = nil, id3_version: 3)
21
+ supported?('TLEN', id3_version, options)
22
+
23
+ argument_not_nil(length, 'length')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.length = length.to_s
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @length = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@length)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class MediaTypeFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TMT, :TMED, :TMED
10
+
11
+ attr_accessor :media_type
12
+
13
+ # builds the media type frame
14
+ #
15
+ # @param media_type [String] the media type
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(media_type, options = nil, id3_version: 3)
21
+ supported?('TMED', id3_version, options)
22
+
23
+ argument_not_nil(media_type, 'media_type')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.media_type = media_type
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @media_type = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@media_type)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class OriginalAlbumFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TOT, :TOAL, :TOAL
10
+
11
+ attr_accessor :original_album
12
+
13
+ # builds the original album frame
14
+ #
15
+ # @param original_album [String] the original album
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(original_album, options = nil, id3_version: 3)
21
+ supported?('TOAL', id3_version, options)
22
+
23
+ argument_not_nil(original_album, 'original_album')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.original_album = original_album
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @original_album = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@original_album)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class OriginalFilenameFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TOF, :TOFN, :TOFN
10
+
11
+ attr_accessor :original_filename
12
+
13
+ # builds the original filename frame
14
+ #
15
+ # @param original_filename [String] the original filename
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(original_filename, options = nil, id3_version: 3)
21
+ supported?('TOFN', id3_version, options)
22
+
23
+ argument_not_nil(original_filename, 'original_filename')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.original_filename = original_filename
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @original_filename = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@original_filename)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class OriginalWritersFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TOL, :TOLY, :TOLY
10
+
11
+ attr_accessor :original_writers
12
+
13
+ # builds the original writers frame
14
+ #
15
+ # @param original_writers [Array<String>, String] the original writer(s)
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(original_writers, options = nil, id3_version: 3)
21
+ supported?('TOLY', id3_version, options)
22
+
23
+ argument_not_empty(original_writers, 'original_writers')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.original_writers = original_writers.is_a?(Array) ? original_writers : [original_writers]
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ writers_str = decode_using_encoding_byte(content)
32
+ @original_writers = writers_str.split('/').map(&:strip)
33
+ end
34
+
35
+ def content_to_bytes
36
+ @original_writers ||= ['[unset]']
37
+ content = @original_writers.join('/')
38
+ encode_and_add_encoding_byte(content)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class OriginalArtistsFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TOA, :TOPE, :TOPE
10
+
11
+ attr_accessor :original_artists
12
+
13
+ # builds the original artists frame
14
+ #
15
+ # @param original_artists [Array<String>, String] the original artist(s)
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(original_artists, options = nil, id3_version: 3)
21
+ supported?('TOPE', id3_version, options)
22
+
23
+ argument_not_empty(original_artists, 'original_artists')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.original_artists = original_artists.is_a?(Array) ? original_artists : [original_artists]
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ artists_str = decode_using_encoding_byte(content)
32
+ @original_artists = artists_str.split('/').map(&:strip)
33
+ end
34
+
35
+ def content_to_bytes
36
+ @original_artists ||= ['[unset]']
37
+ content = @original_artists.join('/')
38
+ encode_and_add_encoding_byte(content)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class OriginalReleaseYearFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :TOR, :TORY, :TORY
10
+
11
+ attr_accessor :original_release_year
12
+
13
+ # builds the original release year frame
14
+ #
15
+ # @param original_release_year [String, Integer] the original release year as a 4 character string, e.g. 2020
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(original_release_year, options = nil, id3_version: 3)
21
+ supported?('TORY', id3_version, options)
22
+
23
+ argument_not_nil(original_release_year, 'original_release_year')
24
+ original_release_year = original_release_year.to_s
25
+ argument_exactly_chars(original_release_year, 'original_release_year', 4)
26
+
27
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
28
+ frame.original_release_year = original_release_year
29
+ frame
30
+ end
31
+
32
+ def process_content(content)
33
+ @original_release_year = decode_using_encoding_byte(content)
34
+ end
35
+
36
+ def content_to_bytes
37
+ encode_and_add_encoding_byte(@original_release_year)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Text
6
+ class FileOwnerFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info nil, :TOWN, :TOWN
10
+
11
+ attr_accessor :file_owner
12
+
13
+ # builds the file owner frame
14
+ #
15
+ # @param file_owner [String] the file owner
16
+ # @param options [Options::Options] options to use
17
+ # @param id3_version [Integer] the id3 version to build the frame for
18
+ #
19
+ # @return [Id3v2Frame] the resulting id3v2 frame
20
+ def self.build_frame(file_owner, options = nil, id3_version: 3)
21
+ supported?('TOWN', id3_version, options)
22
+
23
+ argument_not_nil(file_owner, 'file_owner')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.file_owner = file_owner
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @file_owner = decode_using_encoding_byte(content)
32
+ end
33
+
34
+ def content_to_bytes
35
+ encode_and_add_encoding_byte(@file_owner)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end