🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3082閲覧

Python3のhttp.serverを使って、Podcastエピソードのダウンロードがしたい

Akihiro_py

総合スコア55

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/20 06:37

編集2019/09/20 06:45

【前提・実現したいこと】

プログラム初心者で、Python3のみ使っています。

今回、Python3のhttp.server機能を使って、iPhone8のPodcastアプリ(Apple製)にラズパイ上にあるmp4動画をダウンロードさせようとしています。
(家庭内LANを使用、ユーザは1~2人、同時アクセス無し、家の編集ビデオをPodcastへ登録する目的)
(cgiを使ってrssを生成、Podcastへ番組登録までは実施済み)

Podcast上で入手可能なエピソードからダウンロード指示までできるのですが、そこからダウンロードが進まない状態です。

【質問内容】

ダウンロードが進まない理由を知りたいと思っています。
・そもそもCGIHTTPRequestHandlerにファイルをダウンロードする機能が無いのが理由でしょうか?
・もし原因を調べる場合、どのような方法があるでしょうか?

【環境】

サーバー側:192.168.11.9
Raspberry Pi3 Model B(Raspbian Jessie)
Python 3.5.3

端末側:192.168.11.7
iPhone8(ios12.4.1)
Podcast(Apple製)

【エラーメッセージとその説明】

Podcastからダウンロード指示をするとHEADのログが表示
それ以降はだんまり状態
次のGET以降のログは、Podcastでダウンロード中止したら表示される

Python3のコンソールに出てくるログ

serving at port 8080 192.168.11.7 - - [19/Sep/2019 22:27:17] "HEAD /podcast/test01.mp4 HTTP/1.1" 200 - 192.168.11.7 - - [19/Sep/2019 22:28:20] "GET /podcast/test01.mp4 HTTP/1.1" 200 - ---------------------------------------- Exception happened during processing of request from ('192.168.11.7', 55307) Traceback (most recent call last): File "/usr/lib/python3.5/socketserver.py", line 313, in _handle_request_noblock self.process_request(request, client_address) File "/usr/lib/python3.5/socketserver.py", line 341, in process_request self.finish_request(request, client_address) File "/usr/lib/python3.5/socketserver.py", line 354, in finish_request self.RequestHandlerClass(request, client_address, self) File "/usr/lib/python3.5/socketserver.py", line 681, in __init__ self.handle() File "/usr/lib/python3.5/http/server.py", line 422, in handle self.handle_one_request() File "/usr/lib/python3.5/http/server.py", line 410, in handle_one_request method() File "/usr/lib/python3.5/http/server.py", line 648, in do_GET self.copyfile(f, self.wfile) File "/usr/lib/python3.5/http/server.py", line 809, in copyfile shutil.copyfileobj(source, outputfile) File "/usr/lib/python3.5/shutil.py", line 82, in copyfileobj fdst.write(buf) File "/usr/lib/python3.5/socket.py", line 594, in write return self._sock.send(b) BrokenPipeError: [Errno 32] Broken pipe ----------------------------------------

【該当のソースコード】

┳art-work(今回は関係なし)
┣CSS(今回は関係なし)
┣cgi-bin(今回は関係なし)
┣podcast━movie.rss, test01.mp4, test02.mp4
┣index.html(今回は関係なし)
┗start.py

python

1start.py 2#!/usr/bin/env python3 3# -*- coding: utf-8 -*- 4 5from http.server import HTTPServer, CGIHTTPRequestHandler 6import os 7 8host = "" 9port = 8080 10httpd = HTTPServer((host, port), CGIHTTPRequestHandler) 11print('serving at port', port) 12httpd.serve_forever()

rss

1movie.rss 2<?xml version="1.0" encoding="utf-8"?> 3<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"> 4 <channel> 5 <title>家のビデオt</title> 6 <itunes:owner/> 7 <itunes:image href="http://192.168.11.9:8080/art-work/001.png"/> 8 <itunes:category text="video"/> 9 <item> 10 <title>test01.mp4</title> 11 <enclosure url="http://192.168.11.9:8080/podcast/test01.mp4" length="200000" type="video/mp4"/> 12 <guid isPermaLink="true">http://192.168.11.9:8080/podcast/test01.mp4</guid> 13 <pubDate>Tue, 10 Sep 2019 02:00:00 -0000</pubDate> 14 </item> 15 <item> 16 <title>test02.mp4</title> 17 <enclosure url="http://192.168.11.9:8080/podcast/test02.mp4" length="300000" type="video/mp4"/> 18 <guid isPermaLink="true">http://192.168.11.9:8080/podcast/test02.mp4</guid> 19 <pubDate>Tue, 10 Sep 2019 03:00:00 -0000</pubDate> 20 </item> 21 </channel> 22</rss>

試したこと

  1. 登録するファイルの数、サイズは関係無いようです。
  2. SimpleHTTPRequestHandlerやBaseHTTPRequestHandlerもダメでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/09/20 06:47

mp4に含まれるビデオや音声のコーデックが対応していないものという可能性はないですか?
Akihiro_py

2019/09/20 07:00

質問ありがとうございます。 このAppleのページで確認してみようと思います。 https://help.apple.com/itc/podcasts_connect/#/itca5b22233a もしコーデックの問題だけならありがたいです。 先ずは音声ファイルだけ作ってみて、確認しようと思います。
Akihiro_py

2019/09/20 10:26 編集

t_obaraさん、mp3でも同じ状況でした。 他に懸念点があれば良いのですが、もしよければhttp.server側の可能性含めて考えて頂けると助かります。 また他の方の回答もぜひお願い致します。 192.168.11.7 - - [20/Sep/2019 19:08:45] "HEAD /podcast/test03.mp3 HTTP/1.1" 200 - 192.168.11.7 - - [20/Sep/2019 19:08:58] "GET /podcast/test03.mp3 HTTP/1.1" 200 - 以降は同じ rss <item> <title>test03.mp3</title> <enclosure url="http://192.168.11.9:8080/podcast/test03.mp3" length="620713" type="audio/mpeg"/> <guid isPermaLink="true">http://192.168.11.9:8080/podcast/test03.mp3</guid> <pubDate>Fri, 20 Sep 2019 10:01:37 -0000</pubDate> </item> 因みにmp3ファイルは、手近なものが無かったので以下のリンクのものを使ってみました。 ウィキメディア・コモンズから借用 https://commons.wikimedia.org/w/index.php?title=File%3ABlack_Ant_-_03_-_8bit2_3.mp3
Akihiro_py

2019/09/20 15:22

プラウザ(iPhoneのSafari)で直接フォルダのリンクを開いてみました。 http://192.168.11.9:8080/podcast すると各ファイルへのリンク(Directory listing for /podcast/)が出てきました。 各ファイルのリンクをクリックすると以下の状況でした。 test01.mp4,test02.mp4  ・・・再生画面が一瞬開くが、再生不可のアイコンが出る test03.mp3        ・・・再生される
guest

回答1

0

ベストアンサー

https://help.apple.com/itc/podcasts_connect/#/itca5b22233a
ご提示されたリンクに構文チェックへのリンクがありました。

https://podba.se/validate/
こちらが参考になりますね。
質問の結果が全てのようで、HTTP HEADリクエストに対応できていないということかと。

HEADリクエスト自体は以下を参照すれば対応が可能かと思われます。
https://docs.python.org/ja/3.6/library/http.server.html#http.server.SimpleHTTPRequestHandler.do_HEAD

ただ、Rangeリクエストにも対応している必要があるようですが、これは実装する必要がありそうです。
おそらくこちらを参考にすれば良いかと思います。

https://github.com/danvk/RangeHTTPServer/

あと、検索するためには必要とするタグも規定されているようなので、そちらも(RSS用のXML)修正が必要かと思います。

投稿2019/09/20 15:16

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Akihiro_py

2019/09/20 15:30 編集

回答ありがとうございます。 ちょっと自分には難度が高い(HEADリクエスト、Rangeリクエスト)ようなので、時間をかけて理解して行こうと思います。 少なくとも、python3で提供しているhttp.server単体では対応できないということは理解しました。 いろいろとありがとうございます。
3265462164

2019/09/25 05:56

t_obaraは良く初心者の質問に適当なURLを貼る人物なので気を付けた方が良いですよ。私のところにも沸きました。 結局自分では説明できないのだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問