connectors

package
v0.0.0-...-06ea526 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 17, 2024 License: AGPL-3.0 Imports: 13 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ShibuyaClubQuattroFetcher = fetchers.Simple{
	BaseURL:              "https://www.club-quattro.com/shibuya/schedule/",
	ShortYearIterableURL: "https://www.club-quattro.com/shibuya/schedule/?ym=20%d%02d",
	LiveSelector:         "//div[@class='schedule-list']/div",
	DetailsLinkSelector:  "//a",
	TitleQuerier:         *htmlquerier.QAll("//p[@class='event-text' or @class='event-ttl']").FilterTitle(`[/\n]`, 1),
	ArtistsQuerier:       *htmlquerier.QAll("//p[@class='event-text' or @class='event-ttl']").FilterArtist(`[/\n]`, 0).SplitRegex(`[/\n]`),
	PriceQuerier:         *htmlquerier.Q("//div[contains(./text(), '料金:')]").After("料金:"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//section[@id='schedule-list-top']/p[@class='ttl']"),
		MonthQuerier:     *htmlquerier.Q("//li[@class='schedule-text slick-current']/p[@class='date']"),
		DayQuerier:       *htmlquerier.Q("//p[@class='date']"),
		OpenTimeQuerier:  *htmlquerier.Q("//div[contains(./text(), 'Open:')]").After("Open:"),
		StartTimeQuerier: *htmlquerier.Q("//div[contains(./text(), 'Start:')]").After("Start:"),
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-clubquattro",
	Longitude:      139.697563,
	Latitude:       35.661062,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         27,
		FirstLiveTitle:        "Rei Release Tour 2024 “VOICE MESSAGE”",
		FirstLiveArtists:      []string{"Rei", "澤村一平(dr)", "真船勝博(ba)", "TAIHEI(kb)", "須原杏(violin)"},
		FirstLivePrice:        "前売 ¥5,500",
		FirstLivePriceEnglish: "Reservation ¥5,500",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.club-quattro.com/shibuya/schedule/detail.php?id=15380",
	},
}
View Source
var ShibuyaCycloneFetcher = fetchers.CreateCycloneFetcher(
	"http://www.cyclone1997.com/",
	"http://www.cyclone1997.com/schedule/20%dschedule_%d.html",
	"tokyo",
	"shibuya",
	"shibuya-cyclone",
	"cyclone_day",
	fetchers.TestInfo{
		NumberOfLives:         34,
		FirstLiveTitle:        "SWD Japan Proudly pre. EMMURE JAPAN TOUR 2024",
		FirstLiveArtists:      []string{"EMMURE", "DVRK", "Sailing Before The Wind", "VICTIMOFDECEPTION", "HAILROSE"},
		FirstLivePrice:        "ADV ¥7000 | DOOR TBA (+1D)",
		FirstLivePriceEnglish: "ADV ¥7000 | DOOR TBA (+1D)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.cyclone1997.com/schedule/20%dschedule_%d.html",
	},
)
View Source
var ShibuyaDiveFetcher = fetchers.Simple{
	BaseURL:              "https://shibuya-dive.com/",
	ShortYearIterableURL: "https://shibuya-dive.com/schedule/?date=20%d-%02d",
	LiveSelector:         "//article",
	DetailsLinkSelector:  "//a",
	TitleQuerier:         *htmlquerier.Q("//h3"),
	ArtistsQuerier:       *htmlquerier.Q("//th[.='ACT']/following-sibling::td").Split("/"),
	PriceQuerier:         *htmlquerier.QAll("//th[.='ADV' or .='DOOR']/following-sibling::td").Join("、DOOR: ").Prefix("ADV: "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//p[@class='schedule-date']"),
		MonthQuerier:     *htmlquerier.Q("//p[@class='schedule-date']").After("."),
		DayQuerier:       *htmlquerier.Q("//p[@class='schedule-date']").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//th[.='OPEN']/following-sibling::td"),
		StartTimeQuerier: *htmlquerier.Q("//th[.='START']/following-sibling::td"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-dive",
	Latitude:       35.653937,
	Longitude:      139.708562,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         3,
		FirstLiveTitle:        "HEY! BIRTHDAY LIVE & PARTY! ~ゆーりーとあーいーの秘密の花園~ 秋元悠里 作島藍 生誕イベント開催!!!",
		FirstLiveArtists:      []string{"Hey!Mommy!"},
		FirstLivePrice:        "ADV: VIPチケット:¥6,000 / 一般チケット:¥2,000 各+D代別、DOOR: 一般チケット:¥3,000 +D代別",
		FirstLivePriceEnglish: "ADV: VIP Ticket:¥6,000 / Ordinary Ticket Ticket:¥2,000 各+Drink must be purchased separately、DOOR: Ordinary Ticket Ticket:¥3,000 +Drink must be purchased separately",
		FirstLiveOpenTime:     time.Date(2024, 3, 20, 11, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 20, 12, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://shibuya-dive.com/schedule/hey-birthday-live-party-%%ef%%bd%%9e%%e3%%82%%86%%e3%%83%%bc%%e3%%82%%8a%%e3%%83%%bc%%e3%%81%%a8%%e3%%81%%82%%e3%%83%%bc%%e3%%81%%84%%e3%%83%%bc%%e3%%81%%ae%%e7%%a7%%98%%e5%%af%%86%%e3%%81%%ae%%e8%%8a%%b1%%e5%%9c%%92%%ef%%bd%%9e-%%e7%%a7%%8b%%e5%%85%%83/",
	},
}
View Source
var ShibuyaEggmanDayFetcher = fetchers.CreateEggmanFetcher(
	"http://eggman.jp/",
	"http://eggman.jp/schedule-cat/daytime/?syear=20%d&smonth=%02d",
	"tokyo",
	"shibuya",
	"shibuya-eggmanday",
	fetchers.TestInfo{
		NumberOfLives:         21,
		FirstLiveTitle:        "[ 2 0 0 A ] – INT. PENTUMNUS OMNIS –",
		FirstLiveArtists:      []string{"BLVELY", "DIVE TO THE 2ND", "MELODRiVE", "SpendyMily", "été"},
		FirstLivePrice:        "学生 : ¥2400 / 一般 : ¥3400",
		FirstLivePriceEnglish: "Students : ¥2400 / Ordinary Ticket : ¥3400",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://eggman.jp/schedule/2-0-0-a-int-pentumnus-omnis/",
	},
)
View Source
var ShibuyaEggmanNightFetcher = fetchers.CreateEggmanFetcher(
	"http://eggman.jp/",
	"http://eggman.jp/schedule-cat/nighttime/?syear=20%d&smonth=%02d",
	"tokyo",
	"shibuya",
	"shibuya-eggmannight",
	fetchers.TestInfo{
		NumberOfLives:         7,
		FirstLiveTitle:        "RE:raise house 1on1 battle season4 vol.10",
		FirstLiveArtists:      []string{"Akari", "Suthoom(SYMBOL-ISM)", "HIRO(ALMA/DANCE FUSION/Novel Nextus)", "SACHIO", "Takky", "TOSHIYA SGSD"},
		FirstLivePrice:        "ENTRY 事前: 2000円/1D別 当日:3000円/1D別 観戦:1500円/1D別",
		FirstLivePriceEnglish: "ENTRY Reservation: 2000円/1 Drink purchase required Door:3000円/1 Drink purchase required 観戦:1500円/1 Drink purchase required",
		FirstLiveOpenTime:     time.Date(2023, 11, 9, 23, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 10, 0, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://eggman.jp/schedule/reraise-house-1on1-battle-season4-vol-10/",
	},
)
View Source
var ShibuyaGarretFetcher = fetchers.CreateCycloneFetcher(
	"http://www.cyclone1997.com/",
	"http://www.cyclone1997.com/garret/g_schedule/garret_20%dschedule_%d.html",
	"tokyo",
	"shibuya",
	"shibuya-garret",
	"garret_day",
	fetchers.TestInfo{
		NumberOfLives:         30,
		FirstLiveTitle:        "T.M.Music pre. Ten56. Japan Tour Tokyo Show",
		FirstLiveArtists:      []string{"Ten56.(France)", "Suggestions", "Evilgloom", "Nimbus", "DIVINITIST"},
		FirstLivePrice:        "ADV ¥6900 | DOOR ¥7900 (+1D)",
		FirstLivePriceEnglish: "ADV ¥6900 | DOOR ¥7900 (+1D)",
		FirstLiveOpenTime:     time.Date(2024, 3, 3, 17, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 3, 17, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.cyclone1997.com/garret/g_schedule/garret_20%dschedule_%d.html",
	},
)
View Source
var ShibuyaGeeGeFetcher = fetchers.Simple{
	BaseURL:                   "http://www.gee-ge.net/",
	ShortYearIterableURL:      "http://www.gee-ge.net/schedule/20%d/%02d/",
	LiveSelector:              "//div[contains(@class, 'sche_box')]//img/parent::a",
	ExpandedLiveSelector:      ".",
	ExpandedLiveGroupSelector: "//div[@class='box']/div[contains(@class, 'sche_box') and child::table]",
	TitleQuerier:              *htmlquerier.Q("//strong").ReplaceAll("\n", "").Trim().CutWrapper("『", "』").CutWrapper("【", "】").CutWrapper("「", "」"),
	ArtistsQuerier:            *htmlquerier.Q("//img[contains(@src, 'artist_sche_ttl.gif')]/parent::td/following-sibling::td").SplitIgnoreWithin("[\n、/]", '(', ')').After("◎").After("・"),
	PriceQuerier:              *htmlquerier.Q("//img[contains(@src, 'sche_adv_ttl.gif')]/parent::td/following-sibling::td").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//img[contains(@src, 'sche_date_ttl.gif')]/parent::td/following-sibling::td"),
		MonthQuerier:     *htmlquerier.Q("//img[contains(@src, 'sche_date_ttl.gif')]/parent::td/following-sibling::td").After("/"),
		DayQuerier:       *htmlquerier.Q("//img[contains(@src, 'sche_date_ttl.gif')]/parent::td/following-sibling::td").After("/").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//img[contains(@src, 'sche_detail_ttl.gif')]/parent::td/following-sibling::td"),
		StartTimeQuerier: *htmlquerier.Q("//img[contains(@src, 'sche_detail_ttl.gif')]/parent::td/following-sibling::td").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-geege",
	Latitude:       35.662463,
	Longitude:      139.698734,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         34,
		FirstLiveTitle:        "ウダガワガールズコレクション vol.770",
		FirstLiveArtists:      []string{"衿衣", "ナカノユウキ", "sanoha", "杏珠", "菜々姫", "鈴木里咲"},
		FirstLivePrice:        "ADV ¥2800 / DOOR ¥3300 + 1DRINK ¥700",
		FirstLivePriceEnglish: "ADV ¥2800 / DOOR ¥3300 + 1DRINK ¥700",
		FirstLiveOpenTime:     time.Date(2024, 3, 2, 11, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 2, 12, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.gee-ge.net/detail/2024/03/02/#6131",
	},
}
View Source
var ShibuyaLaDonnaFetcher = fetchers.Simple{
	BaseURL:              "https://www.la-donna.jp/",
	ShortYearIterableURL: "https://www.la-donna.jp/schedules/?ym=20%d-%02d",
	LiveSelector:         "//div[@class='sec01']/div[.//dd[@class='bigTxt'][.!='電話受付' and .!='店舗休業日' and .!='企業様イベントご利用']]",
	TitleQuerier:         *htmlquerier.Q("//dd[@class='bigTxt']"),
	ArtistsQuerier:       *htmlquerier.QAll("//dt[.='出演アーティスト']/following-sibling::dd/text()").SplitIgnoreWithin("・", '【', '】'),
	PriceQuerier:         *htmlquerier.Q("//dt[.='前売り / 当日']/parent::*").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//div[@class='monthly']/div[@class='date']"),
		MonthQuerier:     *htmlquerier.Q("//div[@class='monthly']/div[@class='date']/span"),
		DayQuerier:       *htmlquerier.Q("//div[@class='date']").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//dt[.='OPEN / START']/following-sibling::dd"),
		StartTimeQuerier: *htmlquerier.Q("//dt[.='OPEN / START']/following-sibling::dd").After("/"),
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-ladonna",
	Latitude:       35.669163,
	Longitude:      139.706891,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         26,
		FirstLiveTitle:        "【5/9へ延期】Thank You for All of You !! 〜村瀬由衣2nd Album「幸せのスケッチ」Complete Live〜",
		FirstLiveArtists:      []string{"村瀬由衣(Vo)", "鈴木雄大(Gt&Cho)", "浜田美樹(Cho)", "安部潤(Key)", "鎌田清(Dr)", "山口克彦(Gt)", "遠山陽介(Ba)", "杉真理"},
		FirstLivePrice:        "前売り / 当日 6,000円 / 6,500円",
		FirstLivePriceEnglish: "Reservation / Door 6,000円 / 6,500円",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.la-donna.jp/schedules/?ym=20%d-%02d",
	},
}

TODO: this is in harajuku

View Source
var ShibuyaOCrestFetcher = fetchers.CreateOFetcher(
	"https://shibuya-o.com/",
	"https://shibuya-o.com/crest/schedule/",
	"tokyo",
	"shibuya",
	"shibuya-ocrest",
	fetchers.TestInfo{
		NumberOfLives:         41,
		FirstLiveTitle:        "IIIIIIIDIOM FREE LIVE Road to -勇往邁進-",
		FirstLiveArtists:      []string{"IIIIIIIDIOM"},
		FirstLivePrice:        "優先 ¥3,000 一般 ¥0 当日 ¥0 (ご予約時ドリンク代別途600円)",
		FirstLivePriceEnglish: "Priority entry ¥3,000 Ordinary Ticket ¥0 Door ¥0 (ごReservation時DrinkNot included in ticket600円)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(11), 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(11), 11, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://shibuya-o.com/crest/schedule/iiiiiiidiom_23-11-1/",
	},
	35.658687,
	139.695562,
)
View Source
var ShibuyaOEastFetcher = fetchers.CreateOFetcher(
	"https://shibuya-o.com/",
	"https://shibuya-o.com/east/schedule/",
	"tokyo",
	"shibuya",
	"shibuya-oeast",
	fetchers.TestInfo{
		NumberOfLives:         32,
		FirstLiveTitle:        "THE DEAD DAISIES",
		FirstLiveArtists:      []string{"THE DEAD DAISIES", "THE MIDNIGHT ROSES(Opening Act)"},
		FirstLivePrice:        "ADV 9,500(ご入場時ドリンク代別途600円)",
		FirstLivePriceEnglish: "ADV 9,500(ごWhen enteringDrinkNot included in ticket600円)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(11), 11, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(11), 11, 1, 18, 45, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://shibuya-o.com/east/schedule/the-dead-daisies/",
	},
	35.658713,
	139.695609,
)
View Source
var ShibuyaONestFetcher = fetchers.CreateOFetcher(
	"https://shibuya-o.com/",
	"https://shibuya-o.com/nest/schedule/",
	"tokyo",
	"shibuya",
	"shibuya-onest",
	fetchers.TestInfo{
		NumberOfLives:         35,
		FirstLiveTitle:        "mayday-星が降るネストで-",
		FirstLiveArtists:      []string{"may in film", "PRSMIN", "zanka"},
		FirstLivePrice:        "ADV ¥2,500 DOOR ¥3,000 (ご入場時ドリンク代別途600円)",
		FirstLivePriceEnglish: "ADV ¥2,500 DOOR ¥3,000 (ごWhen enteringDrinkNot included in ticket600円)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(11), 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(11), 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://shibuya-o.com/nest/schedule/may-in-film%e4%b8%bb%e5%82%acmayday-%e6%98%9f%e3%81%ae%e9%99%8d%e3%82%8b%e3%83%8d%e3%82%b9%e3%83%88%e3%81%a7-day1/",
	},
	35.658563,
	139.695313,
)
View Source
var ShibuyaOWestFetcher = fetchers.CreateOFetcher(
	"https://shibuya-o.com/",
	"https://shibuya-o.com/west/schedule/",
	"tokyo",
	"shibuya",
	"shibuya-owest",
	fetchers.TestInfo{
		NumberOfLives:         29,
		FirstLiveTitle:        "感覚ピエロ 10th ANNIVERSARY「感覚ピエロですがなにか」ツアー",
		FirstLiveArtists:      []string{"感覚ピエロ"},
		FirstLivePrice:        "ADV ¥4,500 (ご入場時ドリンク代別途600円)",
		FirstLivePriceEnglish: "ADV ¥4,500 (ごWhen enteringDrinkNot included in ticket600円)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(11), 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(11), 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://shibuya-o.com/west/schedule/%e6%84%9f%e8%a6%9a%e3%83%94%e3%82%a8%e3%83%ad-10th-anniversary%e3%80%8c%e6%84%9f%e8%a6%9a%e3%83%94%e3%82%a8%e3%83%ad%e3%81%a7%e3%81%99%e3%81%8c%e3%81%aa%e3%81%ab%e3%81%8b%e3%80%8d%e3%83%84%e3%82%a2/",
	},
	35.658488,
	139.695297,
)
View Source
var ShibuyaStrobeFetcher = fetchers.Simple{
	BaseURL: "https://www.strobe-cafe.com/",
	LiveHTMLFetcher: func(testDocument []byte) (nodes []*html.Node, err error) {
		nodes = make([]*html.Node, 0)
		list := getShibuyaStrobeLiveList(testDocument)
		for _, live := range list {
			node, err := html.Parse(strings.NewReader(
				createShibuyaStrobeHtml(live),
			))
			if err != nil || node == nil {
				continue
			}
			nodes = append(nodes, node)
		}
		return
	},
	DetailsLinkSelector: "//a",
	TitleQuerier:        *htmlquerier.Q("//p[@id='title']"),
	ArtistsQuerier:      *htmlquerier.Q("//p[@id='artist']").SplitIgnoreWithin("/|(【.*?】)", '(', ')'),
	PriceQuerier:        *htmlquerier.Q("//p[@id='price']"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//p[@id='date']"),
		MonthQuerier:     *htmlquerier.Q("//p[@id='date']").After("/"),
		DayQuerier:       *htmlquerier.Q("//p[@id='date']").After("/").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//p[@id='time']"),
		StartTimeQuerier: *htmlquerier.Q("//p[@id='time']").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-strobe",
	Latitude:       35.671563,
	Longitude:      139.704437,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         16,
		FirstLiveTitle:        "古川本舗FC限定ライブ 昼公演【re:ROLE】",
		FirstLiveArtists:      []string{"古川本舗"},
		FirstLivePrice:        "前売 4500円 / 当日 5500円 (各+1drink order)",
		FirstLivePriceEnglish: "Reservation 4500円 / Door 5500円 (各+1drink order)",
		FirstLiveOpenTime:     time.Date(2024, 3, 2, 13, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 2, 13, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.strobe-cafe.com/schedule/2024/03/3128.html",
	},
}

TODO: this is in harajuku

View Source
var ShibuyaTokioTokyoFetcher = fetchers.Simple{
	BaseURL: "https://tokio.world/",
	LiveHTMLFetcher: func(testDocument []byte) (nodes []*html.Node, err error) {
		nodes = make([]*html.Node, 0)
		var list shibuyaTokioTokyoListResponse
		if testDocument == nil {
			if err = util.GetJSON(
				"https://api.cms.studiodesignapp.com/documents:runQuery?q=eyJzdHJ1Y3R1cmVkUXVlcnkiOnsiZnJvbSI6W3siY29sbGVjdGlvbklkIjoicHVibGlzaGVkIiwiYWxsRGVzY2VuZGFudHMiOnRydWV9XSwid2hlcmUiOnsiY29tcG9zaXRlRmlsdGVyIjp7Im9wIjoiQU5EIiwiZmlsdGVycyI6W3siZmllbGRGaWx0ZXIiOnsiZmllbGQiOnsiZmllbGRQYXRoIjoiX21ldGEucHJvamVjdC5pZCJ9LCJvcCI6IkVRVUFMIiwidmFsdWUiOnsic3RyaW5nVmFsdWUiOiIyNGMyMTZkOTUwY2U0OTY5YWU2ZiJ9fX0seyJmaWVsZEZpbHRlciI6eyJmaWVsZCI6eyJmaWVsZFBhdGgiOiJfbWV0YS5zY2hlbWEua2V5In0sIm9wIjoiRVFVQUwiLCJ2YWx1ZSI6eyJzdHJpbmdWYWx1ZSI6InplQ2FyaG5yIn19fV19fSwib3JkZXJCeSI6W3siZmllbGQiOnsiZmllbGRQYXRoIjoiX21ldGEucHVibGlzaGVkQXQifSwiZGlyZWN0aW9uIjoiREVTQ0VORElORyJ9XSwibGltaXQiOjF9fQ%3D%3D",
				&list,
			); err != nil {
				return
			}
		} else {
			if err = json.Unmarshal(testDocument, &list); err != nil {
				return
			}
		}
		for _, liveReference := range list[0].Document.Fields.Default.MapValue.Fields.List.ArrayValue.Values {
			var live shibuyaTokioTokyoLiveJSON
			if err = util.GetJSON(
				strings.Replace(liveReference.ReferenceValue, "projects/studio-7e371/databases/(default)/", "https://api.cms.studiodesignapp.com/", 1),
				&live,
			); err != nil {
				continue
			}
			if strings.Contains(live.Fields.Default.MapValue.Fields.Title.StringValue, "ホールレンタル") {
				continue
			}
			var n *html.Node
			n, err = html.Parse(strings.NewReader(fmt.Sprintf(
				"<span id='date'>%s</span><span id='title'>%s</span><span id='body'>%s</span><span id='url'>%s</span>",
				live.Fields.Default.MapValue.Fields.Date.StringValue,
				live.Fields.Default.MapValue.Fields.Title.StringValue,
				shibuyaTokioTokyoGetBody(live.Fields.Default.MapValue.Fields.Body.StringValue, live.Fields.Default.MapValue.Fields.Title.StringValue),
				fmt.Sprintf("https://tokio.world/posts/%s", live.Fields.Default.MapValue.Fields.Slug.StringValue),
			)))
			if err != nil {
				continue
			}
			nodes = append(nodes, n)
		}
		return
	},
	DetailsLinkSelector: "//span[@id='url']",
	TitleQuerier:        *htmlquerier.Q("//span[@id='body']"),
	ArtistsQuerier:      *htmlquerier.Q("//span[@id='title']").After("】").Split("/"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:  *htmlquerier.Q("//span[@id='date']"),
		MonthQuerier: *htmlquerier.Q("//span[@id='date']").After("/"),
		DayQuerier:   *htmlquerier.Q("//span[@id='date']").After("/").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-tokiotokyo",
	Latitude:       35.662562,
	Longitude:      139.698937,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         17,
		FirstLiveTitle:        "MUSIC NEXUS Presents Live 導 -SHIRUBE- Vol.0",
		FirstLiveArtists:      []string{"BESPER", "LUKA", "佐野諒太", "浜野はるき", "灯橙あか"},
		FirstLivePrice:        "このライブハウスのイベントの値段にアクセスできません。ライブのリンクをチェックしてください。",
		FirstLivePriceEnglish: "Cannot access prices for lives at this venue. Please check live link.",
		FirstLiveOpenTime:     time.Date(2024, 3, 12, 03, 24, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 12, 03, 24, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://tokio.world/posts/OMwpVbLU",
	},
}

please never break i do not want to ever deal with this again what the fuck is this abomination

View Source
var ShibuyaVeatsFetcher = fetchers.Simple{
	BaseURL:              "https://veats.jp/",
	ShortYearIterableURL: "https://veats.jp/schedule/?param=20%d%02d",
	LiveSelector:         "//div[@class='today-contents']/a",
	ExpandedLiveSelector: ".",
	TitleQuerier:         *htmlquerier.QAll("//p[@class='ttl']//text()[1]").KeepIndex(-1),
	ArtistsQuerier:       *htmlquerier.Q("//dt[.='LINE UP']/following-sibling::dd").SplitIgnoreWithin("/", '(', ')'),
	PriceQuerier:         *htmlquerier.Q("//dt[.='ADV /  DOOR']/following-sibling::dd"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//p[@class='year']"),
		MonthQuerier:     *htmlquerier.Q("//div[@class='head']/p"),
		DayQuerier:       *htmlquerier.Q("//div[@class='head']/p").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//dt[.='OPEN / START']/following-sibling::dd"),
		StartTimeQuerier: *htmlquerier.Q("//dt[.='OPEN / START']/following-sibling::dd").After("/"),
		IsMonthInLive:    true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shibuya",
	VenueID:        "shibuya-veats",
	Latitude:       35.660613,
	Longitude:      139.697641,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         23,
		FirstLiveTitle:        "BLACK IRIS WEEKLY LIVE",
		FirstLiveArtists:      []string{"BLACK IRIS"},
		FirstLivePrice:        "前方エリア¥4,000・後方エリア¥1,000 / 前方エリア¥4,500・後方エリア¥1,000 (D代別)",
		FirstLivePriceEnglish: "Front area¥4,000・Rear area¥1,000 / Front area¥4,500・Rear area¥1,000 (Drink must be purchased separately)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://veats.jp/schedule/5667/",
	},
}
View Source
var ShibuyaWWWBetaFetcher = fetchers.CreateWWWFetcher(
	"@data-place='www_beta' or @data-place='wwwxwww'",
	"shibuya-wwwbeta",
	fetchers.TestInfo{
		NumberOfLives:         4,
		FirstLiveTitle:        "MONK WORK BASE",
		FirstLiveArtists:      []string{"仙人掌 & S-kaine", "LIl' Leise But Gold", "NEI", "anddytoystore", "AI Jacky", "KEYTOTHECITY", "Yusef Imamura & Sano", "Palmpark", "YU", "cut skateboards", "kizukush", "JON (UGLY WEAPON)", "Joe cupertino", "CHAPAH", "VOLOJZA", "interplay", "凸凹。", "AI.U", "Kazuhiko Fujita", "SEX 山口", "Wide Escapes", "MONK", "Hanaboo", "stedman", "YAMAPIZZA", "stadman"},
		FirstLivePrice:        "当日 ¥3,500 (税込|スタンディング|ドリンク代別)前売 ¥3,000 (税込|スタンディング|ドリンク代別)",
		FirstLivePriceEnglish: "Door ¥3,500 (Incl. Tax|Standing|Drink代Separately)Reservation ¥3,000 (Incl. Tax|Standing|Drink代Separately)",
		FirstLiveOpenTime:     time.Date(2023, 11, 7, 17, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 7, 17, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www-shibuya.jp/schedule/017137.php",
	},
)
View Source
var ShibuyaWWWFetcher = fetchers.CreateWWWFetcher(
	"@data-place='www' or @data-place='wwwxwww'",
	"shibuya-www",
	fetchers.TestInfo{
		NumberOfLives:         30,
		FirstLiveTitle:        "#ピコリフ 3rdワンマンライブ「Shiny Sparkle」",
		FirstLiveArtists:      []string{"#ピコリフ"},
		FirstLivePrice:        "VIP:¥5,000 / 撮影:¥3,000 / 後方:¥1,500 / 学生・女性:¥500 / 新規:¥0 (税込 / 各ドリンク代別)",
		FirstLivePriceEnglish: "VIP:¥5,000 / 撮影:¥3,000 / 後方:¥1,500 / Students・Women:¥500 / 新規:¥0 (Incl. Tax / 各Drink代Separately)",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www-shibuya.jp/schedule/017256.php",
	},
)
View Source
var ShibuyaWWWXFetcher = fetchers.CreateWWWFetcher(
	"@data-place='wwwx'",
	"shibuya-wwwx",
	fetchers.TestInfo{
		NumberOfLives:         27,
		FirstLiveTitle:        "BIG ROMANTIC RECORDS presents Carsick Cars live in Tokyo",
		FirstLiveArtists:      []string{"Carsick Cars", "Hello Shitty (a.k.a Sophia from UptownRecords)"},
		FirstLivePrice:        "¥5,000 / ¥5,500 (税込 / ドリンク代別)※当日券は19:00~、前売りの入場が落ち着き次第 WWW Xにて¥5,500+D代で販売いたします。",
		FirstLivePriceEnglish: "¥5,000 / ¥5,500 (Incl. Tax / Drink代Separately)※Door券は19:00~、ReservationのEntryが落ち着き次第 WWW Xにて¥5,500+D代で販売いたします。",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www-shibuya.jp/schedule/017258.php",
	},
)
View Source
var Shimokitazawa440Fetcher = fetchers.Simple{
	BaseURL:              "http://440.tokyo/",
	InitialURL:           "http://440.tokyo/schedule/",
	NextSelector:         "//div[@class='month']/div[@class='next']/a",
	ExpandedLiveSelector: "//a",
	LiveSelector:         "//div[@class='schedule-list__list']/article",
	TitleQuerier:         *htmlquerier.Q("//h2"),
	ArtistsQuerier:       *htmlquerier.Q("//h1").Split("|"),
	PriceQuerier:         *htmlquerier.Q("//dl[@class='schedule-content__ticket']//p/text()[2]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='date']").Before("/"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='date']").SplitIndex("/", 1),
		DayQuerier:       *htmlquerier.Q("//span[@class='date']").SplitIndex("/", 2).Before("("),
		OpenTimeQuerier:  *htmlquerier.Q("//dl[@class='schedule-content__openstart']//p").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//dl[@class='schedule-content__openstart']//p").After("/"),
		IsMonthInLive:    true,
		IsYearInLive:     true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-440",
	Latitude:       35.658313,
	Longitude:      139.667391,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         29,
		FirstLiveTitle:        "“Stormy Wednesday”",
		FirstLiveArtists:      []string{"王将&The Guv’nor Brothers", "Weiyao Band", "前後のカルマ"},
		FirstLivePrice:        "ADV.¥3,000/DOOR.¥3,400 [1D別]",
		FirstLivePriceEnglish: "ADV.¥3,000/DOOR.¥3,400 [1 Drink purchase required]",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://440.tokyo/events/231101/",
	},
}
View Source
var ShimokitazawaArtistFetcher = fetchers.Simple{
	BaseURL:              "http://www.c-artist.com/",
	ShortYearIterableURL: "http://www.c-artist.com/schedule/list/20%d%d.txt",
	LiveSelector:         "//div[@class='sche']",
	TitleQuerier:         *htmlquerier.Q("//p[contains(@class, 'guestname')]/text()[1]"),
	ArtistsQuerier:       *htmlquerier.Q("//p[contains(@class, 'guestname')]/text()[last()]").Split("\u00A0").Before("』〜").TrimPrefix("『"),
	PriceQuerier:         *htmlquerier.Q("//p[@class='ex']").After(" / "),
	DetailsLink:          "http://www.c-artist.com/schedule/",

	TimeHandler: fetchers.TimeHandler{
		MonthQuerier:    *htmlquerier.Q("//p[@class='day']").Before("/"),
		DayQuerier:      *htmlquerier.Q("//p[@class='day']").After("/").Before("("),
		OpenTimeQuerier: *htmlquerier.Q("//p[@class='ex']").Before(" / ").After("open"),
		IsMonthInLive:   true,
		IsYearInLive:    true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-artist",
	Latitude:       35.663562,
	Longitude:      139.668609,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         17,
		FirstLiveTitle:        "『jikkatsu_c:side』〜 two-man_live 〜",
		FirstLiveArtists:      []string{"いちろう", "酒井勇也"},
		FirstLivePrice:        "2,000yen(1ドリンク込み)",
		FirstLivePriceEnglish: "2,000yen(1DrinkIncluded)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(3), 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(3), 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.c-artist.com/schedule/",
	},
}
View Source
var ShimokitazawaBasementBarFetcher = fetchers.CreateToosFetcher(
	"https://www.toos.co.jp/",
	"https://toos.co.jp/basementbar/event/on/20%d/%02d/",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-basementbar",
	fetchers.TestInfo{
		NumberOfLives:         31,
		FirstLiveTitle:        "sickufo fanclub",
		FirstLiveArtists:      []string{"あずき過保護セット", "小林壮侍", "年齢バンド", "まほろば", "Bambi club", "GRASAM ANIMAL", "Laget’s Jam Stack", "sokkuriufo (from Khaki)", "sickufo(60min)"},
		FirstLivePrice:        "ADV¥1,800-(+2D)",
		FirstLivePriceEnglish: "ADV¥1,800-(+2D)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 17, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 17, 50, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://toos.co.jp/basementbar/ev/sickufo-fanclub/",
	},
)
View Source
var ShimokitazawaChikamatsuFetcher = fetchers.Simple{
	BaseURL:              "https://chikamatsu-nite.com/",
	InitialURL:           "https://chikamatsu-nite.com/schedule/",
	LiveSelector:         "//ul[@id='event-list']/li",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//div[@id='event-title']//h2"),
	ArtistsQuerier:       *htmlquerier.Q("//dl[@id='event-view']/dd[3]").Split("/"),
	PriceQuerier:         *htmlquerier.Q("//dl[@id='event-view']/dd[2]"),

	TimeHandler: fetchers.TimeHandler{
		MonthQuerier:     *htmlquerier.Q("//div[@id='event-title']//time").Before("/"),
		DayQuerier:       *htmlquerier.Q("//div[@id='event-title']//time").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//dl[@id='event-view']/dd[1]").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//dl[@id='event-view']/dd[1]").After("/"),
		IsMonthInLive:    true,
		IsYearInLive:     true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-chikamatsu",
	Latitude:       35.656813,
	Longitude:      139.667562,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         26,
		FirstLiveTitle:        "地下教室 vol.13",
		FirstLiveArtists:      []string{"uyuu", "アウフヘーベン", "シンクマクラ", "憂牡丹"},
		FirstLivePrice:        "¥2,000-/¥2,500-(+1D)",
		FirstLivePriceEnglish: "¥2,000-/¥2,500-(+1D)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(11), 11, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(11), 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://chikamatsu-nite.com/schedule/2023/11/01-id2504.php",
	},
}
View Source
var ShimokitazawaChikamichiFetcher = fetchers.CreateChikamichiFetcher(
	"https://chikamichi-otemae.com/",
	"https://chikamichi-otemae.com/chikamichi/",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-chikamichi",
	fetchers.TestInfo{
		NumberOfLives:         24,
		FirstLiveTitle:        "VINTAGE ROCK × チケットぴあ presents FUTURE RESERVE vol.5",
		FirstLiveArtists:      []string{"omeme tenten", "すなお", "daisansei", "カラコルムの山々"},
		FirstLivePrice:        "¥2,900(+1D¥600)",
		FirstLivePriceEnglish: "¥2,900(+1D¥600)",
		FirstLiveOpenTime:     time.Date(2023, 11, 2, 18, 45, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 2, 19, 15, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://chikamichi-otemae.com/chikamichi/852/",
	},
)
View Source
var ShimokitazawaClub251Fetcher = fetchers.Simple{
	BaseURL:              "http://www.club251.com/",
	ShortYearIterableURL: "http://www.club251.com/schedule/schedule-%d%02d.html",
	LiveSelector:         "//div[contains(@class, 'Schedule-1day')]",
	TitleQuerier:         *htmlquerier.Q("//div[contains(@class, 'EVENT-TITLE')]"),
	ArtistsQuerier:       *htmlquerier.Q("//p[contains(@class, 'Performer')]").Split("/"),
	PriceQuerier:         *htmlquerier.Q("//p[contains(@class, 'DETAIL')][1]/text()[2]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//p[contains(@class, 'month')]").After("/"),
		MonthQuerier:     *htmlquerier.Q("//div[contains(@class, 'DATE')]/p").Before("/"),
		DayQuerier:       *htmlquerier.Q("//div[contains(@class, 'DATE')]/p").After("/").Before("."),
		OpenTimeQuerier:  *htmlquerier.Q("//p[contains(@class, 'DETAIL')][1]/text()[1]").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//p[contains(@class, 'DETAIL')][1]/text()[1]").After("/"),

		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-club251",
	Latitude:       35.658313,
	Longitude:      139.667312,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         28,
		FirstLiveTitle:        "\"9DayzGlitchClubTokyo pre.“太陽と月光のクリシェ” 下北沢CLUB251 30th ANNIVERSARY!!\"",
		FirstLiveArtists:      []string{"9DayzGlitchClubTokyo", "AZ-ON", "RONLON", "GTRA"},
		FirstLivePrice:        "adv¥2,900/door¥3,400(別途1D600円)",
		FirstLivePriceEnglish: "adv¥2,900/door¥3,400(Separately1D600円)",
		FirstLiveOpenTime:     time.Date(2023, 10, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 10, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.club251.com/schedule/schedule-%d%02d.html",
	},
}
View Source
var ShimokitazawaClubQueFetcher = fetchers.Simple{
	BaseURL:              "https://clubque.net/",
	InitialURL:           "https://clubque.net/schedule/",
	NextSelector:         "//div[@class='month']/div[@class='next']/a",
	ExpandedLiveSelector: "//a",
	LiveSelector:         "//div[@class='schedule-list__list']/article",
	TitleQuerier:         *htmlquerier.Q("//h2"),
	ArtistsQuerier:       *htmlquerier.Q("//h1").Split("|"),
	PriceQuerier:         *htmlquerier.Q("//dl[@class='schedule-content__ticket']//p/text()[2]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='date']").Before("/"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='date']").SplitIndex("/", 1),
		DayQuerier:       *htmlquerier.Q("//span[@class='date']").SplitIndex("/", 2).Before("("),
		OpenTimeQuerier:  *htmlquerier.Q("//dl[@class='schedule-content__openstart']//p").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//dl[@class='schedule-content__openstart']//p").After("/"),
		IsMonthInLive:    true,
		IsYearInLive:     true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-clubque",
	Latitude:       35.660938,
	Longitude:      139.668813,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         29,
		FirstLiveTitle:        "“Stormy Wednesday”",
		FirstLiveArtists:      []string{"王将&The Guv’nor Brothers", "Weiyao Band", "前後のカルマ"},
		FirstLivePrice:        "ADV.¥3,000/DOOR.¥3,400 [1D別]",
		FirstLivePriceEnglish: "ADV.¥3,000/DOOR.¥3,400 [1 Drink purchase required]",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://clubque.net/schedule/2202/",
	},
}
View Source
var ShimokitazawaDaisyBarFetcher = fetchers.CreateDaisyBarFetcher(
	"https://daisybar.jp/",
	"https://daisybar.jp/events/event/on/20%d/%02d/",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-daisybar",
	"color-blue2",
	fetchers.TestInfo{
		NumberOfLives:         35,
		FirstLiveTitle:        "From The Beginning",
		FirstLiveArtists:      []string{"Heap", "DreadNought", "髙橋 翼(Paper Bag)", "michi(アバウトチルドレン)", "ワタナベイベーマコト(etymon)"},
		FirstLivePrice:        "前売り 2500円(D別)/当日 3000円(D別)",
		FirstLivePriceEnglish: "Reservation 2500円(Drinks sold separately)/Door 3000円(Drinks sold separately)",
		FirstLiveOpenTime:     time.Date(2023, 11, 2, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 2, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://daisybar.jp/events/event/on/20%d/%02d/",
	},
)
View Source
var ShimokitazawaDyCubeFetcher = fetchers.Simple{
	BaseURL:              "https://dycube.tokyo/",
	ShortYearIterableURL: "https://dycube.tokyo/schedule/?ext_num-year=20%d&ext_num-month=%02d",
	LiveSelector:         "//article[@class='schedule-article']",
	TitleQuerier:         *htmlquerier.Q("//h3").ReplaceAllRegex(`\s+`, " "),
	ArtistsQuerier:       *htmlquerier.Q("//div[@class='schedule-article-body__txt']/p[1]").Split("\n"),
	PriceQuerier:         *htmlquerier.Q("//div[@class='schedule-article-body__txt']/p[2]/text()[2]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//a[contains(@class, 'schedule-head-year__btn')][contains(@class, '-active')]"),
		MonthQuerier:     *htmlquerier.Q("//a[contains(@class, 'schedule-head-month__btn')][contains(@class, '-active')]"),
		DayQuerier:       *htmlquerier.Q("//p[@class='schedule-article-head__day']"),
		OpenTimeQuerier:  *htmlquerier.Q("//div[@class='schedule-article-body__txt']/p[2]/text()[1]").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//div[@class='schedule-article-body__txt']/p[2]/text()[1]").After("/"),
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-dycube",
	Latitude:       35.662037,
	Longitude:      139.666609,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         34,
		FirstLiveTitle:        "vessy 初企画 「diamonddust」",
		FirstLiveArtists:      []string{"nene", "栢本ての", "藍谷凪", "vessy"},
		FirstLivePrice:        "TICKET ¥2,500(+1drink¥600)",
		FirstLivePriceEnglish: "TICKET ¥2,500(+1drink¥600)",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://dycube.tokyo/schedule/?ext_num-year=20%d&ext_num-month=%02d",
	},
}
View Source
var ShimokitazawaEraFetcher = fetchers.Simple{
	BaseURL:        "http://s-era.jp/",
	InitialURL:     util.InsertYearMonth("http://s-era.jp/schedule_cat/%d-%02d/"),
	NextSelector:   "//section[contains(@class, 'schedule-navigation')]/div[2]/p[2]/a",
	LiveSelector:   "//article[contains(@class, 'schedule-box')]",
	TitleQuerier:   *htmlquerier.Q("//h4").ReplaceAllRegex(`\s+`, " "),
	ArtistsQuerier: *htmlquerier.Q("//div[contains(@class, 'w-flyer')]").BeforeSelector("//div[contains(@class, 'detail-texts')]").Before("\n\n").Before("/OPEN ").SplitIgnoreWithin("/", '(', ')').Trim().TrimSuffix("/"),
	PriceQuerier:   *htmlquerier.Q("//div[contains(@class, 'detail-grid')]/p[2]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//section[contains(@class, 'schedule-navigation')]//h3").Before("."),
		MonthQuerier:     *htmlquerier.Q("//time/text()").Before("."),
		DayQuerier:       *htmlquerier.Q("//time/text()").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//div[contains(@class, 'detail-grid')]/p[1]/span[2]"),
		StartTimeQuerier: *htmlquerier.Q("//div[contains(@class, 'detail-grid')]/p[1]/span[4]"),
		IsMonthInLive:    true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-era",
	Latitude:       35.663313,
	Longitude:      139.668313,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         38,
		FirstLiveTitle:        "ERA presents. A Day in The Life Vol.159",
		FirstLiveArtists:      []string{"paddy isle", "Akarumeno brown", "Blueberry Mondays", "Qurukuma", "Spinning Plums"},
		FirstLivePrice:        "ADV ¥2000DOOR ¥2500 (+1D¥600)",
		FirstLivePriceEnglish: "ADV ¥2000DOOR ¥2500 (+1D¥600)",
		FirstLiveOpenTime:     time.Date(2023, 11, 2, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 2, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          util.InsertYearMonth("http://s-era.jp/schedule_cat/%d-%02d/"),
	},
}
View Source
var ShimokitazawaFlowersLoftFetcher = fetchers.CreateLoftFetcher(
	"https://www.loft-prj.co.jp/",
	"https://www.loft-prj.co.jp/schedule/flowersloft/date/20%d/%d",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-flowersloft",
	fetchers.TestInfo{
		NumberOfLives:         30,
		FirstLiveTitle:        "バニーの日!ハロウィンSP",
		FirstLiveArtists:      []string{"tumiki", "はっちゃん", "テルミー", "ShinK", "クロマティーゆうや(NeoN)", "ディスク百合おん", "まみくん3歳", "マル", "有田清幸", "BIDA"},
		FirstLivePrice:        "男性:2,000 (2drink込み)\n女性:入場無料\n・仮装女子は1Dプレゼント\n・バニー...",
		FirstLivePriceEnglish: "Men:2,000 (2drinkIncluded)\nWomen:EntryFree\n・仮装女子は1Dプレゼント\n・バニー...",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.loft-prj.co.jp/schedule/flowersloft/267929",
	},
	35.662188,
	139.667937,
)
View Source
var ShimokitazawaLagunaFetcher = fetchers.CreateDaisyBarFetcher(
	"https://s-laguna.jp/",
	"https://s-laguna.jp/events/event/on/20%d/%02d/",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-laguna",
	"color-white",
	fetchers.TestInfo{
		NumberOfLives:         38,
		FirstLiveTitle:        "BRIDGE",
		FirstLiveArtists:      []string{"ミアナシメント", "金田すなほ", "リョマル", "ANAIS"},
		FirstLivePrice:        "前売 3000円(D別) 当日 3500円(D別)",
		FirstLivePriceEnglish: "Reservation 3000円(Drinks sold separately) Door 3500円(Drinks sold separately)",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://s-laguna.jp/events/event/on/20%d/%02d/",
	},
)
View Source
var ShimokitazawaLiveHausFetcher = fetchers.Simple{
	BaseURL:             "https://livehaus.jp/",
	InitialURL:          "https://livehaus.jp/schedule/",
	NextSelector:        "//a[contains(@class, 'tribe-events-c-nav__next')]",
	LiveSelector:        "//article[contains(@class, 'tribe-events-calendar-list__event')]",
	TitleQuerier:        *htmlquerier.Q("//h3"),
	DetailQuerier:       *htmlquerier.Q("//div[contains(@class, 'tribe-events-calendar-list__event-description')]"),
	DetailsLinkSelector: "//a[contains(@class, 'tribe-events-calendar-list__event-featured-image-link')]",

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:   *htmlquerier.Q("//time[contains(@class, 'tribe-events-calendar-list__month-separator-text')]").After("月"),
		MonthQuerier:  *htmlquerier.Q("//span[contains(@class, 'tribe-event-date-start')]").Before("/"),
		DayQuerier:    *htmlquerier.Q("//span[contains(@class, 'tribe-event-date-start')]").After("/"),
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-livehaus",
	Latitude:       35.659562,
	Longitude:      139.667562,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         19,
		FirstLiveTitle:        "突撃! 隣のトシクラブ vol.4 in 下北沢",
		FirstLiveArtists:      []string{"ドトキンズ", "Los Rancheros", "The Silver Sonics", "SHOWA BOYZ feat.DJ NIGARA", "SHJ (LONDON NITE)", "TAGO!", "KAZU SUDO (Caribbean Dandy)", "内藤啓介 (Chingcame)", "NIGARA (GARA)", "ITA (Nat Records)", "TSUNE (Lewis Leathers Japan)", "Mr.X(A&Y)", "ciibo", "KOSEI", "Yuuki(Tip Clothing&co.)", "RYO", "Shunsuke", "Shima Volume(104club)", "TOSHI & VOW"},
		FirstLivePrice:        "ADM¥2000",
		FirstLivePriceEnglish: "ADM¥2000",
		FirstLiveOpenTime:     time.Date(2023, 11, 3, 15, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 3, 15, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://livehaus.jp/event/%e7%aa%81%e6%92%83-%e9%9a%a3%e3%81%ae%e3%83%88%e3%82%b7%e3%82%af%e3%83%a9%e3%83%96-vol-4-in-%e4%b8%8b%e5%8c%97%e6%b2%a2/",
	},
}
View Source
var ShimokitazawaLiveHolicFetcher = fetchers.Simple{
	BaseURL:             "https://liveholic.jp/",
	InitialURL:          "https://liveholic.jp/schedule/",
	LiveSelector:        "//div[@class='schedulegroup']/dl",
	DetailsLinkSelector: "//h2/a",
	TitleQuerier:        *htmlquerier.Q("//h2"),
	ArtistsQuerier:      *htmlquerier.Q("//p[@class='detail'][1]").Split(" / "),
	PriceQuerier:        *htmlquerier.Q("//p[@class='detail'][3]"),

	TimeHandler: fetchers.TimeHandler{
		MonthQuerier:     *htmlquerier.Q("//p[@class='date']").Before("."),
		DayQuerier:       *htmlquerier.Q("//p[@class='date']/text()").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//p[@class='detail'][2]/text()[1]").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//p[@class='detail'][2]/text()[2]").Before("/"),

		IsMonthInLive: true,
		IsYearInLive:  true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-liveholic",
	Latitude:       35.661412,
	Longitude:      139.669078,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         52,
		FirstLiveTitle:        "オレンジバンドシャトル",
		FirstLiveArtists:      []string{"ザストーンマスター", "おじさん的思考ディスク", "BamblueSiA", "Sonne", "Route4th", "GO SEE REGRET", "※EiNyは出演キャンセル"},
		FirstLivePrice:        "一般¥2,000 学生¥1,400 (D別)",
		FirstLivePriceEnglish: "Ordinary Ticket¥2,000 Students¥1,400 (Drinks sold separately)",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(11), 11, 6, 17, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(11), 11, 6, 18, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://liveholic.jp/schedule/2023/11/post-455.php",
	},
}
View Source
var ShimokitazawaMonaRecordsFetcher = fetchers.Simple{
	BaseURL:              "https://www.mona-records.com/",
	ShortYearIterableURL: "https://www.mona-records.com/date/20%d/%02d/?category_name=livespace",
	LiveSelector:         "//div[contains(@class, 'sidepostlist-item')]",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//h1"),
	ArtistsQuerier:       *htmlquerier.Q("//td[text()='出演']/following-sibling::td").Split(" / "),
	PriceQuerier:         *htmlquerier.Q("//td[text()='料金']/following-sibling::td"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//time").Before("/"),
		MonthQuerier:     *htmlquerier.Q("//time").SplitIndex("/", 1),
		DayQuerier:       *htmlquerier.Q("//time").SplitIndex("/", 2).Before("("),
		OpenTimeQuerier:  *htmlquerier.Q("//td[text()='時間']/following-sibling::td").Before("/"),
		StartTimeQuerier: *htmlquerier.Q("//td[text()='時間']/following-sibling::td").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-monarecords",
	Latitude:       35.660463,
	Longitude:      139.667516,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         30,
		FirstLiveTitle:        "LOLIPOP",
		FirstLiveArtists:      []string{"じゆりぴ", "若杉果歩", "イロハマイ"},
		FirstLivePrice:        "前売:¥2,900+1Drink",
		FirstLivePriceEnglish: "Reservation:¥2,900+1Drink",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.mona-records.com/livespace/17026/",
	},
}
View Source
var ShimokitazawaMosaicFetcher = fetchers.Simple{
	BaseURL:        "http://mu-seum.co.jp",
	InitialURL:     "http://mu-seum.co.jp/schedule.html",
	NextSelector:   "//span[contains(@class, 'calendar_next')]/a",
	LiveSelector:   "//table[contains(@class, 'listCal')]",
	TitleQuerier:   *htmlquerier.Q("//tr[1]/td/p[1]"),
	ArtistsQuerier: *htmlquerier.Q("//td[contains(@class, 'live_menu')]/strong").SplitIgnoreWithin(" / ", '(', ')'),
	PriceQuerier:   *htmlquerier.Q("//td[contains(@class, 'live_menu')]/text()[5]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//td[contains(@class, 'month_eng')]/text()[1]"),
		MonthQuerier:     *htmlquerier.Q("//tr[1]/th").Before("/"),
		DayQuerier:       *htmlquerier.Q("//tr[1]/th").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//td[contains(@class, 'live_menu')]/text()[4]").After("OPEN "),
		StartTimeQuerier: *htmlquerier.Q("//td[contains(@class, 'live_menu')]/text()[4]").After("START "),

		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-mosaic",
	Latitude:       35.659688,
	Longitude:      139.668563,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         31,
		FirstLiveTitle:        "『MOSAiC iDOL INFINITY - One hundred -』",
		FirstLiveArtists:      []string{"エレクトリックリボン", "月刊PAM", "セカイシティ", "LUNCH KIDS", "AKUMATICA"},
		FirstLivePrice:        "前売 ¥100 / 当日 ¥1,100(+1Drink ¥600)",
		FirstLivePriceEnglish: "Reservation ¥100 / Door ¥1,100(+1Drink ¥600)",
		FirstLiveOpenTime:     time.Date(2023, 6, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 6, 1, 18, 15, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://mu-seum.co.jp/schedule.html",
	},
}
View Source
var ShimokitazawaOtemaeFetcher = fetchers.CreateChikamichiFetcher(
	"https://chikamichi-otemae.com/",
	"https://chikamichi-otemae.com/otemae/",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-otemae",
	fetchers.TestInfo{
		NumberOfLives:         6,
		FirstLiveTitle:        "Otemae Vol.1",
		FirstLiveArtists:      []string{"ELLY", "実香", "弓詩"},
		FirstLivePrice:        "ADV : ¥2,000(+1D¥600) / DAY : ¥2,500(+1D¥600)",
		FirstLivePriceEnglish: "ADV : ¥2,000(+1D¥600) / DAY : ¥2,500(+1D¥600)",
		FirstLiveOpenTime:     time.Date(2023, 10, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 10, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://chikamichi-otemae.com/otemae/963/",
		KnownEmpty:            true,
	},
)
View Source
var ShimokitazawaRegFetcher = fetchers.Simple{
	BaseURL:        "https://www.reg-r2.com/",
	InitialURL:     "https://www.reg-r2.com/?page_id=7250",
	NextSelector:   "//a[contains(text(), '次の月')]",
	LiveSelector:   "//table[@id='live_date']//tr",
	TitleQuerier:   *htmlquerier.Q("//div[@class='live_title']"),
	ArtistsQuerier: *htmlquerier.Q("//div[@class='performer_name']").Split("  "),
	PriceQuerier:   *htmlquerier.Q("//div[@class='time_price']/text()[2]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//h2").Before("年"),
		MonthQuerier:     *htmlquerier.Q("//h2").After("年").Before("月"),
		DayQuerier:       *htmlquerier.Q("//td[@class='date_weekday']/text()[1]").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//div[@class='time_price']/text()[1]").SplitIndex("/", 1),
		StartTimeQuerier: *htmlquerier.Q("//div[@class='time_price']/text()[1]").SplitIndex("/", 2),
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-reg",
	Latitude:       35.658187,
	Longitude:      139.667937,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         27,
		FirstLiveTitle:        "HAWK ANARCHY 2nd Album 宇宙侵略紀行release tour「日本侵略紀行」",
		FirstLiveArtists:      []string{"HAWK ANARCHY", "New Age Core", "OFELIA", "ALL I WANT"},
		FirstLivePrice:        "前売り¥2,500-(ドリンク別)/当日¥3,000-(ドリンク別)",
		FirstLivePriceEnglish: "Reservation¥2,500-(Drinks sold separately)/Door¥3,000-(Drinks sold separately)",
		FirstLiveOpenTime:     time.Date(2023, 11, 2, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 2, 18, 45, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.reg-r2.com/?page_id=7250",
	},
}
View Source
var ShimokitazawaShangrilaFetcher = fetchers.Simple{
	BaseURL:        "https://www.shan-gri-la.jp/",
	InitialURL:     "https://www.shan-gri-la.jp/tokyo/category/schedule/",
	LiveSelector:   "//div[@id='content']/div[contains(@class, 'hentry')]",
	TitleQuerier:   *htmlquerier.Q("//strong"),
	ArtistsQuerier: *htmlquerier.Q("//div[@class='post-content-content']/p[2]").Split("\n"),
	PriceQuerier:   *htmlquerier.Q("//div[@class='post-content-content']/p[3]").After("START ").After("\n").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//table[@id='wp-calendar']/caption").Before("年"),
		MonthQuerier:     *htmlquerier.Q("//h2").Before("/"),
		DayQuerier:       *htmlquerier.Q("//h2").After("/").Before("("),
		OpenTimeQuerier:  *htmlquerier.Q("//div[@class='post-content-content']/p[3]/text()[1]"),
		StartTimeQuerier: *htmlquerier.Q("//div[@class='post-content-content']/p[3]/text()[1]").After("/"),
		IsMonthInLive:    true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-shangrila",
	Latitude:       35.660488,
	Longitude:      139.668516,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         5,
		FirstLiveTitle:        "The Cheserasera 2024 春の邂逅ツーマンライブ 其の壱",
		FirstLiveArtists:      []string{"The Cheserasera", "ABSTRACT MASH"},
		FirstLivePrice:        "前売¥4,400 / 当日¥4,900 (1ドリンク¥600別)",
		FirstLivePriceEnglish: "Reservation¥4,400 / Door¥4,900 (1Drink¥600Separately)",
		FirstLiveOpenTime:     time.Date(2024, 4, 4, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 4, 4, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.shan-gri-la.jp/tokyo/category/schedule/",
	},
}
View Source
var ShimokitazawaShelterFetcher = fetchers.CreateLoftFetcher(
	"https://www.loft-prj.co.jp",
	"https://www.loft-prj.co.jp/schedule/shelter/date/20%d/%02d",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-shelter",
	fetchers.TestInfo{
		NumberOfLives:         35,
		FirstLiveTitle:        "SHELTER & 山﨑 presents 「あなたのドラム、詳しく聞かせて? Vol.14」",
		FirstLiveArtists:      []string{"GUEST:松本誠治(the telephones)", "司会&進行:山﨑聖之(CONFVSE / fam / The Firewood Project / LOW IQ 01 & THE RHYTHM MAKERS)"},
		FirstLivePrice:        "ADV¥2000+1D / DOOR¥2400+1D\n【発売日】\nSHELTER予約",
		FirstLivePriceEnglish: "ADV¥2000+1D / DOOR¥2400+1D\n【発売日】\nSHELTERReservation",
		FirstLiveOpenTime:     time.Date(2023, 6, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 6, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.loft-prj.co.jp/schedule/shelter/247893",
	},
	35.661488,
	139.669453,
)
View Source
var ShimokitazawaSpreadFetcher = fetchers.Simple{
	BaseURL:        "https://spread.tokyo/",
	InitialURL:     "https://spread.tokyo/schedule.html",
	LiveSelector:   "//div[@id='c7']/div[@class='box'][position()<200]",
	TitleQuerier:   *htmlquerier.Q("//u/b").ReplaceAllRegex(`\s+`, " ").CutWrapper(`"`, `"`),
	ArtistsQuerier: *htmlquerier.QAll("//div/span[last()]/text()"),
	PriceQuerier:   *htmlquerier.Q("//div/span[4]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//div/span[1]"),
		MonthQuerier:     *htmlquerier.Q("//div/span[1]").After("."),
		DayQuerier:       *htmlquerier.Q("//div/span[1]").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//div/span[3]"),
		StartTimeQuerier: *htmlquerier.Q("//div/span[3]").After("START"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-spread",
	Latitude:       35.660838,
	Longitude:      139.667734,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         99,
		FirstLiveTitle:        `techmoris presents "feel free...!I feel free...! Release Party"`,
		FirstLiveArtists:      []string{"ラジカセ狂気", "Fanny Hill", "techmoris", "139????"},
		FirstLivePrice:        "ADV. ¥2,000 | DOOR. ¥2,500 | U23. ¥1,500 (+1D)",
		FirstLivePriceEnglish: "ADV. ¥2,000 | DOOR. ¥2,500 | U23. ¥1,500 (+1D)",
		FirstLiveOpenTime:     time.Date(2024, 4, 5, 19, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 4, 5, 20, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://spread.tokyo/schedule.html",
	},
}
View Source
var ShimokitazawaThreeFetcher = fetchers.CreateToosFetcher(
	"https://www.toos.co.jp/",
	"https://www.toos.co.jp/3/events/event/on/20%d/%02d/",
	"tokyo",
	"shimokitazawa",
	"shimokitazawa-three",
	fetchers.TestInfo{
		NumberOfLives:         31,
		FirstLiveTitle:        "D.B.Inches 1st EP ”Instinct, Filter Bubble” Release Party",
		FirstLiveArtists:      []string{"aruga", "HOT DOG LOVE", "Nenne", "Suzuki Ryuto", "D.B.Inches"},
		FirstLivePrice:        "ADV¥2,500-/DOOR¥3,000-(+1D)",
		FirstLivePriceEnglish: "ADV¥2,500-/DOOR¥3,000-(+1D)",
		FirstLiveOpenTime:     time.Date(2023, 11, 2, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 2, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.toos.co.jp/3/events/d-b-inches-1st-ep-instinct-filter-bubble-release-party/",
	},
)
View Source
var ShimokitazawaWaverFetcher = fetchers.Simple{
	BaseURL:              "https://waverwaver.net/",
	ShortYearIterableURL: "https://waverwaver.net/category/schedule/20%d年%02d月/",
	ExpandedLiveSelector: "//h1/a",
	LiveSelector:         "//div[contains(@class, 'postList')]/article[contains(@class, 'media')]",
	TitleQuerier:         *htmlquerier.Q("//ul[contains(@class, 'schedule_list')]//i[contains(@class, 'icon_title')]/following-sibling::text()"),
	ArtistsQuerier:       *htmlquerier.Q("//ul[contains(@class, 'schedule_list')]//i[contains(@class, 'icon_lineup')]/following-sibling::text()").Split("/"),
	PriceQuerier:         *htmlquerier.Q("//ul[contains(@class, 'schedule_list')]//i[contains(@class, 'icon_adv')]/following-sibling::text()"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//h1").Before("年"),
		MonthQuerier:     *htmlquerier.Q("//h1").Before("月").After("年"),
		DayQuerier:       *htmlquerier.Q("//h1").Before("日").After("月"),
		OpenTimeQuerier:  *htmlquerier.Q("//ul[contains(@class, 'schedule_list')]//i[contains(@class, 'icon_open')]/following-sibling::text()").Before(" / "),
		StartTimeQuerier: *htmlquerier.Q("//ul[contains(@class, 'schedule_list')]//i[contains(@class, 'icon_open')]/following-sibling::text()").After(" / ").Before(" "),
		IsMonthInLive:    true,
		IsYearInLive:     true,
	},

	PrefectureName: "tokyo",
	AreaName:       "shimokitazawa",
	VenueID:        "shimokitazawa-waver",
	Latitude:       35.660187,
	Longitude:      139.667937,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         49,
		FirstLiveTitle:        "『笑うはこには福来る』",
		FirstLiveArtists:      []string{"小山恭代", "高田えぬひろ", "矢部りんご", "ナカザワ"},
		FirstLivePrice:        "adv¥2,200 / door¥2,500 各+1drink代別途(¥600)",
		FirstLivePriceEnglish: "adv¥2,200 / door¥2,500 各+1drinkNot included in ticket(¥600)",
		FirstLiveOpenTime:     time.Date(2023, 11, 2, 18, 45, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 2, 19, 15, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://waverwaver.net/2023/11/02/2023%%e5%%b9%%b411%%e6%%9c%%8802%%e6%%97%%a5%%e6%%9c%%a8/",
	},
}
View Source
var ShindaitaFeverFetcher = fetchers.Simple{
	BaseURL:        "https://www.fever-popo.com/",
	InitialURL:     util.InsertYearMonth("https://www.fever-popo.com/schedule/%d/%02d/"),
	NextSelector:   "//div[@id='mekuri']/a[2]",
	LiveSelector:   "//div[contains(@class, 'hentry')]",
	TitleQuerier:   *htmlquerier.Q("//h2[contains(@class, 'eventtitle')]").After(")\u00A0"),
	ArtistsQuerier: *htmlquerier.Q("//h3/p").SplitIgnoreWithin("(\n)|( / )", '(', ')'),
	PriceQuerier:   *htmlquerier.Q("//div[2]/div[1]/div[3]"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//h2[contains(@class, 'eventtitle')]").Before("."),
		MonthQuerier:     *htmlquerier.Q("//h2[contains(@class, 'eventtitle')]").SplitIndex(".", 1),
		DayQuerier:       *htmlquerier.Q("//h2[contains(@class, 'eventtitle')]").SplitIndex(".", 2).Before(" "),
		OpenTimeQuerier:  *htmlquerier.Q("//div[2]/div[1]/div[2]").Before(" / "),
		StartTimeQuerier: *htmlquerier.Q("//div[2]/div[1]/div[2]").After(" / "),
		IsMonthInLive:    true,
		IsYearInLive:     true,
	},

	PrefectureName: "tokyo",
	AreaName:       "setagaya",
	VenueID:        "shindaita-fever",
	Latitude:       35.662813,
	Longitude:      139.660062,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         32,
		FirstLiveTitle:        "『百々和宏presents ~Drunk51~』",
		FirstLiveArtists:      []string{"百々和宏(MO’SOME TONEBENDER)", "ホリエアツシ(STRAIGHTENER)", "佐々木亮介(a flood of circle)", "ヤマジカズヒデ(dip)", "有江嘉典(VOLA&THE ORIENTAL MACHINE)", "ウエノコウジ(the HIATUS, Radio Caroline)", "クハラカズユキ(The Birthday)", "有松益男(BACK DROP BOMB)"},
		FirstLivePrice:        "ADV ¥4800 (+1drink) THANK YOU SOLD OUT!!!\n※1drink ¥600",
		FirstLivePriceEnglish: "ADV ¥4800 (+1drink) THANK YOU SOLD OUT!!!\n※1drink ¥600",
		FirstLiveOpenTime:     time.Date(2023, 11, 1, 18, 45, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 11, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          util.InsertYearMonth("https://www.fever-popo.com/schedule/%d/%02d/"),
	},
}
View Source
var ShinjukuLoftFetcher = fetchers.CreateLoftFetcher(
	"https://www.loft-prj.co.jp/",
	"https://www.loft-prj.co.jp/schedule/loft/date/20%d/%02d",
	"tokyo",
	"shinjuku",
	"shinjuku-loft",
	fetchers.TestInfo{
		NumberOfLives:         38,
		FirstLiveTitle:        "エクストロメ!!",
		FirstLiveArtists:      []string{"tipToe.", "airattic", "Finger Runs", "われらがプワプワプーワプワ"},
		FirstLivePrice:        "ADV¥1500 / DOOR¥未定(DRINK代別¥600)\n[発売]\nLive Pocket 5月26日(金)22:00〜5...",
		FirstLivePriceEnglish: "ADV¥1500 / DOOR¥TBA(DRINK代Separately¥600)\n[発売]\nLive Pocket 5月26日(金)22:00〜5...",
		FirstLiveOpenTime:     time.Date(2023, 6, 1, 18, 40, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2023, 6, 1, 19, 10, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.loft-prj.co.jp/schedule/loft/252531",
	},
	35.695538,
	139.702578,
)
View Source
var ShinjukuZircoTokyoFetcher = fetchers.CreateBassOnTopFetcher(
	"https://zirco-tokyo.jp/",
	"https://zirco-tokyo.jp/schedule/calendar/20%d/%02d/",
	"tokyo",
	"shinjuku",
	"shinjuku-zircotokyo",
	fetchers.TestInfo{
		NumberOfLives:         32,
		FirstLiveTitle:        "専門学校東京ビジュアルアーツ 音楽総合学科ミュージシャン専攻卒業公演",
		FirstLiveArtists:      []string{},
		FirstLivePrice:        "ADV/DOOR ¥0- (1Drink代金¥600別途必要)",
		FirstLivePriceEnglish: "ADV/DOOR ¥0- (1DrinkPrice¥600Must be purchased separately)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 17, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://zirco-tokyo.jp/schedule/detail/31777",
	},
	35.693763,
	139.703859,
)
View Source
var ShinsaibashiAnimaFetcher = fetchers.Simple{
	BaseURL:             "https://liveanima.jp/",
	InitialURL:          "https://liveanima.jp/?page_id=174",
	LiveSelector:        "//div[contains(@class, 'eo-events')]/div[@class='container']",
	DetailsLinkSelector: "//a",
	TitleQuerier:        *htmlquerier.Q("//a/span"),
	ArtistsQuerier:      *htmlquerier.Q("//span[text()='出演者']/following-sibling::text()").SplitIgnoreWithin("[/\n]", '(', ')'),
	PriceQuerier:        *htmlquerier.Q("//span[text()='PRICE']/following-sibling::text()").ReplaceAllRegex(`(\s| )+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//h5/span[@class='animabadge mont']"),
		MonthQuerier:     *htmlquerier.Q("//h5/span[@class='animabadge mont']").After("/"),
		DayQuerier:       *htmlquerier.Q("//h5/span[@class='animabadge mont']").After("/").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//span[text()='OPEN']/following-sibling::text()"),
		StartTimeQuerier: *htmlquerier.Q("//span[text()='START']/following-sibling::text()"),

		IsMonthInLive: true,
		IsYearInLive:  true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-anima",
	Latitude:       34.671188,
	Longitude:      135.498438,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         36,
		FirstLiveTitle:        "EMERGENCY CALL",
		FirstLiveArtists:      []string{"Absopetus-アブソプ-", "CYCLONISTA", "MAGMAZ", "MiNO", "mistress", "ココロシンドローム", "処刑台のシンデレラ"},
		FirstLivePrice:        "ADV ¥1500 DOOR ¥2000 +1drink(¥600)",
		FirstLivePriceEnglish: "ADV ¥1500 DOOR ¥2000 +1drink(¥600)",
		FirstLiveOpenTime:     time.Date(2024, 3, 6, 18, 45, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 6, 19, 15, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://liveanima.jp/live/gig/emergency-call",
	},
}
View Source
var ShinsaibashiBeyondFetcher = fetchers.CreateBassOnTopFetcher(
	"https://beyond-osaka.jp/",
	"https://beyond-osaka.jp/schedule/calendar/20%d/%02d/",
	"osaka",
	"shinsaibashi",
	"shinsaibashi-beyond",
	fetchers.TestInfo{
		NumberOfLives:         33,
		FirstLiveTitle:        "おかんに見られたくない いや、見て欲しいVol.4 らくだのレコ発",
		FirstLiveArtists:      []string{"らくだのこぶX", "セックスマシーン!!", "百回中百回", "Blow the instability(O.A)"},
		FirstLivePrice:        "ADV/DOOR ¥3,600/¥4,000(別途1Drink代金¥600-必要)",
		FirstLivePriceEnglish: "ADV/DOOR ¥3,600/¥4,000(Separately1DrinkPrice¥600-Necessary)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://beyond-osaka.jp/schedule/detail/29388",
	},
	34.671937,
	135.497563,
)
View Source
var ShinsaibashiBigcatFetcher = fetchers.Simple{
	BaseURL:              "https://bigcat-live.com/",
	ShortYearIterableURL: "https://bigcat-live.com/20%d/%d",
	LiveSelector:         "//div[contains(@class, 'archive_block')]",
	TitleQuerier:         *htmlquerier.Q("//h3[@class='ttl']"),
	ArtistsQuerier:       *htmlquerier.Q("//dt[text()='LIVE INFO']/following-sibling::dd/p").Split("/"),
	PriceQuerier:         *htmlquerier.QAll("//dt[text()='ADV' or text()='DOOR']/ancestor::dl").Join(" ").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		MonthQuerier:     *htmlquerier.Q("//span[@class='date_txt']"),
		DayQuerier:       *htmlquerier.Q("//span[@class='date_txt']").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//dt[text()='OPEN']/following-sibling::dd"),
		StartTimeQuerier: *htmlquerier.Q("//dt[text()='START']/following-sibling::dd"),

		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-bigcat",
	Latitude:       34.672337,
	Longitude:      135.498859,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         23,
		FirstLiveTitle:        "押忍フェス in BIGCAT",
		FirstLiveArtists:      []string{"KRD8", "WT☆Egret", "すたんぴっ!", "シンセカイヒーロー", "森ふうか", "HIGH SPY DOLL", "ミケネコガールズ", "Mellow giRLs", "Vress", "LOViSH", "caprice", "frecia", "いつでも夢を", "link start", "REBEL REBEL", "EVERYTHING IS WONDER", "Lunouir Tiara", "イロハサクラ"},
		FirstLivePrice:        "ADV 優先:¥2,400一般:¥1,000 DOOR 優先:¥3,400一般:¥2,000",
		FirstLivePriceEnglish: "ADV Priority entry:¥2,400Ordinary Ticket:¥1,000 DOOR Priority entry:¥3,400Ordinary Ticket:¥2,000",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(3), 3, 1, 15, 15, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(3), 3, 1, 15, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://bigcat-live.com/20%d/%d",
	},
}
View Source
var ShinsaibashiBronzeFetcher = fetchers.Simple{
	BaseURL:              "http://osakabronze.com",
	ShortYearIterableURL: "http://osakabronze.com/schedule20%d%02d.php",
	LiveSelector:         "//div[@class='eventbox']",
	TitleQuerier:         *htmlquerier.Q("//p[@class='midashi']").ReplaceAllRegex(`\s+`, " "),
	ArtistsQuerier:       *htmlquerier.Q("//p[@class='bandlist']").SplitIgnoreWithin(`\n|( \/ )`, '(', ')'),
	PriceQuerier:         *htmlquerier.Q("//p[@class='openstart']/text()[2]").After("TICKET "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//h4").Before("年"),
		MonthQuerier:     *htmlquerier.Q("//h4").After("年").Before("月"),
		DayQuerier:       *htmlquerier.Q("//h4").After("月").Before("日"),
		OpenTimeQuerier:  *htmlquerier.Q("//p[@class='openstart']"),
		StartTimeQuerier: *htmlquerier.Q("//p[@class='openstart']").After("START "),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-bronze",
	Latitude:       34.671313,
	Longitude:      135.498078,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         27,
		FirstLiveTitle:        "1st full album Desire of life Game Change Tour final seriesLove the past play the future",
		FirstLiveArtists:      []string{"Hyuga", "DETOX"},
		FirstLivePrice:        "adv ¥2500 door ¥3000(別途1D ¥600)",
		FirstLivePriceEnglish: "adv ¥2500 door ¥3000(Separately1D ¥600)",
		FirstLiveOpenTime:     time.Date(2024, 3, 2, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 2, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://osakabronze.com/schedule20%d%02d.php",
	},
}
View Source
var ShinsaibashiClapperFetcher = fetchers.Simple{
	BaseURL:              "https://clapper.jp/",
	ShortYearIterableURL: "https://clapper.jp/data/category/20%d-%02d/",
	LiveSelector:         "//ul[@id='scheduleList']/li",
	TitleQuerier:         *htmlquerier.Q("//h4[@class='event_name']").CutWrapper("『", "』"),
	ArtistsQuerier:       *htmlquerier.QAll("//h5[text()='出演']/following-sibling::p[1]/text()"),
	PriceQuerier:         *htmlquerier.QAll("//h5[text()='料金']/following-sibling::text()").Join(" "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='ev_date']"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='ev_date']").After("."),
		DayQuerier:       *htmlquerier.Q("//span[@class='ev_date']").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.QAll("//h5[text()='OPEN/START']/following-sibling::text()").Join(""),
		StartTimeQuerier: *htmlquerier.QAll("//h5[text()='OPEN/START']/following-sibling::text()").Join("").After(":"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-clapper",
	Latitude:       34.674638,
	Longitude:      135.503422,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         23,
		FirstLiveTitle:        "大阪最終単独公演『集諦』",
		FirstLiveArtists:      []string{"NIGAI"},
		FirstLivePrice:        "前売¥5,000-(1D別) 当日¥0-(1D別)",
		FirstLivePriceEnglish: "Reservation¥5,000-(1 Drink purchase required) Door¥0-(1 Drink purchase required)",
		FirstLiveOpenTime:     time.Date(2024, 3, 7, 17, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 7, 18, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://clapper.jp/data/category/20%d-%02d/",
	},
}
View Source
var ShinsaibashiClubVijonFetcher = fetchers.CreateBassOnTopFetcher(
	"https://vijon.jp/",
	"https://vijon.jp/schedule/calendar/20%d/%02d/",
	"osaka",
	"shinsaibashi",
	"shinsaibashi-clubvijon",
	fetchers.TestInfo{
		NumberOfLives:         38,
		FirstLiveTitle:        "FREE! FREE! FREE!",
		FirstLiveArtists:      []string{"Louve noir", "ZERO", "sp1at", "CARKLAND", "LOCO"},
		FirstLivePrice:        "ADV/DOOR ¥0 別途2Drink代¥1,200",
		FirstLivePriceEnglish: "ADV/DOOR ¥0 Separately2Drink代¥1,200",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 17, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 18, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://vijon.jp/schedule/detail/33505",
	},
	34.673838,
	135.493859,
)
View Source
var ShinsaibashiConpassFetcher = fetchers.Simple{
	BaseURL:              "https://www.conpass.jp/",
	ShortYearIterableURL: "https://www.conpass.jp/?cat=4&m=20%d%02d",
	LiveSelector:         "//div[@id='main']//ul/div[not(@class) and not(@id)]",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//p[@class='event_tittle']"),
	ArtistsQuerier:       *htmlquerier.QAll("//p[text()='LINEUP:']/following-sibling::p[1]/text()"),
	PriceQuerier:         *htmlquerier.QAll("//p[text()='CHARGE:']/following-sibling::p[1]/text()").Join(" "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='event_day_in']"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='event_day_in']").After("."),
		DayQuerier:       *htmlquerier.Q("//span[@class='event_day_in']").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//span[text()='INFORMATION:']/following-sibling::text()[1]"),
		StartTimeQuerier: *htmlquerier.Q("//span[text()='INFORMATION:']/following-sibling::text()[1]").After(":"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-conpass",
	Latitude:       34.674688,
	Longitude:      135.503859,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         16,
		FirstLiveTitle:        "West Side Unity presents. 『LEAVE YOUTH HERE -EXTRA PARTY-』",
		FirstLiveArtists:      []string{"Demonstration Of Power (UK)", "Despize (UK)", "SAND", "Decasion", "UNMASK aLIVE", "RESENTMENT", "waterweed", "ReVERSE BOYZ", "UNHOLY11", "Fallen Grace", "CE$", "MOON SHOW Fr. JAH WORKS", "DJ ACE Fr. JAH WORKS"},
		FirstLivePrice:        "前売 ¥3,500(D別) 当日 ¥4,000(D別)",
		FirstLivePriceEnglish: "Reservation ¥3,500(Drinks sold separately) Door ¥4,000(Drinks sold separately)",
		FirstLiveOpenTime:     time.Date(2024, 3, 3, 14, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 3, 14, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.conpass.jp/7168.html",
	},
}
View Source
var ShinsaibashiDropFetcher = fetchers.CreateBassOnTopFetcher(
	"https://vijon.jp/",
	"https://vijon.jp/schedule/calendar/20%d/%02d/",
	"osaka",
	"shinsaibashi",
	"shinsaibashi-drop",
	fetchers.TestInfo{
		NumberOfLives:         39,
		FirstLiveTitle:        "世史久祭り大阪編vol.23 春のドドスコベイベーナイト",
		FirstLiveArtists:      []string{"世史久", "MEGAHORN", "ELBRUNCH", "イチゼンバッカー", "飛太", "ほーDK", "T-face", "浦田哲也", "ウルトラソウル", "10ripeee", "田中佑生大", "竹歳みずほ", "Mifuyu", "林奈恵"},
		FirstLivePrice:        "♢(来場)¥3.800 別途1D代要 ♢(配信)3000円",
		FirstLivePriceEnglish: "♢(In Person)¥3.800 1 Drink must be purchased separately ♢(Livestream)3000円",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 16, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 17, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://clubdrop.jp/schedule/detail/32308",
	},
	34.671937,
	135.497563,
)
View Source
var ShinsaibashiFanjtwiceFetcher = fetchers.Simple{
	BaseURL:        "http://www.fanj-twice.com/",
	InitialURL:     "http://www.fanj-twice.com/sch_twice/sch000.html",
	LiveSelector:   "//div[contains(@class, 'cssskin-_block_main_news_m')]",
	TitleQuerier:   *htmlquerier.Q("//h4"),
	ArtistsQuerier: *htmlquerier.Q("//p[@class='c-body']/span[2]//span[not(*)]").Split(" / "),
	PriceQuerier:   *htmlquerier.Q("//p[@class='c-body']/span[3]//span[@class='d-bold']/following-sibling::text()"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//p[@class='c-lead']"),
		MonthQuerier:     *htmlquerier.Q("//p[@class='c-lead']").After("."),
		DayQuerier:       *htmlquerier.Q("//p[@class='c-lead']").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//p[@class='c-body']/span[3]//span[@class='d-bold']/preceding-sibling::text()"),
		StartTimeQuerier: *htmlquerier.Q("//p[@class='c-body']/span[3]//span[@class='d-bold']/preceding-sibling::text()").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-fanjtwice",
	Latitude:       34.671662,
	Longitude:      135.497672,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         12,
		FirstLiveTitle:        "GEM JAM FES!",
		FirstLiveArtists:      []string{"meluQ", "SITRA.", "青のメロディー", "caprice", "AsteRythm", "Stella!", "ネテルダイヤ", "ゆめポケ", "めいてん"},
		FirstLivePrice:        "前売り 1,900円 / 前方エリア 3,000円(別途1DRINK)",
		FirstLivePriceEnglish: "Reservation 1,900円 / Front area 3,000円(Separately1DRINK)",
		FirstLiveOpenTime:     time.Date(2024, 3, 2, 10, 15, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 2, 10, 35, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.fanj-twice.com/sch_twice/sch000.html",
	},
}
View Source
var ShinsaibashiHillsPanFetcher = fetchers.Simple{
	BaseURL:              "http://livehillspankojyo.com/",
	InitialURL:           "http://livehillspankojyo.com/",
	LiveSelector:         "//div[@id='schedule_inner']/div[@class='schedulearea'][.//a!='ホールレンタル']",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//div[@class='live-title']").Trim().CutWrapper("【", "】"),
	ArtistsQuerier:       *htmlquerier.Q("//div[@class='perform-artist']").After("[Performer]").Split("、"),
	DetailQuerier:        *htmlquerier.QAll("//div[@class='live-article']//text()").Join("\n").HalfWidth(),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:  *htmlquerier.Q("//div[@class='live-date']"),
		MonthQuerier: *htmlquerier.Q("//div[@class='live-date']").After("."),
		DayQuerier:   *htmlquerier.Q("//div[@class='live-date']").After(".").After("."),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-hillspan",
	Latitude:       34.673238,
	Longitude:      135.496141,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         15,
		FirstLiveTitle:        "2024 Ueda Marie Major debut, 10 YEAR kinen Live きらめきとためいき REHEARSAL NIGHT",
		FirstLiveArtists:      []string{"植田真梨恵", "BAND 車谷啓介(Dr.)", "麻井寛史(Ba.)", "西村広文(Key.)", "渡邊剣太(Gt.)"},
		FirstLivePrice:        "adv¥5000、*1Dr代¥600",
		FirstLivePriceEnglish: "adv¥5000、*1Dr代¥600",
		FirstLiveOpenTime:     time.Date(2024, 6, 14, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 6, 14, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://livehillspankojyo.com/detail.cgi?code=naPZtnvX",
	},
}
View Source
var ShinsaibashiHokageFetcher = fetchers.Simple{
	BaseURL:                     "http://musicbarhokage.net/",
	ShortYearReverseIterableURL: "http://musicbarhokage.net/schedule%d_20%d.htm",
	LiveSelector:                "//table[@bordercolor='#FF0000']/tbody/tr/td/div/table/tbody",
	TitleQuerier:                *htmlquerier.Q("/tr[3]//strong"),
	ArtistsQuerier:              *htmlquerier.Q("/tr[4]//strong").Split("\n"),
	PriceQuerier:                *htmlquerier.Q("/tr[6]//strong"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='style15']"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='style15']").After("."),
		DayQuerier:       *htmlquerier.Q("//span[@class='style15']").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("/tr[5]//strong").After("OPEN:"),
		StartTimeQuerier: *htmlquerier.Q("/tr[5]//strong").After("START:"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-hokage",
	Latitude:       34.671063,
	Longitude:      135.499188,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         24,
		FirstLiveTitle:        "[DUB UNDERGROUND vol.4]",
		FirstLiveArtists:      []string{"DUBBY BON", "Manabu Dub", "Black Warriyah", "BIG \"DUB\" HEAD (fr.Medical Tempo)"},
		FirstLivePrice:        "Adv.1000yen Door.1000yen (+Drink fee)",
		FirstLivePriceEnglish: "Adv.1000yen Door.1000yen (+Drink fee)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 21, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 21, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://musicbarhokage.net/schedule%d_20%d.htm",
	},
}
View Source
var ShinsaibashiJanusFetcher = fetchers.Simple{
	BaseURL:              "https://janusosaka.com/",
	ShortYearIterableURL: "https://janusosaka.com/schedule/20%d-%02d/",
	LiveSelector:         "//article[@class='c-scheduleList']",
	TitleQuerier:         *htmlquerier.Q("//div[@class='c-scheduleList__head--title']"),
	ArtistsQuerier:       *htmlquerier.Q("//div[@class='c-scheduleList__head--act']").SplitIgnoreWithin(`( / )|(【?((opening)|(Opening)|(OPENING))?\s*((Guest)|(guest)|(GUEST)|(ゲスト)|(artist)|(Artist)|(ARTIST)|(act)|(Act)|(ACT))\s*((artist)|(Artist)|(ARTIST)|(act)|(Act)|(ACT))?】?((\s*):)?)|(O.A.(\s*):)|(【DJ/MC】)|(【LIVE】)|(\(O.A.\))`, '(', ')'),
	PriceQuerier:         *htmlquerier.Q("//dt[text()='ADV/DOOR']/following-sibling::dd").Prefix("ADV/DOOR: ").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//div[@id='c-breadcrumb']//li[last()]"),
		MonthQuerier:     *htmlquerier.Q("//div[@class='c-scheduleList__date--month']"),
		DayQuerier:       *htmlquerier.Q("//div[@class='c-scheduleList__date--date']"),
		OpenTimeQuerier:  *htmlquerier.Q("//dt[text()='OPEN/START']/following-sibling::dd"),
		StartTimeQuerier: *htmlquerier.Q("//dt[text()='OPEN/START']/following-sibling::dd").After("/"),

		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-janus",
	Latitude:       34.671688,
	Longitude:      135.505063,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         28,
		FirstLiveTitle:        "帝国喫茶ワンマンツアー2024 「きみの待つ場所へ春のメロディーを」",
		FirstLiveArtists:      []string{"帝国喫茶"},
		FirstLivePrice:        "ADV/DOOR: ¥3,800 / 未定",
		FirstLivePriceEnglish: "ADV/DOOR: ¥3,800 / TBA",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://janusosaka.com/schedule/20%d-%02d/",
	},
}
View Source
var ShinsaibashiKanonFetcher = fetchers.Simple{
	BaseURL:              "https://kanon-art.jp/",
	InitialURL:           fmt.Sprintf("https://kanon-art.jp/wp-admin/admin-ajax.php?action=get_events_ajax&security=%s", shinsaibashiKanonGetSecurity()),
	LiveSelector:         "//div[@id='event_archive_list']/article",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//h2[@id='event_title']"),
	ArtistsQuerier:       *htmlquerier.Q("//div[@id='spec_field']//text()[contains(., '出演: ')]").After("出演: ").Split("、"),
	DetailQuerier:        *htmlquerier.Q("//div[@id='spec_field']"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:  *htmlquerier.Q("//span[@class='year']"),
		MonthQuerier: *htmlquerier.Q("//span[@class='month_label']"),
		DayQuerier:   *htmlquerier.Q("//span[@class='date']"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-kanon",
	Latitude:       34.671937,
	Longitude:      135.496688,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         11,
		FirstLiveTitle:        "三浦コースケ、鹿音のまこと、Yu",
		FirstLiveArtists:      []string{"三浦コースケ", "鹿音のまこと", "Yu"},
		FirstLivePrice:        "ADV/DOOR ¥2,500",
		FirstLivePriceEnglish: "ADV/DOOR ¥2,500",
		FirstLiveOpenTime:     time.Date(2024, 3, 16, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 16, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://kanon-art.jp/schedule/20240316/",
	},
}
View Source
var ShinsaibashiKingCobraFetcher = fetchers.Simple{
	BaseURL:              "http://king-cobra.net/",
	ShortYearIterableURL: "http://king-cobra.net/schedule/20%d_%d.html",
	LiveSelector:         "//font[@color='#00CCFF' and string-length(normalize-space(text())) > 10]",
	TitleQuerier:         *htmlquerier.Q("/.").Trim().CutWrapper("『", "』").ReplaceAllRegex(`\s+`, " "),
	ArtistsQuerier:       *htmlquerier.QAll("/ancestor::tr[1]/following-sibling::tr[1]/td[1]//text()").DeleteFrom("[FOOD]"),
	PriceQuerier:         *htmlquerier.QAll("/ancestor::tr[1]/following-sibling::tr[1]/td[3]//text()").Join("").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//font[@color='#FF33CC']"),
		MonthQuerier:     *htmlquerier.Q("/ancestor::td[1]/preceding-sibling::td[1]//text()[contains(., '月')]"),
		DayQuerier:       *htmlquerier.Q("/ancestor::td[1]/preceding-sibling::td[1]//text()[contains(., '月')]").After("月"),
		OpenTimeQuerier:  *htmlquerier.Q("/ancestor::tr[1]/following-sibling::tr[1]/td[2]//text()[contains(., '開場')]"),
		StartTimeQuerier: *htmlquerier.Q("/ancestor::tr[1]/following-sibling::tr[1]/td[2]//text()[contains(., '開演')]"),

		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-kingcobra",
	Latitude:       34.671712,
	Longitude:      135.497672,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         10,
		FirstLiveTitle:        "ヘルスマパンク 春の電波ジャック!!",
		FirstLiveArtists:      []string{"ギターパンダ", "THE FLYING PANTS", "アンモニアンズ", "JOKE?!", "THE MAYUCHIX", "ラティーノ山口", "大義"},
		FirstLivePrice:        "・ADV.3,500 ・DOOR.4,000",
		FirstLivePriceEnglish: "・ADV.3,500 ・DOOR.4,000",
		FirstLiveOpenTime:     time.Date(2024, 3, 2, 17, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 2, 17, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://king-cobra.net/schedule/20%d_%d.html",
	},
}
View Source
var ShinsaibashiKnaveFetcher = fetchers.Simple{
	BaseURL:              "http://www.knave.co.jp/",
	ShortYearIterableURL: "http://www.knave.co.jp/schedule/s_20%d_%02d.html",
	LiveSelector:         "//div[@class='event-details']",
	TitleQuerier: *htmlquerier.QAll("//p[@class='f-12']/text()").Trim().AddComplexFilter(func(old []string) []string {
		newArr := make([]string, 0)
		for i, s1 := range old {

			if i == len(old)-1 {
				break
			}

			if strings.Contains(s1, "/") {
				break
			}

			for _, s2 := range newArr {
				if strings.Contains(s1, s2) || strings.Contains(s2, s1) {
					break
				}
			}

			newArr = append(newArr, s1)
		}
		return newArr
	}).Join(" "),
	ArtistsQuerier: *htmlquerier.QAll("//p[@class='f-12']/text()").Trim().AddComplexFilter(func(old []string) []string {
		titleArr := make([]string, 0)
		artistArr := make([]string, 0)
		hasReachedArtist := false
		for i, s1 := range old {
			if hasReachedArtist {
				artistArr = append(artistArr, s1)
				continue
			}

			if i == len(old)-1 {
				hasReachedArtist = true
			}

			if strings.Contains(s1, "/") {
				hasReachedArtist = true
			}

			for _, s2 := range titleArr {
				if strings.Contains(s1, s2) || strings.Contains(s2, s1) {
					hasReachedArtist = true
				}
			}

			if hasReachedArtist {
				artistArr = append(artistArr, s1)
			} else {
				titleArr = append(titleArr, s1)
			}
		}
		return artistArr
	}).Split("/"),
	PriceQuerier: *htmlquerier.Q("/preceding-sibling::div[@class='black-back'][1]//span[@class='f-12 white']").After(":").After(":").After(" "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("/preceding-sibling::div[@class='black-back'][1]/h3/text()[1]"),
		MonthQuerier:     *htmlquerier.Q("/preceding-sibling::div[@class='black-back'][1]/h3/text()[1]").After("."),
		DayQuerier:       *htmlquerier.Q("/preceding-sibling::div[@class='black-back'][1]/h3/text()[1]").After(".").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("/preceding-sibling::div[@class='black-back'][1]//span[@class='f-12 white']"),
		StartTimeQuerier: *htmlquerier.Q("/preceding-sibling::div[@class='black-back'][1]//span[@class='f-12 white']").After(":"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-knave",
	Latitude:       34.672562,
	Longitude:      135.489188,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         36,
		FirstLiveTitle:        "takimoto.age 主催 愛が泣くMV 配信イベント 『愛が泣いている。バンド集めました』",
		FirstLiveArtists:      []string{"takimoto.age", "soratobiwo", "さんかくとバツ", "ヨルノアト"},
		FirstLivePrice:        "前¥2,500当¥3,000(+1D)",
		FirstLivePriceEnglish: "ADV ¥2,500DOOR ¥3,000(+1D)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.knave.co.jp/schedule/s_20%d_%02d.html",
	},
}
View Source
var ShinsaibashiKurageFetcher = fetchers.Simple{
	BaseURL:              "https://livehouse-kurage.com",
	InitialURL:           "https://livehouse-kurage.com/schedule/",
	LiveSelector:         "//li[@class='archive_li']",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//h4"),
	ArtistsQuerier:       *htmlquerier.Q("//p[@class='schedule_act']").SplitIgnoreWithin(`[\n/、]`, '(', ')'),
	PriceQuerier:         *htmlquerier.Q("//p[@class='schedule_price']"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='schedule_year']"),
		MonthQuerier:     *htmlquerier.Q("//p[@class='schedule_day']"),
		DayQuerier:       *htmlquerier.Q("//p[@class='schedule_day']").After("."),
		OpenTimeQuerier:  *htmlquerier.Q("//p[@class='schedule_time']"),
		StartTimeQuerier: *htmlquerier.Q("//p[@class='schedule_time']").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-kurage",
	Latitude:       34.674088,
	Longitude:      135.504297,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         10,
		FirstLiveTitle:        "天女神樂 神楽祭『〜花〜』",
		FirstLiveArtists:      []string{"天女神樂", "Panic×Panic", "メイビスレーヌ"},
		FirstLivePrice:        "前売3,500円/当日4,000円(ドリンク代別途600円)/カメラ登録料+1,000円",
		FirstLivePriceEnglish: "Reservation3,500円/Door4,000円(DrinkNot included in ticket600円)/Camera fee+1,000円",
		FirstLiveOpenTime:     time.Date(2024, 3, 10, 18, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 10, 18, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://livehouse-kurage.com/schedule/%e5%a4%a9%e5%a5%b3%e7%a5%9e%e6%a8%82-%e7%a5%9e%e6%a5%bd%e7%a5%ad%e3%80%8e%e3%80%9c%e8%8a%b1%e3%80%9c%e3%80%8f/",
	},
}
View Source
var ShinsaibashiLoftPlusOneWestFetcher = fetchers.CreateLoftFetcher(
	"https://www.loft-prj.co.jp/",
	"https://www.loft-prj.co.jp/schedule/west/date/20%d/%02d",
	"osaka",
	"shinsaibashi",
	"shinsaibashi-loftplusonewest",
	fetchers.TestInfo{
		NumberOfLives:         25,
		FirstLiveTitle:        "はっぴー空間",
		FirstLiveArtists:      []string{"ChanceMovement"},
		FirstLivePrice:        "◎観覧について\n前売,当日共に¥1,500(共に1オーダー必須(¥500以上))\n■観覧チ...",
		FirstLivePriceEnglish: "◎観覧について\nReservation,Door共に¥1,500(共に1オーダー必須(¥500以上))\n■観覧チ...",
		FirstLiveOpenTime:     time.Date(2024, 3, 2, 12, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 2, 12, 30, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.loft-prj.co.jp/schedule/west/277016",
	},
	34.670088,
	135.505141,
)
View Source
var ShinsaibashiMuseFetcher = fetchers.Simple{
	BaseURL:              "http://osaka.muse-live.com/",
	ShortYearIterableURL: "http://osaka.muse-live.com/schedule/?y=20%d&m=%d",
	LiveSelector:         "//article[@class='media schedule']",
	TitleQuerier:         *htmlquerier.Q("//h3"),
	ArtistsQuerier:       *htmlquerier.QAll("//div[@class='schedule_content']/p[1]/a"),
	PriceQuerier:         *htmlquerier.Q("//ul[@class='schedule_info_list']/li[2]/span[2]").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//div[@class='schedule_date']/span"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='month']"),
		DayQuerier:       *htmlquerier.Q("//span[@class='month']/following-sibling::text()"),
		OpenTimeQuerier:  *htmlquerier.Q("//ul[@class='schedule_info_list']/li[1]/span[2]"),
		StartTimeQuerier: *htmlquerier.Q("//ul[@class='schedule_info_list']/li[1]/span[2]").After("/"),

		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-muse",
	Latitude:       34.672263,
	Longitude:      135.502109,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         28,
		FirstLiveTitle:        "FASTMUSIC CARNIVAL TOUR2024",
		FirstLiveArtists:      []string{"Bentham", "SAKANAMON", "板歯目"},
		FirstLivePrice:        "ADV.¥4,000 入場時DRINK代別途600円必要",
		FirstLivePriceEnglish: "ADV.¥4,000 When enteringDRINKNot included in ticket600円Necessary",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://osaka.muse-live.com/schedule/?y=20%d&m=%d",
	},
}
View Source
var ShinsaibashiPangeaFetcher = fetchers.Simple{
	BaseURL:             "https://liveanima.jp/",
	InitialURL:          "https://livepangea.com/schedule/",
	LiveSelector:        "//div[contains(@class, 'eo-events')]/div",
	DetailsLinkSelector: "//a",
	TitleQuerier:        *htmlquerier.Q("//a").CutWrapper(`"`, `"`),
	ArtistsQuerier:      *htmlquerier.Q("//span[text()='出演者']/following-sibling::p").SplitIgnoreWithin("[/\n]", '(', ')'),
	PriceQuerier:        *htmlquerier.Q("//span[text()='PRICE']/following-sibling::text()").ReplaceAllRegex(`(\s| )+`, " "),

	TimeHandler: fetchers.TimeHandler{
		MonthQuerier:     *htmlquerier.Q("//p[contains(@class,'live_mom')]"),
		DayQuerier:       *htmlquerier.Q("//p[contains(@class,'live_day')]"),
		OpenTimeQuerier:  *htmlquerier.Q("//span[text()='OPEN']/following-sibling::text()"),
		StartTimeQuerier: *htmlquerier.Q("//span[text()='START']/following-sibling::text()"),

		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-pangea",
	Latitude:       34.671863,
	Longitude:      135.498922,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         69,
		FirstLiveTitle:        "Lyanas 1st mini Album「Telescope of You」Release Tour “共鳴シンフォニア”",
		FirstLiveArtists:      []string{"Lyanas", "Cleo", "しゃららんベイビーズ", "Serpent Stellar"},
		FirstLivePrice:        "ADV ¥2500 DOOR ¥3000 【+1drink(¥600)】",
		FirstLivePriceEnglish: "ADV ¥2500 DOOR ¥3000 【+1drink(¥600)】",
		FirstLiveOpenTime:     time.Date(util.GetRelevantYear(3), 3, 7, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(util.GetRelevantYear(3), 3, 7, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://livepangea.com/live/event-17706",
	},
}
View Source
var ShinsaibashiQupeFetcher = fetchers.Simple{
	BaseURL:              "https://www.skqupe.com/",
	InitialURL:           "https://www.skqupe.com/live/",
	LiveSelector:         "//div[@class='live-list']/ul/li",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//span[.='TITLE']/following-sibling::span/span[@class='highlight']"),
	ArtistsQuerier:       *htmlquerier.Q("//span[contains(@class, 'act-wrap')]").Split("\n"),
	PriceQuerier:         *htmlquerier.Q("//span[.='TICKET']/following-sibling::span"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[.='DATE']/following-sibling::span/span[@class='highlight']"),
		MonthQuerier:     *htmlquerier.Q("//span[.='DATE']/following-sibling::span/span[@class='highlight']").After("/"),
		DayQuerier:       *htmlquerier.Q("//span[.='DATE']/following-sibling::span/span[@class='highlight']").After("/").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//span[.='TIME']/following-sibling::span"),
		StartTimeQuerier: *htmlquerier.Q("//span[.='TIME']/following-sibling::span").After("START"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-qupe",
	Latitude:       34.671312,
	Longitude:      135.495938,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         2,
		FirstLiveTitle:        "ONE SHOT‼︎",
		FirstLiveArtists:      []string{"JUU(Section U.G)", "カッチョ (Xmas Eileen)", "Shige-Bitch (HARVEST)", "ナオミチ(KNOCK OUT MONKEY)", "kimists (THE GAME SHOP)", "Da!sK (OXYMORPHONN)", "tAiki", "爆裂", "RiKU(Junk Story)", "大和 (I CRY RED)"},
		FirstLivePrice:        "CHARGE ¥1000",
		FirstLivePriceEnglish: "CHARGE ¥1000",
		FirstLiveOpenTime:     time.Date(2024, 3, 15, 23, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 15, 23, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://www.skqupe.com/live/22009bd7-c3de-4f00-be81-bc29b8780d4c",
	},
}
View Source
var ShinsaibashiSocoreFactoryFetcher = fetchers.Simple{
	BaseURL:              "https://socorefactory.com/",
	ShortYearIterableURL: "https://socorefactory.com/schedule/20%d/%02d/",
	LiveSelector:         "//div[@class='schedule']",
	ExpandedLiveSelector: "//a",
	TitleQuerier:         *htmlquerier.Q("//h1").ReplaceAllRegex(`\s+`, " "),
	ArtistsQuerier:       *htmlquerier.QAll("//p[@class='act']/text()"),
	PriceQuerier:         *htmlquerier.Q("//p[@class='act']/following-sibling::p[1]").SplitIndex("Adv:", 1).Prefix("Adv:").ReplaceAllRegex(`\s+`, " "),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("//span[@class='singledate']"),
		MonthQuerier:     *htmlquerier.Q("//span[@class='singledate']").After("/"),
		DayQuerier:       *htmlquerier.Q("//span[@class='singledate']").After("/").After("/"),
		OpenTimeQuerier:  *htmlquerier.Q("//span[@class='lives'][.='Open:']/following-sibling::text()"),
		StartTimeQuerier: *htmlquerier.Q("//span[@class='lives'][.='Start:']/following-sibling::text()"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-socorefactory",
	Latitude:       34.672663,
	Longitude:      135.491047,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         25,
		FirstLiveTitle:        "ナインティーズは突然に 7th Anniversary ライブ",
		FirstLiveArtists:      []string{"オナニ渕剛 (LIVE)", "モンゴール☆天山 (LIVE)", "男藪下 (LIVE)", "サカグチマナブ (DJ)", "ワンダラー王子が歌う90年代ヒットパレード", "牧野渚 (THE YANG)", "藤本ぽやな (UNDERHAIRZ)", "dododrum", "DJ naonari ueda", "江口YOU介", "デス声シェフ (生前葬喪主)"},
		FirstLivePrice:        "Adv:¥1,600 (D込) / Door:¥1,600 (D込)",
		FirstLivePriceEnglish: "Adv:¥1,600 (D込) / Door:¥1,600 (D込)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://socorefactory.com/schedule/2024/03/01/%%e3%%83%%8a%%e3%%82%%a4%%e3%%83%%b3%%e3%%83%%86%%e3%%82%%a3%%e3%%83%%bc%%e3%%82%%ba%%e3%%81%%af%%e7%%aa%%81%%e7%%84%%b6%%e3%%81%%ab-7th-anniversary/",
	},
}
View Source
var ShinsaibashiSomaFetcher = fetchers.Simple{
	BaseURL:              "http://www.will-music.net/",
	ShortYearIterableURL: "http://www.will-music.net/soma/liveschedule/date/20%d/%02d/",
	LiveSelector:         "//div[@class='archive_wrap wow fadeInUp'][not(contains(.//span[@style='font-size: 20px;'], 'RENTAL'))]",
	TitleQuerier:         *htmlquerier.QAll("//span[@style='font-size: 20px;']").Join(" "),
	ArtistsQuerier: *htmlquerier.QAll("//div[@class='event_detail']/p[not(./span[@style='font-size: 20px;'])]").AddComplexFilter(func(old []string) []string {
		re, err := regexp.Compile(`\d{2}:\d{2}`)
		if err != nil {
			return old
		}
		re2, err := regexp.Compile(`【.*】`)
		if err != nil {
			return old
		}

		newArr := make([]string, 0)
		for _, s := range old {
			if strings.Contains(s, "チケット") {
				break
			}
			if re.FindStringIndex(s) != nil {
				break
			}
			newArr = append(newArr, re2.ReplaceAllString(s, ""))
		}
		return newArr
	}).SplitIgnoreWithin("[/\n]", '(', ')'),
	DetailQuerier: *htmlquerier.QAll("//div[@class='event_detail']/p/text()"),

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:  *htmlquerier.Q("//span[@class='date']"),
		MonthQuerier: *htmlquerier.Q("//span[@class='date']").After("年"),
		DayQuerier:   *htmlquerier.Q("//span[@class='date']").After("月"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-soma",
	Latitude:       34.671163,
	Longitude:      135.505578,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         18,
		FirstLiveTitle:        "『TATSUNORI YAGI presents  LIVE and LIVEPHOTO EXHIBITION  光が鳴り響く瞬間 vol.5』",
		FirstLiveArtists:      []string{"くぴぽ", "Cosmoslay", "sui sui", "0番線と夜明け前", "望まひろ", "まちだガールズ・クワイア", "都の国のアリス"},
		FirstLivePrice:        "■チケット:前売3,300円+1D/当日3,800円+1D",
		FirstLivePriceEnglish: "■ Ticket:Reservation3,300円+1D/Door3,800円+1D",
		FirstLiveOpenTime:     time.Date(2024, 3, 9, 13, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 9, 14, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://www.will-music.net/soma/liveschedule/date/20%d/%02d/",
	},
}
View Source
var ShinsaibashiUtausakanaFetcher = fetchers.Simple{
	BaseURL:             "http://utausakana.com/",
	InitialURL:          "http://utausakana.com/menu/",
	NextSelector:        "//div[@class='pager']/a[@class='next']",
	LiveSelector:        "//div[@class='menu_body']/p[text()='act)']",
	TitleQuerier:        *htmlquerier.Q("/preceding::p[1]").CutWrapper("『", "』"),
	ArtistsQuerier:      *htmlquerier.QAll("/following-sibling::p").DeleteFrom("\u00A0"),
	PriceQuerier:        *htmlquerier.QAll("/following-sibling::p").DeleteUntil("\u00A0").KeepIndex(1).ReplaceAll("\u00A0", ""),
	DetailsLinkSelector: "/ancestor::div[@class='menu_body']/div[@class='menu_title']/a",

	TimeHandler: fetchers.TimeHandler{
		YearQuerier:      *htmlquerier.Q("/ancestor::div[@class='menu_list']/div[@class='menu_category']"),
		MonthQuerier:     *htmlquerier.Q("/ancestor::div[@class='menu_list']/div[@class='menu_category']").After("年"),
		DayQuerier:       *htmlquerier.Q("/ancestor::div[@class='menu_body']/div[@class='menu_title']").After("/"),
		OpenTimeQuerier:  *htmlquerier.QAll("/following-sibling::p").DeleteUntil("\u00A0").KeepIndex(0),
		StartTimeQuerier: *htmlquerier.QAll("/following-sibling::p").DeleteUntil("\u00A0").KeepIndex(0).After("/").After("/"),

		IsYearInLive:  true,
		IsMonthInLive: true,
	},

	PrefectureName: "osaka",
	AreaName:       "shinsaibashi",
	VenueID:        "shinsaibashi-utausakana",
	Latitude:       34.671188,
	Longitude:      135.503188,

	TestInfo: fetchers.TestInfo{
		NumberOfLives:         37,
		FirstLiveTitle:        "song日和",
		FirstLiveArtists:      []string{"杉本ラララ", "清原ありさ", "osakana", "雨蘭"},
		FirstLivePrice:        "adv/day ¥2500(1d別)",
		FirstLivePriceEnglish: "adv/day ¥2500(1dSeparately)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "http://utausakana.com/menu/1023584",
	},
}

this is insanity

View Source
var ShinsaibashiVaronFetcher = fetchers.CreateBassOnTopFetcher(
	"https://osaka-varon.jp/",
	"https://osaka-varon.jp/schedule/calendar/20%d/%02d/",
	"osaka",
	"shinsaibashi",
	"shinsaibashi-varon",
	fetchers.TestInfo{
		NumberOfLives:         29,
		FirstLiveTitle:        "The Dust’n’Bonez 「20th anniversary」",
		FirstLiveArtists:      []string{"The Dust’n’Bonez"},
		FirstLivePrice:        "ADV/DOOR ¥5000/¥5500(1D別・整理番号付・税込)",
		FirstLivePriceEnglish: "ADV/DOOR ¥5000/¥5500(1 Drink purchase required・Numbered tickets (may affect entry order)・Incl. Tax)",
		FirstLiveOpenTime:     time.Date(2024, 3, 1, 18, 30, 0, 0, util.JapanTime),
		FirstLiveStartTime:    time.Date(2024, 3, 1, 19, 0, 0, 0, util.JapanTime),
		FirstLiveURL:          "https://osaka-varon.jp/schedule/detail/31089",
	},
	34.675388,
	135.499734,
)

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL