mirror of
https://github.com/iptv-org/epg
synced 2025-12-16 02:16:40 -05:00
add new guide_tnt site
This commit is contained in:
1087
sites/guidetnt.com/__data__/content.html
Normal file
1087
sites/guidetnt.com/__data__/content.html
Normal file
File diff suppressed because it is too large
Load Diff
390
sites/guidetnt.com/__data__/no_content.html
Normal file
390
sites/guidetnt.com/__data__/no_content.html
Normal file
@@ -0,0 +1,390 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr-FR" dir="ltr">
|
||||
<head>
|
||||
<title>Programme TF1 - GuideTNT.com</title>
|
||||
<link rel="canonical" href="https://www.guidetnt.com/tv/programme-tf1" />
|
||||
<link rel="alternate" media="only screen and (max-width: 640px)" href="https://www.guidetnt.com/mobile/tv/programme-tf1" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<meta name="description" content="Programme TF1 : retrouvez tous les programmes téle de TF1, les series, les films… aujourd'hui, ce soir, demain." />
|
||||
<meta name="robots" content="index, nofollow" />
|
||||
|
||||
|
||||
|
||||
<meta charset="utf-8" />
|
||||
<style>/* @see https://github.com/aFarkas/lazysizes#broken-image-symbol */.js img.lazyload:not([src]) { visibility: hidden; }/* @see https://github.com/aFarkas/lazysizes#automatically-setting-the-sizes-attribute */.js img.lazyloaded[data-sizes=auto] { display: block; width: 100%; }</style>
|
||||
<link rel="icon" href="/themes/tv_desktop/favicon.ico" type="image/vnd.microsoft.icon" />
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" media="all" href="/sites/default/files/css/css_9nuvaeEmNA08el71NJFLlttfauI_QpRLRSFJvVoz454.css?delta=0&language=en&theme=tv_desktop&include=eJxNy0sKwCAMRdENaV2S-AkixkT6tODu205KZ4cLV2oi30kWnHz0CTBDmV0-1wh8vLZcpcFgY1J3MYDMvHwmtKnDBVHZXRf-sbDGwBZzP2-5AeeqKlk" />
|
||||
<link rel="stylesheet" media="all" href="/sites/default/files/css/css_IsbAlqEc6AE2KOVIUc6Bl117QK1dQRHEBJCuusr4rqo.css?delta=1&language=en&theme=tv_desktop&include=eJxNy0sKwCAMRdENaV2S-AkixkT6tODu205KZ4cLV2oi30kWnHz0CTBDmV0-1wh8vLZcpcFgY1J3MYDMvHwmtKnDBVHZXRf-sbDGwBZzP2-5AeeqKlk" />
|
||||
|
||||
|
||||
|
||||
<script async="async" type="text/javascript" src="/modules/custom/tvmachine_blocks/js/wz_tooltip.min.js"></script>
|
||||
|
||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-122P0EXBFP"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-122P0EXBFP');
|
||||
</script>
|
||||
|
||||
<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body >
|
||||
|
||||
|
||||
<div class="dialog-off-canvas-main-canvas" data-off-canvas-main-canvas>
|
||||
|
||||
<div id="container">
|
||||
<div id="header-wrapper" class="clear">
|
||||
<div id="header-wrapper-up">
|
||||
<div id="tvlogo">
|
||||
|
||||
|
||||
<a href="/" title="Programme TV" rel="Programme TV">
|
||||
<img src="/themes/tv_desktop/images/guide-tnt.png" alt="Programme TV" />
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="tvsocial">
|
||||
|
||||
|
||||
|
||||
<div><div class="tvsocial-facebook">
|
||||
<div id="facebook-div" style="border-style:none; margin:0px; padding:0px; height:25px; display:inline-block; float:none; ">
|
||||
<a href="https://www.facebook.com/guidetnt/" title="Facebook">
|
||||
<img src="/themes/tv_desktop/images/button-fb.png" alt="Facebook" width="20" height="20" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tvsocial-instagram">
|
||||
<div id="instagram-div" style="border-style:none; margin:0px; padding:0px; height:25px; display:inline-block; float:none; ">
|
||||
<a href="https://www.instagram.com/guidetnt/" title="Instagram">
|
||||
<img src="/themes/tv_desktop/images/button-instagram.png" alt="Instagram" width="20" height="20" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tvsocial-x">
|
||||
<div id="twitter-div" style="border-style:none; margin:0px; padding:0px; height:25px; display:inline-block; float:none; ">
|
||||
<a href="https://twitter.com/guidetnt" title="Twitter">
|
||||
<img src="/themes/tv_desktop/images/button-follow-x.png" alt="Twitter" width="20" height="20" />
|
||||
</a>
|
||||
</div>
|
||||
</div></div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="nav">
|
||||
|
||||
<div id="block-nicemenus">
|
||||
|
||||
|
||||
|
||||
|
||||
<ul class="nice-menu nice-menu-menu-tv-desktop nice-menu-down menu">
|
||||
<li class="menuparent menu-item menu-item--expanded" id="id-1"
|
||||
>
|
||||
<a href="/programme-tv/programme-tv" title="Programme télé du soir">Ce soir à la télé</a>
|
||||
<ul class="menu">
|
||||
<li class="menu-item"
|
||||
>
|
||||
<a href="/programme-tv/programme-tv" title="Programme télé du soir">Ce soir à la télé</a>
|
||||
</li>
|
||||
<li class="menu-item"
|
||||
>
|
||||
<a href="/programme-tv/programme-tv-maintenant" title="Maintenant à la télé">Maintenant à la télé</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</li>
|
||||
<li id="id-2" class="menu-item"
|
||||
>
|
||||
<a href="/page/sondage-soiree-tv" title="Sondage">Sondage</a>
|
||||
</li>
|
||||
<li id="id-3" class="menu-item"
|
||||
>
|
||||
<a href="/page/selection-chaines" title="Sélection des chaînes">Chaînes</a>
|
||||
</li>
|
||||
<li class="menuparent menu-item menu-item--expanded" id="id-4"
|
||||
>
|
||||
<a href="/webmaster/grille-television-2-heures">Webmasters</a>
|
||||
<ul class="menu">
|
||||
<li class="menu-item"
|
||||
>
|
||||
<a href="/webmaster/grille-television-2-heures" title="Grille TV 2 heures">Grille TV 2 heures</a>
|
||||
</li>
|
||||
<li class="menu-item"
|
||||
>
|
||||
<a href="/webmaster/grille-television-3-heures" title="Grille TV 3 heures">Grille TV 3 heures</a>
|
||||
</li>
|
||||
<li class="menu-item"
|
||||
>
|
||||
<a href="/webmaster/liste-programmes-tele-1" title="Liste 1 programme">Liste 1 programme</a>
|
||||
</li>
|
||||
<li class="menu-item"
|
||||
>
|
||||
<a href="/webmaster/liste-programmes-tele-2" title="Liste 2 programmes">Liste 2 programmes</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</li>
|
||||
<li id="id-5" class="menu-item"
|
||||
>
|
||||
<a href="/page/live-tv" title="Live TV">Live TV</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="main-wrapper" class="clear sidebar-left ">
|
||||
|
||||
|
||||
<div id="tvtoptop">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div id="sidebar-left" class="sidebar">
|
||||
<div id="block-channelsmenudesktop">
|
||||
|
||||
|
||||
|
||||
<div><div style="padding: 0 0 0 2px; margin: 40px 0 15px 0;">
|
||||
<h5>Chaînes TV</h5>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function loadjscssfile(filename, filetype){
|
||||
if (filetype=="js"){ //if filename is a external JavaScript file
|
||||
var fileref=document.createElement('script')
|
||||
fileref.setAttribute("type","text/javascript")
|
||||
fileref.setAttribute("src", filename)
|
||||
}
|
||||
else if (filetype=="css"){ //if filename is an external CSS file
|
||||
var fileref=document.createElement("link")
|
||||
fileref.setAttribute("rel", "stylesheet")
|
||||
fileref.setAttribute("type", "text/css")
|
||||
fileref.setAttribute("href", filename)
|
||||
}
|
||||
if (typeof fileref!="undefined")
|
||||
document.getElementsByTagName("head")[0].appendChild(fileref)
|
||||
}
|
||||
loadjscssfile("/modules/custom/tvmachine_blocks/css/ajax_temp_list_3.css", "css")
|
||||
</script>
|
||||
|
||||
<div class="tvlogo58" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tf1" title="Programme TF1">TF1</a></div><br style="clear:both;">
|
||||
<div class="tvlogo59" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-france-2" title="Programme France 2">France 2</a></div><br style="clear:both;">
|
||||
<div class="tvlogo60" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-france-3" title="Programme France 3">France 3</a></div><br style="clear:both;">
|
||||
<div class="tvlogo61" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-france-4" title="Programme France 4">France 4</a></div><br style="clear:both;">
|
||||
<div class="tvlogo62" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-france-5" title="Programme France 5">France 5</a></div><br style="clear:both;">
|
||||
<div class="tvlogo63" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-m6" title="Programme M6">M6</a></div><br style="clear:both;">
|
||||
<div class="tvlogo64" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-arte" title="Programme Arte">Arte</a></div><br style="clear:both;">
|
||||
<div class="tvlogo71" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-w9" title="Programme W9">W9</a></div><br style="clear:both;">
|
||||
<div class="tvlogo72" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tmc" title="Programme TMC">TMC</a></div><br style="clear:both;">
|
||||
<div class="tvlogo73" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tfx" title="Programme TFX">TFX</a></div><br style="clear:both;">
|
||||
<div class="tvlogo74" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tf1-series-films" title="Programme TF1 Séries Films">TF1 Séries Films</a></div><br style="clear:both;">
|
||||
<div class="tvlogo75" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cstar" title="Programme CSTAR">CSTAR</a></div><br style="clear:both;">
|
||||
<div class="tvlogo76" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cherie-25" title="Programme Chérie 25">Chérie 25</a></div><br style="clear:both;">
|
||||
<div class="tvlogo70" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-t18" title="Programme T18">T18</a></div><br style="clear:both;">
|
||||
<div class="tvlogo79" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-6ter" title="Programme 6ter">6ter</a></div><br style="clear:both;">
|
||||
<div class="tvlogo80" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-rmc-story" title="Programme RMC Story">RMC Story</a></div><br style="clear:both;">
|
||||
<div class="tvlogo69" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tv5monde" title="Programme TV5MONDE">TV5MONDE</a></div><br style="clear:both;">
|
||||
<div class="tvlogo81" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-lcp-public-senat" title="Programme LCP / Public Senat">LCP / Public Senat</a></div><br style="clear:both;">
|
||||
<div class="tvlogo87" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-gulli" title="Programme Gulli">Gulli</a></div><br style="clear:both;">
|
||||
<div class="tvlogo91" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-disney-channel" title="Programme Disney Channel">Disney Channel</a></div><br style="clear:both;">
|
||||
<div class="tvlogo102" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-kids" title="Programme Canal+ Kids">Canal+ Kids</a></div><br style="clear:both;">
|
||||
<div class="tvlogo92" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-ab1" title="Programme AB1">AB1</a></div><br style="clear:both;">
|
||||
<div class="tvlogo93" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-mtv" title="Programme MTV">MTV</a></div><br style="clear:both;">
|
||||
<div class="tvlogo94" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-e-entertainment" title="Programme E! Entertainment">E! Entertainment</a></div><br style="clear:both;">
|
||||
<div class="tvlogo95" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-13eme-rue" title="Programme 13ème RUE">13ème RUE</a></div><br style="clear:both;">
|
||||
<div class="tvlogo96" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tv-breizh" title="Programme TV Breizh">TV Breizh</a></div><br style="clear:both;">
|
||||
<div class="tvlogo105" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-polarplus" title="Programme Polar+">Polar+</a></div><br style="clear:both;">
|
||||
<div class="tvlogo97" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-comedieplus" title="Programme Comedie+">Comedie+</a></div><br style="clear:both;">
|
||||
<div class="tvlogo107" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-comedy-central" title="Programme Comedy Central">Comedy Central</a></div><br style="clear:both;">
|
||||
<div class="tvlogo158" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-bet" title="Programme BET">BET</a></div><br style="clear:both;">
|
||||
<div class="tvlogo157" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-mcm" title="Programme MCM">MCM</a></div><br style="clear:both;">
|
||||
<div class="tvlogo119" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-paramount-channel" title="Programme Paramount Channel">Paramount Channel</a></div><br style="clear:both;">
|
||||
<div class="tvlogo104" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-warner-tv" title="Programme Warner TV">Warner TV</a></div><br style="clear:both;">
|
||||
<div class="tvlogo67" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-rtl9" title="Programme RTL9">RTL9</a></div><br style="clear:both;">
|
||||
<div class="tvlogo122" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-syfy" title="Programme Syfy">Syfy</a></div><br style="clear:both;">
|
||||
<div class="tvlogo121" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-action" title="Programme Action">Action</a></div><br style="clear:both;">
|
||||
<div class="tvlogo120" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-tcm" title="Programme TCM">TCM</a></div><br style="clear:both;">
|
||||
<div class="tvlogo98" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus" title="Programme Canal+">Canal+</a></div><br style="clear:both;">
|
||||
<div class="tvlogo99" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-cinema" title="Programme Canal+ Cinéma(s)">Canal+ Cinéma(s)</a></div><br style="clear:both;">
|
||||
<div class="tvlogo100" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-grand-ecran" title="Programme Canal+ Grand écran">Canal+ Grand écran</a></div><br style="clear:both;">
|
||||
<div class="tvlogo106" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-box-office" title="Programme Canal+ Box office">Canal+ Box office</a></div><br style="clear:both;">
|
||||
<div class="tvlogo101" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-series" title="Programme Canal+ Séries">Canal+ Séries</a></div><br style="clear:both;">
|
||||
<div class="tvlogo140" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-docs" title="Programme Canal+ Docs">Canal+ Docs</a></div><br style="clear:both;">
|
||||
<div class="tvlogo115" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-ocs" title="Programme OCS">OCS</a></div><br style="clear:both;">
|
||||
<div class="tvlogo114" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cineplus-frisson" title="Programme Cine+ Frisson">Cine+ Frisson</a></div><br style="clear:both;">
|
||||
<div class="tvlogo117" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cineplus-classic" title="Programme Cine+ Classic">Cine+ Classic</a></div><br style="clear:both;">
|
||||
<div class="tvlogo111" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cineplus-festival" title="Programme Cine+ Festival">Cine+ Festival</a></div><br style="clear:both;">
|
||||
<div class="tvlogo112" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cineplus-emotion" title="Programme Cine+ Emotion">Cine+ Emotion</a></div><br style="clear:both;">
|
||||
<div class="tvlogo113" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-cineplus-family" title="Programme Cine+ Family">Cine+ Family</a></div><br style="clear:both;">
|
||||
<div class="tvlogo125" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-histoire" title="Programme Histoire">Histoire</a></div><br style="clear:both;">
|
||||
<div class="tvlogo126" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-toute-l-histoire" title="Programme Toute l'histoire">Toute l'histoire</a></div><br style="clear:both;">
|
||||
<div class="tvlogo127" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-crime-district" title="Programme Crime District">Crime District</a></div><br style="clear:both;">
|
||||
<div class="tvlogo128" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-discovery-channel" title="Programme Discovery Channel">Discovery Channel</a></div><br style="clear:both;">
|
||||
<div class="tvlogo130" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-science-vie-tv" title="Programme Science&Vie TV">Science&Vie TV</a></div><br style="clear:both;">
|
||||
<div class="tvlogo131" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-rmc-decouverte" title="Programme RMC Découverte">RMC Découverte</a></div><br style="clear:both;">
|
||||
<div class="tvlogo133" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-planeteplus" title="Programme Planète+">Planète+</a></div><br style="clear:both;">
|
||||
<div class="tvlogo134" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-planeteplus-crime" title="Programme Planète+ Crime">Planète+ Crime</a></div><br style="clear:both;">
|
||||
<div class="tvlogo135" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-planeteplus-aventure" title="Programme Planète+ Aventure">Planète+ Aventure</a></div><br style="clear:both;">
|
||||
<div class="tvlogo136" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-national-geographic" title="Programme National Geographic">National Geographic</a></div><br style="clear:both;">
|
||||
<div class="tvlogo137" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-nat-geo-wild" title="Programme Nat Geo Wild">Nat Geo Wild</a></div><br style="clear:both;">
|
||||
<div class="tvlogo138" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-animaux" title="Programme Animaux">Animaux</a></div><br style="clear:both;">
|
||||
<div class="tvlogo139" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-ushuaia-tv" title="Programme Ushuaia TV">Ushuaia TV</a></div><br style="clear:both;">
|
||||
<div class="tvlogo141" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-trek" title="Programme Trek">Trek</a></div><br style="clear:both;">
|
||||
<div class="tvlogo142" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-lequipe" title="Programme L'Equipe">L'Equipe</a></div><br style="clear:both;">
|
||||
<div class="tvlogo145" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-eurosport-1" title="Programme Eurosport 1">Eurosport 1</a></div><br style="clear:both;">
|
||||
<div class="tvlogo146" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-eurosport-2" title="Programme Eurosport 2">Eurosport 2</a></div><br style="clear:both;">
|
||||
<div class="tvlogo150" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-automoto" title="Programme Automoto">Automoto</a></div><br style="clear:both;">
|
||||
<div class="tvlogo103" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-sport" title="Programme Canal+ Sport">Canal+ Sport</a></div><br style="clear:both;">
|
||||
<div class="tvlogo174" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-sport-360" title="Programme Canal+ Sport 360">Canal+ Sport 360</a></div><br style="clear:both;">
|
||||
<div class="tvlogo172" style="float: left; width: 34px;"></div><div class="block-channel-programs-div-title"><a target="_top" href="/tv/programme-canalplus-foot" title="Programme Canal+ Foot">Canal+ Foot</a></div><br style="clear:both;">
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div id="main">
|
||||
<div data-drupal-messages-fallback class="hidden"></div>
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<div id='tvmachine_programs_channel_top'>
|
||||
<div id='logo'>
|
||||
<img src='https://www.guidetnt.com/sites/default/files/logo/tf1.png' />
|
||||
</div>
|
||||
<div id='title'>
|
||||
<h1> Programme TF1</h1>
|
||||
</div>
|
||||
<div id='subtitle'>du 01 Juillet 2025</div>
|
||||
</div>
|
||||
|
||||
<div id="tvmachine_programs_channel">
|
||||
|
||||
<a class="button-programs-channel-active" title="Aujourd'hui" href="/tv/programme-tf1">Aujourd'hui</a>
|
||||
<a class="button-programs-channel" title="Demain" href="/tv-demain/programme-tf1">Demain</a>
|
||||
<a class="button-programs-channel" title="Grille TV" href="/">Grille TV</a>
|
||||
<br style="clear:both;">
|
||||
<br />
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="footer-wrapper" class="clear">
|
||||
<div id="footer">
|
||||
|
||||
</div>
|
||||
|
||||
<div id="footer-message">
|
||||
<br style="clear:both;" />
|
||||
<div id="block-footerhomedesktop">
|
||||
|
||||
|
||||
|
||||
<div><a href="/" title="Programme TV">Programme TV</a> -
|
||||
<a href="/programme-tv/programme-tv-maintenant" title="Programme TV maintenant">Programme TV maintenant</a> -
|
||||
<a href="/page/sondage-soiree-tv" title="Sondage">Sondage</a> -
|
||||
<a href="/page/live-tv" title="Live TV">Live TV</a> -
|
||||
<a href="/page/conditions-d-utilisation" title="Conditions d'utilisation">Conditions d'utilisation</a> -
|
||||
<a href="/page/politique-des-cookies" title="Politique des cookies">Politique des cookies</a>
|
||||
|
||||
<br />
|
||||
|
||||
<a href="/tv/programme-tf1" title="programme TF1">TF1</a> -
|
||||
<a href="/tv/programme-france-2" title="programme France 2">France 2</a> -
|
||||
<a href="/tv/programme-france-3" title="programme France 3">France 3</a> -
|
||||
<a href="/tv/programme-france-4" title="programme France 4">France 4</a> -
|
||||
<a href="/tv/programme-france-5" title="programme France 5">France 5</a> -
|
||||
<a href="/tv/programme-m6" title="programme M6">M6</a> -
|
||||
<a href="/tv/programme-arte" title="programme Arte">Arte</a> -
|
||||
<a href="/tv/programme-tv5monde" title="programme TV5MONDE">TV5MONDE</a> -
|
||||
<a href="/tv/programme-w9" title="programme W9">W9</a> -
|
||||
<a href="/tv/programme-tmc" title="programme TMC">TMC</a> -
|
||||
<a href="/tv/programme-tfx" title="programme TFX">TFX</a> -
|
||||
<a href="/tv/programme-tf1-series-films" title="programme TF1 Séries Films">TF1 Séries Films</a> -
|
||||
<a href="/tv/programme-cstar" title="programme CSTAR">CSTAR</a> -
|
||||
<a href="/tv/programme-cherie-25" title="programme Chérie 25">Chérie 25</a> -
|
||||
<a href="/tv/programme-6ter" title="programme 6ter">6ter</a> -
|
||||
<a href="/tv/programme-ab1" title="programme AB1">AB1</a> -
|
||||
<a href="/tv/programme-bet" title="programme BET">BET</a> -
|
||||
<a href="/tv/programme-mcm" title="programme MCM">MCM</a> -
|
||||
<a href="/tv/programme-paramount-channel" title="programme Paramount Channel">Paramount Channel</a> -
|
||||
<a href="/tv/programme-warner-tv" title="programme Warner TV">Warner TV</a> -
|
||||
<a href="/tv/programme-canalplus" title="programme Canal+">Canal+</a> -
|
||||
<a href="/tv/programme-ocs" title="programme OCS">OCS</a>
|
||||
|
||||
<br />
|
||||
|
||||
<a title="programacion TV" href="http://www.tvguia.es/">Programacion TV</a> España -
|
||||
<a title="programme TV" href="https://www.guidetnt.com/">Programme TV</a> France -
|
||||
<a title="programme TV" href="http://www.guidetv.be/">Programme TV</a> Belgique -
|
||||
<a title="programme TV" href="http://www.programmetv.ch/">Programme TV</a> Suisse</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script type="application/json" data-drupal-selector="drupal-settings-json">{"path":{"baseUrl":"\/","pathPrefix":"","currentPath":"program-television\/58","currentPathIsAdmin":false,"isFront":false,"currentLanguage":"en"},"pluralDelimiter":"\u0003","suppressDeprecationErrors":true,"lazy":{"lazysizes":{"lazyClass":"lazyload","loadedClass":"lazyloaded","loadingClass":"lazyloading","preloadClass":"lazypreload","errorClass":"lazyerror","autosizesClass":"lazyautosizes","srcAttr":"data-src","srcsetAttr":"data-srcset","sizesAttr":"data-sizes","minSize":40,"customMedia":[],"init":true,"expFactor":1.5,"hFac":0.8000000000000000444089209850062616169452667236328125,"loadMode":2,"loadHidden":false,"ricTimeout":0,"throttleDelay":125,"plugins":[]},"placeholderSrc":"","preferNative":false,"minified":true,"libraryPath":"\/libraries\/lazysizes"},"nice_menus_options":{"delay":1,"speed":"fast"},"user":{"uid":0,"permissionsHash":"1d1e9bfdeaafe363b8ddedcdbbbf087c0bacf20856355791b844607852a24f54"}}</script>
|
||||
<script src="/sites/default/files/js/js_-QbgrSyjT9BT1ItWGQq9Hcy9cYubyFiHwI2sS26Rr9s.js?scope=footer&delta=0&language=en&theme=tv_desktop&include=eJxtiUEKwCAMBD9kyZNEbbBLYywkFezr662XXoZhRtIzSRaConBsrLfRp8FH3NlO7xdV6TnJZj4FWtdpqRxQjgOGDIFP-osvrgAnxA"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
73
sites/guidetnt.com/guidetnt.com.channels.xml
Normal file
73
sites/guidetnt.com/guidetnt.com.channels.xml
Normal file
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channels>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TF1.fr" site_id="tf1">TF1</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="France2.fr" site_id="france-2">France 2</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="France3.fr" site_id="france-3">France 3</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="France4.fr" site_id="france-4">France 4</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="France5.fr" site_id="france-5">France 5</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="M6.fr" site_id="m6">M6</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="arte.fr" site_id="arte">Arte</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="W9.fr" site_id="w9">W9</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TMC.fr" site_id="tmc">TMC</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TFX.fr" site_id="tfx">TFX</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TF1SeriesFilms.fr" site_id="tf1-series-films">TF1 Séries Films</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CStar.fr" site_id="cstar">CSTAR</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Cherie25.fr" site_id="cherie-25">Chérie 25</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="T18.fr" site_id="t18">T18</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="6ter.fr" site_id="6ter">6ter</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="RMCStory.fr" site_id="rmc-story">RMC STORY</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TV5MondeFranceBelgiumSwitzerlandMonaco.fr" site_id="tv5monde">TV5MONDE</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="LCP.fr" site_id="lcp-public-senat">LCP / Public Senat</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Gulli.fr" site_id="gulli">Gulli</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="DisneyChannel.fr" site_id="disney-channel">Disney Channel</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusKids.fr" site_id="canalplus-kids">Canal+ Kids</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="AB1.fr" site_id="ab1">AB1</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="MTV.fr" site_id="mtv">MTV</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="E.fr" site_id="e-entertainment">E! Entertainment</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="13emeRue.fr" site_id="13eme-rue">13ème RUE</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TVBreizh.fr" site_id="tv-breizh"></channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="PolarPlus.fr" site_id="polarplus">Polar+</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="ComediePlus.fr" site_id="comedieplus">Comedie+</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="ComedyCentral.fr" site_id="comedy-central">Comedy Central</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="BET.fr" site_id="bet">BET</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="MCM.fr" site_id="mcm">MCM</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="ParamountChannel.fr" site_id="paramount-channel">Paramount Channel</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="WarnerTV.fr" site_id="warner-tv">Warner TV</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="RTL9.lu" site_id="rtl9">RTL9</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Syfy.fr" site_id="syfy">Syfy</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Action.fr" site_id="action">Action</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="TCMCinema.fr" site_id="tcm">TCM</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlus.fr" site_id="canalplus">Canal+</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusCinemas.fr" site_id="canalplus-cinema">Canal+ Cinéma(s)</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusGrandEcran.fr" site_id="canalplus-grand-ecran">Canal+ Grand écran</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusBoxOffice.fr" site_id="canalplus-box-office">Canal+ Box office</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusSeries.fr" site_id="canalplus-series">Canal+ Séries</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusDocs.fr" site_id="canalplus-docs">Canal+ Docs</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CinePlusOCS.fr" site_id="ocs">OCS</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CinePlusFrisson.fr" site_id="cineplus-frisson">Cine+ Frisson</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CinePlusClassic.fr" site_id="cineplus-classic">Cine+ Classic</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CinePlusFestival.fr" site_id="cineplus-festival">Cine+ Festival</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CinePlusEmotion.fr" site_id="cineplus-emotion">Cine+ Emotion</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CinePlusFamily.fr" site_id="cineplus-family">Cine+ Family</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="HistoireTV.fr" site_id="histoire">Histoire</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="ToutelHistoire.fr" site_id="toute-l-histoire">Toute l'histoire</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CrimeDistrict.fr" site_id="crime-district">Crime District</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="DiscoveryChannel.fr" site_id="discovery-channel">Discovery Channel</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="ScienceVieTV.fr" site_id="science-vie-tv">Science&Vie TV</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="RMCDecouverte.fr" site_id="rmc-decouverte">RMC Découverte</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="PlanetePlus.fr" site_id="planeteplus">Planète+</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="PlanetePlusCrime.fr" site_id="planeteplus-crime">Planète+ Crime</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="PlanetePlusAventure.fr" site_id="planeteplus-aventure">Planète+ Aventure</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="NationalGeographic.fr" site_id="national-geographic">National Geographic</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="NationalGeographicWild.fr" site_id="nat-geo-wild">Nat Geo Wild</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Animaux.fr" site_id="animaux">Animaux</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="UshuaiaTV.fr" site_id="ushuaia-tv">Ushuaia TV</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Trek.fr" site_id="trek">Trek</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="LEquipe.fr" site_id="lequipe">L'Equipe</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Eurosport1.fr" site_id="eurosport-1">Eurosport 1</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Eurosport2.fr" site_id="eurosport-2">Eurosport 2</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="Automotolachaine.fr" site_id="automoto">Automoto</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusSport.fr" site_id="canalplus-sport">Canal+ Sport</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusSport360.fr" site_id="canalplus-sport-360">Canal+ Sport 360</channel>
|
||||
<channel site="guidetnt.com" lang="fr" xmltv_id="CanalPlusFoot.fr" site_id="canalplus-foot">Canal+ Foot</channel>
|
||||
</channels>
|
||||
333
sites/guidetnt.com/guidetnt.com.config.js
Executable file
333
sites/guidetnt.com/guidetnt.com.config.js
Executable file
@@ -0,0 +1,333 @@
|
||||
const cheerio = require('cheerio')
|
||||
const axios = require('axios')
|
||||
const dayjs = require('dayjs')
|
||||
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
require('dayjs/locale/fr')
|
||||
|
||||
dayjs.extend(customParseFormat)
|
||||
dayjs.extend(utc)
|
||||
dayjs.extend(timezone)
|
||||
|
||||
const PARIS_TZ = 'Europe/Paris'
|
||||
|
||||
module.exports = {
|
||||
site: 'guidetnt.com',
|
||||
days: 2,
|
||||
url({ channel, date }) {
|
||||
const now = dayjs()
|
||||
const demain = now.add(1, 'd')
|
||||
if (date && date.isSame(demain, 'day')) {
|
||||
return `https://www.guidetnt.com/tv-demain/programme-${channel.site_id}`
|
||||
} else if (!date || date.isSame(now, 'day')) {
|
||||
return `https://www.guidetnt.com/tv/programme-${channel.site_id}`
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
},
|
||||
async parser({ content, date }) {
|
||||
const programs = []
|
||||
const allItems = parseItems(content)
|
||||
const items = allItems?.rows
|
||||
const itemDate = allItems?.formattedDate
|
||||
for (const item of items) {
|
||||
const prev = programs[programs.length - 1]
|
||||
const $item = cheerio.load(item)
|
||||
const title = parseTitle($item)
|
||||
let start = parseStart($item, itemDate)
|
||||
|
||||
if (!start || !title) return
|
||||
if (prev) {
|
||||
if (start.isBefore(prev.start)) {
|
||||
start = start.add(1, 'd')
|
||||
date = date.add(1, 'd')
|
||||
}
|
||||
prev.stop = start
|
||||
}
|
||||
let stop = start.add(30, 'm')
|
||||
|
||||
let itemDetails = null
|
||||
let subTitle = null
|
||||
//let duration = null
|
||||
let country = null
|
||||
let productionDate = null
|
||||
let episode = null
|
||||
let season = null
|
||||
let category = parseCategory($item)
|
||||
let description = parseDescription($item)
|
||||
const itemDetailsURL = parseDescriptionURL($item)
|
||||
if(itemDetailsURL) {
|
||||
const url = 'https://www.guidetnt.com' + itemDetailsURL
|
||||
try {
|
||||
const response = await axios.get(url)
|
||||
itemDetails = parseItemDetails(response.data)
|
||||
} catch (err) {
|
||||
console.error(`Erreur lors du fetch des détails pour l'item: ${url}`, err)
|
||||
}
|
||||
|
||||
const timeRange = parseTimeRange(itemDetails?.programHour, date.format('YYYY-MM-DD'))
|
||||
start = timeRange?.start
|
||||
stop = timeRange?.stop
|
||||
|
||||
subTitle = itemDetails?.subTitle
|
||||
if (title == subTitle) subTitle = null
|
||||
description = itemDetails?.description
|
||||
|
||||
const categoryDetails = parseCategoryText(itemDetails?.category)
|
||||
//duration = categoryDetails?.duration
|
||||
country = categoryDetails?.country
|
||||
productionDate = categoryDetails?.productionDate
|
||||
season = categoryDetails?.season
|
||||
episode = categoryDetails?.episode
|
||||
}
|
||||
// See https://www.npmjs.com/package/epg-parser for parameters
|
||||
programs.push({
|
||||
title,
|
||||
subTitle: subTitle,
|
||||
description: description,
|
||||
image: itemDetails?.image,
|
||||
category: category,
|
||||
directors: itemDetails?.directorActors?.Réalisateur,
|
||||
actors: itemDetails?.directorActors?.Acteur,
|
||||
country: country,
|
||||
date: productionDate,
|
||||
//duration: duration, // Tried with length: too, but does not work ! (stop-start is not accurate because of Ads)
|
||||
season: season,
|
||||
episode: episode,
|
||||
start,
|
||||
stop
|
||||
})
|
||||
}
|
||||
|
||||
return programs
|
||||
},
|
||||
async channels() {
|
||||
const response = await axios.get('https://www.guidetnt.com')
|
||||
const channels = []
|
||||
const $ = cheerio.load(response.data)
|
||||
|
||||
// Look inside each .tvlogo container
|
||||
$('.tvlogo').each((i, el) => {
|
||||
// Find all descendants that have an alt attribute
|
||||
$(el).find('[alt]').each((j, subEl) => {
|
||||
const alt = $(subEl).attr('alt')
|
||||
const href = $(subEl).attr('href')
|
||||
if (href && alt && alt.trim() !== '') {
|
||||
const name = alt.trim()
|
||||
const site_id = href.replace(/^\/tv\/programme-/, '')
|
||||
channels.push({
|
||||
lang: 'fr',
|
||||
name,
|
||||
site_id
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
return channels
|
||||
}
|
||||
}
|
||||
|
||||
function parseTimeRange(timeRange, baseDate) {
|
||||
// Split times
|
||||
const [startStr, endStr] = timeRange.split(' - ').map(s => s.trim())
|
||||
|
||||
// Parse with base date
|
||||
const start = dayjs(`${baseDate} ${startStr}`, 'YYYY-MM-DD HH:mm')
|
||||
let end = dayjs(`${baseDate} ${endStr}`, 'YYYY-MM-DD HH:mm')
|
||||
|
||||
// Handle possible day wrap (e.g., 23:30 - 00:15)
|
||||
if (end.isBefore(start)) {
|
||||
end = end.add(1, 'day')
|
||||
}
|
||||
|
||||
// Calculate duration in minutes
|
||||
const diffMinutes = end.diff(start, 'minute')
|
||||
|
||||
return {
|
||||
start: start.format(),
|
||||
stop: end.format(),
|
||||
duration: diffMinutes
|
||||
}
|
||||
}
|
||||
|
||||
function parseItemDetails(itemDetails) {
|
||||
const $ = cheerio.load(itemDetails)
|
||||
|
||||
const program = $('.program-wrapper').first()
|
||||
|
||||
const programHour = program.find('.program-hour').text().trim()
|
||||
const programTitle = program.find('.program-title').text().trim()
|
||||
const programElementBold = program.find('.program-element-bold').text().trim()
|
||||
const programArea1 = program.find('.program-element.program-area-1').text().trim()
|
||||
|
||||
let description = ''
|
||||
const programElements = $('.program-element').filter((i, el) => {
|
||||
const classAttr = $(el).attr('class')
|
||||
// Return true only if it is exactly "program-element" (no extra classes)
|
||||
return classAttr.trim() === 'program-element'
|
||||
})
|
||||
|
||||
programElements.each((i, el) => {
|
||||
description += $(el).text().trim()
|
||||
})
|
||||
|
||||
const area2Node = $('.program-area-2').first()
|
||||
const area2 = $(area2Node)
|
||||
const data = {}
|
||||
let currentLabel = null
|
||||
let texts = []
|
||||
|
||||
area2.contents().each((i, node) => {
|
||||
if (node.type === 'tag' && node.name === 'strong') {
|
||||
// If we had collected some text for the previous label, save it
|
||||
if (currentLabel && texts.length) {
|
||||
data[currentLabel] = texts.join('').trim().replace(/,\s*$/, '') // Remove trailing comma
|
||||
}
|
||||
// New label - get text without colon
|
||||
currentLabel = $(node).text().replace(/:$/, '').trim()
|
||||
texts = []
|
||||
} else if (currentLabel) {
|
||||
// Append the text content (text node or others)
|
||||
if (node.type === 'text') {
|
||||
texts.push(node.data)
|
||||
} else if (node.type === 'tag' && node.name !== 'strong' && node.name !== 'br') {
|
||||
texts.push($(node).text())
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// Save last label text
|
||||
if (currentLabel && texts.length) {
|
||||
data[currentLabel] = texts.join('').trim().replace(/,\s*$/, '')
|
||||
}
|
||||
|
||||
const imgSrc = program.find('div[style*="float:left"]')?.find('img')?.attr('src') || null
|
||||
|
||||
return {
|
||||
programHour,
|
||||
title: programTitle,
|
||||
subTitle: programElementBold,
|
||||
category: programArea1,
|
||||
description: description,
|
||||
directorActors: data,
|
||||
image: imgSrc
|
||||
}
|
||||
}
|
||||
|
||||
function parseCategoryText(text) {
|
||||
if (!text) return null
|
||||
|
||||
const parts = text.split(',').map(s => s.trim()).filter(Boolean)
|
||||
const len = parts.length
|
||||
|
||||
const category = parts[0] || null
|
||||
|
||||
if (len < 3) {
|
||||
return {
|
||||
category: category,
|
||||
duration: null,
|
||||
country: null,
|
||||
productionDate: null,
|
||||
season: null,
|
||||
episode: null
|
||||
}
|
||||
}
|
||||
|
||||
// Check last part: date if numeric
|
||||
const dateCandidate = parts[len - 1]
|
||||
const productionDate = /^\d{4}$/.test(dateCandidate) ? dateCandidate : null
|
||||
|
||||
// Check for duration (first part containing "minutes")
|
||||
let durationMinute = null
|
||||
//let duration = null
|
||||
let episode = null
|
||||
let season = null
|
||||
let durationIndex = -1
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (parts[i].toLowerCase().includes('minute')) {
|
||||
durationMinute = parts[i].trim()
|
||||
durationMinute = durationMinute.replace('minutes', '')
|
||||
durationMinute = durationMinute.replace('minute', '')
|
||||
//duration = [{ units: 'minutes', value: durationMinute }],
|
||||
durationIndex = i
|
||||
} else if (parts[i].toLowerCase().includes('épisode')) {
|
||||
const match = text.match(/épisode\s+(\d+)(?:\/(\d+))?/i)
|
||||
if (match) {
|
||||
episode = parseInt(match[1], 10)
|
||||
}
|
||||
} else if (parts[i].toLowerCase().includes('saison')) {
|
||||
season = parts[i].replace('saison', '').trim()
|
||||
}
|
||||
}
|
||||
|
||||
// Country: second to last
|
||||
const countryIndex = len - 2
|
||||
let country = (durationIndex === countryIndex) ? null : parts[countryIndex]
|
||||
|
||||
return {
|
||||
category,
|
||||
durationMinute,
|
||||
country,
|
||||
productionDate,
|
||||
season,
|
||||
episode
|
||||
}
|
||||
}
|
||||
|
||||
function parseTitle($item) {
|
||||
return $item('.channel-programs-title a').text().trim()
|
||||
}
|
||||
|
||||
function parseDescription($item) {
|
||||
return $item('#descr').text().trim() || null
|
||||
}
|
||||
|
||||
function parseDescriptionURL($item) {
|
||||
const descrLink = $item('#descr a')
|
||||
return descrLink.attr('href') || null
|
||||
}
|
||||
|
||||
function parseCategory($item) {
|
||||
let type = null
|
||||
$item('.channel-programs-title span').each((i, span) => {
|
||||
const className = $item(span).attr('class')
|
||||
if (className && className.startsWith('text_bg')) {
|
||||
type = $item(span).text().trim()
|
||||
}
|
||||
})
|
||||
return type
|
||||
}
|
||||
|
||||
function parseStart($item, itemDate) {
|
||||
const dt = $item('.channel-programs-time a').text().trim()
|
||||
if (!dt) return null
|
||||
|
||||
const datetimeStr = `${itemDate} ${dt}`
|
||||
return dayjs.tz(datetimeStr, 'YYYY-MM-DD HH:mm', PARIS_TZ)
|
||||
}
|
||||
|
||||
function parseItems(content) {
|
||||
const $ = cheerio.load(content)
|
||||
|
||||
// Extract header information
|
||||
const logoSrc = $('#logo img').attr('src')
|
||||
const title = $('#title h1').text().trim()
|
||||
const subtitle = $('#subtitle').text().trim()
|
||||
const dateMatch = subtitle.match(/(\d{1,2} \w+ \d{4})/)
|
||||
const dateStr = dateMatch ? dateMatch[1].toLowerCase() : null
|
||||
|
||||
// Parse the French date string
|
||||
const parsedDate = dayjs(dateStr, 'D MMMM YYYY', 'fr')
|
||||
// Format it as YYYY-MM-DD
|
||||
const formattedDate = parsedDate.format('YYYY-MM-DD')
|
||||
|
||||
const rows = $('.channel-row').toArray()
|
||||
|
||||
return {
|
||||
rows,
|
||||
logoSrc,
|
||||
title,
|
||||
formattedDate
|
||||
}
|
||||
}
|
||||
83
sites/guidetnt.com/guidetnt.com.test.js
Normal file
83
sites/guidetnt.com/guidetnt.com.test.js
Normal file
@@ -0,0 +1,83 @@
|
||||
const { parser, url } = require('./guidetnt.com.config.js')
|
||||
const fs = require('fs')
|
||||
const path = require('path')
|
||||
const dayjs = require('dayjs')
|
||||
const utc = require('dayjs/plugin/utc')
|
||||
const customParseFormat = require('dayjs/plugin/customParseFormat')
|
||||
const timezone = require('dayjs/plugin/timezone')
|
||||
require('dayjs/locale/fr')
|
||||
dayjs.extend(customParseFormat)
|
||||
dayjs.extend(utc)
|
||||
dayjs.extend(timezone)
|
||||
|
||||
const date = dayjs.utc('2025-07-01', 'YYYY-MM-DD').startOf('d')
|
||||
const channel = {
|
||||
site_id: 'tf1',
|
||||
xmltv_id: 'TF1.fr'
|
||||
}
|
||||
|
||||
it('can generate valid url', () => {
|
||||
expect(url({ channel })).toBe('https://www.guidetnt.com/tv/programme-tf1')
|
||||
})
|
||||
|
||||
it('can parse response', async () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
|
||||
let results = await parser({ content, date })
|
||||
results = results.map(p => {
|
||||
p.start = p.start.toJSON()
|
||||
p.stop = p.stop.toJSON()
|
||||
return p
|
||||
})
|
||||
|
||||
expect(results.length).toBe(29)
|
||||
expect(results[0]).toMatchObject({
|
||||
category: 'Série',
|
||||
description: 'Grande effervescence pour toute l\'équipe du Camping Paradis, qui prépare les Olympiades. Côté arrivants, Hélène et sa fille Eva viennent passer quelques jours dans le but d\'optimiser les révisions d\'E...',
|
||||
start: '2025-06-30T22:55:00.000Z',
|
||||
stop: '2025-06-30T23:45:00.000Z',
|
||||
title: 'Camping Paradis'
|
||||
})
|
||||
expect(results[2]).toMatchObject({
|
||||
category: 'Magazine',
|
||||
description: 'Retrouvez tous vos programmes de nuit.',
|
||||
start: '2025-07-01T00:55:00.000Z',
|
||||
stop: '2025-07-01T04:00:00.000Z',
|
||||
title: 'Programmes de la nuit'
|
||||
})
|
||||
expect(results[15]).toMatchObject({
|
||||
category: 'Téléfilm',
|
||||
description: 'La vie quasi parfaite de Riley bascule brutalement lorsqu\'un accident de voiture lui coûte la vie, laissant derrière elle sa famille. Alors que l\'enquête débute, l\'affaire prend une tournure étrange l...',
|
||||
start: '2025-07-01T12:25:00.000Z',
|
||||
stop: '2025-07-01T14:00:00.000Z',
|
||||
title: 'Trahie par l\'amour'
|
||||
})
|
||||
})
|
||||
|
||||
it('can parse response for current day', async () => {
|
||||
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.html'))
|
||||
let results = await parser({ content, date: dayjs.utc('2025-07-01', 'YYYY-MM-DD').startOf('d') })
|
||||
results = results.map(p => {
|
||||
p.start = p.start.toJSON()
|
||||
p.stop = p.stop.toJSON()
|
||||
return p
|
||||
}
|
||||
)
|
||||
|
||||
expect(results.length).toBe(29)
|
||||
expect(results[0]).toMatchObject({
|
||||
category: 'Série',
|
||||
description: 'Grande effervescence pour toute l\'équipe du Camping Paradis, qui prépare les Olympiades. Côté arrivants, Hélène et sa fille Eva viennent passer quelques jours dans le but d\'optimiser les révisions d\'E...',
|
||||
start: '2025-06-30T22:55:00.000Z',
|
||||
stop: '2025-06-30T23:45:00.000Z',
|
||||
title: 'Camping Paradis'
|
||||
})
|
||||
})
|
||||
|
||||
it('can handle empty guide', async () => {
|
||||
const results = await parser({
|
||||
date,
|
||||
content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.html'))
|
||||
})
|
||||
|
||||
expect(results).toEqual([])
|
||||
})
|
||||
21
sites/guidetnt.com/readme.md
Normal file
21
sites/guidetnt.com/readme.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# guidetnt.com
|
||||
|
||||
https://www.guidetnt.com/
|
||||
|
||||
### Download the guide
|
||||
|
||||
```sh
|
||||
npm run grab --- --site=guidetnt.com
|
||||
```
|
||||
|
||||
### Update channel list
|
||||
|
||||
```sh
|
||||
npm run channels:parse --- --config=./sites/guidetnt.com/guidetnt.com.config.js --output=./sites/guidetnt.com/guidetnt.com.channels.xml
|
||||
```
|
||||
|
||||
### Test
|
||||
|
||||
```sh
|
||||
npm test --- guidetnt.com
|
||||
```
|
||||
Reference in New Issue
Block a user