acme-smileage 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +3 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +215 -0
  7. data/Rakefile +9 -0
  8. data/acme-smileage.gemspec +29 -0
  9. data/bin/smileage +3 -0
  10. data/lib/acme/smileage/blog/ameblo.rb +49 -0
  11. data/lib/acme/smileage/blog/ameblo_downloader.rb +171 -0
  12. data/lib/acme/smileage/blog/entry.rb +51 -0
  13. data/lib/acme/smileage/commands/base.rb +10 -0
  14. data/lib/acme/smileage/commands/oricon.rb +47 -0
  15. data/lib/acme/smileage/commands/soundscan.rb +18 -0
  16. data/lib/acme/smileage/commands.rb +16 -0
  17. data/lib/acme/smileage/discography/albums/2009/I001_amanojaku.rb +35 -0
  18. data/lib/acme/smileage/discography/albums/2009/I002_asuha_date_nanoni_imasugu_koe_ga_kikitai.rb +35 -0
  19. data/lib/acme/smileage/discography/albums/2009/I003_sukichan.rb +35 -0
  20. data/lib/acme/smileage/discography/albums/2010/A001_waru_gaki_(1).rb +50 -0
  21. data/lib/acme/smileage/discography/albums/2010/D001_yumemiru_15sai_(pax_japonica_groove_remix).rb +35 -0
  22. data/lib/acme/smileage/discography/albums/2010/D002_gambaranakutemo_eenende_(topnude_remix_version_01).rb +35 -0
  23. data/lib/acme/smileage/discography/albums/2010/D003_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama_(remix_type1).rb +35 -0
  24. data/lib/acme/smileage/discography/albums/2010/I004_otona_ni_narutte_muzukashii.rb +35 -0
  25. data/lib/acme/smileage/discography/albums/2010/S001_yumemiru_15sai.rb +42 -0
  26. data/lib/acme/smileage/discography/albums/2010/S002_gambaranakutemo_eenende.rb +47 -0
  27. data/lib/acme/smileage/discography/albums/2010/S003_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama.rb +46 -0
  28. data/lib/acme/smileage/discography/albums/2011/D004_shortcut_(remixver).rb +35 -0
  29. data/lib/acme/smileage/discography/albums/2011/D005_uchouten_love_rocketman_mix.rb +35 -0
  30. data/lib/acme/smileage/discography/albums/2011/S004_shortcut.rb +51 -0
  31. data/lib/acme/smileage/discography/albums/2011/S005_koi_ni_booing_boo.rb +51 -0
  32. data/lib/acme/smileage/discography/albums/2011/S006_uchouten_love.rb +51 -0
  33. data/lib/acme/smileage/discography/albums/2011/S007_tachiagirl.rb +56 -0
  34. data/lib/acme/smileage/discography/albums/2011/S008_please_minisuka_post_woman.rb +52 -0
  35. data/lib/acme/smileage/discography/albums/2012/A002_smleage_best_album_complete_(1).rb +54 -0
  36. data/lib/acme/smileage/discography/albums/2012/S009_choto_mate_kudasai.rb +52 -0
  37. data/lib/acme/smileage/discography/albums/2012/S010_dotbikini.rb +51 -0
  38. data/lib/acme/smileage/discography/albums/2012/S011_sukiyo_junjou_hankouki.rb +50 -0
  39. data/lib/acme/smileage/discography/albums/2012/S012_samuine.rb +50 -0
  40. data/lib/acme/smileage/discography/albums/2013/A003_(2)_smile_sensation.rb +48 -0
  41. data/lib/acme/smileage/discography/albums/2013/S013_tabidachi_no_haru_ga_kita.rb +50 -0
  42. data/lib/acme/smileage/discography/albums/2013/S014_atarashii_watashini_nare_yattaruchan.rb +50 -0
  43. data/lib/acme/smileage/discography/albums/2013/S015_eeka_iiyatsu.rb +50 -0
  44. data/lib/acme/smileage/discography/albums/2014/S016_mystery_night_eighteen_emotion.rb +54 -0
  45. data/lib/acme/smileage/discography/albums/base.rb +37 -0
  46. data/lib/acme/smileage/discography/albums.rb +28 -0
  47. data/lib/acme/smileage/discography/hello_project_music_award.rb +22 -0
  48. data/lib/acme/smileage/discography/lyrics_downloader.rb +48 -0
  49. data/lib/acme/smileage/discography/sales.rb +43 -0
  50. data/lib/acme/smileage/discography/tracks/2009/001_amanojaku.rb +57 -0
  51. data/lib/acme/smileage/discography/tracks/2009/002_asuha_date_nanoni_imasugu_koe_ga_kikitai.rb +57 -0
  52. data/lib/acme/smileage/discography/tracks/2009/003_sukichan.rb +57 -0
  53. data/lib/acme/smileage/discography/tracks/2010/004_otona_ni_narutte_muzukashii.rb +57 -0
  54. data/lib/acme/smileage/discography/tracks/2010/005_yumemiru_15sai.rb +77 -0
  55. data/lib/acme/smileage/discography/tracks/2010/006_thank_you_creme_brulee_no_yuujou.rb +37 -0
  56. data/lib/acme/smileage/discography/tracks/2010/007_yumemiru_15sai_(pax_japonica_groove_remix).rb +38 -0
  57. data/lib/acme/smileage/discography/tracks/2010/008_gambaranakutemo_eenende.rb +85 -0
  58. data/lib/acme/smileage/discography/tracks/2010/009_gambaranakutemo_iindayo.rb +44 -0
  59. data/lib/acme/smileage/discography/tracks/2010/010_smile_bijin.rb +36 -0
  60. data/lib/acme/smileage/discography/tracks/2010/011_gambaranakutemo_eenende_(topnude_remix_version_01).rb +38 -0
  61. data/lib/acme/smileage/discography/tracks/2010/012_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama.rb +85 -0
  62. data/lib/acme/smileage/discography/tracks/2010/013_chokotto_love.rb +38 -0
  63. data/lib/acme/smileage/discography/tracks/2010/014_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama_(remix_type1).rb +38 -0
  64. data/lib/acme/smileage/discography/tracks/2010/015_odorouyo.rb +36 -0
  65. data/lib/acme/smileage/discography/tracks/2010/016_onna_bakari_no_nichiyoubi.rb +36 -0
  66. data/lib/acme/smileage/discography/tracks/2010/017_shooting_star.rb +36 -0
  67. data/lib/acme/smileage/discography/tracks/2010/018_gakkyuu_iinchou.rb +36 -0
  68. data/lib/acme/smileage/discography/tracks/2010/019_shikkari_shiteyo_mou.rb +36 -0
  69. data/lib/acme/smileage/discography/tracks/2011/020_shortcut.rb +69 -0
  70. data/lib/acme/smileage/discography/tracks/2011/021_panyasan_no_arbeit.rb +36 -0
  71. data/lib/acme/smileage/discography/tracks/2011/022_otome_pasta_ni_kandou.rb +38 -0
  72. data/lib/acme/smileage/discography/tracks/2011/023_koi_ni_booing_boo.rb +69 -0
  73. data/lib/acme/smileage/discography/tracks/2011/024_hatukoi_no_anatahe.rb +36 -0
  74. data/lib/acme/smileage/discography/tracks/2011/025_koi_wo_shichaimashita.rb +38 -0
  75. data/lib/acme/smileage/discography/tracks/2011/026_uchouten_love.rb +77 -0
  76. data/lib/acme/smileage/discography/tracks/2011/027_jitensha_chiririn.rb +36 -0
  77. data/lib/acme/smileage/discography/tracks/2011/028_chu_natsu_party.rb +38 -0
  78. data/lib/acme/smileage/discography/tracks/2011/029_shortcut_(remixver).rb +37 -0
  79. data/lib/acme/smileage/discography/tracks/2011/030_uchouten_love_rocketman_mix.rb +38 -0
  80. data/lib/acme/smileage/discography/tracks/2011/031_tachiagirl.rb +73 -0
  81. data/lib/acme/smileage/discography/tracks/2011/032_smile_ondon.rb +35 -0
  82. data/lib/acme/smileage/discography/tracks/2011/033_boogie_train11.rb +38 -0
  83. data/lib/acme/smileage/discography/tracks/2011/034_smileage_singles_gekimoe_remix.rb +35 -0
  84. data/lib/acme/smileage/discography/tracks/2011/035_please_minisuka_post_woman.rb +45 -0
  85. data/lib/acme/smileage/discography/tracks/2011/036_konnichiwa_konbanwa.rb +36 -0
  86. data/lib/acme/smileage/discography/tracks/2011/037_smileage_singles_gekiyaba_remix.rb +35 -0
  87. data/lib/acme/smileage/discography/tracks/2011/038_tewo_nigitte_arukitai.rb +38 -0
  88. data/lib/acme/smileage/discography/tracks/2012/039_choto_mate_kudasai.rb +45 -0
  89. data/lib/acme/smileage/discography/tracks/2012/040_chance_tourai.rb +36 -0
  90. data/lib/acme/smileage/discography/tracks/2012/041_smileage_singles_gekiatsu_remix.rb +35 -0
  91. data/lib/acme/smileage/discography/tracks/2012/042_namida_girl.rb +38 -0
  92. data/lib/acme/smileage/discography/tracks/2012/043_dotbikini.rb +45 -0
  93. data/lib/acme/smileage/discography/tracks/2012/044_smile_blues.rb +36 -0
  94. data/lib/acme/smileage/discography/tracks/2012/045_koibito_ha_kokoro_no_ouendan.rb +38 -0
  95. data/lib/acme/smileage/discography/tracks/2012/046_kiiroi_jitensha_to_sandwich.rb +36 -0
  96. data/lib/acme/smileage/discography/tracks/2012/047_sukiyo_junjou_hankouki.rb +45 -0
  97. data/lib/acme/smileage/discography/tracks/2012/048_kimi_ha_jitensha_watasi_ha_densya_de_kitaku.rb +38 -0
  98. data/lib/acme/smileage/discography/tracks/2012/049_samuine.rb +49 -0
  99. data/lib/acme/smileage/discography/tracks/2012/050_watashi_choito_kawaii_urabancho.rb +36 -0
  100. data/lib/acme/smileage/discography/tracks/2013/051_tabidachi_no_haru_ga_kita.rb +45 -0
  101. data/lib/acme/smileage/discography/tracks/2013/052_doushiyou.rb +36 -0
  102. data/lib/acme/smileage/discography/tracks/2013/053_shin_nihon_no_susume.rb +36 -0
  103. data/lib/acme/smileage/discography/tracks/2013/054_otona_no_tochuu.rb +36 -0
  104. data/lib/acme/smileage/discography/tracks/2013/055_tenshin_ramman.rb +36 -0
  105. data/lib/acme/smileage/discography/tracks/2013/056_watashi_no_kokoro.rb +36 -0
  106. data/lib/acme/smileage/discography/tracks/2013/057_yuugure_koi_no_jikan.rb +36 -0
  107. data/lib/acme/smileage/discography/tracks/2013/058_nee_sempai.rb +36 -0
  108. data/lib/acme/smileage/discography/tracks/2013/059_sayonara_sayonara_sayonara.rb +36 -0
  109. data/lib/acme/smileage/discography/tracks/2013/060_atarashii_watashini_nare.rb +45 -0
  110. data/lib/acme/smileage/discography/tracks/2013/061_yattaruchan.rb +45 -0
  111. data/lib/acme/smileage/discography/tracks/2013/062_eeka.rb +44 -0
  112. data/lib/acme/smileage/discography/tracks/2013/063_iiyatsu.rb +44 -0
  113. data/lib/acme/smileage/discography/tracks/2014/064_mystery_night.rb +44 -0
  114. data/lib/acme/smileage/discography/tracks/2014/065_eighteen_emotion.rb +44 -0
  115. data/lib/acme/smileage/discography/tracks/base.rb +39 -0
  116. data/lib/acme/smileage/discography/tracks.rb +65 -0
  117. data/lib/acme/smileage/discography.rb +101 -0
  118. data/lib/acme/smileage/members/base.rb +56 -0
  119. data/lib/acme/smileage/members/fukuda_kanon.rb +29 -0
  120. data/lib/acme/smileage/members/katsuta_rina.rb +29 -0
  121. data/lib/acme/smileage/members/kosuga_fuyuka.rb +29 -0
  122. data/lib/acme/smileage/members/maeda_yuuka.rb +29 -0
  123. data/lib/acme/smileage/members/nakanishi_kana.rb +29 -0
  124. data/lib/acme/smileage/members/ogawa_saki.rb +29 -0
  125. data/lib/acme/smileage/members/takeuchi_akari.rb +29 -0
  126. data/lib/acme/smileage/members/tamura_meimi.rb +29 -0
  127. data/lib/acme/smileage/members/wada_ayaka.rb +29 -0
  128. data/lib/acme/smileage/members.rb +40 -0
  129. data/lib/acme/smileage/utils/base_downloader.rb +38 -0
  130. data/lib/acme/smileage/utils/matcher.rb +64 -0
  131. data/lib/acme/smileage/version.rb +5 -0
  132. data/lib/acme/smileage/version.rb~ +5 -0
  133. data/lib/acme/smileage.rb +55 -0
  134. data/test/acme/test_album.rb +204 -0
  135. data/test/acme/test_member.rb +45 -0
  136. data/test/acme/test_smileage.rb +144 -0
  137. data/test/acme/test_track.rb +57 -0
  138. data/test/minitest_helper.rb +5 -0
  139. metadata +287 -0
@@ -0,0 +1,101 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/utils/matcher"
4
+ require "acme/smileage/discography/albums"
5
+ require "acme/smileage/discography/tracks"
6
+
7
+ module Acme
8
+ class Smileage
9
+ class Discography
10
+ def initialize
11
+ album Acme::Smileage::Discography::Albums::Amanojaku
12
+ album Acme::Smileage::Discography::Albums::AsuhaDateNanoniImasuguKoeGaKikitai
13
+ album Acme::Smileage::Discography::Albums::Sukichan
14
+ album Acme::Smileage::Discography::Albums::OtonaNiNarutteMuzukashii
15
+ album Acme::Smileage::Discography::Albums::Yumemiru15sai
16
+ album Acme::Smileage::Discography::Albums::Yumemiru15saiPaxJaponicaGrooveRemix
17
+ album Acme::Smileage::Discography::Albums::GambaranakutemoEenende
18
+ album Acme::Smileage::Discography::Albums::GambaranakutemoEenendeTopnudeRemixVersion01
19
+ album Acme::Smileage::Discography::Albums::OnajiJikyuuDeHatarakuTomodachiNoBijinMama
20
+ album Acme::Smileage::Discography::Albums::OnajiJikyuuDeHatarakuTomodachiNoBijinMamaRemixType1
21
+ album Acme::Smileage::Discography::Albums::WaruGaki1
22
+ album Acme::Smileage::Discography::Albums::Shortcut
23
+ album Acme::Smileage::Discography::Albums::KoiNiBooingBoo
24
+ album Acme::Smileage::Discography::Albums::UchoutenLove
25
+ album Acme::Smileage::Discography::Albums::ShortcutRemixver
26
+ album Acme::Smileage::Discography::Albums::UchoutenLoverocketmanMix
27
+ album Acme::Smileage::Discography::Albums::Tachiagirl
28
+ album Acme::Smileage::Discography::Albums::PleaseMinisukaPostWoman
29
+ album Acme::Smileage::Discography::Albums::ChotoMateKudasai
30
+ album Acme::Smileage::Discography::Albums::Dotbikini
31
+ album Acme::Smileage::Discography::Albums::SmleageBestAlbumComplete1
32
+ album Acme::Smileage::Discography::Albums::SukiyoJunjouHankouki
33
+ album Acme::Smileage::Discography::Albums::Samuine
34
+ album Acme::Smileage::Discography::Albums::TabidachiNoHaruGaKita
35
+ album Acme::Smileage::Discography::Albums::SmileSensation
36
+ album Acme::Smileage::Discography::Albums::AtarashiiWatashiniNare_Yattaruchan
37
+ album Acme::Smileage::Discography::Albums::Eeka_Iiyatsu
38
+ album Acme::Smileage::Discography::Albums::MysteryNight_EighteenEmotion
39
+
40
+ initialize_tracks
41
+ end
42
+
43
+ def discography(&block)
44
+ if block
45
+ @albums.select(&block)
46
+ else
47
+ @albums.dup
48
+ end
49
+ end
50
+
51
+ def tracks(&block)
52
+ if block
53
+ @tracks.select(&block)
54
+ else
55
+ @tracks.dup
56
+ end
57
+ end
58
+
59
+ def find_discography(name)
60
+ find("Discography", name, @albums)
61
+ end
62
+
63
+ def find_track(name)
64
+ find("Track", name, @tracks)
65
+ end
66
+
67
+ def oricon_total_sales(&block)
68
+ albums = block ? @albums.select(&block) : @albums
69
+ albums.inject(0) {|sum,e|
70
+ if e.oricon
71
+ sum + e.oricon.total_sales
72
+ else
73
+ sum
74
+ end
75
+ }
76
+ end
77
+
78
+ private
79
+
80
+ def find(label, name, targets)
81
+ matcher = Acme::Smileage::Utils::Matcher.new(name.encode("UTF-8"))
82
+ canon_name = matcher.match(targets.map {|e| names(e) }.flatten)
83
+ raise ArgumentError, "#{label} not found: #{name}" unless canon_name
84
+ targets.find {|e| names(e).include?(canon_name) }
85
+ end
86
+
87
+ def names(obj)
88
+ [obj.name, obj.name_romaji] | obj.nicknames
89
+ end
90
+
91
+ def initialize_tracks
92
+ @tracks = @albums.sort_by {|e| e.release_date }.map{|e| e.tracks }.flatten.uniq
93
+ end
94
+
95
+ def album(album_class)
96
+ @albums ||= []
97
+ @albums << album_class.instance
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,56 @@
1
+ require "date"
2
+
3
+ require "acme/smileage/blog/ameblo"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class Base
9
+ attr_reader :family_name_ja, :first_name_ja
10
+ attr_reader :family_name_en, :first_name_en
11
+ attr_reader :birthday, :blood_type, :hometown
12
+ attr_reader :emoticon, :nicknames, :member_color, :blog_link, :twitter_accounts
13
+ attr_reader :generation, :join_date, :graduate_date
14
+
15
+ alias :nick :nicknames # compat for Acme::MomoiroClover
16
+ alias :color :member_color # ditto
17
+
18
+ def name_ja
19
+ self.family_name_ja + self.first_name_ja
20
+ end
21
+
22
+ def name_en
23
+ self.first_name_en + " " + self.family_name_en
24
+ end
25
+ alias :name :name_en
26
+
27
+ def age(date=nil)
28
+ date ||= Date.today
29
+ a = date.strftime("%Y%m%d").to_i
30
+ b = self.birthday.strftime("%Y%m%d").to_i
31
+ (a - b) / 10000
32
+ end
33
+
34
+ def active?(date=nil)
35
+ date ||= Date.today
36
+ if self.graduate_date
37
+ self.join_date <= date and date <= self.graduate_date
38
+ else
39
+ self.join_date <= date
40
+ end
41
+ end
42
+
43
+ def graduated?(date=nil)
44
+ return false unless self.graduate_date
45
+
46
+ date ||= Date.today
47
+ self.graduate_date < date
48
+ end
49
+
50
+ def blog
51
+ @blog ||= Acme::Smileage::Blog::Ameblo.new(self.blog_link, self.family_name_en)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class FukudaKanon < Base
9
+ def initialize
10
+ @family_name_ja = "福田"
11
+ @first_name_ja = "花音"
12
+ @family_name_en = "Fukuda"
13
+ @first_name_en = "Kanon"
14
+ @birthday = Date.new(1995, 3, 12)
15
+ @blood_type = "A"
16
+ @hometown = "埼玉"
17
+ @emoticon = "从*・ェ・リ"
18
+ @nicknames = ["かにょん"]
19
+ @member_color = "Purple"
20
+ @generation = 1
21
+ @join_date = Date.new(2009, 4, 4)
22
+ @graduate_date = nil
23
+ @blog_link = "http://ameblo.jp/kanon-fukuda/"
24
+ @twitter_accounts = ["@kanonfukuda", "@smileage_715"]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class KatsutaRina < Base
9
+ def initialize
10
+ @family_name_ja = "勝田"
11
+ @first_name_ja = "里奈"
12
+ @family_name_en = "Katsuta"
13
+ @first_name_en = "Rina"
14
+ @birthday = Date.new(1998, 4, 6)
15
+ @blood_type = "A"
16
+ @hometown = "東京"
17
+ @emoticon = "リナp´ v`)"
18
+ @nicknames = ["りなぷ~"]
19
+ @member_color = "Yellow"
20
+ @generation = 2
21
+ @join_date = Date.new(2011, 8, 14)
22
+ @graduate_date = nil
23
+ @blog_link = "http://ameblo.jp/smileage-submember/"
24
+ @twitter_accounts = ["@smileage_newmem", "@smileage_715"]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class KosugaFuyuka < Base
9
+ def initialize
10
+ @family_name_ja = "小数賀"
11
+ @first_name_ja = "芙由香"
12
+ @family_name_en = "Kosuga"
13
+ @first_name_en = "Fuyuka"
14
+ @birthday = Date.new(1997, 11, 19)
15
+ @blood_type = "O"
16
+ @hometown = "神奈川"
17
+ @emoticon = "从´’_l ’从"
18
+ @nicknames = ["ふ~ちゃん"]
19
+ @member_color = "Orange"
20
+ @generation = 2
21
+ @join_date = Date.new(2011, 8, 14)
22
+ @graduate_date = Date.new(2011, 9, 9)
23
+ @blog_link = nil
24
+ @twitter_accounts = []
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class MaedaYuuka < Base
9
+ def initialize
10
+ @family_name_ja = "前田"
11
+ @first_name_ja = "憂佳"
12
+ @family_name_en = "Maeda"
13
+ @first_name_en = "Yuuka"
14
+ @birthday = Date.new(1994, 12, 24)
15
+ @blood_type = "B"
16
+ @hometown = "千葉"
17
+ @emoticon = "川*´ c`)"
18
+ @nicknames = ["ゆうかりん"]
19
+ @member_color = "Pink"
20
+ @generation = 1
21
+ @join_date = Date.new(2009, 4, 4)
22
+ @graduate_date = Date.new(2011, 12, 31)
23
+ @blog_link = nil
24
+ @twitter_accounts = []
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class NakanishiKana < Base
9
+ def initialize
10
+ @family_name_ja = "中西"
11
+ @first_name_ja = "香菜"
12
+ @family_name_en = "Nakanishi"
13
+ @first_name_en = "Kana"
14
+ @birthday = Date.new(1997, 6, 4)
15
+ @blood_type = "A"
16
+ @hometown = "大阪"
17
+ @emoticon = "川*⌒v⌒)"
18
+ @nicknames = ["かななん"]
19
+ @member_color = "Sky Blue"
20
+ @generation = 2
21
+ @join_date = Date.new(2011, 8, 14)
22
+ @graduate_date = nil
23
+ @blog_link = "http://ameblo.jp/smileage-submember/"
24
+ @twitter_accounts = ["@smileage_newmem", "@smileage_715"]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class OgawaSaki < Base
9
+ def initialize
10
+ @family_name_ja = "小川"
11
+ @first_name_ja = "紗季"
12
+ @family_name_en = "Ogawa"
13
+ @first_name_en = "Saki"
14
+ @birthday = Date.new(1996, 11, 18)
15
+ @blood_type = "A"
16
+ @hometown = "埼玉"
17
+ @emoticon = "|||s・ _・)"
18
+ @nicknames = ["サキチィー"]
19
+ @member_color = "Light Green"
20
+ @generation = 1
21
+ @join_date = Date.new(2009, 4, 4)
22
+ @graduate_date = Date.new(2011, 8, 27)
23
+ @blog_link = nil
24
+ @twitter_accounts = []
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class TakeuchiAkari < Base
9
+ def initialize
10
+ @family_name_ja = "竹内"
11
+ @first_name_ja = "朱莉"
12
+ @family_name_en = "Takeuchi"
13
+ @first_name_en = "Akari"
14
+ @birthday = Date.new(1997, 11, 23)
15
+ @blood_type = "O"
16
+ @hometown = "埼玉"
17
+ @emoticon = "川´・ o ・リ"
18
+ @nicknames = ["タケちゃん"]
19
+ @member_color = "Red"
20
+ @generation = 2
21
+ @join_date = Date.new(2011, 8, 14)
22
+ @graduate_date = nil
23
+ @blog_link = "http://ameblo.jp/smileage-submember/"
24
+ @twitter_accounts = ["@smileage_newmem", "@akari_takeuchi", "@smileage_715"]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class TamuraMeimi < Base
9
+ def initialize
10
+ @family_name_ja = "田村"
11
+ @first_name_ja = "芽実"
12
+ @family_name_en = "Tamura"
13
+ @first_name_en = "Meimi"
14
+ @birthday = Date.new(1998, 10, 30)
15
+ @blood_type = "O"
16
+ @hometown = "群馬"
17
+ @emoticon = "メイ´‘ w‘)"
18
+ @nicknames = ["めいめい"]
19
+ @member_color = "Green"
20
+ @generation = 2
21
+ @join_date = Date.new(2011, 8, 14)
22
+ @graduate_date = nil
23
+ @blog_link = "http://ameblo.jp/smileage-submember/"
24
+ @twitter_accounts = ["@smileage_newmem", "@smileage_715"]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "acme/smileage/members/base"
4
+
5
+ module Acme
6
+ class Smileage
7
+ class Members
8
+ class WadaAyaka < Base
9
+ def initialize
10
+ @family_name_ja = "和田"
11
+ @first_name_ja = "彩花"
12
+ @family_name_en = "Wada"
13
+ @first_name_en = "Ayaka"
14
+ @birthday = Date.new(1994, 8, 1)
15
+ @blood_type = "A"
16
+ @hometown = "群馬"
17
+ @emoticon = "川 ´‘ _‘||"
18
+ @nicknames = ["あやちょ", "DAWA"]
19
+ @member_color = "Blue"
20
+ @generation = 1
21
+ @join_date = Date.new(2009, 4, 4)
22
+ @graduate_date = nil
23
+ @blog_link = "http://ameblo.jp/wadaayaka/"
24
+ @twitter_accounts = ["@ayakawada", "@smileage_715"]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ require "acme/smileage/members/wada_ayaka"
2
+ require "acme/smileage/members/fukuda_kanon"
3
+ require "acme/smileage/members/nakanishi_kana"
4
+ require "acme/smileage/members/takeuchi_akari"
5
+ require "acme/smileage/members/katsuta_rina"
6
+ require "acme/smileage/members/tamura_meimi"
7
+
8
+ require "acme/smileage/members/maeda_yuuka"
9
+ require "acme/smileage/members/ogawa_saki"
10
+ require "acme/smileage/members/kosuga_fuyuka"
11
+
12
+ module Acme
13
+ class Smileage
14
+ class Members
15
+ include Enumerable
16
+
17
+ attr_reader :members
18
+
19
+ def initialize
20
+ @members = []
21
+ @members << Acme::Smileage::Members::WadaAyaka.new
22
+ @members << Acme::Smileage::Members::FukudaKanon.new
23
+ @members << Acme::Smileage::Members::NakanishiKana.new
24
+ @members << Acme::Smileage::Members::TakeuchiAkari.new
25
+ @members << Acme::Smileage::Members::KatsutaRina.new
26
+ @members << Acme::Smileage::Members::TamuraMeimi.new
27
+
28
+ @members << Acme::Smileage::Members::MaedaYuuka.new
29
+ @members << Acme::Smileage::Members::OgawaSaki.new
30
+ @members << Acme::Smileage::Members::KosugaFuyuka.new
31
+
32
+ @members.sort_by! {|e| [e.generation, e.birthday] }
33
+ end
34
+
35
+ def each(&block)
36
+ @members.each(&block)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "open-uri"
4
+ require "uri"
5
+
6
+ require "nokogiri"
7
+
8
+ module Acme
9
+ class Smileage
10
+ module Utils
11
+ class BaseDownloader
12
+ DEFAULT_USER_AGENT = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"
13
+
14
+ private
15
+
16
+ def with_nokogiri(baseuri, path = nil)
17
+ uri = make_uri(baseuri, path)
18
+ open(uri, "User-Agent" => DEFAULT_USER_AGENT) do |f|
19
+ yield Nokogiri::HTML(f), uri
20
+ end
21
+ end
22
+
23
+ def http_get(baseuri, path = nil)
24
+ open(make_uri(baseuri, path), "User-Agent" => DEFAULT_USER_AGENT) {|f| f.read }
25
+ end
26
+
27
+ def make_uri(baseuri, path = nil)
28
+ r = URI(baseuri)
29
+ if path
30
+ r + path
31
+ else
32
+ r
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,64 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require "amatch"
4
+ require "moji"
5
+
6
+ module Acme
7
+ class Smileage
8
+ module Utils
9
+ class Matcher
10
+ attr_accessor :max_score
11
+
12
+ def initialize(str)
13
+ @str = str
14
+ @max_score = 5
15
+ end
16
+
17
+ def match(targets)
18
+ # 完全一致検索
19
+ if r = targets.find {|e| e == @str }
20
+ return r
21
+ end
22
+
23
+ # 正規化
24
+ nstr = normalize(@str)
25
+ ntargets = targets.map {|e| normalize(e) }
26
+
27
+ # 大文字小文字を無視して完全一致検索
28
+ if i = ntargets.index {|e| e == nstr }
29
+ return targets[i]
30
+ end
31
+
32
+ # 大文字小文字を無視して前方一致検索 (最低でも 2 文字は必要)
33
+ if nstr.length > 1 and i = ntargets.index {|e| e.start_with?(nstr) }
34
+ return targets[i]
35
+ end
36
+
37
+ # 編集距離であいまい検索
38
+ if i = index_by_amatch(@str, targets)
39
+ return targets[i]
40
+ end
41
+
42
+ # 大文字小文字を無視して編集距離であいまい検索
43
+ if i = index_by_amatch(nstr, ntargets)
44
+ return targets[i]
45
+ end
46
+
47
+ nil
48
+ end
49
+
50
+ def index_by_amatch(str, targets)
51
+ matcher = Amatch::Sellers.new(str)
52
+ if r = targets.map.with_index {|e,i| [i, matcher.match(e)] }.sort_by {|e| e[1] }[0]
53
+ return r[0] if r[1] < self.max_score # score があまりにも大きかったら無視
54
+ end
55
+ end
56
+
57
+ def normalize(str)
58
+ return nil unless str
59
+ Moji.hira_to_kata(Moji.normalize_zen_han(str)).downcase.gsub(/\s+/, "")
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+ module Acme
2
+ class Smileage
3
+ VERSION = "4.0.0"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Acme
2
+ class Smileage
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,55 @@
1
+ require "date"
2
+
3
+ require "acme/smileage/members"
4
+ require "acme/smileage/discography"
5
+ require "acme/smileage/version"
6
+
7
+ module Acme
8
+ class Smileage
9
+ attr_reader :birthday, :homepage_link
10
+
11
+ def initialize
12
+ @birthday = Date.new(2009, 4, 4)
13
+ @homepage_link = "http://s-mileage.jp"
14
+
15
+ @members = Acme::Smileage::Members.new
16
+ @discography = Acme::Smileage::Discography.new
17
+ end
18
+
19
+ def members(&block)
20
+ if block
21
+ @members.members.select(&block)
22
+ else
23
+ @members.members.dup
24
+ end
25
+ end
26
+
27
+ def discography(&block)
28
+ @discography.discography(&block)
29
+ end
30
+
31
+ def tracks(&block)
32
+ @discography.tracks(&block)
33
+ end
34
+
35
+ def blogs(&block)
36
+ members = block ? @members.select(&block) : @members
37
+ members = members.select {|e| e.active? }
38
+ members.map{|e| e.blog_link }.compact.uniq.map {|blog_link|
39
+ Acme::Smileage::Blog::Ameblo.new(blog_link)
40
+ }
41
+ end
42
+
43
+ def find_discography(name)
44
+ @discography.find_discography(name)
45
+ end
46
+
47
+ def find_track(name)
48
+ @discography.find_track(name)
49
+ end
50
+
51
+ def oricon_total_sales(&block)
52
+ @discography.oricon_total_sales(&block)
53
+ end
54
+ end
55
+ end