From 2be613e0156e8f5c4e8f9630cc6e29b502c0d80e Mon Sep 17 00:00:00 2001 From: Nemo Date: Fri, 15 Apr 2022 23:25:32 +0530 Subject: [PATCH] [BookMyShowBridge] Add new bridge (#1349) --- bridges/BookMyShowBridge.php | 1458 ++++++++++++++++++++++++++++++++++ 1 file changed, 1458 insertions(+) create mode 100644 bridges/BookMyShowBridge.php diff --git a/bridges/BookMyShowBridge.php b/bridges/BookMyShowBridge.php new file mode 100644 index 00000000..342085b4 --- /dev/null +++ b/bridges/BookMyShowBridge.php @@ -0,0 +1,1458 @@ + 'Plays', + self::EVENTS => 'Events', + self::MOVIES => 'Movies', + ]; + + const CITIES = [ + // Most popular cities + 'Mumbai' => 'MUMBAI', + 'National Capital Region (NCR)' => 'NCR', + 'Bengaluru' => 'BANG', + 'Hyderabad' => 'HYD', + 'Ahmedabad' => 'AHD', + 'Chandigarh' => 'CHD', + 'Chennai' => 'CHEN', + 'Pune' => 'PUNE', + 'Kolkata' => 'KOLK', + 'Kochi' => 'KOCH', + + // Less common cities + 'Aalo' => 'AALU', + 'Abohar' => 'ABOR', + 'Abu Road' => 'ABRD', + 'Acharapakkam' => 'ACHA', + 'Adilabad' => 'ADIL', + 'Agar Malwa' => 'AGOR', + 'Agartala' => 'AGAR', + 'Agra' => 'AGRA', + 'Ahmedgarh' => 'AHMG', + 'Ahmednagar' => 'AHMED', + 'Aizawl' => 'AIZW', + 'Ajmer' => 'AJMER', + 'Akaltara' => 'AKAL', + 'Akividu' => 'AKVD', + 'Akola' => 'AKOL', + 'Alangudi' => 'ALNI', + 'Alappuzha' => 'ALPZ', + 'Alathur' => 'ALAR', + 'Alibaug' => 'ALBG', + 'Aligarh' => 'ALI', + 'Allagadda' => 'ALGD', + 'Almora' => 'ALMO', + 'Alwar' => 'ALWR', + 'Amadalavalasa' => 'ADAM', + 'Amalapuram' => 'AMAP', + 'Amaravathi' => 'AVTI', + 'Ambala' => 'AMB', + 'Ambikapur' => 'AMBI', + 'Ambur' => 'AMBR', + 'Amgaon' => 'AMGN', + 'Amravati' => 'AMRA', + 'Amritsar' => 'AMRI', + 'Anakapalle' => 'ANKP', + 'Anand' => 'AND', + 'Anantapalli' => 'ANTT', + 'Anantapur' => 'ANAN', + 'Anchal' => 'ANHL', + 'Angadipuram' => 'ANDM', + 'Angamaly' => 'ANGA', + 'Angara' => 'ANGR', + 'Angul' => 'ANGL', + 'Anjad' => 'ANJA', + 'Anjar' => 'ANJR', + 'Anklav' => 'ANKV', + 'Ankleshwar' => 'ANKL', + 'Annigeri' => 'ANGI', + 'Arakkonam' => 'ARAK', + 'Arambagh' => 'AMBH', + 'Aranthangi' => 'ARNT', + 'Ariyalur' => 'ARIY', + 'Arni' => 'ARNI', + 'Arsikere' => 'ARSI', + 'Aruppukottai' => 'ARUP', + 'Asansol' => 'ASANSOL', + 'Ashoknagar (West Bengal)' => 'ASNA', + 'Ashoknagar' => 'AKMP', + 'Aswaraopeta' => 'ASWA', + 'Atpadi' => 'ATPA', + 'Attili' => 'ATLI', + 'Aurangabad (Bihar)' => 'AUBI', + 'Aurangabad (West Bengal)' => 'AURW', + 'Aurangabad' => 'AURA', + 'Avinashi' => 'AVII', + 'Azamgarh' => 'AZMG', + 'B. Kothakota' => 'BKOT', + 'Badaun' => 'BADN', + 'Baddi' => 'BADD', + 'Badnawar' => 'BADR', + 'Bagbahara' => 'BBHA', + 'Bagha Purana' => 'BAPU', + 'Bagru' => 'BAGU', + 'Bahadurgarh' => 'BAHD', + 'Bahraich' => 'BHRH', + 'Baihar' => 'BIAH', + 'Baikunthpur' => 'BKTH', + 'Baindur' => 'BAND', + 'Bakhrahat' => 'BART', + 'Balaghat' => 'BLGT', + 'Balangir' => 'BALG', + 'Balasore' => 'BLSR', + 'Balijipeta' => 'BLIJ', + 'Balod' => 'BALD', + 'Baloda Bazar' => 'BBCH', + 'Balotra' => 'BALO', + 'Balrampur' => 'BLUR', + 'Balurghat' => 'BALU', + 'Bangarpet' => 'BAGT', + 'Banswada' => 'BNSA', + 'Banswara' => 'BANS', + 'Bantumilli' => 'BANT', + 'Barabanki' => 'BARK', + 'Baramati' => 'BARA', + 'Baraut' => 'BARL', + 'Bardoli' => 'BRDL', + 'Bareilly' => 'BARE', + 'Bargarh' => 'BARG', + 'Baripada' => 'BARI', + 'Barmer' => 'BARM', + 'Barnala' => 'BAR', + 'Barshi' => 'BRHI', + 'Barwani' => 'BRWN', + 'Basna' => 'BASN', + 'Basti' => 'BAST', + 'Bathinda' => 'BHAT', + 'Batlagundu' => 'BTGD', + 'Beawar' => 'BEAW', + 'Beed' => 'BEED', + 'Belagavi (Belgaum)' => 'BELG', + 'Bellampalli' => 'BELL', + 'Bellary' => 'BLRY', + 'Belur' => 'BELU', + 'Bemetara' => 'BMTA', + 'Berachampa' => 'BRAC', + 'Berhampore' => 'BEHA', + 'Berhampur' => 'BERP', + 'Bestavaripeta' => 'BEST', + 'Betul' => 'BETU', + 'Bhadrachalam' => 'BHDR', + 'Bhadrak' => 'BHAD', + 'Bhadravati' => 'BDVT', + 'Bhainsa' => 'BHAN', + 'Bhandara' => 'BHAA', + 'Bharamasagara' => 'BASA', + 'Bharuch' => 'BHAR', + 'Bhatapara' => 'BTAP', + 'Bhatkal' => 'BAKL', + 'Bhattiprolu' => 'BATT', + 'Bhavnagar' => 'BHNG', + 'Bhilai' => 'BHILAI', + 'Bhilwara' => 'BHIL', + 'Bhimadole' => 'BMDE', + 'Bhimavaram' => 'BHIM', + 'Bhiwadi' => 'BHWD', + 'Bhiwani' => 'BHWN', + 'Bhopal' => 'BHOP', + 'Bhubaneswar' => 'BHUB', + 'Bhuj' => 'BHUJ', + 'Bhuntar' => 'BHUN', + 'Bhupalpalle' => 'BHUP', + 'Bhusawal' => 'BHUS', + 'Biaora' => 'BIAR', + 'Bidar' => 'BIDR', + 'Bijnor' => 'BIJ', + 'Bijoynagar' => 'BIJO', + 'Bikaner' => 'BIK', + 'Bilara' => 'BILR', + 'Bilaspur (Himachal Pradesh)' => 'BIPS', + 'Bilaspur' => 'BILA', + 'Bilimora' => 'BILI', + 'Biraul' => 'BIRL', + 'Bishrampur' => 'BSRM', + 'Bodinayakanur' => 'BODI', + 'Boisar' => 'BOIS', + 'Bokaro' => 'BOKA', + 'Bolpur' => 'BLPR', + 'Bommidi' => 'BOMM', + 'Bongaigaon' => 'BONG', + 'Bongaon' => 'BONI', + 'Borsad' => 'BORM', + 'Brahmapur' => 'KHUB', + 'Brahmapuri' => 'BHMP', + 'Brajrajnagar' => 'BJNG', + 'Bulandshahr' => 'BULA', + 'Buldana' => 'BULD', + 'Bundu' => 'BUND', + 'Burdwan' => 'BURD', + 'Burhanpur' => 'BRHP', + 'Byadagi' => 'BYAD', + 'Chagallu' => 'CHAG', + 'Challakere' => 'CHLA', + 'Challapalli' => 'CHAP', + 'Champa' => 'CHAM', + 'Chanchal' => 'CCWC', + 'Chandausi' => 'CHDN', + 'Chandragiri' => 'CHAD', + 'Chandrakona' => 'CKNA', + 'Chandrapur' => 'CHAN', + 'Changanassery' => 'CNSY', + 'Channagiri' => 'CHGI', + 'Channarayapatna' => 'CHNN', + 'Chaygaon' => 'CHOG', + 'Cheepurupalli' => 'CHEE', + 'Chendrapinni' => 'CNPI', + 'Chengannur' => 'CHEG', + 'Chennur' => 'CHNU', + 'Cherial' => 'CHRY', + 'Cheyyar' => 'CHEY', + 'Chhibramau' => 'CHHI', + 'Chhindwara' => 'CHIN', + 'Chickmagaluru' => 'CHKA', + 'Chidambaram' => 'CHID', + 'Chikkaballapur' => 'CHIK', + 'Chikodi' => 'CHOK', + 'Chinturu' => 'CHTN', + 'Chirala' => 'CHIR', + 'Chitradurga' => 'CHIT', + 'Chittoor' => 'CHTT', + 'Chodavaram' => 'CDVM', + 'Chotila' => 'CHOT', + 'Coimbatore' => 'COIM', + 'Cooch Behar' => 'COBE', + 'Cuddalore' => 'CUDD', + 'Cuttack' => 'CUTT', + 'Dabra' => 'DABR', + 'Dahanu' => 'DHAU', + 'Dahegam' => 'DHGM', + 'Dahod' => 'DAHO', + 'Dakshin Barasat' => 'DAKS', + 'Dalli Rajhara' => 'DALL', + 'Daman' => 'DAMA', + 'Damoh' => 'DAMO', + 'Darjeeling' => 'DARJ', + 'Darsi' => 'DARS', + 'Dasuya' => 'DASU', + 'Dausa' => 'DAUS', + 'Davanagere' => 'DAVA', + 'Davuluru' => 'DVLR', + 'Deesa' => 'DEES', + 'Dehradun' => 'DEH', + 'Deoghar' => 'DOGH', + 'Devadurga' => 'DEVD', + 'Devarakonda' => 'DEVK', + 'Devgad' => 'DEGA', + 'Dewas' => 'DEWAS', + 'Dhampur' => 'DHPR', + 'Dhamtari' => 'DHMT', + 'Dhanbad' => 'DHAN', + 'Dhar' => 'DARH', + 'Dharamsala' => 'DMSL', + 'Dharapuram' => 'DHAR', + 'Dharmapuri' => 'DMPI', + 'Dharmavaram' => 'DDMA', + 'Dharwad' => 'DHAW', + 'Dhenkanal' => 'DNAL', + 'Dhoraji' => 'DHOR', + 'Dhule' => 'DHLE', + 'Dhuri' => 'DHRI', + 'Dibrugarh' => 'DIB', + 'Digras' => 'DIGR', + 'Dimapur' => 'DMPR', + 'Dindigul' => 'DIND', + 'Doddaballapura' => 'DDBP', + 'Domkal' => 'DMKL', + 'Dongargarh' => 'DONG', + 'Doraha' => 'DORH', + 'Durg' => 'DURG', + 'Durgapur' => 'DURGA', + 'Edappal' => 'EDPL', + 'Edlapadu' => 'EDLP', + 'Eluru' => 'ELRU', + 'Erattupetta' => 'ERAT', + 'Ernakulam' => 'ERNK', + 'Erode' => 'EROD', + 'Etawah' => 'ETWH', + 'Ettumanoor' => 'ETTU', + 'Faizabad' => 'FAZA', + 'Falna' => 'FALN', + 'Faridkot' => 'DKOT', + 'Fatehgarh Sahib' => 'FASA', + 'Fatehpur' => 'FATE', + 'Fatehpur(Rajasthan)' => 'FATR', + 'Firozpur' => 'FRZR', + 'G.Mamidada' => 'GMAD', + 'Gadag' => 'GADG', + 'Gadarwara' => 'GDWR', + 'Gadchiroli' => 'GDRO', + 'Gajendragarh' => 'GJGH', + 'Gajwel' => 'GAJW', + 'Ganapavaram' => 'GANP', + 'Gandhidham' => 'GDHAM', + 'Gandhinagar' => 'GNAGAR', + 'Gangavati' => 'GAVT', + 'Gangoh' => 'GANZ', + 'Gangtok' => 'GANG', + 'Ganjbasoda' => 'GANJ', + 'Garla' => 'GALA', + 'Gauribidanur' => 'GAUR', + 'Gaya' => 'GAYA', + 'Gingee' => 'GING', + 'Goa' => 'GOA', + 'Gobichettipalayam' => 'GOBI', + 'Godavarikhani' => 'GDVK', + 'Godhra' => 'GODH', + 'Gokak' => 'GKGK', + 'Gokavaram' => 'GOKM', + 'Golaghat' => 'GHT', + 'Gollaprolu' => 'GOLL', + 'Gonda' => 'GOND', + 'Gondia' => 'GNDA', + 'Gopalganj' => 'GOPG', + 'Gorakhpur' => 'GRKP', + 'Gorantla' => 'GORA', + 'Gotegaon' => 'GTGN', + 'Gownipalli' => 'GOWP', + 'Gudivada' => 'GUDI', + 'Gudiyatham' => 'GDTM', + 'Gudur' => 'GUDR', + 'Gulaothi' => 'GULL', + 'Guledgudda' => 'GULD', + 'Gummadidala' => 'GUMM', + 'Guna' => 'GUNA', + 'Guntakal' => 'GUNL', + 'Guntur' => 'GUNT', + 'Gurazala' => 'GURZ', + 'Guwahati' => 'GUW', + 'Gwalior' => 'GWAL', + 'Habra' => 'HARR', + 'Hagaribommanahalli' => 'HHGG', + 'Hajipur' => 'HAJI', + 'Haldia' => 'HLDI', + 'Haldwani' => 'HALD', + 'Haliya' => 'HALI', + 'Hampi' => 'HMPI', + 'Hardoi' => 'HRDI', + 'Haridwar' => 'HRDR', + 'Harihar' => 'HRRR', + 'Haripad' => 'HRPD', + 'Harugeri' => 'HARU', + 'Hasanpur' => 'HANS', + 'Hazaribagh' => 'HAZA', + 'Himmatnagar' => 'HIMM', + 'Hindaun City' => 'HIND', + 'Hisar' => 'HISR', + 'Honnali' => 'HONV', + 'Honnavara' => 'HNVR', + 'Hooghly' => 'HOOG', + 'Hoshiarpur' => 'HOSH', + 'Hoskote' => 'HOKT', + 'Hospet' => 'HOSP', + 'Hosur' => 'HSUR', + 'Howrah' => 'HWRH', + 'Hubballi (Hubli)' => 'HUBL', + 'Huvinahadagali' => 'HULI', + 'Ichalkaranji' => 'ICHL', + 'Ichchapuram' => 'ICPR', + 'Idappadi' => 'IDPI', + 'Idar' => 'IDAR', + 'Indapur' => 'INDA', + 'Indi' => 'IIND', + 'Indore' => 'IND', + 'Irinjalakuda' => 'IRNK', + 'Itanagar' => 'ITNG', + 'Itarsi' => 'ITAR', + 'Jabalpur' => 'JABL', + 'Jadcherla' => 'JADC', + 'Jagalur' => 'JAGA', + 'Jagatdal' => 'JGDL', + 'Jagdalpur' => 'JAGD', + 'Jaggampeta' => 'JAGG', + 'Jaggayyapeta' => 'JGGY', + 'Jagtial' => 'JGTL', + 'Jaipur' => 'JAIP', + 'Jaisalmer' => 'JSMR', + 'Jajpur Road' => 'JAJP', + 'Jalakandapuram' => 'JAKA', + 'Jalalabad' => 'JLAB', + 'Jalandhar' => 'JALA', + 'Jalgaon' => 'JALG', + 'Jalna' => 'JALN', + 'Jalpaiguri' => 'JPG', + 'Jami' => 'JAMI', + 'Jamkhed' => 'JAMK', + 'Jammalamadugu' => 'JAMD', + 'Jammu' => 'JAMM', + 'Jamnagar' => 'JAM', + 'Jamner' => 'JAMN', + 'Jamshedpur' => 'JMDP', + 'Jangaon' => 'JNGN', + 'Jangareddy Gudem' => 'JANG', + 'Janjgir' => 'JANR', + 'Jasdan' => 'JASD', + 'Jaunpur' => 'JANP', + 'Jehanabad' => 'JEHA', + 'Jetpur' => 'JETP', + 'Jewar' => 'JEWR', + 'Jeypore' => 'JEYP', + 'Jhabua' => 'JHAB', + 'Jhajjar' => 'JHAJ', + 'Jhansi' => 'JNSI', + 'Jharsuguda' => 'JRSG', + 'Jiaganj' => 'JAGJ', + 'Jind' => 'JIND', + 'Jodhpur' => 'JODH', + 'Jorhat' => 'JORT', + 'Junagadh' => 'JUGH', + 'Kadapa' => 'KDPA', + 'Kadi' => 'KADI', + 'Kaikaluru' => 'KAIK', + 'Kaithal' => 'KAIT', + 'Kakarapalli' => 'KAAP', + 'Kakinada' => 'KAKI', + 'Kalaburagi (Gulbarga)' => 'GULB', + 'Kalimpong' => 'KALI', + 'Kallakurichi' => 'KALL', + 'Kalol (Panchmahal)' => 'PANH', + 'Kalwakurthy' => 'KALW', + 'Kalyani' => 'KALY', + 'Kamanaickenpalayam' => 'KPLA', + 'Kamareddy' => 'KMRD', + 'Kamavarapukota' => 'KPKT', + 'Kambainallur' => 'KAMR', + 'Kamptee' => 'KAMP', + 'Kanakapura' => 'KAKP', + 'Kanchikacherla' => 'KNCH', + 'Kanchipuram' => 'KNPM', + 'Kandukur' => 'KAND', + 'Kangayam' => 'KGKM', + 'Kangra' => 'KANG', + 'Kanichar' => 'KANC', + 'Kanigiri' => 'KANI', + 'Kanipakam' => 'KAAM', + 'Kanjirappally' => 'KNNJ', + 'Kanker' => 'KANK', + 'Kannauj' => 'KANJ', + 'Kannur' => 'KANN', + 'Kanpur' => 'KANP', + 'Kanyakumari' => 'KAKM', + 'Karad' => 'KARD', + 'Karaikal' => 'KARA', + 'Karanja Lad' => 'KLAD', + 'Kareli' => 'KARE', + 'Karimangalam' => 'KARI', + 'Karimganj' => 'KRNJ', + 'Karimnagar' => 'KARIM', + 'Karjat' => 'KART', + 'Karkala' => 'KARK', + 'Karnal' => 'KARN', + 'Karunagapally' => 'KARG', + 'Karur' => 'KARU', + 'Karwar' => 'KWAR', + 'Kasdol' => 'KASD', + 'Kasgunj' => 'KASG', + 'Kashipur' => 'KASH', + 'Kasibugga' => 'KSBG', + 'Kathipudi' => 'KATP', + 'Kathua' => 'KATH', + 'Katihar' => 'KATI', + 'Kattappana' => 'AWCK', + 'Kaveripattinam' => 'KANM', + 'Kekri' => 'KEKR', + 'Keonjhar' => 'KNJH', + 'Kesinga' => 'KEGA', + 'Khachrod' => 'KHCU', + 'Khajipet' => 'KHAJ', + 'Khalilabad' => 'KHBD', + 'Khamgaon' => 'KHMG', + 'Khammam' => 'KHAM', + 'Khandwa' => 'KHDW', + 'Khanna' => 'KHAN', + 'Kharagpur' => 'KGPR', + 'Kharsia' => 'KHAS', + 'Khed' => 'KHED', + 'Khopoli' => 'KHOP', + 'Khurja' => 'KHUR', + 'Kichha' => 'KCHA', + 'Kishanganj' => 'KSGJ', + 'Kodad' => 'KODA', + 'Kodagu (Coorg)' => 'COOR', + 'Kodakara' => 'KDKR', + 'Kodungallur' => 'KODU', + 'Kokrajhar' => 'KKJR', + 'Kolar' => 'OLAR', + 'Kolhapur' => 'KOLH', + 'Kollam' => 'KOLM', + 'Kollengode' => 'KOLE', + 'Komarapalayam' => 'KOMA', + 'Kondagaon' => 'KNGN', + 'Kondlahalli' => 'KNAI', + 'Korba' => 'KRBA', + 'Kosamba' => 'KOSA', + 'Kota (AP)' => 'KOAN', + 'Kota' => 'KOTA', + 'Kothagudem' => 'KTGM', + 'Kothamangalam' => 'KTMM', + 'Kotkapura' => 'KOTK', + 'Kotpad' => 'KTPD', + 'Kotputli' => 'KPLI', + 'Kottayam' => 'KTYM', + 'Kovur (Nellore)' => 'KOVR', + 'Kovvur' => 'KOVU', + 'Koyyalagudem' => 'KOEM', + 'Kozhikode' => 'KOZH', + 'Kozhinjampara' => 'KOZA', + 'Krishnagiri' => 'KRHN', + 'Krishnanagar' => 'KNWB', + 'Krosuru' => 'KRSR', + 'Kruthivennu' => 'KRTH', + 'Kuchaman City' => 'KHCY', + 'Kukshi' => 'KUKS', + 'Kulithalai' => 'KULI', + 'Kullu' => 'KULU', + 'Kumbakonam' => 'KUMB', + 'Kunkuri' => 'KKRI', + 'Kurnool' => 'KURN', + 'Kurukshetra' => 'KURU', + 'Kutch' => 'KTCH', + 'Lakhimpur Kheri' => 'LKPK', + 'Lakhimpur' => 'LAHA', + 'Lakkavaram' => 'LRAM', + 'Lakshmeshwara' => 'LKSH', + 'Latur' => 'LAT', + 'Leh' => 'LEHL', + 'Lingasugur' => 'LING', + 'Lohardaga' => 'LOHA', + 'Lonavala' => 'LNVL', + 'Loni' => 'LONI', + 'Lucknow' => 'LUCK', + 'Ludhiana' => 'LUDH', + 'Macherla' => 'MACH', + 'Machilipatnam' => 'MAPM', + 'Madanapalle' => 'MDNP', + 'Maddur' => 'MADD', + 'Madhavaram' => 'MDHA', + 'Madhepura' => 'MHEA', + 'Madhira' => 'MADR', + 'Madurai' => 'MADU', + 'Magadi' => 'MAGA', + 'Mahabubabad' => 'MAHA', + 'Mahad' => 'MHAD', + 'Mahbubnagar' => 'MAHB', + 'Maheshwar' => 'MAHE', + 'Mahishadal' => 'MMAI', + 'Mahudha' => 'MAHU', + 'Malebennur' => 'MEBN', + 'Malegaon' => 'MALE', + 'Malerkotla' => 'MALR', + 'Mall' => 'MAAL', + 'Malout' => 'MALO', + 'Mamallapuram' => 'MMLL', + 'Manali' => 'MANA', + 'Manapparai' => 'MAPI', + 'Manawar' => 'MANW', + 'Mancherial' => 'MANC', + 'Mandapeta' => 'MAND', + 'Mandi Gobindgarh' => 'MBBH', + 'Mandla' => 'MADL', + 'Mandsaur' => 'MNDS', + 'Mandya' => 'MND', + 'Manendragarh' => 'MANE', + 'Mangalagiri' => 'MGLR', + 'Mangaldoi' => 'MANG', + 'Mangaluru (Mangalore)' => 'MLR', + 'Manikonda (AP)' => 'MNAP', + 'Manipal' => 'MANI', + 'Manjeri' => 'MAJR', + 'Mannargudi' => 'MANB', + 'Mannarkkad' => 'MKKA', + 'Mansa' => 'MNSA', + 'Manuguru' => 'MNGU', + 'Maraimalai Nagar' => 'MMNR', + 'Markapur' => 'MARK', + 'Marripeda' => 'MARR', + 'Marthandam' => 'MRDM', + 'Mathura' => 'MATH', + 'Mattannur' => 'MATT', + 'Mavellikara' => 'MVLR', + 'Medak' => 'MDAK', + 'Medarametla' => 'MDRM', + 'Meerut' => 'MERT', + 'Mehsana' => 'MEHS', + 'Memari' => 'MMRR', + 'Metpally' => 'METT', + 'Mettuppalayam' => 'MTPM', + 'Miryalaguda' => 'MRGD', + 'Mirzapur' => 'MIZP', + 'Moga' => 'MOGA', + 'Mohali' => 'MOHL', + 'Molakalmuru' => 'MOLA', + 'Moodbidri' => 'MOOD', + 'Moradabad' => 'MORA', + 'Moranhat' => 'MORH', + 'Morbi' => 'MOBI', + 'Morena' => 'MRMP', + 'Motihari' => 'MOTI', + 'Moyna' => 'MAYN', + 'Muddebihal' => 'MUDD', + 'Mudhol' => 'MUDL', + 'Mughalsarai' => 'MGSI', + 'Mukkam' => 'MUKM', + 'Muktsar' => 'MKST', + 'Mullanpur' => 'MULL', + 'Mummidivaram' => 'MUMM', + 'Mundakayam' => 'MUAM', + 'Mundra' => 'MUDA', + 'MUNNAR' => 'MUNN', + 'Muradnagar' => 'MRDG', + 'Murtizapur' => 'MUUR', + 'Musiri' => 'MUSI', + 'Mussoorie' => 'MSS', + 'Muvattupuzha' => 'MUVA', + 'Muzaffarnagar' => 'MUZ', + 'Muzaffarpur' => 'MUZA', + 'Mydukur' => 'MYDU', + 'Mysuru (Mysore)' => 'MYS', + 'Nabadwip' => 'NABB', + 'Nadiad' => 'NADI', + 'Nagaon' => 'NAAM', + 'Nagapattinam' => 'NGPT', + 'Nagari' => 'NAGI', + 'Nagarkurnool' => 'NGKL', + 'Nagda' => 'NAGD', + 'Nagercoil' => 'NAGE', + 'Nagothane' => 'NAGO', + 'Nagpur' => 'NAGP', + 'Naihati' => 'NHTA', + 'Nainital' => 'NAIN', + 'Nakhatrana' => 'NKHT', + 'Nalgonda' => 'NALK', + 'Namakkal' => 'NMKL', + 'Namchi' => 'NAMI', + 'Nanded' => 'NAND', + 'Nandigama' => 'NDGM', + 'Nandurbar' => 'NDNB', + 'Nandyal' => 'NADY', + 'Nanjanagudu' => 'NJGU', + 'Nanpara' => 'NANP', + 'Narasannapeta' => 'NRPT', + 'Narasaraopet' => 'NSPT', + 'Narayankhed' => 'NARY', + 'Narayanpur' => 'NRYA', + 'Nargund' => 'NRGD', + 'Narnaul' => 'NARN', + 'Narsampet' => 'NASP', + 'Narsapur' => 'NARP', + 'Narsipatnam' => 'NARS', + 'Nashik' => 'NASK', + 'Nathdwara' => 'NATW', + 'Navsari' => 'NVSR', + 'Nawalgarh' => 'NANA', + 'Nawanshahr' => 'NAVN', + 'Nawapara' => 'NAWA', + 'Nazira' => 'NZRA', + 'Nedumkandam' => 'NEDU', + 'Neemuch' => 'NMCH', + 'Nellimarla' => 'NLEM', + 'Ner Parsopant' => 'NERP', + 'New Tehri' => 'TEHR', + 'Neyveli' => 'NYVL', + 'Nidadavolu' => 'NDVD', + 'Nilagiri' => 'NIGA', + 'Nimbahera' => 'NIPA', + 'Nipani' => 'NIPN', + 'Nizamabad' => 'NIZA', + 'Nokha' => 'NKHA', + 'Nuzvid' => 'NZVD', + 'Nyamathi' => 'NYNT', + 'Ongole' => 'ONGL', + 'Ooty' => 'OOTY', + 'Osmanabad' => 'OSMA', + 'Ottapalam' => 'OTTP', + 'Padrauna' => 'PADR', + 'Pakala' => 'PAKA', + 'Pala' => 'PALL', + 'Palakkad' => 'PLKK', + 'Palakollu' => 'PLKL', + 'Palakonda' => 'PALK', + 'Palampur' => 'PALM', + 'Palanpur' => 'PALN', + 'Palasa' => 'PALS', + 'Palghar' => 'PALG', + 'Pali' => 'PAAL', + 'Pallipalayam' => 'PLLI', + 'Palwal' => 'PLWL', + 'Palwancha' => 'PLWA', + 'Pamarru' => 'PAMA', + 'Panchkula' => 'PNCH', + 'Pandalam' => 'PADM', + 'Pandharpur' => 'PNDH', + 'Panipat' => 'PAN', + 'Panruti' => 'PANT', + 'Papanasam' => 'PAPA', + 'Paralakhemundi' => 'PRKM', + 'Paratwada' => 'PARA', + 'Parbhani' => 'PARB', + 'Parchur' => 'PARC', + 'Parigi (Telangana)' => 'PARI', + 'Parvathipuram' => 'PRVT', + 'Patan' => 'PATA', + 'Pathalgaon' => 'PAHT', + 'Pathanamthitta' => 'PTNM', + 'Pathankot' => 'PATH', + 'Pathsala' => 'PATS', + 'Patiala' => 'PATI', + 'Patna' => 'PATN', + 'Pattambi' => 'PTMB', + 'Pattukkottai' => 'PATU', + 'Payakaraopeta' => 'PATE', + 'Payyanur' => 'PAYY', + 'Pedanandipadu' => 'PEDN', + 'Peddapalli' => 'PEDA', + 'Peddapuram' => 'PEDP', + 'Pen' => 'PEN', + 'Pendra' => 'PEND', + 'Pennagaram' => 'PENM', + 'Penuganchiprolu' => 'PENU', + 'Penugonda' => 'PDDG', + 'Perambalur' => 'PERA', + 'Peringottukurissi' => 'PERN', + 'Perinthalmanna' => 'PNTM', + 'Phagwara' => 'PHAG', + 'Phalodi' => 'PHLD', + 'Phaltan' => 'PHAL', + 'Pileru' => 'PLRU', + 'Pipariya' => 'PIPY', + 'Pithampur' => 'PITH', + 'Podili' => 'PODI', + 'Polavaram' => 'PLAB', + 'Pollachi' => 'POLL', + 'Pondicherry' => 'POND', + 'Ponduru' => 'PONU', + 'Ponnani' => 'PONN', + 'Porumamilla' => 'PORU', + 'Pratapgarh (Rajasthan)' => 'PTRT', + 'Pratapgarh (UP)' => 'PRAT', + 'Prathipadu' => 'PRTH', + 'Prayagraj (Allahabad)' => 'ALLH', + 'Proddatur' => 'PROD', + 'Pulluvila' => 'PULA', + 'Pulpally' => 'PULP', + 'Punalur' => 'PUNA', + 'Punganur' => 'PGNR', + 'Purnea' => 'PURN', + 'Purulia' => 'PURU', + 'Pusad' => 'PUSD', + 'Pusapatirega' => 'PREG', + 'Puttur' => 'PUTT', + 'Raebareli' => 'RAEB', + 'Rahimatpur' => 'RAHI', + 'Raibag' => 'RAIB', + 'Raigad' => 'RAI', + 'Raigarh' => 'RAIG', + 'Railway Koduru' => 'RLKD', + 'Raipur' => 'RAIPUR', + 'Raisinghnagar' => 'RSNG', + 'Rajamahendravaram (Rajahmundry)' => 'RJMU', + 'Rajapalayam' => 'RAYM', + 'Rajkot' => 'RAJK', + 'Rajnandgaon' => 'RAJA', + 'Rajpipla' => 'RJPA', + 'Rajpur' => 'RAJP', + 'Rajpura' => 'RARA', + 'Rajula' => 'RJLA', + 'Ramanagara' => 'RANG', + 'Ramayampet' => 'RAMP', + 'Ramgarhwa' => 'RGHA', + 'Ramnagar' => 'RAMN', + 'Rampur' => 'RAMU', + 'Ranaghat' => 'RANA', + 'Ranchi' => 'RANC', + 'Ranebennur' => 'RANE', + 'Rangia' => 'RAAA', + 'Raniganj' => 'RNGJ', + 'Ranipet' => 'RANI', + 'Ratlam' => 'RATL', + 'Ratnagiri (Odisha)' => 'RATO', + 'Ratnagiri' => 'RATN', + 'Ravulapalem' => 'RVPL', + 'Raxaul' => 'RAXA', + 'Rayachoti' => 'RYCT', + 'Rayavaram' => 'RAYA', + 'Renukoot' => 'RENU', + 'Repalle' => 'REPA', + 'Rewa' => 'RWAA', + 'Rewari' => 'REWA', + 'Rishikesh' => 'RKES', + 'Rishra' => 'RSRA', + 'Rohtak' => 'ROH', + 'Rourkela' => 'RKOR', + 'Routhulapudi' => 'ROUT', + 'Rudrapur' => 'RUDP', + 'Rupnagar' => 'RUPN', + 'Sadasivpet' => 'SADA', + 'Safidon' => 'SAFI', + 'Sagar' => 'SAMP', + 'Saharanpur' => 'SAHA', + 'Sakleshpur' => 'SASA', + 'Sakti' => 'SAKT', + 'Salem' => 'SALM', + 'Saligrama' => 'SGMA', + 'Salihundam' => 'SAHM', + 'Salur' => 'SALU', + 'Samalkota' => 'SAMA', + 'Sambalpur' => 'SAMB', + 'Sambhal' => 'SAML', + 'Samsi' => 'SAMS', + 'Sanawad' => 'SNWD', + 'Sangamner' => 'SMNE', + 'Sangareddy' => 'SARE', + 'Sangaria' => 'SAGR', + 'Sangli' => 'SANG', + 'Sangola' => 'SNGO', + 'Santhebennur' => 'STHB', + 'Saraipali' => 'SPAL', + 'Sarangarh' => 'SARH', + 'Sarangpur' => 'SARA', + 'Sardulgarh' => 'SARD', + 'Sarnath' => 'SART', + 'Sarni' => 'SARN', + 'Sasaram' => 'SARM', + 'Satara' => 'SATA', + 'Sathyamangalam' => 'STHY', + 'Satna' => 'SATN', + 'Sattenapalle' => 'SATL', + 'Secunderabad' => 'SCBD', + 'Seethanagaram' => 'SEET', + 'Sehore' => 'SEHO', + 'Semiliguda' => 'SIMI', + 'Sendhwa' => 'SEND', + 'Seoni Malwa' => 'SEMA', + 'Seoni' => 'SEON', + 'Shadnagar' => 'SHAD', + 'Shahada' => 'SHHA', + 'Shahdol' => 'SHAH', + 'Shahjahanpur' => 'SHJH', + 'Shajapur' => 'SJUR', + 'Shankarampet' => 'SHAN', + 'Shankarpally' => 'SKRP', + 'Sheorinarayan' => 'SHEO', + 'Shikaripur' => 'SHKR', + 'Shillong' => 'SHLG', + 'Shimla' => 'SMLA', + 'Shirali' => 'SHIR', + 'Shivamogga' => 'SHIA', + 'Shivpuri' => 'SHIV', + 'Shoranur' => 'SHNR', + 'Shrirampur' => 'SHUR', + 'Siddipet' => 'SDDP', + 'Sidlaghatta' => 'SIDL', + 'Sikar' => 'SIKR', + 'Silchar' => 'SIL', + 'Siliguri' => 'SILI', + 'Silvassa' => 'SILV', + 'Sindhanur' => 'SIND', + 'Sindhudurg' => 'SNDH', + 'Sinnar' => 'SINA', + 'Sircilla' => 'SIRC', + 'Sirohi' => 'SIRO', + 'Sirsi' => 'SRSI', + 'Siruguppa' => 'SPPA', + 'Sitamarhi' => 'SIMA', + 'Sitapur' => 'SITA', + 'Sivakasi' => 'SIV', + 'Sivasagar' => 'SVSG', + 'Solan' => 'SCO', + 'Solapur' => 'SOLA', + 'Sompeta' => 'SOMA', + 'Songadh' => 'SONG', + 'Sonipat' => 'RAIH', + 'Sonkatch' => 'SONH', + 'Sri Ganganagar' => 'SRIG', + 'Srikakulam' => 'SRKL', + 'Srinagar' => 'SRNG', + 'Srivaikuntam' => 'SRTA', + 'Srivilliputhur' => 'SRIV', + 'Station Ghanpur' => 'STGH', + 'Sultanpur' => 'SLUT', + 'Sulthan Bathery' => 'SULY', + 'Sundargarh' => 'SUND', + 'Surajpur' => 'SURA', + 'Surat' => 'SURT', + 'Surendranagar' => 'SRDN', + 'Suryapet' => 'SURY', + 'Tadepalligudem' => 'TADP', + 'Tallapudi' => 'TTPP', + 'Tallarevu' => 'TALL', + 'Talwandi Bhai' => 'TALW', + 'Tamluk' => 'TMLU', + 'Tanda' => 'TNDA', + 'Tandur' => 'TAND', + 'Tangutur' => 'TANG', + 'Tanuku' => 'TANK', + 'Tatipaka' => 'TATI', + 'Tenali' => 'TENA', + 'Tenkasi' => 'TENK', + 'Tezpur' => 'TEZP', + 'Thalassery' => 'THAY', + 'Thalayolaparambu' => 'THAL', + 'Thamarassery' => 'TMRY', + 'Thanipadi' => 'THPD', + 'Thanjavur' => 'TANJ', + 'Tharad' => 'THRD', + 'Theni' => 'THEN', + 'Thirubuvanai' => 'THRU', + 'Thiruthuraipoondi' => 'THND', + 'Thiruttani' => 'THTN', + 'Thiruvalla' => 'THVL', + 'Thiruvarur' => 'THVR', + 'Thodupuzha' => 'THOD', + 'Thorrur' => 'THOR', + 'Thottiyam' => 'THYM', + 'Thrissur' => 'THSR', + 'Thullur' => 'THUL', + 'Thuraiyur' => 'THYR', + 'Tilda Neora' => 'TNO', + 'Tindivanam' => 'TNVM', + 'Tinsukia' => 'TINS', + 'Tiptur' => 'TIPT', + 'Tiruchirappalli' => 'TRII', + 'Tirukoilur' => 'TRKR', + 'Tirunelveli' => 'TIRV', + 'Tirupati' => 'TIRU', + 'Tirupattur' => 'TRPR', + 'Tirupur' => 'TIRP', + 'Tirur' => 'TRUR', + 'Tiruvannamalai' => 'TVNM', + 'Titagarh' => 'TTGH', + 'Trichy' => 'TRIC', + 'Trivandrum' => 'TRIV', + 'Tumakuru (Tumkur)' => 'TUMK', + 'Tuticorin' => 'TTCN', + 'Udaipur' => 'UDAI', + 'Udaynarayanpur' => 'UDAY', + 'Udgir' => 'UDGR', + 'Udumalpet' => 'UDMP', + 'Udupi' => 'UDUP', + 'Ujjain' => 'UJJN', + 'Ulundurpet' => 'ULPT', + 'Umbergaon' => 'UMER', + 'Una' => 'BEEL', + 'Uthamapalayam' => 'UTHM', + 'Vadakara' => 'VDKR', + 'Vadakkencherry' => 'VDCY', + 'Vadalur' => 'VADA', + 'Vadanappally' => 'VADN', + 'Vadodara' => 'VAD', + 'Valigonda' => 'VALI', + 'Valluru' => 'VALL', + 'Valsad' => 'VLSD', + 'Vaniyambadi' => 'VANI', + 'Vapi' => 'VAPI', + 'Varadiyam' => 'VRYM', + 'Varanasi' => 'VAR', + 'Varkala' => 'VKAL', + 'Vatsavai' => 'VAST', + 'Vazhapadi' => 'VAZH', + 'Veeraghattam' => 'VEER', + 'Velangi' => 'VELG', + 'Velanthavalam' => 'VELM', + 'Vellakoil' => 'VELI', + 'Vellore' => 'VELL', + 'Vempalli' => 'VAIM', + 'Vemulawada' => 'VERU', + 'Venkatapuram' => 'VNKT', + 'Veraval' => 'VRAL', + 'Vetapalem' => 'VLEM', + 'Vijayapura (Bengaluru Rural)' => 'VIJP', + 'Vijayapura (Bijapur)' => 'VJPR', + 'Vijayarai' => 'VRAI', + 'Vijayawada' => 'VIJA', + 'Vikarabad' => 'VKBD', + 'Vikasnagar' => 'VKNG', + 'Vikravandi' => 'VIVI', + 'Villupuram' => 'VILL', + 'Virudhachalam' => 'VIDM', + 'Visnagar' => 'VISN', + 'Vizag (Visakhapatnam)' => 'VIZA', + 'Vizianagaram' => 'VIZI', + 'Vuyyuru' => 'VYUR', + 'Wai' => 'WAIP', + 'Wanaparthy' => 'WANA', + 'Wani' => 'WANI', + 'Warangal' => 'WAR', + 'Wardha' => 'WARD', + 'Warora' => 'WRRA', + 'Wyra' => 'WWAR', + 'Yadagirigutta' => 'YADG', + 'Yamunanagar' => 'YAMU', + 'Yavatmal' => 'YAVA', + 'Yelagiri' => 'YLGA', + 'Yelburga' => 'YELB', + 'Yellamanchili' => 'YLMN', + 'Yellandu' => 'YRLL', + 'Yemmiganur' => 'YEMM', + 'Zaheerabad' => 'ZAGE', + 'Zirakpur' => 'ZIRK', + ]; + + const PARAMETERS = [ + [ + 'city' => [ + 'name' => 'City', + 'type' => 'list', + 'defaultValue' => 'MUMBAI', + 'values' => self::CITIES, + ], + + 'category' => [ + 'name' => 'Category', + 'type' => 'list', + 'defaultValue' => self::MOVIES, + 'values' => [ + 'Plays' => self::PLAYS, + 'Events' => self::EVENTS, + 'Movies' => self::MOVIES, + ], + ], + 'language' => [ + 'name' => 'Language', + 'type' => 'list', + 'defaultValue' => 'all', + 'values' => [ + 'All' => 'all', + 'Kannada' => 'Kannada', + 'English' => 'English', + 'Hindi' => 'Hindi', + 'Telugu' => 'Telugu', + 'Tamil' => 'Tamil', + 'Malayalam' => 'Malayalam', + 'Gujarati' => 'Gujarati', + 'Assamese' => 'Assamese', + ] + ], + 'include_online' => [ + 'name' => 'Include Online Events', + 'type' => 'checkbox', + 'defaultValue' => false, + 'title' => 'Whether to include Online Events (applies only in case of "Events" category)' + ], + ] + ]; + + // Headers used in the generated table for Events/Plays + // Left is the BMS API Key, and right is the rendered version + const TABLE_HEADERS = [ + 'Genre' => 'Genre', + 'Language' => 'Language', + 'Length' => 'Length', + 'EventIsGlobal' => 'Global Event', + 'MinPrice' => 'Minimum Price', + // This doesn't seem to be used anywhere + // 'IsSuperstarExclusiveEvent' => 'SuperStar Exclusive', + 'EventSoldOut' => 'Sold Out', + ]; + + // Picked from EventGroup entry for movies + // Left is BMS API Ke, and right is the rendered version + const MOVIE_TABLE_HEADERS = [ + 'Duration' => 'Screentime', + 'EventCensor' => 'Rating', + ]; + + /* Common line that we want to edit out */ + const SYNOPSIS_REGEX = '/If you [\w\s,]+synopsis\@bookmyshow\.com/'; + + // Picked from the ChildEvents entries inside a Event Group + // for Movies + // Left is BMS API Key, right is rendered version + const INNER_MOVIE_HEADERS = [ + 'EventLanguage' => 'Language', + 'EventDimension' => 'Formats', + 'EventIsAtmosEnabled' => 'Dolby Atmos', + 'IsMovieClubEnabled' => 'Movie Club' + ]; + + // Primary URL for fetching information + // The city information is passed via a cookie + const URL_PREFIX = 'https://in.bookmyshow.com/serv/getData?cmd=QUICKBOOK&type='; + + public function collectData(){ + $city = $this->getInput('city'); + $category = $this->getInput('category'); + + $url = $this->makeUrl($category); + $headers = $this->makeHeaders($city); + + $data = json_decode(getContents($url, $headers), true); + + if ($category == self::MOVIES) { + $data = $data['moviesData']['BookMyShow']['arrEvents']; + } else { + $data = $data['data']['BookMyShow']['arrEvent']; + } + + foreach ($data as $event) { + $item = $this->generateEventData($event, $category); + if ($item and $this->matchesFilters($category, $event)) { + $this->items[] = $item; + } + } + + usort($this->items, function($a, $b) { + return $b['timestamp'] - $a['timestamp']; + }); + + $this->items = array_slice($this->items, 0, 15); + } + + private function makeUrl($category){ + return self::URL_PREFIX . $category; + } + + private function getDatesHtml($dates){ + $tz = new DateTimeZone(self::TIMEZONE); + $firstDate = DateTime::createFromFormat('Ymd', $dates[0]['ShowDateCode'], $tz) + ->format('D, d M Y'); + if (count($dates) == 1) { + return "

Date: $firstDate

"; + } + $lastDateIndex = count($dates) - 1; + $lastDate = DateTime::createFromFormat('Ymd', $dates[$lastDateIndex]['ShowDateCode']) + ->format('D, d M Y'); + return "

Dates: $firstDate - $lastDate

"; + } + + /** + * Given an event array, generates corresponding HTML entry + * @param array $event + * @see https://gist.github.com/captn3m0/6dbd539ca67579d22d6f90fab710ccd2 Sample JSON data for various events + */ + private function generateEventHtml($event, $category){ + $html = $this->getDatesHtml($event['arrDates']); + switch ($category) { + case self::MOVIES: + $html .= $this->generateMovieHtml($event); + break; + default: + $html .= $this->generateStandardHtml($event); + } + + $html .= $this->generateVenueHtml($event['arrVenues']); + return $html; + } + + /** + * Generates a simple Venue HTML, even for multiple venues + * spread across multiple dates as a description list. + */ + private function generateVenueHtml($venues){ + $html = '

Venues

'; + + foreach ($venues as $i => $venueData) { + $venueName = $venueData['VenueName']; + $address = $venueData['VenueAddress']; + $lat = $venueData['VenueLatitude']; + $lon = $venueData['VenueLongitude']; + + $directions = $this->generateDirectionsHtml($lat, $lon, $venueName); + $html .= ""; + } + + return "$html
VenueDirections
$venueName$address
$directions
"; + } + + /** + * Generates a simple Table with event Data + * @todo Add support for jsonGenre as a tags row + */ + private function generateEventDetailsTable($event, $headers = self::TABLE_HEADERS){ + $table = ''; + foreach ($headers as $key => $header) { + if ($header == 'Language') { + $this->languages = [$event[$key]]; + } + + if ($event[$key] == 'Y') { + $value = 'Yes'; + } else if ($event[$key] == 'N') { + $value = 'No'; + } else { + $value = $event[$key]; + } + + $table .= << + $header + $value + +EOT; + } + + return "$table
"; + } + + private function generateStandardHtml($event){ + $table = $this->generateEventDetailsTable($event); + + $imgsrc = $event['BannerURL']; + + return << +
+ $table +
+ More Details are available on the BookMyShow website. +EOT; + } + + /** + * Converts some movie details from child entries, such as language + * into a single row item, either as a list, or as a Y/N + */ + private function generateInnerMovieDetails($data){ + // Show list of languages and list of formats + $headers = ['EventLanguage', 'EventDimension']; + // if any of these has a Y for any of the screenings, mark it as YES + $booleanHeaders = [ + 'EventIsAtmosEnabled', 'IsMovieClubEnabled' + ]; + + $items = []; + + // Throw values inside $items[$headerName] + foreach ($data as $row) { + foreach ($headers as $header) { + $items[$header][] = $row[$header]; + } + foreach ($booleanHeaders as $header) { + $items[$header][] = $row[$header]; + } + } + + // Remove duplicate values (if all screenings are 2D for eg) + foreach ($headers as $header) { + $items[$header] = array_unique($items[$header]); + + if ($header == 'EventLanguage') { + $this->languages = $items[$header]; + } + } + + $html = ''; + + // Generate a list for first kind of entries + foreach ($headers as $header) { + $html .= self::INNER_MOVIE_HEADERS[$header] . ': ' . join(', ', $items[$header]) . '
'; + } + + // Put a yes for the boolean entries + foreach ($booleanHeaders as $header) { + if(in_array('Y', $items[$header])) { + $html .= self::INNER_MOVIE_HEADERS[$header] . ': Yes
'; + } + } + + return $html; + } + + private function generateMovieHtml($eventGroup){ + $data = $eventGroup['ChildEvents'][0]; + $table = $this->generateEventDetailsTable($data, self::MOVIE_TABLE_HEADERS); + + $imgsrc = sprintf(self::MOVIES_IMAGE_BASE_FORMAT, $data['EventImageCode']); + + $url = $this->generateMovieUrl($eventGroup); + + $innerHtml = $this->generateInnerMovieDetails($eventGroup['ChildEvents']); + + $synopsis = preg_replace(self::SYNOPSIS_REGEX, '', $data['EventSynopsis']); + + return << +
$table
+

$innerHtml

+

${synopsis}

+ More Details are available on the BookMyShow website and a trailer is available + here +EOT; + + } + + /** + * Generates a canonical movie URL + */ + private function generateMovieUrl($eventGroup){ + return self::URI . '/movies/' . $eventGroup['EventURLTitle'] . '/' . $eventGroup['EventCode']; + } + + private function generateMoviesData($eventGroup){ + // Additional data picked up from the first Child Event + $data = $eventGroup['ChildEvents'][0]; + $date = new DateTime($data['EventDate']); + + return [ + 'uri' => $this->generateMovieUrl($eventGroup), + 'title' => $eventGroup['EventTitle'], + 'timestamp' => $date->format('U'), + 'author' => 'BookMyShow', + 'content' => $this->generateMovieHtml($eventGroup), + 'enclosures' => [ + sprintf(self::MOVIES_IMAGE_BASE_FORMAT, $data['EventImageCode']), + ], + // Sample Input = |ADVENTURE|ANIMATION|COMEDY| + // Sample Output = ['Adventure', 'Animation', 'Comedy'] + 'categories' => array_filter( + explode('|', ucwords(strtolower($eventGroup['EventGrpGenre']), '|')) + ), + 'uid' => $eventGroup['EventGroup'] + ]; + } + + private function generateEventData($event, $category){ + if($category == self::MOVIES) { + return $this->generateMoviesData($event); + } + + return $this->generateGenericEventData($event, $category); + } + + /** + * Takes an event data as array and returns data for RSS Post + */ + private function generateGenericEventData($event, $category){ + $datetime = $event['Event_dtmCreated']; + if (empty($datetime)) { + return null; + } + $date = new DateTime($event['Event_dtmCreated']); + + return [ + 'uri' => $event['FShareURL'], + 'title' => $event['EventTitle'], + 'timestamp' => $date->format('U'), + 'author' => 'BookMyShow', + 'content' => $this->generateEventHtml($event, $category), + 'enclosures' => [ + $event['BannerURL'], + ], + 'categories' => array_merge( + [self::CATEGORIES[$category]], + $event['GenreArray'] + ), + 'uid' => $event['EventGroupCode'], + ]; + } + + /** + * Check if this is an online event. We can't rely on + * EventIsWebView, since that is set to Y for everything + */ + private function isEventOnline($event){ + if (isset($event['arrVenues']) && count($event['arrVenues']) === 1) { + if (preg_match('/(Online|Zoom)/i', $event['arrVenues'][0]['VenueName'])) { + return true; + } + } + + return false; + } + + private function matchesLanguage(){ + if ($this->getInput('language') !== 'all') { + $language = $this->getInput('language'); + return in_array($language, $this->languages); + } + return true; + } + + private function matchesOnline($event){ + if ($this->getInput('include_online')) { + return true; + } + return (!$this->isEventOnline($event)); + } + + /** + * Currently only checks if the language filter matches + */ + private function matchesFilters($category, $event){ + return $this->matchesLanguage() and $this->matchesOnline($event); + } + + /** + * Generates the RSS Feed title + */ + public function getName(){ + $city = $this->getInput('city'); + $category = $this->getInput('category'); + if(!is_null($city) and !is_null($category)) { + $categoryName = self::CATEGORIES[$category]; + $cityNames = array_flip(self::CITIES); + $cityName = $cityNames[$city]; + if ($this->getInput('language') !== 'null') { + $l = ucwords($this->getInput('language')); + // Sample: English Movies in Delhi + return "BookMyShow: $l $categoryName in $cityName"; + } + return "BookMyShow: $categoryName in $cityName"; + } + + return parent::getName(); + } + + /** + * Returns + * @param string $city City Code + * @return array list of headers + */ + private function makeHeaders($city){ + $uniqid = uniqid(); + $rgn = urlencode("|Code=$city|"); + return [ + "Cookie: bmsId=$uniqid; Rgn=$rgn;" + ]; + } + + /** + * Generates various URLs as per https://tools.ietf.org/html/rfc5870 + * and other standards + */ + private function generateDirectionsHtml($lat, $long, $address = ''){ + $address = urlencode($address); + + $links = [ + 'Apple Maps' => 'http://maps.apple.com/maps?q=%s,%s"', + 'Google Maps' => 'http://maps.google.com/maps?ll=%s,%s', + // 'Google Maps (Android)' => 'geo:%s,%s?q=%s', + // 'Google Maps (iOS)' => 'comgooglemaps://?center=%s,%s&zoom=12&views=traffic', + 'OpenStreetMap' => 'https://www.openstreetmap.org/?mlat=%s&mlon=%s&zoom=12', + 'GeoURI' => 'geo:%s,%s?q=%s', + ]; + + $html = ''; + + foreach ($links as $app => $str) { + $url = sprintf($str, $lat, $long, $address); + $locations[] = "$app"; + } + + $html .= implode(', ', $locations) . ''; + + return $html; + } +}