Merge lp:~blueyed/ubuntu/lucid/miro/merge-from-sid into lp:ubuntu/lucid/miro

Proposed by Daniel Hahler
Status: Merged
Merged at revision: not available
Proposed branch: lp:~blueyed/ubuntu/lucid/miro/merge-from-sid
Merge into: lp:ubuntu/lucid/miro
Diff against target: 602087 lines (+208600/-318048)
849 files modified
ADOPTERS (+0/-247)
CREDITS (+1/-1)
LAYOUT (+1/-1)
MIRO_ROOT (+1/-1)
README (+2/-2)
debian/README.Debian (+6/-39)
debian/changelog (+42/-0)
debian/control (+9/-17)
debian/copyright (+4/-246)
debian/miro.docs (+1/-0)
debian/patches/20_no_autoupdate.patch (+4/-4)
debian/patches/30_disable_xine_hack.patch (+0/-15)
debian/patches/80_xine_default_renderer.patch (+0/-14)
debian/patches/90_miro_boost_py26.patch (+0/-16)
debian/rules (+1/-14)
platform/gtk-x11/Makefile (+50/-0)
platform/gtk-x11/README (+7/-22)
platform/gtk-x11/clean.sh (+0/-54)
platform/gtk-x11/miro.1 (+6/-2)
platform/gtk-x11/miro.real (+15/-15)
platform/gtk-x11/plat/__init__.py (+1/-1)
platform/gtk-x11/plat/config.py (+1/-1)
platform/gtk-x11/plat/frontends/__init__.py (+1/-1)
platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc (+1/-1)
platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h (+1/-1)
platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc (+1/-1)
platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h (+1/-1)
platform/gtk-x11/plat/frontends/widgets/PromptService.cc (+1/-1)
platform/gtk-x11/plat/frontends/widgets/PromptService.h (+1/-1)
platform/gtk-x11/plat/frontends/widgets/__init__.py (+1/-1)
platform/gtk-x11/plat/frontends/widgets/application.py (+3/-1)
platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx (+1/-1)
platform/gtk-x11/plat/frontends/widgets/mediakeys.py (+61/-0)
platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx (+28/-0)
platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx (+1/-1)
platform/gtk-x11/plat/frontends/widgets/prefpanelset.py (+11/-7)
platform/gtk-x11/plat/frontends/widgets/threads.py (+1/-1)
platform/gtk-x11/plat/frontends/widgets/timer.py (+1/-1)
platform/gtk-x11/plat/frontends/widgets/widgetset.py (+1/-1)
platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx (+1/-1)
platform/gtk-x11/plat/idletime.py (+1/-1)
platform/gtk-x11/plat/mozsetup.py (+1/-1)
platform/gtk-x11/plat/onetime.py (+17/-107)
platform/gtk-x11/plat/options.py (+2/-12)
platform/gtk-x11/plat/renderers/__init__.py (+14/-4)
platform/gtk-x11/plat/renderers/gst_extractor.py (+165/-75)
platform/gtk-x11/plat/renderers/gstreamerrenderer.py (+278/-67)
platform/gtk-x11/plat/renderers/xinerenderer.py (+0/-268)
platform/gtk-x11/plat/resources.py (+1/-1)
platform/gtk-x11/plat/screensaver.py (+1/-1)
platform/gtk-x11/plat/upgrade.py (+1/-1)
platform/gtk-x11/plat/utils.py (+40/-66)
platform/gtk-x11/plat/xlibhelper.pyx (+1/-1)
platform/gtk-x11/pylintrc (+304/-0)
platform/gtk-x11/run.sh (+2/-2)
platform/gtk-x11/setup.py (+31/-167)
platform/gtk-x11/xine/xine.pyx (+0/-161)
platform/gtk-x11/xine/xine_extractor.c (+0/-224)
platform/gtk-x11/xine/xine_impl.c (+0/-490)
platform/gtk-x11/xine/xine_impl.h (+0/-273)
platform/osx/Info.plist (+5/-0)
platform/osx/Miro.py (+9/-5)
platform/osx/README (+2/-2)
platform/osx/Resources-Widgets/Credits.html (+42/-1)
platform/osx/Resources-Widgets/OverlayPalette.nib/classes.nib (+0/-137)
platform/osx/Resources-Widgets/OverlayPalette.nib/designable.nib (+1509/-0)
platform/osx/Resources-Widgets/OverlayPalette.nib/info.nib (+0/-18)
platform/osx/binary_kit_version (+1/-1)
platform/osx/brun.sh (+8/-2)
platform/osx/build.sh (+18/-8)
platform/osx/modules/idletime.c (+1/-1)
platform/osx/modules/keychain.c (+1/-1)
platform/osx/modules/qtcomp.c (+2/-2)
platform/osx/modules/shading.m (+1/-1)
platform/osx/patch_objc_module.sh (+1/-1)
platform/osx/plat/__init__.py (+1/-1)
platform/osx/plat/bundle.py (+1/-1)
platform/osx/plat/config.py (+4/-4)
platform/osx/plat/filenames.py (+12/-13)
platform/osx/plat/frontends/__init__.py (+1/-1)
platform/osx/plat/frontends/widgets/__init__.py (+1/-1)
platform/osx/plat/frontends/widgets/application.py (+22/-6)
platform/osx/plat/frontends/widgets/audio.py (+0/-63)
platform/osx/plat/frontends/widgets/base.py (+3/-3)
platform/osx/plat/frontends/widgets/browser.py (+19/-17)
platform/osx/plat/frontends/widgets/const.py (+1/-1)
platform/osx/plat/frontends/widgets/control.py (+61/-4)
platform/osx/plat/frontends/widgets/customcontrol.py (+4/-4)
platform/osx/plat/frontends/widgets/drawing.py (+1/-1)
platform/osx/plat/frontends/widgets/drawingwidgets.py (+2/-2)
platform/osx/plat/frontends/widgets/helpers.py (+1/-1)
platform/osx/plat/frontends/widgets/layout.py (+14/-47)
platform/osx/plat/frontends/widgets/layoutmanager.py (+1/-1)
platform/osx/plat/frontends/widgets/mediatypes.py (+40/-0)
platform/osx/plat/frontends/widgets/osxmenus.py (+183/-69)
platform/osx/plat/frontends/widgets/overlay.py (+14/-5)
platform/osx/plat/frontends/widgets/prefpanelset.py (+1/-1)
platform/osx/plat/frontends/widgets/quicktime.py (+0/-165)
platform/osx/plat/frontends/widgets/rect.py (+2/-2)
platform/osx/plat/frontends/widgets/simple.py (+2/-2)
platform/osx/plat/frontends/widgets/sniffer.py (+0/-79)
platform/osx/plat/frontends/widgets/sparkleupdater.py (+1/-1)
platform/osx/plat/frontends/widgets/tablemodel.py (+24/-18)
platform/osx/plat/frontends/widgets/tableview.py (+10/-14)
platform/osx/plat/frontends/widgets/threads.py (+1/-1)
platform/osx/plat/frontends/widgets/timer.py (+1/-1)
platform/osx/plat/frontends/widgets/video.py (+5/-4)
platform/osx/plat/frontends/widgets/viewport.py (+1/-1)
platform/osx/plat/frontends/widgets/widgetset.py (+2/-2)
platform/osx/plat/frontends/widgets/window.py (+30/-7)
platform/osx/plat/frontends/widgets/wrappermap.py (+1/-1)
platform/osx/plat/migrateappname.py (+1/-1)
platform/osx/plat/resources.py (+1/-1)
platform/osx/plat/script_codes.py (+162/-0)
platform/osx/plat/utils.py (+105/-53)
platform/osx/qt_extractor.py (+57/-11)
platform/osx/run.sh (+29/-10)
platform/osx/setup.py (+92/-114)
platform/osx/setup_binarykit.sh (+6/-3)
platform/osx/setup_sandbox.sh (+134/-416)
platform/osx/setup_sandbox_10.4.sh (+524/-0)
platform/osx/setup_sandbox_10.5.sh (+0/-169)
platform/osx/test/setup-unittests.py (+1/-1)
platform/osx/test/unittests.py (+1/-1)
platform/osx/test/unittests.sh (+1/-1)
platform/windows-xul/Miro.nsi (+23/-63)
platform/windows-xul/Miro.py (+3/-3)
platform/windows-xul/MiroBar-installer-page.ini (+0/-87)
platform/windows-xul/Miro_Downloader.py (+1/-1)
platform/windows-xul/README (+6/-2)
platform/windows-xul/binary_kit_version (+1/-1)
platform/windows-xul/clean.sh (+13/-0)
platform/windows-xul/mirotest.py (+51/-0)
platform/windows-xul/moviedata_util.py (+60/-19)
platform/windows-xul/overrides/site.py (+1/-12)
platform/windows-xul/plat/__init__.py (+1/-1)
platform/windows-xul/plat/clipboard.py (+4/-3)
platform/windows-xul/plat/commandline.py (+1/-1)
platform/windows-xul/plat/config.py (+1/-1)
platform/windows-xul/plat/frontends/__init__.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/FixFocus.cpp (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/FixFocus.h (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/Init.cpp (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/Init.h (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/MiroBrowserEmbed.cpp (+15/-5)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/MiroBrowserEmbed.h (+2/-2)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/MiroWindowCreator.cpp (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/MiroWindowCreator.h (+1/-1)
platform/windows-xul/plat/frontends/widgets/XULRunnerBrowser/xulrunnerbrowser.pyx (+1/-1)
platform/windows-xul/plat/frontends/widgets/__init__.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/application.py (+3/-2)
platform/windows-xul/plat/frontends/widgets/browser.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/flash.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/prefpanelset.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/threads.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/timer.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/update.py (+1/-1)
platform/windows-xul/plat/frontends/widgets/widgetset.py (+1/-1)
platform/windows-xul/plat/idletime.py (+1/-1)
platform/windows-xul/plat/migrateappname.py (+1/-1)
platform/windows-xul/plat/options.py (+1/-1)
platform/windows-xul/plat/pipeipc.py (+2/-1)
platform/windows-xul/plat/prelogger.py (+0/-68)
platform/windows-xul/plat/proxyfind.py (+1/-1)
platform/windows-xul/plat/pyxpcomcalls.py (+3/-3)
platform/windows-xul/plat/renderers/__init__.py (+1/-1)
platform/windows-xul/plat/renderers/vlc.py (+281/-100)
platform/windows-xul/plat/resources.py (+1/-1)
platform/windows-xul/plat/screensaver.py (+1/-1)
platform/windows-xul/plat/specialfolders.py (+1/-1)
platform/windows-xul/plat/utils.py (+46/-61)
platform/windows-xul/plat/xulhelper.py (+1/-1)
platform/windows-xul/run.sh (+2/-2)
platform/windows-xul/setup.py (+205/-177)
platform/windows-xul/setup_binarykit.sh (+1/-1)
platform/windows-xul/test.sh (+33/-0)
portable/__init__.py (+1/-1)
portable/adscraper.py (+1/-1)
portable/app.py (+36/-22)
portable/appconfig.py (+6/-6)
portable/autodiscover.py (+0/-158)
portable/autodler.py (+55/-58)
portable/autoupdate.py (+18/-16)
portable/clock.py (+1/-1)
portable/commandline.py (+0/-204)
portable/config.py (+12/-21)
portable/controller.py (+52/-49)
portable/convert20database.py (+0/-231)
portable/database.py (+0/-443)
portable/databasehelper.py (+19/-18)
portable/databaselog.py (+100/-0)
portable/databasesanity.py (+103/-91)
portable/databaseupgrade.py (+398/-286)
portable/datastructures.py (+65/-0)
portable/dbupgradeprogress.py (+0/-92)
portable/dialogs.py (+97/-87)
portable/displaytext.py (+43/-29)
portable/dl_daemon/Democracy_Downloader.py (+3/-3)
portable/dl_daemon/__init__.py (+1/-1)
portable/dl_daemon/command.py (+4/-4)
portable/dl_daemon/daemon.py (+4/-4)
portable/dl_daemon/download.py (+48/-46)
portable/dl_daemon/private/__init__.py (+1/-1)
portable/dl_daemon/private/config.py (+1/-1)
portable/dl_daemon/private/httpauth.py (+1/-1)
portable/dl_daemon/private/resources.py (+1/-1)
portable/download_utils.py (+52/-90)
portable/downloader.py (+230/-175)
portable/eventloop.py (+122/-115)
portable/fasttypes.c (+530/-0)
portable/fasttypes.cpp (+0/-397)
portable/feed.py (+452/-408)
portable/feedparser.py (+7/-10)
portable/feedparserutil.py (+0/-69)
portable/feedupdate.py (+5/-5)
portable/filetypes.py (+85/-65)
portable/fileutil.py (+4/-2)
portable/flashscraper.py (+10/-7)
portable/folder.py (+2/-12)
portable/frontends/__init__.py (+1/-1)
portable/frontends/cli/__init__.py (+1/-1)
portable/frontends/cli/application.py (+1/-1)
portable/frontends/cli/clidialog.py (+2/-2)
portable/frontends/cli/events.py (+1/-1)
portable/frontends/cli/interpreter.py (+1/-1)
portable/frontends/cli/util.py (+1/-1)
portable/frontends/shell/__init__.py (+1/-1)
portable/frontends/shell/application.py (+1/-1)
portable/frontends/widgets/__init__.py (+1/-1)
portable/frontends/widgets/addtoplaylistdialog.py (+7/-6)
portable/frontends/widgets/application.py (+52/-50)
portable/frontends/widgets/browser.py (+21/-13)
portable/frontends/widgets/cellpack.py (+4/-1)
portable/frontends/widgets/crashdialog.py (+9/-8)
portable/frontends/widgets/diagnostics.py (+28/-28)
portable/frontends/widgets/dialogs.py (+1/-1)
portable/frontends/widgets/dialogwidgets.py (+2/-2)
portable/frontends/widgets/displays.py (+5/-5)
portable/frontends/widgets/downloadscontroller.py (+9/-4)
portable/frontends/widgets/feedcontroller.py (+1/-1)
portable/frontends/widgets/feedsettingspanel.py (+6/-8)
portable/frontends/widgets/firsttimedialog.py (+1/-1)
portable/frontends/widgets/gtk/__init__.py (+1/-1)
portable/frontends/widgets/gtk/audio.py (+0/-99)
portable/frontends/widgets/gtk/base.py (+1/-1)
portable/frontends/widgets/gtk/const.py (+1/-1)
portable/frontends/widgets/gtk/controls.py (+32/-2)
portable/frontends/widgets/gtk/customcontrols.py (+5/-1)
portable/frontends/widgets/gtk/drawing.py (+1/-1)
portable/frontends/widgets/gtk/fontsize.py (+1/-1)
portable/frontends/widgets/gtk/keymap.py (+21/-21)
portable/frontends/widgets/gtk/layout.py (+1/-1)
portable/frontends/widgets/gtk/layoutmanager.py (+28/-26)
portable/frontends/widgets/gtk/persistentwindow.py (+5/-1)
portable/frontends/widgets/gtk/preferenceswindow.py (+1/-1)
portable/frontends/widgets/gtk/pygtkhacks.pyx (+1/-1)
portable/frontends/widgets/gtk/searchentry.py (+1/-1)
portable/frontends/widgets/gtk/simple.py (+8/-1)
portable/frontends/widgets/gtk/sniffer.py (+0/-38)
portable/frontends/widgets/gtk/tableview.py (+6/-1)
portable/frontends/widgets/gtk/textlayout.py (+1/-1)
portable/frontends/widgets/gtk/threads.py (+1/-1)
portable/frontends/widgets/gtk/timer.py (+1/-1)
portable/frontends/widgets/gtk/trayicon.py (+35/-1)
portable/frontends/widgets/gtk/video.py (+136/-25)
portable/frontends/widgets/gtk/weakconnect.py (+1/-1)
portable/frontends/widgets/gtk/widgets.py (+2/-2)
portable/frontends/widgets/gtk/widgetset.py (+13/-12)
portable/frontends/widgets/gtk/window.py (+263/-103)
portable/frontends/widgets/gtk/wrappermap.py (+1/-1)
portable/frontends/widgets/gtk/xpcom/HttpObserver.cc (+1/-1)
portable/frontends/widgets/gtk/xpcom/HttpObserver.h (+1/-1)
portable/frontends/widgets/imagebutton.py (+1/-1)
portable/frontends/widgets/imagepool.py (+2/-4)
portable/frontends/widgets/itemcontextmenu.py (+12/-6)
portable/frontends/widgets/itemedit.py (+191/-0)
portable/frontends/widgets/itemlist.py (+28/-13)
portable/frontends/widgets/itemlistcontroller.py (+14/-9)
portable/frontends/widgets/itemlistwidgets.py (+7/-2)
portable/frontends/widgets/linkhandler.py (+1/-1)
portable/frontends/widgets/menus.py (+382/-114)
portable/frontends/widgets/newfeed.py (+2/-4)
portable/frontends/widgets/newfolder.py (+2/-4)
portable/frontends/widgets/newsearchfeed.py (+4/-6)
portable/frontends/widgets/playback.py (+84/-18)
portable/frontends/widgets/playlist.py (+1/-1)
portable/frontends/widgets/prefpanel.py (+25/-11)
portable/frontends/widgets/quitwhiledownloading.py (+1/-1)
portable/frontends/widgets/removefeeds.py (+4/-6)
portable/frontends/widgets/rundialog.py (+14/-13)
portable/frontends/widgets/search.py (+1/-1)
portable/frontends/widgets/searchbox.py (+1/-1)
portable/frontends/widgets/segmented.py (+0/-196)
portable/frontends/widgets/separator.py (+1/-1)
portable/frontends/widgets/statictabs.py (+4/-1)
portable/frontends/widgets/style.py (+26/-8)
portable/frontends/widgets/tablist.py (+95/-18)
portable/frontends/widgets/tablistmanager.py (+1/-1)
portable/frontends/widgets/util.py (+1/-1)
portable/frontends/widgets/videobox.py (+27/-10)
portable/frontends/widgets/watchedfolders.py (+1/-1)
portable/frontends/widgets/widgetconst.py (+2/-1)
portable/frontends/widgets/widgetutil.py (+1/-1)
portable/frontends/widgets/window.py (+1/-1)
portable/frontendstate.py (+1/-1)
portable/gtcache.py (+3/-4)
portable/guide.py (+16/-16)
portable/httpauth.py (+3/-3)
portable/httpclient.py (+67/-33)
portable/iconcache.py (+27/-27)
portable/iso_639.py (+179/-0)
portable/item.py (+279/-212)
portable/libtorrent/AUTHORS (+0/-26)
portable/libtorrent/COPYING (+0/-28)
portable/libtorrent/ChangeLog (+0/-454)
portable/libtorrent/README (+0/-25)
portable/libtorrent/README.miro (+0/-8)
portable/libtorrent/bindings/README.txt (+0/-3)
portable/libtorrent/bindings/python/Jamfile (+0/-63)
portable/libtorrent/bindings/python/Makefile.am (+0/-15)
portable/libtorrent/bindings/python/Makefile.in (+0/-385)
portable/libtorrent/bindings/python/client.py (+0/-363)
portable/libtorrent/bindings/python/setup.py (+0/-84)
portable/libtorrent/bindings/python/setup.py.in (+0/-84)
portable/libtorrent/bindings/python/simple_client.py (+0/-31)
portable/libtorrent/bindings/python/src/alert.cpp (+0/-337)
portable/libtorrent/bindings/python/src/big_number.cpp (+0/-20)
portable/libtorrent/bindings/python/src/converters.cpp (+0/-51)
portable/libtorrent/bindings/python/src/create_torrent.cpp (+0/-53)
portable/libtorrent/bindings/python/src/datetime.cpp (+0/-81)
portable/libtorrent/bindings/python/src/entry.cpp (+0/-140)
portable/libtorrent/bindings/python/src/extensions.cpp (+0/-171)
portable/libtorrent/bindings/python/src/filesystem.cpp (+0/-70)
portable/libtorrent/bindings/python/src/fingerprint.cpp (+0/-27)
portable/libtorrent/bindings/python/src/gil.hpp (+0/-144)
portable/libtorrent/bindings/python/src/ip_filter.cpp (+0/-32)
portable/libtorrent/bindings/python/src/magnet_uri.cpp (+0/-54)
portable/libtorrent/bindings/python/src/module.cpp (+0/-57)
portable/libtorrent/bindings/python/src/optional.hpp (+0/-31)
portable/libtorrent/bindings/python/src/peer_info.cpp (+0/-129)
portable/libtorrent/bindings/python/src/peer_plugin.cpp (+0/-359)
portable/libtorrent/bindings/python/src/session.cpp (+0/-289)
portable/libtorrent/bindings/python/src/session_settings.cpp (+0/-124)
portable/libtorrent/bindings/python/src/torrent.cpp (+0/-15)
portable/libtorrent/bindings/python/src/torrent_handle.cpp (+0/-332)
portable/libtorrent/bindings/python/src/torrent_info.cpp (+0/-156)
portable/libtorrent/bindings/python/src/torrent_status.cpp (+0/-90)
portable/libtorrent/bindings/python/src/utility.cpp (+0/-37)
portable/libtorrent/bindings/python/src/version.cpp (+0/-16)
portable/libtorrent/include/Makefile.am (+0/-295)
portable/libtorrent/include/Makefile.in (+0/-938)
portable/libtorrent/include/libtorrent/GeoIP.h (+0/-180)
portable/libtorrent/include/libtorrent/alert.hpp (+0/-196)
portable/libtorrent/include/libtorrent/alert_types.hpp (+0/-1172)
portable/libtorrent/include/libtorrent/asio.hpp (+0/-100)
portable/libtorrent/include/libtorrent/asio/basic_datagram_socket.hpp (+0/-803)
portable/libtorrent/include/libtorrent/asio/basic_deadline_timer.hpp (+0/-381)
portable/libtorrent/include/libtorrent/asio/basic_io_object.hpp (+0/-97)
portable/libtorrent/include/libtorrent/asio/basic_raw_socket.hpp (+0/-798)
portable/libtorrent/include/libtorrent/asio/basic_serial_port.hpp (+0/-608)
portable/libtorrent/include/libtorrent/asio/basic_socket.hpp (+0/-1049)
portable/libtorrent/include/libtorrent/asio/basic_socket_acceptor.hpp (+0/-824)
portable/libtorrent/include/libtorrent/asio/basic_socket_iostream.hpp (+0/-148)
portable/libtorrent/include/libtorrent/asio/basic_socket_streambuf.hpp (+0/-284)
portable/libtorrent/include/libtorrent/asio/basic_stream_socket.hpp (+0/-718)
portable/libtorrent/include/libtorrent/asio/basic_streambuf.hpp (+0/-198)
portable/libtorrent/include/libtorrent/asio/buffer.hpp (+0/-1040)
portable/libtorrent/include/libtorrent/asio/buffered_read_stream.hpp (+0/-414)
portable/libtorrent/include/libtorrent/asio/buffered_read_stream_fwd.hpp (+0/-29)
portable/libtorrent/include/libtorrent/asio/buffered_stream.hpp (+0/-250)
portable/libtorrent/include/libtorrent/asio/buffered_stream_fwd.hpp (+0/-29)
portable/libtorrent/include/libtorrent/asio/buffered_write_stream.hpp (+0/-368)
portable/libtorrent/include/libtorrent/asio/buffered_write_stream_fwd.hpp (+0/-29)
portable/libtorrent/include/libtorrent/asio/buffers_iterator.hpp (+0/-318)
portable/libtorrent/include/libtorrent/asio/completion_condition.hpp (+0/-145)
portable/libtorrent/include/libtorrent/asio/datagram_socket_service.hpp (+0/-323)
portable/libtorrent/include/libtorrent/asio/deadline_timer.hpp (+0/-37)
portable/libtorrent/include/libtorrent/asio/deadline_timer_service.hpp (+0/-168)
portable/libtorrent/include/libtorrent/asio/detail/bind_handler.hpp (+0/-349)
portable/libtorrent/include/libtorrent/asio/detail/buffer_resize_guard.hpp (+0/-70)
portable/libtorrent/include/libtorrent/asio/detail/buffered_stream_storage.hpp (+0/-127)
portable/libtorrent/include/libtorrent/asio/detail/call_stack.hpp (+0/-90)
portable/libtorrent/include/libtorrent/asio/detail/const_buffers_iterator.hpp (+0/-151)
portable/libtorrent/include/libtorrent/asio/detail/consuming_buffers.hpp (+0/-225)
portable/libtorrent/include/libtorrent/asio/detail/deadline_timer_service.hpp (+0/-200)
portable/libtorrent/include/libtorrent/asio/detail/descriptor_ops.hpp (+0/-138)
portable/libtorrent/include/libtorrent/asio/detail/dev_poll_reactor.hpp (+0/-665)
portable/libtorrent/include/libtorrent/asio/detail/dev_poll_reactor_fwd.hpp (+0/-40)
portable/libtorrent/include/libtorrent/asio/detail/epoll_reactor.hpp (+0/-721)
portable/libtorrent/include/libtorrent/asio/detail/epoll_reactor_fwd.hpp (+0/-47)
portable/libtorrent/include/libtorrent/asio/detail/event.hpp (+0/-50)
portable/libtorrent/include/libtorrent/asio/detail/fd_set_adapter.hpp (+0/-41)
portable/libtorrent/include/libtorrent/asio/detail/handler_alloc_helpers.hpp (+0/-256)
portable/libtorrent/include/libtorrent/asio/detail/handler_base_from_member.hpp (+0/-76)
portable/libtorrent/include/libtorrent/asio/detail/handler_invoke_helpers.hpp (+0/-47)
portable/libtorrent/include/libtorrent/asio/detail/handler_queue.hpp (+0/-229)
portable/libtorrent/include/libtorrent/asio/detail/hash_map.hpp (+0/-237)
portable/libtorrent/include/libtorrent/asio/detail/indirect_handler_queue.hpp (+0/-291)
portable/libtorrent/include/libtorrent/asio/detail/io_control.hpp (+0/-137)
portable/libtorrent/include/libtorrent/asio/detail/kqueue_reactor.hpp (+0/-702)
portable/libtorrent/include/libtorrent/asio/detail/kqueue_reactor_fwd.hpp (+0/-41)
portable/libtorrent/include/libtorrent/asio/detail/local_free_on_block_exit.hpp (+0/-59)
portable/libtorrent/include/libtorrent/asio/detail/mutex.hpp (+0/-50)
portable/libtorrent/include/libtorrent/asio/detail/noncopyable.hpp (+0/-55)
portable/libtorrent/include/libtorrent/asio/detail/null_event.hpp (+0/-71)
portable/libtorrent/include/libtorrent/asio/detail/null_mutex.hpp (+0/-66)
portable/libtorrent/include/libtorrent/asio/detail/null_signal_blocker.hpp (+0/-63)
portable/libtorrent/include/libtorrent/asio/detail/null_thread.hpp (+0/-71)
portable/libtorrent/include/libtorrent/asio/detail/null_tss_ptr.hpp (+0/-70)
portable/libtorrent/include/libtorrent/asio/detail/old_win_sdk_compat.hpp (+0/-340)
portable/libtorrent/include/libtorrent/asio/detail/pipe_select_interrupter.hpp (+0/-114)
portable/libtorrent/include/libtorrent/asio/detail/pop_options.hpp (+0/-88)
portable/libtorrent/include/libtorrent/asio/detail/posix_event.hpp (+0/-104)
portable/libtorrent/include/libtorrent/asio/detail/posix_fd_set_adapter.hpp (+0/-77)
portable/libtorrent/include/libtorrent/asio/detail/posix_mutex.hpp (+0/-107)
portable/libtorrent/include/libtorrent/asio/detail/posix_signal_blocker.hpp (+0/-90)
portable/libtorrent/include/libtorrent/asio/detail/posix_thread.hpp (+0/-132)
portable/libtorrent/include/libtorrent/asio/detail/posix_tss_ptr.hpp (+0/-88)
portable/libtorrent/include/libtorrent/asio/detail/push_options.hpp (+0/-114)
portable/libtorrent/include/libtorrent/asio/detail/reactive_descriptor_service.hpp (+0/-709)
portable/libtorrent/include/libtorrent/asio/detail/reactive_serial_port_service.hpp (+0/-268)
portable/libtorrent/include/libtorrent/asio/detail/reactive_socket_service.hpp (+0/-1780)
portable/libtorrent/include/libtorrent/asio/detail/reactor_op_queue.hpp (+0/-454)
portable/libtorrent/include/libtorrent/asio/detail/resolver_service.hpp (+0/-357)
portable/libtorrent/include/libtorrent/asio/detail/scoped_lock.hpp (+0/-91)
portable/libtorrent/include/libtorrent/asio/detail/select_interrupter.hpp (+0/-41)
portable/libtorrent/include/libtorrent/asio/detail/select_reactor.hpp (+0/-534)
portable/libtorrent/include/libtorrent/asio/detail/select_reactor_fwd.hpp (+0/-31)
portable/libtorrent/include/libtorrent/asio/detail/service_base.hpp (+0/-49)
portable/libtorrent/include/libtorrent/asio/detail/service_id.hpp (+0/-37)
portable/libtorrent/include/libtorrent/asio/detail/service_registry.hpp (+0/-210)
portable/libtorrent/include/libtorrent/asio/detail/service_registry_fwd.hpp (+0/-30)
portable/libtorrent/include/libtorrent/asio/detail/signal_blocker.hpp (+0/-50)
portable/libtorrent/include/libtorrent/asio/detail/signal_init.hpp (+0/-51)
portable/libtorrent/include/libtorrent/asio/detail/socket_holder.hpp (+0/-95)
portable/libtorrent/include/libtorrent/asio/detail/socket_ops.hpp (+0/-1893)
portable/libtorrent/include/libtorrent/asio/detail/socket_option.hpp (+0/-309)
portable/libtorrent/include/libtorrent/asio/detail/socket_select_interrupter.hpp (+0/-187)
portable/libtorrent/include/libtorrent/asio/detail/socket_types.hpp (+0/-206)
portable/libtorrent/include/libtorrent/asio/detail/strand_service.hpp (+0/-530)
portable/libtorrent/include/libtorrent/asio/detail/task_io_service.hpp (+0/-425)
portable/libtorrent/include/libtorrent/asio/detail/task_io_service_2lock.hpp (+0/-462)
portable/libtorrent/include/libtorrent/asio/detail/task_io_service_fwd.hpp (+0/-31)
portable/libtorrent/include/libtorrent/asio/detail/thread.hpp (+0/-58)
portable/libtorrent/include/libtorrent/asio/detail/throw_error.hpp (+0/-44)
portable/libtorrent/include/libtorrent/asio/detail/timer_queue.hpp (+0/-436)
portable/libtorrent/include/libtorrent/asio/detail/timer_queue_base.hpp (+0/-62)
portable/libtorrent/include/libtorrent/asio/detail/tss_ptr.hpp (+0/-65)
portable/libtorrent/include/libtorrent/asio/detail/win_event.hpp (+0/-103)
portable/libtorrent/include/libtorrent/asio/detail/win_fd_set_adapter.hpp (+0/-88)
portable/libtorrent/include/libtorrent/asio/detail/win_iocp_handle_service.hpp (+0/-832)
portable/libtorrent/include/libtorrent/asio/detail/win_iocp_io_service.hpp (+0/-728)
portable/libtorrent/include/libtorrent/asio/detail/win_iocp_io_service_fwd.hpp (+0/-50)
portable/libtorrent/include/libtorrent/asio/detail/win_iocp_serial_port_service.hpp (+0/-292)
portable/libtorrent/include/libtorrent/asio/detail/win_iocp_socket_service.hpp (+0/-2413)
portable/libtorrent/include/libtorrent/asio/detail/win_mutex.hpp (+0/-149)
portable/libtorrent/include/libtorrent/asio/detail/win_signal_blocker.hpp (+0/-67)
portable/libtorrent/include/libtorrent/asio/detail/win_thread.hpp (+0/-194)
portable/libtorrent/include/libtorrent/asio/detail/win_tss_ptr.hpp (+0/-95)
portable/libtorrent/include/libtorrent/asio/detail/wince_thread.hpp (+0/-127)
portable/libtorrent/include/libtorrent/asio/detail/winsock_init.hpp (+0/-120)
portable/libtorrent/include/libtorrent/asio/detail/wrapped_handler.hpp (+0/-209)
portable/libtorrent/include/libtorrent/asio/error.hpp (+0/-260)
portable/libtorrent/include/libtorrent/asio/error_code.hpp (+0/-164)
portable/libtorrent/include/libtorrent/asio/handler_alloc_hook.hpp (+0/-88)
portable/libtorrent/include/libtorrent/asio/handler_invoke_hook.hpp (+0/-69)
portable/libtorrent/include/libtorrent/asio/impl/error_code.ipp (+0/-104)
portable/libtorrent/include/libtorrent/asio/impl/io_service.ipp (+0/-224)
portable/libtorrent/include/libtorrent/asio/impl/read.ipp (+0/-314)
portable/libtorrent/include/libtorrent/asio/impl/read_at.ipp (+0/-337)
portable/libtorrent/include/libtorrent/asio/impl/read_until.ipp (+0/-996)
portable/libtorrent/include/libtorrent/asio/impl/serial_port_base.ipp (+0/-541)
portable/libtorrent/include/libtorrent/asio/impl/write.ipp (+0/-279)
portable/libtorrent/include/libtorrent/asio/impl/write_at.ipp (+0/-296)
portable/libtorrent/include/libtorrent/asio/io_service.hpp (+0/-551)
portable/libtorrent/include/libtorrent/asio/ip/address.hpp (+0/-277)
portable/libtorrent/include/libtorrent/asio/ip/address_v4.hpp (+0/-288)
portable/libtorrent/include/libtorrent/asio/ip/address_v6.hpp (+0/-406)
portable/libtorrent/include/libtorrent/asio/ip/basic_endpoint.hpp (+0/-368)
portable/libtorrent/include/libtorrent/asio/ip/basic_resolver.hpp (+0/-245)
portable/libtorrent/include/libtorrent/asio/ip/basic_resolver_entry.hpp (+0/-95)
portable/libtorrent/include/libtorrent/asio/ip/basic_resolver_iterator.hpp (+0/-154)
portable/libtorrent/include/libtorrent/asio/ip/basic_resolver_query.hpp (+0/-149)
portable/libtorrent/include/libtorrent/asio/ip/detail/socket_option.hpp (+0/-578)
portable/libtorrent/include/libtorrent/asio/ip/host_name.hpp (+0/-62)
portable/libtorrent/include/libtorrent/asio/ip/icmp.hpp (+0/-118)
portable/libtorrent/include/libtorrent/asio/ip/multicast.hpp (+0/-181)
portable/libtorrent/include/libtorrent/asio/ip/resolver_query_base.hpp (+0/-109)
portable/libtorrent/include/libtorrent/asio/ip/resolver_service.hpp (+0/-140)
portable/libtorrent/include/libtorrent/asio/ip/tcp.hpp (+0/-158)
portable/libtorrent/include/libtorrent/asio/ip/udp.hpp (+0/-116)
portable/libtorrent/include/libtorrent/asio/ip/unicast.hpp (+0/-70)
portable/libtorrent/include/libtorrent/asio/ip/v6_only.hpp (+0/-68)
portable/libtorrent/include/libtorrent/asio/is_read_buffered.hpp (+0/-62)
portable/libtorrent/include/libtorrent/asio/is_write_buffered.hpp (+0/-62)
portable/libtorrent/include/libtorrent/asio/local/basic_endpoint.hpp (+0/-265)
portable/libtorrent/include/libtorrent/asio/local/connect_pair.hpp (+0/-100)
portable/libtorrent/include/libtorrent/asio/local/datagram_protocol.hpp (+0/-78)
portable/libtorrent/include/libtorrent/asio/local/stream_protocol.hpp (+0/-86)
portable/libtorrent/include/libtorrent/asio/placeholders.hpp (+0/-107)
portable/libtorrent/include/libtorrent/asio/posix/basic_descriptor.hpp (+0/-280)
portable/libtorrent/include/libtorrent/asio/posix/basic_stream_descriptor.hpp (+0/-304)
portable/libtorrent/include/libtorrent/asio/posix/descriptor_base.hpp (+0/-93)
portable/libtorrent/include/libtorrent/asio/posix/stream_descriptor.hpp (+0/-39)
portable/libtorrent/include/libtorrent/asio/posix/stream_descriptor_service.hpp (+0/-200)
portable/libtorrent/include/libtorrent/asio/raw_socket_service.hpp (+0/-323)
portable/libtorrent/include/libtorrent/asio/read.hpp (+0/-522)
portable/libtorrent/include/libtorrent/asio/read_at.hpp (+0/-568)
portable/libtorrent/include/libtorrent/asio/read_until.hpp (+0/-823)
portable/libtorrent/include/libtorrent/asio/serial_port.hpp (+0/-38)
portable/libtorrent/include/libtorrent/asio/serial_port_base.hpp (+0/-157)
portable/libtorrent/include/libtorrent/asio/serial_port_service.hpp (+0/-222)
portable/libtorrent/include/libtorrent/asio/socket_acceptor_service.hpp (+0/-225)
portable/libtorrent/include/libtorrent/asio/socket_base.hpp (+0/-515)
portable/libtorrent/include/libtorrent/asio/ssl.hpp (+0/-26)
portable/libtorrent/include/libtorrent/asio/ssl/basic_context.hpp (+0/-434)
portable/libtorrent/include/libtorrent/asio/ssl/context.hpp (+0/-35)
portable/libtorrent/include/libtorrent/asio/ssl/context_base.hpp (+0/-164)
portable/libtorrent/include/libtorrent/asio/ssl/context_service.hpp (+0/-175)
portable/libtorrent/include/libtorrent/asio/ssl/detail/openssl_context_service.hpp (+0/-379)
portable/libtorrent/include/libtorrent/asio/ssl/detail/openssl_init.hpp (+0/-150)
portable/libtorrent/include/libtorrent/asio/ssl/detail/openssl_operation.hpp (+0/-516)
portable/libtorrent/include/libtorrent/asio/ssl/detail/openssl_stream_service.hpp (+0/-531)
portable/libtorrent/include/libtorrent/asio/ssl/detail/openssl_types.hpp (+0/-31)
portable/libtorrent/include/libtorrent/asio/ssl/stream.hpp (+0/-503)
portable/libtorrent/include/libtorrent/asio/ssl/stream_base.hpp (+0/-60)
portable/libtorrent/include/libtorrent/asio/ssl/stream_service.hpp (+0/-186)
portable/libtorrent/include/libtorrent/asio/strand.hpp (+0/-186)
portable/libtorrent/include/libtorrent/asio/stream_socket_service.hpp (+0/-286)
portable/libtorrent/include/libtorrent/asio/streambuf.hpp (+0/-31)
portable/libtorrent/include/libtorrent/asio/system_error.hpp (+0/-117)
portable/libtorrent/include/libtorrent/asio/thread.hpp (+0/-91)
portable/libtorrent/include/libtorrent/asio/time_traits.hpp (+0/-78)
portable/libtorrent/include/libtorrent/asio/version.hpp (+0/-23)
portable/libtorrent/include/libtorrent/asio/windows/basic_handle.hpp (+0/-211)
portable/libtorrent/include/libtorrent/asio/windows/basic_random_access_handle.hpp (+0/-320)
portable/libtorrent/include/libtorrent/asio/windows/basic_stream_handle.hpp (+0/-302)
portable/libtorrent/include/libtorrent/asio/windows/random_access_handle.hpp (+0/-39)
portable/libtorrent/include/libtorrent/asio/windows/random_access_handle_service.hpp (+0/-179)
portable/libtorrent/include/libtorrent/asio/windows/stream_handle.hpp (+0/-39)
portable/libtorrent/include/libtorrent/asio/windows/stream_handle_service.hpp (+0/-177)
portable/libtorrent/include/libtorrent/asio/write.hpp (+0/-520)
portable/libtorrent/include/libtorrent/asio/write_at.hpp (+0/-555)
portable/libtorrent/include/libtorrent/assert.hpp (+0/-60)
portable/libtorrent/include/libtorrent/aux_/session_impl.hpp (+0/-685)
portable/libtorrent/include/libtorrent/bandwidth_limit.hpp (+0/-120)
portable/libtorrent/include/libtorrent/bandwidth_manager.hpp (+0/-496)
portable/libtorrent/include/libtorrent/bandwidth_queue_entry.hpp (+0/-56)
portable/libtorrent/include/libtorrent/bencode.hpp (+0/-415)
portable/libtorrent/include/libtorrent/bitfield.hpp (+0/-266)
portable/libtorrent/include/libtorrent/broadcast_socket.hpp (+0/-110)
portable/libtorrent/include/libtorrent/bt_peer_connection.hpp (+0/-435)
portable/libtorrent/include/libtorrent/buffer.hpp (+0/-205)
portable/libtorrent/include/libtorrent/chained_buffer.hpp (+0/-200)
portable/libtorrent/include/libtorrent/config.hpp (+0/-100)
portable/libtorrent/include/libtorrent/connection_queue.hpp (+0/-115)
portable/libtorrent/include/libtorrent/create_torrent.hpp (+0/-238)
portable/libtorrent/include/libtorrent/debug.hpp (+0/-94)
portable/libtorrent/include/libtorrent/disk_buffer_holder.hpp (+0/-65)
portable/libtorrent/include/libtorrent/disk_io_thread.hpp (+0/-335)
portable/libtorrent/include/libtorrent/entry.hpp (+0/-338)
portable/libtorrent/include/libtorrent/enum_net.hpp (+0/-78)
portable/libtorrent/include/libtorrent/error_code.hpp (+0/-106)
portable/libtorrent/include/libtorrent/escape_string.hpp (+0/-65)
portable/libtorrent/include/libtorrent/extensions.hpp (+0/-194)
portable/libtorrent/include/libtorrent/extensions/logger.hpp (+0/-54)
portable/libtorrent/include/libtorrent/extensions/metadata_transfer.hpp (+0/-55)
portable/libtorrent/include/libtorrent/extensions/smart_ban.hpp (+0/-55)
portable/libtorrent/include/libtorrent/extensions/ut_metadata.hpp (+0/-55)
portable/libtorrent/include/libtorrent/extensions/ut_pex.hpp (+0/-54)
portable/libtorrent/include/libtorrent/file.hpp (+0/-140)
portable/libtorrent/include/libtorrent/file_pool.hpp (+0/-103)
portable/libtorrent/include/libtorrent/file_storage.hpp (+0/-147)
portable/libtorrent/include/libtorrent/fingerprint.hpp (+0/-95)
portable/libtorrent/include/libtorrent/gzip.hpp (+0/-52)
portable/libtorrent/include/libtorrent/hasher.hpp (+0/-122)
portable/libtorrent/include/libtorrent/http_connection.hpp (+0/-209)
portable/libtorrent/include/libtorrent/http_parser.hpp (+0/-111)
portable/libtorrent/include/libtorrent/http_stream.hpp (+0/-102)
portable/libtorrent/include/libtorrent/http_tracker_connection.hpp (+0/-106)
portable/libtorrent/include/libtorrent/identify_client.hpp (+0/-58)
portable/libtorrent/include/libtorrent/instantiate_connection.hpp (+0/-48)
portable/libtorrent/include/libtorrent/intrusive_ptr_base.hpp (+0/-85)
portable/libtorrent/include/libtorrent/invariant_check.hpp (+0/-78)
portable/libtorrent/include/libtorrent/io.hpp (+0/-153)
portable/libtorrent/include/libtorrent/ip_filter.hpp (+0/-317)
portable/libtorrent/include/libtorrent/kademlia/closest_nodes.hpp (+0/-117)
portable/libtorrent/include/libtorrent/kademlia/dht_tracker.hpp (+0/-175)
portable/libtorrent/include/libtorrent/kademlia/find_data.hpp (+0/-125)
portable/libtorrent/include/libtorrent/kademlia/logging.hpp (+0/-146)
portable/libtorrent/include/libtorrent/kademlia/msg.hpp (+0/-104)
portable/libtorrent/include/libtorrent/kademlia/node.hpp (+0/-262)
portable/libtorrent/include/libtorrent/kademlia/node_entry.hpp (+0/-76)
portable/libtorrent/include/libtorrent/kademlia/node_id.hpp (+0/-62)
portable/libtorrent/include/libtorrent/kademlia/observer.hpp (+0/-102)
portable/libtorrent/include/libtorrent/kademlia/refresh.hpp (+0/-214)
portable/libtorrent/include/libtorrent/kademlia/routing_table.hpp (+0/-254)
portable/libtorrent/include/libtorrent/kademlia/rpc_manager.hpp (+0/-141)
portable/libtorrent/include/libtorrent/kademlia/traversal_algorithm.hpp (+0/-161)
portable/libtorrent/include/libtorrent/lazy_entry.hpp (+0/-236)
portable/libtorrent/include/libtorrent/lsd.hpp (+0/-98)
portable/libtorrent/include/libtorrent/magnet_uri.hpp (+0/-66)
portable/libtorrent/include/libtorrent/natpmp.hpp (+0/-162)
portable/libtorrent/include/libtorrent/parse_url.hpp (+0/-59)
portable/libtorrent/include/libtorrent/pch.hpp (+0/-127)
portable/libtorrent/include/libtorrent/pe_crypto.hpp (+0/-126)
portable/libtorrent/include/libtorrent/peer.hpp (+0/-63)
portable/libtorrent/include/libtorrent/peer_connection.hpp (+0/-894)
portable/libtorrent/include/libtorrent/peer_id.hpp (+0/-203)
portable/libtorrent/include/libtorrent/peer_info.hpp (+0/-218)
portable/libtorrent/include/libtorrent/peer_request.hpp (+0/-49)
portable/libtorrent/include/libtorrent/piece_block_progress.hpp (+0/-57)
portable/libtorrent/include/libtorrent/piece_picker.hpp (+0/-548)
portable/libtorrent/include/libtorrent/policy.hpp (+0/-312)
portable/libtorrent/include/libtorrent/proxy_base.hpp (+0/-211)
portable/libtorrent/include/libtorrent/random_sample.hpp (+0/-74)
portable/libtorrent/include/libtorrent/session.hpp (+0/-366)
portable/libtorrent/include/libtorrent/session_settings.hpp (+0/-527)
portable/libtorrent/include/libtorrent/session_status.hpp (+0/-79)
portable/libtorrent/include/libtorrent/size_type.hpp (+0/-53)
portable/libtorrent/include/libtorrent/socket.hpp (+0/-252)
portable/libtorrent/include/libtorrent/socket_type.hpp (+0/-51)
portable/libtorrent/include/libtorrent/socks4_stream.hpp (+0/-92)
portable/libtorrent/include/libtorrent/socks5_stream.hpp (+0/-104)
portable/libtorrent/include/libtorrent/ssl_stream.hpp (+0/-228)
portable/libtorrent/include/libtorrent/stat.hpp (+0/-255)
portable/libtorrent/include/libtorrent/storage.hpp (+0/-431)
portable/libtorrent/include/libtorrent/time.hpp (+0/-412)
portable/libtorrent/include/libtorrent/torrent.hpp (+0/-1022)
portable/libtorrent/include/libtorrent/torrent_handle.hpp (+0/-503)
portable/libtorrent/include/libtorrent/torrent_info.hpp (+0/-258)
portable/libtorrent/include/libtorrent/tracker_manager.hpp (+0/-248)
portable/libtorrent/include/libtorrent/udp_socket.hpp (+0/-117)
portable/libtorrent/include/libtorrent/udp_tracker_connection.hpp (+0/-125)
portable/libtorrent/include/libtorrent/upnp.hpp (+0/-289)
portable/libtorrent/include/libtorrent/utf8.hpp (+0/-161)
portable/libtorrent/include/libtorrent/variant_stream.hpp (+0/-754)
portable/libtorrent/include/libtorrent/version.hpp (+0/-43)
portable/libtorrent/include/libtorrent/web_peer_connection.hpp (+0/-184)
portable/libtorrent/include/libtorrent/xml_parse.hpp (+0/-218)
portable/libtorrent/src/GeoIP.c (+0/-1038)
portable/libtorrent/src/Makefile.am (+0/-113)
portable/libtorrent/src/Makefile.in (+0/-811)
portable/libtorrent/src/alert.cpp (+0/-119)
portable/libtorrent/src/assert.cpp (+0/-141)
portable/libtorrent/src/broadcast_socket.cpp (+0/-274)
portable/libtorrent/src/bt_peer_connection.cpp (+0/-2744)
portable/libtorrent/src/connection_queue.cpp (+0/-286)
portable/libtorrent/src/create_torrent.cpp (+0/-273)
portable/libtorrent/src/disk_buffer_holder.cpp (+0/-70)
portable/libtorrent/src/disk_io_thread.cpp (+0/-1235)
portable/libtorrent/src/entry.cpp (+0/-419)
portable/libtorrent/src/enum_net.cpp (+0/-638)
portable/libtorrent/src/error_code.cpp (+0/-60)
portable/libtorrent/src/escape_string.cpp (+0/-401)
portable/libtorrent/src/file.cpp (+0/-367)
portable/libtorrent/src/file_pool.cpp (+0/-163)
portable/libtorrent/src/file_storage.cpp (+0/-166)
portable/libtorrent/src/gzip.cpp (+0/-213)
portable/libtorrent/src/http_connection.cpp (+0/-619)
portable/libtorrent/src/http_parser.cpp (+0/-245)
portable/libtorrent/src/http_stream.cpp (+0/-168)
portable/libtorrent/src/http_tracker_connection.cpp (+0/-464)
portable/libtorrent/src/identify_client.cpp (+0/-384)
portable/libtorrent/src/instantiate_connection.cpp (+0/-81)
portable/libtorrent/src/ip_filter.cpp (+0/-91)
portable/libtorrent/src/kademlia/closest_nodes.cpp (+0/-137)
portable/libtorrent/src/kademlia/dht_tracker.cpp (+0/-1002)
portable/libtorrent/src/kademlia/find_data.cpp (+0/-146)
portable/libtorrent/src/kademlia/node.cpp (+0/-515)
portable/libtorrent/src/kademlia/node_id.cpp (+0/-117)
portable/libtorrent/src/kademlia/refresh.cpp (+0/-180)
portable/libtorrent/src/kademlia/routing_table.cpp (+0/-475)
portable/libtorrent/src/kademlia/rpc_manager.cpp (+0/-498)
portable/libtorrent/src/kademlia/traversal_algorithm.cpp (+0/-193)
portable/libtorrent/src/lazy_bdecode.cpp (+0/-436)
portable/libtorrent/src/logger.cpp (+0/-232)
portable/libtorrent/src/lsd.cpp (+0/-208)
portable/libtorrent/src/magnet_uri.cpp (+0/-151)
portable/libtorrent/src/metadata_transfer.cpp (+0/-626)
portable/libtorrent/src/natpmp.cpp (+0/-552)
portable/libtorrent/src/parse_url.cpp (+0/-132)
portable/libtorrent/src/pe_crypto.cpp (+0/-161)
portable/libtorrent/src/peer_connection.cpp (+0/-4106)
portable/libtorrent/src/piece_picker.cpp (+0/-2269)
portable/libtorrent/src/policy.cpp (+0/-1322)
portable/libtorrent/src/session.cpp (+0/-628)
portable/libtorrent/src/session_impl.cpp (+0/-2646)
portable/libtorrent/src/sha1.cpp (+0/-319)
portable/libtorrent/src/smart_ban.cpp (+0/-308)
portable/libtorrent/src/socks4_stream.cpp (+0/-152)
portable/libtorrent/src/socks5_stream.cpp (+0/-332)
portable/libtorrent/src/stat.cpp (+0/-69)
portable/libtorrent/src/storage.cpp (+0/-2812)
portable/libtorrent/src/torrent.cpp (+0/-4853)
portable/libtorrent/src/torrent_handle.cpp (+0/-635)
portable/libtorrent/src/torrent_info.cpp (+0/-648)
portable/libtorrent/src/tracker_manager.cpp (+0/-284)
portable/libtorrent/src/udp_socket.cpp (+0/-634)
portable/libtorrent/src/udp_tracker_connection.cpp (+0/-525)
portable/libtorrent/src/upnp.cpp (+0/-1312)
portable/libtorrent/src/ut_metadata.cpp (+0/-460)
portable/libtorrent/src/ut_pex.cpp (+0/-418)
portable/libtorrent/src/web_peer_connection.cpp (+0/-731)
portable/menubar.py (+0/-298)
portable/messagehandler.py (+60/-27)
portable/messages.py (+37/-29)
portable/models.py (+0/-62)
portable/moviedata.py (+117/-84)
portable/olddatabaseupgrade.py (+0/-580)
portable/opml.py (+5/-5)
portable/player.py (+0/-67)
portable/playlist.py (+6/-5)
portable/prefs.py (+3/-1)
portable/schema.py (+54/-35)
portable/schemav79.py (+0/-580)
portable/search.py (+16/-16)
portable/searchengines.py (+27/-21)
portable/signals.py (+13/-13)
portable/singleclick.py (+34/-31)
portable/sorts.pyx (+0/-187)
portable/startup.py (+24/-21)
portable/storedatabase.py (+287/-96)
portable/subscription.py (+87/-82)
portable/tabs.py (+11/-10)
portable/test/__init__.py (+11/-8)
portable/test/bmachinetest.py (+0/-148)
portable/test/databasesanitytest.py (+31/-30)
portable/test/databasetest.py (+81/-55)
portable/test/datastructurestest.py (+39/-0)
portable/test/fasttypestest.py (+0/-224)
portable/test/feedparsertest.py (+22/-6)
portable/test/feedtest.py (+148/-143)
portable/test/filetypestest.py (+49/-9)
portable/test/framework.py (+33/-19)
portable/test/gtcachetest.py (+25/-22)
portable/test/httpclienttest.py (+807/-735)
portable/test/httpdownloadertest.py (+3/-3)
portable/test/iconcachetest.py (+0/-54)
portable/test/itemtest.py (+0/-159)
portable/test/messagetest.py (+141/-141)
portable/test/olddatabaseupgradetest.py (+0/-162)
portable/test/parseurltest.py (+18/-18)
portable/test/playlisttest.py (+42/-38)
portable/test/schedulertest.py (+23/-23)
portable/test/schematest.py (+24/-25)
portable/test/signalstest.py (+15/-14)
portable/test/storedatabasetest.py (+120/-55)
portable/test/strippertest.py (+42/-17)
portable/test/subscriptiontest.py (+48/-32)
portable/test/unicodetest.py (+145/-150)
portable/test/utiltest.py (+223/-54)
portable/test/xhtmltest.py (+0/-1)
portable/theme.py (+17/-16)
portable/trapcall.py (+1/-1)
portable/u3info.py (+1/-1)
portable/util.py (+429/-384)
portable/xhtmltools.py (+51/-39)
resources/app.config.template (+7/-7)
resources/locale/af.po (+2995/-0)
resources/locale/ar.po (+2302/-2187)
resources/locale/be.po (+0/-2895)
resources/locale/bg.po (+2527/-2260)
resources/locale/bn.po (+2279/-2160)
resources/locale/br.po (+2356/-2251)
resources/locale/bs.po (+2355/-2236)
resources/locale/ca.po (+2361/-2189)
resources/locale/ckb.po (+2287/-2156)
resources/locale/cs.po (+2497/-2284)
resources/locale/csb.po (+2283/-2164)
resources/locale/cy.po (+2510/-2359)
resources/locale/da.po (+2529/-2279)
resources/locale/de.po (+2453/-2284)
resources/locale/el.po (+2363/-2190)
resources/locale/en_AU.po (+2566/-2316)
resources/locale/en_CA.po (+2403/-2278)
resources/locale/en_GB.po (+2414/-2273)
resources/locale/eo.po (+2293/-2171)
resources/locale/es.po (+2555/-2292)
resources/locale/et.po (+2467/-2197)
resources/locale/eu.po (+2456/-2263)
resources/locale/export-strings.sh (+1/-1)
resources/locale/fa.po (+2285/-2160)
resources/locale/fi.po (+2399/-2273)
resources/locale/fil.po (+2316/-2200)
resources/locale/fo.po (+2279/-2160)
resources/locale/fr.po (+2430/-2299)
resources/locale/fy.po (+2287/-2168)
resources/locale/ga.po (+2363/-2200)
resources/locale/gl.po (+2425/-2282)
resources/locale/gu.po (+2283/-2164)
resources/locale/he.po (+2446/-2268)
resources/locale/hi.po (+2275/-2156)
resources/locale/hr.po (+2338/-2237)
resources/locale/hu.po (+2389/-2255)
resources/locale/id.po (+2467/-2251)
resources/locale/import-translations.py (+1/-1)
resources/locale/is.po (+2284/-2165)
resources/locale/it.po (+2555/-2306)
resources/locale/ja.po (+2289/-2171)
resources/locale/ka.po (+2297/-2175)
resources/locale/kk.po (+2278/-2159)
resources/locale/km.po (+0/-2873)
resources/locale/kn.po (+0/-2882)
resources/locale/ko.po (+2272/-2160)
resources/locale/ku.po (+2277/-2158)
resources/locale/lb.po (+2277/-2158)
resources/locale/lt.po (+2379/-2278)
resources/locale/lv.po (+2347/-2230)
resources/locale/messages.pot (+2271/-2152)
resources/locale/mk.po (+2362/-2267)
resources/locale/ml.po (+2280/-2161)
resources/locale/mr.po (+2283/-2164)
resources/locale/ms.po (+2337/-2179)
resources/locale/mt.po (+2996/-0)
resources/locale/nb.po (+2523/-2265)
resources/locale/nds.po (+2424/-2285)
resources/locale/ne.po (+2279/-2160)
resources/locale/nl.po (+2555/-2298)
resources/locale/nn.po (+3960/-2258)
resources/locale/oc.po (+2340/-2218)
resources/locale/pa.po (+2285/-2167)
resources/locale/pl.po (+2425/-2325)
resources/locale/pt.po (+2582/-2313)
resources/locale/pt_BR.po (+2395/-2250)
resources/locale/ro.po (+2418/-2325)
resources/locale/ru.po (+2433/-2296)
resources/locale/si.po (+2301/-2163)
resources/locale/sk.po (+2463/-2267)
resources/locale/sl.po (+2504/-2362)
resources/locale/sq.po (+2413/-2273)
resources/locale/sr.po (+2560/-2378)
resources/locale/sv.po (+2530/-2270)
resources/locale/ta.po (+2278/-2159)
resources/locale/te.po (+2313/-2179)
resources/locale/th.po (+2308/-2214)
resources/locale/tl.po (+2279/-2160)
resources/locale/tr.po (+2479/-2248)
resources/locale/uk.po (+2561/-2351)
resources/locale/ur.po (+2279/-2160)
resources/locale/vi.po (+2280/-2158)
resources/locale/zh_CN.po (+2299/-2175)
resources/locale/zh_HK.po (+2272/-2135)
resources/locale/zh_TW.po (+2284/-2164)
resources/locale/zu.po (+2278/-2159)
resources/searchengines/everyzing.xml.disabled (+0/-6)
resources/searchengines/mininova.xml (+0/-6)
resources/testdata/stripperdata/test9.expected (+1/-0)
resources/testdata/stripperdata/test9.in (+1/-0)
To merge this branch: bzr merge lp:~blueyed/ubuntu/lucid/miro/merge-from-sid
Reviewer Review Type Date Requested Status
Ubuntu branches Pending
Review via email: mp+23352@code.launchpad.net
To post a comment you must log in.
30. By Daniel Hahler

New upstream: 3.0.1-0ubuntu1

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'ADOPTERS'
--- ADOPTERS 1970-01-01 00:00:00 +0000
+++ ADOPTERS 2010-04-14 21:08:30 +0000
@@ -0,0 +1,245 @@
1Thanks to the following people who have adopted lines of Miro code to help
2support development! To adopt a line, visit the Miro Adoption Center at:
3http://www.getmiro.com/adopt/
4
5Leonieke Aalders
6Nick Adams
7Hussain Al-Nasser
8Daniel Albuquerque
9Jamie Anderson
10Kathryn Angi
11Derek Ares
12J Avot (10 lines)
13alex axim
14Barbara Ball
15Tony Ballhause
16gilberto banales
17Rajesh Barnabas
18Jeffrey Barribeau
19Mike Beltzner
20Sue Belzer
21Alexander Bethke (2 lines)
22Shawn Biddle
23Lukas Biewald
24Morris Birnbaum
25Clive Blackledge
26david blackman
27Grant Blakely (2 lines)
28Christopher Blizzard
29Jason Bobe
30Adam Booth
31Niels Olof Bouvin
32Paul Brinkkemper
33kim broughton
34Luc Brun
35Dale Bryant
36Craig Buckley
37andreas burger
38Lee Butkiewicz
39Percy Cabello
40Christian Calmeyer
41piero alberto calzolari
42Michael Cardoza
43Robert Carter
44Michael Castleman
45George Chriss
46KATHRYN COLBRESE
47Mary Colvig (2 lines)
48Suzanne Conboy-Hill
49Donald Coury
50Julien CROUZET
51Andrew Davies
52Christopher Davies (2 lines)
53Barnabas Davoti
54Frederik De Bleser
55Josh Deibert (2 lines)
56David Demchuk
57Sam Denison
58Christian Detweiler (2 lines)
59JEAN P DEVRIES
60Aaron Digulla (3 lines)
61valerie donelian
62Robert Doner
63Asa Dotzler
64Charles Douthat
65Janet Dragojevic
66Deirdre Dreslough
67Kevin Driscoll
68Scott Dylewski
69Robert Ebright
70Cassandra Echerd
71Kalmer Eek
72Morten Fahrnholz (2 lines)
73Richard Fenton
74Guillermo Fernandez
75Judith Finn
76David Freer
77Amy Frutin
78Michael Gallagher
79Owen Gallagher
80Enrico Gallesio
81Peter Gasston
82Jeremy Genaro
83Richard Giraud (5 lines)
84Alroger Luiz Gomes Filho
85Benjamin Goyette
86Sune Graaskov (2 lines)
87Hendrik Grahl
88brett gronow
89Sibylle Grosjean
90rufo guerreschi (3 lines)
91Beverly Gunter
92fALk Gärtner
93john haden
94Peter Haight
95Jay Harris
96Robert Harris
97Mark Hartsuyker (2 lines)
98Chris Helbling
99Steffen Hellmich
100Amanda Helman
101Chris Hemmings
102Xavier Hernandez
103Shaun Herrick
104Alexander Holman
105Jens Holze
106Jane Howell
107Anthony Hunt
108William W Hunter Jr
109Odin Hørthe Omdal
110Artur Iralin
111Shafqat Islam
112Joshua Jacobs
113Nathanael T. Jady
114Barbara Jansen
115Dean Jansen (3 lines)
116Joakim Jardenberg
117beverly jones
118Mike Jones
119Jeffrey Joseph
120Stephen Judge
121Will Kahn-Greene
122Sandra Kallmeyer
123Cristie Kamiya
124hayden karel chambers
125Matthew Katz
126Ryan Kelln
127Tommy Kelly
128Declan Kennedy
129Henry Kielarowski
130Virgil King (2 lines)
131Amanda Knutson
132Laust Ladefoged
133Susan M. LaFleur
134Brent Laminack
135Matthew Lancey
136Sheila Marie Lane
137Youcef Laribi
138First Last (11 lines)
139IP managers Leogriff
140Carlos Eduardo Livino
141Brandon Low
142David Luff
143Adam Lynn
144Stefan Magdalinski (5 lines)
145Jonathan Markow
146Manuel Martins (3 lines)
147Marcelino Mata
148Pierre McCann
149Jock McTavish
150Robert Meeks
151Kevin Metz
152Peter Vestergaard Michaelsen
153Michael Middleton
154Joyce Miletic
155Chad Miller
156Xander Mol
157David Moore
158Tom Moore
159MR DOMINIQUE GUMPELSON MR DOMINIQUE GUMPELSON
160Patrick Mulcahy
161Theron Muller
162JACK MYERS
163Mary Nichols
164Chelsea Novak
165Christian O'Brien
166Kevin O'Brien
167Damon Oehlman
168thomas orieux
169Paul Ortega
170Christian Otkjaer
171Linux Outlaws
172Carolyn Papworth
173Andrew Parfitt
174Heather Parham (6 lines)
175alberto pastori
176Carl Pelletier
177katharine perkins
178Dominic Perry
179greg peterson
180Frank Petrie
181danielle pickett
182John Pickrell
183Christopher Pille
184Jacqueline Plage
185Alex Polvi (2 lines)
186Vidal Postigo
187Debora Prado
188Matthew Quarisa
189William Quiviger
190Douglas Radcliffe
191Mads Rahbek Hougaard
192Joseph Raine
193Stéphane Rangaya
194Chris Reidenouer
195Guillermo Restrepo
196Nick Reville
197Crispino Reyes
198lars riber
199Premasagar Rose
200David Rosen
201Marty Sandler
202Ilari Sani
203Zachary Sarver (2 lines)
204Christopher Savory
205Ivo Schmid
206Rachel Shadoan
207Motek Sherman
208Derek Shields
209Derek Slenk
210Robert Smol
211Rodrigo Starr
212Patrick Stedem
213Ian Sullivan
214James Sutherland
215Stephen and Lucinda Swartz
216Istvan Szenasi
217Carol Tardif
218Ean Thompson
219Richard Thompson
220Aidan Thomson (2 lines)
221Terry Thorpe (3 lines)
222Alex Torrenegra
223Arthur J Towson
224Dan Trevino
225Ed Triebe
226Troy Truchon (2 lines)
227Audun Vaaler
228Ana Valdes
229Thomas van de Hoef
230Eric Van Haesendonck
231Gerald Vandecar
232Leonard Verwey
233Jacques Vroom
234Daniel Walmsley (2 lines)
235Paul Walsh
236Christopher Webber
237Harald Weiss
238Daniel Wichlacz
239Rainer Wolf
240Christina Xu
241VJ Yetimon
242Deg yong Yu
243Friedrich Zettl
244Fabricio Zuardi
245per åström
0246
=== removed file 'ADOPTERS'
--- ADOPTERS 2010-02-20 02:34:26 +0000
+++ ADOPTERS 1970-01-01 00:00:00 +0000
@@ -1,247 +0,0 @@
1Thanks to the following people who have adopted lines of Miro code to help
2support development! To adopt a line, visit the Miro Adoption Center at:
3http://www.getmiro.com/adopt/
4
5Leonieke Aalders
6Nick Adams
7Hussain Al-Nasser
8Daniel Albuquerque
9Muhammad Alli
10Jamie Anderson
11Derek Ares
12J Avot (10 lines)
13alex axim
14ESSAM AZEEBI
15Barbara Ball
16Tony Ballhause
17gilberto banales
18Christine Banks
19Rajesh Barnabas
20Jeffrey Barribeau
21Michael Belanger
22Mike Beltzner
23Sue Belzer
24Alexander Bethke (2 lines)
25Shawn Biddle
26Lukas Biewald
27Morris Birnbaum
28Clive Blackledge
29david blackman
30Grant Blakely (2 lines)
31Christopher Blizzard
32Jason Bobe
33Adam Booth
34Niels Olof Bouvin
35Paul Brinkkemper
36kim broughton
37Luc Brun
38Dale Bryant
39Craig Buckley
40Lee Butkiewicz
41Percy Cabello
42Christian Calmeyer
43piero alberto calzolari
44Michael Cardoza
45Robert Carter
46Michael Castleman
47George Chriss
48KATHRYN COLBRESE
49Mary Colvig (2 lines)
50Suzanne Conboy-Hill
51Donald Coury
52Julien CROUZET
53Andrew Davies
54Christopher Davies (2 lines)
55Barnabas Davoti
56Dennis Day (2 lines)
57Frederik De Bleser
58Josh Deibert (2 lines)
59David Demchuk
60Christian Detweiler (2 lines)
61JEAN P DEVRIES
62valerie donelian
63Robert Doner
64Asa Dotzler
65Charles Douthat
66Janet Dragojevic
67Deirdre Dreslough
68Kevin Driscoll
69Scott Dylewski
70Robert Ebright
71Cassandra Echerd
72Kalmer Eek
73Roland Engelhardt
74Morten Fahrnholz (2 lines)
75Richard Fenton
76Guillermo Fernandez
77Judith Finn
78David Freer
79Michael Gallagher
80Owen Gallagher
81Enrico Gallesio
82Peter Gasston
83Jeremy Genaro
84Richard Giraud (5 lines)
85Alroger Luiz Gomes Filho
86Benjamin Goyette
87Sune Graaskov (2 lines)
88Hendrik Grahl
89brett gronow
90Sibylle Grosjean
91rufo guerreschi (3 lines)
92Beverly Gunter
93fALk Gärtner
94john haden
95Peter Haight
96Jay Harris
97Robert Harris
98Mark Hartsuyker (2 lines)
99Chris Helbling
100Steffen Hellmich
101Amanda Helman
102Chris Hemmings
103Xavier Hernandez
104Shaun Herrick
105Alexander Holman
106Jens Holze
107Jane Howell
108William W Hunter Jr
109Odin Hørthe Omdal
110Artur Iralin
111Shafqat Islam
112Joshua Jacobs
113Nathanael T. Jady
114Barbara Jansen
115Dean Jansen (3 lines)
116Joakim Jardenberg
117beverly jones
118Mike Jones
119Jeffrey Joseph
120Stephen Judge
121Will Kahn-Greene
122Sandra Kallmeyer
123Cristie Kamiya
124hayden karel chambers
125Matthew Katz
126Ryan Kelln
127Tommy Kelly
128Declan Kennedy
129Henry Kielarowski
130Virgil King (2 lines)
131Dennis Kitt
132Amanda Knutson
133Laust Ladefoged
134Susan M. LaFleur
135Brent Laminack
136Matthew Lancey
137Sheila Marie Lane
138Youcef Laribi
139First Last (11 lines)
140IP managers Leogriff
141Carlos Eduardo Livino
142Brandon Low
143David Luff
144Adam Lynn
145Stefan Magdalinski (10 lines)
146Jonathan Markow
147Manuel Martins (3 lines)
148Marcelino Mata
149Pierre McCann
150Ian McMurtrie
151Jock McTavish
152Robert Meeks
153Michael Meiser
154Kevin Metz
155Peter Vestergaard Michaelsen
156Michael Middleton
157Chad Miller
158Xander Mol
159Henrik Moltke (2 lines)
160Horacio Monteverde (3 lines)
161David Moore
162Tom Moore
163MR DOMINIQUE GUMPELSON MR DOMINIQUE GUMPELSON
164Patrick Mulcahy
165Theron Muller
166JACK MYERS
167Mary Nichols
168Chelsea Novak
169Christian O'Brien
170Kevin O'Brien
171Damon Oehlman
172thomas orieux
173Paul Ortega
174Christian Otkjaer
175Linux Outlaws
176Sean Palladino
177Carolyn Papworth
178Andrew Parfitt
179Heather Parham (6 lines)
180alberto pastori
181Carl Pelletier
182katharine perkins
183Dominic Perry
184Frank Petrie
185danielle pickett
186Christopher Pille
187Jacqueline Plage
188Alex Polvi (2 lines)
189Vidal Postigo
190Debora Prado
191Matthew Quarisa
192William Quiviger
193Douglas Radcliffe
194Mads Rahbek Hougaard
195Joseph Raine
196Stéphane Rangaya
197Chris Reidenouer
198Guillermo Restrepo
199Nick Reville
200Crispino Reyes
201lars riber
202Premasagar Rose
203David Rosen
204Ilari Sani
205Zachary Sarver (2 lines)
206Christopher Savory
207Ivo Schmid
208Peter Schmidt
209Rachel Shadoan
210Motek Sherman
211Derek Shields
212Derek Slenk
213Robert Smol
214Rodrigo Starr
215Patrick Stedem
216James Sutherland
217Stephen and Lucinda Swartz
218Istvan Szenasi
219Carol Tardif
220Ean Thompson
221Richard Thompson
222Aidan Thomson (2 lines)
223Terry Thorpe (3 lines)
224Alex Torrenegra
225Arthur J Towson
226Dan Trevino
227Ed Triebe
228Troy Truchon (2 lines)
229Audun Vaaler
230Ana Valdes
231Thomas van de Hoef
232Eric Van Haesendonck
233Gerald Vandecar
234Bas Verhoeven
235Leonard Verwey
236Jacques Vroom
237Daniel Walmsley (2 lines)
238Paul Walsh
239Christopher Webber
240Harald Weiss
241Daniel Wichlacz
242Rainer Wolf
243Christina Xu
244VJ Yetimon
245Deg yong Yu
246Fabricio Zuardi
247per åström
2480
=== modified file 'CREDITS'
--- CREDITS 2009-10-25 00:24:34 +0000
+++ CREDITS 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
33
4=======4=======
5CREDITS5CREDITS
66
=== modified file 'LAYOUT'
--- LAYOUT 2009-10-25 00:24:34 +0000
+++ LAYOUT 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
33
4======4======
5LAYOUT5LAYOUT
66
=== modified file 'MIRO_ROOT'
--- MIRO_ROOT 2009-03-09 12:46:19 +0000
+++ MIRO_ROOT 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
33
4Hi,4Hi,
55
66
=== modified file 'README'
--- README 2010-02-20 02:34:26 +0000
+++ README 2010-04-14 21:08:30 +0000
@@ -14,9 +14,9 @@
14It is written primarily in Python and is distributed under the terms14It is written primarily in Python and is distributed under the terms
15of the GNU General Public License; see license.txt.15of the GNU General Public License; see license.txt.
1616
17Prebuilt versions are available from::17Binaries are available from::
1818
19 http://www.getmiro.com/downloads/19 http://www.getmiro.com/
2020
21Development information, instructions on how to submit bug reports,21Development information, instructions on how to submit bug reports,
22source code, information on mailing lists, and other22source code, information on mailing lists, and other
2323
=== modified file 'debian/README.Debian'
--- debian/README.Debian 2009-06-27 13:27:30 +0000
+++ debian/README.Debian 2010-04-14 21:08:30 +0000
@@ -12,28 +12,9 @@
1212
13 * You can install 'python-psyco' which will likely speed up Miro a bit.13 * You can install 'python-psyco' which will likely speed up Miro a bit.
1414
15 * If you want to redirect the sound output (but not video) to another15 * For even further audio/video support you can also install the following:
16 host via 'esddsp' here's what you have to do:16
1717 $ apt-get install gstreamer0.10-plugins-ugly
18 - Edit ~/.xine/config to say 'audio.driver:esd' on your localhost.
19
20 - Start an esd server on another (remote) host, e.g.
21 using 'esd -public -tcp'. Make sure you allow connections to your
22 esd server (check firewall settings for port 16001 and your
23 /etc/hosts.allow and /etc/hosts.deny).
24
25 - Now run 'esddsp -s xxx.xxx.xxx.xxx:16001 miro' on localhost, where
26 xxx.xxx.xxx.xxx is the IP address of the host where esd runs.
27 The video will now be displayed on localhost, audio will be redirected
28 to the remote host's esd.
29
30 * If you experience segfaults or incorrect colors with Miro and certain
31 X.org drivers, please try 'miro --set xine-driver=xhsm' as a work-around,
32 or, alternatively, use the gstreamer renderer (set it in the "Options"
33 dialog or run 'miro --set renderer=gstreamer'). See
34 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=459069
35 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=473310
36 for more information on this issue.
3718
38 * If you experience Miro crashes/segfaults, please install 'gdb' and then19 * If you experience Miro crashes/segfaults, please install 'gdb' and then
39 run 'miro --debug' (which runs Miro in gdb) and try to reproduce the20 run 'miro --debug' (which runs Miro in gdb) and try to reproduce the
@@ -41,21 +22,7 @@
41 output (type e.g. "bt" on the gdb prompt after the crash).22 output (type e.g. "bt" on the gdb prompt after the crash).
4223
43 If needed, please also install additional -dbg packages, e.g.24 If needed, please also install additional -dbg packages, e.g.
44 python2.5-dbg, python-gtk2-dbg, or xulrunner-1.9-dbg.25 python2.6-dbg, python-gtk2-dbg, or xulrunner-1.9.2-dbg.
4526
46 * The default Miro renderer in Debian is xine. If you want to switch to27 -- Uwe Hermann <uwe@debian.org>, Sat, 20 Mar 2010 15:29:57 +0100
47 gstreamer, you have to install a number of additional packages and switch
48 to gstreamer in the Miro options (and restart Miro). Alternatively,
49 you can start Miro via 'miro --set renderer=gstreamer'.
50
51 You'll need at least the following packages for gstreamer:
52
53 $ apt-get install python-gst0.10 gstreamer0.10-plugins-base \
54 gstreamer0.10-plugins-good gstreamer0.10-x gstreamer0.10-ffmpeg
55
56 For even further audio/video support you can also install the following:
57
58 $ apt-get install gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly
59
60 -- Uwe Hermann <uwe@debian.org>, Tue, 10 Feb 2009 22:57:26 +0100
6128
6229
=== modified file 'debian/changelog'
--- debian/changelog 2010-02-21 03:47:01 +0000
+++ debian/changelog 2010-04-14 21:08:30 +0000
@@ -1,3 +1,45 @@
1miro (3.0.1-0ubuntu1) lucid; urgency=low
2
3 * New upstream bugfix release.
4
5 -- Daniel Hahler <ubuntu@thequod.de> Wed, 14 Apr 2010 22:05:05 +0200
6
7miro (3.0-1ubuntu1) lucid; urgency=low
8
9 * Merge from Debian unstable (LP: #548389), remaining changes:
10 - 100_catch_keyerror_in_update_items.patch: Catch exception
11 caused by out of bounds array index.
12 - 101_player_undefined_elapsed_time.patch: There are some cases
13 where the elapsed_time returned is undefined; use a current
14 time of 0 in this case when fast-forwarding.
15 - debian/control, debian/pyversions, debian/README.Debian:
16 Build with python 2.6 and xulrunner 1.9.2
17 * Dropped 90_miro_boost_py26.patch: does not apply anymore.
18
19 -- Daniel Hahler <ubuntu@thequod.de> Tue, 13 Apr 2010 21:21:17 +0200
20
21miro (3.0-1) unstable; urgency=low
22
23 * New upstream release (Closes: #575463).
24 + The xine backend was removed upstream, we use gstreamer only now.
25 + Drop (build-)dependency on all Boost packages, no longer used upstream.
26 + debian/patches/20_no_autoupdate.patch: Update.
27 + debian/patches/30_disable_xine_hack.patch: Drop, obsolete.
28 + debian/patches/40_boost_python.patch: Drop, obsolete.
29 + debian/patches/80_xine_default_renderer.patch: Drop, obsolete.
30 * Closing non-reproducible bugs with this release. Please reopen if needed.
31 + "No sound when playing videos" (Closes: #527261).
32 + "Two internal errors on startup" (Closes: #557347).
33 + "Miro "internal error" and odd behavior" (Closes: #574822).
34 + "Miro crashes after starts playing a video" (Closes: #522102).
35 * Standards-Version: 3.8.4 (no changes required).
36 * debian/miro.docs: Add ADOPTERS file.
37 * debian/README.Debian: Drop xine related sections.
38 * debian/rules: Simplified clean target.
39 * debian/copyright: Updates (Boost and libtorrent stuff is gone).
40
41 -- Uwe Hermann <uwe@debian.org> Sun, 28 Mar 2010 01:02:12 +0200
42
1miro (2.5.4-1ubuntu2) lucid; urgency=low43miro (2.5.4-1ubuntu2) lucid; urgency=low
244
3 * debian/control: Migrate from xulrunner-1.9.1 to xulrunner-1.9.2 45 * debian/control: Migrate from xulrunner-1.9.1 to xulrunner-1.9.2
446
=== modified file 'debian/control'
--- debian/control 2010-02-21 03:47:01 +0000
+++ debian/control 2010-04-14 21:08:30 +0000
@@ -8,22 +8,16 @@
8 python2.6,8 python2.6,
9 python-support (>= 0.6),9 python-support (>= 0.6),
10 python-pyrex (>= 0.9.6.4),10 python-pyrex (>= 0.9.6.4),
11 libboost-python-dev,
12 libboost-filesystem-dev,
13 libboost-date-time-dev,
14 libboost-thread-dev,
15 libboost-serialization-dev,
16 python-libtorrent (>= 0.14.2),11 python-libtorrent (>= 0.14.2),
17 libtorrent-rasterbar-dev (>= 0.14.2),12 libtorrent-rasterbar-dev (>= 0.14.2),
18 python-gtk2-dev,13 python-gtk2-dev,
19 python-gnome2-extras-dev (>= 2.19.1),14 python-gnome2-extras-dev (>= 2.19.1),
20 xulrunner-dev (>= 1.9.2),15 xulrunner-dev (>= 1.9.2),
21 libxine-dev (>= 1.1.12),
22 pkg-config,16 pkg-config,
23 libxv-dev,17 libxv-dev,
24 libssl-dev,18 libssl-dev,
25 libffi-dev19 libffi-dev
26Standards-Version: 3.8.320Standards-Version: 3.8.4
27Homepage: http://www.getmiro.com21Homepage: http://www.getmiro.com
2822
29Package: miro23Package: miro
@@ -38,20 +32,18 @@
38 python-glade2,32 python-glade2,
39 python-pysqlite2,33 python-pysqlite2,
40 python-libtorrent (>= 0.14.2),34 python-libtorrent (>= 0.14.2),
41 libxine1-x (>= 1.1.12),35 python-gst0.10 (>= 0.10.0),
42 libxine1-plugins (>= 1.1.12),36 gstreamer0.10-x (>= 0.10.0),
37 gstreamer0.10-ffmpeg (>= 0.10.0),
38 gstreamer0.10-plugins-base (>= 0.10.0),
39 gstreamer0.10-plugins-good (>= 0.10.0),
40 gstreamer0.10-plugins-bad (>= 0.10.0),
43 xulrunner-1.9.2,41 xulrunner-1.9.2,
44 miro-data (>= 2.5.4)42 miro-data (>= 3.0-1)
45Recommends: python-psyco [i386 hurd-i386 netbsd-i386 kfreebsd-i386]43Recommends: python-psyco [i386 hurd-i386 netbsd-i386 kfreebsd-i386]
46Suggests: ttf-dejavu,44Suggests: ttf-dejavu,
47 python-notify,45 python-notify,
48 python-gst0.10 (>= 0.10.0),46 gstreamer0.10-plugins-ugly (>= 0.10.0)
49 gstreamer0.10-plugins-base (>= 0.10.0),
50 gstreamer0.10-plugins-good (>= 0.10.0),
51 gstreamer0.10-plugins-bad (>= 0.10.0),
52 gstreamer0.10-plugins-ugly (>= 0.10.0),
53 gstreamer0.10-x (>= 0.10.0),
54 gstreamer0.10-ffmpeg (>= 0.10.0)
55Conflicts: miro-data (<< 1.2.1)47Conflicts: miro-data (<< 1.2.1)
56Description: GTK+ based RSS video aggregator48Description: GTK+ based RSS video aggregator
57 Miro (previously known as Democracy Player) is a platform for Internet49 Miro (previously known as Democracy Player) is a platform for Internet
5850
=== modified file 'debian/copyright'
--- debian/copyright 2009-10-25 00:24:34 +0000
+++ debian/copyright 2010-04-14 21:08:30 +0000
@@ -1,7 +1,6 @@
1This package was debianized by Uwe Hermann <uwe@debian.org> on1This work was packaged for Debian by:
2Mon, 12 Jun 2006 13:34:47 +0200
32
4The current Debian maintainer is Uwe Hermann <uwe@debian.org>.3 Uwe Hermann <uwe@debian.org> on Mon, 12 Jun 2006 13:34:47 +0200
54
6It was downloaded from:5It was downloaded from:
76
@@ -146,251 +145,10 @@
146Copyright: © 2003 - 2007 Arvid Norberg145Copyright: © 2003 - 2007 Arvid Norberg
147License: BSD-3146License: BSD-3
148147
149-------------------------------------------------------------------------------148------------------------------------------------------------------------------
150
151Files: portable/libtorrent/bindings/python/src/*
152Copyright: © 2006 - 2007 Daniel Wallin
153License: other
154 Boost Software License - Version 1.0 - August 17th, 2003
155
156 Permission is hereby granted, free of charge, to any person or organization
157 obtaining a copy of the software and accompanying documentation covered by
158 this license (the "Software") to use, reproduce, display, distribute,
159 execute, and transmit the Software, and to prepare derivative works of the
160 Software, and to permit third-parties to whom the Software is furnished to
161 do so, all subject to the following:
162
163 The copyright notices in the Software and this entire statement, including
164 the above license grant, this restriction and the following disclaimer,
165 must be included in all copies of the Software, in whole or in part, and
166 all derivative works of the Software, unless such copies or derivative
167 works are solely in the form of machine-executable object code generated by
168 a source language processor.
169
170 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
171 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
172 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
173 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
174 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
175 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
176 DEALINGS IN THE SOFTWARE.
177
178-------------------------------------------------------------------------------
179
180Files: */python/src/extensions.cpp,
181 */python/src/session.cpp
182Copyright: © 2006 - 2007 Daniel Wallin,
183 © 2006 - 2007 Arvid Norberg
184License: other
185 Boost Software License - Version 1.0 - August 17th, 2003
186
187 Permission is hereby granted, free of charge, to any person or organization
188 obtaining a copy of the software and accompanying documentation covered by
189 this license (the "Software") to use, reproduce, display, distribute,
190 execute, and transmit the Software, and to prepare derivative works of the
191 Software, and to permit third-parties to whom the Software is furnished to
192 do so, all subject to the following:
193
194 The copyright notices in the Software and this entire statement, including
195 the above license grant, this restriction and the following disclaimer,
196 must be included in all copies of the Software, in whole or in part, and
197 all derivative works of the Software, unless such copies or derivative
198 works are solely in the form of machine-executable object code generated by
199 a source language processor.
200
201 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
202 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
203 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
204 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
205 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
206 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
207 DEALINGS IN THE SOFTWARE.
208
209-------------------------------------------------------------------------------
210
211Files: */include/libtorrent/alert.hpp,
212 */include/libtorrent/random_sample.hpp,
213 */include/libtorrent/variant_stream.hpp,
214 */include/libtorrent/invariant_check.hpp,
215 */include/libtorrent/kademlia/refresh.hpp,
216 */include/libtorrent/kademlia/find_data.hpp,
217 */include/libtorrent/kademlia/closest_nodes.hpp,
218 */include/libtorrent/kademlia/traversal_algorithm.hpp,
219 */include/libtorrent/kademlia/logging.hpp,
220 */libtorrent/src/alert.cpp,
221 */libtorrent/src/storage.cpp,
222 */libtorrent/src/kademlia/refresh.cpp,
223 */libtorrent/src/kademlia/find_data.hpp,
224 */libtorrent/src/kademlia/closest_nodes.hpp,
225 */libtorrent/src/kademlia/traversal_algorithm.hpp
226Copyright: © 2003 - 2007 Daniel Wallin,
227 © 2003 - 2007 Arvid Norberg
228License: BSD-3
229
230-------------------------------------------------------------------------------
231
232Files: */include/libtorrent/allocate_resources.hpp,
233 */include/libtorrent/aux_/allocate_resources_impl.hpp
234Copyright: © 2003 Magnus Jonsson
235License: BSD-3
236
237-------------------------------------------------------------------------------
238
239Files: */include/libtorrent/resource_request.hpp,
240 */include/libtorrent/bt_peer_connection.hpp,
241 */libtorrent/src/allocate_resources.cpp,
242 */libtorrent/src/file_win.cpp,
243 */libtorrent/src/session.cpp,
244 */libtorrent/src/session_impl.cpp
245Copyright: © 2003 - 2007 Magnus Jonsson,
246 © 2003 - 2007 Arvid Norberg
247License: BSD-3
248
249-------------------------------------------------------------------------------
250
251Files: */include/libtorrent/extensions/ut_pex.hpp
252Copyright: © 2006 MassaRoddel
253License: BSD-3
254
255-------------------------------------------------------------------------------
256
257Files: */libtorrent/src/ut_pex.hpp
258Copyright: © 2006 MassaRoddel,
259 © 2006 Arvid Norberg
260License: BSD-3
261
262-------------------------------------------------------------------------------
263
264Files: */include/libtorrent/pe_crypto.hpp,
265 */libtorrent/src/pe_crypto.cpp
266Copyright: © 2007 Un Shayam
267License: BSD-3
268
269-------------------------------------------------------------------------------
270
271Files: */libtorrent/src/bt_peer_connection.cpp
272Copyright: © 2007 Un Shayam,
273 © 2003 - 2007 Avrid Norberg
274License: BSD-3
275
276-------------------------------------------------------------------------------
277
278Files: */include/libtorrent/utf8.hpp
279Copyright: © 2004 - 2005 Cory Nelson
280License: other
281 This software is provided 'as-is', without any express or implied
282 warranty. In no event will the authors be held liable for any damages
283 arising from the use of this software.
284
285 Permission is granted to anyone to use this software for any purpose,
286 including commercial applications, and to alter it and redistribute it
287 freely, subject to the following restrictions:
288
289 1. The origin of this software must not be misrepresented; you must not
290 claim that you wrote the original software. If you use this software
291 in a product, an acknowledgment in the product documentation would be
292 appreciated but is not required.
293 2. Altered source versions must be plainly marked as such, and must not be
294 misrepresented as being the original software.
295 3. This notice may not be removed or altered from any source distribution.
296
297-------------------------------------------------------------------------------
298
299Files: */libtorrent/asio/*,
300 */libtorrent/asio/ssl/context_base.hpp,
301 */libtorrent/asio/ssl/detail/openssl_types.hpp,
302 */libtorrent/asoi/ssl/stream_base.hpp
303Copyright: © 2003 - 2007 Christopher M. Kohlhoff <chris@kohlhoff.com>
304License: other
305 Boost Software License - Version 1.0 - August 17th, 2003
306
307 Permission is hereby granted, free of charge, to any person or organization
308 obtaining a copy of the software and accompanying documentation covered by
309 this license (the "Software") to use, reproduce, display, distribute,
310 execute, and transmit the Software, and to prepare derivative works of the
311 Software, and to permit third-parties to whom the Software is furnished to
312 do so, all subject to the following:
313
314 The copyright notices in the Software and this entire statement, including
315 the above license grant, this restriction and the following disclaimer,
316 must be included in all copies of the Software, in whole or in part, and
317 all derivative works of the Software, unless such copies or derivative
318 works are solely in the form of machine-executable object code generated by
319 a source language processor.
320
321 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
322 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
323 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
324 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
325 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
326 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
327 DEALINGS IN THE SOFTWARE.
328
329-------------------------------------------------------------------------------
330
331Files: */libtorrent/asio/ssl/*
332Copyright: © 2003 - 2007 Christopher M. Kohlhoff <chris@kohlhoff.com>,
333 © 2005 Voipster <Indrek.Juhani@voipster.com>
334License: other
335 Boost Software License - Version 1.0 - August 17th, 2003
336
337 Permission is hereby granted, free of charge, to any person or organization
338 obtaining a copy of the software and accompanying documentation covered by
339 this license (the "Software") to use, reproduce, display, distribute,
340 execute, and transmit the Software, and to prepare derivative works of the
341 Software, and to permit third-parties to whom the Software is furnished to
342 do so, all subject to the following:
343
344 The copyright notices in the Software and this entire statement, including
345 the above license grant, this restriction and the following disclaimer,
346 must be included in all copies of the Software, in whole or in part, and
347 all derivative works of the Software, unless such copies or derivative
348 works are solely in the form of machine-executable object code generated by
349 a source language processor.
350
351 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
352 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
353 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
354 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
355 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
356 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
357 DEALINGS IN THE SOFTWARE.
358
359-------------------------------------------------------------------------------
360
361Files: */libtorrent/asio/detail/kqueue_reactor.hpp,
362 */libtorrent/asio/detail/kqueue_reactor_fwd.hpp
363Copyright: © 2003 - 2007 Christopher M. Kohlhoff <chris@kohlhoff.com>,
364 © 2005 Stefan Arentz <stefan@soze.com>
365License: other
366 Boost Software License - Version 1.0 - August 17th, 2003
367
368 Permission is hereby granted, free of charge, to any person or organization
369 obtaining a copy of the software and accompanying documentation covered by
370 this license (the "Software") to use, reproduce, display, distribute,
371 execute, and transmit the Software, and to prepare derivative works of the
372 Software, and to permit third-parties to whom the Software is furnished to
373 do so, all subject to the following:
374
375 The copyright notices in the Software and this entire statement, including
376 the above license grant, this restriction and the following disclaimer,
377 must be included in all copies of the Software, in whole or in part, and
378 all derivative works of the Software, unless such copies or derivative
379 works are solely in the form of machine-executable object code generated by
380 a source language processor.
381
382 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
383 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
384 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
385 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
386 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
387 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
388 DEALINGS IN THE SOFTWARE.
389
390-------------------------------------------------------------------------------
391149
392Files: debian/*150Files: debian/*
393Copyright: © 2006 - 2009 Uwe Hermann <uwe@debian.org>151Copyright: © 2006 - 2010 Uwe Hermann <uwe@debian.org>
394License: PD152License: PD
395 The packaging done by Uwe Hermann <uwe@debian.org> is hereby153 The packaging done by Uwe Hermann <uwe@debian.org> is hereby
396 released as public domain.154 released as public domain.
397155
=== modified file 'debian/miro.docs'
--- debian/miro.docs 2008-08-18 07:53:05 +0000
+++ debian/miro.docs 2010-04-14 21:08:30 +0000
@@ -1,2 +1,3 @@
1README1README
2CREDITS2CREDITS
3ADOPTERS
34
=== modified file 'debian/patches/20_no_autoupdate.patch'
--- debian/patches/20_no_autoupdate.patch 2009-02-11 22:46:45 +0000
+++ debian/patches/20_no_autoupdate.patch 2010-04-14 21:08:30 +0000
@@ -1,8 +1,8 @@
1--- portable/startup.py.orig 2009-02-08 21:03:01.000000000 +01001--- portable/startup.py.orig 2010-03-28 00:44:51.000000000 +0100
2+++ portable/startup.py 2009-02-08 21:03:13.000000000 +01002+++ portable/startup.py 2010-03-28 00:45:01.000000000 +0100
3@@ -250,7 +250,7 @@3@@ -304,7 +304,7 @@
4 yield None4 yield None
5 parse_command_line_args()5 commandline.startup()
6 yield None6 yield None
7- autoupdate.check_for_updates()7- autoupdate.check_for_updates()
8+ # autoupdate.check_for_updates()8+ # autoupdate.check_for_updates()
99
=== removed file 'debian/patches/30_disable_xine_hack.patch'
--- debian/patches/30_disable_xine_hack.patch 2009-10-25 00:24:34 +0000
+++ debian/patches/30_disable_xine_hack.patch 1970-01-01 00:00:00 +0000
@@ -1,15 +0,0 @@
1# This seems to cause segfaults with newer libxine (?) releases, so disable it.
2# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=512719
3# http://bugzilla.pculture.org/show_bug.cgi?id=11263
4
5--- platform/gtk-x11/plat/options.py.orig 2009-07-24 15:11:34.000000000 +0200
6+++ platform/gtk-x11/plat/options.py 2009-07-24 15:11:42.000000000 +0200
7@@ -51,7 +51,7 @@
8 help="Which renderer to use. (gstreamer, xine)" )
9
10 USE_XINE_XV_HACK = GTKPref(key="UseXineXVHack",
11- default=True,
12+ default=False,
13 alias="xine-xvhack",
14 help="Whether or not to use the Xine xv hack. (true, false)" )
15
160
=== removed file 'debian/patches/80_xine_default_renderer.patch'
--- debian/patches/80_xine_default_renderer.patch 2009-10-25 00:24:34 +0000
+++ debian/patches/80_xine_default_renderer.patch 1970-01-01 00:00:00 +0000
@@ -1,14 +0,0 @@
1# For now, keep xine as default renderer and make gstreamer optional.
2# This saves quite some disk space in dependency packages (e.g. for netbooks).
3
4--- platform/gtk-x11/plat/options.py.orig 2009-07-24 15:20:37.000000000 +0200
5+++ platform/gtk-x11/plat/options.py 2009-07-24 15:20:43.000000000 +0200
6@@ -46,7 +46,7 @@
7 self.help = help
8
9 USE_RENDERER = GTKPref(key="useRenderer",
10- default=u"gstreamer",
11+ default=u"xine",
12 alias="renderer",
13 help="Which renderer to use. (gstreamer, xine)" )
14
150
=== removed file 'debian/patches/90_miro_boost_py26.patch'
--- debian/patches/90_miro_boost_py26.patch 2010-01-19 22:42:30 +0000
+++ debian/patches/90_miro_boost_py26.patch 1970-01-01 00:00:00 +0000
@@ -1,16 +0,0 @@
1diff -Nurp miro-2.5.3/platform/gtk-x11/setup.py miro-2.5.3-working/platform/gtk-x11/setup.py
2--- miro-2.5.3/platform/gtk-x11/setup.py 2009-10-14 15:18:23.000000000 -0700
3+++ miro-2.5.3-working/platform/gtk-x11/setup.py 2010-01-15 18:45:13.000000000 -0800
4@@ -303,9 +303,9 @@ all_libs = [mem for mem in all_libs if m
5
6 def mt_or_not(s, all_libs=all_libs):
7 for mem in all_libs:
8- if mem.startswith("lib%s-mt" % s):
9- print "Using %s-mt" % s
10- return "%s-mt" % s
11+ if mem.startswith("lib%s-mt-py26" % s):
12+ print "Using %s-mt-py26" % s
13+ return "%s-mt-py26" % s
14 print "using %s" % s
15 return s
16
170
=== modified file 'debian/rules'
--- debian/rules 2009-10-25 00:24:34 +0000
+++ debian/rules 2010-04-14 21:08:30 +0000
@@ -43,20 +43,7 @@
43 rm -rf debian/miro-data/usr/share/miro/resources/testdata43 rm -rf debian/miro-data/usr/share/miro/resources/testdata
4444
45clean::45clean::
46 @# TODO: This should probably be done in the upstream source.46 cd platform/gtk-x11/ && make clean
47 rm -f portable/database.c
48 rm -f portable/sorts.c
49 rm -f portable/frontends/widgets/gtk/pygtkhacks.c
50 rm -f platform/gtk-x11/plat/frontends/widgets/mozprompt.[ch]
51 rm -f platform/gtk-x11/plat/frontends/widgets/httpobserver.c
52 rm -f platform/gtk-x11/plat/frontends/widgets/windowcreator.cpp
53 rm -f platform/gtk-x11/plat/frontends/widgets/pluginsdir.cpp
54 rm -f platform/gtk-x11/miro.1.gz
55 rm -f platform/gtk-x11/miro.real.1.gz
56 rm -f platform/gtk-x11/xine/xine_extractor
57 rm -f platform/gtk-x11/plat/xlibhelper.c
58 rm -f platform/gtk-x11/xine/xine.c
59 rm -f platform/gtk-x11/miro
6047
61# For /usr/share/cdbs/1/rules/utils.mk sanity check.48# For /usr/share/cdbs/1/rules/utils.mk sanity check.
62common-binary-post-install-arch:: list-missing49common-binary-post-install-arch:: list-missing
6350
=== added file 'platform/gtk-x11/Makefile'
--- platform/gtk-x11/Makefile 1970-01-01 00:00:00 +0000
+++ platform/gtk-x11/Makefile 2010-04-14 21:08:30 +0000
@@ -0,0 +1,50 @@
1SHELL = /bin/sh
2
3prefix = /usr
4distdir = dist
5exec_prefix = $(prefix)
6bindir = $(distdir)$(exec_prefix)/bin
7python = $(shell which python)
8python_version = $(shell $(python) -c 'import sys; info=sys.version_info; print "%s.%s" % (info[0], info[1])')
9
10SITE32PATH = $(shell pwd)/dist$(prefix)/lib/python$(python_version)/site-packages/
11SITE64PATH = $(shell pwd)/dist$(prefix)/lib64/python$(python_version)/site-packages/
12MIROPYTHONPATH = $(SITE32PATH):$(SITE64PATH)
13
14.PHONY: build run test pylint
15
16clean:
17 -rm -rf build dist
18 -rm -rf miro.1.gz miro.real.1.gz
19 -rm miro
20 -rm plat/xlibhelper.c
21 -rm plat/frontends/widgets/httpobserver.c
22 -rm plat/frontends/widgets/mozprompt.h plat/frontends/widgets/mozprompt.c
23 -rm plat/frontends/widgets/pluginsdir.cpp
24 -rm plat/frontends/widgets/windowcreator.cpp
25 -rm ../../portable/frontends/widgets/gtk/pygtkhacks.c
26 -rm -rf tmp
27
28build:
29 $(python) setup.py install --root=./dist --prefix=$(prefix)
30
31run: build
32 MIRO_SHARE_ROOT=dist/$(prefix)/share/ \
33 MIRO_RESOURCE_ROOT=dist/$(prefix)/share/miro/resources/ \
34 PATH=dist$(prefix)/bin \
35 PYTHONPATH=$(MIROPYTHONPATH) \
36 $(bindir)/miro
37
38test: build
39 MIRO_SHARE_ROOT=dist/$(prefix)/share/ \
40 MIRO_RESOURCE_ROOT=dist/$(prefix)/share/miro/resources/ \
41 PATH=dist$(prefix)/bin \
42 PYTHONPATH=$(MIROPYTHONPATH) \
43 $(bindir)/miro --unittest
44
45pylint: build
46 # remove .so files that pylint flips out on
47 find dist -name "*.so" | xargs rm
48 rm -rf dist/usr/lib/python2.6/site-packages/miro/test
49 cd dist/$(prefix)/lib/python$(python_version)/site-packages && \
50 pylint --rcfile ../../../../../pylintrc miro > ../../../../../pylint.output 2>&1
051
=== modified file 'platform/gtk-x11/README'
--- platform/gtk-x11/README 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/README 2010-04-14 21:08:30 +0000
@@ -3,7 +3,7 @@
3======3======
44
5:Author: Will Kahn-Greene <will.guaraldi at pculture dot org>5:Author: Will Kahn-Greene <will.guaraldi at pculture dot org>
6:Date: June 1st, 20096:Date: January 14, 2010
77
88
9Summary9Summary
@@ -51,13 +51,17 @@
51.. Note:: Setting ``HOME`` doesn't work in KDE--it causes other problems.51.. Note:: Setting ``HOME`` doesn't work in KDE--it causes other problems.
5252
5353
54Wiping out preferences54Preferences
55======================55===========
5656
57Miro stores preferences in gconf. To wipe out all preferences, do::57Miro stores preferences in gconf. To wipe out all preferences, do::
5858
59 gconftool-2 --recursive-unset /apps/miro59 gconftool-2 --recursive-unset /apps/miro
6060
61To backup your preferences, do::
62
63 gconftool-2 --dump /apps/miro > /tmp/foobar
64
6165
62Unittest instructions66Unittest instructions
63=====================67=====================
@@ -89,27 +93,8 @@
89type errors.93type errors.
9094
9195
92Problems with xine
93==================
94
95A while back, we had problems with xine and wrote "xine xv hack" code.
96This code helps some platforms and segfaults on others. Depending on
97your platform, you will want to enable/disable the hack. This can be
98done in two places. First, it can be done in setup.py with the
99``USE_XINE_HACK`` option. Second, if ``USE_XINE_HACK`` was True when
100Miro was compiled, then you can enable/disable the hack through the
101command line with::
102
103 miro --set=xine-xvhack=true
104
105or::
106
107 miro --set=xine-xvhack=False
108
109
110Problems with gstreamer96Problems with gstreamer
111=======================97=======================
11298
113Make sure you have gstreamer plugins installed. That solves most99Make sure you have gstreamer plugins installed. That solves most
114problems.100problems.
115
116101
=== removed file 'platform/gtk-x11/clean.sh'
--- platform/gtk-x11/clean.sh 2009-08-09 19:36:11 +0000
+++ platform/gtk-x11/clean.sh 1970-01-01 00:00:00 +0000
@@ -1,54 +0,0 @@
1#!/bin/sh
2
3# Miro - an RSS based video player application
4# Copyright (C) 2005-2009 Participatory Culture Foundation
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19#
20# In addition, as a special exception, the copyright holders give
21# permission to link the code of portions of this program with the OpenSSL
22# library.
23#
24# You must obey the GNU General Public License in all respects for all of
25# the code used other than OpenSSL. If you modify file(s) with this
26# exception, you may extend this exception to your version of the file(s),
27# but you are not obligated to do so. If you do not wish to do so, delete
28# this exception statement from your version. If you delete this exception
29# statement from all source files in the program, then also delete it here.
30
31
32# build and dist
33rm -rf build dist
34
35# xine/ stuff
36rm xine/xine_extractor xine/xine.c
37
38# plat/ stuff
39rm plat/xlibhelper.c
40
41# man pages
42rm miro.1.gz miro.real.1.gz
43
44# miro file
45rm miro
46
47# plat/frontends/widgets/
48rm plat/frontends/widgets/httpobserver.c plat/frontends/widgets/mozprompt.h plat/frontends/widgets/mozprompt.c plat/frontends/widgets/pluginsdir.cpp plat/frontends/widgets/windowcreator.cpp
49
50# portable/ stuff
51rm ../../portable/sorts.c
52
53# portable/frontends/widgets/gtk/
54rm ../../portable/frontends/widgets/gtk/pygtkhacks.c
550
=== added directory 'platform/gtk-x11/icons'
=== removed directory 'platform/gtk-x11/icons'
=== added directory 'platform/gtk-x11/icons/hicolor'
=== removed directory 'platform/gtk-x11/icons/hicolor'
=== added directory 'platform/gtk-x11/icons/hicolor/128x128'
=== removed directory 'platform/gtk-x11/icons/hicolor/128x128'
=== added directory 'platform/gtk-x11/icons/hicolor/128x128/apps'
=== removed directory 'platform/gtk-x11/icons/hicolor/128x128/apps'
=== added file 'platform/gtk-x11/icons/hicolor/128x128/apps/miro.png'
56Binary files platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 2010-04-14 21:08:30 +0000 differ1Binary files platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 2010-04-14 21:08:30 +0000 differ
=== removed file 'platform/gtk-x11/icons/hicolor/128x128/apps/miro.png'
57Binary files platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 1970-01-01 00:00:00 +0000 differ2Binary files platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/128x128/apps/miro.png 1970-01-01 00:00:00 +0000 differ
=== added directory 'platform/gtk-x11/icons/hicolor/24x24'
=== removed directory 'platform/gtk-x11/icons/hicolor/24x24'
=== added directory 'platform/gtk-x11/icons/hicolor/24x24/apps'
=== removed directory 'platform/gtk-x11/icons/hicolor/24x24/apps'
=== added file 'platform/gtk-x11/icons/hicolor/24x24/apps/miro.png'
58Binary files platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 2010-04-14 21:08:30 +0000 differ3Binary files platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 2010-04-14 21:08:30 +0000 differ
=== removed file 'platform/gtk-x11/icons/hicolor/24x24/apps/miro.png'
59Binary files platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 1970-01-01 00:00:00 +0000 differ4Binary files platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/24x24/apps/miro.png 1970-01-01 00:00:00 +0000 differ
=== added directory 'platform/gtk-x11/icons/hicolor/48x48'
=== removed directory 'platform/gtk-x11/icons/hicolor/48x48'
=== added directory 'platform/gtk-x11/icons/hicolor/48x48/apps'
=== removed directory 'platform/gtk-x11/icons/hicolor/48x48/apps'
=== added file 'platform/gtk-x11/icons/hicolor/48x48/apps/miro.png'
60Binary files platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 2010-04-14 21:08:30 +0000 differ5Binary files platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 2010-04-14 21:08:30 +0000 differ
=== removed file 'platform/gtk-x11/icons/hicolor/48x48/apps/miro.png'
61Binary files platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 1970-01-01 00:00:00 +0000 differ6Binary files platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/48x48/apps/miro.png 1970-01-01 00:00:00 +0000 differ
=== added directory 'platform/gtk-x11/icons/hicolor/72x72'
=== removed directory 'platform/gtk-x11/icons/hicolor/72x72'
=== added directory 'platform/gtk-x11/icons/hicolor/72x72/apps'
=== removed directory 'platform/gtk-x11/icons/hicolor/72x72/apps'
=== added file 'platform/gtk-x11/icons/hicolor/72x72/apps/miro.png'
62Binary files platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 2010-04-14 21:08:30 +0000 differ7Binary files platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 1970-01-01 00:00:00 +0000 and platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 2010-04-14 21:08:30 +0000 differ
=== removed file 'platform/gtk-x11/icons/hicolor/72x72/apps/miro.png'
63Binary files platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 1970-01-01 00:00:00 +0000 differ8Binary files platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 2009-08-09 19:36:11 +0000 and platform/gtk-x11/icons/hicolor/72x72/apps/miro.png 1970-01-01 00:00:00 +0000 differ
=== modified file 'platform/gtk-x11/miro.1'
--- platform/gtk-x11/miro.1 2009-03-09 12:46:19 +0000
+++ platform/gtk-x11/miro.1 2010-04-14 21:08:30 +0000
@@ -1,9 +1,9 @@
1.TH MIRO 1 "February 11, 2009"1.TH MIRO 1 "January 14, 2010"
2.SH NAME2.SH NAME
3miro \- a GTK+ based RSS video aggregator and player3miro \- a GTK+ based RSS video aggregator and player
4.SH SYNOPSIS4.SH SYNOPSIS
5.B miro5.B miro
6.RB [ OPTIONS ]6.RB [ OPTIONS ] [ FILES ]
7.SH DESCRIPTION7.SH DESCRIPTION
8.B "Miro"8.B "Miro"
9is a platform for Internet television and video. An intuitive interface9is a platform for Internet television and video. An intuitive interface
@@ -12,6 +12,10 @@
12Please read12Please read
13.B "miro \-\-help"13.B "miro \-\-help"
14for a list of all available Miro command line options.14for a list of all available Miro command line options.
15.SH FILES
16You can launch Miro with one or more file names and urls for items
17to add to the Miro database, items to download and add to the Miro
18database, and feeds to subscribe to.
15.SH HELP19.SH HELP
16Forums and other help are available at http://getmiro.com/ .20Forums and other help are available at http://getmiro.com/ .
17.SH BUGS21.SH BUGS
1822
=== modified file 'platform/gtk-x11/miro.real'
--- platform/gtk-x11/miro.real 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/miro.real 2010-04-14 21:08:30 +0000
@@ -2,7 +2,7 @@
2# -*- mode: python -*-2# -*- mode: python -*-
33
4# Miro - an RSS based video player application4# Miro - an RSS based video player application
5# Copyright (C) 2005-2009 Participatory Culture Foundation5# Copyright (C) 2005-2010 Participatory Culture Foundation
6#6#
7# This program is free software; you can redistribute it and/or modify7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by8# it under the terms of the GNU General Public License as published by
@@ -73,7 +73,7 @@
73 dest="set_prefs",73 dest="set_prefs",
74 metavar="<PREF>",74 metavar="<PREF>",
75 nargs=1,75 nargs=1,
76 help="Sets a preference and saves the new value for future Miro runs. Example: miro --set renderer=xine")76 help="Sets a preference and saves the new value for future Miro runs. Example: miro --set renderer=gstreamer")
77parser.set_defaults(set_prefs=[])77parser.set_defaults(set_prefs=[])
78parser.add_option_group(group)78parser.add_option_group(group)
7979
@@ -109,6 +109,9 @@
109from miro.plat import options109from miro.plat import options
110options.gconf_name = parsed_options.gconf_name110options.gconf_name = parsed_options.gconf_name
111111
112from miro.plat import utils
113utils.initialize_locale()
114
112from miro import gtcache115from miro import gtcache
113gtcache.init()116gtcache.init()
114117
@@ -121,15 +124,15 @@
121 sys.modules['feedparser'] = miro.feedparser124 sys.modules['feedparser'] = miro.feedparser
122 sys.modules['storedatabase'] = miro.storedatabase125 sys.modules['storedatabase'] = miro.storedatabase
123126
124
125from miro import config127from miro import config
126from miro import plat
127from miro import prefs128from miro import prefs
128from miro import commandline129from miro import commandline
129130
130if '--unittest' in sys.argv:131if '--unittest' in sys.argv:
131 # handle this outside optparse, because unittest has its own option set132 # handle this outside optparse, because unittest has its own option set
132 sys.argv.remove('--unittest')133 sys.argv.remove('--unittest')
134 import logging
135 logging.basicConfig(level=logging.CRITICAL)
133 import unittest136 import unittest
134 from miro import test137 from miro import test
135 unittest.main(module=test)138 unittest.main(module=test)
@@ -198,8 +201,6 @@
198 return p, val201 return p, val
199202
200def startapp():203def startapp():
201 plat.utils.initializeLocale()
202
203 # Create miro directories in the user's home204 # Create miro directories in the user's home
204 support_dir = config.get(prefs.SUPPORT_DIRECTORY)205 support_dir = config.get(prefs.SUPPORT_DIRECTORY)
205 if not os.path.exists(support_dir):206 if not os.path.exists(support_dir):
@@ -266,16 +267,15 @@
266 try:267 try:
267 onetime.OneTime()268 onetime.OneTime()
268 startapp()269 startapp()
269 except onetime.NameExistsException:270 except dbus.NameExistsException:
270 # This onetime.NameExistsException is either dbus.NameExistsException
271 # or an exception we created ourselves. Change it to
272 # dbus.NameExistsException when we get rid of code that allows Miro to
273 # run on platforms with the older dbus-python bindings.
274 bus = dbus.SessionBus()271 bus = dbus.SessionBus()
275 proxy_obj = bus.get_object('org.participatoryculture.dtv.onetime', '/org/participatoryculture/dtv/OneTime')272 proxy_obj = bus.get_object(
276 iface = dbus.Interface(proxy_obj, 'org.participatoryculture.dtv.OneTimeIface')273 'org.participatoryculture.dtv.onetime',
277 for i in xrange(len(args)):274 '/org/participatoryculture/dtv/OneTime')
278 args[i] = args[i].decode('latin1')275 iface = dbus.Interface(
276 proxy_obj, 'org.participatoryculture.dtv.OneTimeIFace')
277 for i, arg in enumerate(args):
278 args[i] = arg.decode('latin1')
279 dbusargs = dbus.Array(args, signature="s")279 dbusargs = dbus.Array(args, signature="s")
280280
281 try:281 try:
282282
=== modified file 'platform/gtk-x11/plat/__init__.py'
--- platform/gtk-x11/plat/__init__.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/__init__.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/config.py'
--- platform/gtk-x11/plat/config.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/config.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/__init__.py'
--- platform/gtk-x11/plat/frontends/__init__.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/frontends/__init__.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc'
--- platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc 2010-04-14 21:08:30 +0000
@@ -1,6 +1,6 @@
1/*1/*
2# Miro - an RSS based video player application2# Miro - an RSS based video player application
3# Copyright (C) 2005-2009 Participatory Culture Foundation3# Copyright (C) 2005-2010 Participatory Culture Foundation
4#4#
5# This program is free software; you can redistribute it and/or modify5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by6# it under the terms of the GNU General Public License as published by
77
=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h'
--- platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h 2010-04-14 21:08:30 +0000
@@ -1,6 +1,6 @@
1/*1/*
2 * Miro - an RSS based video player application2 * Miro - an RSS based video player application
3 * Copyright (C) 2005-2009 Participatory Culture Foundation3 * Copyright (C) 2005-2010 Participatory Culture Foundation
44
5 * This program is free software; you can redistribute it and/or modify5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by6 * it under the terms of the GNU General Public License as published by
77
=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc'
--- platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc 2010-04-14 21:08:30 +0000
@@ -1,6 +1,6 @@
1/*1/*
2 * Miro - an RSS based video player application2 * Miro - an RSS based video player application
3 * Copyright (C) 2005-2009 Participatory Culture Foundation3 * Copyright (C) 2005-2010 Participatory Culture Foundation
4 *4 *
5 * This program is free software; you can redistribute it and/or modify5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by6 * it under the terms of the GNU General Public License as published by
77
=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h'
--- platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h 2010-04-14 21:08:30 +0000
@@ -1,6 +1,6 @@
1/*1/*
2 * Miro - an RSS based video player application2 * Miro - an RSS based video player application
3 * Copyright (C) 2005-2009 Participatory Culture Foundation3 * Copyright (C) 2005-2010 Participatory Culture Foundation
4 *4 *
5 * This program is free software; you can redistribute it and/or modify5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by6 * it under the terms of the GNU General Public License as published by
77
=== modified file 'platform/gtk-x11/plat/frontends/widgets/PromptService.cc'
--- platform/gtk-x11/plat/frontends/widgets/PromptService.cc 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/PromptService.cc 2010-04-14 21:08:30 +0000
@@ -1,6 +1,6 @@
1/*1/*
2# Miro - an RSS based video player application2# Miro - an RSS based video player application
3# Copyright (C) 2005-2009 Participatory Culture Foundation3# Copyright (C) 2005-2010 Participatory Culture Foundation
4#4#
5# This program is free software; you can redistribute it and/or modify5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by6# it under the terms of the GNU General Public License as published by
77
=== modified file 'platform/gtk-x11/plat/frontends/widgets/PromptService.h'
--- platform/gtk-x11/plat/frontends/widgets/PromptService.h 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/PromptService.h 2010-04-14 21:08:30 +0000
@@ -1,6 +1,6 @@
1/*1/*
2# Miro - an RSS based video player application2# Miro - an RSS based video player application
3# Copyright (C) 2005-2009 Participatory Culture Foundation3# Copyright (C) 2005-2010 Participatory Culture Foundation
4#4#
5# This program is free software; you can redistribute it and/or modify5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by6# it under the terms of the GNU General Public License as published by
77
=== modified file 'platform/gtk-x11/plat/frontends/widgets/__init__.py'
--- platform/gtk-x11/plat/frontends/widgets/__init__.py 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/__init__.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/widgets/application.py'
--- platform/gtk-x11/plat/frontends/widgets/application.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/frontends/widgets/application.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -51,6 +51,7 @@
51from miro.plat.config import gconf_lock51from miro.plat.config import gconf_lock
52from miro.frontends.widgets.gtk import trayicon52from miro.frontends.widgets.gtk import trayicon
53from miro.plat import resources53from miro.plat import resources
54from miro.plat.frontends.widgets import mediakeys
5455
55from miro.frontends.widgets.gtk.widgetset import Rect56from miro.frontends.widgets.gtk.widgetset import Rect
5657
@@ -112,6 +113,7 @@
112 langs = [(l, os.environ.get(l)) for l in langs if os.environ.get(l)]113 langs = [(l, os.environ.get(l)) for l in langs if os.environ.get(l)]
113 logging.info("Language: %s", langs)114 logging.info("Language: %s", langs)
114 renderers.init_renderer()115 renderers.init_renderer()
116 self.mediakeyhandler = mediakeys.get_media_key_handler()
115 gtk.main()117 gtk.main()
116 app.controller.on_shutdown()118 app.controller.on_shutdown()
117119
118120
=== modified file 'platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx'
--- platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== added file 'platform/gtk-x11/plat/frontends/widgets/mediakeys.py'
--- platform/gtk-x11/plat/frontends/widgets/mediakeys.py 1970-01-01 00:00:00 +0000
+++ platform/gtk-x11/plat/frontends/widgets/mediakeys.py 2010-04-14 21:08:30 +0000
@@ -0,0 +1,61 @@
1# Miro - an RSS based video player application
2# Copyright (C) 2010 Participatory Culture Foundation
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17#
18# In addition, as a special exception, the copyright holders give
19# permission to link the code of portions of this program with the OpenSSL
20# library.
21#
22# You must obey the GNU General Public License in all respects for all of
23# the code used other than OpenSSL. If you modify file(s) with this
24# exception, you may extend this exception to your version of the file(s),
25# but you are not obligated to do so. If you do not wish to do so, delete
26# this exception statement from your version. If you delete this exception
27# statement from all source files in the program, then also delete it here.
28
29import logging
30import dbus
31
32from miro import app
33
34class MediaKeyHandler(object):
35 def __init__(self):
36 self.bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
37 self.bus_object = self.bus.get_object(
38 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys')
39
40 self.bus_object.GrabMediaPlayerKeys(
41 "Miro", 0, dbus_interface='org.gnome.SettingsDaemon.MediaKeys')
42
43 self.bus_object.connect_to_signal(
44 'MediaPlayerKeyPressed', self.handle_mediakey)
45
46 def handle_mediakey(self, *mmkeys):
47 for key in mmkeys:
48 if key == "Play":
49 app.widgetapp.on_play_clicked()
50 elif key == "Stop":
51 app.widgetapp.on_stop_clicked()
52 elif key == "Next":
53 app.widgetapp.on_forward_clicked()
54 elif key == "Previous":
55 app.widgetapp.on_previous_clicked()
56
57def get_media_key_handler():
58 try:
59 return MediaKeyHandler()
60 except dbus.DBusException:
61 logging.debug("cannot load MediaKeyHandler")
062
=== modified file 'platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx'
--- platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx 2010-04-14 21:08:30 +0000
@@ -1,3 +1,31 @@
1# Miro - an RSS based video player application
2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17#
18# In addition, as a special exception, the copyright holders give
19# permission to link the code of portions of this program with the OpenSSL
20# library.
21#
22# You must obey the GNU General Public License in all respects for all of
23# the code used other than OpenSSL. If you modify file(s) with this
24# exception, you may extend this exception to your version of the file(s),
25# but you are not obligated to do so. If you do not wish to do so, delete
26# this exception statement from your version. If you delete this exception
27# statement from all source files in the program, then also delete it here.
28
1import logging29import logging
230
3cdef extern from "nsError.h":31cdef extern from "nsError.h":
432
=== modified file 'platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx' (properties changed: +x to -x)
--- platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/widgets/prefpanelset.py'
--- platform/gtk-x11/plat/frontends/widgets/prefpanelset.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/frontends/widgets/prefpanelset.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -38,6 +38,7 @@
38from miro.frontends.widgets.widgetutil import align_left38from miro.frontends.widgets.widgetutil import align_left
39from miro.frontends.widgets.prefpanel import attach_boolean, attach_radio, attach_combo39from miro.frontends.widgets.prefpanel import attach_boolean, attach_radio, attach_combo
4040
41from miro.plat import renderers
41from miro.plat import options 42from miro.plat import options
4243
43from miro import config, prefs44from miro import config, prefs
@@ -66,13 +67,15 @@
66 grid.end_line(spacing=12)67 grid.end_line(spacing=12)
6768
68 rbg = widgetset.RadioButtonGroup()69 rbg = widgetset.RadioButtonGroup()
69 gstreamer_radio = widgetset.RadioButton("gstreamer", rbg)70 radio_map = {}
70 xine_radio = widgetset.RadioButton("xine", rbg)71 for mem in renderers.get_renderer_list():
71 attach_radio([(gstreamer_radio, "gstreamer"), (xine_radio, "xine")],72 radio_map[mem] = widgetset.RadioButton(mem, rbg)
72 options.USE_RENDERER)73
74 buttons = [(v, k) for k, v in radio_map.items()]
75 attach_radio(buttons, options.USE_RENDERER)
7376
74 grid.pack_label(_("Video renderer:"), grid.ALIGN_RIGHT)77 grid.pack_label(_("Video renderer:"), grid.ALIGN_RIGHT)
75 grid.pack(dialogwidgets.radio_button_list(gstreamer_radio, xine_radio))78 grid.pack(dialogwidgets.radio_button_list(*radio_map.values()))
7679
77 grid.end_line(spacing=12)80 grid.end_line(spacing=12)
7881
@@ -84,4 +87,5 @@
84 if panel_name == "general":87 if panel_name == "general":
85 return _general_panel()88 return _general_panel()
86 elif panel_name == "playback":89 elif panel_name == "playback":
87 return _playback_panel()90 if len(renderers.get_renderer_list()) > 1:
91 return _playback_panel()
8892
=== modified file 'platform/gtk-x11/plat/frontends/widgets/threads.py'
--- platform/gtk-x11/plat/frontends/widgets/threads.py 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/threads.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/widgets/timer.py'
--- platform/gtk-x11/plat/frontends/widgets/timer.py 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/timer.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/widgets/widgetset.py'
--- platform/gtk-x11/plat/frontends/widgets/widgetset.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/frontends/widgets/widgetset.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx' (properties changed: +x to -x)
--- platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/idletime.py'
--- platform/gtk-x11/plat/idletime.py 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/idletime.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/mozsetup.py'
--- platform/gtk-x11/plat/mozsetup.py 2009-06-26 21:29:54 +0000
+++ platform/gtk-x11/plat/mozsetup.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/onetime.py'
--- platform/gtk-x11/plat/onetime.py 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/onetime.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -28,122 +28,32 @@
2828
29import dbus29import dbus
30import dbus.service30import dbus.service
31import dbus.glib
32from dbus.service import BusName
3133
32from miro import messages34from miro import messages
3335
34if getattr(dbus, 'version', (0, 0, 0)) >= (0, 41, 0):
35 import dbus.glib
36
37# We do this crazy stuff so that Miro can run on platforms that have the
38# older dbus-python bindings. Dapper uses (0, 51, 0). I think once we
39# stop supporting Dapper, we can rip this whole section out.
40# This section was re-written so that it doesn't trigger the dbus-python
41# deprecation warning and is localized so we can just delete it and
42# move on with our lives when the time comes. - willkahn-greene10-29-2007
43
44# (0, 80, 0) is the first version that has do_not_queue
45if getattr(dbus, 'version', (0, 0, 0)) >= (0, 80, 0):
46 BusName = dbus.service.BusName
47 NameExistsException = dbus.NameExistsException
48
49else:
50 import dbus.dbus_bindings
51
52 class NameExistsException(dbus.DBusException):
53 pass
54
55 # these are in the dbus spec, so they're not going to change.
56 REQUEST_NAME_REPLY_PRIMARY_OWNER = 1
57 REQUEST_NAME_REPLY_IN_QUEUE = 2
58 REQUEST_NAME_REPLY_EXISTS = 3
59 REQUEST_NAME_REPLY_ALREADY_OWNER = 4
60 NAME_FLAG_DO_NOT_QUEUE = 4
61
62 class BusNameFlags(object):
63 """A base class for exporting your own Named Services across the Bus
64 """
65 def __new__(cls, name, bus=None, flags=0, do_not_queue=False):
66 if do_not_queue:
67 flags = flags | NAME_FLAG_DO_NOT_QUEUE
68
69 # get default bus
70 if bus == None:
71 bus = dbus.Bus()
72
73 # otherwise register the name
74 conn = bus.get_connection()
75 retval = dbus.dbus_bindings.bus_request_name(conn, name, flags)
76
77 # TODO: more intelligent tracking of bus name states?
78 if retval == REQUEST_NAME_REPLY_PRIMARY_OWNER:
79 pass
80 elif retval == REQUEST_NAME_REPLY_IN_QUEUE:
81 # queueing can happen by default, maybe we should
82 # track this better or let the user know if they're
83 # queued or not?
84 pass
85 elif retval == REQUEST_NAME_REPLY_EXISTS:
86 raise NameExistsException(name)
87 elif retval == REQUEST_NAME_REPLY_ALREADY_OWNER:
88 # if this is a shared bus which is being used by someone
89 # else in this process, this can happen legitimately
90 pass
91 else:
92 raise RuntimeError('requesting bus name %s returned unexpected value %s' % (name, retval))
93
94 # and create the object
95 bus_name = object.__new__(cls)
96 bus_name._bus = bus
97 bus_name._name = name
98 bus_name._conn = conn
99
100 return bus_name
101
102 # do nothing because this is called whether or not the bus name
103 # object was retrieved from the cache or created new
104 def __init__(self, *args, **keywords):
105 pass
106
107 # we can delete the low-level name here because these objects
108 # are guaranteed to exist only once for each bus name
109 def __del__(self):
110 dbus.dbus_bindings.bus_release_name(self._bus.get_connection(), self._name)
111
112 def get_bus(self):
113 """Get the Bus this Service is on"""
114 return self._bus
115
116 def get_name(self):
117 """Get the name of this service"""
118 return self._name
119
120 def get_connection(self):
121 """Get the connection for this service"""
122 return self._conn
123
124 def __repr__(self):
125 return '<dbus.service.BusName %s on %r at %#x>' % (self._name, self._bus, id(self))
126 __str__ = __repr__
127
128 BusName = BusNameFlags
129
130class OneTime(dbus.service.Object):36class OneTime(dbus.service.Object):
131 """This makes sure we've only got one instance of Miro running at any given37 """This makes sure we've only got one instance of Miro running at
132 time.38 any given time.
133 """39 """
134 def __init__(self):40 def __init__(self):
135 bus = dbus.SessionBus()41 bus = dbus.SessionBus()
136 bus_name = BusName('org.participatoryculture.dtv.onetime', bus=bus, do_not_queue=True)42 bus_name = BusName('org.participatoryculture.dtv.onetime',
137 dbus.service.Object.__init__(self, bus_name=bus_name,43 bus=bus, do_not_queue=True)
138 object_path='/org/participatoryculture/dtv/OneTime')44 dbus.service.Object.__init__(
45 self, bus_name=bus_name,
46 object_path='/org/participatoryculture/dtv/OneTime')
13947
140 @dbus.service.method('org.participatoryculture.dtv.OneTimeIface')48 @dbus.service.method(
49 dbus_interface='org.participatoryculture.dtv.OneTimeIFace',
50 in_signature='as')
141 def handle_args(self, args):51 def handle_args(self, args):
142 from miro import singleclick52 from miro import singleclick
143 from miro import eventloop53 from miro import eventloop
144 for i in xrange(len(args)):54 for i, arg in enumerate(args):
145 args[i] = args[i].encode('latin1')55 args[i] = arg.encode('latin1')
146 if args[i].startswith('file://'):56 if arg.startswith('file://'):
147 args[i] = args[i][len('file://'):]57 args[i] = arg[len('file://'):]
14858
149 messages.OpenIndividualFiles(args).send_to_backend()59 messages.OpenIndividualFiles(args).send_to_backend()
15060
=== modified file 'platform/gtk-x11/plat/options.py'
--- platform/gtk-x11/plat/options.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/options.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -48,17 +48,7 @@
48USE_RENDERER = GTKPref(key="useRenderer",48USE_RENDERER = GTKPref(key="useRenderer",
49 default=u"gstreamer",49 default=u"gstreamer",
50 alias="renderer",50 alias="renderer",
51 help="Which renderer to use. (gstreamer, xine)" )51 help="Which renderer to use. (gstreamer, ...)" )
52
53USE_XINE_XV_HACK = GTKPref(key="UseXineXVHack",
54 default=True,
55 alias="xine-xvhack",
56 help="Whether or not to use the Xine xv hack. (true, false)" )
57
58XINE_DRIVER = GTKPref(key="DefaultXineDriver",
59 default="xv",
60 alias="xine-driver",
61 help="Which Xine driver to use for video. (auto, xv, xshm)" )
6252
63GSTREAMER_IMAGESINK = GTKPref(key="DefaultGstreamerImagesink",53GSTREAMER_IMAGESINK = GTKPref(key="DefaultGstreamerImagesink",
64 default="gconfvideosink",54 default="gconfvideosink",
6555
=== modified file 'platform/gtk-x11/plat/renderers/__init__.py'
--- platform/gtk-x11/plat/renderers/__init__.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/renderers/__init__.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -30,11 +30,21 @@
3030
31import logging31import logging
32import traceback32import traceback
33import os
34import os.path
3335
34from miro import app36from miro import app
35from miro import config37from miro import config
36from miro.plat import options38from miro.plat import options
3739
40def get_renderer_list():
41 d = os.path.dirname(__file__)
42 contents = os.listdir(d)
43 # FIXME - this sucks. switch this to use extensions.
44 contents = [m for m in contents if m.endswith("renderer.py")]
45 contents = [m[:-11] for m in contents]
46 return contents
47
38def set_renderer(modname):48def set_renderer(modname):
39 """Attempt to set the video renderer."""49 """Attempt to set the video renderer."""
4050
@@ -47,7 +57,7 @@
47 app.movie_data_program_info = module.movie_data_program_info57 app.movie_data_program_info = module.movie_data_program_info
48 app.get_item_type = module.get_item_type58 app.get_item_type = module.get_item_type
49 logging.info("set_renderer: successfully loaded %s", modname)59 logging.info("set_renderer: successfully loaded %s", modname)
50 except:60 except StandardError:
51 logging.info("set_renderer: couldn't load %s: %s", modname,61 logging.info("set_renderer: couldn't load %s: %s", modname,
52 traceback.format_exc())62 traceback.format_exc())
53 raise63 raise
@@ -66,14 +76,14 @@
66 try:76 try:
67 set_renderer("%srenderer" % r)77 set_renderer("%srenderer" % r)
68 return78 return
69 except:79 except StandardError:
70 logging.exception("init_renderer: error detected... trying to use gstreamerrenderer")80 logging.exception("init_renderer: error detected... trying to use gstreamerrenderer")
7181
72 try:82 try:
73 # try to add the gstreamer renderer if the preferences aren't right83 # try to add the gstreamer renderer if the preferences aren't right
74 set_renderer("gstreamerrenderer")84 set_renderer("gstreamerrenderer")
75 return85 return
76 except:86 except StandardError:
77 logging.exception("init_renderer: no valid renderer has been loaded")87 logging.exception("init_renderer: no valid renderer has been loaded")
78 app.audio_renderer = None88 app.audio_renderer = None
79 app.video_renderer = None89 app.video_renderer = None
8090
=== modified file 'platform/gtk-x11/plat/renderers/gst_extractor.py'
--- platform/gtk-x11/plat/renderers/gst_extractor.py 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/renderers/gst_extractor.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -39,7 +39,6 @@
3939
40class Extractor:40class Extractor:
41 def __init__(self, filename, thumbnail_filename, callback):41 def __init__(self, filename, thumbnail_filename, callback):
42# print "__init__(%s, %s, %s)" % (filename, thumbnail_filename, callback)
43 self.thumbnail_filename = thumbnail_filename42 self.thumbnail_filename = thumbnail_filename
44 self.filename = filename43 self.filename = filename
45 self.callback = callback44 self.callback = callback
@@ -50,95 +49,157 @@
50 self.duration = -149 self.duration = -1
51 self.buffer_probes = {}50 self.buffer_probes = {}
52 self.audio_only = False51 self.audio_only = False
5352 self.saw_video_tag = self.saw_audio_tag = False
54 self.pipeline = gst.parse_launch('filesrc location="%s" ! decodebin ! ffmpegcolorspace ! video/x-raw-rgb,depth=24,bpp=24 ! fakesink signal-handoffs=True' % (filename,))53
5554 self.pipeline = gst.element_factory_make('playbin')
56 for sink in self.pipeline.sinks():55 self.videosink = gst.element_factory_make("fakesink", "videosink")
56 self.pipeline.set_property("video-sink", self.videosink)
57 self.audiosink = gst.element_factory_make("fakesink", "audiosink")
58 self.pipeline.set_property("audio-sink", self.audiosink)
59
60 self.thumbnail_pipeline = None
61
62 self.bus = self.pipeline.get_bus()
63 self.bus.add_signal_watch()
64 self.watch_id = self.bus.connect("message", self.on_bus_message)
65
66 self.pipeline.set_property("uri", "file://%s" % filename)
67 self.pipeline.set_state(gst.STATE_PAUSED)
68
69 def on_bus_message(self, bus, message):
70 if message.src == self.pipeline:
71 if message.type == gst.MESSAGE_STATE_CHANGED:
72 prev, new, pending = message.parse_state_changed()
73 if new == gst.STATE_PAUSED:
74 gobject.idle_add(self.paused_reached)
75
76 elif message.type == gst.MESSAGE_ERROR:
77 gobject.idle_add(self.error_occurred)
78
79 elif message.src == self.thumbnail_pipeline:
80 if message.type == gst.MESSAGE_STATE_CHANGED:
81 prev, new, pending = message.parse_state_changed()
82 if new == gst.STATE_PAUSED:
83 seek_result = self.thumbnail_pipeline.seek(
84 1.0, gst.FORMAT_TIME,
85 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
86 gst.SEEK_TYPE_SET, self.duration / 2,
87 gst.SEEK_TYPE_NONE, 0)
88 if not seek_result:
89 self.disconnect()
90 self.done()
91
92 elif message.type == gst.MESSAGE_ERROR:
93 gobject.idle_add(self.error_occurred)
94
95 def done(self):
96 if self.saw_video_tag:
97 media_type = 'video'
98 elif self.saw_audio_tag:
99 media_type = 'audio'
100 else:
101 media_type = 'other'
102 self.callback(self.duration, self.success, media_type)
103
104 def get_duration(self, pipeline, attempts=0):
105 if attempts == 5:
106 return 0
107 try:
108 return pipeline.query_duration(gst.FORMAT_TIME)[0]
109 except gst.QueryError:
110 return self.get_duration(pipeline, attempts + 1)
111
112 def paused_reached(self):
113 self.saw_video_tag = False
114 self.saw_audio_tag = False
115
116 if not self.first_pause:
117 return False
118
119 self.first_pause = True
120 current_video = self.pipeline.get_property("current-video")
121 current_audio = self.pipeline.get_property("current-audio")
122
123 if current_video == 0:
124 self.saw_video_tag = True
125 if current_audio == 0:
126 self.saw_audio_tag = True
127
128 if self.saw_video_tag == False and self.saw_audio_tag == True:
129 self.audio_only = True
130 self.duration = self.get_duration(self.pipeline)
131 self.success = True
132 self.disconnect()
133 self.done()
134 return False
135
136 if self.saw_video_tag == False and self.saw_audio_tag == False:
137 self.audio_only = False
138 self.disconnect()
139 self.done()
140 return False
141
142 self.duration = self.get_duration(self.pipeline)
143 self.grabit = True
144 self.buffer_probes = {}
145
146 self.thumbnail_pipeline = gst.parse_launch(
147 'filesrc location="%s" ! decodebin ! '
148 'ffmpegcolorspace ! video/x-raw-rgb,depth=24,bpp=24 ! '
149 'fakesink signal-handoffs=True' % self.filename)
150
151 for sink in self.thumbnail_pipeline.sinks():
57 name = sink.get_name()152 name = sink.get_name()
58 factoryname = sink.get_factory().get_name()153 factoryname = sink.get_factory().get_name()
59 if factoryname == "fakesink":154 if factoryname == "fakesink":
60 pad = sink.get_pad("sink")155 pad = sink.get_pad("sink")
61 self.buffer_probes[name] = pad.add_buffer_probe(self.buffer_probe_handler, name)156 self.buffer_probes[name] = pad.add_buffer_probe(
62157 self.buffer_probe_handler, name)
63 self.bus = self.pipeline.get_bus()158
64 self.bus.add_signal_watch()159 self.thumbnail_bus = self.thumbnail_pipeline.get_bus()
65 self.watch_id = self.bus.connect("message", self.on_bus_message)160 self.thumbnail_bus.add_signal_watch()
66161 self.thumbnail_watch_id = self.thumbnail_bus.connect(
67 self.pipeline.set_state(gst.STATE_PAUSED)162 "message", self.on_bus_message)
68163
69 def start_audio_only(self):164 self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
70 self.audio_only = True165
71
72 self.pipeline = gst.parse_launch('filesrc location="%s" ! decodebin ! fakesink' % (self.filename,))
73
74 self.bus = self.pipeline.get_bus()
75 self.bus.add_signal_watch()
76 self.watch_id = self.bus.connect("message", self.on_bus_message)
77
78 self.pipeline.set_state(gst.STATE_PAUSED)
79
80 def done (self):
81# print "done()"
82 self.callback(self.duration, self.success)
83
84 def paused_reached(self):
85# print "paused_reached()"
86 if self.audio_only:
87 self.duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]
88 self.success = True
89 self.disconnect()
90 self.done()
91 if self.first_pause:
92 self.duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]
93 self.grabit = True
94 seek_result = self.pipeline.seek(1.0,
95 gst.FORMAT_TIME,
96 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
97 gst.SEEK_TYPE_SET,
98 self.duration / 2,
99 gst.SEEK_TYPE_NONE, 0)
100 if not seek_result:
101 self.disconnect()
102 self.done()
103 self.first_pause = False
104 return False166 return False
105167
106 def error_occurred(self):168 def error_occurred(self):
107 self.disconnect()169 self.disconnect()
108 if self.audio_only:170 self.done()
109 self.done()
110 else:
111 self.start_audio_only()
112 return False171 return False
113172
114 def on_bus_message(self, bus, message):
115 if message.src == self.pipeline:
116 if message.type == gst.MESSAGE_STATE_CHANGED:
117 prev, new, pending = message.parse_state_changed()
118 if new == gst.STATE_PAUSED:
119 gobject.idle_add(self.paused_reached)
120 if message.type == gst.MESSAGE_ERROR:
121 gobject.idle_add(self.error_occurred)
122
123 def buffer_probe_handler_real(self, pad, buff, name):173 def buffer_probe_handler_real(self, pad, buff, name):
124 """Capture buffers as gdk_pixbufs when told to."""174 """Capture buffers as gdk_pixbufs when told to.
125 if self.grabit:175 """
176 try:
126 caps = buff.caps177 caps = buff.caps
127 if caps is not None:178 if caps is None:
128 filters = caps[0]179 self.success = False
129 self.width = filters["width"]180 self.disconnect()
130 self.height = filters["height"]181 self.done()
131 timecode = self.pipeline.query_position(gst.FORMAT_TIME)[0]182 return False
132 pixbuf = gtk.gdk.pixbuf_new_from_data(buff.data, gtk.gdk.COLORSPACE_RGB, False, 8, self.width, self.height, self.width * 3)183
184 filters = caps[0]
185 width = filters["width"]
186 height = filters["height"]
187 timecode = self.thumbnail_pipeline.query_position(gst.FORMAT_TIME)[0]
188 pixbuf = gtk.gdk.pixbuf_new_from_data(
189 buff.data, gtk.gdk.COLORSPACE_RGB, False, 8,
190 width, height, width * 3)
133 pixbuf.save(self.thumbnail_filename, "png")191 pixbuf.save(self.thumbnail_filename, "png")
134 del pixbuf192 del pixbuf
135 self.success = True193 self.success = True
136 self.disconnect()194 self.disconnect()
137 self.done()195 self.done()
196 except gst.QueryError:
197 pass
138 return False198 return False
139199
140 def buffer_probe_handler(self, pad, buff, name):200 def buffer_probe_handler(self, pad, buff, name):
141 gobject.idle_add(lambda: self.buffer_probe_handler_real(pad, buff, name))201 gobject.idle_add(
202 lambda: self.buffer_probe_handler_real(pad, buff, name))
142 return True203 return True
143204
144 def disconnect(self):205 def disconnect(self):
@@ -153,11 +214,27 @@
153 pad.remove_buffer_probe(self.buffer_probes[name])214 pad.remove_buffer_probe(self.buffer_probes[name])
154 del self.buffer_probes[name]215 del self.buffer_probes[name]
155 self.pipeline = None216 self.pipeline = None
217
156 if self.bus is not None:218 if self.bus is not None:
157 self.bus.disconnect(self.watch_id)219 self.bus.disconnect(self.watch_id)
158 self.bus = None220 self.bus = None
159221
160def handle_result(duration, success):222def make_verbose():
223 import logging
224 logging.basicConfig(level=logging.INFO)
225 def wrap_func(func):
226 def _wrap_func(*args, **kwargs):
227 logging.info("calling %s (%s) (%s)",
228 func.__name__, repr(args), repr(kwargs))
229 return func(*args, **kwargs)
230 return _wrap_func
231
232 for mem in dir(Extractor):
233 fun = Extractor.__dict__[mem]
234 if callable(fun):
235 Extractor.__dict__[mem] = wrap_func(fun)
236
237def handle_result(duration, success, media_type):
161 if duration != -1:238 if duration != -1:
162 print "Miro-Movie-Data-Length: %s" % (duration / 1000000)239 print "Miro-Movie-Data-Length: %s" % (duration / 1000000)
163 else:240 else:
@@ -166,8 +243,21 @@
166 print "Miro-Movie-Data-Thumbnail: Success"243 print "Miro-Movie-Data-Thumbnail: Success"
167 else:244 else:
168 print "Miro-Movie-Data-Thumbnail: Failure"245 print "Miro-Movie-Data-Thumbnail: Failure"
246 print "Miro-Movie-Data-Type: %s" % media_type
169 sys.exit(0)247 sys.exit(0)
170248
171extractor = Extractor(sys.argv[1], sys.argv[2], handle_result)249def main(argv):
172gtk.gdk.threads_init()250 if len(argv) < 3:
173gtk.main()251 print "Syntax: gst_extractor.py <filename> <thumbnail>"
252 sys.exit(1)
253
254 if "--verbose" in argv:
255 make_verbose()
256 argv.remove("--verbose")
257
258 extractor = Extractor(argv[1], argv[2], handle_result)
259 gtk.gdk.threads_init()
260 gtk.main()
261
262if __name__ == "__main__":
263 main(sys.argv)
174264
=== modified file 'platform/gtk-x11/plat/renderers/gstreamerrenderer.py'
--- platform/gtk-x11/plat/renderers/gstreamerrenderer.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/renderers/gstreamerrenderer.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -29,8 +29,8 @@
29import sys29import sys
30import logging30import logging
31import os31import os
32import time
33import thread32import thread
33import shutil
34from threading import Event34from threading import Event
3535
36import pygst36import pygst
@@ -39,11 +39,16 @@
39import gst.interfaces39import gst.interfaces
40import gtk40import gtk
4141
42# not sure why this isn't in the gst module, but it's easy to define
43GST_PLAY_FLAG_TEXT = (1 << 2)
44
42from miro import app45from miro import app
43from miro import config46from miro import config
44from miro import prefs47from miro import prefs
45from miro.download_utils import nextFreeFilename48from miro.util import gather_subtitle_files, copy_subtitle_file
49from miro.gtcache import gettext as _
46from miro.plat import options50from miro.plat import options
51from miro import iso_639
4752
48from miro.frontends.widgets.gtk.threads import call_on_ui_thread53from miro.frontends.widgets.gtk.threads import call_on_ui_thread
4954
@@ -120,69 +125,104 @@
120 self.rate = 1.0125 self.rate = 1.0
121 self.select_callbacks = None126 self.select_callbacks = None
122127
123 self.playbin = gst.element_factory_make("playbin", "player")
124 self.bus = self.playbin.get_bus()
125 self.bus.add_signal_watch()
126 self.bus.enable_sync_message_emission()
127
128 self.bus.connect("message::eos", self.on_bus_message)
129 self.bus.connect("message::state-changed", self.on_bus_message)
130 self.bus.connect("message::error", self.on_bus_message)
131
132 audiosink = config.get(options.GSTREAMER_AUDIOSINK)128 audiosink = config.get(options.GSTREAMER_AUDIOSINK)
133 try:129 try:
134 self.audiosink = gst.element_factory_make(audiosink, "sink")130 self.audiosink = gst.element_factory_make(audiosink, "audiosink")
135131
136 except gst.ElementNotFoundError:132 except gst.ElementNotFoundError:
137 logging.info("gstreamerrenderer: ElementNotFoundError '%s'" % audiosink)133 logging.info("gstreamerrenderer: ElementNotFoundError '%s'",
134 audiosink)
138 audiosink = "autoaudiosink"135 audiosink = "autoaudiosink"
139 self.audiosink = gst.element_factory_make(audiosink, "sink")136 self.audiosink = gst.element_factory_make(audiosink, "audiosink")
140137
141 except Exception, e:138 except Exception, e:
142 logging.info("gstreamerrenderer: Exception thrown '%s'" % e)139 logging.info("gstreamerrenderer: Exception thrown '%s'" % e)
143 logging.exception("sink exception")140 logging.exception("sink exception")
144 audiosink = "alsasink"141 audiosink = "alsasink"
145 self.audiosink = gst.element_factory_make(alsasink, "sink")142 self.audiosink = gst.element_factory_make(audiosink, "audiosink")
146143
147 logging.info("GStreamer audiosink: %s", audiosink)144 logging.info("GStreamer audiosink: %s", audiosink)
145
146 self.supports_subtitles = True
147 self.playbin = None
148 self.bus = None
149 self.watch_ids = []
150
151 def build_playbin(self):
152 self.playbin = gst.element_factory_make("playbin2", "player")
153 self.bus = self.playbin.get_bus()
154 self.bus.add_signal_watch()
155 self.bus.enable_sync_message_emission()
156
157 self.watch_ids.append(self.bus.connect("message", self.on_bus_message))
148 self.playbin.set_property("audio-sink", self.audiosink)158 self.playbin.set_property("audio-sink", self.audiosink)
149159
160 def destroy_playbin(self):
161 if self.playbin is None:
162 return
163 for watch_id in self.watch_ids:
164 self.bus.disconnect(watch_id)
165 self.watch_ids = []
166 self.bus = None
167 self.playbin = None
168
150 def on_bus_message(self, bus, message):169 def on_bus_message(self, bus, message):
151 """receives message posted on the GstBus"""170 """receives message posted on the GstBus"""
171 if message.src is not self.playbin:
172 return
173
152 if message.type == gst.MESSAGE_ERROR:174 if message.type == gst.MESSAGE_ERROR:
175 err, debug = message.parse_error()
153 if self.select_callbacks is not None:176 if self.select_callbacks is not None:
154 self.select_callbacks[1]()177 self.select_callbacks[1]()
155 self.select_callbacks = None178 self.select_callbacks = None
179 logging.error("on_bus_message: gstreamer error: %s", err)
156 else:180 else:
157 err, debug = message.parse_error()181 err, debug = message.parse_error()
158 logging.error("on_bus_message: gstreamer error: %s", err)182 logging.error("on_bus_message: gstreamer error: %s", err)
159 elif message.type == gst.MESSAGE_STATE_CHANGED:183 elif message.type == gst.MESSAGE_STATE_CHANGED:
160 prev, new, pending = message.parse_state_changed()184 prev, new, pending = message.parse_state_changed()
161 if (message.src is self.playbin and new == gst.STATE_PAUSED and 185 if ((new == gst.STATE_PAUSED
162 self.select_callbacks is not None):186 and self.select_callbacks is not None)):
163 self.select_callbacks[0]()187 self.select_callbacks[0]()
164 self.select_callbacks = None188 self.select_callbacks = None
189 self.finish_select_file()
165 elif message.type == gst.MESSAGE_EOS:190 elif message.type == gst.MESSAGE_EOS:
166 app.playback_manager.on_movie_finished()191 app.playback_manager.on_movie_finished()
167192
168 def select_file(self, filename, callback, errback):193 def select_file(self, iteminfo, callback, errback, sub_filename=""):
169 """starts playing the specified file"""194 """starts playing the specified file"""
170 self.stop()195 self.stop()
196 self.destroy_playbin()
197 self.build_playbin()
198 self.enabled_track = None
199
200 self.iteminfo = iteminfo
201
171 self.select_callbacks = (callback, errback)202 self.select_callbacks = (callback, errback)
172 self.playbin.set_property("uri", "file://%s" % filename)203 self.playbin.set_property("uri", "file://%s" % iteminfo.video_path)
204 if sub_filename:
205 self.playbin.set_property("suburi", "file://%s" % sub_filename)
206 else:
207 self.playbin.set_property("suburi", None)
173 self.playbin.set_state(gst.STATE_PAUSED)208 self.playbin.set_state(gst.STATE_PAUSED)
174209
175 def get_current_time(self):210 def finish_select_file(self):
211 pass
212
213 def get_current_time(self, attempt=0):
214 # query_position fails periodically, so this attempts it 5 times
215 # and if after that it fails, then we return 0.
216 if attempt == 5:
217 return 0
176 try:218 try:
177 position, format = self.playbin.query_position(gst.FORMAT_TIME)219 position, fmt = self.playbin.query_position(gst.FORMAT_TIME)
178 return to_seconds(position)220 return to_seconds(position)
179 except Exception, e:221 except gst.QueryError, qe:
180 logging.warn("get_current_time: caught exception: %s" % e)222 logging.warn("get_current_time: caught exception: %s" % qe)
181 return None223 return self.get_current_time(attempt + 1)
182224
183 def _seek(self, seconds):225 def _seek(self, seconds):
184 # FIXME - switch to self.playbin.seek_simple ?
185 # self.player.seek_simple(self.time_format, gst.SEEK_FLAG_FLUSH, seek_ns)
186 event = gst.event_new_seek(1.0,226 event = gst.event_new_seek(1.0,
187 gst.FORMAT_TIME,227 gst.FORMAT_TIME,
188 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,228 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
@@ -192,30 +232,36 @@
192 if not result:232 if not result:
193 logging.error("seek failed")233 logging.error("seek failed")
194234
195 def _on_state_changed(self, bus, message, seconds):235 def _set_current_time_actual(self, bus, message, seconds):
196 if self.playbin.get_state(0)[1] in (gst.STATE_PAUSED, gst.STATE_PLAYING):236 if self.playbin.get_state(0)[1] in (gst.STATE_PAUSED,
237 gst.STATE_PLAYING):
197 self._seek(seconds)238 self._seek(seconds)
198 self.bus.disconnect(self._on_state_changed_id)239 self.bus.disconnect(self._set_current_time_actual_id)
199240
200 def set_current_time(self, seconds):241 def set_current_time(self, seconds):
201 # only want to kick these off when PAUSED or PLAYING242 # only want to kick these off when PAUSED or PLAYING
202 if self.playbin.get_state(0)[1] not in (gst.STATE_PAUSED, gst.STATE_PLAYING):243 if self.playbin.get_state(0)[1] not in (gst.STATE_PAUSED,
203 self._on_state_changed_id = self.bus.connect("message::state-changed",244 gst.STATE_PLAYING):
204 self._on_state_changed, seconds)245 self._set_current_time_actual_id = self.bus.connect(
246 "message::state-changed",
247 self._set_current_time_actual,
248 seconds)
205 return249 return
206250
207 self._seek(seconds)251 self._seek(seconds)
208252
209 def get_duration(self):253 def get_duration(self):
210 try:254 try:
211 duration, format = self.playbin.query_duration(gst.FORMAT_TIME)255 duration, fmt = self.playbin.query_duration(gst.FORMAT_TIME)
212 return to_seconds(duration)256 return to_seconds(duration)
213 except Exception, e:257 except gst.QueryError, qe:
214 logging.warn("get_duration: caught exception: %s" % e)258 logging.warn("get_duration: caught exception: %s" % qe)
215 return None259 return None
216260
217 def reset(self):261 def reset(self):
218 self.playbin.set_state(gst.STATE_NULL)262 if self.playbin:
263 self.playbin.set_state(gst.STATE_NULL)
264 self.destroy_playbin()
219265
220 def set_volume(self, level):266 def set_volume(self, level):
221 self.playbin.set_property("volume", level)267 self.playbin.set_property("volume", level)
@@ -227,7 +273,9 @@
227 self.playbin.set_state(gst.STATE_PAUSED)273 self.playbin.set_state(gst.STATE_PAUSED)
228274
229 def stop(self):275 def stop(self):
230 self.playbin.set_state(gst.STATE_NULL)276 if self.playbin:
277 self.playbin.set_state(gst.STATE_NULL)
278 self.destroy_playbin()
231279
232 def get_rate(self):280 def get_rate(self):
233 return 256281 return 256
@@ -238,46 +286,62 @@
238 self.rate = rate286 self.rate = rate
239 position = self.playbin.query_position(gst.FORMAT_TIME, None)[0]287 position = self.playbin.query_position(gst.FORMAT_TIME, None)[0]
240 if rate >= 0:288 if rate >= 0:
241 self.playbin.seek(rate, 289 self.playbin.seek(rate,
242 gst.FORMAT_TIME, 290 gst.FORMAT_TIME,
243 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,291 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
244 gst.SEEK_TYPE_SET,292 gst.SEEK_TYPE_SET,
245 position + (rate * gst.SECOND),293 position + (rate * gst.SECOND),
246 gst.SEEK_TYPE_SET, 294 gst.SEEK_TYPE_SET,
247 -1)295 -1)
248 else:296 else:
249 self.playbin.seek(rate,297 self.playbin.seek(rate,
250 gst.FORMAT_TIME, 298 gst.FORMAT_TIME,
251 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,299 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
252 gst.SEEK_TYPE_SET, 300 gst.SEEK_TYPE_SET,
253 0,301 0,
254 gst.SEEK_TYPE_SET,302 gst.SEEK_TYPE_SET,
255 position + (rate * gst.SECOND))303 position + (rate * gst.SECOND))
304
305class AudioRenderer(Renderer):
306 pass
256307
257class VideoRenderer(Renderer):308class VideoRenderer(Renderer):
258 def __init__(self):309 def __init__(self):
259 Renderer.__init__(self)310 Renderer.__init__(self)
260 logging.info("GStreamer version: %s", gst.version_string())
261
262 self.bus.connect('sync-message::element', self.on_sync_message)
263311
264 videosink = config.get(options.GSTREAMER_IMAGESINK)312 videosink = config.get(options.GSTREAMER_IMAGESINK)
265 try:313 try:
266 self.sink = gst.element_factory_make(videosink, "sink")314 self.videosink = gst.element_factory_make(videosink, "videosink")
267315
268 except gst.ElementNotFoundError:316 except gst.ElementNotFoundError:
269 logging.info("gstreamerrenderer: ElementNotFoundError '%s'" % videosink)317 logging.info("gstreamerrenderer: ElementNotFoundError '%s'",
270 videosink = "ximagesink"318 videosink)
271 self.sink = gst.element_factory_make(videosink, "sink")319 videosink = "xvimagesink"
320 self.videosink = gst.element_factory_make(videosink, "videosink")
272321
273 except Exception, e:322 except Exception, e:
274 logging.info("gstreamerrenderer: Exception thrown '%s'" % e)323 logging.info("gstreamerrenderer: Exception thrown '%s'" % e)
275 logging.exception("sink exception")324 logging.exception("sink exception")
276 videosink = "ximagesink"325 videosink = "ximagesink"
277 self.sink = gst.element_factory_make(videosink, "sink")326 self.videosink = gst.element_factory_make(videosink, "videosink")
278327
279 logging.info("GStreamer videosink: %s", videosink)328 logging.info("GStreamer videosink: %s", videosink)
280 self.playbin.set_property("video-sink", self.sink)329 self.textsink = gst.element_factory_make("textoverlay", "textsink")
330
331 def build_playbin(self):
332 Renderer.build_playbin(self)
333 self.watch_ids.append(self.bus.connect('sync-message::element', self.on_sync_message))
334 self.playbin.set_property("video-sink", self.videosink)
335 try:
336 self.playbin.set_property("text-sink", self.textsink)
337 except TypeError:
338 logging.warning("this platform has an old version of playbin2--no subtitle support.")
339 self.supports_subtitles = False
340
341 def select_file(self, filename, callback, errback, sub_filename=""):
342 Renderer.select_file(self, filename, callback, errback, sub_filename)
343 if sub_filename != "" and self.supports_subtitles:
344 self.pick_subtitle_track = 0
281345
282 def on_sync_message(self, bus, message):346 def on_sync_message(self, bus, message):
283 if message.structure is None:347 if message.structure is None:
@@ -296,11 +360,12 @@
296 self.gc.foreground = gtk.gdk.color_parse("black")360 self.gc.foreground = gtk.gdk.color_parse("black")
297361
298 def on_destroy(self, widget):362 def on_destroy(self, widget):
299 self.playbin.set_state(gst.STATE_NULL)363 if self.playbin:
364 self.playbin.set_state(gst.STATE_NULL)
300365
301 def on_expose(self, widget, event):366 def on_expose(self, widget, event):
302 if self.sink and hasattr(self.sink, "expose"):367 if self.videosink and hasattr(self.videosink, "expose"):
303 self.sink.expose()368 self.videosink.expose()
304 else:369 else:
305 # if we had an image to show, we could do so here... that image370 # if we had an image to show, we could do so here... that image
306 # would show for audio-only items.371 # would show for audio-only items.
@@ -319,11 +384,157 @@
319 """Handle when the video window exits fullscreen mode."""384 """Handle when the video window exits fullscreen mode."""
320 logging.debug("haven't implemented exit_fullscreen method yet!")385 logging.debug("haven't implemented exit_fullscreen method yet!")
321386
322class AudioRenderer(Renderer):387 def finish_select_file(self):
323 pass388 Renderer.finish_select_file(self)
324 389 if hasattr(self, "pick_subtitle_track") and self.supports_subtitles:
390 flags = self.playbin.get_property('flags')
391 self.playbin.set_properties(flags=flags | GST_PLAY_FLAG_TEXT,
392 current_text=0)
393 del self.__dict__["pick_subtitle_track"]
394 return
395
396 if config.get(prefs.ENABLE_SUBTITLES) and self.supports_subtitles:
397 default_track = self.get_enabled_subtitle_track()
398 if default_track is None:
399 tracks = self.get_subtitle_tracks()
400 if len(tracks) > 0:
401 self.enable_subtitle_track(0)
402
403 def _get_subtitle_track_name(self, index):
404 """Returns the language for the track at the specified index.
405 """
406 if not self.supports_subtitles:
407 return None
408 tag_list = self.playbin.emit("get-text-tags", index)
409 lang = None
410 if tag_list is not None and gst.TAG_LANGUAGE_CODE in tag_list:
411 code = tag_list[gst.TAG_LANGUAGE_CODE]
412 lang = iso_639.find(code)
413 if lang is None:
414 return None
415 else:
416 return lang['name']
417
418 def _get_subtitle_file_name(self, filename):
419 """Returns the language for the file at the specified
420 filename.
421 """
422 if not self.supports_subtitles:
423 return None
424 basename, ext = os.path.splitext(filename)
425 movie_file, code = os.path.splitext(basename)
426
427 # if the filename is like "foo.srt" and "srt", then there
428 # is no language code, so we return None
429 if not code:
430 return None
431
432 # remove . in the code so we end up with what's probably
433 # a two or three letter language code
434 if "." in code:
435 code = code.replace(".", "")
436
437 lang = iso_639.find(code)
438 if lang is None:
439 return None
440 else:
441 return lang['name']
442
443 def get_subtitles(self):
444 """Returns a dict of index -> (language, filename) for available
445 tracks.
446 """
447 if not self.playbin or not self.supports_subtitles:
448 return {}
449
450 tracks = {}
451
452 for track_index in range(self.playbin.get_property("n-text")):
453 track_name = self._get_subtitle_track_name(track_index)
454 if track_name is None:
455 track_name = _("Track %(tracknumber)d",
456 {"tracknumber": track_index})
457 tracks[track_index] = (track_name, None)
458
459 files = gather_subtitle_files(self.iteminfo.video_path)
460
461 external_track_id = 100
462 for i, mem in enumerate(files):
463 track_name = self._get_subtitle_file_name(mem)
464 if track_name is None:
465 track_name = _("Subtitle file %(tracknumber)d",
466 {"tracknumber": i})
467 tracks[external_track_id + i] = (track_name, mem)
468
469 return tracks
470
471 def get_subtitle_tracks(self):
472 """Returns a 2-tuple of (index, language) for available
473 tracks.
474 """
475 if not self.supports_subtitles:
476 return []
477 tracks = [(index, filename)
478 for index, (filename, language) in self.get_subtitles().items()]
479 return tracks
480
481 def get_enabled_subtitle_track(self):
482 if not self.supports_subtitles:
483 return None
484 if self.enabled_track is not None:
485 return self.enabled_track
486 return self.playbin.get_property("current-text")
487
488 def enable_subtitle_track(self, track_index):
489 if not self.supports_subtitles:
490 return
491 tracks = self.get_subtitles()
492 if tracks.get(track_index) is None:
493 return
494
495 language, filename = tracks[track_index]
496
497 if filename is not None:
498 # file-based subtitle tracks have to get selected as files
499 # first, then enable_subtitle_track gets called again with
500 # the new track_index
501 pos = self.get_current_time()
502
503 # note: select_success needs to mirror what playback
504 # manager does
505 def select_success():
506 self.set_current_time(pos)
507 self.play()
508
509 self.select_subtitle_file(self.iteminfo, filename, select_success)
510 self.enabled_track = track_index
511 return
512 flags = self.playbin.get_property('flags')
513 self.playbin.set_properties(flags=flags | GST_PLAY_FLAG_TEXT,
514 current_text=track_index)
515
516 def disable_subtitles(self):
517 if not self.supports_subtitles:
518 return
519 flags = self.playbin.get_property('flags')
520 self.playbin.set_property('flags', flags & ~GST_PLAY_FLAG_TEXT)
521
522 def select_subtitle_file(self, iteminfo, sub_path,
523 handle_successful_select):
524 if not self.supports_subtitles:
525 return
526 def handle_ok():
527 handle_successful_select()
528 def handle_err():
529 app.playback_manager.stop()
530 filenames = [filename for lang, filename in self.get_subtitles().values()]
531 if sub_path not in filenames:
532 sub_path = copy_subtitle_file(sub_path, iteminfo.video_path)
533 self.select_file(iteminfo, handle_ok, handle_err, sub_path)
534
325def movie_data_program_info(movie_path, thumbnail_path):535def movie_data_program_info(movie_path, thumbnail_path):
326 extractor_path = os.path.join(os.path.split(__file__)[0], "gst_extractor.py")536 extractor_path = os.path.join(os.path.split(__file__)[0],
537 "gst_extractor.py")
327 return ((sys.executable, extractor_path, movie_path, thumbnail_path), None)538 return ((sys.executable, extractor_path, movie_path, thumbnail_path), None)
328539
329def get_item_type(item_info, success_callback, error_callback):540def get_item_type(item_info, success_callback, error_callback):
330541
=== removed file 'platform/gtk-x11/plat/renderers/xinerenderer.py'
--- platform/gtk-x11/plat/renderers/xinerenderer.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/renderers/xinerenderer.py 1970-01-01 00:00:00 +0000
@@ -1,268 +0,0 @@
1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17#
18# In addition, as a special exception, the copyright holders give
19# permission to link the code of portions of this program with the OpenSSL
20# library.
21#
22# You must obey the GNU General Public License in all respects for all of
23# the code used other than OpenSSL. If you modify file(s) with this
24# exception, you may extend this exception to your version of the file(s),
25# but you are not obligated to do so. If you do not wish to do so, delete
26# this exception statement from your version. If you delete this exception
27# statement from all source files in the program, then also delete it here.
28
29import os.path
30import logging
31
32import gtk
33import gobject
34
35from miro import app
36from miro import config
37from miro import xine
38from miro.plat import options
39from miro.plat import resources
40from miro.plat.frontends.widgets import threads
41
42class Sniffer:
43 def __init__(self):
44 self.xine = xine.Xine()
45 self.xine.setup_sniffer()
46
47 def get_item_type(self, filename):
48 return self.xine.get_type(filename)
49
50class Renderer:
51 def __init__(self):
52 logging.info("Xine version: %s", xine.getXineVersion())
53 self.xine = xine.Xine()
54 self._playing = False
55 self._volume = 0
56 self.xine.set_eos_callback(self.on_eos)
57
58 def on_eos(self):
59 # on_eos gets called by one of the xine threads, so we want to switch
60 # to the ui thread to do things.
61 threads.call_on_ui_thread(app.playback_manager.on_movie_finished)
62
63 def select_file(self, filename, success_callback, error_callback):
64 logging.error("Not implemented.")
65
66 def get_progress(self):
67 try:
68 pos, length = self.xine.get_position_and_length()
69 except (SystemExit, KeyboardInterrupt):
70 raise
71 except:
72 logging.warn("get_current_time: caught exception: %s" % e)
73 return None
74
75 def get_current_time(self):
76 try:
77 pos, length = self.xine.get_position_and_length()
78 return pos / 1000.0
79 except Exception, e:
80 logging.warn("get_current_time: caught exception: %s" % e)
81 return None
82
83 def set_current_time(self, seconds):
84 self.seek(seconds)
85
86 def seek(self, seconds):
87 # this is really funky. what's going on here is that xine-lib doesn't
88 # provide a way to seek while paused. if you seek, then it induces
89 # playing, but that's not what we want.
90 # so we do this sneaky thing where if we're paused, we shut the volume
91 # off, seek, pause, and turn the volume back on. that allows us to
92 # seek, remain paused, and doesn't cause a hiccup in sound.
93
94 if self._playing:
95 self.xine.seek(int(seconds * 1000))
96
97 else:
98 self._playing = True
99 self.xine.set_volume(0)
100 self.xine.seek(int(seconds * 1000))
101 self.pause()
102 self.set_volume(self._volume)
103
104 def get_duration(self):
105 try:
106 pos, length = self.xine.get_position_and_length()
107 return length / 1000.0
108 except (SystemExit, KeyboardInterrupt):
109 raise
110 except:
111 logging.exception("get_duration: caught exception")
112
113 def set_volume(self, level):
114 self._volume = level
115 self.xine.set_volume(int(level * 100))
116
117 def play(self):
118 self.xine.play()
119 self._playing = True
120
121 def pause(self):
122 if self._playing:
123 self.xine.pause()
124 self._playing = False
125
126 stop = pause
127 reset = pause
128
129 def get_rate(self):
130 logging.warn("get_rate not implemented for xine")
131
132 def set_rate(self, rate):
133 logging.warn("set_rate not implemented for xine")
134
135class VideoRenderer(Renderer):
136 def __init__(self):
137 Renderer.__init__(self)
138 self.driver = config.get(options.XINE_DRIVER)
139 logging.info("Xine video driver: %s", self.driver)
140
141 def set_widget(self, widget):
142 widget.connect("destroy", self.on_destroy)
143 widget.connect("configure-event", self.on_configure_event)
144 widget.connect("expose-event", self.on_expose_event)
145 self.widget = widget
146
147 # flush gdk output to ensure that the window we're passing to xine has
148 # been created
149 gtk.gdk.flush()
150 displayName = gtk.gdk.display_get_default().get_name()
151 self.xine.attach(displayName,
152 widget.persistent_window.xid,
153 self.driver,
154 int(options.shouldSyncX),
155 int(config.get(options.USE_XINE_XV_HACK)))
156 self.gc = widget.persistent_window.new_gc()
157 self.gc.foreground = gtk.gdk.color_parse("black")
158
159 def on_destroy(self, widget):
160 self.xine.detach()
161
162 def on_configure_event(self, widget, event):
163 self.xine.set_area(event.x, event.y, event.width, event.height)
164
165 def on_expose_event(self, widget, event):
166 # if we wanted to draw an image for audio-only items, this is where
167 # we'd do it.
168 widget.window.draw_rectangle(self.gc,
169 True,
170 0, 0,
171 widget.allocation.width,
172 widget.allocation.height)
173 self.xine.got_expose_event(event.area.x, event.area.y, event.area.width,
174 event.area.height)
175
176 def go_fullscreen(self):
177 """Handle when the video window goes fullscreen."""
178 # Sometimes xine doesn't seem to handle the expose events properly and
179 # only thinks part of the window is exposed. To work around this we
180 # send it a couple of fake expose events for the entire window, after
181 # a short time delay.
182
183 def fullscreen_expose_workaround():
184 try:
185 _, _, width, height, _ = self.widget.window.get_geometry()
186 self.xine.got_expose_event(0, 0, width, height)
187 except (SystemExit, KeyboardInterrupt):
188 raise
189 except:
190 return True
191 return False
192
193 gobject.timeout_add(500, fullscreen_expose_workaround)
194 gobject.timeout_add(1000, fullscreen_expose_workaround)
195
196 def exit_fullscreen(self):
197 """Handle when the video window exits fullscreen mode."""
198 # nothing to do here
199 pass
200
201 def select_file(self, filename, success_callback, error_callback):
202 self._filename = filename
203 if self.xine.select_file(filename):
204 gobject.idle_add(success_callback)
205 def expose_workaround():
206 try:
207 _, _, width, height, _ = self.widget.window.get_geometry()
208 self.xine.got_expose_event(0, 0, width, height)
209 except (SystemExit, KeyboardInterrupt):
210 raise
211 except:
212 return True
213 return False
214
215 gobject.timeout_add(500, expose_workaround)
216 self.seek(0)
217 else:
218 gobject.idle_add(error_callback)
219
220class AudioRenderer(Renderer):
221 def __init__(self):
222 Renderer.__init__(self)
223 self._attached = False
224
225 def attach(self):
226 if self._attached:
227 self.detach()
228 self.xine.attach("", 0, "none", 0, 0)
229 self._attached = True
230
231 def detach(self):
232 self.xine.detach()
233 self._attached = False
234
235 def select_file(self, filename, success_callback, error_callback):
236 if not self._attached:
237 self.attach()
238
239 self._filename = filename
240 if self.xine.select_file(filename):
241 gobject.idle_add(success_callback)
242 self.seek(0)
243 else:
244 gobject.idle_add(error_callback)
245
246 def on_eos(self):
247 Renderer.on_eos(self)
248
249def movie_data_program_info(movie_path, thumbnail_path):
250 if os.path.exists(resources.path('../../../lib/miro/xine_extractor')):
251 path = resources.path('../../../lib/miro/xine_extractor')
252 return ((path, movie_path, thumbnail_path), None)
253 else:
254 logging.error("xine_extractor cannot be found.")
255 raise NotImplementedError()
256
257_SNIFFER = Sniffer()
258
259def get_item_type(item_info, success_callback, error_callback):
260 item_type = _SNIFFER.get_item_type(item_info.video_path)
261 if item_type == -1:
262 error_callback()
263 elif item_type == 0:
264 success_callback("video")
265 elif item_type == 1:
266 success_callback("audio")
267 else:
268 success_callback("unplayable")
2690
=== modified file 'platform/gtk-x11/plat/resources.py'
--- platform/gtk-x11/plat/resources.py 2010-02-20 02:34:26 +0000
+++ platform/gtk-x11/plat/resources.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/screensaver.py'
--- platform/gtk-x11/plat/screensaver.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/screensaver.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/upgrade.py'
--- platform/gtk-x11/plat/upgrade.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/upgrade.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== modified file 'platform/gtk-x11/plat/utils.py'
--- platform/gtk-x11/plat/utils.py 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/plat/utils.py 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
@@ -39,7 +39,8 @@
39import urllib39import urllib
40import sys40import sys
41import time41import time
42from miro.util import returnsUnicode, returnsBinary, checkU, checkB, call_command42from miro.util import (returns_unicode, returns_binary, check_u, check_b,
43 call_command)
43import miro44import miro
44from miro.plat import options45from miro.plat import options
4546
@@ -49,10 +50,8 @@
49# very easy.50# very easy.
50from os.path import samefile51from os.path import samefile
5152
52
53# this is used in portable/gtcache.py53# this is used in portable/gtcache.py
54localeInitialized = True54_locale_initialized = False
55
5655
57def get_available_bytes_for_movies():56def get_available_bytes_for_movies():
58 """Helper method used to get the free space on the disk where downloaded57 """Helper method used to get the free space on the disk where downloaded
@@ -92,10 +91,13 @@
92 print "ui function called from thread %s" % threading.currentThread()91 print "ui function called from thread %s" % threading.currentThread()
93 traceback.print_stack()92 traceback.print_stack()
9493
94def locale_initialized():
95 return _locale_initialized
9596
96# gettext understands *NIX locales, so we don't have to do anything97def initialize_locale():
97def initializeLocale():98 # gettext understands *NIX locales, so we don't have to do anything
98 pass99 global _locale_initialized
100 _locale_initialized = True
99101
100def setup_logging(inDownloader=False):102def setup_logging(inDownloader=False):
101 if inDownloader:103 if inDownloader:
@@ -121,13 +123,13 @@
121 logging.getLogger('').addHandler(rotater)123 logging.getLogger('').addHandler(rotater)
122 rotater.doRollover()124 rotater.doRollover()
123125
124@returnsBinary126@returns_binary
125def utf8_to_filename(filename):127def utf8_to_filename(filename):
126 if not isinstance(filename, str):128 if not isinstance(filename, str):
127 raise ValueError("filename is not a str")129 raise ValueError("filename is not a str")
128 return filename130 return filename
129131
130@returnsBinary132@returns_binary
131def unicodeToFilename(filename, path=None):133def unicodeToFilename(filename, path=None):
132 """Takes in a unicode string representation of a filename (NOT a file134 """Takes in a unicode string representation of a filename (NOT a file
133 path) and creates a valid byte representation of it attempting to preserve135 path) and creates a valid byte representation of it attempting to preserve
@@ -136,9 +138,9 @@
136 Note: This is not guaranteed to give the same results every time it is run,138 Note: This is not guaranteed to give the same results every time it is run,
137 nor is it guaranteed to reverse the results of filenameToUnicode.139 nor is it guaranteed to reverse the results of filenameToUnicode.
138 """140 """
139 @returnsUnicode141 @returns_unicode
140 def shortenFilename(filename):142 def shortenFilename(filename):
141 checkU(filename)143 check_u(filename)
142 first, last = os.path.splitext(filename)144 first, last = os.path.splitext(filename)
143145
144 if first:146 if first:
@@ -146,9 +148,9 @@
146148
147 return unicode(last[:-1])149 return unicode(last[:-1])
148150
149 checkU(filename)151 check_u(filename)
150 if path:152 if path:
151 checkB(path)153 check_b(path)
152 else:154 else:
153 path = os.getcwd()155 path = os.getcwd()
154156
@@ -175,7 +177,7 @@
175177
176 return new_filename178 return new_filename
177179
178@returnsUnicode180@returns_unicode
179def filenameToUnicode(filename, path=None):181def filenameToUnicode(filename, path=None):
180 """Given a filename in raw bytes, return the unicode representation182 """Given a filename in raw bytes, return the unicode representation
181183
@@ -183,8 +185,8 @@
183 not is it guaranteed to reverse the results of unicodeToFilename.185 not is it guaranteed to reverse the results of unicodeToFilename.
184 """186 """
185 if path:187 if path:
186 checkB(path)188 check_b(path)
187 checkB(filename)189 check_b(filename)
188 try:190 try:
189 return filename.decode(locale.getpreferredencoding())191 return filename.decode(locale.getpreferredencoding())
190 except (SystemExit, KeyboardInterrupt):192 except (SystemExit, KeyboardInterrupt):
@@ -192,59 +194,31 @@
192 except:194 except:
193 return filename.decode('ascii', 'replace')195 return filename.decode('ascii', 'replace')
194196
195# Takes filename given by the OS and turn it into a FilenameType197@returns_unicode
196def osFilenameToFilenameType(filename):198def make_url_safe(s, safe='/'):
197 return FilenameType(filename)
198
199# Takes an array of filenames given by the OS and turn them into a FilenameTypes
200def osFilenamesToFilenameTypes(filenames):
201 return [osFilenameToFilenameType(filename) for filename in filenames]
202
203# Takes a FilenameType and turn it into something the OS accepts.
204def filenameTypeToOSFilename(filename):
205 return filename
206
207@returnsUnicode
208def makeURLSafe(s, safe='/'):
209 """Takes in a byte string or a unicode string and does the right thing199 """Takes in a byte string or a unicode string and does the right thing
210 to make a URL200 to make a URL
211 """201 """
212 if isinstance(s, str):202 if isinstance(s, str):
213 # quote the byte string203 # quote the byte string
214 return urllib.quote(s, safe=safe).decode('ascii')204 return urllib.quote(s, safe=safe).decode('ascii')
215 else:205
216 try:206 try:
217 return urllib.quote(s.encode(locale.getpreferredencoding()), safe=safe).decode('ascii')207 return urllib.quote(s.encode(locale.getpreferredencoding()), safe=safe).decode('ascii')
218 except (SystemExit, KeyboardInterrupt):208 except (SystemExit, KeyboardInterrupt):
219 raise209 raise
220 except:210 except:
221 return s.decode('ascii', 'replace')211 return s.decode('ascii', 'replace')
222212
223@returnsBinary213@returns_binary
224def unmakeURLSafe(s):214def unmake_url_safe(s):
225 """Undoes makeURLSafe (assuming it was passed a filenameType)215 """Undoes make_url_safe (assuming it was passed a filenameType)
226 """216 """
227 # unquote the byte string217 # unquote the byte string
228 checkU(s)218 check_u(s)
229 return urllib.unquote(s.encode('ascii'))219 return urllib.unquote(s.encode('ascii'))
230220
231_convert_path_cache = None221def pid_is_running(pid):
232
233@returnsBinary
234def findConvert():
235 global _convert_path_cache
236
237 if _convert_path_cache != None:
238 return _convert_path_cache
239
240 search_path = os.environ.get('PATH', os.defpath)
241 for d in search_path.split(os.pathsep):
242 convert_path = os.path.join(d, 'convert')
243 if os.path.exists(convert_path):
244 _convert_path_cache = convert_path
245 return _convert_path_cache
246
247def pidIsRunning(pid):
248 if pid is None:222 if pid is None:
249 return False223 return False
250 try:224 try:
@@ -253,15 +227,15 @@
253 except OSError, err:227 except OSError, err:
254 return err.errno == errno.EPERM228 return err.errno == errno.EPERM
255229
256def killProcess(pid):230def kill_process(pid):
257 if pid is None:231 if pid is None:
258 return232 return
259 if pidIsRunning(pid):233 if pid_is_running(pid):
260 try:234 try:
261 os.kill(pid, signal.SIGTERM)235 os.kill(pid, signal.SIGTERM)
262 for i in xrange(100):236 for i in xrange(100):
263 time.sleep(.01)237 time.sleep(.01)
264 if not pidIsRunning(pid):238 if not pid_is_running(pid):
265 return239 return
266 os.kill(pid, signal.SIGKILL)240 os.kill(pid, signal.SIGKILL)
267 except (SystemExit, KeyboardInterrupt):241 except (SystemExit, KeyboardInterrupt):
@@ -269,10 +243,10 @@
269 except:243 except:
270 logging.exception("error killing download daemon")244 logging.exception("error killing download daemon")
271245
272def launchDownloadDaemon(oldpid, env):246def launch_download_daemon(oldpid, env):
273 # Use UNIX style kill247 # Use UNIX style kill
274 if oldpid is not None and pidIsRunning(oldpid):248 if oldpid is not None and pid_is_running(oldpid):
275 killProcess(oldpid)249 kill_process(oldpid)
276250
277 environ = os.environ.copy()251 environ = os.environ.copy()
278 environ['MIRO_FRONTEND'] = options.frontend252 environ['MIRO_FRONTEND'] = options.frontend
279253
=== modified file 'platform/gtk-x11/plat/xlibhelper.pyx'
--- platform/gtk-x11/plat/xlibhelper.pyx 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/plat/xlibhelper.pyx 2010-04-14 21:08:30 +0000
@@ -1,5 +1,5 @@
1# Miro - an RSS based video player application1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation2# Copyright (C) 2005-2010 Participatory Culture Foundation
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by5# it under the terms of the GNU General Public License as published by
66
=== added file 'platform/gtk-x11/pylintrc'
--- platform/gtk-x11/pylintrc 1970-01-01 00:00:00 +0000
+++ platform/gtk-x11/pylintrc 2010-04-14 21:08:30 +0000
@@ -0,0 +1,304 @@
1# lint Python modules using external checkers.
2#
3# This is the main checker controling the other ones and the reports
4# generation. It is itself both a raw checker and an astng checker in order
5# to:
6# * handle message activation / deactivation at the module level
7# * handle some basic but necessary stats'data (number of classes, methods...)
8#
9[MASTER]
10
11# Specify a configuration file.
12#rcfile=
13
14# Profiled execution.
15profile=no
16
17# Add <file or directory> to the black list. It should be a base name, not a
18# path. You may set this option multiple times.
19#ignore=.svn
20
21# Pickle collected data for later comparisons.
22persistent=yes
23
24# Set the cache size for astng objects.
25cache-size=5000
26
27# List of plugins (as comma separated values of python modules names) to load,
28# usually to register additional checkers.
29load-plugins=
30
31
32[MESSAGES CONTROL]
33
34# Enable only checker(s) with the given id(s). This option conflict with the
35# disable-checker option
36#enable-checker=
37
38# Enable all checker(s) except those with the given id(s). This option conflict
39# with the disable-checker option
40disable-checker=imports
41
42# Enable all messages in the listed categories.
43#enable-msg-cat=
44
45# Disable all messages in the listed categories.
46#disable-msg-cat=
47
48# Enable the message(s) with the given id(s).
49#enable-msg=
50
51# Disable the message(s) with the given id(s).
52# see http://pylint-messages.wikidot.com/all-codes for codes
53# C0111: Missing docstring
54# C0302: Too many lines in module (%s)
55disable-msg=C0302,C0111,R0801
56
57
58[REPORTS]
59
60# set the output format. Available formats are text, parseable, colorized and
61# html
62output-format=text
63
64# Include message's id in output
65include-ids=yes
66
67# Put messages in a separate file for each module / package specified on the
68# command line instead of printing them on stdout. Reports (if any) will be
69# written in a file name "pylint_global.[txt|html]".
70files-output=no
71
72# Tells wether to display a full report or only the messages
73reports=yes
74
75# Python expression which should return a note less than 10 (10 is the highest
76# note).You have access to the variables errors warning, statement which
77# respectivly contain the number of errors / warnings messages and the total
78# number of statements analyzed. This is used by the global evaluation report
79# (R0004).
80evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
81
82# Add a comment according to your evaluation note. This is used by the global
83# evaluation report (R0004).
84comment=no
85
86# Enable the report(s) with the given id(s).
87#enable-report=
88
89# Disable the report(s) with the given id(s).
90#disable-report=
91
92
93# checks for
94# * unused variables / imports
95# * undefined variables
96# * redefinition of variable from builtins or from an outer scope
97# * use of variable before assigment
98#
99[VARIABLES]
100
101# Tells wether we should check for unused import in __init__ files.
102init-import=no
103
104# A regular expression matching names used for dummy variables (i.e. not used).
105dummy-variables-rgx=_|dummy
106
107# List of additional names supposed to be defined in builtins. Remember that
108# you should avoid to define new builtins when possible.
109additional-builtins=
110
111
112# try to find bugs in the code using type inference
113#
114[TYPECHECK]
115
116# Tells wether missing members accessed in mixin class should be ignored. A
117# mixin class is detected if its name ends with "mixin" (case insensitive).
118ignore-mixin-members=yes
119
120# When zope mode is activated, consider the acquired-members option to ignore
121# access to some undefined attributes.
122zope=no
123
124# List of members which are usually get through zope's acquisition mecanism and
125# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
126acquired-members=REQUEST,acl_users,aq_parent
127
128
129# checks for :
130# * doc strings
131# * modules / classes / functions / methods / arguments / variables name
132# * number of arguments, local variables, branchs, returns and statements in
133# functions, methods
134# * required module attributes
135# * dangerous default values as arguments
136# * redefinition of function / method / class
137# * uses of the global statement
138#
139[BASIC]
140
141# Required attributes for module, separated by a comma
142required-attributes=
143
144# Regular expression which should only match functions or classes name which do
145# not require a docstring
146no-docstring-rgx=__.*__
147
148# Regular expression which should only match correct module names
149module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
150
151# Regular expression which should only match correct module level names
152const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$
153
154# Regular expression which should only match correct class names
155class-rgx=[A-Z_][a-zA-Z0-9]+$
156
157# Regular expression which should only match correct function names
158function-rgx=[a-z_][a-z0-9_]{2,30}$
159
160# Regular expression which should only match correct method names
161method-rgx=[a-z_][a-z0-9_]{2,30}$
162
163# Regular expression which should only match correct instance attribute names
164attr-rgx=[a-z_][a-z0-9_]{2,30}$
165
166# Regular expression which should only match correct argument names
167argument-rgx=[a-z_][a-z0-9_]{2,30}$
168
169# Regular expression which should only match correct variable names
170variable-rgx=[a-z_][a-z0-9_]{2,30}$
171
172# Regular expression which should only match correct list comprehension /
173# generator expression variable names
174inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
175
176# Good variable names which should always be accepted, separated by a comma
177good-names=i,f,fp,fn,j,k,ex,Run,_
178
179# Bad variable names which should always be refused, separated by a comma
180bad-names=foo,bar,baz,toto,tutu,tata
181
182# List of builtins function names that should not be used, separated by a comma
183bad-functions=apply,input
184
185
186# checks for sign of poor/misdesign:
187# * number of methods, attributes, local variables...
188# * size, complexity of functions, methods
189#
190[DESIGN]
191
192# Maximum number of arguments for function / method
193max-args=12
194
195# Maximum number of locals for function / method body
196max-locals=30
197
198# Maximum number of return / yield for function / method body
199max-returns=12
200
201# Maximum number of branch for function / method body
202max-branchs=30
203
204# Maximum number of statements in function / method body
205max-statements=60
206
207# Maximum number of parents for a class (see R0901).
208max-parents=7
209
210# Maximum number of attributes for a class (see R0902).
211max-attributes=20
212
213# Minimum number of public methods for a class (see R0903).
214min-public-methods=0
215
216# Maximum number of public methods for a class (see R0904).
217max-public-methods=20
218
219
220# checks for
221# * external modules dependencies
222# * relative / wildcard imports
223# * cyclic imports
224# * uses of deprecated modules
225#
226[IMPORTS]
227
228# Deprecated modules which should not be used, separated by a comma
229deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
230
231# Create a graph of every (i.e. internal and external) dependencies in the
232# given file (report R0402 must not be disabled)
233import-graph=
234
235# Create a graph of external dependencies in the given file (report R0402 must
236# not be disabled)
237ext-import-graph=
238
239# Create a graph of internal dependencies in the given file (report R0402 must
240# not be disabled)
241int-import-graph=
242
243
244# checks for :
245# * methods without self as first argument
246# * overridden methods signature
247# * access only to existant members via self
248# * attributes not defined in the __init__ method
249# * supported interfaces implementation
250# * unreachable code
251#
252[CLASSES]
253
254# List of interface methods to ignore, separated by a comma. This is used for
255# instance to not check methods defines in Zope's Interface base class.
256ignore-iface-methods=
257
258# List of method names used to declare (i.e. assign) instance attributes.
259defining-attr-methods=__init__,__new__,setUp
260
261
262# checks for similarities and duplicated code. This computation may be
263# memory / CPU intensive, so you should disable it if you experiments some
264# problems.
265#
266[SIMILARITIES]
267
268# Minimum lines number of a similarity.
269min-similarity-lines=10
270
271# Ignore comments when computing similarities.
272ignore-comments=yes
273
274# Ignore docstrings when computing similarities.
275ignore-docstrings=yes
276
277
278# checks for:
279# * warning notes in the code like FIXME, XXX
280# * PEP 263: source code with non ascii character but no encoding declaration
281#
282[MISCELLANEOUS]
283
284# List of note tags to take in consideration, separated by a comma.
285notes=FIXME,XXX,TODO
286
287
288# checks for :
289# * unauthorized constructions
290# * strict indentation
291# * line length
292# * use of <> instead of !=
293#
294[FORMAT]
295
296# Maximum number of characters on a single line.
297max-line-length=100
298
299# Maximum number of lines in a module
300max-module-lines=10000
301
302# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
303# tab).
304indent-string=' '
0305
=== modified file 'platform/gtk-x11/run.sh'
--- platform/gtk-x11/run.sh 2009-12-13 17:59:01 +0000
+++ platform/gtk-x11/run.sh 2010-04-14 21:08:30 +0000
@@ -1,7 +1,7 @@
1#!/bin/sh1#!/bin/sh
22
3# Miro - an RSS based video player application3# Miro - an RSS based video player application
4# Copyright (C) 2005-2009 Participatory Culture Foundation4# Copyright (C) 2005-2010 Participatory Culture Foundation
5#5#
6# This program is free software; you can redistribute it and/or modify6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by7# it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
29# statement from all source files in the program, then also delete it here.29# statement from all source files in the program, then also delete it here.
3030
31PYTHON=`which python`31PYTHON=`which python`
32PYTHON_VERSION=`python -c 'import sys; info=sys.version_info; print "%s.%s" % (info[0], info[1])'`32PYTHON_VERSION=`${PYTHON} -c 'import sys; info=sys.version_info; print "%s.%s" % (info[0], info[1])'`
33PREFIX=/usr33PREFIX=/usr
34export MIRO_SHARE_ROOT=dist/$PREFIX/share/34export MIRO_SHARE_ROOT=dist/$PREFIX/share/
35export MIRO_RESOURCE_ROOT=dist/$PREFIX/share/miro/resources/35export MIRO_RESOURCE_ROOT=dist/$PREFIX/share/miro/resources/
3636
=== modified file 'platform/gtk-x11/setup.py' (properties changed: +x to -x)
--- platform/gtk-x11/setup.py 2010-02-20 02:34:26 +0000
+++ platform/gtk-x11/setup.py 2010-04-14 21:08:30 +0000
@@ -1,7 +1,7 @@
1#!/usr/bin/env python1#!/usr/bin/env python
22
3# Miro - an RSS based video player application3# Miro - an RSS based video player application
4# Copyright (C) 2005-2009 Participatory Culture Foundation4# Copyright (C) 2005-2010 Participatory Culture Foundation
5#5#
6# This program is free software; you can redistribute it and/or modify6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by7# it under the terms of the GNU General Public License as published by
@@ -32,16 +32,6 @@
32## Paths and configuration ##32## Paths and configuration ##
33###############################################################################33###############################################################################
3434
35# The xine hack helps older systems. See bug #7132.
36#
37# If this hack is enabled and Miro crashes at the end of playback when
38# the xine renderer is used, then try disabling the hack.
39#
40# As of Miro 2.0, there is a command-line option to enable/disable the
41# hack.
42USE_XINE_HACK = False
43
44
45# The following properties allow you to explicitly set xulrunner paths and35# The following properties allow you to explicitly set xulrunner paths and
46# library names in the case that Miro guesses them wrong for your system.36# library names in the case that Miro guesses them wrong for your system.
47# When setting these, you must make sure that:37# When setting these, you must make sure that:
@@ -116,16 +106,24 @@
116GTKMOZEMBED_LIB = None106GTKMOZEMBED_LIB = None
117XULRUNNER_19 = None107XULRUNNER_19 = None
118108
119# The name of the boost python library. Used for building extensions.
120# If this is set to None, setup.py will divine the right lib to use.
121# It should probably be either "boost_python" or "boost_python-mt".
122BOOST_LIB = None
123
124109
125###############################################################################110###############################################################################
126## End of configuration. No user-serviceable parts inside ##111## End of configuration. No user-serviceable parts inside ##
127###############################################################################112###############################################################################
128113
114import sys
115
116# verify we have required bits for compiling Miro
117
118try:
119 from Pyrex.Compiler import Version
120 if Version.version.split(".") < ["0", "9", "6", "4"]:
121 print "Pyrex 0.9.6.4 or greater required. You have version %s." % Version.version
122 sys.exit(1)
123except ImportError:
124 print "Pyrex not found. Please install Pyrex."
125 sys.exit(1)
126
129from distutils.cmd import Command127from distutils.cmd import Command
130from distutils.core import setup128from distutils.core import setup
131from distutils.extension import Extension129from distutils.extension import Extension
@@ -139,7 +137,6 @@
139import pwd137import pwd
140import subprocess138import subprocess
141import platform139import platform
142import sys
143import re140import re
144import time141import time
145import shutil142import shutil
@@ -166,22 +163,18 @@
166 root_try = os.path.abspath(os.path.join(root_try, '..'))163 root_try = os.path.abspath(os.path.join(root_try, '..'))
167 return root_dir164 return root_dir
168165
169def is_x64():
170 return platform.machine() == "x86_64" or platform.machine() == "amd64"
171
172root_dir = get_root_dir()166root_dir = get_root_dir()
173portable_dir = os.path.join(root_dir, 'portable')167portable_dir = os.path.join(root_dir, 'portable')
174portable_frontend_dir = os.path.join(portable_dir, 'frontends')168portable_frontend_dir = os.path.join(portable_dir, 'frontends')
175portable_xpcom_dir = os.path.join(portable_frontend_dir, 'widgets', 'gtk',169portable_xpcom_dir = os.path.join(portable_frontend_dir, 'widgets', 'gtk',
176 'xpcom')170 'xpcom')
177dl_daemon_dir = os.path.join(portable_dir, 'dl_daemon')171dl_daemon_dir = os.path.join(portable_dir, 'dl_daemon')
178test_dir = os.path.join(portable_dir, 'test')172test_dir = os.path.join(portable_dir, 'test')
179resource_dir = os.path.join(root_dir, 'resources')173resource_dir = os.path.join(root_dir, 'resources')
180platform_dir = os.path.join(root_dir, 'platform', 'gtk-x11')174platform_dir = os.path.join(root_dir, 'platform', 'gtk-x11')
181platform_package_dir = os.path.join(platform_dir, 'plat')175platform_package_dir = os.path.join(platform_dir, 'plat')
182platform_widgets_dir = os.path.join(platform_package_dir, 'frontends',176platform_widgets_dir = os.path.join(platform_package_dir, 'frontends',
183 'widgets')177 'widgets')
184xine_dir = os.path.join(platform_dir, 'xine')
185178
186# insert the root_dir to the beginning of sys.path so that we can179# insert the root_dir to the beginning of sys.path so that we can
187# pick up portable and other packages180# pick up portable and other packages
@@ -243,7 +236,6 @@
243 """Wait for a command and return its output. Check for common errors and236 """Wait for a command and return its output. Check for common errors and
244 raise an exception if one of these occurs.237 raise an exception if one of these occurs.
245 """238 """
246
247 p = subprocess.Popen(cmd, shell=True, close_fds=True,239 p = subprocess.Popen(cmd, shell=True, close_fds=True,
248 stdout=subprocess.PIPE, stderr=subprocess.PIPE)240 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
249 stdout, stderr = p.communicate()241 stdout, stderr = p.communicate()
@@ -294,31 +286,13 @@
294286
295 return options_dict287 return options_dict
296288
297all_libs = []289def package_exists(package_name):
298if os.path.exists(os.path.join(sysconfig.PREFIX, "lib")):290 """
299 all_libs.extend(os.listdir(os.path.join(sysconfig.PREFIX, "lib")))291 Return True if the package is present in the system. False otherwise.
300if os.path.exists(os.path.join(sysconfig.PREFIX, "lib64")):292 The check is made with pkg-config.
301 all_libs.extend(os.listdir(os.path.join(sysconfig.PREFIX, "lib64")))293 """
302all_libs = [mem for mem in all_libs if mem.startswith("libboost")]294 # pkg-config returns 0 if the package is present
303295 return subprocess.call(['pkg-config', '--exists', package_name]) == 0
304def mt_or_not(s, all_libs=all_libs):
305 for mem in all_libs:
306 if mem.startswith("lib%s-mt" % s):
307 print "Using %s-mt" % s
308 return "%s-mt" % s
309 print "using %s" % s
310 return s
311
312if BOOST_LIB is None:
313 BOOST_LIB = mt_or_not("boost_python")
314else:
315 print "Using %s" % BOOST_LIB
316
317def compile_xine_extractor():
318 rv = os.system("gcc %s -o %s `pkg-config --libs --cflags gdk-pixbuf-2.0 glib-2.0 libxine`" %
319 (os.path.join(platform_dir, "xine/xine_extractor.c"), os.path.join(platform_dir, "xine/xine_extractor")))
320 if rv != 0:
321 raise RuntimeError("xine_extractor compilation failed. Possibly missing libxine, gdk-pixbuf-2.0, or glib-2.0.")
322296
323def generate_miro(xpcom_path):297def generate_miro(xpcom_path):
324 # build a miro script that wraps the miro.real script with an LD_LIBRARY_PATH298 # build a miro script that wraps the miro.real script with an LD_LIBRARY_PATH
@@ -361,90 +335,8 @@
361 f.close()335 f.close()
362336
363337
364#### The fasttypes extension ####
365fasttypes_ext = \
366 Extension("miro.fasttypes",
367 sources = [os.path.join(portable_dir, 'fasttypes.cpp')],
368 libraries = [BOOST_LIB],
369 )
370
371
372##### The libtorrent extension ####
373def fetch_sources(portable_dir):
374 sources = []
375 for root, dirs, files in os.walk(os.path.join(portable_dir, 'libtorrent')):
376 if '.svn' in dirs:
377 dirs.remove('.svn')
378 for file in files:
379 if file.endswith('.cpp') or file.endswith('.c'):
380 sources.append(os.path.join(root, file))
381 return sources
382
383def get_libtorrent_extension(portable_dir):
384 libtorrent_installed = False
385 try:
386 ret = parse_pkg_config("pkg-config", "libtorrent-rasterbar")
387 import libtorrent
388 libtorrent_installed = True
389 print "libtorrent-rasterbar (0.13 or later) and python bindings are installed--using system version."
390 return None
391 except RuntimeError:
392 print "libtorrent-rasterbar not installed on this system."
393 except ImportError:
394 print "python bindings for libtorrent-rasterbar not installed on this system"
395
396 include_dirs = [os.path.join(portable_dir, x) for x in
397 ['libtorrent/include', 'libtorrent/include/libtorrent']]
398
399 extra_compile_args = ["-Wno-missing-braces",
400 "-D_FILE_OFFSET_BITS=64",
401 "-DHAVE___INCLUDE_LIBTORRENT_ASIO_HPP=1",
402 "-DHAVE___INCLUDE_LIBTORRENT_ASIO_SSL_STREAM_HPP=1",
403 "-DHAVE___INCLUDE_LIBTORRENT_ASIO_IP_TCP_HPP=1",
404 "-DHAVE_PTHREAD=1", "-DTORRENT_USE_OPENSSL=1", "-DHAVE_SSL=1",
405 "-DNDEBUG=1", "-O2"]
406
407 if is_x64():
408 extra_compile_args.append("-DAMD64")
409
410 libraries = ['z', 'pthread', 'ssl']
411
412 # get mt or non-mt versions of the boost libraries
413 libraries += [mt_or_not("boost_python"),
414 mt_or_not("boost_filesystem"),
415 mt_or_not("boost_date_time"),
416 mt_or_not("boost_thread")]
417
418 config_vars = sysconfig.get_config_vars()
419 if "CFLAGS" in config_vars and "-Wstrict-prototypes" in config_vars["CFLAGS"]:
420 config_vars["CFLAGS"] = config_vars["CFLAGS"].replace("-Wstrict-prototypes", " ")
421
422 if "OPT" in config_vars and "-Wstrict-prototypes" in config_vars["OPT"]:
423 config_vars["OPT"] = config_vars["OPT"].replace("-Wstrict-prototypes", " ")
424
425 sources = fetch_sources(portable_dir)
426
427 # versions of libtorrent prior to 0.14 have this file which we don't want to
428 # compile or use
429 if os.path.exists(os.path.join(portable_dir, "libtorrent", "src", "file_win.cpp")):
430 sources.remove(os.path.join(portable_dir, "libtorrent", "src", "file_win.cpp"))
431
432 return Extension("miro.libtorrent",
433 include_dirs=include_dirs,
434 libraries=libraries,
435 extra_compile_args=extra_compile_args,
436 sources=sources)
437
438libtorrent_ext = get_libtorrent_extension(portable_dir)
439
440
441#### MozillaBrowser Extension ####338#### MozillaBrowser Extension ####
442def get_mozilla_stuff():339def get_mozilla_stuff():
443 try:
444 packages = get_command_output("pkg-config --list-all")
445 except RuntimeError, error:
446 sys.exit("Package config error:\n%s" % (error,))
447
448 if XPCOM_LIB and GTKMOZEMBED_LIB and XULRUNNER_19 != None:340 if XPCOM_LIB and GTKMOZEMBED_LIB and XULRUNNER_19 != None:
449 print "\nUsing XPCOM_LIB, GTKMOZEMBED_LIB and XULRUNNER_19 values...."341 print "\nUsing XPCOM_LIB, GTKMOZEMBED_LIB and XULRUNNER_19 values...."
450 xulrunner19 = XULRUNNER_19342 xulrunner19 = XULRUNNER_19
@@ -454,29 +346,31 @@
454 else:346 else:
455 print "\nTrying to figure out xpcom_lib, gtkmozembed_lib, and xulrunner_19 values...."347 print "\nTrying to figure out xpcom_lib, gtkmozembed_lib, and xulrunner_19 values...."
456 xulrunner19 = False348 xulrunner19 = False
457 if re.search("^libxul", packages, re.MULTILINE):349 if package_exists('libxul'):
458 xulrunner19 = True350 xulrunner19 = True
459 xpcom_lib = 'libxul'351 xpcom_lib = 'libxul'
460 gtkmozembed_lib = 'libxul'352 gtkmozembed_lib = 'libxul'
461353
462 elif re.search("^xulrunner-xpcom", packages, re.MULTILINE):354 elif package_exists('xulrunner-xpcom'):
463 xpcom_lib = 'xulrunner-xpcom'355 xpcom_lib = 'xulrunner-xpcom'
464 gtkmozembed_lib = 'xulrunner-gtkmozembed'356 gtkmozembed_lib = 'xulrunner-gtkmozembed'
465357
466 elif re.search("^seamonkey-xpcom", packages, re.MULTILINE):358 elif package_exists('seamonkey-xpcom'):
467 xpcom_lib = 'seamonkey-xpcom'359 xpcom_lib = 'seamonkey-xpcom'
468 gtkmozembed_lib = 'seamonkey-gtkmozembed'360 gtkmozembed_lib = 'seamonkey-gtkmozembed'
469361
470 elif re.search("^mozilla-xpcom", packages, re.MULTILINE):362 elif package_exists('mozilla-xpcom'):
471 xpcom_lib = 'mozilla-xpcom'363 xpcom_lib = 'mozilla-xpcom'
472 gtkmozembed_lib = 'mozilla-gtkmozembed'364 gtkmozembed_lib = 'mozilla-gtkmozembed'
473365
474 elif re.search("^firefox-xpcom", packages, re.MULTILINE):366 elif package_exists('firefox-xpcom'):
475 xpcom_lib = 'firefox-xpcom'367 xpcom_lib = 'firefox-xpcom'
476 gtkmozembed_lib = 'firefox-gtkmozembed'368 gtkmozembed_lib = 'firefox-gtkmozembed'
477369
478 else:370 else:
479 sys.exit("Can't find libxul, xulrunner-xpcom, seamonkey-xpcom, mozilla-xpcom or firefox-xpcom")371 print "Can't find libxul, xulrunner-xpcom, seamonkey-xpcom, mozilla-xpcom or firefox-xpcom"
372 print "One of these is required."
373 sys.exit(1)
480374
481 print "using xpcom_lib: ", repr(xpcom_lib)375 print "using xpcom_lib: ", repr(xpcom_lib)
482 print "using gtkmozembed_lib: ", repr(gtkmozembed_lib)376 print "using gtkmozembed_lib: ", repr(gtkmozembed_lib)
@@ -613,28 +507,6 @@
613 )507 )
614508
615509
616#### Xine Extension ####
617xine_options = parse_pkg_config('pkg-config',
618 'libxine pygtk-2.0 gtk+-2.0 glib-2.0 gthread-2.0')
619
620# If you get XINE crashes, uncommenting this might fix it. It's
621# necessary on Debian Etch and Ubuntu Feisty right now.
622#
623# We have a horrible workaround for buggy X drivers in xine_impl.c
624# controlled by this variable
625if USE_XINE_HACK:
626 print "Using the Xine driver hack. If you experience trouble playing video,\n try setting USE_XINE_HACK to False in setup.py."
627 if xine_options.has_key('define_macros'):
628 xine_options['define_macros'].append(('INCLUDE_XINE_DRIVER_HACK', '1'))
629 else:
630 xine_options['define_macros'] = [('INCLUDE_XINE_DRIVER_HACK', '1')]
631
632xine_ext = Extension('miro.xine', [
633 os.path.join(xine_dir, 'xine.pyx'),
634 os.path.join(xine_dir, 'xine_impl.c'),],
635 **xine_options)
636
637
638#### Build the data_files list ####510#### Build the data_files list ####
639def listfiles(path):511def listfiles(path):
640 return [f for f in glob(os.path.join(path, '*')) if os.path.isfile(f)]512 return [f for f in glob(os.path.join(path, '*')) if os.path.isfile(f)]
@@ -673,15 +545,12 @@
673 [os.path.join(platform_dir, 'miro.1.gz')]),545 [os.path.join(platform_dir, 'miro.1.gz')]),
674 ('/usr/share/man/man1',546 ('/usr/share/man/man1',
675 [os.path.join(platform_dir, 'miro.real.1.gz')]),547 [os.path.join(platform_dir, 'miro.real.1.gz')]),
676 ('/usr/lib/miro/',
677 [os.path.join(platform_dir, 'xine/xine_extractor')]),
678]548]
679549
680550
681# if we're not doing "python setup.py clean", then we can do a bunch of things551# if we're not doing "python setup.py clean", then we can do a bunch of things
682# that have file-related side-effects552# that have file-related side-effects
683if not "clean" in sys.argv:553if not "clean" in sys.argv:
684 compile_xine_extractor()
685 generate_miro(xpcom_runtime_path)554 generate_miro(xpcom_runtime_path)
686 # gzip the man page555 # gzip the man page
687 os.system ("gzip -9 < %s > %s" % (os.path.join(platform_dir, 'miro.1'), os.path.join(platform_dir, 'miro.1.gz')))556 os.system ("gzip -9 < %s > %s" % (os.path.join(platform_dir, 'miro.1'), os.path.join(platform_dir, 'miro.1.gz')))
@@ -840,17 +709,12 @@
840 shutil.rmtree('./dist/')709 shutil.rmtree('./dist/')
841710
842ext_modules = []711ext_modules = []
843ext_modules.append(fasttypes_ext)
844ext_modules.append(xine_ext)
845ext_modules.append(xlib_ext)712ext_modules.append(xlib_ext)
846if libtorrent_ext:
847 ext_modules.append(libtorrent_ext)
848ext_modules.append(pygtkhacks_ext)713ext_modules.append(pygtkhacks_ext)
849ext_modules.append(mozprompt_ext)714ext_modules.append(mozprompt_ext)
850ext_modules.append(httpobserver_ext)715ext_modules.append(httpobserver_ext)
851ext_modules.append(windowcreator_ext)716ext_modules.append(windowcreator_ext)
852ext_modules.append(pluginsdir_ext)717ext_modules.append(pluginsdir_ext)
853ext_modules.append(Extension("miro.sorts", [os.path.join(portable_dir, 'sorts.pyx')]))
854718
855#### Run setup ####719#### Run setup ####
856setup(name='miro',720setup(name='miro',
857721
=== removed directory 'platform/gtk-x11/xine'
=== removed file 'platform/gtk-x11/xine/xine.pyx'
--- platform/gtk-x11/xine/xine.pyx 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/xine/xine.pyx 1970-01-01 00:00:00 +0000
@@ -1,161 +0,0 @@
1# Miro - an RSS based video player application
2# Copyright (C) 2005-2009 Participatory Culture Foundation
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17#
18# In addition, as a special exception, the copyright holders give
19# permission to link the code of portions of this program with the OpenSSL
20# library.
21#
22# You must obey the GNU General Public License in all respects for all of
23# the code used other than OpenSSL. If you modify file(s) with this
24# exception, you may extend this exception to your version of the file(s),
25# but you are not obligated to do so. If you do not wish to do so, delete
26# this exception statement from your version. If you delete this exception
27# statement from all source files in the program, then also delete it here.
28
29##############################################################################
30# Xine module.
31#
32# Contains the Xine class which is used to control libxine.
33# Code in here is basically just a wrapper for the functions in xine_impl.c.
34# See that file if you want to know what's going on under the hood
35#
36##############################################################################
37
38cdef extern from "X11/Xlib.h":
39 ctypedef unsigned long Drawable
40
41cdef extern from "Python.h":
42 ctypedef int PyGILState_STATE
43 PyGILState_STATE PyGILState_Ensure()
44 void PyGILState_Release(PyGILState_STATE)
45 ctypedef struct PyThreadState
46 ctypedef struct PyObject
47 void Py_DECREF(PyObject*)
48 void Py_INCREF(PyObject*)
49 PyObject* PyObject_CallMethod(PyObject *o, char *method, char* format, ...)
50 void PyErr_Print()
51
52cdef extern from "xine.h":
53 ctypedef struct xine_event_t:
54 int type
55 ctypedef void (*xine_event_listener_cb_t) (void *user_data,
56 xine_event_t *event)
57 enum dummy:
58 XINE_EVENT_UI_PLAYBACK_FINISHED
59
60cdef extern from "xine_impl.h":
61 ctypedef struct _Xine
62
63 _Xine* xineCreate(xine_event_listener_cb_t event_callback,
64 void* event_callback_data)
65 void xineDestroy(_Xine* xine)
66 void xineAttach(_Xine* xine, char* displayName, Drawable d, char *driver, int sync, int use_xv_hack)
67 void xineSetArea(_Xine* xine, int xpos, int ypos, int width, int height)
68 void xineDetach(_Xine* xine)
69 void xineSetupSniffer(_Xine* xine)
70 int xineGetType(_Xine* xine, char* filename)
71 int xineSelectFile(_Xine* xine, char* filename)
72 void xineSetPlaying(_Xine* xine, int isPlaying)
73 void xineSetViz(_Xine* xine, char *viz)
74 void xineSetVolume(_Xine* xine, int volume)
75 int xineGetVolume(_Xine* xine)
76 void xineGotExposeEvent(_Xine* xine, int x, int y, int width, int height)
77 void xineSeek(_Xine* xine, int position)
78 int xineGetPosLength(_Xine* xine, int* position, int* length)
79 char* xineVersion()
80
81def getXineVersion():
82 return xineVersion()
83
84class CantQueryPositionLength(Exception):
85 pass
86
87cdef class Xine:
88 # Wrapper for the Xine class
89 cdef _Xine* xine
90 cdef object eosCallback
91
92 def __new__(self):
93 self.xine = xineCreate(on_xine_event, <void*>self)
94 self.eosCallback = None
95 def __dealloc__(self):
96 xineDestroy(self.xine)
97 def attach(self, char* displayName, int drawable, char *driver, sync, use_xv_hack):
98 xineAttach(self.xine, displayName, drawable, driver, sync, use_xv_hack)
99 def detach(self):
100 xineDetach(self.xine)
101 def setup_sniffer(self):
102 xineSetupSniffer(self.xine)
103 def set_area(self, int xpos, int ypos, int width, int height):
104 xineSetArea(self.xine, xpos, ypos, width, height)
105 def get_type(self, char* filename):
106 return xineGetType(self.xine, filename)
107 def select_file(self, char* filename):
108 return xineSelectFile(self.xine, filename)
109 def play(self):
110 xineSetPlaying(self.xine, 1)
111 def pause(self):
112 xineSetPlaying(self.xine, 0)
113 def set_viz(self, viz):
114 xineSetViz(self.xine, viz)
115 def set_volume(self, volume):
116 volume = min(max(volume, 0), 100)
117 xineSetVolume(self.xine, volume)
118 def get_volume(self):
119 return xineGetVolume(self.xine)
120 def got_expose_event(self, int x, int y, int width, int height):
121 xineGotExposeEvent(self.xine, x, y, width, height)
122 def seek(self, int position):
123 xineSeek(self.xine, position)
124 def set_eos_callback(self, callback):
125 """Set the callback invoke when xine reaches the end of its stream.
126 Pass in None to clear the callback
127
128 NOTE: this callback will be invoked outside of the gtk main thread,
129 use gobject.idle_add if you need to use any gtk methods.
130 """
131 self.eosCallback = callback
132 def on_eos_event(self):
133 if self.eosCallback:
134 self.eosCallback()
135 def get_position_and_length(self):
136 """Try to query the current stream position and stream length. If
137 Xine doesn't know the values yet we throw a CantQueryPositionLength
138 Exception.
139 """
140 cdef int position, length
141 if xineGetPosLength(self.xine, &position, &length) == 0:
142 raise CantQueryPositionLength
143 else:
144 return position, length
145
146cdef void on_xine_event(void* data, xine_event_t* event):
147 cdef PyObject* self
148 cdef PyGILState_STATE gil
149 cdef PyObject* result
150
151 if event.type == XINE_EVENT_UI_PLAYBACK_FINISHED:
152 self = <PyObject*>data
153 gil = PyGILState_Ensure()
154 Py_INCREF(self)
155 result = PyObject_CallMethod(self, "on_eos_event", "", NULL)
156 if(result == NULL):
157 PyErr_Print()
158 else:
159 Py_DECREF(result)
160 Py_DECREF(self)
161 PyGILState_Release(gil)
1620
=== removed file 'platform/gtk-x11/xine/xine_extractor.c'
--- platform/gtk-x11/xine/xine_extractor.c 2009-02-11 01:32:44 +0000
+++ platform/gtk-x11/xine/xine_extractor.c 1970-01-01 00:00:00 +0000
@@ -1,224 +0,0 @@
1/*
2# Miro - an RSS based video player application
3# Copyright (C) 2005-2009 Participatory Culture Foundation
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18#
19# In addition, as a special exception, the copyright holders give
20# permission to link the code of portions of this program with the OpenSSL
21# library.
22#
23# You must obey the GNU General Public License in all respects for all of
24# the code used other than OpenSSL. If you modify file(s) with this
25# exception, you may extend this exception to your version of the file(s),
26# but you are not obligated to do so. If you do not wish to do so, delete
27# this exception statement from your version. If you delete this exception
28# statement from all source files in the program, then also delete it here.
29*/
30
31#define XINE_ENABLE_EXPERIMENTAL_FEATURES 1
32#include <xine.h>
33#include <xine/video_out.h>
34#include <gdk-pixbuf/gdk-pixbuf.h>
35#include <glib.h>
36
37typedef struct {
38 xine_t* xine;
39 xine_stream_t* stream;
40 xine_video_port_t* videoPort;
41 xine_audio_port_t* audioPort;
42} _Xine;
43
44static int Y_table[256];
45static int RCr_table[256];
46static int GCr_table[256];
47static int GCb_table[256];
48static int BCb_table[256];
49static int tables_initialized = 0;
50
51static void build_tables() {
52 int i;
53 if (tables_initialized)
54 return;
55 for (i = 0; i < 256; i++) {
56 Y_table[i] = (i - 16) * 255 * 256 / 219;
57 RCr_table[i] = (i - 128) * 127 * 256 * 1.402 / 112;
58 GCr_table[i] = (i - 128) * 127 * 256 * -.714 / 112;
59 GCb_table[i] = (i - 128) * 127 * 256 * -.344 / 112;
60 BCb_table[i] = (i - 128) * 127 * 256 * 1.772 / 112;
61 }
62 tables_initialized = 1;
63}
64
65static void _make_new_data_mine(_Xine* xine) {
66 xine->videoPort = xine_open_video_driver(xine->xine, "none", XINE_VISUAL_TYPE_NONE, NULL);
67 xine->audioPort = xine_open_audio_driver(xine->xine, "none", NULL);
68 xine->stream = xine_stream_new(xine->xine, xine->audioPort, xine->videoPort);
69}
70
71static void xineDataMineClose(_Xine *xine)
72{
73 xine_close(xine->stream);
74 xine_dispose(xine->stream);
75 xine_close_audio_driver(xine->xine, xine->audioPort);
76 xine_close_video_driver(xine->xine, xine->videoPort);
77 /* _make_new_data_mine(xine);*/
78}
79
80static int xineDataMineFilename(_Xine* xine, const char* filename)
81{
82 int rv;
83 rv = xine_open(xine->stream, filename);
84 return rv;
85}
86
87/* duration is in ms */
88static int xineFileDuration(_Xine* xine)
89{
90 int rv;
91 int duration;
92 int dummy, dummy2;
93 rv = xine_get_pos_length(xine->stream, &dummy, &dummy2, &duration);
94 if (rv == 0)
95 return -1;
96 return duration;
97}
98
99static unsigned char normalize(int val) {
100 if (val < 0)
101 val = 0;
102 if (val > (255 << 8))
103 val = 255 << 8;
104 val = val + 127;
105 val = val >> 8;
106 return val;
107}
108
109static int xineFileScreenshot(_Xine *xine, int position, const char *screenshot)
110{
111 int rv;
112 xine_video_frame_t frame;
113 int i, j;
114 int CbOffset;
115 int CrOffset;
116 unsigned char *out_data;
117 GdkPixbuf *pixbuf;
118 xine_video_port_t *video_out;
119
120 if (!xine_get_stream_info (xine->stream, XINE_STREAM_INFO_HAS_VIDEO))
121 return 0;
122 rv = xine_play(xine->stream, 0, position);
123 if (rv == 0)
124 return 0;
125 video_out = xine->videoPort;
126 if (video_out->get_property (video_out, VO_PROP_NUM_STREAMS) == 0) {
127 return 1;
128 }
129 rv = xine_get_next_video_frame (video_out, &frame);
130 if (rv == 0)
131 return 0;
132 if (frame.colorspace != XINE_IMGFMT_YV12 &&
133 frame.colorspace != XINE_IMGFMT_YUY2) {
134 xine_free_video_frame (video_out, &frame);
135 return 0;
136 }
137 build_tables();
138 out_data = g_malloc (frame.width * frame.height * 3);
139 switch (frame.colorspace) {
140 case XINE_IMGFMT_YV12:
141 CrOffset = frame.width * frame.height;
142 CbOffset = frame.width * frame.height + (frame.width / 2) * (frame.height / 2);
143 for (j = 0; j < frame.height; j++) {
144 for (i = 0; i < frame.width; i++) {
145 int pixel = j * frame.width + i;
146 int subpixel = (j / 2) * (frame.width / 2) + (i / 2);
147 int Y = Y_table[frame.data[pixel]];
148 out_data[pixel * 3] =
149 normalize(Y +
150 RCr_table[frame.data[CrOffset + subpixel]]);
151 out_data[pixel * 3 + 1] =
152 normalize(Y +
153 GCr_table[frame.data[CrOffset + subpixel]] +
154 GCb_table[frame.data[CbOffset + subpixel]]);
155 out_data[pixel * 3 + 2] =
156 normalize(Y +
157 BCb_table[frame.data[CbOffset + subpixel]]);
158 }
159 }
160 break;
161
162 case XINE_IMGFMT_YUY2:
163 CrOffset = 3;
164 CbOffset = 1;
165 for (j = 0; j < frame.height; j++) {
166 for (i = 0; i < frame.width; i++) {
167 int pixel = j * frame.width + i;
168 int subpixel = (j * frame.width + i) / 2 * 4;
169 int Y = Y_table[frame.data[pixel * 2]];
170 out_data[pixel * 3] =
171 normalize(Y +
172 RCr_table[frame.data[CrOffset + subpixel]]);
173 out_data[pixel * 3 + 1] =
174 normalize(Y +
175 GCr_table[frame.data[CrOffset + subpixel]] +
176 GCb_table[frame.data[CbOffset + subpixel]]);
177 out_data[pixel * 3 + 2] =
178 normalize(Y +
179 BCb_table[frame.data[CbOffset + subpixel]]);
180 }
181 }
182 break;
183 }
184 pixbuf = gdk_pixbuf_new_from_data (out_data, GDK_COLORSPACE_RGB, 0,
185 8, frame.width, frame.height, frame.width * 3,
186 NULL, NULL);
187 gdk_pixbuf_save (pixbuf, screenshot, "png", NULL, NULL);
188 gdk_pixbuf_unref (pixbuf);
189 g_free (out_data);
190 xine_free_video_frame (xine->videoPort, &frame);
191 return 1;
192}
193
194int main(int argc, char *argv[])
195{
196 char *filename;
197 char *screenshot_filename;
198 int rv;
199 int duration = -1;
200 _Xine *xine;
201 if (argc != 3) {
202 return 0;
203 }
204 g_type_init();
205 filename = argv[1];
206 screenshot_filename = argv[2];
207
208 xine = (_Xine*)g_malloc(sizeof(_Xine));
209 xine->xine = xine_new();
210 xine_init(xine->xine);
211 _make_new_data_mine(xine);
212
213 rv = xineDataMineFilename(xine, filename);
214 if (rv != 0) {
215 duration = xineFileDuration(xine);
216 if (duration == -1)
217 rv = 0;
218 else
219 rv = xineFileScreenshot(xine, duration / 2, screenshot_filename);
220 }
221 printf ("Miro-Movie-Data-Length: %d\n", duration);
222 printf ("Miro-Movie-Data-Thumbnail: %s\n", rv ? "Success" : "Failure");
223 return 0;
224}
2250
=== removed file 'platform/gtk-x11/xine/xine_impl.c'
--- platform/gtk-x11/xine/xine_impl.c 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/xine/xine_impl.c 1970-01-01 00:00:00 +0000
@@ -1,490 +0,0 @@
1/*
2# Miro - an RSS based video player application
3# Copyright (C) 2005-2009 Participatory Culture Foundation
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18#
19# In addition, as a special exception, the copyright holders give
20# permission to link the code of portions of this program with the OpenSSL
21# library.
22#
23# You must obey the GNU General Public License in all respects for all of
24# the code used other than OpenSSL. If you modify file(s) with this
25# exception, you may extend this exception to your version of the file(s),
26# but you are not obligated to do so. If you do not wish to do so, delete
27# this exception statement from your version. If you delete this exception
28# statement from all source files in the program, then also delete it here.
29*/
30
31/*************************************************************************
32 * xine_impl.c
33 *
34 * Implementations for the Xine class's methods.
35 *
36 * Almost all the work for the Xine class gets done in xine_impl.c. xine.pyx
37 * then wraps the functions. This keeps xine.pyx from overflowing with "cdef
38 * extern ..." statements
39 *
40 **************************************************************************/
41
42#include "Python.h"
43#include <stdlib.h>
44#include <stdio.h>
45#include <string.h>
46#include "xine_impl.h"
47#include <gdk-pixbuf/gdk-pixbuf.h>
48
49#ifdef INCLUDE_XINE_DRIVER_HACK
50static int miro_using_xv_driver_hack = 0;
51#endif
52
53const char *viz_available (_Xine* xine, const char *viz)
54{
55 int j;
56 for (j = 0; xine->viz_available[j]; j++) {
57 if (!strcmp(viz, xine->viz_available[j])) {
58 return xine->viz_available[j];
59 }
60 }
61 return NULL;
62}
63
64const char *const pref_viz[] = {
65 "goom",
66 "oscope",
67 "fftscope",
68 "fftgraph",
69 NULL
70};
71
72#ifdef INCLUDE_XINE_DRIVER_HACK
73static void miro_xine_list_recycle_elem(xine_list_t *list, xine_list_elem_t *elem) {
74 elem->next = list->free_elem_list;
75 elem->prev = NULL;
76
77 list->free_elem_list = elem;
78 list->free_elem_list_size++;
79}
80
81
82void miro_xine_list_remove(xine_list_t *list, xine_list_iterator_t position) {
83 xine_list_elem_t *elem = (xine_list_elem_t*)position;
84
85 if (elem) {
86 xine_list_elem_t *prev = elem->prev;
87 xine_list_elem_t *next = elem->next;
88
89 if (prev)
90 prev->next = next;
91 else
92 list->elem_list_front = next;
93
94 if (next)
95 next->prev = prev;
96 else
97 list->elem_list_back = prev;
98
99 miro_xine_list_recycle_elem(list, elem);
100 list->elem_list_size--;
101 }
102}
103
104xine_list_iterator_t miro_xine_list_front(xine_list_t *list) {
105 return list->elem_list_front;
106}
107#endif
108
109_Xine* xineCreate(xine_event_listener_cb_t event_callback,
110 void* event_callback_data)
111{
112 _Xine* xine;
113 int i;
114 /* const char *const *video_plugins;*/
115
116 xine = (_Xine*)malloc(sizeof(_Xine));
117 if(xine == NULL) return NULL;
118 xine->xine = xine_new();
119 xine_init(xine->xine);
120 xine->attached = 0;
121 xine->frameInfo.lock = g_mutex_new();
122 xine->frameInfo.xpos = 0;
123 xine->frameInfo.ypos = 0;
124 xine->frameInfo.width = 0;
125 xine->frameInfo.height = 0;
126 xine->event_callback = event_callback;
127 xine->event_callback_data = event_callback_data;
128 xine->viz_available = xine_list_post_plugins_typed (xine->xine, XINE_POST_TYPE_AUDIO_VISUALIZATION);
129 xine->viz_name = NULL;
130 for (i = 0; pref_viz[i]; i++) {
131 const char *viz = viz_available(xine, pref_viz[i]);
132 if (viz) {
133 xine->viz_name = viz;
134 break;
135 }
136 }
137 if (!xine->viz_name) {
138 xine->viz_name = xine->viz_available [0];
139 }
140 xine->viz = NULL;
141
142 return xine;
143}
144
145void xineDestroy(_Xine* xine)
146{
147 if(xine->attached) {
148 xineDetach(xine);
149 }
150 xine_exit(xine->xine);
151 g_mutex_free(xine->frameInfo.lock);
152 free(xine);
153}
154
155static void destSizeCallback(void *data, int video_width, int video_height,
156 double video_pixel_aspect, int *dest_width, int *dest_height, double
157 *dest_pixel_aspect)
158{
159 _Xine* xine = (_Xine*)data;
160 /* Should take video_pixel_aspect into account here... */
161 g_mutex_lock(xine->frameInfo.lock);
162 *dest_width = xine->frameInfo.width;
163 *dest_height = xine->frameInfo.height;
164 g_mutex_unlock(xine->frameInfo.lock);
165 *dest_pixel_aspect = xine->screenPixelAspect;
166}
167
168static void frameOutputCallback(void *data, int video_width,
169 int video_height, double video_pixel_aspect, int *dest_x, int *dest_y,
170 int *dest_width, int *dest_height, double *dest_pixel_aspect, int
171 *win_x, int *win_y)
172{
173 _Xine* xine = (_Xine*)data;
174 *dest_x = 0;
175 *dest_y = 0;
176 g_mutex_lock(xine->frameInfo.lock);
177 *win_x = xine->frameInfo.xpos;
178 *win_y = xine->frameInfo.ypos;
179 *dest_width = xine->frameInfo.width;
180 *dest_height = xine->frameInfo.height;
181 g_mutex_unlock(xine->frameInfo.lock);
182 *dest_pixel_aspect = xine->screenPixelAspect;
183}
184
185void _xineSwitchToViz(_Xine* xine)
186{
187 const char *const *inputs;
188 xine_post_out_t *source;
189 xine_post_in_t *sink;
190 xine_audio_port_t *audios[] = { xine->audioPort, NULL };
191 xine_video_port_t *videos[] = { xine->videoPort, NULL };
192
193 if (xine->viz || !xine->viz_name)
194 return;
195
196 xine->viz = xine_post_init (xine->xine, xine->viz_name, 1, audios, videos);
197 if (xine->viz) {
198 inputs = xine_post_list_inputs(xine->viz);
199 source = xine_get_audio_source (xine->stream);
200 sink = xine_post_input(xine->viz, inputs[0]);
201 xine_post_wire (source, sink);
202 }
203}
204
205void _xineSwitchToNormal(_Xine* xine)
206{
207 xine_post_out_t *source;
208
209 if (!xine->viz)
210 return;
211
212 source = xine_get_video_source (xine->stream);
213 xine_post_wire_video_port(source, xine->videoPort);
214
215 source = xine_get_audio_source (xine->stream);
216 xine_post_wire_audio_port(source, xine->audioPort);
217
218 xine_post_dispose (xine->xine, xine->viz);
219 xine->viz = NULL;
220}
221
222/**
223 * If you want to attach for a video player, pass in the display name,
224 * drawable, driver, sync and use_xv_hack.
225 *
226 * If you want to attach for an audio player with no video stuff,
227 * pass in an empty display name, 0 for the drawable, "none" for
228 * the driver, and 0 for sync and use_xv_hack.
229 *
230 * The xineAttach code only sets up the video portions if d != 0.
231 */
232void xineAttach(_Xine* xine, const char* displayName, Drawable d,
233 const char *driver, int sync, int use_xv_hack)
234{
235 x11_visual_t vis;
236 double screenWidth, screenHeight;
237
238 if(xine->attached) {
239 xineDetach(xine);
240 }
241
242 xine->drawable = d;
243 if (d != 0) {
244 /* Store drawable info in the */
245
246 xine->display = XOpenDisplay(displayName);
247 XSynchronize(xine->display, sync);
248
249 xine->screen = XDefaultScreen(xine->display);
250 screenWidth = (DisplayWidth(xine->display, xine->screen) * 1000 /
251 DisplayWidthMM(xine->display, xine->screen));
252 screenHeight = (DisplayHeight(xine->display, xine->screen) * 1000 /
253 DisplayHeightMM(xine->display, xine->screen));
254 xine->screenPixelAspect = screenHeight / screenWidth;
255
256 /* filling in the xine visual struct */
257 vis.display = xine->display;
258 vis.screen = xine->screen;
259 vis.d = d;
260 vis.dest_size_cb = destSizeCallback;
261 vis.frame_output_cb = frameOutputCallback;
262 vis.user_data = xine;
263 }
264
265 // FIXME - should check xine to see what the driver options are
266 // and cycle through them if the specified one doesn't work.
267
268 /* opening xine output ports */
269 // try to use char *driver for video, default to "auto" if NULL
270 if (!driver) {
271 printf("xine_impl.c: no driver passed in, using auto\n");
272 driver = "auto";
273 }
274
275 if (d != 0) {
276 printf("xine_impl.c: trying driver %s\n", driver);
277
278 xine->videoPort = xine_open_video_driver(xine->xine, driver,
279 XINE_VISUAL_TYPE_X11, (void *)&vis);
280
281 if (!xine->videoPort) {
282 printf("xine_impl.c: driver failed--trying auto\n");
283 xine->videoPort = xine_open_video_driver(xine->xine, "auto",
284 XINE_VISUAL_TYPE_X11, (void *)&vis);
285 }
286
287#ifdef INCLUDE_XINE_DRIVER_HACK
288 // by default, don't use the hack
289 miro_using_xv_driver_hack = 0;
290 if (xine->videoPort) {
291 // if we're using the hack and the driver is "xv", then
292 // we turn the hack on.
293 if (use_xv_hack && !strncmp("xv", driver, 3)) {
294 miro_using_xv_driver_hack = 1;
295 }
296 }
297#endif
298 } else {
299 xine->videoPort = xine_open_video_driver(xine->xine, driver,
300 XINE_VISUAL_TYPE_NONE, NULL);
301 }
302
303 xine->audioPort = xine_open_audio_driver(xine->xine, "auto", NULL);
304
305 /* open a xine stream connected to these ports */
306 xine->stream = xine_stream_new(xine->xine, xine->audioPort,
307 xine->videoPort);
308 /* hook our event handler into the streams events */
309 xine->eventQueue = xine_event_new_queue(xine->stream);
310 xine_event_create_listener_thread(xine->eventQueue,
311 xine->event_callback, xine->event_callback_data);
312
313 if (d != 0) {
314 xine_port_send_gui_data(xine->videoPort, XINE_GUI_SEND_DRAWABLE_CHANGED,
315 (void *)d);
316 xine_port_send_gui_data(xine->videoPort, XINE_GUI_SEND_VIDEOWIN_VISIBLE,
317 (void *) 1);
318 }
319
320 xine->attached = 1;
321 _xineSwitchToNormal (xine);
322}
323
324void xineDetach(_Xine* xine)
325{
326 xine_event_queue_t* eventQueue;
327#ifdef INCLUDE_XINE_DRIVER_HACK
328 xv_driver_t* driver;
329 xine_list_iterator_t ite;
330#endif
331
332 if(!xine->attached) return;
333
334 if (xine->drawable != 0) {
335#ifdef INCLUDE_XINE_DRIVER_HACK
336 // HACK ALERT! For some reason, setting the XV port attributes
337 //causes problems with certain xine-lib/X11 combinations this
338 //caused #7132
339
340 if (miro_using_xv_driver_hack) {
341
342 driver = (xv_driver_t*)xine->videoPort->driver;
343
344 while ((ite = miro_xine_list_front(driver->port_attributes)) != NULL) {
345 miro_xine_list_remove (driver->port_attributes, ite);
346 }
347 }
348#endif
349 }
350 xine_close(xine->stream);
351 xine_dispose(xine->stream);
352 xine_close_audio_driver(xine->xine, xine->audioPort);
353 xine_close_video_driver(xine->xine, xine->videoPort);
354 if (xine->drawable != 0) {
355 XCloseDisplay(xine->display);
356 }
357 xine->attached = 0;
358
359 /* Save this so that no one accesses xine twice at once. */
360 eventQueue = xine->eventQueue;
361 /* Allow threads, since xine_event_dispose_queue joins on the queue thread. */
362 Py_BEGIN_ALLOW_THREADS
363 xine_event_dispose_queue(eventQueue);
364 Py_END_ALLOW_THREADS
365}
366
367/**
368 * Sets up this xine instance as a sniffer.
369 */
370void xineSetupSniffer(_Xine* xine)
371{
372 xine->videoPort = xine_open_video_driver(xine->xine, "auto",
373 XINE_VISUAL_TYPE_NONE, NULL);
374 xine->audioPort = xine_open_audio_driver(xine->xine, "none", NULL);
375 xine->stream = xine_stream_new(xine->xine, xine->audioPort, xine->videoPort);
376}
377
378void xineSetArea(_Xine* xine, int xpos, int ypos, int width, int height)
379{
380 g_mutex_lock(xine->frameInfo.lock);
381 xine->frameInfo.xpos = xpos;
382 xine->frameInfo.ypos = ypos;
383 xine->frameInfo.width = width;
384 xine->frameInfo.height = height;
385 g_mutex_unlock(xine->frameInfo.lock);
386}
387
388int xineGetType(_Xine* xine, const char* filename)
389{
390 xine_close(xine->stream);
391 if (!xine_open(xine->stream, filename)) {
392 return -1;
393 }
394 if (xine_get_stream_info(xine->stream, XINE_STREAM_INFO_HAS_VIDEO)) {
395 return 0;
396 }
397 if (xine_get_stream_info(xine->stream, XINE_STREAM_INFO_HAS_AUDIO)) {
398 return 1;
399 }
400 return 2;
401}
402
403int xineSelectFile(_Xine* xine, const char* filename)
404{
405 if(!xine->attached) return;
406 xine_close(xine->stream);
407 if (!xine_open(xine->stream, filename)) {
408 return 0;
409 }
410 if (xine_get_stream_info (xine->stream, XINE_STREAM_INFO_HAS_VIDEO)) {
411 _xineSwitchToNormal(xine);
412 } else {
413 _xineSwitchToViz(xine);
414 }
415 return 1;
416}
417
418void xineSeek(_Xine* xine, int position)
419{
420 if(!xine->attached) return;
421 xine_play(xine->stream, 0, position);
422}
423
424void xineSetPlaying(_Xine* xine, int isPlaying)
425{
426 if(!xine->attached) return;
427 if(isPlaying) {
428 xine_set_param(xine->stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
429 } else {
430 xine_set_param(xine->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
431 }
432}
433
434void xineSetViz (_Xine* xine, const char *viz)
435{
436 if (!strcmp(viz, "none") || viz[0] == 0) {
437 xine->viz_name = NULL;
438 } else {
439 viz = viz_available (xine, viz);
440 if (viz)
441 xine->viz_name = viz;
442 else
443 xine->viz_name = xine->viz_available [0];
444 }
445}
446
447void xineSetVolume(_Xine* xine, int volume)
448{
449 if(!xine->attached) return;
450 xine_set_param(xine->stream, XINE_PARAM_AUDIO_AMP_LEVEL, volume);
451}
452
453int xineGetVolume(_Xine* xine)
454{
455 if(!xine->attached) return 0;
456 return xine_get_param(xine->stream, XINE_PARAM_AUDIO_AMP_LEVEL);
457}
458
459void xineGotExposeEvent(_Xine* xine, int x, int y, int width, int height)
460{
461 XExposeEvent expose;
462
463 if(!xine->attached) return;
464 /* set as much of the XExposeEvent as we can. Some fields like serial
465 * won't be filled in, but this doesn't cause problems in practice. Totem
466 * doesn't fill in anything, so our method can't be too bad. */
467 memset(&expose, 0, sizeof(XExposeEvent));
468 expose.x = x;
469 expose.y = y;
470 expose.width = width;
471 expose.height = height;
472 expose.display = xine->display;
473 expose.window = xine->drawable;
474 xine_port_send_gui_data(xine->videoPort, XINE_GUI_SEND_EXPOSE_EVENT,
475 &expose);
476}
477
478int xineGetPosLength(_Xine* xine, int* position, int* length)
479{
480 int dummy;
481 if(!xine->attached) {
482 return 0; // This should cause an exception to be raised upstream
483 }
484 return xine_get_pos_length(xine->stream, &dummy, position, length);
485}
486
487char *xineVersion()
488{
489 return xine_get_version_string();
490}
4910
=== removed file 'platform/gtk-x11/xine/xine_impl.h'
--- platform/gtk-x11/xine/xine_impl.h 2009-10-25 00:24:34 +0000
+++ platform/gtk-x11/xine/xine_impl.h 1970-01-01 00:00:00 +0000
@@ -1,273 +0,0 @@
1/*
2# Miro - an RSS based video player application
3# Copyright (C) 2005-2009 Participatory Culture Foundation
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18#
19# In addition, as a special exception, the copyright holders give
20# permission to link the code of portions of this program with the OpenSSL
21# library.
22#
23# You must obey the GNU General Public License in all respects for all of
24# the code used other than OpenSSL. If you modify file(s) with this
25# exception, you may extend this exception to your version of the file(s),
26# but you are not obligated to do so. If you do not wish to do so, delete
27# this exception statement from your version. If you delete this exception
28# statement from all source files in the program, then also delete it here.
29*/
30
31/**************************************************************************
32 * xine_impl.h
33 *
34 * Implementations for the Xine class's methods.
35 *
36 * Almost all the work for the Xine class gets done in xine_impl.c. xine.pyx
37 * then wraps the functions. This keeps xine.pyx from overflowing with "cdef
38 * extern ..." statements
39 *
40 **************************************************************************/
41
42#include <glib.h>
43#include <X11/Xlib.h>
44#include <X11/extensions/XShm.h>
45#include <X11/extensions/Xvlib.h>
46#include <X11/Xutil.h>
47
48#define XINE_ENABLE_EXPERIMENTAL_FEATURES 1
49#include <xine/video_out.h>
50#include <xine/configfile.h>
51#include <xine/vo_scale.h>
52#include <xine/alphablend.h>
53
54// Taken from XINE headers
55#ifdef INCLUDE_XINE_DRIVER_HACK
56typedef struct xine_list_chunk_s xine_list_chunk_t;
57typedef struct xine_list_s xine_list_t;
58typedef void* xine_list_iterator_t;
59typedef struct xine_list_elem_s xine_list_elem_t;
60
61struct xine_list_chunk_s {
62 xine_list_chunk_t *next_chunk; /* singly linked list of chunks */
63
64 xine_list_elem_t *elem_array; /* the allocated elements */
65 int chunk_size; /* element count in the chunk */
66 int current_elem_id; /* next free elem in the chunk */
67};
68
69struct xine_list_s {
70 /* list of chunks */
71 xine_list_chunk_t *chunk_list;
72 size_t chunk_list_size;
73 xine_list_chunk_t *last_chunk;
74
75 /* list elements */
76 xine_list_elem_t *elem_list_front;
77 xine_list_elem_t *elem_list_back;
78 size_t elem_list_size;
79
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: