1<!DOCTYPE html> 2<html lang="en-ie" class="no-js"> 3<head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8,IE=9,IE=edge,chrome=1"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 8 <link rel="dns-prefetch" href="https://www.google-analytics.com"> 9 <link rel="shortcut icon" href="/cf-static/images/favicon.ico"> 10 <link rel="apple-touch-icon-precomposed" href="/cf-static/images/apple-touch-icon.png"> 11 12 <link rel="stylesheet" href="/cf-static/css/main.min.css"> 13 <!-- Proxima Webfont --> 14 <link rel="stylesheet" href="https://use.typekit.net/hwo8xkl.css"> 15 16
16<script id="Cookiebot" data-culture="en" src="https://consent.cookiebot.com/uc.js" data-cbid="2d8f3fdb-5d3b-4571-924b-a31490834677" type="text/javascript" data-blockingmode="auto" async></script>
16 17 18
18<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js" integrity="sha384-Pn+PczAsODRZ2PiGg0IheRROpP7lXO1NTIjiPo6cca8TliBvaeil42fobhzvZd74" crossorigin="anonymous"></script>
18 19
19<script>window.jQuery || document.write('
19<script src="https://d1og0s8nlbd0hm.cloudfront.net/js/vendor/jquery-1.11.2.min.js" integrity="sha384-Wh2y1zBlLOqJYO6CJ0R6NGuq5lDcHh+Vu4oBMN2M2e/eF1T26LiH1FHUQKREWSa/" crossorigin="anonymous"><\/script>')</script>
19 20
20<script src="/cf-static/js/main-min.js"></script>
20 21 22 <!-- Set TG4 Geo Cookie --> 23
23<script src="/cf-static/js/tg4-geo-cookie.js"></script>
23 24 25 <!-- Set SSO UUID Cookie --> 26
26<script src="/cf-static/js/sso-uuid-cookie.js"></script>
26 27 28 <!-- Set Site URL --> 29
29<script src="/cf-static/js/site-url-en.js"></script>
29 30 31 <!-- Angular --> 32
32<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js" data-cookieconsent="ignore" integrity="sha384-r1y8TJcloKTvouxnYsi4PJAx+nHNr90ibsEn3zznzDzWBN9X3o3kbHLSgcIPtzAp" crossorigin="anonymous"></script>
32 33
33<script defer src='/cf-static/js/angular-slick.js'></script>
33 34 <!-- Angular --> 35 36 <!-- Google Tag Manager --> 37
37<script>
vendor: 373 bytes, lines 37-42
37 38 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 39 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 40 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 41 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 42 })(window,document,'script','dataLayer','
42GTM-TSCVD6V
vendor: 9 bytes, lines 42-43
42'); 43
43</script>
43 44 <!-- End Google Tag Manager --> 45 46 <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" /> 47 <link rel="alternate" hreflang="ga" href="https://www.tg4.ie/ga/" /> 48 <link rel="alternate" hreflang="en-ie" href="https://www.tg4.ie/en/" /> 49 <link rel="alternate" hreflang="x-default" href="https://www.tg4.ie/ga/" /> 50 51 <meta name="description" content="TG4 is the National Irish Language Public Service Broadcaster. The TG4 Player is a Global Hub of Irish language and Cultural Content, freely available for audiences worldwide. Music, Sport, Documentaries, Kids. Stream Irish TV now!" /> 52 <meta property="og:locale" content="en_US" /> 53 <meta property="og:type" content="website" /> 54 <meta property="og:title" content="TG4 Television | TG4 Player | Irish TV | Irish Language TV | Gaeilge | Súil Eile" /> 55 <meta property="og:description" content="TG4 is the National Irish Language Public Service Broadcaster. The TG4 Player is a Global Hub of Irish language and Cultural Content, freely available for audiences worldwide. Music, Sport, Documentaries, Kids. Stream Irish TV now!" /> 56 <meta property="og:url" content="https://www.tg4.ie/en/" /> 57 <meta property="og:site_name" content="TG4" /> 58 <meta property="article:publisher" content="https://www.facebook.com/TG4TV" /> 59 <meta property="article:modified_time" content="2022-02-03T16:18:46+00:00" /> 60 <meta property="og:image" content="https://d1og0s8nlbd0hm.cloudfront.net/tg4-redesign-2015/wp-content/uploads/2021/02/Generic_BG_Player.jpg" /> 61 <meta property="og:image:width" content="1920" /> 62 <meta property="og:image:height" content="1080" /> 63 <meta property="og:image:type" content="image/jpeg" /> 64 65 <meta name="twitter:card" content="summary_large_image" /> 66 <meta name="twitter:image" content="https://d1og0s8nlbd0hm.cloudfront.net/tg4-redesign-2015/wp-content/uploads/2021/02/Generic_BG_Player.jpg" /> 67 <meta name="twitter:site" content="@TG4TV" /> 68 69 <title>TG4 Television | TG4 Player | Irish TV | Irish Language TV | Gaeilge | Súil Eile</title> 70 71 <!-- Google Search Console Verification --> 72 <meta name="google-site-verification" content="SgwAy4fECTlR6eVmPVGTktbR_S0IsqHxG8CIM-TbVhs" /> 73 74 <!-- Google Analytics Tracking Code --> 75
75<script async language="JavaScript" type="text/javascript"> 76 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 77 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 78 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 79 })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 80 //ga('create', 'UA-4024457-9', 'auto'); 81 ga('create', 'UA-4024457-9', {cookieFlags: 'max-age=7200; secure; samesite=none'}); 82 ga('send', 'pageview'); 83 </script>
83 84 85 <!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 69 bytes, lines 85-86
85 86 <script async src="https://www.googletagmanager.com/gtag/js?id=
86G-MJ34VNCPXL
vendor: 17 bytes, lines 86-87
86"></script> 87
87<script> 88
vendor: 178 bytes, lines 88-93
88window.dataLayer = window.dataLayer || []; 89 function gtag(){ 90 dataLayer.push(arguments); 91 } 92 gtag('js', new Date()); 93 gtag('config', '
93G-MJ34VNCPXL
vendor: 9 bytes, lines 93-94
93'); 94
94</script>
94 95 96
96<script src="https://d1og0s8nlbd0hm.cloudfront.net/js/jquery.cookie.js" integrity="sha384-Ehlc1ZsMjYz95/F2ZUZCuAmGVDVoCRenlqtta/zbghGZLMqckKL+D4vqWU5esSQe" crossorigin="anonymous"></script>
96 97 98
98<script> 99 document.addEventListener("DOMContentLoaded", function () { 100 updateLinks(); 101 }); 102 </script>
102 103</head> 104<body class="home" ng-app="tg4App" ng-controller="tg4Ctrl"> 105 <!-- Google Tag Manager (noscript) -->
vendor: 83 bytes, lines 105-107
105 106 <noscript> 107 <iframe src="https://www.googletagmanager.com/ns.html?id=
107GTM-TSCVD6V
vendor: 94 bytes, lines 107-109
107" height="0" width="0" style="display:none;visibility:hidden"></iframe> 108 </noscript> 109
109<!-- End Google Tag Manager (noscript) --> 110 <a href="#maincontent" class="skip-to-main">Skip to main content</a> 111 <div class="wrapper"> 112 <header class="header-nav"> 113 <div class="header-wrapper"> 114 <div class="top-bar"> 115 <a class="logo-home" href="#" data-path=""><img src="/cf-static/images/TG4_Player_Logo_Pink.svg" alt="TG4 Logo" class="logo"></a> 116 <div> 117 <nav id="main-menu" class="main-menu" role="navigation"> 118 <ul class="main-menu-list"> 119 <li><a href="#" class="dynamic-link menu-active" data-path="">Home</a></li> 120 <li><a href="#" class="dynamic-link" data-path="player/categories/top-documentaries/">Watch</a> 121 <ul class="sub-menu"> 122 <li><a href="#" class="dynamic-link" data-path="player/categories/top-documentaries/">Documentaries</a></li> 123 <li><a href="#" class="dynamic-link" data-path="player/categories/irish-music-series/">Music</a></li> 124 <li><a href="#" class="dynamic-link" data-path="player/categories/drama-tv-shows/">Drama</a></li> 125 <li><a href="#" class="dynamic-link" data-path="player/categories/news-stories/">Current Affairs</a></li> 126 <li><a href="#" class="dynamic-link" data-path="player/categories/entertainment-shows/">Entertainment</a></li> 127 <li><a href="#" class="dynamic-link" data-path="player/categories/sport-tv-player/">Sport</a></li> 128 <li><a href="#" class="dynamic-link" data-path="player/categories/lifestyle-tv-shows/">Lifestyle</a></li> 129 <li><a href="#" class="dynamic-link" data-path="player/categories/childrens-tv-shows/">Cúla4</a></li> 130 <li><a href="#" class="dynamic-link" data-path="player/online-boxsets/">Boxsets</a></li> 131 </ul> 132 </li> 133 <li><a href="#" class="dynamic-link" data-path="player/watch-live/home/">Live</a></li> 134 <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/daily-schedule/">Schedule</a> 135 <ul class="sub-menu"> 136 <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/daily-schedule/">Daily Schedule</a></li> 137 <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/cula4-schedule/">Cúla4 Schedule</a></li> 138 <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/sport-schedule/">Sport Schedule</a></li> 139 <li><a href="#" class="dynamic-link" data-path="irish-tv-schedule/live-sport/">Live Sport</a></li> 140 </ul> 141 </li> 142 <li class="menu-item-language"><a id="irish-lang-mobile" title="Switch to Gaeilge" href="../ga/"><span lang="ga">Gaeilge</span></a></li> 143 </ul> 144 </nav> 145 </div> 146 </div> 147 <div class="languages"> 148 <a href="../ga/" class="lang-btn">Gaeilge</a> 149 </div> 150 <nav id="sso-menu" class="main-menu" role="navigation"> 151 <div class="sso" class="main-menu-list"> 152 <ul class="main-menu-list" id="sso-menu-dd"> 153 <li><a href="#" class="dynamic-link" data-path="account/profile/"><img src="/cf-static/images/profile.svg" alt="TG4 Account" class="sso_logo"></a> 154 </li> 155 </ul> 156 </div> 157 </nav> 158 <a href="" class="search-btn-toggle"></a> 159 <div class="search-wrapper"> 160 <div class="search"> 161 <form method="get" id="searchform" class="search-form" action="search/" autocomplete="off"> 162 <input type="search" class="search-input" name="s" id="s" value="" placeholder="Search here..."> 163 <button type="submit" id="searchsubmit" value="Search" class="search-btn">Search</button> 164 </form> 165 </div> 166 </div> 167 <div class="nav-cover"></div> 168 <a href="#main-menu" class="burger-menu"></a> 169 </div> 170 </header> 171 <main id="maincontent"> 172 173 <h1 class="visuallyhidden">TG4</h1> 174
175 <span ng-cloak ng-repeat="rail in pRails"> 176 <!-- Carousel Rail (1-10 Programmes) --> 177 <section class="slider-wrapper" ng-if="rail.rail_number==40"> 178 <slick init-onload="false" slides-to-show="1" data="" dots="true" settings="slickConfig1" ng-if="slickConfig1Loaded"> 179 <section class="prog-module" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)"> 180 <div class="home-slide-wrap"> 181 <div> 182 <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&title={{prog.prog_metadata.title | encodeURIComponent}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="prog-panel"> 183 <div class="blockContainer"> 184 <h2 class="hero-title" ng-bind="prog.prog_metadata.series_title"></h2> 185 <h3 ng-if="prog.prog_metadata.series_title!=prog.prog_metadata.title" class="hero-subtitle" ng-bind="prog.prog_metadata.title"></h3> 186 </div> 187 <div class="hero-image"> 188 <img ng-if="prog.prog_metadata.product_code.length>0" data-lazy="https://res.cloudinary.com/tg4/image/upload/w_1300,ar_16:9,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}"> 189 <img ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" data-lazy="https://res.cloudinary.com/tg4/image/upload/w_1300,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}"> 190 </div> 191 </a> 192 </div> 193 </div> 194 </section> 195 </slick> 196 </section> 197 198 <section class="section-panel-rail-31" ng-cloak ng-show="streamsReady && isOnDemandEnabled" ng-if="$index === 1"> 199 <section class="homerail-mods"> 200 <!-- Pulse indicator --> 201 <div class="pulse-wrapper"> 202 <div class="pulse-container"> 203 <img src="/cf-static/images/Ellipse-1.png" class="pulse-off"> 204 <img src="/cf-static/images/Ellipse-2.png" class="pulse-on"> 205 </div> 206 <span class="pulse-text">LIVE</span> 207 </div> 208 <!-- Streams list --> 209 <div class="livemods-wrapper"> 210 <div class="mod-live" ng-repeat="p in pStreams track by $index" ng-if="p.state=='ONAIR' || p.isSoon"> 211 <!-- Logo --> 212 <div class="tg4-card-logo"> 213 <a ng-href="{{getStreamLink(p)}}" target="{{getLinkTarget(p)}}"><img ng-src="{{p.logoUrl || '/cf-static/images/Blank.svg'}}" onerror="this.src='/cf-static/images/Blank.svg'"></a> 214 </div> 215 <!-- Progress bar --> 216 <div class="tg4-progress" ng-if="p.state=='ONAIR'"> 217 <div class="tg4-progress-bar" ng-class="'tg4-progress-bar-' + p.stream" ng-style="{'width': p.progress + '%'}"></div> 218 </div> 219 <div class="tg4-dummy-progress" ng-if="p.state=='UPCOMING'"></div> 220 <!-- On-air card --> 221 <div class="tg4-card-home" ng-if="p.state=='ONAIR'"> 222 <div class="tg4-home-now"> 223 <div class="tg4-home-label">{{p.startTimeFormatted}}</div> 224 <div class="tg4-home-title"> 225 <a ng-href="{{getStreamLink(p)}}" target="{{getLinkTarget(p)}}">{{p.currentShow.title}}</a>
226 <span ng-if="p.currentShow.iconUrl"> 227 <img ng-src="{{p.currentShow.iconUrl}}" style="width:20px; height:20px; display:inline-block;"> 228 </span> 229 </div> 230 </div> 231 </div> 232 <!-- Upcoming card --> 233 <div class="tg4-card-upcoming" ng-if="p.state=='UPCOMING'"> 234 <div class="tg4-home-now"> 235 <div class="tg4-home-label" ng-if="isToday(p.currentShow.startTime)"> 236 {{p.startTimeFormatted}} 237 </div> 238 <div class="tg4-home-title" ng-if="isToday(p.currentShow.startTime)"> 239 <a ng-href="{{getStreamLink(p)}}" target="{{getLinkTarget(p)}}"> 240 {{p.currentShow.title}} 241 </a> 242 <span ng-if="p.currentShow.iconUrl"> 243 <img ng-src="{{p.currentShow.iconUrl}}" style="width:20px; height:20px; display:inline-block;"> 244 </span> 245 </div> 246 <div class="tg4-home-label" ng-if="!isToday(p.currentShow.startTime)"> 247 On air: {{p.startTimeFormatted}} 248 </div> 249 <div class="tg4-home-title" ng-if="!isToday(p.currentShow.startTime)"> 250 {{p.currentShow.title}} 251 <span ng-if="p.currentShow.iconUrl"> 252 <img ng-src="{{p.currentShow.iconUrl}}" style="width:20px; height:20px; display:inline-block;"> 253 </span> 254 </div> 255 </div> 256 </div> 257 </div> 258 </div> 259 </section> 260 </section> 261 262 <!-- 2/4/6 Image Rail (2/4/6 Programmes) --> 263 <section ng-if="rail.rail_number>=1 && rail.rail_number<20" class="section-panel-rail-{{rail.rail_number}}"> 264 <div class="panel-header"> 265 <div class="title-tab-wrap"> 266 <h2 class="header-title" ng-bind="rail.page_addon[0].header_en"></h2> 267 <p class="para-medium" ng-bind="rail.page_addon[0].subheader_en"></p> 268 </div> 269 </div> 270 <section class="homerail-mods"> 271 <h2 class="visuallyhidden"></h2> 272 <div class="plyrmods-wrapper"> 273 <div class="player-mod-wrap"> 274 <section ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)"> 275 <div class="img_wrap"> 276 <a ng-if="rail.rail_number>=5 && rail.rail_number<=8 || rail.rail_number>=15 && rail.rail_number<=16" ng-href="/en/player/categories/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets':replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport','BlaisÃn'], ['online-boxsets','irish-music-series','childrens-tv-shows','news-stories','drama-tv-shows','top-documentaries','lifestyle-tv-shows','entertainment-shows','sport-tv-player','promo']))}}{{'/?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}" class="prog-panel"> 277 <div ng-if="prog.prog_metadata.product_code.length>0"> 278 <img ng-if="rail.rail_number==7" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;"> 279 <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 280 <img ng-if="(rail.rail_number>=1 && rail.rail_number<9 && rail.rail_number!=7) || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 281 </div> 282 <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0"> 283 <img ng-if="rail.rail_number==7" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;"> 284 <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 285 <img ng-if="(rail.rail_number>=1 && rail.rail_number<9 && rail.rail_number!=7) || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 286 </div> 287 <div class="img_description_layer"> 288 <p ng-if="rail.rail_number>=15 && rail.rail_number<=16"><span class="series-infolg"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desclg" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p> 289 <p ng-if="rail.rail_number>=5 && rail.rail_number<=12"><span class="series-info"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desc" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p> 290 <p> 291 </div> 292 </a> 293 <a ng-if="rail.rail_number>=9 && rail.rail_number<=12" ng-href="/en/player/online-boxsets/{{'?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}" class="prog-panel"> 294 <div ng-if="prog.prog_metadata.product_code.length>0"> 295 <img ng-if="rail.rail_number==9" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;"> 296 <img ng-if="rail.rail_number>9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 297 <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 298 </div> 299 <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0"> 300 <img ng-if="rail.rail_number==9" ng-src="{{ getImagePath(prog, rail) }}" alt="{{ prog.prog_metadata.series_title }}" style="height:{{ rail.page_addon[0].height }}; object-fit:cover;"> 301 <img ng-if="rail.rail_number>9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 302 <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 303 </div> 304 <div class="img_description_layer"> 305 <p ng-if="rail.rail_number>=15 && rail.rail_number<=16"><span class="series-infolg"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desclg" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p> 306 <p ng-if="rail.rail_number>=5 && rail.rail_number<=12"><span class="series-info"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desc" ng-bind="(prog.prog_metadata.description_en).substr(0,150)+'...'"></span></p> 307 <p> 308 </div> 309 </a> 310 <a ng-if="rail.rail_number>=1 && rail.rail_number<=4 || rail.rail_number>=13 && rail.rail_number<=14" ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="prog-panel"> 311 <div ng-if="prog.prog_metadata.product_code.length>0"> 312 <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 313 <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 314 </div> 315 <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0"> 316 <img ng-if="rail.rail_number>=9 && rail.rail_number<13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 317 <img ng-if="rail.rail_number>=1 && rail.rail_number<9 || rail.rail_number>=13" ng-src="https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='height:{{rail.page_addon[0].height}}; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 318 </div> 319 <div class="img_description_layer"> 320 <p ng-if="rail.rail_number>=13 && rail.rail_number<=14"><span class="series-infolg"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desclg" ng-bind="(prog.prog_metadata.description_en).substr(0,120)+'...'"></span></p> 321 <p ng-if="rail.rail_number>=1 && rail.rail_number<=4"><span class="series-info"><span ng-if="prog.prog_metadata.series_number.length>0">S</span><span ng-bind="prog.prog_metadata.series_number"></span><span ng-if="prog.prog_metadata.prog_number.length>0"> E</span><span ng-bind="prog.prog_metadata.prog_number"></span> | <span ng-bind="prog.prog_metadata.date"></span></span><br /><span class="series-desc" ng-bind="(prog.prog_metadata.description_en).substr(0,120)+'...'"></span></p> 322 </div> 323 </a> 324 </div> 325 <div class="prog-footer"> 326 <p class="player-genre" ng-if="rail.rail_number>=5 && rail.rail_number<13" ng-bind="replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport'], ['Boxsets','Music','Young People','News','Drama','Documentaries','Lifestyle','Entertainment','Sport'])"></p>
327 <span ng-if="rail.rail_number>=1 && rail.rail_number<9"> 328 <h3 class="player-title" ng-if="prog.prog_metadata.series_title != prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3> 329 <h3 class="player-title" ng-if="prog.prog_metadata.series_title == prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3> 330 <h3 class="player-subtitle" ng-if="prog.prog_metadata.title != prog.prog_metadata.series_title" ng-bind="prog.prog_metadata.title"></h3> 331 <h3 class="player-subtitle" ng-if="prog.prog_metadata.title == prog.prog_metadata.series_title"> </h3> 332 </span> 333 <span ng-if="rail.rail_number>=9 && rail.rail_number<13"> 334 <h3 class="player-title" ng-bind="prog.prog_metadata.series_title"></h3> 335 </span> 336 <!-- <span ng-if="rail.rail_number==13"> 337 <h3 class="player-title-lg" ng-bind="prog.prog_metadata.title"></h3> 338 </span> --> 339 <span ng-if="rail.rail_number>=13 && rail.rail_number!=14"> 340 <h3 class="player-title-lg" ng-bind="prog.prog_metadata.series_title"></h3> 341 </span> 342 <span ng-if="rail.rail_number==14"> 343 <h3 class="player-title-lg" ng-if="prog.prog_metadata.series_title != prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3> 344 <h3 class="player-title-lg" ng-if="prog.prog_metadata.series_title == prog.prog_metadata.title" ng-bind="prog.prog_metadata.series_title"></h3> 345 <h3 class="player-subtitle" ng-if="prog.prog_metadata.title != prog.prog_metadata.series_title" ng-bind="prog.prog_metadata.title"></h3> 346 <h3 class="player-subtitle" ng-if="prog.prog_metadata.title == prog.prog_metadata.series_title"> </h3> 347 </span> 348 </div> 349 </section> 350 </div> 351 <div class="view-btn-wrap"><a ng-href="/en/player/playlist/{{'?plid=' + rail.playlist_id + '&ptitle=' + rail.page_addon[0].header_en}}" class="view-btn"><span>View All</span></a></div> 352 </div> 353 </section> 354 </section> 355 356 <!-- Image/Text Rail (1 Programme) --> 357 <section ng-if="rail.rail_number==20" class="section-panel-rail-{{rail.rail_number}}"> 358 <div ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)"> 359 <div ng-if="prog.prog_metadata.product_code.length>0" class="columnImg1"> 360 <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 361 </div> 362 <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" class="columnImg1"> 363 <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;'> 364 </div> 365 <div class="columnTxt1"> 366 <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2> 367 <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p> 368 <p><br /> 369 <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a> 370 </div> 371 </div> 372 </section> 373 374 <!-- Text/Image Rail (1 Programme) --> 375 <section ng-if="rail.rail_number==21" class="section-panel-rail-{{rail.rail_number}}"> 376 <div ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)"> 377 <div class="columnTxt1"> 378 <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2> 379 <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p> 380 <p><br /> 381 <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a> 382 </p> 383 </div> 384 <div ng-if="prog.prog_metadata.product_code.length>0" class="columnImg1"> 385 <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 386 </div> 387 <div ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" class="columnImg1"> 388 <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 389 </div> 390 </div> 391 </section> 392 393 <!-- Image/Text/Image Rail (1 Programme) --> 394 <section ng-if="rail.rail_number==22" class="section-panel-rail-{{rail.rail_number}}"> 395 <div ng-class="rail.page_addon[0].style" ng-repeat="prog in rail.grid | limitTo:(rail.page_addon[0].limit)"> 396 <div ng-if="prog.prog_metadata.product_code.length>0" class="columnImg4"> 397 <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_366,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 398 </div> 399 <div class="columnTxt5"> 400 <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2> 401 <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p> 402 <p><br /> 403 <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a> 404 </p> 405 </div> 406 <div ng-if="prog.prog_metadata.series_code.length>0" class="columnImg6"> 407 <img ng-src="https://res.cloudinary.com/tg4/image/upload/w_366,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 408 </div> 409 </div> 410 </section> 411 412 <!-- Text/Image/Image/Text Rail (2 Programmes) --> 413 <section ng-if="rail.rail_number==23" class="section-panel-rail-{{rail.rail_number}}"> 414 <div ng-class="rail.page_addon[0].style"> 415 <div ng-if="$index==0" class="columnTxt6" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)"> 416 <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2> 417 <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p> 418 <p><br /> 419 <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a> 420 </p> 421 </div> 422 <div ng-if="$index==0" class="columnImg7" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)"> 423 <img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_261,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 424 </div> 425 <div ng-if="$index==1" class="columnImg7" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)"> 426 <img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_261,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" style='width:100%; height:100%; object-fit:cover;' onerror="this.src='https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto/000000.jpg'"> 427 </div> 428 <div ng-if="$index==1" class="columnTxt6" ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)"> 429 <h2 class="headbox-title" ng-bind="prog.prog_metadata.series_title"></h2> 430 <p ng-bind="(prog.prog_metadata.description_en).substr(0,250)+'...'"></p> 431 <p><br /> 432 <a ng-href="/en/player/{{(prog.prog_metadata.layout=='Boxset'?'online-boxsets/play/':'play/')}}?pid={{prog.prog_metadata.programmeid}}&series={{prog.prog_metadata.series_title | encodeURIComponent}}&genre={{prog.prog_metadata.category | encodeURIComponent}}" class="watch-btn"><span>Watch Now</span></a> 433 </p> 434 </div> 435 </div> 436 </section> 437 438 <!-- 5 Image Mosaic Rail (5 Programmes - Main Image at start) --> 439 <section ng-if="rail.rail_number==30" class="section-panel-rail-{{rail.rail_number}}"> 440 <div ng-class="rail.page_addon[0].style"> 441 <div ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)" class="item-{{$index}}"><a ng-href="{{'/en/player/categories/'+replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport'], ['online-boxsets','irish-music-series','childrens-tv-shows','news-stories','drama-tv-shows','top-documentaries','lifestyle-tv-shows','entertainment-shows','sport-tv-player'])+'/?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}"><img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}"><img ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}"> 442 <div class="ImgContainerText-{{$index}}"> 443 <h3 ng-if="$index==0" class="img-titleLg" ng-bind="prog.prog_metadata.series_title"></h3> 444 <h3 ng-if="$index!=0" class="img-titleSm" ng-bind="prog.prog_metadata.series_title"></h3> 445 </div> 446 </a></div> 447 </div> 448 </section> 449 450 <!-- 5 Image Mosaic Rail (5 Programmes - Main Image at end) --> 451 <section ng-if="rail.rail_number==31" class="section-panel-rail-{{rail.rail_number}}"> 452 <div ng-class="rail.page_addon[0].style"> 453 <div ng-repeat="prog in rail.grid | orderBy:'$index' | limitTo:(rail.page_addon[0].limit)" class="itemrev-{{$index}}"><a ng-href="{{'/en/player/categories/'+replaceBulk(prog.prog_metadata.category, ['Boxset','Ceol','Cula4','Cursai Reatha','Drama','Faisneis','Saolchlar','Siamsaiocht','Sport'], ['online-boxsets','irish-music-series','childrens-tv-shows','news-stories','drama-tv-shows','top-documentaries','lifestyle-tv-shows','entertainment-shows','sport-tv-player'])+'/?series='+(prog.prog_metadata.series_title | encodeURIComponent)+'&genre='+(prog.prog_metadata.category | encodeURIComponent)}}"><img ng-if="prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto:eco/{{prog.prog_metadata.product_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}"><img ng-if="prog.prog_metadata.series_code.length>0 && !prog.prog_metadata.product_code.length>0" ng-src="https://res.cloudinary.com/tg4/image/upload/w_650,h_366,g_faces,c_fill,f_auto,q_auto/{{prog.prog_metadata.series_code}}.jpg" alt="{{prog.prog_metadata.series_title}}" title="{{prog.prog_metadata.series_title}}"> 454 <div class="ImgContainerText-{{$index}}"> 455 <h3 ng-if="$index==4" class="img-titleLg" ng-bind="prog.prog_metadata.series_title"></h3> 456 <h3 ng-if="$index!=4" class="img-titleSm" ng-bind="prog.prog_metadata.series_title"></h3> 457 </div> 458 </a></div> 459 </div> 460 </section> 461 </span> 462 463
463<script> 464 // Minified version of isMobile 465 !function(e){var n=/iPhone/i,t=/iPod/i,r=/iPad/i,a=/\bAndroid(?:.+)Mobile\b/i,p=/Android/i,l=/\bAndroid(?:.+)SD4930UR\b/i,b=/\bAndroid(?:.+)(?:KF[A-Z]{2,4})\b/i,f=/Windows Phone/i,u=/\bWindows(?:.+)ARM\b/i,c=/BlackBerry/i,s=/BB10/i,v=/Opera Mini/i,h=/\b(CriOS|Chrome)(?:.+)Mobile/i,w=/\Mobile(?:.+)Firefox\b/i;function m(e,i){return e.test(i)}function i(e){var i=e||("undefined"!=typeof navigator?navigator.userAgent:""),o=i.split("[FBAN");void 0!==o[1]&&(i=o[0]),void 0!==(o=i.split("Twitter"))[1]&&(i=o[0]);var d={apple:{phone:m(n,i),ipod:m(t,i),tablet:!m(n,i)&&m(r,i),device:m(n,i)||m(t,i)||m(r,i)},amazon:{phone:m(l,i),tablet:!m(l,i)&&m(b,i),device:m(l,i)||m(b,i)},android:{phone:m(l,i)||m(a,i),tablet:!m(l,i)&&!m(a,i)&&(m(b,i)||m(p,i)),device:m(l,i)||m(b,i)||m(a,i)||m(p,i)},windows:{phone:m(f,i),tablet:m(u,i),device:m(f,i)||m(u,i)},other:{blackberry:m(c,i),blackberry10:m(s,i),opera:m(v,i),firefox:m(w,i),chrome:m(h,i),device:m(c,i)||m(s,i)||m(v,i)||m(w,i)||m(h,i)}};return d.any=d.apple.device||d.android.device||d.windows.device||d.other.device,d.phone=d.apple.phone||d.android.phone||d.windows.phone,d.tablet=d.apple.tablet||d.android.tablet||d.windows.tablet,d}"undefined"!=typeof module&&module.exports&&"undefined"==typeof window?module.exports=i:"undefined"!=typeof module&&module.exports&&"undefined"!=typeof window?module.exports=i():"function"==typeof define&&define.amd?define([],e.isMobile=i()):e.isMobile=i()}(this); 466 467 if (isMobile.apple.phone || isMobile.android.phone) { 468 console.log("Apple Phone:", isMobile.apple.phone, " Android Phone:", isMobile.android.phone, " Windows Phone:", isMobile.windows.phone) 469 }; 470 471 var tg4App=angular.module("tg4App", ['slickCarousel']); 472 473 tg4App.filter('encodeURIComponent', function() { 474 return function(input) { 475 if (input === undefined || input === null) return ''; 476 return encodeURIComponent(String(input).trim()); 477 }; 478 }); 479 480 tg4App.controller('tg4Ctrl', function($scope, $http, $timeout, $interval) { 481 482 var GeoCountry = getCookie('GeoCountry'); 483 var url = (GeoCountry == 'IE') ? "https://tg4-platforms.s3.amazonaws.com/rails/IOI.json" : "https://tg4-platforms.s3.amazonaws.com/rails/WW.json"; 484 var controlURL = "https://api.tg4dev.com/api/epg/show_live_rail?api_key=d3b8f0c1-2e4a-4f5b-9c6d-7e8f9a0b1c2d"; 485 var getLiveURL = "https://api.tg4dev.com/api/epg/current?api_key=d3b8f0c1-2e4a-4f5b-9c6d-7e8f9a0b1c2d&limit=4¤tEventsOnly=true"; 486 var refreshTimer = null; 487 488 function startPolling() { 489 loadControl(); 490 } 491 492 $scope.isOnDemandEnabled = false; // default 493 494 function loadControl() { 495 $http.get(controlURL).then(function(response) { 496 var control = response.data; 497 498 // Only show the section if enabled 499 $scope.isOnDemandEnabled = control.enabled; 500 501 if (control.enabled) { 502 // Only load /current if ONDEMAND is enabled 503 loadCurrent(control); 504 } else { 505 // If disabled, clear ONDEMAND streams or skip polling
506 $scope.pStreams = []; 507 scheduleNextRefresh(control); 508 } 509 }).catch(function(err){ 510 console.error("Control API error:", err); 511 scheduleNextRefresh({enabled: false}); // fallback slow poll 512 }); 513 } 514 515 $http.get(url).then(function(response) { 516 $scope.pAllRail = response.data; 517 $scope.pRails = response.data.rails; 518 //console.log("Rails: ", $scope.pRails); 519 520 if ($scope.pRails) { 521 for (var intCnt = 0; intCnt < $scope.pRails.length; intCnt++) { 522 var pRail = $scope.pRails[intCnt]; // Avoid using $scope.pRail globally 523 pRail.page_addon = []; 524 525 var HeaderIE = ""; 526 var HeaderEN = ""; 527 var subHeaderIE = ""; 528 var subHeaderEN = ""; 529 530 if (pRail.header && pRail.header.title) { 531 if (pRail.header.title.indexOf("$") > 0) { 532 var splitHeader = pRail.header.title.split("$"); 533 HeaderIE = splitHeader[0].trim(); 534 HeaderEN = splitHeader[1].trim(); 535 } else { 536 HeaderIE = pRail.header.title; 537 HeaderEN = pRail.header.title; 538 } 539 } 540 541 if (pRail.sub_header && pRail.sub_header.title) { 542 if (pRail.sub_header.title.indexOf("$") > 0) { 543 var splitSubHeader = pRail.sub_header.title.split("$"); 544 subHeaderIE = splitSubHeader[0].trim(); 545 subHeaderEN = splitSubHeader[1].trim(); 546 } else { 547 subHeaderIE = pRail.sub_header.title; 548 subHeaderEN = pRail.sub_header.title; 549 } 550 } 551 552 //console.log(splitSubHeader, HeaderIE, HeaderEN, subHeaderIE, subHeaderEN); 553 554 var railNumber = pRail.rail_number; 555 if (railNumber <= 8) { 556 pRail.page_addon.push({ style: 'mod-home', limit: '4', height: '', header_ie: HeaderIE, header_en: HeaderEN, subheader_ie: subHeaderIE, subheader_en: subHeaderEN }); 557 } else if (railNumber > 8 && railNumber <= 12) { 558 pRail.page_addon.push({ style: 'mod-2', limit: '6', height: '273px', header_ie: HeaderIE, header_en: HeaderEN, subheader_ie: subHeaderIE, subheader_en: subHeaderEN }); 559 } else if (railNumber > 12 && railNumber <= 16) { 560 pRail.page_addon.push({ style: 'mod-3', limit: '2', height: '', header_ie: HeaderIE, header_en: HeaderEN, subheader_ie: subHeaderIE, subheader_en: subHeaderEN }); 561 } else if (railNumber > 16 && railNumber <= 22) { 562 pRail.page_addon.push({ style: 'rowImg', limit: '1', height: '' }); 563 } else if (railNumber == 23) { 564 pRail.page_addon.push({ style: 'rowImg', limit: '2', height: '' }); 565 } else if (railNumber == 30) { 566 pRail.page_addon.push({ style: 'mosaic_container', limit: '5', height: '' }); 567 } else if (railNumber == 31) { 568 pRail.page_addon.push({ style: 'mosaic_container_rev', limit: '5', height: '' }); 569 } else if (railNumber == 40) { 570 pRail.page_addon.push({ style: '', limit: '6', height: '' }); 571 } 572 } 573 } 574 }).catch(function(error) { 575 console.error("Error loading JSON:", error); 576 }); 577 578 // ------------------------- 579 // Load & process data 580 // ------------------------- 581 $scope.streamsReady = false; 582 583 // Update progress bars and precompute 'upcoming' flag 584 function updateProgressBars() {
585 if (!$scope.pStreams) return; 586 const now = Date.now(); 587 const timeToLive = 240 * 60 * 60 * 1000; 588 589 $scope.pStreams.forEach(function(p) { 590 if (p.currentShow && p.currentShow.startTime && p.currentShow.endTime) { 591 const start = Date.parse(p.currentShow.startTime); 592 const end = Date.parse(p.currentShow.endTime); 593 const duration = end - start; 594 if (duration <= 0) return; 595 // Progress bar (1â100%) 596 var progress = ((now - start) / duration) * 100; 597 progress = Math.max(1, Math.min(progress, 100)); // clamp to 1â100% 598 p.progress = progress; 599 600 if (p.progress < p.prevProgress) { 601 p.progress = 1; 602 } 603 p.prevProgress = p.progress; 604 605 // Upcoming flag: show if within 6 hours 606 p.isSoon = start >= now && (start - now) <= timeToLive; 607 //console.log(p.currentShow.title, 'start:', new Date(start), 'now:', new Date(now), 'isSoon:', p.isSoon); 608 } 609 }); 610 } 611 612 $interval(updateProgressBars, 10000); 613 614 $scope.isToday = function(dateString) { 615 const d = new Date(dateString); 616 const today = new Date(); 617 return d.getFullYear() === today.getFullYear() && d.getMonth() === today.getMonth() && d.getDate() === today.getDate(); 618 }; 619 620 function loadCurrent(control) { 621 $http.get(getLiveURL).then(function(response) { 622 var streams = response.data.streams 623 .filter(function(p){ 624 return (p.state === 'ONAIR' || p.state === 'UPCOMING') && p.stream !== "TG4PLUSTWO"; 625 }) 626 .map(function(p){ 627 // Preserve streamId for links 628 p.streamId = p.streamId || p.id || p.streamId; 629 630 if (p.currentShow && p.currentShow.startTime && p.currentShow.endTime){ 631 var startTs = new Date(p.currentShow.startTime).getTime(); 632 var endTs = new Date(p.currentShow.endTime).getTime(); 633 634 // TG4+1 adjustment 635 if (p.stream === "TG4+1"){ 636 startTs += 3600000; 637 endTs += 3600000; 638 } 639 640 // Ad break offset 641 if (p.offsetSeconds && !isNaN(p.offsetSeconds)){ 642 startTs -= (p.offsetSeconds * 1000); 643 } 644 645 p.adjustedStartTime = startTs; 646 p.endTimeTs = endTs; 647 648 var startDate = new Date(startTs); 649 var now = new Date(); 650 651 var sameDay = 652 startDate.getDate() === now.getDate() && 653 startDate.getMonth() === now.getMonth() && 654 startDate.getFullYear() === now.getFullYear(); 655 656 if (sameDay){ 657 p.startTimeFormatted = 658 startDate.toLocaleTimeString([],{ 659 hour:'2-digit', 660 minute:'2-digit', 661 hour12:false 662 }); 663 } else { 664 p.startTimeFormatted =
665 startDate.toLocaleString([],{ 666 day:'2-digit', 667 month:'2-digit', 668 hour:'2-digit', 669 minute:'2-digit', 670 hour12:false 671 }); 672 } 673 } 674 675 // Icon logic 676 if (p.currentShow && p.currentShow.availability){ 677 var avail = p.currentShow.availability.trim().toUpperCase(); 678 if(avail === 'IRELAND_ONLY') p.currentShow.iconUrl = '/cf-static/images/irl_icon.svg'; 679 else if(avail === 'UNAVAILABLE') p.currentShow.iconUrl = '/cf-static/images/not_available_icon.svg'; 680 } 681 682 return p; 683 }); 684 685 $timeout(function() { 686 updateProgressBars(); 687 }); 688
689 $scope.pStreams = streams; 690 $scope.streamsReady = true; 691 692 //console.log("Streams", $scope.pStreams); 693 694 scheduleNextRefresh(control); 695 696 }).catch(function(err){ 697 console.error("Current API error:", err); 698 scheduleNextRefresh(control); // retry later 699 }); 700 } 701 702 $scope.getStreamLink = function(p) { 703 if (p.streamId == 6383455473112) { 704 return 'https://cula4.com/beo'; 705 } else if (p.streamId == 6383454185112 || p.streamId == 6384196213112) { 706 return 'player/watch-live/home/?start=' + p.adjustedStartTime; 707 } else { 708 return 'player/play/?pid=' + p.streamId + '&s=live'; 709 } 710 }; 711 712 $scope.getLinkTarget = function(p) { 713 // Open external site in new tab, others in same tab 714 return p.streamId == 6383455473112 ? '_blank' : '_self'; 715 }; 716 717 function scheduleNextRefresh(control){ 718 var interval = control.enabled ? (control.pollIntervalSeconds || 30) * 1000 : 5 * 60 * 1000; 719 var delay = Math.max(1000, interval); // min 1s delay 720 721 if (refreshTimer) $timeout.cancel(refreshTimer); 722 refreshTimer = $timeout(loadControl, delay); 723 724 //console.log(interval, delay, control); 725 } 726 727 startPolling(); 728 729 $scope.$on('$destroy', function() { 730 if (refreshTimer) $timeout.cancel(refreshTimer); 731 }); 732 733 $scope.knownImages = new Set([ 734 'box_262470_p', 735 'box_262470_l', 736 'box_434190_p', 737 'box_434190_l', 738 'box_237595_p', 739 'box_237595_l', 740 'box_507439_p', 741 'box_507439_l', 742 'box_639304_p', 743 'box_639304_l', 744 'box_227336_p', 745 'box_227336_l', 746 'box_665171s_p', 747 'box_665171s_l', 748 'box_000020s_p', 749 'box_000020s_l', 750 'box_109027_p', 751 'box_109027_l', 752 'box_254483_p', 753 'box_254483_l', 754 'box_442078_p', 755 'box_442078_l', 756 'box_075134_p', 757 'box_075134_l', 758 'box_242501_p', 759 'box_242501_l', 760 'box_330543_p', 761 'box_330543_l' 762 // Add all valid image codes here (either product_codeP, product_code, or series_code) 763 ]); 764 765 $scope.getImagePath = function(prog, rail) { 766 const baseUrlSmallP = "https://res.cloudinary.com/tg4/image/upload/w_195,h_273,c_fill,f_auto,q_auto:eco/"; 767 const baseUrlSmallL = "https://res.cloudinary.com/tg4/image/upload/w_700,h_395,c_fill,f_auto,q_auto:eco/"; 768 const baseUrlSmall = "https://res.cloudinary.com/tg4/image/upload/w_195,h_273,g_faces,c_fill,f_auto,q_auto:eco/"; 769 const baseUrlLarge = "https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/"; 770 const fallback = "https://res.cloudinary.com/tg4/image/upload/w_700,h_395,g_faces,c_fill,f_auto,q_auto:eco/000000.jpg"; 771 772 //const code = prog?.prog_metadata?.product_code; 773 const code = prog?.prog_metadata?.series_code; 774 const series = prog?.prog_metadata?.series_code; 775 const product = prog?.prog_metadata?.product_code; 776 777 const candidatesP = [ 778 code ? 'box_' + code + '_p' : null, 779 code, 780 series 781 ]; 782 783 const candidatesL = [ 784 code ? 'box_' + code + '_l' : null, 785 code, 786 series 787 ]; 788 789 /* console.log("Raw code:", `"${prog?.prog_metadata?.product_code}"`); 790 console.log(candidatesP); 791 console.log(candidatesL); */ 792 793 let baseUrl = ''; 794 let imageCode = null; 795 796 //const baseUrl = (rail.rail_number >= 9 && rail.rail_number < 13) ? baseUrlSmall : baseUrlLarge; 797 798 if (rail.rail_number == 7) { 799 baseUrl = baseUrlSmallL; 800 imageCode = candidatesL.find(c => c && $scope.knownImages.has(c)); 801 //return imageCode ? baseUrl + imageCode + '.jpg' : series ? baseUrlLarge + series + '.jpg' : fallback; 802 return imageCode 803 ? baseUrl + imageCode + '.jpg' 804 : series 805 ? baseUrlLarge + series + '.jpg' 806 : product 807 ? baseUrlLarge + product + '.jpg' 808 : fallback; 809 } 810 if (rail.rail_number == 9) { 811 baseUrl = baseUrlSmallP; 812 imageCode = candidatesP.find(c => c && $scope.knownImages.has(c)); 813 //return imageCode ? baseUrl + imageCode + '.jpg' : series ? baseUrlSmall + series + '.jpg' : fallback; 814 return imageCode 815 ? baseUrl + imageCode + '.jpg' 816 : series 817 ? baseUrlSmall + series + '.jpg' 818 : product 819 ? baseUrlSmall + product + '.jpg' 820 : fallback; 821 } 822 }; 823 824 $scope.diffDate = function(date1) { 825 var dateOut1 = new Date(Date.parse(date1, "yyyy-MM-dd HH:mm:ss")); // It will work if date1 is in ISO format 826 var dateOut2 = new Date(); // Today's date 827 var timeDiff = Math.abs(dateOut1.getTime() - dateOut2.getTime()); 828 var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); 829 return diffDays; 830 }; 831 832 $scope.replaceBulk = function(str, findArray, replaceArray) { 833 var i, regex = [], map = {}; 834 for(i=0; i<findArray.length; i++){ 835 regex.push( findArray[i].replace(/([-[\]{}()*+?.\\^$|#,])/g,'\\$1')); 836 map[findArray[i]] = replaceArray[i]; 837 } 838 regex = regex.join('|'); 839 str = str.replace(new RegExp(regex, 'g'), function(matched){ 840 return map[matched]; 841 }); 842 return str; 843 }; 844 845 $scope.slickConfig1Loaded = true; 846 $scope.slickConfig1 = { 847 method: {}, 848 dots: true, 849 infinite: true, 850 speed: 1000, 851 slidesToShow: 1, 852 slidesToScroll: 1, 853 autoplay: false, 854 draggable: true, 855 lazyLoad: 'ondemand', 856 autoplaySpeed: 4000 857 }; 858 }); 859 </script>
859 860 861 <section class="section-panel-othersites"> 862 <p class="othersites-title">Other Brands</p> 863 </section> 864 865 <section class="section-panel-microsite"> 866 <h2 class="visuallyhidden">Micro-sites</h2> 867 <div class="micromods-wrapper"> 868 <section class="mod-1"><a href="https://www.cula4.com/en" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Cula4-2024.png" alt="Cúla4"></a></section> 869 <section class="mod-1"><a href="https://www.cine4.ie/en/produced-films" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Cine4-2024.png" alt="Cine4"></a></section> 870 <section class="mod-1"><a href="https://bloc.tg4.ie/en" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Bloc2024_1.png" alt="BLOC"></a></section> 871 <section class="mod-1"><a href="https://www.molsceal.ie" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Molsceal-2024.png" alt="Molscéal"></a></section> 872 <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/gradam-ceoil/current-awards/"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/GradamCeoil-2024.png" alt="Gradam Ceoil TG4"></a></section> 873 <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/irish-news/"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Nuacht-2024.png" alt="Nuacht TG4"></a></section> 874 <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/weather/"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Aimsir-2024.png" alt="Aimsir TG4"></a></section> 875 <section class="mod-1"><a href="https://foghlaim.tg4.ie" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Foghlaim-2024.png" alt="TG4 Foghlaim"></a></section> 876 <section class="mod-1"><a href="https://seannos.tg4.ie" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/SeanNos-2024.png" alt="Sean Nós TG4"></a></section> 877 <section class="mod-1"><a href="https://www.tg4.ie/en/other-brands/tg4-archive/" target="_New"><img src="https://d1og0s8nlbd0hm.cloudfront.net/images/Cartlann_TG4-2024.png" alt="Cartlann TG4"></a></section> 878 </div> 879 </section> 880 881 <section class="section-panel-socmedia"> 882 <a class="soc-link" href="https://www.facebook.com/TG4TV" target="_New"><span><img src="/cf-static/images/Facebook.png" alt="Facebook"></span></a> 883 <a class="soc-link" href="https://twitter.com/TG4TV" target="_New"><span><img src="/cf-static/images/X.png" alt="X"></span></a> 884 <a class="soc-link" href="https://www.instagram.com/tg4tv/" target="_New"><span><img src="/cf-static/images/Instagram.png" alt="Instagram"></span></a> 885 <a class="soc-link" href="https://www.instagram.com/tg4tv/" target="_New"><span><img src="/cf-static/images/IGTV.png" alt="IGTV"></span></a> 886 <a class="soc-link" href="https://www.youtube.com/user/TG4" target="_New"><span><img src="/cf-static/images/Youtube.png" alt="Youtube"></span></a> 887 <a class="soc-link" href="https://www.tiktok.com/@tg4tv" target="_New"><span><img src="/cf-static/images/TikTok.png" alt="TikTok"></span></a> 888 <a class="soc-link" href="https://www.flickr.com/photos/tg4" target="_New"><span><img src="/cf-static/images/Flickr.png" alt="Flickr"></span></a> 889 </section> 890 </main> 891 892 <!-- Placeholder where footer will be injected --> 893 <div id="footer-placeholder"></div> 894 895
895<script> 896 fetch('/cf-static/html/footer-en.html') 897 .then(response => response.text()) 898 .then(data => { 899 document.getElementById('footer-placeholder').innerHTML = data; 900 }); 901 </script>
901 902 903 <style> 904 /* Cookie Bar CSS */ 905 #cookieBar { 906 display: none; 907 } 908 #cookieBar { 909 display: block; 910 } 911 .cookie-message { 912 background-color: #000; 913 font-size: 14px; 914 position: fixed; 915 bottom: 0; 916 left: 0; 917 right: 0; 918 padding: 10px; 919 z-index: 99; 920 color: #FFF; 921 text-align: center; 922 } 923 .cookie-message a { 924 color: #FFF; 925 text-align: center; 926 cursor: pointer; 927 } 928 .cookie-message a:hover { 929 color: #EB0071; 930 text-align: center; 931 cursor: pointer; 932 } 933 </style> 934 </div> 935 936 <!-- Facebook Pixel Code - 26.07.2018 --> 937
937<script>
vendor: 480 bytes, lines 937-946
937 938 !function(f,b,e,v,n,t,s) 939 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 940 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 941 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 942 n.queue=[];t=b.createElement(e);t.async=!0; 943 t.src=v;s=b.getElementsByTagName(e)[0]; 944 s.parentNode.insertBefore(t,s)}(window, document,'script', 945 'https://connect.facebook.net/en_US/fbevents.js'); 946 fbq('init', '
946204101163593179
vendor: 44 bytes, lines 946-948
946'); 947 fbq('track', 'PageView'); 948
948</script>
948 949 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=204101163593179&ev=PageView&noscript=1" 950 /></noscript> 951 <!-- End Facebook Pixel Code --> 952 953 <!-- X universal website tag code --> 954
954<script> 955 !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments); 956 },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='//static.ads-twitter.com/uwt.js', 957 a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script'); 958 // Insert X Pixel ID and Standard Event data below 959 twq('init','o8qz7'); 960 twq('track','PageView'); 961 </script>
961 962 <!-- End X universal website tag code --> 963 964 <!-- Tiktok tag code --> 965
965<script> 966 !function (w, d, t) { 967 w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;n<ttq.methods.length;n++ 968 )ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};n=document.createElement("script");n.type="text/javascript",n.async=!0,n.src=i+"?sdkid="+e+"&lib="+t;e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(n,e)}; 969 970 ttq.load('C9V5TNJC77U4F2PS59JG'); 971 ttq.page(); 972 }(window, document, 'ttq'); 973 </script>
973 974 <!-- End Tiktok tag code --> 975 976 <!-- ============= OUTDATED BROWSER ============= --> 977 <div id="outdated"></div> 978</body> 979</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.