Ich glaube es ist so, wie du sagst Fredel. Die Änderung scheint Trivial zu sein.
Aus save.tv/STV/M/obj/cRecordOrder/croGetDownloadUrl.cfm?TelecastId=12651021&iFormat=1&bAdFree=false kann man ganz schnell den Request umbauen um die neue Streaming-URL-HTML-Seite zu erhalten.
- Zunächst wird nun save.tv/STV/M/obj/archive/VideoArchiveStreaming.cfm aufgerufen.
- Aus iFormat wird (bspw.) recordFormatId.
- bAdFree wird in AdFree umbenannt. Statt eines Boolean wird nun ein Integer angegeben.
Heraus kommt der neue Link: save.tv/STV/M/obj/archive/VideoArchiveStreaming.cfm?telecastId=12651021&recordFormatId=5&AdFree=1
Zurückgegeben wird anschließend eine HTML-Seite
Code: Alles auswählen
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if lt IE 9]> <html class="lt-ie9"> <![endif]-->
<!--[if gte IE 9]><!-->
<html class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<title>Save.TV - Ihr Online-Videorecorder in der Cloud</title>
<meta name="viewport" content="width=device-width">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="online-videorecorder, filme aufnehmen, serien aufnehmen, fernsehen online" />
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Handlee' rel='stylesheet' type='text/css' />
<link rel="stylesheet" href="/STV/IMG/global/skin/tvcloud/css/font-awesome.min.css">
<link rel="shortcut icon" href="/favicon.ico" type="icon/x-icon">
<!--[if IE 7]>
<link rel="stylesheet" href="css/font-awesome-ie7.min.css">
<![endif]-->
<link rel="stylesheet" href="/STV/IMG/global/skin/v4/css/vendor/font-awesome.min.css?2016070522">
<link rel="stylesheet" href="/stv/img/global/skin/v4/css/vendor/bootstrap/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="/STV/IMG/global/skin/tvcloud/css/style.css?1004" media="all" />
<link rel="stylesheet" type="text/css" href="/STV/IMG/global/skin/tvcloud/css/legacyStyle.css" media="all" />
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-21238495-7', 'auto');
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
</script>
</head>
<body id="body">
<div class="band header member">
<div class="band-innen">
<a href="/STV/M/obj/home/memberHome.cfm">
<img src="/STV/IMG/global/skin/tvcloud/img/save-tv.png" alt="Save.tv - Ihr Videorecorder in der Cloud" class="header-logo" />
</a>
<ul id="nav" class="member-nav ">
<li class="member-nav-li member-nav-programm ">
<a aria-haspopup="true" href="/STV/M/obj/TVProgCtr/tvctShow.cfm" class="member-nav-a member-nav-programm ">TV Programm</a>
<ul class="header-subnav">
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/home/memberHome.cfm">Startseite</a></li>
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/TVProgCtr/stations.cfm">Programmübersicht</a></li>
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/TVProgCtr/tvctShow.cfm">Highlights</a></li>
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/TVProgCtr/TvProgrammJetzt.cfm">Jetzt</a></li>
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/TVProgCtr/TvProgrammGleich.cfm">Gleich</a></li>
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/TVProgCtr/TvProgramm2015.cfm">20:15 Uhr</a></li>
<li class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/TVProgCtr/TvProgramm2215.cfm">22:15 Uhr</a></li>
</ul>
</li><li class="member-nav-li member-nav-stardb ">
<a href="/STV/M/obj/starletCTR/starDb.cfm" class="member-nav-a member-nav-stardb">Star-Datenbank</a>
</li><li class="member-nav-li member-nav-channels ">
<a href="/STV/M/obj/channels/MeineChannels.cfm" class="member-nav-a member-nav-channels">Meine Channels</a>
</li><li class="member-nav-li member-nav-archiv member-nav-hier">
<a href="/STV/M/obj/archive/VideoArchive.cfm" class="member-nav-a member-nav-archiv">Mein Videoarchiv</a>
</li><li class="member-nav-li member-nav-account ">
<a href="/STV/M/obj/user/config/AccountEinstellungen.cfm" class="member-nav-a member-nav-account">Mein Account </a>
<ul class="header-subnav">
<li class="header-subnav-h">[HIER stünde der Name des STV-Acc-Inhabers]</li>
<li>
<b style="font-size:12px">893 Sendungen im Archiv</b>
<br/>
<b style="font-size:12px">unbegrenzte Aufnahmekapazität</b>
</li>
<li><hr style="border-top:1px dashed #5d616a;margin:5px 0px"></li>
<li style="text-align:left; margin-top:3px" class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/user/config/AccountEinstellungen.cfm?iActiveMenu=0"><div>Aufnahme-Optionen</div></a></li>
<li style="text-align:left;margin-top:3px" class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/user/config/AccountEinstellungen.cfm?iActiveMenu=1"><div>Account-Daten</div></a></li>
<li style="text-align:left;margin-top:3px" class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/user/config/AccountEinstellungen.cfm?iActiveMenu=2"><div>Login-Einstellungen</div></a></li>
<li style="text-align:left;margin-top:3px" class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/user/config/AccountEinstellungen.cfm?iActiveMenu=4"><div>Korrespondenz</div></a></li>
<li style="text-align:left;margin-top:3px" class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/user/config/AccountEinstellungen.cfm?iActiveMenu=5"><div>Rechnungen</div></a></li>
<li><hr style="border-top:1px dashed #5d616a;margin:5px 0px"></li>
<li style="text-align:center" id="stv-logout-click" class="header-subnav-h"><a class="header-subnav-a" href="/STV/M/obj/user/usLogout.cfm"><div>Logout</div></a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="band inhalt">
<div class="band-innen">
<h1>Streaming - Coco, der neugierige Affe</h1>
<p>
<img style="vertical-align: bottom" alt="" src="//cdn.save.tv/images/tvstations/40x21/26.png" />
| Sonntag, 03.07.2016
| 06:00 - 06:20
| Die Feuerwehrprüfung / Toots und die Keimetten
</p>
<div id="spinner-target"></div>
</div>
<div style="margin: auto; width: 1024px; min-heigth: 576px">
<div id="SaveTVVideo"></div>
<script type="text/javascript">
</script>
</div>
</div>
<footer class="footerNew" style="">
<div class="container">
<div class="row ">
<article class="col-lg-3 col-md-3 col-sm-6 col-xs-12 col-md-offset-1">
<h4>Serien-Highlights</h4>
<div class="stv-footer-links">
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12655826" title="Diagnose: Mord">Diagnose: Mord</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12646533" title="Immer wieder Jim">Immer wieder Jim</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12616215" title="Rules of Engagement">Rules of Engagement</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12636498" title="Tatort">Tatort</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12665626" title="Familie Heinz Becker">Familie Heinz Becker</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12668635" title="Coupling - Wer mit wem">Coupling - Wer mit wem</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12655167" title="Napoleon">Napoleon</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12662473" title="Storage Wars - Die Geschäftemacher">Storage Wars - Die Geschäftemacher</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12657262" title="Supergirl">Supergirl</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12657751" title="Without A Trace - Spurlos verschwunden">Without A Trace - Spurlos versc...</a>
</div>
</article>
<article class="col-lg-3 col-md-3 col-sm-6 col-xs-12">
<h4>Film-Highlights</h4>
<div class="stv-footer-links">
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12648365" title="Deadlock">Deadlock</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12806899" title="Nichts zu verzollen">Nichts zu verzollen</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12731459" title="Hostage - Entführt">Hostage - Entführt</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12654927" title="Vier Hochzeiten und ein Todesfall">Vier Hochzeiten und ein Todesfall</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12633212" title="Marnie">Marnie</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12638279" title="Ein Sommer voller Türen">Ein Sommer voller Türen</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12637808" title="Die Brücke am Ibar">Die Brücke am Ibar</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12652761" title="Last Hitman">Last Hitman</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12656989" title="Mankells Wallander - Der Scharfschütze">Mankells Wallander - Der Scharf...</a>
<a href="/stv/M/obj/TC/SendungsDetails.cfm?TelecastId=12648366" title="Supermarkt">Supermarkt</a>
</div>
</article>
<article class="col-lg-4 col-md-4 col-sm-6 col-xs-12 ">
<h4>Save.TV</h4>
<div class="stv-footer-links stv-inline stv-margin-right">
<a href="/stv/s/misc/about.cfm">Über Save.TV</a>
<a href="/stv/s/misc/testwinner.cfm">Testsieger</a>
<a href="/stv/m/misc/support/miscSupportFormHelp.cfm">Support/Kontakt</a>
<a href="/stv/s/misc/support/miscSupport.cfm">FAQ</a>
<a href="/stv/s/misc/Apps.cfm">Apps</a>
<a href="/stv/s/misc/chromecast.cfm">Chromecast</a>
<a href="/stv/s/misc/tutorial.cfm">Tutorials</a>
</div>
<div class="stv-footer-links stv-inline ">
<a href="/stv/s/misc/miscshowaffiliate.cfm/">Partnerprogramm</a>
<a href="/stv/s/misc/support/miscContactPress.cfm">Presse</a>
<a href="/stv/s/misc/terms.cfm">AGB</a>
<a href="/stv/s/misc/youthprotection.cfm">Jugendschutz</a>
<a href="/stv/s/misc/policy.cfm">Datenschutz</a>
<a href="/stv/s/misc/impressum.cfm">Impressum</a>
</div>
<div class="stv-follow">
<h4>FOLGE UNS AUF</h4>
<a href="https://www.facebook.com/savetv" class="fa-stack fa-lg">
<i class="fa fa-circle text-primary fa-stack-2x"></i>
<i class="fa fa-facebook fa-stack-1x fa-inverse"></i>
</a>
<a href="https://twitter.com/savetv" class="fa-stack fa-lg">
<i class="fa fa-circle text-info fa-stack-2x"></i>
<i class="fa fa-twitter fa-stack-1x fa-inverse"></i>
</a>
<a href="https://www.youtube.com/channel/UCYrZXBen93QYojiBSsCLMJg" class="fa-stack fa-lg">
<i class="fa fa-circle text-info fa-stack-2x" style="color: red"></i>
<i class="fa fa-youtube fa-stack-1x fa-inverse"></i>
</a>
</div>
</article>
</div>
</div>
<div class="stv-bottom-footer">
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-3 col-sm-6 col-xs-12 col-md-offset-1">
<p class="text-muted">© Copyright 2016 Save.TV</p>
</div>
</div>
</div>
</div>
</footer>
<script src="/stv/img/global/skin/v4/js/dest/member-epg.min.js?2016070522"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#stv-logout-click').click(function(){
ga('send', 'event', 'Logout', 'Logout', '');
});
$('#stv-ma-series-highlights-click').click(function(){
ga('send', 'event', 'MA_Account', 'Serienhighlights', 'TelecastID 11522757');
});
});
</script>
<script type="text/javascript" src="/STV/IMG/global/skin/v4/js/vendor/jquery.scoped.js?2016070522"></script>
<script src="/STV/IMG/global/skin/tvcloud/js/spin.min.js?20140206"></script>
<script type="text/javascript" src="//cdn.save.tv/apps/jwplayer/7.4.4/jwplayer.js" ></script>
<script type="text/javascript">jwplayer.key="46EfkdA/XFj8GTI1Gn3gH5Ztma4nXRSxTAfzzA==";</script>
<script type="text/javascript" src="/STV/M/obj/archive/knockout/VideoArchiveStreaming.js?2016070522"></script>
<script type="text/javascript">
SaveTvPlayerModule.width = 1024;
SaveTvPlayerModule.height = 576;
SaveTvPlayerModule.loadVideo(12651021, 5, 1);
</script>
<script type="text/javascript">
$(document).ready(function() {
$('#nav li:has(ul)' ).doubleTapToGo();
$('#epgNav li:has(ul)').doubleTapToGo();
$('.sendung a').doubleTapToGo();
});
</script>
<script type="text/javascript">
/* <![CDATA[ */
var google_conversion_id = 1015465541;
var google_conversion_label = "phxICJub1wQQxYyb5AM";
var google_custom_params = window.google_tag_params;
var google_remarketing_only = true;
/* ]]> */
</script>
<script type="text/javascript" src="https://www.googleadservices.com/pagead/conversion.js"></script>
<noscript>
<div style="display:inline;">
<img height="1" width="1" style="border-style:none;" alt="" src="https://googleads.g.doubleclick.net/pagead/viewthroughconversion/1015465541/?value=0&label=phxICJub1wQQxYyb5AM&guid=ON&script=0"/>
</div>
</noscript>
</body>
</html>
Wichtig ist darin nur eine Zeile:
<script type="text/javascript" src="/STV/M/obj/archive/knockout/VideoArchiveStreaming.js?2016070522"></script>
Diese JavaScript-Datei bringt dann die neuen Features mit sich und sieht dann wie folgt aus:
Code: Alles auswählen
SaveTvPlayerModule = {
spinner : new Spinner(
{
lines: 17, // The number of lines to draw
length: 20, // The length of each line
width: 10, // The line thickness
radius: 60, // The radius of the inner circle
corners: 1, // Corner roundness (0..1)
rotate: 16, // The rotation offset
direction: 1, // 1: clockwise, -1: counterclockwise
color: '##000', // ##rgb or ##rrggbb or array of colors
speed: 0.5, // Rounds per second
trail: 100, // Afterglow percentage
shadow: false, // Whether to render a shadow
hwaccel: true, // Whether to use hardware acceleration
className: 'spinner', // The CSS class to assign to the spinner
zIndex: 2e9, // The z-index (defaults to 2000000000)
top: 'auto', // Top position relative to parent in px
left: 'auto' // Left position relative to parent in px
}),
telecastId : 0,
adFree : false,
resumePosition : 0,
width: 0,
height: 0,
isFirstStart : true,
videoPlayer : null,
loadVideo : function(telecastId, recordFormat, adFree) {
$('#spinner-target').append(this.spinner.el);
this.telecastId = telecastId;
this.adFree = adFree;
$.ajax({
url : "/STV/M/obj/cRecordOrder/croGetDownloadUrl2.cfm?TelecastId=" + telecastId + "&iFormat="+ recordFormat + "&bAdFree=" + adFree,
datatype : "json"
}).done(function(rawData) {
var result = jQuery.parseJSON(rawData);
if(result.SUCCESS)
{
var url = result.STREAMINGURL;
SaveTvPlayerModule.resumePosition = result.RESUMEPOSITION;
SaveTvPlayerModule.loadJwPlayer(url);
}
else {
alert(result.ERROR)
}
SaveTvPlayerModule.spinner.stop()
}).fail(function(){
$("#SaveTVVideo").html("Fehler beim Laden des Streams");
SaveTvPlayerModule.spinner.stop();
});;
},
loadJwPlayer : function(url) {
jwplayer("SaveTVVideo").setup({
file : url,
type : "mp4",
width : SaveTvPlayerModule.width,
height : SaveTvPlayerModule.height,
logo: {
file: "/STV/IMG/global/jwplayer-v6.12/logo-stv-chromecast-player.png",
hide: true
},
primary : "html5",
visualplaylist : false,
preload : "none",
analytics: {
cookies: false,
enabled : false
},
cast:{
appid: "B8F1BD72",
logo: "/STV/IMG/global/jwplayer-v6.12/logo-stv-chromecast-player.png"
}
});
SaveTvPlayerModule.videoPlayer = jwplayer("SaveTVVideo");
SaveTvPlayerModule.videoPlayer.on('beforePlay', SaveTvPlayerModule.onBeforePlay);
SaveTvPlayerModule.videoPlayer.on('complete', SaveTvPlayerModule.onComplete);
SaveTvPlayerModule.videoPlayer.on('pause', SaveTvPlayerModule.onPause);
SaveTvPlayerModule.videoPlayer.on('seek', SaveTvPlayerModule.onSeek);
SaveTvPlayerModule.videoPlayer.on('time', SaveTvPlayerModule.onTime);
window.addEventListener('beforeunload', SaveTvPlayerModule.onBeforeUnload);
},
onBeforeUnload : function() {
SaveTvPlayerModule.setResumePosition({ async : false});
},
onBeforePlay : function() {
if (SaveTvPlayerModule.isFirstStart) {
SaveTvPlayerModule.videoPlayer.seek(SaveTvPlayerModule.resumePosition);
SaveTvPlayerModule.isFirstStart = false;
}
},
onComplete : function() {
SaveTvPlayerModule.clearResumePosition();
},
onPause : function() {
SaveTvPlayerModule.setResumePosition();
},
onSeek : function(args) {
if (SaveTvPlayerModule.isFirstStart) {
return;
}
SaveTvPlayerModule.setResumePosition({ position : args.offset });
},
onTime : function(args) {
var position = Math.floor(args.position);
if (position % 120 != 0) {
return;
}
SaveTvPlayerModule.setResumePosition({ position : position });
},
clearResumePosition : function() {
SaveTvPlayerModule.setResumePosition({ position : 0 });
},
setResumePosition : function(options){
options = options || {};
var position = Math.floor(options.position || SaveTvPlayerModule.videoPlayer.getPosition());
var duration = Math.floor(SaveTvPlayerModule.videoPlayer.getDuration());
if (typeof position == 'undefined' || typeof duration == 'undefined' || isNaN(position) || isNaN(duration)) {
return;
}
if (position == SaveTvPlayerModule.resumePosition){
return
}
if (position > 0 && position < duration) {
SaveTvPlayerModule.resumePosition = position;
$.ajax({
url : "/STV/M/obj/cRecordOrder/croSetResumePosition.cfm?telecastId=" + SaveTvPlayerModule.telecastId + "&adFree=" + SaveTvPlayerModule.adFree + "&position=" + position,
method : "POST",
async : options.async !== false
});
} else {
SaveTvPlayerModule.resumePosition = 0;
$.ajax({
url : "/STV/M/obj/cRecordOrder/croDeleteResumePosition.cfm?telecastId=" + SaveTvPlayerModule.telecastId+ "&adFree=" + SaveTvPlayerModule.adFree + "&position=" + position,
method : "POST",
async : options.async !== false
});
}
}
}
Darin findet sich eine verräterische Zeile:
url : "/STV/M/obj/cRecordOrder/croGetDownloadUrl2.cfm?TelecastId=" + telecastId + "&iFormat="+ recordFormat + "&bAdFree=" + adFree
Diese klärt uns darüber auf, dass wird die ganzen neuen Parameter einfach mal in andere GET-Variablen stecken müssen. Also pressen wir alles wieder in die alten Variablen (wohlgemerkt haben sich aber Datentypen geändert im Vergleich zur alten Version!)
Wir erhalten: /STV/M/obj/cRecordOrder/croGetDownloadUrl2.cfm?TelecastId=12651021&iFormat=5&bAdFree=1
Die Magie endet hier:
Code: Alles auswählen
{"DOWNLOADURL":"http:\/\/csa04.save.tv\/458615_12651021_22896fc725e7c75c4360007e0e0b07c2_1\/?m=dl","SUCCESS":true,"STREAMINGURL":"http:\/\/csa04.save.tv\/458615_12651021_22896fc725e7c75c4360007e0e0b07c2_1\/?m=view","RESUMEPOSITION":480.0,"TELECASTID":1.2651021E7}
Abrakadabra Simsalabim wir haben unsere Download-URL.
=====================================================================
Zusammenfassung
Statt /STV/M/obj/cRecordOrder/croGetDownloadUrl.cfm heißt es nun /STV/M/obj/cRecordOrder/croGetDownloadUrl2.cfm
Der Parameter iFormat erhält andere Werte und bAdFree wird zu einem Integer.
Specs
GET save.tv/STV/M/obj/cRecordOrder/croGetDownloadUrl2.cfm?TelecastId=[TELECASTID]&iFormat=[FORMAT]&bAdFree=[AD]
Cookie: SNUUID=***[LOGIN-COOKIE]***
[TELECASTID]: Integer - die TelecastID der Sendung
[FORMAT]: Integer [4 => Mobile, 5 => HQ, 6 => HD]
[AD]: Integer [0 => mit Werbung, 1 => ohne Werbung]