Проигрывание Mp3 через Http

  • Автор темы GrandMaster
  • Дата начала
G

GrandMaster

Гость
#1
Привет всем. Пишу прогу на python для прослушки записей. Причем эти записи храняться на удаленном компе.
К этим записям есть доступ по http вида
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
.
Программа пока умеет играть локальные файлы типа "/home/user/Desktop/test.mp3"
как научить ее играть по
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться


Ниже пример с куском из моей программы:

<!--shcode--><pre><code class='python'>#!/usr/bin/env python

import sys, os, thread, time
import pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst

class GTK_Main:

def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Player")
window.set_default_size(500, -1)
window.connect("destroy", gtk.main_quit, "WM destroy")
vbox = gtk.VBox()
window.add(vbox)
self.entry = gtk.Entry()
vbox.pack_start(self.entry, False)
hbox = gtk.HBox()
vbox.add(hbox)
buttonbox = gtk.HButtonBox()
hbox.pack_start(buttonbox, False)
rewind_button = gtk.Button("Rewind")
rewind_button.connect("clicked", self.rewind_callback)
buttonbox.add(rewind_button)
self.button = gtk.Button("Start")
self.button.connect("clicked", self.start_stop)
buttonbox.add(self.button)
forward_button = gtk.Button("Forward")
forward_button.connect("clicked", self.forward_callback)
buttonbox.add(forward_button)
self.time_label = gtk.Label()
self.time_label.set_text("00:00 / 00:00")
hbox.add(self.time_label)
window.show_all()

self.player = gst.Pipeline("player")
source = gst.element_factory_make("filesrc", "file-source")
decoder = gst.element_factory_make("mad", "mp3-decoder")
conv = gst.element_factory_make("audioconvert", "converter")
sink = gst.element_factory_make("alsasink", "alsa-output")

self.player.add(source, decoder, conv, sink)
gst.element_link_many(source, decoder, conv, sink)

bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect("message", self.on_message)

def start_stop(self, w):
if self.button.get_label() == "Start":
filepath = self.entry.get_text()
if os.path.isfile(filepath):
self.button.set_label("Stop")
self.player.get_by_name("file-source").set_property("location", filepath)
self.player.set_state(gst.STATE_PLAYING)
self.play_thread_id = thread.start_new_thread(self.play_thread, ())
else:
self.play_thread_id = None
self.player.set_state(gst.STATE_NULL)
self.button.set_label("Start")
self.time_label.set_text("00:00 / 00:00")

def play_thread(self):
play_thread_id = self.play_thread_id
gtk.gdk.threads_enter()
self.time_label.set_text("00:00 / 00:00")
gtk.gdk.threads_leave()

while play_thread_id == self.play_thread_id:
try:
time.sleep(0.2)
dur_int = self.player.query_duration(gst.FORMAT_TIME, None)[0]
if dur_int == -1:
continue
dur_str = self.convert_ns(dur_int)
gtk.gdk.threads_enter()
self.time_label.set_text("00:00 / " + dur_str)
gtk.gdk.threads_leave()
break
except:
pass

time.sleep(0.2)
while play_thread_id == self.play_thread_id:
pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0]
pos_str = self.convert_ns(pos_int)
if play_thread_id == self.play_thread_id:
gtk.gdk.threads_enter()
self.time_label.set_text(pos_str + " / " + dur_str)
gtk.gdk.threads_leave()
time.sleep(1)

def on_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS:
self.play_thread_id = None
self.player.set_state(gst.STATE_NULL)
self.button.set_label("Start")
self.time_label.set_text("00:00 / 00:00")
elif t == gst.MESSAGE_ERROR:
err, debug = message.parse_error()
print "Error: %s" % err, debug
self.play_thread_id = None
self.player.set_state(gst.STATE_NULL)
self.button.set_label("Start")
self.time_label.set_text("00:00 / 00:00")

def demuxer_callback(self, demuxer, pad):
adec_pad = self.audio_decoder.get_pad("sink")
pad.link(adec_pad)

def rewind_callback(self, w):
pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0]
seek_ns = pos_int - (10 * 1000000000)
self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, seek_ns)

def forward_callback(self, w):
pos_int = self.player.query_position(gst.FORMAT_TIME, None)[0]
seek_ns = pos_int + (10 * 1000000000)
self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, seek_ns)

def convert_ns(self, t):
# This method was submitted by Sam Mason.
# It's much shorter than the original one.
s,ns = divmod(t, 1000000000)
m,s = divmod(s, 60)

if m < 60:
return "%02i:%02i" %(m,s)
else:
h,m = divmod(m, 60)
return "%i:%02i:%02i" %(h,m,s)

GTK_Main()
gtk.gdk.threads_init()
gtk.main()[/CODE]