1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767 |
- <?php
- class ddg{
-
- public function __construct(){
-
- include "lib/backend.php";
- $this->backend = new backend("ddg");
-
- include "lib/fuckhtml.php";
- $this->fuckhtml = new fuckhtml();
- }
-
- /*
- curl functions
- */
- private const req_web = 0;
- private const req_xhr = 1;
-
- private function get($proxy, $url, $get = [], $reqtype = self::req_web){
-
- $curlproc = curl_init();
-
- if($get !== []){
- $get = http_build_query($get);
- $url .= "?" . $get;
- }
-
- curl_setopt($curlproc, CURLOPT_URL, $url);
-
- // http2 bypass
- curl_setopt($curlproc, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
-
- switch($reqtype){
- case self::req_web:
- $headers =
- ["User-Agent: " . config::USER_AGENT,
- "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
- "Accept-Encoding: gzip",
- "Accept-Language: en-US,en;q=0.5",
- "DNT: 1",
- "Sec-GPC: 1",
- "Connection: keep-alive",
- "Upgrade-Insecure-Requests: 1",
- "Sec-Fetch-Dest: document",
- "Sec-Fetch-Mode: navigate",
- "Sec-Fetch-Site: same-origin",
- "Sec-Fetch-User: ?1",
- "Priority: u=0, i",
- "TE: trailers"];
- break;
-
- case self::req_xhr:
- $headers =
- ["User-Agent: " . config::USER_AGENT,
- "Accept: application/json, text/javascript, */*; q=0.01",
- "Accept-Encoding: gzip",
- "Accept-Language: en-US,en;q=0.5",
- "Connection: keep-alive",
- "Referer: https://duckduckgo.com/",
- "X-Requested-With: XMLHttpRequest",
- "DNT: 1",
- "Sec-GPC: 1",
- "Connection: keep-alive",
- "Sec-Fetch-Dest: empty",
- "Sec-Fetch-Mode: cors",
- "Sec-Fetch-Site: same-origin",
- "TE: trailers"];
- break;
- }
-
- $this->backend->assign_proxy($curlproc, $proxy);
-
- curl_setopt($curlproc, CURLOPT_ENCODING, ""); // default encoding
- curl_setopt($curlproc, CURLOPT_HTTPHEADER, $headers);
-
- curl_setopt($curlproc, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curlproc, CURLOPT_SSL_VERIFYHOST, 2);
- curl_setopt($curlproc, CURLOPT_SSL_VERIFYPEER, true);
- curl_setopt($curlproc, CURLOPT_CONNECTTIMEOUT, 30);
- curl_setopt($curlproc, CURLOPT_TIMEOUT, 30);
-
- $data = curl_exec($curlproc);
-
- if(curl_errno($curlproc)){
- throw new Exception(curl_error($curlproc));
- }
-
- curl_close($curlproc);
- return $data;
- }
-
- public function getfilters($pagetype){
-
- switch($pagetype){
-
- case "web":
- return
- [
- "country" => [
- "display" => "Country",
- "option" => [
- "any" => "All Regions",
- "ar-es" => "Argentina",
- "au-en" => "Australia",
- "at-de" => "Austria",
- "be-fr" => "Belgium (fr)",
- "be-nl" => "Belgium (nl)",
- "br-pt" => "Brazil",
- "bg-bg" => "Bulgaria",
- "ca-en" => "Canada (en)",
- "ca-fr" => "Canada (fr)",
- "ct-ca" => "Catalonia",
- "cl-es" => "Chile",
- "cn-zh" => "China",
- "co-es" => "Colombia",
- "hr-hr" => "Croatia",
- "cz-cs" => "Czech Republic",
- "dk-da" => "Denmark",
- "ee-et" => "Estonia",
- "fi-fi" => "Finland",
- "fr-fr" => "France",
- "de-de" => "Germany",
- "gr-el" => "Greece",
- "hk-tzh" => "Hong Kong",
- "hu-hu" => "Hungary",
- "in-en" => "India (en)",
- "id-en" => "Indonesia (en)",
- "ie-en" => "Ireland",
- "il-en" => "Israel (en)",
- "it-it" => "Italy",
- "jp-jp" => "Japan",
- "kr-kr" => "Korea",
- "lv-lv" => "Latvia",
- "lt-lt" => "Lithuania",
- "my-en" => "Malaysia (en)",
- "mx-es" => "Mexico",
- "nl-nl" => "Netherlands",
- "nz-en" => "New Zealand",
- "no-no" => "Norway",
- "pk-en" => "Pakistan (en)",
- "pe-es" => "Peru",
- "ph-en" => "Philippines (en)",
- "pl-pl" => "Poland",
- "pt-pt" => "Portugal",
- "ro-ro" => "Romania",
- "ru-ru" => "Russia",
- "xa-ar" => "Saudi Arabia",
- "sg-en" => "Singapore",
- "sk-sk" => "Slovakia",
- "sl-sl" => "Slovenia",
- "za-en" => "South Africa",
- "es-ca" => "Spain (ca)",
- "es-es" => "Spain (es)",
- "se-sv" => "Sweden",
- "ch-de" => "Switzerland (de)",
- "ch-fr" => "Switzerland (fr)",
- "tw-tzh" => "Taiwan",
- "th-en" => "Thailand (en)",
- "tr-tr" => "Turkey",
- "us-en" => "US (English)",
- "us-es" => "US (Spanish)",
- "ua-uk" => "Ukraine",
- "uk-en" => "United Kingdom",
- "vn-en" => "Vietnam (en)"
- ]
- ],
- "nsfw" => [
- "display" => "NSFW",
- "option" => [
- "yes" => "Yes",
- "maybe" => "Maybe",
- "no" => "No"
- ]
- ],
- "newer" => [
- "display" => "Newer than",
- "option" => "_DATE"
- ],
- "older" => [
- "display" => "Older than",
- "option" => "_DATE"
- ],
- "extendedsearch" => [
- // undefined display, so it wont show in frontend
- "option" => [
- "yes" => "Yes",
- "no" => "No"
- ]
- ]
- ];
- break;
-
- case "images":
- return
- [
- "country" => [
- "display" => "Country",
- "option" => [
- "us-en" => "US (English)",
- "ar-es" => "Argentina",
- "au-en" => "Australia",
- "at-de" => "Austria",
- "be-fr" => "Belgium (fr)",
- "be-nl" => "Belgium (nl)",
- "br-pt" => "Brazil",
- "bg-bg" => "Bulgaria",
- "ca-en" => "Canada (en)",
- "ca-fr" => "Canada (fr)",
- "ct-ca" => "Catalonia",
- "cl-es" => "Chile",
- "cn-zh" => "China",
- "co-es" => "Colombia",
- "hr-hr" => "Croatia",
- "cz-cs" => "Czech Republic",
- "dk-da" => "Denmark",
- "ee-et" => "Estonia",
- "fi-fi" => "Finland",
- "fr-fr" => "France",
- "de-de" => "Germany",
- "gr-el" => "Greece",
- "hk-tzh" => "Hong Kong",
- "hu-hu" => "Hungary",
- "in-en" => "India (en)",
- "id-en" => "Indonesia (en)",
- "ie-en" => "Ireland",
- "il-en" => "Israel (en)",
- "it-it" => "Italy",
- "jp-jp" => "Japan",
- "kr-kr" => "Korea",
- "lv-lv" => "Latvia",
- "lt-lt" => "Lithuania",
- "my-en" => "Malaysia (en)",
- "mx-es" => "Mexico",
- "nl-nl" => "Netherlands",
- "nz-en" => "New Zealand",
- "no-no" => "Norway",
- "pk-en" => "Pakistan (en)",
- "pe-es" => "Peru",
- "ph-en" => "Philippines (en)",
- "pl-pl" => "Poland",
- "pt-pt" => "Portugal",
- "ro-ro" => "Romania",
- "ru-ru" => "Russia",
- "xa-ar" => "Saudi Arabia",
- "sg-en" => "Singapore",
- "sk-sk" => "Slovakia",
- "sl-sl" => "Slovenia",
- "za-en" => "South Africa",
- "es-ca" => "Spain (ca)",
- "es-es" => "Spain (es)",
- "se-sv" => "Sweden",
- "ch-de" => "Switzerland (de)",
- "ch-fr" => "Switzerland (fr)",
- "tw-tzh" => "Taiwan",
- "th-en" => "Thailand (en)",
- "tr-tr" => "Turkey",
- "us-es" => "US (Spanish)",
- "ua-uk" => "Ukraine",
- "uk-en" => "United Kingdom",
- "vn-en" => "Vietnam (en)"
- ]
- ],
- "nsfw" => [
- "display" => "NSFW",
- "option" => [
- "yes" => "Yes",
- "no" => "No"
- ]
- ],
- "date" => [
- "display" => "Time posted",
- "option" => [
- "any" => "Any time",
- "Day" => "Past day",
- "Week" => "Past week",
- "Month" => "Past month"
- ]
- ],
- "size" => [
- "display" => "Size",
- "option" => [
- "any" => "Any size",
- "Small" => "Small",
- "Medium" => "Medium",
- "Large" => "Large",
- "Wallpaper" => "Wallpaper"
- ]
- ],
- "color" => [
- "display" => "Colors",
- "option" => [
- "any" => "All colors",
- "Monochrome" => "Black and white",
- "Red" => "Red",
- "Orange" => "Orange",
- "Yellow" => "Yellow",
- "Green" => "Green",
- "Blue" => "Blue",
- "Purple" => "Purple",
- "Pink" => "Pink",
- "Brown" => "Brown",
- "Black" => "Black",
- "Gray" => "Gray",
- "Teal" => "Teal",
- "White" => "White"
- ]
- ],
- "type" => [
- "display" => "Type",
- "option" => [
- "any" => "All types",
- "photo" => "Photograph",
- "clipart" => "Clipart",
- "gif" => "Animated GIF",
- "transparent" => "Transparent"
- ]
- ],
- "layout" => [
- "display" => "Layout",
- "option" => [
- "any" => "All layouts",
- "Square" => "Square",
- "Tall" => "Tall",
- "Wide" => "Wide"
- ]
- ],
- "license" => [
- "display" => "License",
- "option" => [
- "any" => "All licenses", // blame ddg for this
- "Any" => "All Creative Commons",
- "Public" => "Public domain",
- "Share" => "Free to Share and Use",
- "ShareCommercially" => "Free to Share and Use Commercially",
- "Modify" => "Free to Modify, Share, and Use",
- "ModifyCommercially" => "Free to Modify, Share, and Use Commercially"
- ]
- ]
- ];
- break;
-
- case "videos":
- return
- [
- "country" => [
- "display" => "Country",
- "option" => [
- "us-en" => "US (English)",
- "ar-es" => "Argentina",
- "au-en" => "Australia",
- "at-de" => "Austria",
- "be-fr" => "Belgium (fr)",
- "be-nl" => "Belgium (nl)",
- "br-pt" => "Brazil",
- "bg-bg" => "Bulgaria",
- "ca-en" => "Canada (en)",
- "ca-fr" => "Canada (fr)",
- "ct-ca" => "Catalonia",
- "cl-es" => "Chile",
- "cn-zh" => "China",
- "co-es" => "Colombia",
- "hr-hr" => "Croatia",
- "cz-cs" => "Czech Republic",
- "dk-da" => "Denmark",
- "ee-et" => "Estonia",
- "fi-fi" => "Finland",
- "fr-fr" => "France",
- "de-de" => "Germany",
- "gr-el" => "Greece",
- "hk-tzh" => "Hong Kong",
- "hu-hu" => "Hungary",
- "in-en" => "India (en)",
- "id-en" => "Indonesia (en)",
- "ie-en" => "Ireland",
- "il-en" => "Israel (en)",
- "it-it" => "Italy",
- "jp-jp" => "Japan",
- "kr-kr" => "Korea",
- "lv-lv" => "Latvia",
- "lt-lt" => "Lithuania",
- "my-en" => "Malaysia (en)",
- "mx-es" => "Mexico",
- "nl-nl" => "Netherlands",
- "nz-en" => "New Zealand",
- "no-no" => "Norway",
- "pk-en" => "Pakistan (en)",
- "pe-es" => "Peru",
- "ph-en" => "Philippines (en)",
- "pl-pl" => "Poland",
- "pt-pt" => "Portugal",
- "ro-ro" => "Romania",
- "ru-ru" => "Russia",
- "xa-ar" => "Saudi Arabia",
- "sg-en" => "Singapore",
- "sk-sk" => "Slovakia",
- "sl-sl" => "Slovenia",
- "za-en" => "South Africa",
- "es-ca" => "Spain (ca)",
- "es-es" => "Spain (es)",
- "se-sv" => "Sweden",
- "ch-de" => "Switzerland (de)",
- "ch-fr" => "Switzerland (fr)",
- "tw-tzh" => "Taiwan",
- "th-en" => "Thailand (en)",
- "tr-tr" => "Turkey",
- "us-en" => "US (English)",
- "us-es" => "US (Spanish)",
- "ua-uk" => "Ukraine",
- "uk-en" => "United Kingdom",
- "vn-en" => "Vietnam (en)"
- ]
- ],
- "nsfw" => [
- "display" => "NSFW",
- "option" => [
- "yes" => "Yes",
- "no" => "No"
- ]
- ],
- "date" => [
- "display" => "Time fetched",
- "option" => [
- "any" => "Any time",
- "d" => "Past day",
- "w" => "Past week",
- "m" => "Past month"
- ]
- ],
- "resolution" => [ //videoDefinition
- "display" => "Resolution",
- "option" => [
- "any" => "Any resolution",
- "high" => "High definition",
- "standard" => "Standard definition"
- ]
- ],
- "duration" => [ // videoDuration
- "display" => "Duration",
- "option" => [
- "any" => "Any duration",
- "short" => "Short (>5min)",
- "medium" => "Medium (5-20min)",
- "long" => "Long (<20min)"
- ]
- ],
- "license" => [
- "display" => "License",
- "option" => [
- "any" => "Any license",
- "creativeCommon" => "Creative Commons",
- "youtube" => "YouTube Standard"
- ]
- ]
- ];
- break;
-
- case "news":
- return
- [
- "country" => [
- "display" => "Country",
- "option" => [
- "us-en" => "US (English)",
- "ar-es" => "Argentina",
- "au-en" => "Australia",
- "at-de" => "Austria",
- "be-fr" => "Belgium (fr)",
- "be-nl" => "Belgium (nl)",
- "br-pt" => "Brazil",
- "bg-bg" => "Bulgaria",
- "ca-en" => "Canada (en)",
- "ca-fr" => "Canada (fr)",
- "ct-ca" => "Catalonia",
- "cl-es" => "Chile",
- "cn-zh" => "China",
- "co-es" => "Colombia",
- "hr-hr" => "Croatia",
- "cz-cs" => "Czech Republic",
- "dk-da" => "Denmark",
- "ee-et" => "Estonia",
- "fi-fi" => "Finland",
- "fr-fr" => "France",
- "de-de" => "Germany",
- "gr-el" => "Greece",
- "hk-tzh" => "Hong Kong",
- "hu-hu" => "Hungary",
- "in-en" => "India (en)",
- "id-en" => "Indonesia (en)",
- "ie-en" => "Ireland",
- "il-en" => "Israel (en)",
- "it-it" => "Italy",
- "jp-jp" => "Japan",
- "kr-kr" => "Korea",
- "lv-lv" => "Latvia",
- "lt-lt" => "Lithuania",
- "my-en" => "Malaysia (en)",
- "mx-es" => "Mexico",
- "nl-nl" => "Netherlands",
- "nz-en" => "New Zealand",
- "no-no" => "Norway",
- "pk-en" => "Pakistan (en)",
- "pe-es" => "Peru",
- "ph-en" => "Philippines (en)",
- "pl-pl" => "Poland",
- "pt-pt" => "Portugal",
- "ro-ro" => "Romania",
- "ru-ru" => "Russia",
- "xa-ar" => "Saudi Arabia",
- "sg-en" => "Singapore",
- "sk-sk" => "Slovakia",
- "sl-sl" => "Slovenia",
- "za-en" => "South Africa",
- "es-ca" => "Spain (ca)",
- "es-es" => "Spain (es)",
- "se-sv" => "Sweden",
- "ch-de" => "Switzerland (de)",
- "ch-fr" => "Switzerland (fr)",
- "tw-tzh" => "Taiwan",
- "th-en" => "Thailand (en)",
- "tr-tr" => "Turkey",
- "us-en" => "US (English)",
- "us-es" => "US (Spanish)",
- "ua-uk" => "Ukraine",
- "uk-en" => "United Kingdom",
- "vn-en" => "Vietnam (en)"
- ]
- ],
- "nsfw" => [
- "display" => "NSFW",
- "option" => [
- "yes" => "Yes",
- "maybe" => "Maybe",
- "no" => "No"
- ]
- ],
- "date" => [
- "display" => "Time posted",
- "option" => [
- "any" => "Any time",
- "d" => "Past day",
- "w" => "Past week",
- "m" => "Past month"
- ]
- ]
- ];
- break;
-
- default:
- return [];
- break;
- }
- }
-
- public function web($get){
-
- if($get["npt"]){
-
- [$jsgrep, $proxy] = $this->backend->get($get["npt"], "web");
-
- $extendedsearch = false;
- $inithtml = "";
-
- }else{
- $search = $get["s"];
- if(strlen($search) === 0){
-
- throw new Exception("Search term is empty!");
- }
-
- $proxy = $this->backend->get_ip();
- $country = $get["country"];
- $nsfw = $get["nsfw"];
- $older = $get["older"];
- $newer = $get["newer"];
- $extendedsearch = $get["extendedsearch"] == "yes" ? true : false;
-
- // generate filters
- $get_filters = [
- "q" => $search,
- "kz" => "1" // force instant answers
- ];
-
- if($country == "any"){
-
- $get_filters["kl"] = "wt-wt";
- }else{
-
- $get_filters["kl"] = $country;
- }
-
- switch($nsfw){
-
- case "yes": $get_filters["kp"] = "-2"; break;
- case "maybe": $get_filters["kp"] = "-1"; break;
- case "no": $get_filters["kp"] = "1"; break;
- }
-
- $df = true;
-
- if($newer === false){
-
- if($older !== false){
-
- $start = 36000;
- $end = $older;
- }else{
-
- $df = false;
- }
- }else{
-
- $start = $newer;
-
- if($older !== false){
-
- $end = $older;
- }else{
-
- $end = time();
- }
- }
-
- if($df === true){
- $get_filters["df"] = date("Y-m-d", $start) . ".." . date("Y-m-d", $end);
- }
-
- /*
- Get html
- */
- try{
- $inithtml = $this->get(
- $proxy,
- "https://duckduckgo.com/",
- $get_filters
- );
- }catch(Exception $e){
-
- throw new Exception("Failed to get html");
- }
-
- preg_match(
- '/DDG\.deep\.initialize\(\'(.*)\',/U',
- $inithtml,
- $jsgrep
- );
-
- if(!isset($jsgrep[1])){
-
- throw new Exception("Failed to get d.js URL");
- }
-
- $jsgrep = $jsgrep[1];
- }
-
- // get javascript
- try{
-
- $js = $this->get(
- $proxy,
- "https://links.duckduckgo.com" . $jsgrep,
- [],
- ddg::req_xhr
- );
- }catch(Exception $e){
-
- throw new Exception("Failed to fetch d.js");
- }
-
- // initialize api response array
- $out = [
- "status" => "ok",
- "spelling" => [
- "type" => "no_correction",
- "using" => null,
- "correction" => null
- ],
- "npt" => null,
- "answer" => [],
- "web" => [],
- "image" => [],
- "video" => [],
- "news" => [],
- "related" => []
- ];
-
- /*
- Additional requests
- */
-
- if($extendedsearch){
-
- /*
- Check for worknik results
- */
- preg_match(
- '/nrj\(\'\/js\/spice\/dictionary\/definition\/([^\'\)]+)/',
- $js,
- $wordnik
- );
-
- if(isset($wordnik[1])){
-
- try{
-
- $wordnik = $wordnik[1];
-
- // get definition
- $wordnikjs = $this->get(
- $proxy,
- "https://duckduckgo.com/js/spice/dictionary/definition/" . $wordnik,
- [],
- ddg::req_xhr
- );
-
- preg_match(
- '/ddg_spice_dictionary_definition\(\n?(\[{[\S\s]*}])/',
- $wordnikjs,
- $wordnikjson
- );
-
- if(isset($wordnikjson[1])){
-
- $wordnikjson = json_decode($wordnikjson[1], true);
-
- $out["answer"][0] = [
- "title" => urldecode($wordnik),
- "description" => [],
- "url" => "https://www.wordnik.com/words/" . $wordnik,
- "thumb" => null,
- "table" => [],
- "sublink" => []
- ];
-
- $partofspeech = false;
- $wastext = false;
- $textindent = 1;
-
- // get audio
-
- $wordnikaudio_json =
- json_decode(
- $this->get(
- $proxy,
- "https://duckduckgo.com/js/spice/dictionary/audio/" . $wordnik,
- [],
- ddg::req_xhr
- ),
- true
- );
-
- if(isset($wordnikaudio_json[0]["id"])){
-
- usort($wordnikaudio_json, function($a, $b){
-
- return $a["id"] < $b["id"];
- });
-
- $out["answer"][0]["description"][] = [
- "type" => "audio",
- "url" => $wordnikaudio_json[0]["fileUrl"]
- ];
- }
-
- $collection = [];
- $e[] = [];
-
- foreach($wordnikjson as $data){
-
- if(!isset($data["partOfSpeech"])){
-
- continue;
- }
-
- if(isset($data["text"])){
-
- if(!isset($collection[$data["partOfSpeech"]])){
-
- $collection[$data["partOfSpeech"]] = [];
- $c = 0;
- }else{
- $c = count($collection[$data["partOfSpeech"]]);
- }
-
- if(!isset($e[$data["partOfSpeech"]])){
-
- $e[$data["partOfSpeech"]] = 0;
- }
-
- $e[$data["partOfSpeech"]]++;
- $text = $e[$data["partOfSpeech"]] . ". " . $this->unescapehtml(strip_tags($data["text"]));
-
- $syn = false;
- if(
- isset($data["relatedWords"]) &&
- count($data["relatedWords"]) !== 0
- ){
-
- $syn = " (";
-
- $u = 0;
- foreach($data["relatedWords"] as $related){
-
- $syn .= ucfirst($related["relationshipType"]) . ": ";
-
- $c = count($related["words"]);
- $b = 0;
- foreach($related["words"] as $word){
-
- $syn .= trim($this->unescapehtml(strip_tags($word)));
-
- $b++;
- if($b !== $c){
-
- $syn .= ", ";
- }
- }
-
- $u++;
- if($u !== count($data["relatedWords"])){
-
- $syn .= ". ";
- }
- }
-
- $syn .= ")";
- }
-
- if(
- $c !== 0 &&
- $collection[$data["partOfSpeech"]][$c - 1]["type"] == "text"
- ){
- $collection[$data["partOfSpeech"]][$c - 1]["value"] .=
- "\n" . $text;
-
- }else{
-
- if(
- $c !== 0 &&
- (
- $collection[$data["partOfSpeech"]][$c - 1]["type"] == "text" ||
- $collection[$data["partOfSpeech"]][$c - 1]["type"] == "italic"
- )
- ){
-
- $text = "\n" . $text;
- }
-
- $collection[$data["partOfSpeech"]][] =
- [
- "type" => "text",
- "value" => $text
- ];
- }
-
- if($syn){
-
- $collection[$data["partOfSpeech"]][] = [
- "type" => "italic",
- "value" => $syn
- ];
- }
-
- if(isset($data["exampleUses"])){
-
- foreach($data["exampleUses"] as $use){
-
- $collection[$data["partOfSpeech"]][] = [
- "type" => "quote",
- "value" => $this->unescapehtml(strip_tags($use["text"]))
- ];
- }
- }
-
- if(isset($data["citations"])){
-
- foreach($data["citations"] as $citation){
-
- if(!isset($citation["cite"])){
-
- continue;
- }
-
- $value = $this->unescapehtml(strip_tags($citation["cite"]));
-
- if(
- isset($citation["source"]) &&
- trim($citation["source"]) != ""
- ){
- $value .= " - " . $this->unescapehtml(strip_tags($citation["source"]));
- }
-
- $collection[$data["partOfSpeech"]][] = [
- "type" => "quote",
- "value" => $value
- ];
- }
- }
- }
- }
-
- foreach($collection as $key => $items){
-
- $out["answer"][0]["description"][] =
- [
- "type" => "title",
- "value" => $key
- ];
-
- $out["answer"][0]["description"] =
- array_merge($out["answer"][0]["description"], $items);
- }
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- unset($wordnik);
-
- /*
- Check for stackoverflow answers
- */
-
- // /a.js?p=1&src_id=stack_overflow&from=nlp_qa&id=3390396,2559318&q=how%20can%20i%20check%20for%20undefined%20in%20javascript&s=stackoverflow.com&tl=How%20can%20I%20check%20for%20%22undefined%22%20in%20JavaScript%3F%20%2D%20Stack%20Overflow
- // /a.js?p=1&src_id=arqade&from=nlp_qa&id=370293,375682&q=what%20is%20the%20difference%20between%20at%20and%20positioned%20in%20execute&s=gaming.stackexchange.com&tl=minecraft%20java%20edition%20minecraft%20commands%20%2D%20What%20is%20the%20difference
- // /a.js?p=1&src_id=unix&from=nlp_qa&id=312754&q=how%20to%20strip%20metadata%20from%20image%20files&s=unix.stackexchange.com&tl=How%20to%20strip%20metadata%20from%20image%20files%20%2D%20Unix%20%26%20Linux%20Stack%20Exchange
- preg_match(
- '/nrj\(\'(\/a\.js\?.*from=nlp_qa.*)\'\)/U',
- $js,
- $stack
- );
-
- if(isset($stack[1])){
-
- $stack = $stack[1];
-
- try{
- $stackjs = $this->get(
- $proxy,
- "https://duckduckgo.com" . $stack,
- [],
- ddg::req_xhr
- );
-
- if(
- !preg_match(
- '/^DDG\.duckbar\.failed/',
- $stackjs
- )
- ){
-
- preg_match(
- '/DDG\.duckbar\.add_array\((\[\{[\S\s]*}])\)/U',
- $stackjs,
- $stackjson
- );
-
- $stackjson = json_decode($stackjson[1], true)[0]["data"][0];
-
- $out["answer"][] = [
- "title" => $stackjson["Heading"],
- "description" => $this->stackoverflow_parse($stackjson["Abstract"]),
- "url" => str_replace(["http://", "ddg"], ["https://", ""], $stackjson["AbstractURL"]),
- "thumb" => null,
- "table" => [],
- "sublink" => []
- ];
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- /*
- Check for musicmatch (lyrics)
- */
- preg_match(
- '/nrj\(\'(\/a\.js\?.*&s=lyrics.*)\'\)/U',
- $js,
- $lyrics
- );
-
- if(isset($lyrics[1])){
-
- $lyrics = $lyrics[1];
-
- try{
- $lyricsjs = $this->get(
- $proxy,
- "https://duckduckgo.com" . $lyrics,
- [],
- ddg::req_xhr
- );
-
- if(
- !preg_match(
- '/^DDG\.duckbar\.failed/',
- $lyricsjs
- )
- ){
-
- preg_match(
- '/DDG\.duckbar\.add_array\((\[\{[\S\s]*}])\)/U',
- $lyricsjs,
- $lyricsjson
- );
-
- $lyricsjson = json_decode($lyricsjson[1], true)[0]["data"][0];
-
- $title = null;
-
- if(isset($lyricsjson["Heading"])){
-
- $title = $lyricsjson["Heading"];
- }elseif(isset($lyricsjson["data"][1]["urlTitle"])){
-
- $title = $lyricsjson["data"][1]["urlTitle"];
- }else{
-
- $title = $lyricsjson["data"][0]["song_title"];
- }
-
- $description = [
- [
- "type" => "text",
- "value" => null
- ]
- ];
- $parts =
- explode(
- "<br>",
- str_ireplace(
- ["<br>", "</br>", "<br/>"],
- "<br>",
- $lyricsjson["Abstract"]
- ),
- );
-
- for($i=0; $i<count($parts); $i++){
-
- $description[0]["value"] .= trim($parts[$i]) . "\n";
- }
-
- $description[0]["value"] = trim($description[0]["value"]);
-
- $description[] =
- [
- "type" => "quote",
- "value" =>
- "Written by " . implode(", ", $lyricsjson["data"][0]["writers"]) .
- "\nFrom the album " . $lyricsjson["data"][0]["albums"][0]["title"] .
- "\nReleased on the " . date("jS \of F Y", strtotime($lyricsjson["data"][0]["albums"][0]["release_date"]))
- ];
- $out["answer"][] = [
- "title" => $title,
- "description" => $description,
- "url" => $lyricsjson["AbstractURL"],
- "thumb" => null,
- "table" => [],
- "sublink" => []
- ];
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
- }
-
- /*
- Get related searches
- */
- preg_match(
- '/DDG\.duckbar\.loadModule\(\'related_searches\', ?{[\s\S]*"results":(\[{[\s\S]*}]),"vqd"/U',
- $js,
- $related
- );
-
- if(isset($related[1])){
-
- try{
- $related = json_decode($related[1], true);
-
- for($i=0; $i<count($related); $i++){
-
- if(isset($related[$i]["text"])){
-
- array_push($out["related"], $related[$i]["text"]);
- }
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- unset($related);
-
- /*
- Get answers
- */
- $answer_count = preg_match_all(
- '/DDG\.duckbar\.add\(({.*[\S\s]*})(?:\);|,null,"index"\))/U',
- $js . $inithtml,
- $answers
- );
-
- try{
-
- if(isset($answers[1])){
-
- $answers = $answers[1];
-
- for($i=0; $i<$answer_count; $i++){
-
- $answers[$i] = json_decode($answers[$i], true);
-
- // remove dupes
- for($k=0; $k<count($out["answer"]); $k++){
-
- if(
- !isset($answers[$i]["data"]["AbstractURL"]) ||
- str_replace("_", "%20", $out["answer"][$k]["url"]) == str_replace("_", "%20", $this->sanitizeurl($answers[$i]["data"]["AbstractURL"]))
- ){
-
- continue 2;
- }
- }
-
- // get more related queries
- if(
- isset($answers[$i]["data"]["RelatedTopics"]) &&
- $answers[$i]["data"]["RelatedTopics"] != 0
- ){
-
- for($k=0; $k<count($answers[$i]["data"]["RelatedTopics"]); $k++){
-
- if(isset($answers[$i]["data"]["RelatedTopics"][$k]["Result"])){
-
- preg_match(
- '/">(.*)<\//',
- $answers[$i]["data"]["RelatedTopics"][$k]["Result"],
- $label
- );
-
- array_push($out["related"], htmlspecialchars_decode(strip_tags($label[1])));
- }
- }
- }
-
- $image = null;
-
- // get image
- if(
- isset($answers[$i]["data"]["Image"]) &&
- !empty($answers[$i]["data"]["Image"]) &&
- $answers[$i]["data"]["Image"] != "https://duckduckgo.com/i/"
- ){
- if(strpos($answers[$i]["data"]["Image"], "https://duckduckgo.com/i/") === true){
-
- $image = $answers[$i]["data"]["Image"];
- }else{
-
- if(
- strlen($answers[$i]["data"]["Image"]) > 0 &&
- $answers[$i]["data"]["Image"][0] == "/"
- ){
-
- $answers[$i]["data"]["Image"] = substr($answers[$i]["data"]["Image"], 1);
- }
-
- $image = "https://duckduckgo.com/" . $answers[$i]["data"]["Image"];
- }
- }
-
- $count = count($out["answer"]);
-
- if(isset($answers[$i]["data"]["AbstractText"]) && !empty($answers[$i]["data"]["AbstractText"])){
-
- $description = $this->stackoverflow_parse($answers[$i]["data"]["AbstractText"]);
- }elseif(isset($answers[$i]["data"]["Abstract"]) && !empty($answers[$i]["data"]["Abstract"])){
-
- $description = $this->stackoverflow_parse($answers[$i]["data"]["Abstract"]);
- }elseif(isset($answers[$i]["data"]["Answer"]) && !empty($answers[$i]["data"]["Answer"])){
-
- $description = $this->stackoverflow_parse($answers[$i]["data"]["Answer"]);
- }else{
-
- $description = [];
- }
-
- if(isset($answers[$i]["data"]["Heading"]) && !empty($answers[$i]["data"]["Heading"])){
-
- $title = $this->unescapehtml($answers[$i]["data"]["Heading"]);
- }else{
-
- // no title, ignore bs
- continue;
- //$title = null;
- }
-
- if(isset($answers[$i]["data"]["AbstractURL"]) && !empty($answers[$i]["data"]["AbstractURL"])){
-
- $url = $answers[$i]["data"]["AbstractURL"];
- }else{
-
- $url = null;
- }
-
- $out["answer"][$count] = [
- "title" => $title,
- "description" => $description,
- "url" => $this->sanitizeurl($url),
- "thumb" => $image,
- "table" => [],
- "sublink" => []
- ];
-
- if(isset($answers[$i]["data"]["Infobox"]["content"])){
-
- for($k=0; $k<count($answers[$i]["data"]["Infobox"]["content"]); $k++){
-
- // populate table
- if($answers[$i]["data"]["Infobox"]["content"][$k]["data_type"] == "string"){
-
- $out["answer"][$count]["table"][$answers[$i]["data"]["Infobox"]["content"][$k]["label"]] =
- $answers[$i]["data"]["Infobox"]["content"][$k]["value"];
- continue;
- }
-
- $url = "";
- $type = "Website";
-
- switch($answers[$i]["data"]["Infobox"]["content"][$k]["data_type"]){
- case "official_site":
- case "official_website":
- $type = "Website";
- break;
-
- case "wikipedia": $type = "Wikipedia"; break;
- case "itunes": $type = "iTunes"; break;
- case "amazon": $type = "Amazon"; break;
-
- case "imdb_title_id":
- case "imdb_id":
- case "imdb_name_id":
- $type = "IMDb";
- $delim = substr($answers[$i]["data"]["Infobox"]["content"][$k]["value"], 0, 2);
-
- if($delim == "nm"){
-
- $url = "https://www.imdb.com/name/";
- }elseif($delim == "tt"){
-
- $url = "https://www.imdb.com/title/";
- }elseif($delim == "co"){
-
- $url = "https://www.imdb.com/search/title/?companies=";
- }else{
-
- $url = "https://www.imdb.com/title/";
- }
- break;
- case "imdb_name_id": $url = "https://www.imdb.com/name/"; $type = "IMDb"; break;
- case "twitter_profile": $url = "https://twitter.com/"; $type = "Twitter"; break;
- case "instagram_profile": $url = "https://instagram.com/"; $type = "Instagram"; break;
- case "facebook_profile": $url = "https://facebook.com/"; $type = "Facebook"; break;
- case "spotify_artist_id": $url = "https://open.spotify.com/artist/"; $type = "Spotify"; break;
- case "rotten_tomatoes": $url = "https://rottentomatoes.com/"; $type = "Rotten Tomatoes"; break;
- case "youtube_channel": $url = "https://youtube.com/channel/"; $type = "YouTube"; break;
- case "soundcloud_id": $url = "https://soundcloud.com/"; $type = "SoundCloud"; break;
-
- default:
- continue 2;
- }
-
- // populate sublinks
- $out["answer"][$count]["sublink"][$type] =
- $url . $answers[$i]["data"]["Infobox"]["content"][$k]["value"];
- }
- }
- }
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
-
- /*
- Get shitcoin conversions
- */
- if($extendedsearch){
- if(
- preg_match(
- '/"https?:\/\/(?:www\.coinbase\.com\/converter\/([a-z0-9]+)\/([a-z0-9]+)|changelly\.com\/exchange\/([a-z0-9]+)\/([a-z0-9]+)|coinmarketcap\.com\/currencies\/[a-z0-9]+\/([a-z0-9]+)\/([a-z0-9]+))\/?"/',
- $js,
- $shitcoins
- )
- ){
-
- $shitcoins = array_values(array_filter($shitcoins));
-
- preg_match(
- '/(?:[\s,.]*[0-9]+)+/',
- $search,
- $amount
- );
-
- if(count($amount) === 1){
-
- $amount = (float)str_replace([" ", ","], ["", "."], $amount[0]);
- }else{
-
- $amount = 1;
- }
-
- try{
-
- $description = [];
-
- $shitcoinjs = $this->get(
- $proxy,
- "https://duckduckgo.com/js/spice/cryptocurrency/{$shitcoins[1]}/{$shitcoins[2]}/1",
- [],
- ddg::req_xhr
- );
-
- preg_match(
- '/ddg_spice_cryptocurrency\(\s*({[\S\s]*})\s*\);/',
- $shitcoinjs,
- $shitcoinjson
- );
-
- $shitcoinjson = json_decode($shitcoinjson[1], true);
-
- if(
- !isset($shitcoinjson["error"]) &&
- $shitcoinjson["status"]["error_code"] == 0
- ){
-
- $shitcoinjson = $shitcoinjson["data"];
- $array_values = array_values($shitcoinjson["quote"])[0];
-
- if($amount != 1){
-
- // show conversion
- $description[] = [
- "type" => "title",
- "value" => "Conversion"
- ];
-
- $description[] = [
- "type" => "text",
- "value" =>
- "{$amount} {$shitcoinjson["name"]} ({$shitcoinjson["symbol"]}) = " . $this->number_format($array_values["price"] * $amount) . " " . strtoupper($shitcoins[2]) . "\n" .
- "{$amount} " . strtoupper($shitcoins[2]) . " = " . $this->number_format((1 / $array_values["price"]) * $amount) . " {$shitcoinjson["symbol"]}"
- ];
- }
-
- $description[] = [
- "type" => "title",
- "value" => "Current rates"
- ];
-
- // rates
- $description[] = [
- "type" => "text",
- "value" =>
- "1 {$shitcoinjson["name"]} ({$shitcoinjson["symbol"]}) = " . $this->number_format($array_values["price"]) . " " . strtoupper($shitcoins[2]) . "\n" .
- "1 " . strtoupper($shitcoins[2]) . " = " . $this->number_format(1 / $array_values["price"]) . " {$shitcoinjson["symbol"]}"
- ];
-
- $description[] = [
- "type" => "quote",
- "value" => "Last fetched: " . date("jS \of F Y @ g:ia", strtotime($shitcoinjson["last_updated"]))
- ];
-
- $out["answer"][] = [
- "title" => $shitcoinjson["name"] . " (" . strtoupper($shitcoins[1]) . ") & " . strtoupper($shitcoins[2]) . " market",
- "description" => $description,
- "url" => "https://coinmarketcap.com/converter/" . strtoupper($shitcoins[1]) . "/" . strtoupper($shitcoins[2]) . "/?amt={$amount}",
- "thumb" => null,
- "table" => [],
- "sublink" => []
- ];
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }else{
-
- /*
- Get currency conversion
- */
- if(
- preg_match(
- '/"https:\/\/www\.xe\.com\/currencyconverter\/convert\/\?From=([A-Z0-9]+)&To=([A-Z0-9]+)"/',
- $js,
- $currencies
- )
- ){
-
- preg_match(
- '/(?:[\s,.]*[0-9]+)+/',
- $search,
- $amount
- );
-
- if(count($amount) === 1){
-
- $amount = (float)str_replace([" ", ","], ["", "."], $amount[0]);
- }else{
-
- $amount = 1;
- }
-
- try{
- $currencyjs = $this->get(
- $proxy,
- "https://duckduckgo.com/js/spice/currency/{$amount}/" . strtolower($currencies[1]) . "/" . strtolower($currencies[2]),
- [],
- ddg::req_xhr
- );
-
- preg_match(
- '/ddg_spice_currency\(\s*({[\S\s]*})\s*\);/',
- $currencyjs,
- $currencyjson
- );
-
- $currencyjson = json_decode($currencyjson[1], true);
-
- if(empty($currencyjson["headers"]["description"])){
-
- $currencyjson = $currencyjson["conversion"];
- $description = [];
-
- if($amount != 1){
-
- $description[] =
- [
- "type" => "title",
- "value" => "Conversion"
- ];
-
- $description[] =
- [
- "type" => "text",
- "value" =>
- $this->number_format($currencyjson["from-amount"]) . " {$currencyjson["from-currency-symbol"]} = " .
- $this->number_format($currencyjson["converted-amount"]) . " {$currencyjson["to-currency-symbol"]}"
- ];
- }
-
- $description[] =
- [
- "type" => "title",
- "value" => "Current rates"
- ];
-
- $description[] =
- [
- "type" => "text",
- "value" =>
- "{$currencyjson["conversion-rate"]}\n" .
- "{$currencyjson["conversion-inverse"]}"
- ];
-
- $description[] =
- [
- "type" => "quote",
- "value" => "Last fetched: " . date("jS \of F Y @ g:ia", strtotime($currencyjson["rate-utc-timestamp"]))
- ];
-
- $out["answer"][] = [
- "title" =>
- "{$currencyjson["from-currency-name"]} ({$currencyjson["from-currency-symbol"]}) to " .
- "{$currencyjson["to-currency-name"]} ({$currencyjson["to-currency-symbol"]})",
- "description" => $description,
- "url" => "https://www.xe.com/currencyconverter/convert/?Amount={$amount}&From={$currencies[1]}&To={$currencies[2]}",
- "thumb" => null,
- "table" => [],
- "sublink" => []
- ];
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
- }
- }
-
- /*
- Get small answer
- */
- preg_match(
- '/DDG\.ready\(function ?\(\) ?{DDH\.add\(({[\S\s]+}),"index"\)}\)/U',
- $inithtml,
- $smallanswer
- );
-
- if(isset($smallanswer[1])){
-
- $smallanswer = json_decode($smallanswer[1], true);
-
- if(
- !isset($smallanswer["require"]) &&
- isset($smallanswer["data"]["title"])
- ){
-
- if(isset($smallanswer["data"]["url"])){
-
- $url = $this->unescapehtml($smallanswer["data"]["url"]);
- }elseif(isset($smallanswer["meta"]["sourceUrl"])){
-
- $url = $this->unescapehtml($smallanswer["meta"]["sourceUrl"]);
- }else{
-
- $url = null;
- }
-
- $out["answer"] = [
- [
- "title" => $this->unescapehtml($smallanswer["data"]["title"]),
- "description" => [],
- "url" => $this->sanitizeurl($url),
- "thumb" => null,
- "table" => [],
- "sublink" => []
- ],
- ...$out["answer"]
- ];
-
- if(isset($smallanswer["data"]["subtitle"])){
-
- $out["answer"][0]["description"][] =
- [
- "type" => "text",
- "value" => isset($smallanswer["data"]["subtitle"]) ? $this->unescapehtml($smallanswer["data"]["subtitle"]) : null
- ];
- }
- }
- }
-
- unset($inithtml);
- unset($answers);
- unset($answer_count);
-
- /*
- Get spelling autocorrect
- */
-
- preg_match(
- '/DDG\.page\.showMessage\(\'spelling\',({[\S\s]+})\)/U',
- $js,
- $spelling
- );
-
- if(isset($spelling[1])){
-
- $spelling = json_decode($spelling[1], true);
-
- switch((int)$spelling["qc"]){
-
- case 1:
- case 3:
- case 5:
- $type = "including";
- break;
-
- default:
- $type = "not_many";
- break;
- }
-
- $out["spelling"] = [
- "type" => $type,
- "using" => $this->unescapehtml(strip_tags($spelling["suggestion"])),
- "correction" => $this->unescapehtml(strip_tags($spelling["recourseText"]))
- ];
- }
-
- unset($spelling);
-
- /*
- Get web results
- */
- preg_match(
- '/DDG\.pageLayout\.load\(\'d\', ?(\[{"[\S\s]*"}])\)/U',
- $js,
- $web
- );
-
- if(isset($web[1])){
-
- try{
- $web = json_decode($web[1], true);
-
- for($i=0; $i<count($web); $i++){
-
- // ignore google placeholder + fake next page
- if(
- isset($web[$i]["t"]) &&
- (
- $web[$i]["t"] == "EOP" ||
- $web[$i]["t"] == "EOF"
- ) &&
- strpos($web[$i]["c"], "://www.google.") !== false
- ){
-
- break;
- }
-
- // store next page token
- if(isset($web[$i]["n"])){
-
- $out["npt"] = $this->backend->store($web[$i]["n"] . "&biaexp=b&eslexp=a&litexp=c&msvrtexp=b&wrap=1", "web", $proxy);
- continue;
- }
-
- // ignore malformed data
- if(!isset($web[$i]["t"])){
-
- continue;
- }
-
- $sublinks = [];
-
- if(isset($web[$i]["l"])){
-
- for($k=0; $k<count($web[$i]["l"]); $k++){
-
- if(
- !isset($web[$i]["l"][$k]["targetUrl"]) ||
- !isset($web[$i]["l"][$k]["text"])
- ){
-
- continue;
- }
-
- array_push(
- $sublinks,
- [
- "title" => $this->titledots($this->unescapehtml($web[$i]["l"][$k]["text"])),
- "date" => null,
- "description" => isset($web[$i]["l"][$k]["snippet"]) ? $this->titledots($this->unescapehtml($web[$i]["l"][$k]["snippet"])) : null,
- "url" => $this->sanitizeurl($web[$i]["l"][$k]["targetUrl"])
- ]
- );
- }
- }
-
- if(
- preg_match(
- '/^<span class="result__type">PDF<\/span>/',
- $web[$i]["t"]
- )
- ){
-
- $type = "pdf";
- $web[$i]["t"] =
- str_replace(
- '<span class="result__type">PDF</span>',
- "",
- $web[$i]["t"]
- );
- }else{
-
- $type = "web";
- }
-
- if(isset($web[$i]["e"])){
-
- $date = strtotime($web[$i]["e"]);
- }else{
-
- $date = null;
- }
-
- array_push(
- $out["web"],
- [
- "title" => $this->titledots($this->unescapehtml(strip_tags($web[$i]["t"]))),
- "description" => $this->titledots($this->unescapehtml(strip_tags($web[$i]["a"]))),
- "url" => isset($web[$i]["u"]) ? $this->sanitizeurl($web[$i]["u"]) : $this->sanitizeurl($web[$i]["c"]),
- "date" => $date,
- "type" => $type,
- "thumb" =>
- [
- "url" => null,
- "ratio" => null
- ],
- "sublink" => $sublinks,
- "table" => []
- ]
- );
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- unset($web);
-
- /*
- Get images
- */
- preg_match(
- '/DDG\.duckbar\.load\(\'images\', ?{[\s\S]*"results":(\[{"[\s\S]*}]),"vqd"/U',
- $js,
- $images
- );
-
- if(isset($images[1])){
-
- try{
- $images = json_decode($images[1], true);
-
- for($i=0; $i<count($images); $i++){
-
- if(
- !isset($images[$i]["title"]) ||
- !isset($images[$i]["image"]) ||
- !isset($images[$i]["thumbnail"]) ||
- !isset($images[$i]["width"]) ||
- !isset($images[$i]["height"])
- ){
-
- continue;
- }
-
- $ratio =
- $this->bingratio(
- (int)$images[$i]["width"],
- (int)$images[$i]["height"]
- );
-
- array_push(
- $out["image"],
- [
- "title" => $this->titledots($this->unescapehtml($images[$i]["title"])),
- "source" => [
- [
- "url" => $images[$i]["image"],
- "width" => (int)$images[$i]["width"],
- "height" => (int)$images[$i]["height"]
- ],
- [
- "url" => $this->bingimg($images[$i]["thumbnail"]),
- "width" => $ratio[0],
- "height" => $ratio[1]
- ]
- ],
- "url" => $this->sanitizeurl($images[$i]["url"])
- ]
- );
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- unset($images);
-
- /*
- Get videos
- */
- preg_match(
- '/DDG\.duckbar\.load\(\'videos\', ?{[\s\S]*"results":(\[{"[\s\S]*}]),"vqd"/U',
- $js,
- $videos
- );
-
- if(isset($videos[1])){
- try{
- $videos = json_decode($videos[1], true);
-
- for($i=0; $i<count($videos); $i++){
-
- $cachekey = false;
-
- foreach(["large", "medium", "small"] as &$key){
-
- if(isset($videos[$i]["images"][$key])){
-
- $cachekey = $key;
- break;
- }
- }
-
- if(
- !isset($videos[$i]["title"]) ||
- !isset($videos[$i]["description"]) ||
- $cachekey === false ||
- !isset($videos[$i]["content"])
- ){
-
- continue;
- }
-
- array_push(
- $out["video"],
- [
- "title" => $this->titledots($this->unescapehtml($videos[$i]["title"])),
- "description" => $videos[$i]["description"] == "" ? null : $this->titledots($this->unescapehtml($videos[$i]["description"])),
- "date" => $videos[$i]["published"] == "" ? null : strtotime($videos[$i]["published"]),
- "duration" => $videos[$i]["duration"] == 0 ? null : $this->hmstoseconds($videos[$i]["duration"]),
- "views" => $videos[$i]["statistics"]["viewCount"] == 0 ? null : $videos[$i]["statistics"]["viewCount"],
- "thumb" =>
- [
- "url" => $this->bingimg($videos[$i]["images"][$cachekey]),
- "ratio" => "16:9"
- ],
- "url" => $this->sanitizeurl($videos[$i]["content"])
- ]
- );
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- unset($videos);
-
- /*
- Get news
- */
- preg_match(
- '/DDG\.duckbar\.load\(\'news\', ?{[\s\S]*"results":(\[{"[\s\S]*}]),"vqd"/U',
- $js,
- $news
- );
-
- if(isset($news[1])){
- try{
- $news = json_decode($news[1], true);
-
- for($i=0; $i<count($news); $i++){
-
- if(
- !isset($news[$i]["title"]) ||
- !isset($news[$i]["excerpt"]) ||
- !isset($news[$i]["url"])
- ){
-
- continue;
- }
-
- array_push(
- $out["news"],
- [
- "title" => $this->titledots($this->unescapehtml($news[$i]["title"])),
- "description" => $this->titledots($this->unescapehtml(strip_tags($news[$i]["excerpt"]))),
- "date" => isset($news[$i]["date"]) ? (int)$news[$i]["date"] : null,
- "thumb" =>
- [
- "url" => isset($news[$i]["image"]) ? $news[$i]["image"] : null,
- "ratio" => "16:9"
- ],
- "url" => $this->sanitizeurl($news[$i]["url"])
- ]
- );
- }
-
- }catch(Exception $e){
-
- // do nothing
- }
- }
-
- return $out;
- }
-
- public function image($get){
-
- if($get["npt"]){
-
- [$npt, $proxy] = $this->backend->get($get["npt"], "images");
-
- try{
- $json = $this->get(
- $proxy,
- "https://duckduckgo.com/i.js?" . $npt,
- [],
- ddg::req_xhr
- );
-
- }catch(Exception $err){
-
- throw new Exception("Failed to get i.js");
- }
-
- }else{
- $search = $get["s"];
- if(strlen($search) === 0){
-
- throw new Exception("Search term is empty!");
- }
-
- $proxy = $this->backend->get_ip();
- $country = $get["country"];
- $nsfw = $get["nsfw"];
- $date = $get["date"];
- $size = $get["size"];
- $color = $get["color"];
- $type = $get["type"];
- $layout = $get["layout"];
- $license = $get["license"];
-
- $filter = [];
- $get_filters = [
- "hps" => "1",
- "q" => $search,
- "iax" => "images",
- "ia" => "images"
- ];
-
- if($date != "any"){ $filter[] = "time:$date"; }
- if($size != "any"){ $filter[] = "size:$size"; }
- if($color != "any"){ $filter[] = "color:$color"; }
- if($type != "any"){ $filter[] = "type:$type"; }
- if($layout != "any"){ $filter[] = "layout:$layout"; }
- if($license != "any"){ $filter[] = "license:$license"; }
-
- $filter = implode(",", $filter);
-
- if($filter != ""){
-
- $get_filters["iaf"] = $filter;
- }
-
- switch($nsfw){
-
- case "yes": $get_filters["kp"] = "-2"; break;
- case "no": $get_filters["kp"] = "-1"; break;
- }
-
- try{
-
- $html = $this->get(
- $proxy,
- "https://duckduckgo.com",
- $get_filters,
- ddg::req_web
- );
- }catch(Exception $err){
-
- throw new Exception("Failed to get html");
- }
-
- preg_match(
- '/vqd=([0-9-]+)/',
- $html,
- $vqd
- );
-
- if(!isset($vqd[1])){
-
- throw new Exception("Failed to get vqd token");
- }
-
- $vqd = $vqd[1];
-
- // @TODO: s param = image offset
- $js_params = [
- "l" => $country,
- "o" => "json",
- "q" => $search,
- "vqd" => $vqd
- ];
-
- switch($nsfw){
-
- case "yes": $js_params["p"] = "-1"; break;
- case "no": $js_params["p"] = "1"; break;
- }
-
- if(empty($filter)){
-
- $js_params["f"] = "1";
- }else{
-
- $js_params["f"] = $filter;
- }
-
- try{
- $json = $this->get(
- $proxy,
- "https://duckduckgo.com/i.js",
- $js_params,
- ddg::req_xhr
- );
-
- }catch(Exception $err){
-
- throw new Exception("Failed to get i.js");
- }
- }
-
- $json = json_decode($json, true);
-
- if($json === null){
-
- throw new Exception("Failed to decode JSON");
- }
-
- $out = [
- "status" => "ok",
- "npt" => null,
- "image" => []
- ];
-
- if(isset($json["next"])){
-
- if(!isset($vqd)){
-
- $vqd = array_values($json["vqd"])[0];
- }
-
- $out["npt"] =
- $this->backend->store(
- explode("?", $json["next"])[1] . "&vqd=" .
- $vqd,
- "images",
- $proxy
- );
- }
-
- for($i=0; $i<count($json["results"]); $i++){
-
- $bingimg = $this->bingimg($json["results"][$i]["thumbnail"]);
- $ratio =
- $this->bingratio(
- (int)$json["results"][$i]["width"],
- (int)$json["results"][$i]["height"]
- );
-
- $out["image"][] = [
- "title" => $this->titledots($this->unescapehtml($json["results"][$i]["title"])),
- "source" => [
- [
- "url" => $json["results"][$i]["image"],
- "width" => (int)$json["results"][$i]["width"],
- "height" => (int)$json["results"][$i]["height"]
- ],
- [
- "url" => $bingimg,
- "width" => $ratio[0],
- "height" => $ratio[1],
- ]
- ],
- "url" => $this->sanitizeurl($json["results"][$i]["url"])
- ];
- }
-
- return $out;
- }
-
- public function video($get){
-
- if($get["npt"]){
-
- [$npt, $proxy] = $this->backend->get($get["npt"], "videos");
-
- try{
- $json = json_decode($this->get(
- $proxy,
- "https://duckduckgo.com/v.js?" .
- $npt,
- [],
- ddg::req_xhr
- ), true);
-
- }catch(Exception $err){
-
- throw new Exception("Failed to get v.js");
- }
- }else{
-
- $search = $get["s"];
- if(strlen($search) === 0){
-
- throw new Exception("Search term is empty!");
- }
-
- $proxy = $this->backend->get_ip();
- $country = $get["country"];
- $nsfw = $get["nsfw"];
- $date = $get["date"];
- $resolution = $get["resolution"];
- $duration = $get["duration"];
- $license = $get["license"];
-
- $filter = [];
-
- $get_filters = [
- "q" => $search,
- "iax" => "videos",
- "ia" => "videos"
- ];
-
- switch($nsfw){
-
- case "yes": $get_filters["kp"] = "-2"; break;
- case "no": $get_filters["kp"] = "-1"; break;
- }
-
- if($date != "any"){ $filter[] = "publishedAfter:{$date}"; }
- if($resolution != "any"){ $filter[] = "videoDefinition:{$resolution}"; }
- if($duration != "any"){ $filter[] = "videoDuration:{$duration}"; }
- if($license != "any"){ $filter[] = "videoLicense:{$license}"; }
-
- $filter = implode(",", $filter);
-
- try{
-
- $html = $this->get(
- $proxy,
- "https://duckduckgo.com",
- $get_filters,
- ddg::req_web
- );
- }catch(Exception $err){
-
- throw new Exception("Failed to get html");
- }
-
- preg_match(
- '/vqd=([0-9-]+)/',
- $html,
- $vqd
- );
-
- if(!isset($vqd[1])){
-
- throw new Exception("Failed to get vqd token");
- }
-
- $vqd = $vqd[1];
-
- try{
- $json = json_decode($this->get(
- $proxy,
- "https://duckduckgo.com/v.js",
- [
- "l" => "us-en",
- "o" => "json",
- "sr" => 1,
- "q" => $search,
- "vqd" => $vqd,
- "f" => $filter,
- "p" => $get_filters["kp"]
- ],
- ddg::req_xhr
- ), true);
-
- }catch(Exception $err){
-
- throw new Exception("Failed to get v.js");
- }
- }
-
- $out = [
- "status" => "ok",
- "npt" => null,
- "video" => [],
- "author" => [],
- "livestream" => [],
- "playlist" => [],
- "reel" => []
- ];
-
- if(isset($json["next"])){
-
- $out["npt"] =
- $this->backend->store(
- explode("?", $json["next"])[1],
- "videos",
- $proxy
- );
- }
-
- for($i=0; $i<count($json["results"]); $i++){
-
- $cachekey = false;
-
- foreach(["large", "medium", "small"] as &$key){
-
- if(isset($json["results"][$i]["images"][$key])){
-
- $cachekey = $key;
- break;
- }
- }
-
- if(
- !isset($json["results"][$i]["title"]) ||
- !isset($json["results"][$i]["description"]) ||
- $cachekey === false ||
- !isset($json["results"][$i]["content"])
- ){
-
- continue;
- }
-
- array_push(
- $out["video"],
- [
- "title" => $this->titledots($this->unescapehtml($json["results"][$i]["title"])),
- "description" => $json["results"][$i]["description"] == "" ? null : $this->titledots($this->unescapehtml($json["results"][$i]["description"])),
- "author" => [
- "name" => empty($json["results"][$i]["uploader"]) ? null : $this->unescapehtml($json["results"][$i]["uploader"]),
- "url" => null,
- "avatar" => null
- ],
- "date" => $json["results"][$i]["published"] == "" ? null : strtotime($json["results"][$i]["published"]),
- "duration" => $json["results"][$i]["duration"] == 0 ? null : $this->hmstoseconds($json["results"][$i]["duration"]),
- "views" => $json["results"][$i]["statistics"]["viewCount"] == 0 ? null : $json["results"][$i]["statistics"]["viewCount"],
- "thumb" => [
- "url" => $this->bingimg($json["results"][$i]["images"][$cachekey]),
- "ratio" => "16:9"
- ],
- "url" => $this->sanitizeurl($json["results"][$i]["content"])
- ]
- );
- }
-
- return $out;
- }
-
- public function news($get){
-
- if($get["npt"]){
-
- [$req, $proxy] = $this->backend->get($get["npt"], "news");
-
- try{
-
- $json = json_decode($this->get(
- $proxy,
- "https://duckduckgo.com/news.js?" .
- $req,
- [],
- ddg::req_xhr
- ), true);
-
- }catch(Exception $err){
-
- throw new Exception("Failed to get news.js");
- }
- }else{
-
- $search = $get["s"];
- if(strlen($search) === 0){
-
- throw new Exception("Search term is empty!");
- }
-
- $proxy = $this->backend->get_ip();
- $country = $get["country"];
- $nsfw = $get["nsfw"];
- $date = $get["date"];
-
- $get_params = [
- "q" => $search,
- "iar" => "news",
- "ia" => "news"
- ];
-
- switch($nsfw){
-
- case "yes": $get_filters["kp"] = "-2"; break;
- case "maybe": $get_filters["kp"] = "-1"; break;
- case "no": $get_filters["kp"] = "1"; break;
- }
-
- if($date != "any"){
-
- $get_params["df"] = $date;
- }
-
- try{
-
- $html = $this->get(
- $proxy,
- "https://duckduckgo.com",
- $get_params,
- ddg::req_web
- );
- }catch(Exception $err){
-
- throw new Exception("Failed to get html");
- }
-
- preg_match(
- '/vqd=([0-9-]+)/',
- $html,
- $vqd
- );
-
- if(!isset($vqd[1])){
-
- throw new Exception("Failed to get vqd token");
- }
-
- $vqd = $vqd[1];
-
- try{
-
- $js_params = [
- "l" => $country,
- "o" => "json",
- "noamp" => "1",
- "q" => $search,
- "vqd" => $vqd,
- "p" => $get_filters["kp"]
- ];
-
- if($date != "any"){
-
- $js_params["df"] = $date;
- }else{
-
- $js_params["df"] = "";
- }
-
- $json = json_decode($this->get(
- $proxy,
- "https://duckduckgo.com/news.js",
- $js_params,
- ddg::req_xhr
- ), true);
-
- }catch(Exception $err){
-
- throw new Exception("Failed to get news.js");
- }
- }
-
- $out = [
- "status" => "ok",
- "npt" => null,
- "news" => []
- ];
-
- if(isset($json["next"])){
-
- $out["npt"] =
- $this->backend->store(
- explode("?", $json["next"])[1],
- "news",
- $proxy
- );
- }
-
- for($i=0; $i<count($json["results"]); $i++){
-
- $out["news"][] = [
- "title" => $this->titledots($this->unescapehtml($json["results"][$i]["title"])),
- "author" => $this->unescapehtml($json["results"][$i]["source"]),
- "description" => $this->titledots($this->unescapehtml(strip_tags($json["results"][$i]["excerpt"]))),
- "date" => $json["results"][$i]["date"],
- "thumb" =>
- [
- "url" => isset($json["results"][$i]["image"]) ? $json["results"][$i]["image"] : null,
- "ratio" => "16:9"
- ],
- "url" => $this->sanitizeurl($json["results"][$i]["url"])
- ];
- }
-
- return $out;
- }
-
- private function hmstoseconds($time){
-
- $parts = explode(":", $time, 3);
- $time = 0;
-
- if(count($parts) === 3){
-
- // hours
- $time = $time + ((int)$parts[0] * 3600);
- array_shift($parts);
- }
-
- if(count($parts) === 2){
-
- // minutes
- $time = $time + ((int)$parts[0] * 60);
- array_shift($parts);
- }
-
- // seconds
- $time = $time + (int)$parts[0];
-
- return $time;
- }
-
- private function titledots($title){
-
- $substr = substr($title, -3);
-
- if(
- $substr == "..." ||
- $substr == "…"
- ){
-
- return trim(substr($title, 0, -3));
- }
-
- return trim($title);
- }
-
- private function unescapehtml($str){
-
- return html_entity_decode(
- str_replace(
- [
- "<br>",
- "<br/>",
- "</br>",
- "<BR>",
- "<BR/>",
- "</BR>",
- ],
- "\n",
- $str
- ),
- ENT_QUOTES | ENT_XML1, 'UTF-8'
- );
- }
-
- private function bingimg($url){
-
- $parse = parse_url($url);
- parse_str($parse["query"], $parts);
-
- return "https://" . $parse["host"] . "/th?id=" . urlencode($parts["id"]);
- }
-
- private function appendtext($payload, &$text, &$index){
-
- if(trim($payload) == ""){
-
- return;
- }
-
- if(
- $index !== 0 &&
- $text[$index - 1]["type"] == "text"
- ){
-
- $text[$index - 1]["value"] .= preg_replace('/ $/', " ", $payload);
- }else{
-
- $text[] = [
- "type" => "text",
- "value" => preg_replace('/ $/', " ", $payload)
- ];
- $index++;
- }
- }
-
- private function stackoverflow_parse($html){
-
- $i = 0;
- $answer = [];
-
- $this->fuckhtml->load($html);
-
- $tags = $this->fuckhtml->getElementsByTagName("*");
-
- if(count($tags) === 0){
-
- return [
- [
- "type" => "text",
- "value" => htmlspecialchars_decode($html)
- ]
- ];
- }
-
- foreach($tags as $snippet){
-
- switch($snippet["tagName"]){
-
- case "p":
- $this->fuckhtml->load($snippet["innerHTML"]);
-
- $codetags =
- $this->fuckhtml
- ->getElementsByTagName("*");
-
- $tmphtml = $snippet["innerHTML"];
-
- foreach($codetags as $tag){
-
- if(!isset($tag["outerHTML"])){
-
- continue;
- }
-
- $tmphtml =
- explode(
- $tag["outerHTML"],
- $tmphtml,
- 2
- );
-
- $value = $this->fuckhtml->getTextContent($tmphtml[0], false, false);
- $this->appendtext($value, $answer, $i);
-
- $type = null;
- switch($tag["tagName"]){
-
- case "code": $type = "inline_code"; break;
- case "em": $type = "italic"; break;
- case "blockquote": $type = "quote"; break;
- default: $type = "text";
- }
-
- if($type !== null){
- $value = $this->fuckhtml->getTextContent($tag, false, false);
-
- if(trim($value) != ""){
-
- $answer[] = [
- "type" => $type,
- "value" => rtrim($value)
- ];
- $i++;
- }
- }
-
- if(count($tmphtml) === 2){
-
- $tmphtml = $tmphtml[1] . "\n";
- }else{
-
- break;
- }
- }
-
- if(is_array($tmphtml)){
-
- $tmphtml = $tmphtml[0];
- }
-
- if(strlen($tmphtml) !== 0){
-
- $value = $this->fuckhtml->getTextContent($tmphtml, true, false);
- $this->appendtext($value, $answer, $i);
- }
- break;
-
- case "img":
- $answer[] = [
- "type" => "image",
- "url" =>
- $this->fuckhtml
- ->getTextContent(
- $tag["attributes"]["src"]
- )
- ];
- $i++;
- break;
-
- case "pre":
- switch($answer[$i - 1]["type"]){
-
- case "text":
- case "italic":
- $answer[$i - 1]["value"] = rtrim($answer[$i - 1]["value"]);
- break;
- }
-
- $answer[] =
- [
- "type" => "code",
- "value" =>
- rtrim(
- $this->fuckhtml
- ->getTextContent(
- $snippet,
- true,
- false
- )
- )
- ];
- $i++;
-
- break;
-
- case "ol":
- $o = 0;
-
- $this->fuckhtml->load($snippet);
- $li =
- $this->fuckhtml
- ->getElementsByTagName("li");
-
- foreach($li as $elem){
- $o++;
-
- $this->appendtext(
- $o . ". " .
- $this->fuckhtml
- ->getTextContent(
- $elem
- ),
- $answer,
- $i
- );
- }
- break;
- }
- }
-
- if(
- $i !== 0 &&
- $answer[$i - 1]["type"] == "text"
- ){
-
- $answer[$i - 1]["value"] = rtrim($answer[$i - 1]["value"]);
- }
-
- return $answer;
- }
-
- private function bstoutf8($bs){
-
- return iconv("UTF-8", "ISO-8859-1//TRANSLIT", $bs);
- }
-
- private function limitnewlines($text){
-
- preg_replace(
- '/(?:[\n\r] *){2,}/m',
- "\n\n",
- $text
- );
-
- return $text;
- }
-
- private function sanitizeurl($url){
-
- // check for domains w/out first short subdomain (ex: www.)
-
- $domain = parse_url($url, PHP_URL_HOST);
-
- $subdomain = preg_replace(
- '/^[A-z0-9]{1,3}\./',
- "",
- $domain
- );
-
- switch($subdomain){
- case "ebay.com.au":
- case "ebay.at":
- case "ebay.ca":
- case "ebay.fr":
- case "ebay.de":
- case "ebay.com.hk":
- case "ebay.ie":
- case "ebay.it":
- case "ebay.com.my":
- case "ebay.nl":
- case "ebay.ph":
- case "ebay.pl":
- case "ebay.com.sg":
- case "ebay.es":
- case "ebay.ch":
- case "ebay.co.uk":
- case "cafr.ebay.ca":
- case "ebay.com":
- case "community.ebay.com":
- case "pages.ebay.com":
-
- // remove ebay tracking elements
- $old_params = parse_url($url, PHP_URL_QUERY);
- parse_str($old_params, $params);
-
- if(isset($params["mkevt"])){ unset($params["mkevt"]); }
- if(isset($params["mkcid"])){ unset($params["mkcid"]); }
- if(isset($params["mkrid"])){ unset($params["mkrid"]); }
- if(isset($params["campid"])){ unset($params["campid"]); }
- if(isset($params["customid"])){ unset($params["customid"]); }
- if(isset($params["toolid"])){ unset($params["toolid"]); }
- if(isset($params["_sop"])){ unset($params["_sop"]); }
- if(isset($params["_dcat"])){ unset($params["_dcat"]); }
- if(isset($params["epid"])){ unset($params["epid"]); }
- if(isset($params["epid"])){ unset($params["oid"]); }
-
- $params = http_build_query($params);
-
- if(strlen($params) === 0){
- $replace = "\?";
- }else{
- $replace = "";
- }
-
- $url = preg_replace(
- "/" . $replace . preg_quote($old_params, "/") . "$/",
- $params,
- $url
- );
- break;
- }
-
- return $url;
- }
-
- private function number_format($number){
-
- $number = explode(".", sprintf('%f', $number));
-
- if(count($number) === 1){
-
- return number_format((float)$number[0], 0, ",", ".");
- }
-
- return number_format((float)$number[0], 0, ",", "") . "." . (string)$number[1];
- }
-
- private function bingratio($width, $height){
-
- $ratio = [
- 474 / $width,
- 474 / $height
- ];
-
- if($ratio[0] < $ratio[1]){
-
- $ratio = $ratio[0];
- }else{
-
- $ratio = $ratio[1];
- }
-
- return [
- floor($width * $ratio),
- floor($height * $ratio)
- ];
- }
- }
|