rss-bridge/bridges/BookMyShowBridge.php

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

1481 lines
45 KiB
PHP
Raw Normal View History

<?php
class BookMyShowBridge extends BridgeAbstract
{
const MAINTAINER = 'captn3m0';
const NAME = 'BookMyShow Bridge';
const URI = 'https://in.bookmyshow.com';
const MOVIES_IMAGE_BASE_FORMAT = 'https://in.bmscdn.com/iedb/movies/images/mobile/thumbnail/large/%s.jpg';
const DESCRIPTION = 'Returns the latest events on BookMyShow';
const TIMEZONE = 'Asia/Kolkata';
const PLAYS = 'PL';
const EVENTS = 'CT';
const MOVIES = 'MT';
const CATEGORIES = [
self::PLAYS => '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 "<p>Date: $firstDate</p>";
}
$lastDateIndex = count($dates) - 1;
$lastDate = DateTime::createFromFormat('Ymd', $dates[$lastDateIndex]['ShowDateCode'])
->format('D, d M Y');
return "<p>Dates: $firstDate - $lastDate</p>";
}
/**
* 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 = '<h3>Venues</h3><table><thead><tr><th>Venue</th><th>Directions</th></tr></thead><tbody>';
foreach ($venues as $i => $venueData) {
$venueName = $venueData['VenueName'];
$address = $venueData['VenueAddress'];
$lat = $venueData['VenueLatitude'];
$lon = $venueData['VenueLongitude'];
$directions = $this->generateDirectionsHtml($lat, $lon, $venueName);
$html .= "<tr><td>$venueName</td><td>$address<br>$directions</td></tr>";
}
return "$html</tbody></table>";
}
/**
* 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';
} elseif ($event[$key] == 'N') {
$value = 'No';
} else {
$value = $event[$key];
}
$table .= <<<EOT
<tr>
<th>$header</th>
<td>$value</td>
</tr>
EOT;
}
return "<table>$table</table>";
}
private function generateStandardHtml($event)
{
$table = $this->generateEventDetailsTable($event);
$imgsrc = $event['BannerURL'];
$FShareURL = $event['FShareURL'];
return <<<EOT
<img title="Event Banner URL" src="$imgsrc">
<br>
$table
<br>
More Details are available on the <a href="$FShareURL">BookMyShow website</a>.
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]) . '<br>';
}
// Put a yes for the boolean entries
foreach ($booleanHeaders as $header) {
if (in_array('Y', $items[$header])) {
$html .= self::INNER_MOVIE_HEADERS[$header] . ': Yes<br>';
}
}
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']);
$eventTrailerURL = $data['EventTrailerURL'];
return <<<EOT
<img title="Movie Poster" src="$imgsrc"></img>
<div>$table</div>
<p>$innerHtml</p>
<p>$synopsis</p>
More Details are available on the <a href="$url">BookMyShow website</a> and a trailer is available
<a href="$eventTrailerURL" title="Trailer URL">here</a>
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[] = "<a href='$url' title='$app'>$app</a>";
}
$html .= implode(', ', $locations) . '</span>';
return $html;
}
}