首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 11播客应用程序以大约20秒的时间启动播客

iOS 11播客应用程序以大约20秒的时间启动播客
EN

Stack Overflow用户
提问于 2018-04-20 16:38:04
回答 1查看 201关注 0票数 3

我的客户的所有播客都是在iTunes应用程序iOS 11更新后的20到4秒左右开始播客的。iOS 10播放机不显示此问题。没有其他玩家知道这个问题,一旦情节重新开始,它就会在没有问题的情况下播放到最后。在任何一集中,重启都保持在相同的位置,但我怀疑它发生在更长的情节中,就好像它在持续时间的某个百分比上一样。

FF和RW功能,包括拖动游戏头所有的工作。

iTunes播客应用程序可以重新启动该应用程序是否允许下载该插曲文件。

几周来,在苹果的支持下,我们一直没有成功,我想我也会在这里摆这样的姿势。

苹果支持已经检查了mp3文件和RSS提要,没有发现任何问题。

代码语言:javascript
复制
<enclosure url="http://example.com/audio/episodes/2018_04_18_1458_some-show.mp3" length="63773956" type="audio/mpeg"/>
<pubDate>Wed, 18 Apr 2018 00:00:00 -0500</pubDate>
<itunes:duration>1:06:25</itunes:duration>

客户端通过生存和死亡,因此我们使用htaccess中的MP3s来路由入站请求,如下所示

RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com [NC] RewriteRule ^audio/episodes/([^/\.]+).mp3$ /audio/episodes/google_analytics_mp3.php?mp3=$1&redirected=1 [L,QSA]

测试表明,当路由被移除时,在以前未播放的片段中看不到问题。以前播放过的剧集继续显示出这个问题。

google_analytics_mp3.php:

代码语言:javascript
复制
<?php
    include_once($_SERVER['DOCUMENT_ROOT']."/classDBI/classDBI.php");
    include_once($_SERVER['DOCUMENT_ROOT']."/classDBI/google_analytics_api.php");   
    $e = new Episode;

    if (is_numeric($_REQUEST['mp3'])) {
        $id = intval($_REQUEST['mp3']);
        list($ep) = $e->retrieve("id = $id");   
        if ($ep) { 
            $outcome = ga_send_pageview(basename($ep->audio_link), 'Site streaming: ' . $ep->google_title()); 
        }
    } else if ($_REQUEST['redirected'] == 1) {
        $fileName = $_GET['mp3'] . '.mp3';
        $fileLocation = $_SERVER['DOCUMENT_ROOT'].'/audio/episodes/'.$fileName;
        $etag = md5_file($fileName);
        $fileRedirect = '/audio/episodes/'.$fileName;

        if (file_exists($fileLocation)) {
            list($ep) = $e->retrieve("audio_link = 'audio/episodes/$fileName'");
            $pageName = 'Direct access';
            if ($ep) {
                $pageName .= ': ' . $ep->google_title();
            }

            $size  = filesize($fileLocation);
            $time  = date('r', filemtime($fileLocation));

            $fm = @fopen($fileLocation, 'rb');
            if (!$fm) {
                header ("HTTP/1.1 505 Internal server error");
                return;
            }

            $begin  = 0;
            $end  = $size - 1;

            if (isset($_SERVER['HTTP_RANGE'])) {
                if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
                    $begin  = intval($matches[1]);
                    if (!empty($matches[2])) {
                      $end  = intval($matches[2]);
                    }
                }
            }
            if (isset($_SERVER['HTTP_RANGE'])) {
                header('HTTP/1.1 206 Partial Content');
                if ($begin == 0) {
                    $outcome = ga_send_pageview($fileName, 'Streaming: ' . $pageName); 
                }
            } else{
                header('HTTP/1.1 200 OK');
                $outcome = ga_send_pageview($fileName, $pageName);
            }


            header("Content-Transfer-Encoding: binary"); 
            header('Content-Type: audio/mpeg');
            header("Etag: $etag"); 
            header('Cache-Control: public, must-revalidate, max-age=0');
            header('Pragma: no-cache');         
            header('Accept-Ranges: bytes');
            header('Content-Length:' . (($end - $begin) + 1));
            header('Content-Disposition: inline; filename="'.$fileName.'"');
            //  2018.01.14 changes
            if (isset($_SERVER['HTTP_RANGE'])) {
                header("Content-Range: bytes $begin-$end/$size");
            }
            // END 2018.01.14 changes

            readfile($fileLocation);
            header("Last-Modified: $time");

            $cur  = $begin;
            fseek($fm, $begin, 0);

            while(!feof($fm) && $cur <= $end && (connection_status() == 0)) {
                print fread($fm, min(1024 * 16, ($end - $cur) + 1));
                $cur += 1024 * 16;
            }

            exit();
        }
    }

我很确定我处理头的方式是导致重新启动问题,但是我找不到错误。

以下是Chrome面板中对mp3请求的标题。IP地址更改为文件名:

代码语言:javascript
复制
General

Request URL: http://example.com/audio/episodes/2018_04_18_1458_some-show.mp3
Request Method: GET
Status Code: 200 OK
Remote Address: 205.196.xxx.xxx:80
Referrer Policy: no-referrer-when-downgrade

Response Headers

Accept-Ranges: bytes
Cache-Control: public, must-revalidate, max-age=0
Connection: Keep-Alive
Content-Disposition: inline; filename="2018_04_18_1458_some-show.mp3"
Content-Length: 63773956
Content-Transfer-Encoding: binary
Content-Type: audio/mpeg
Date: Fri, 20 Apr 2018 16:27:57 GMT
Etag: 7fe7b0375cd99ec4d928b1a8885bee81
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=2, max=100
Pragma: no-cache
Server: Apache

Request Headers

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: PHPSESSID=TYDy9IZXJwTCBlmXVmkHn0; _ga=GA1.2.904913110.1515511103; _gid=GA1.2.666994959.1523989189; __unam=739f578-160db803df3-1cf2ee83-70
Host: www.example.com
Pragma: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36

如果它有帮助的话,这里是google_analytics_api.php:

代码语言:javascript
复制
<?php
define('GOOGLEACCOUNT', 'UA-xxxxxxxx-1');
define('GOOGLEDOMAIN', $_SERVER['HTTP_HOST']);

function gaParseCookie() {
    if (isset($_COOKIE['_ga'])) {
        list($version, $domainDepth, $cid1, $cid2) = explode('.', $_COOKIE["_ga"], 4);
        $contents = array('version' => $version, 'domainDepth' => $domainDepth, 'cid' => $cid1 . '.' . $cid2);
        $cid = $contents['cid'];
    } else {
        $cid = gaGenerateUUID();
    }
    return $cid;
}


function gaGenerateUUID() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        mt_rand(0, 0xffff),
        mt_rand(0, 0x0fff) | 0x4000,
        mt_rand(0, 0x3fff) | 0x8000,
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}

function gaSendData($data) {
    $getString = 'https://ssl.google-analytics.com/collect';
    $getString .= '?payload_data&';
    $getString .= http_build_query($data);
    $options = array(
        CURLOPT_CUSTOMREQUEST  =>"GET",
        CURLOPT_POST           =>false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_ENCODING       => "",
        CURLOPT_CONNECTTIMEOUT => 120,
        CURLOPT_TIMEOUT        => 120,
        CURLOPT_MAXREDIRS      => 10,
    );

    $ch      = curl_init( $getString );
    curl_setopt_array( $ch, $options );
    $result = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    if ($err) {
        mail('email@example.com', 'Analytics MP3 Error' . __FILE__, "$err\n\n$errmsg\n\n$header");  
    }
    curl_close( $ch );
    return $result;
}


function ga_send_pageview($file, $title) {
    $data = array(
        'v' => 1,
        'tid' => GOOGLEACCOUNT, 
        'cid' => gaParseCookie(),
        't' => 'pageview',
        'dh' => GOOGLEDOMAIN, 
        'dp' => $file, 
        'dt' => $title 
    );
    if(strlen($_SERVER['HTTP_REFERER'])) {
        $data['utmr'] = $_SERVER['HTTP_REFERER'];
    } 
    if (strlen($_SERVER['HTTP_USER_AGENT'])) {
        $data['ua'] = $_SERVER['HTTP_USER_AGENT'];
    }
    gaSendData($data);
}


function ga_send_event($category=null, $action=null, $label=null) {
    $data = array(
        'v' => 1,
        'tid' => GOOGLEACCOUNT, 
        'cid' => gaParseCookie(),
        't' => 'event',
        'ec' => $category, //Category (Required)
        'ea' => $action, //Action (Required)
        'el' => $label 
    );
    gaSendData($data);
}

任何建议都是最感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-26 17:32:18

问题是,这个播客应用程序似乎已经将最初请求的HTTP_RANGE末尾发送的内容更改为1,如下所示:

代码语言:javascript
复制
[HTTP_RANGE] => bytes=0-1

这段代码是解析头的。

代码语言:javascript
复制
if (isset($_SERVER['HTTP_RANGE'])) {
            if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
                $begin  = intval($matches[1]);
                if (!empty($matches[2])) {
                  $end  = intval($matches[2]);
                }
            }
        }

生成的出站内容范围标头看起来类似于0-1/59829252。

这将导致立即第二次请求重新启动播客。

用$size - 1代替1的结束值来修正.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49946161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档