acme-smileage 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +215 -0
- data/Rakefile +9 -0
- data/acme-smileage.gemspec +29 -0
- data/bin/smileage +3 -0
- data/lib/acme/smileage/blog/ameblo.rb +49 -0
- data/lib/acme/smileage/blog/ameblo_downloader.rb +171 -0
- data/lib/acme/smileage/blog/entry.rb +51 -0
- data/lib/acme/smileage/commands/base.rb +10 -0
- data/lib/acme/smileage/commands/oricon.rb +47 -0
- data/lib/acme/smileage/commands/soundscan.rb +18 -0
- data/lib/acme/smileage/commands.rb +16 -0
- data/lib/acme/smileage/discography/albums/2009/I001_amanojaku.rb +35 -0
- data/lib/acme/smileage/discography/albums/2009/I002_asuha_date_nanoni_imasugu_koe_ga_kikitai.rb +35 -0
- data/lib/acme/smileage/discography/albums/2009/I003_sukichan.rb +35 -0
- data/lib/acme/smileage/discography/albums/2010/A001_waru_gaki_(1).rb +50 -0
- data/lib/acme/smileage/discography/albums/2010/D001_yumemiru_15sai_(pax_japonica_groove_remix).rb +35 -0
- data/lib/acme/smileage/discography/albums/2010/D002_gambaranakutemo_eenende_(topnude_remix_version_01).rb +35 -0
- data/lib/acme/smileage/discography/albums/2010/D003_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama_(remix_type1).rb +35 -0
- data/lib/acme/smileage/discography/albums/2010/I004_otona_ni_narutte_muzukashii.rb +35 -0
- data/lib/acme/smileage/discography/albums/2010/S001_yumemiru_15sai.rb +42 -0
- data/lib/acme/smileage/discography/albums/2010/S002_gambaranakutemo_eenende.rb +47 -0
- data/lib/acme/smileage/discography/albums/2010/S003_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama.rb +46 -0
- data/lib/acme/smileage/discography/albums/2011/D004_shortcut_(remixver).rb +35 -0
- data/lib/acme/smileage/discography/albums/2011/D005_uchouten_love_rocketman_mix.rb +35 -0
- data/lib/acme/smileage/discography/albums/2011/S004_shortcut.rb +51 -0
- data/lib/acme/smileage/discography/albums/2011/S005_koi_ni_booing_boo.rb +51 -0
- data/lib/acme/smileage/discography/albums/2011/S006_uchouten_love.rb +51 -0
- data/lib/acme/smileage/discography/albums/2011/S007_tachiagirl.rb +56 -0
- data/lib/acme/smileage/discography/albums/2011/S008_please_minisuka_post_woman.rb +52 -0
- data/lib/acme/smileage/discography/albums/2012/A002_smleage_best_album_complete_(1).rb +54 -0
- data/lib/acme/smileage/discography/albums/2012/S009_choto_mate_kudasai.rb +52 -0
- data/lib/acme/smileage/discography/albums/2012/S010_dotbikini.rb +51 -0
- data/lib/acme/smileage/discography/albums/2012/S011_sukiyo_junjou_hankouki.rb +50 -0
- data/lib/acme/smileage/discography/albums/2012/S012_samuine.rb +50 -0
- data/lib/acme/smileage/discography/albums/2013/A003_(2)_smile_sensation.rb +48 -0
- data/lib/acme/smileage/discography/albums/2013/S013_tabidachi_no_haru_ga_kita.rb +50 -0
- data/lib/acme/smileage/discography/albums/2013/S014_atarashii_watashini_nare_yattaruchan.rb +50 -0
- data/lib/acme/smileage/discography/albums/2013/S015_eeka_iiyatsu.rb +50 -0
- data/lib/acme/smileage/discography/albums/2014/S016_mystery_night_eighteen_emotion.rb +54 -0
- data/lib/acme/smileage/discography/albums/base.rb +37 -0
- data/lib/acme/smileage/discography/albums.rb +28 -0
- data/lib/acme/smileage/discography/hello_project_music_award.rb +22 -0
- data/lib/acme/smileage/discography/lyrics_downloader.rb +48 -0
- data/lib/acme/smileage/discography/sales.rb +43 -0
- data/lib/acme/smileage/discography/tracks/2009/001_amanojaku.rb +57 -0
- data/lib/acme/smileage/discography/tracks/2009/002_asuha_date_nanoni_imasugu_koe_ga_kikitai.rb +57 -0
- data/lib/acme/smileage/discography/tracks/2009/003_sukichan.rb +57 -0
- data/lib/acme/smileage/discography/tracks/2010/004_otona_ni_narutte_muzukashii.rb +57 -0
- data/lib/acme/smileage/discography/tracks/2010/005_yumemiru_15sai.rb +77 -0
- data/lib/acme/smileage/discography/tracks/2010/006_thank_you_creme_brulee_no_yuujou.rb +37 -0
- data/lib/acme/smileage/discography/tracks/2010/007_yumemiru_15sai_(pax_japonica_groove_remix).rb +38 -0
- data/lib/acme/smileage/discography/tracks/2010/008_gambaranakutemo_eenende.rb +85 -0
- data/lib/acme/smileage/discography/tracks/2010/009_gambaranakutemo_iindayo.rb +44 -0
- data/lib/acme/smileage/discography/tracks/2010/010_smile_bijin.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2010/011_gambaranakutemo_eenende_(topnude_remix_version_01).rb +38 -0
- data/lib/acme/smileage/discography/tracks/2010/012_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama.rb +85 -0
- data/lib/acme/smileage/discography/tracks/2010/013_chokotto_love.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2010/014_onaji_jikyuu_de_hataraku_tomodachi_no_bijin_mama_(remix_type1).rb +38 -0
- data/lib/acme/smileage/discography/tracks/2010/015_odorouyo.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2010/016_onna_bakari_no_nichiyoubi.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2010/017_shooting_star.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2010/018_gakkyuu_iinchou.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2010/019_shikkari_shiteyo_mou.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2011/020_shortcut.rb +69 -0
- data/lib/acme/smileage/discography/tracks/2011/021_panyasan_no_arbeit.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2011/022_otome_pasta_ni_kandou.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2011/023_koi_ni_booing_boo.rb +69 -0
- data/lib/acme/smileage/discography/tracks/2011/024_hatukoi_no_anatahe.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2011/025_koi_wo_shichaimashita.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2011/026_uchouten_love.rb +77 -0
- data/lib/acme/smileage/discography/tracks/2011/027_jitensha_chiririn.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2011/028_chu_natsu_party.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2011/029_shortcut_(remixver).rb +37 -0
- data/lib/acme/smileage/discography/tracks/2011/030_uchouten_love_rocketman_mix.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2011/031_tachiagirl.rb +73 -0
- data/lib/acme/smileage/discography/tracks/2011/032_smile_ondon.rb +35 -0
- data/lib/acme/smileage/discography/tracks/2011/033_boogie_train11.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2011/034_smileage_singles_gekimoe_remix.rb +35 -0
- data/lib/acme/smileage/discography/tracks/2011/035_please_minisuka_post_woman.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2011/036_konnichiwa_konbanwa.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2011/037_smileage_singles_gekiyaba_remix.rb +35 -0
- data/lib/acme/smileage/discography/tracks/2011/038_tewo_nigitte_arukitai.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2012/039_choto_mate_kudasai.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2012/040_chance_tourai.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2012/041_smileage_singles_gekiatsu_remix.rb +35 -0
- data/lib/acme/smileage/discography/tracks/2012/042_namida_girl.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2012/043_dotbikini.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2012/044_smile_blues.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2012/045_koibito_ha_kokoro_no_ouendan.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2012/046_kiiroi_jitensha_to_sandwich.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2012/047_sukiyo_junjou_hankouki.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2012/048_kimi_ha_jitensha_watasi_ha_densya_de_kitaku.rb +38 -0
- data/lib/acme/smileage/discography/tracks/2012/049_samuine.rb +49 -0
- data/lib/acme/smileage/discography/tracks/2012/050_watashi_choito_kawaii_urabancho.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/051_tabidachi_no_haru_ga_kita.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2013/052_doushiyou.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/053_shin_nihon_no_susume.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/054_otona_no_tochuu.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/055_tenshin_ramman.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/056_watashi_no_kokoro.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/057_yuugure_koi_no_jikan.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/058_nee_sempai.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/059_sayonara_sayonara_sayonara.rb +36 -0
- data/lib/acme/smileage/discography/tracks/2013/060_atarashii_watashini_nare.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2013/061_yattaruchan.rb +45 -0
- data/lib/acme/smileage/discography/tracks/2013/062_eeka.rb +44 -0
- data/lib/acme/smileage/discography/tracks/2013/063_iiyatsu.rb +44 -0
- data/lib/acme/smileage/discography/tracks/2014/064_mystery_night.rb +44 -0
- data/lib/acme/smileage/discography/tracks/2014/065_eighteen_emotion.rb +44 -0
- data/lib/acme/smileage/discography/tracks/base.rb +39 -0
- data/lib/acme/smileage/discography/tracks.rb +65 -0
- data/lib/acme/smileage/discography.rb +101 -0
- data/lib/acme/smileage/members/base.rb +56 -0
- data/lib/acme/smileage/members/fukuda_kanon.rb +29 -0
- data/lib/acme/smileage/members/katsuta_rina.rb +29 -0
- data/lib/acme/smileage/members/kosuga_fuyuka.rb +29 -0
- data/lib/acme/smileage/members/maeda_yuuka.rb +29 -0
- data/lib/acme/smileage/members/nakanishi_kana.rb +29 -0
- data/lib/acme/smileage/members/ogawa_saki.rb +29 -0
- data/lib/acme/smileage/members/takeuchi_akari.rb +29 -0
- data/lib/acme/smileage/members/tamura_meimi.rb +29 -0
- data/lib/acme/smileage/members/wada_ayaka.rb +29 -0
- data/lib/acme/smileage/members.rb +40 -0
- data/lib/acme/smileage/utils/base_downloader.rb +38 -0
- data/lib/acme/smileage/utils/matcher.rb +64 -0
- data/lib/acme/smileage/version.rb +5 -0
- data/lib/acme/smileage/version.rb~ +5 -0
- data/lib/acme/smileage.rb +55 -0
- data/test/acme/test_album.rb +204 -0
- data/test/acme/test_member.rb +45 -0
- data/test/acme/test_smileage.rb +144 -0
- data/test/acme/test_track.rb +57 -0
- data/test/minitest_helper.rb +5 -0
- 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,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
|