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,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Tos
6
+ module Entities
7
+ class Ownership
8
+ include Extensions::Comparable
9
+
10
+ attr_accessor :price_paid, :date_of_purchase, :seller
11
+
12
+ # constructor
13
+ #
14
+ # @param price_paid [String] the paid price. e.g. $19.99
15
+ # @param date_of_purchase [String] date of purchase in the format YYYYMMDD
16
+ # @param seller [String] the seller
17
+ def initialize(price_paid, date_of_purchase, seller)
18
+ @price_paid = price_paid
19
+ @date_of_purchase = date_of_purchase
20
+ @seller = seller
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Tos
6
+ module Entities
7
+ class TermsOfUse
8
+ include Extensions::Comparable
9
+
10
+ attr_accessor :language, :text
11
+
12
+ # constructor
13
+ #
14
+ # @param language [String] the 3 character language of the terms of use
15
+ # @param text [String] the terms of use text
16
+ def initialize(language, text)
17
+ @language = language
18
+ @text = text
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Tos
6
+ class OwnershipFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info nil, :OWNE, :OWNE
10
+
11
+ attr_accessor :price_paid, :date_of_purchase, :seller
12
+
13
+ # builds the ownership frame
14
+ #
15
+ # @param price_paid [String] the paid price. e.g. $19.99
16
+ # @param date_of_purchase [String] date of purchase in the format YYYYMMDD
17
+ # @param seller [String] the seller
18
+ # @param options [Options::Options] options to use
19
+ # @param id3_version [Integer] the id3 version to build the frame for
20
+ #
21
+ # @return [Id3v2Frame] the resulting id3v2 frame
22
+ def self.build_frame(price_paid, date_of_purchase, seller, options = nil, id3_version: 3)
23
+ supported?('OWNE', id3_version, options)
24
+
25
+ argument_not_nil(price_paid, 'price_paid')
26
+ argument_not_nil(date_of_purchase, 'date_of_purchase')
27
+ argument_exactly_chars(date_of_purchase, 'date_of_purchase', 8)
28
+ argument_not_nil(seller, 'seller')
29
+
30
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
31
+ frame.price_paid = price_paid
32
+ frame.date_of_purchase = date_of_purchase
33
+ frame.seller = seller
34
+ frame
35
+ end
36
+
37
+ def process_content(content)
38
+ stream = StringIO.new(content)
39
+ encoding = find_encoding(stream.readbyte)
40
+ @price_paid = read_stream_until(stream, ZERO)
41
+ @date_of_purchase = stream.read(8)
42
+ encoded_seller = stream.read
43
+ @seller = decode(encoded_seller, encoding)
44
+ end
45
+
46
+ def content_to_bytes
47
+ encoded_seller = encode(@seller)
48
+ merge(default_encoding_destination_byte, @price_paid, "\x00", @date_of_purchase, encoded_seller)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Tos
6
+ class TermsOfUseFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info nil, :USER, :USER
10
+
11
+ attr_accessor :language, :text
12
+
13
+ # builds the terms of use frame
14
+ #
15
+ # @param language [String] the 3 character language of the terms of use
16
+ # @param text [String] the terms of use text
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(language, text, options = nil, id3_version: 3)
22
+ supported?('USER', id3_version, options)
23
+
24
+ argument_not_nil(language, 'language')
25
+ argument_exactly_chars(language, 'language', 3)
26
+ argument_not_nil(text, 'text')
27
+
28
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
29
+ frame.language = language
30
+ frame.text = text
31
+ frame
32
+ end
33
+
34
+ def process_content(content)
35
+ stream = StringIO.new(content)
36
+ encoding = find_encoding(stream.readbyte)
37
+ @language = stream.read(3)
38
+ encoded_text = stream.read
39
+ @text = decode(encoded_text, encoding)
40
+ end
41
+
42
+ def content_to_bytes
43
+ encoded_text = encode(@text)
44
+ merge(default_encoding_destination_byte, @language, encoded_text)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module ToSFrames
6
+ include Frames::Frameable
7
+
8
+ # extracts the terms of use frame (USER)
9
+ #
10
+ # @return [Frames::Tos::Entities::TermsOfUse, nil] returns the ToU Frame
11
+ def terms_of_use
12
+ frame = find_frame(Tos::TermsOfUseFrame.frame_id(@major_version, @options))
13
+ return nil if frame.nil?
14
+
15
+ Frames::Tos::Entities::TermsOfUse.new(frame.language, frame.text)
16
+ end
17
+
18
+ # sets the terms of use frame (USER)
19
+ #
20
+ # @param tou [Frames::Tos::Entities::TermsOfUse] the ToU
21
+ def terms_of_use=(tou)
22
+ set_frame_fields(Tos::TermsOfUseFrame, %i[@language @text], tou.language, tou.text)
23
+ end
24
+
25
+ # removes the terms of use frame
26
+ def remove_terms_of_use
27
+ @frames.delete_if { |f| f.frame_id == Tos::TermsOfUseFrame.frame_id(@major_version, @options) }
28
+ end
29
+
30
+ # extracts the ownership frame (OWNE)
31
+ #
32
+ # @return [Frames::Tos::Entities::Ownership, nil] returns the Ownership Frame
33
+ def ownership
34
+ frame = find_frame(Tos::OwnershipFrame.frame_id(@major_version, @options))
35
+ return nil if frame.nil?
36
+
37
+ Frames::Tos::Entities::Ownership.new(frame.price_paid, frame.date_of_purchase, frame.seller)
38
+ end
39
+
40
+ # sets the ownership frame (OWNE)
41
+ #
42
+ # @param ownership [Frames::Tos::Entities::Ownership] the Ownership
43
+ def ownership=(ownership)
44
+ set_frame_fields(Tos::OwnershipFrame, %i[@price_paid @date_of_purchase @seller],
45
+ ownership.price_paid, ownership.date_of_purchase, ownership.seller)
46
+ end
47
+
48
+ # removes the ownership frame
49
+ def remove_ownership
50
+ @frames.delete_if { |f| f.frame_id == Tos::OwnershipFrame.frame_id(@major_version, @options) }
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Ufid
6
+ module Entities
7
+ class UfidInfo
8
+ include Extensions::Comparable
9
+
10
+ attr_accessor :owner_id, :identifier
11
+
12
+ # constructor
13
+ #
14
+ # @param owner_id [String] the owner id
15
+ # @param identifier [String] the identifier bytes represented as a String (str.bytes)
16
+ def initialize(owner_id, identifier)
17
+ @owner_id = owner_id
18
+ @identifier = identifier
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Ufid
6
+ class UniqueFileIdentifierFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :UFI, :UFID, :UFID
10
+
11
+ attr_accessor :owner_id, :identifier
12
+
13
+ # builds the unique file identifier frame
14
+ #
15
+ # @param owner_id [String] the owner id
16
+ # @param identifier [String] the identifier bytes represented as a String (str.bytes)
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(owner_id, identifier, options = nil, id3_version: 3)
22
+ supported?('UFID', id3_version, options)
23
+
24
+ argument_not_nil(owner_id, 'owner_id')
25
+ argument_not_nil(identifier, 'identifier')
26
+
27
+ argument_less_than_chars(identifier, 'identifier', 64)
28
+
29
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
30
+ frame.owner_id = owner_id
31
+ frame.identifier = identifier
32
+ frame
33
+ end
34
+
35
+ def process_content(content)
36
+ stream = StringIO.new(content)
37
+ @owner_id = read_stream_until(stream, ZERO)
38
+ @identifier = stream.read
39
+ end
40
+
41
+ def content_to_bytes
42
+ "#{@owner_id}\x00#{@identifier}"
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module UfidFrames
6
+ include Frames::Frameable
7
+
8
+ # extracts the unique file identifier (UFID/UFI)
9
+ #
10
+ # @return [Array<Frames::Ufid::Entities::UfidInfo>] returns the Unique File Identifier
11
+ def unique_file_identifiers
12
+ frame = find_frames(Ufid::UniqueFileIdentifierFrame.frame_id(@major_version, @options))
13
+ return [] if frame.nil? || frame.empty?
14
+
15
+ frame.map { |f| Ufid::Entities::UfidInfo.new(f.owner_id, f.identifier) }
16
+ end
17
+
18
+ # adds a comment (UFID/UFI)
19
+ # Multiple ones can be added, as long as they have different owner_id
20
+ #
21
+ # @param identifier [Frames::Ufid::Entities::UfidInfo] the unique file identifier to add
22
+ def unique_file_identifiers=(identifier)
23
+ set_frame_fields_by_selector(Ufid::UniqueFileIdentifierFrame, %i[@owner_id @identifier],
24
+ ->(f) { f.owner_id == identifier.owner_id },
25
+ identifier.owner_id, identifier.identifier)
26
+ end
27
+
28
+ alias add_unique_file_identifier unique_file_identifiers=
29
+
30
+ # removes a unique file identifier for the specific owner_id
31
+ #
32
+ # @param owner_id [String] the owner_id
33
+ def remove_unique_file_identifier(owner_id)
34
+ @frames.delete_if do |f|
35
+ f.frame_id == Ufid::UniqueFileIdentifierFrame.frame_id(@major_version, @options) && f.owner_id == owner_id
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Url
6
+ module Entities
7
+ class UserInfo
8
+ include Extensions::Comparable
9
+
10
+ attr_accessor :description, :url
11
+
12
+ # constructor
13
+ #
14
+ # @param description [String] the description
15
+ # @param url [String] the url
16
+ def initialize(description, url)
17
+ @description = description
18
+ @url = url
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Id3Taginator
4
+ module Frames
5
+ module Url
6
+ class CommercialUrlFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :WCM, :WCOM, :WCOM
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the commercial use frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WCOM', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class CopyrightUrlFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :WCP, :WCOP, :WCOP
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the copyright url frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WCOP', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class OfficialFileWebpageFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :WAF, :WOAF, :WOAF
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the official file webpage frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WOAF', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class OfficialArtistWebpageFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :WAR, :WOAR, :WOAR
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the official artist webpage frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WOAR', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class OfficialSourceWebpageFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :WAS, :WOAS, :WOAS
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the official source webpage frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WOAS', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class OfficialAudioRadioStationHomepageFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info nil, :WORS, :WORS
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the official audio ration station homepage frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WORS', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class PaymentUrlFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info nil, :WPAY, :WPAY
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the payment url frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WPAY', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
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 Url
6
+ class OfficialPublisherWebpageFrame < Id3v2Frame
7
+ include HasId
8
+
9
+ frame_info :WPB, :WPUB, :WPUB
10
+
11
+ attr_accessor :url
12
+
13
+ # builds the official publisher webpage frame
14
+ #
15
+ # @param url [String] the url
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(url, options = nil, id3_version: 3)
21
+ supported?('WPUB', id3_version, options)
22
+
23
+ argument_not_nil(url, 'url')
24
+
25
+ frame = new(frame_id(id3_version, options), 0, build_id3_flags(id3_version), '')
26
+ frame.url = url
27
+ frame
28
+ end
29
+
30
+ def process_content(content)
31
+ @url = content
32
+ end
33
+
34
+ def content_to_bytes
35
+ @url
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end