Mu目标是创建一个函数,给定一个url和一个文件路径,将下载或缓冲25 MB的视频文件(在本例中来自TiVo),然后在播放器中启动视频并继续下载其余部分视频播放时的视频。
我发现代码here很有用,而且似乎是一个好的开始。这是我的第一个Python项目,所以这是一个学习过程。这是我到目前为止的代码:
import os
import sys
import logging
import requests as REQ
from requests.auth import HTTPDigestAuth;
import datetime as DT
try:
import cElementTree as ET
except ImportError:
try:
import xml.etree.cElementTree as ET
except ImportError:
exit_err("Failed to import cElementTree from any known place");
# Functions
def fetchSelection(url, fp):
print('Requesting ' + url + '...');
r = REQ.get(url, auth=HTTPDigestAuth('tivo', mak), verify=False, stream=True);
print('Fetching your selection...');
if r.status_code == REQ.codes.ok:
print('HTTP Request sent, awaiting response... 200 OK');
print('Buffering...');
else:
print('HTTP Request sent, awaiting response... ' + str(r.status_code));
print(r.raise_for_status());
return;
video_file_size_start = 0;
video_file_size_end = 1048576 * cacheSize; # end in CacheSize in MB
block_size = 1024;
with open(fp, 'wb') as fd:
for chunk in r.iter_content(block_size):
video_file_size_start += len(chunk);
if video_file_size_start > video_file_size_end:
break;
fd.write(chunk);
print(str(video_file_size_start/1024/1024) + ' MB / ' + str(video_file_size_end/1024/1024) + ' MB');
fd.close();
return;
以下是此代码的使用方法:
filePath = downloadPath + details[6] + '.tivo';
fetchSelection(nUrl + '&Format=' + videoFormat, filePath);
print('Launching player...');
playerCommand = 'tivodecode -m ' + mak + ' ' + filePath + ' | ';
playerCommand += 'mplayer -vf pp=lb - cache 32768 -';
os.system(playerCommand);
nType = 0;
当我运行我的脚本时,我得到以下输出:
Requesting http://192.168.1.102:80/download/Adventure%20Time.TiVo?Container=%2FNowPlaying&id=653115&Format=video/x-tivo-mpeg...
Fetching your selection...
HTTP Request sent, awaiting response... 503
Traceback (most recent call last):
File "test_read_nowPlaying2.py", line 186, in <module>
fetchSelection(details[1] + '&Format=' + videoFormat, filePath);
File "test_read_nowPlaying2.py", line 128, in fetchSelection
print(r.raise_for_status());
File "/usr/local/lib/python2.7/dist-packages/requests/models.py", line 765, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 503 Server Error: Server Busy
编辑:我弄清楚为什么我得到503响应,我没有调用正确的文件。我不得不要求video/x-tivo-mpeg-ts
的视频格式。
这是一项正在进行的工作,我不确定如何继续。我也不知道如何在播放器播放时继续下载。
答案 0 :(得分:0)
我想我找到了我需要的解决方案,它来自另一个SO帖子:python wmv stream download
import os
import sys
import subprocess
from subprocess import Popen, PIPE
import logging
import requests as REQ
from requests.auth import HTTPDigestAuth;
import datetime as DT
try:
import cElementTree as ET
except ImportError:
try:
# Python 2.5 need to import a different module
import xml.etree.cElementTree as ET
except ImportError:
exit_err("Failed to import cElementTree from any known place");
from progressbar import ProgressBar, SimpleProgress
# Functions
def bufferSelection(itemUrl, fp):
print('Fetching ' + itemUrl + '...');
video_file_size_start = 0;
video_file_size_buffer = 1048576 * cacheSize; # end in CacheSize in MB
video_file_size_end = 0;
block_size = 1024;
r = REQ.get(itemUrl, auth=HTTPDigestAuth('tivo', mak), verify=False, stream=True);
if r.status_code == REQ.codes.ok:
print('HTTP Request sent, awaiting response... 200 OK');
if r.headers['tivo-estimated-length'] != None:
video_file_size_end = (int(r.headers['tivo-estimated-length'])/1024)/1024;
print('Downloading {} MB...'.format(video_file_size_end));
else:
print('HTTP Request sent, awaiting response... ' + str(r.status_code));
print(r.raise_for_status());
return;
with open(fp+'.tivo', 'wb') as fd:
pbar = ProgressBar(widgets=['Downloading: ', SimpleProgress(), ' MB'], maxval=video_file_size_end).start();
subProcessChild = None;
for chunk in r.iter_content(block_size):
if not chunk:
fd.close();
break;
video_file_size_start += len(chunk);
if video_file_size_start == video_file_size_buffer:
child = subprocess.Popen('tivodecode -m ' + mak + ' \"' + fp + '.tivo\" | vlc --file-caching=2048 -');
subProcessChild = child.poll();
fd.write(chunk);
pbar.update((video_file_size_start/1024)/1024);
if subProcessChild is not None:
fd.close();
os.remove(fp);
break;
pbar.finish();
print('Download complete. Running decode: \"tivodecode -m ' + mak + ' \"' + fp + '.tivo\" | vlc -vvv --file-caching=2048 -');
child = subprocess.Popen('tivodecode -m ' + mak + ' \"' + fp + '.tivo\" | vlc -vvv --file-caching=2048 -', shell=True);
return;
def fetchSelection(url, fp):
playerCommand = 'curl --anyauth --globaloff --user tivo:' + mak + ' --insecure --url \"' + url + '\" | ';
playerCommand += 'tivodecode -m ' + mak + ' --out ' + fp + '.mpg - | ';
playerCommand += 'vlc --file-caching=2048 -';
print('Fetching ' + url + '...');
subprocess.Popen(playerCommand, stdout=sub.PIPE);
def resumeDownload(url, fp):
video_file_size_start = chacheSize;
block_size = 1024;
video_file_size_current = 0;
with open(fp, "a") as fd:
for chunk in r.iter_content(block_size):
video_file_size_current += len(chunk);
if video_file_size_current >= video_file_size_start:
fd.write(chunk);
fd.close();
return;