Skip to content

Commit 208d5d1

Browse files
committed
itunes: add support for <itunes:episodeType>
GitHub: fix GH-45 Reported by Tim Uckun. Thanks!!!
1 parent c354b0c commit 208d5d1

5 files changed

Lines changed: 100 additions & 6 deletions

File tree

lib/rss/itunes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ def append_features(klass)
265265
["image", :attribute, "href"],
266266
["season", :positive_integer],
267267
["episode", :positive_integer],
268+
["episodeType", :itunes_episode_type],
268269
["title"],
269270
]
270271

lib/rss/maker/itunes.rb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ def def_class_accessor(klass, name, type, *args)
1515
def_yes_other_accessor(klass, full_name)
1616
when :explicit_clean_other
1717
def_explicit_clean_other_accessor(klass, full_name)
18-
when :itunes_episode
19-
def_itunes_episode_accessor(klass, full_name)
18+
when :positive_integer, :itunes_episode, :itunes_episode_type
19+
klass.def_other_element(full_name)
2020
when :csv
2121
def_csv_accessor(klass, full_name)
2222
when :element, :attribute
@@ -54,10 +54,6 @@ def #{full_name}?
5454
EOC
5555
end
5656

57-
def def_itunes_episode_accessor(klass, full_name)
58-
klass.def_other_element(full_name)
59-
end
60-
6157
def def_csv_accessor(klass, full_name)
6258
klass.def_csv_element(full_name)
6359
end

lib/rss/rss.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,18 @@ def #{name}=(new_value)
589589
EOC
590590
end
591591

592+
def itunes_episode_type_writer(name, disp_name=name)
593+
module_eval(<<-DEF, *get_file_and_line_from_caller(2))
594+
def #{name}=(new_value)
595+
if @do_validate and
596+
!["Full", "Trailer", "Bonus", nil].include?(new_value)
597+
raise NotAvailableValueError.new('#{disp_name}', new_value)
598+
end
599+
@#{name} = new_value
600+
end
601+
DEF
602+
end
603+
592604
def def_children_accessor(accessor_name, plural_name)
593605
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
594606
def #{plural_name}
@@ -780,6 +792,8 @@ def def_corresponded_attr_writer(name, type=nil, disp_name=nil)
780792
csv_integer_writer name, disp_name
781793
when :itunes_episode
782794
itunes_episode_writer name, disp_name
795+
when :itunes_episode_type
796+
itunes_episode_type_writer name, disp_name
783797
else
784798
attr_writer name
785799
end

test/test-itunes.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ def test_episode
117117
end
118118
end
119119

120+
def test_episodeType
121+
assert_itunes_episodeType(%w(items last)) do |content, xmlns|
122+
make_rss20(make_channel20(make_item20(content)), xmlns)
123+
end
124+
end
125+
120126
def test_title
121127
assert_itunes_title(%w(channel)) do |content, xmlns|
122128
make_rss20(make_channel20(content), xmlns)
@@ -439,6 +445,23 @@ def assert_itunes_episode(readers, &rss20_maker)
439445
end
440446
end
441447

448+
def set_itunes_episodeType(episode_type, readers, &rss20_maker)
449+
content = tag("itunes:episodeType", episode_type)
450+
rss20 = itunes_rss20_parse(content, &rss20_maker)
451+
target = chain_reader(rss20, readers)
452+
target.itunes_episodeType
453+
end
454+
455+
def assert_itunes_episodeType(readers, &rss20_maker)
456+
_wrap_assertion do
457+
assert_equal("Trailer",
458+
set_itunes_episodeType("Trailer", readers, &rss20_maker))
459+
assert_raise(NotAvailableValueError.new("episodeType", "Unknown")) do
460+
set_itunes_episodeType("Unknown", readers, &rss20_maker)
461+
end
462+
end
463+
end
464+
442465
def assert_itunes_title(readers, &rss20_maker)
443466
_wrap_assertion do
444467
title = "Interview with John Lennon"

test/test-maker-itunes.rb

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ def test_summary
6060
assert_maker_itunes_summary(%w(items last))
6161
end
6262

63+
def test_season
64+
assert_maker_itunes_season(%w(items last))
65+
end
66+
67+
def test_episode
68+
assert_maker_itunes_episode(%w(items last))
69+
end
70+
71+
def test_episodeType
72+
assert_maker_itunes_episodeType(%w(items last))
73+
end
74+
6375
def test_title
6476
assert_maker_itunes_title(%w(channel))
6577
assert_maker_itunes_title(%w(items last))
@@ -508,6 +520,54 @@ def assert_maker_itunes_summary(maker_readers, feed_readers=nil)
508520
end
509521
end
510522

523+
def assert_maker_itunes_season(maker_readers, feed_readers=nil)
524+
_wrap_assertion do
525+
feed_readers ||= maker_readers
526+
season = 1
527+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
528+
setup_dummy_channel(maker)
529+
setup_dummy_item(maker)
530+
531+
target = chain_reader(maker, maker_readers)
532+
target.itunes_season = season
533+
end
534+
target = chain_reader(rss20, feed_readers)
535+
assert_equal(season, target.itunes_season)
536+
end
537+
end
538+
539+
def assert_maker_itunes_episode(maker_readers, feed_readers=nil)
540+
_wrap_assertion do
541+
feed_readers ||= maker_readers
542+
episode = 1
543+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
544+
setup_dummy_channel(maker)
545+
setup_dummy_item(maker)
546+
547+
target = chain_reader(maker, maker_readers)
548+
target.itunes_episode = episode
549+
end
550+
target = chain_reader(rss20, feed_readers)
551+
assert_equal(episode, target.itunes_episode)
552+
end
553+
end
554+
555+
def assert_maker_itunes_episodeType(maker_readers, feed_readers=nil)
556+
_wrap_assertion do
557+
feed_readers ||= maker_readers
558+
episodeType = "Trailer"
559+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
560+
setup_dummy_channel(maker)
561+
setup_dummy_item(maker)
562+
563+
target = chain_reader(maker, maker_readers)
564+
target.itunes_episodeType = episodeType
565+
end
566+
target = chain_reader(rss20, feed_readers)
567+
assert_equal(episodeType, target.itunes_episodeType)
568+
end
569+
end
570+
511571
def assert_maker_itunes_title(maker_readers, feed_readers=nil)
512572
_wrap_assertion do
513573
feed_readers ||= maker_readers

0 commit comments

Comments
 (0)