acme-smileage 4.0.0

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 (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