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
1=== added file 'ADOPTERS'
2--- ADOPTERS 1970-01-01 00:00:00 +0000
3+++ ADOPTERS 2010-04-14 21:08:30 +0000
4@@ -0,0 +1,245 @@
5+Thanks to the following people who have adopted lines of Miro code to help
6+support development! To adopt a line, visit the Miro Adoption Center at:
7+http://www.getmiro.com/adopt/
8+
9+Leonieke Aalders
10+Nick Adams
11+Hussain Al-Nasser
12+Daniel Albuquerque
13+Jamie Anderson
14+Kathryn Angi
15+Derek Ares
16+J Avot (10 lines)
17+alex axim
18+Barbara Ball
19+Tony Ballhause
20+gilberto banales
21+Rajesh Barnabas
22+Jeffrey Barribeau
23+Mike Beltzner
24+Sue Belzer
25+Alexander Bethke (2 lines)
26+Shawn Biddle
27+Lukas Biewald
28+Morris Birnbaum
29+Clive Blackledge
30+david blackman
31+Grant Blakely (2 lines)
32+Christopher Blizzard
33+Jason Bobe
34+Adam Booth
35+Niels Olof Bouvin
36+Paul Brinkkemper
37+kim broughton
38+Luc Brun
39+Dale Bryant
40+Craig Buckley
41+andreas burger
42+Lee Butkiewicz
43+Percy Cabello
44+Christian Calmeyer
45+piero alberto calzolari
46+Michael Cardoza
47+Robert Carter
48+Michael Castleman
49+George Chriss
50+KATHRYN COLBRESE
51+Mary Colvig (2 lines)
52+Suzanne Conboy-Hill
53+Donald Coury
54+Julien CROUZET
55+Andrew Davies
56+Christopher Davies (2 lines)
57+Barnabas Davoti
58+Frederik De Bleser
59+Josh Deibert (2 lines)
60+David Demchuk
61+Sam Denison
62+Christian Detweiler (2 lines)
63+JEAN P DEVRIES
64+Aaron Digulla (3 lines)
65+valerie donelian
66+Robert Doner
67+Asa Dotzler
68+Charles Douthat
69+Janet Dragojevic
70+Deirdre Dreslough
71+Kevin Driscoll
72+Scott Dylewski
73+Robert Ebright
74+Cassandra Echerd
75+Kalmer Eek
76+Morten Fahrnholz (2 lines)
77+Richard Fenton
78+Guillermo Fernandez
79+Judith Finn
80+David Freer
81+Amy Frutin
82+Michael Gallagher
83+Owen Gallagher
84+Enrico Gallesio
85+Peter Gasston
86+Jeremy Genaro
87+Richard Giraud (5 lines)
88+Alroger Luiz Gomes Filho
89+Benjamin Goyette
90+Sune Graaskov (2 lines)
91+Hendrik Grahl
92+brett gronow
93+Sibylle Grosjean
94+rufo guerreschi (3 lines)
95+Beverly Gunter
96+fALk Gärtner
97+john haden
98+Peter Haight
99+Jay Harris
100+Robert Harris
101+Mark Hartsuyker (2 lines)
102+Chris Helbling
103+Steffen Hellmich
104+Amanda Helman
105+Chris Hemmings
106+Xavier Hernandez
107+Shaun Herrick
108+Alexander Holman
109+Jens Holze
110+Jane Howell
111+Anthony Hunt
112+William W Hunter Jr
113+Odin Hørthe Omdal
114+Artur Iralin
115+Shafqat Islam
116+Joshua Jacobs
117+Nathanael T. Jady
118+Barbara Jansen
119+Dean Jansen (3 lines)
120+Joakim Jardenberg
121+beverly jones
122+Mike Jones
123+Jeffrey Joseph
124+Stephen Judge
125+Will Kahn-Greene
126+Sandra Kallmeyer
127+Cristie Kamiya
128+hayden karel chambers
129+Matthew Katz
130+Ryan Kelln
131+Tommy Kelly
132+Declan Kennedy
133+Henry Kielarowski
134+Virgil King (2 lines)
135+Amanda Knutson
136+Laust Ladefoged
137+Susan M. LaFleur
138+Brent Laminack
139+Matthew Lancey
140+Sheila Marie Lane
141+Youcef Laribi
142+First Last (11 lines)
143+IP managers Leogriff
144+Carlos Eduardo Livino
145+Brandon Low
146+David Luff
147+Adam Lynn
148+Stefan Magdalinski (5 lines)
149+Jonathan Markow
150+Manuel Martins (3 lines)
151+Marcelino Mata
152+Pierre McCann
153+Jock McTavish
154+Robert Meeks
155+Kevin Metz
156+Peter Vestergaard Michaelsen
157+Michael Middleton
158+Joyce Miletic
159+Chad Miller
160+Xander Mol
161+David Moore
162+Tom Moore
163+MR DOMINIQUE GUMPELSON MR DOMINIQUE GUMPELSON
164+Patrick Mulcahy
165+Theron Muller
166+JACK MYERS
167+Mary Nichols
168+Chelsea Novak
169+Christian O'Brien
170+Kevin O'Brien
171+Damon Oehlman
172+thomas orieux
173+Paul Ortega
174+Christian Otkjaer
175+Linux Outlaws
176+Carolyn Papworth
177+Andrew Parfitt
178+Heather Parham (6 lines)
179+alberto pastori
180+Carl Pelletier
181+katharine perkins
182+Dominic Perry
183+greg peterson
184+Frank Petrie
185+danielle pickett
186+John Pickrell
187+Christopher Pille
188+Jacqueline Plage
189+Alex Polvi (2 lines)
190+Vidal Postigo
191+Debora Prado
192+Matthew Quarisa
193+William Quiviger
194+Douglas Radcliffe
195+Mads Rahbek Hougaard
196+Joseph Raine
197+Stéphane Rangaya
198+Chris Reidenouer
199+Guillermo Restrepo
200+Nick Reville
201+Crispino Reyes
202+lars riber
203+Premasagar Rose
204+David Rosen
205+Marty Sandler
206+Ilari Sani
207+Zachary Sarver (2 lines)
208+Christopher Savory
209+Ivo Schmid
210+Rachel Shadoan
211+Motek Sherman
212+Derek Shields
213+Derek Slenk
214+Robert Smol
215+Rodrigo Starr
216+Patrick Stedem
217+Ian Sullivan
218+James Sutherland
219+Stephen and Lucinda Swartz
220+Istvan Szenasi
221+Carol Tardif
222+Ean Thompson
223+Richard Thompson
224+Aidan Thomson (2 lines)
225+Terry Thorpe (3 lines)
226+Alex Torrenegra
227+Arthur J Towson
228+Dan Trevino
229+Ed Triebe
230+Troy Truchon (2 lines)
231+Audun Vaaler
232+Ana Valdes
233+Thomas van de Hoef
234+Eric Van Haesendonck
235+Gerald Vandecar
236+Leonard Verwey
237+Jacques Vroom
238+Daniel Walmsley (2 lines)
239+Paul Walsh
240+Christopher Webber
241+Harald Weiss
242+Daniel Wichlacz
243+Rainer Wolf
244+Christina Xu
245+VJ Yetimon
246+Deg yong Yu
247+Friedrich Zettl
248+Fabricio Zuardi
249+per åström
250
251=== removed file 'ADOPTERS'
252--- ADOPTERS 2010-02-20 02:34:26 +0000
253+++ ADOPTERS 1970-01-01 00:00:00 +0000
254@@ -1,247 +0,0 @@
255-Thanks to the following people who have adopted lines of Miro code to help
256-support development! To adopt a line, visit the Miro Adoption Center at:
257-http://www.getmiro.com/adopt/
258-
259-Leonieke Aalders
260-Nick Adams
261-Hussain Al-Nasser
262-Daniel Albuquerque
263-Muhammad Alli
264-Jamie Anderson
265-Derek Ares
266-J Avot (10 lines)
267-alex axim
268-ESSAM AZEEBI
269-Barbara Ball
270-Tony Ballhause
271-gilberto banales
272-Christine Banks
273-Rajesh Barnabas
274-Jeffrey Barribeau
275-Michael Belanger
276-Mike Beltzner
277-Sue Belzer
278-Alexander Bethke (2 lines)
279-Shawn Biddle
280-Lukas Biewald
281-Morris Birnbaum
282-Clive Blackledge
283-david blackman
284-Grant Blakely (2 lines)
285-Christopher Blizzard
286-Jason Bobe
287-Adam Booth
288-Niels Olof Bouvin
289-Paul Brinkkemper
290-kim broughton
291-Luc Brun
292-Dale Bryant
293-Craig Buckley
294-Lee Butkiewicz
295-Percy Cabello
296-Christian Calmeyer
297-piero alberto calzolari
298-Michael Cardoza
299-Robert Carter
300-Michael Castleman
301-George Chriss
302-KATHRYN COLBRESE
303-Mary Colvig (2 lines)
304-Suzanne Conboy-Hill
305-Donald Coury
306-Julien CROUZET
307-Andrew Davies
308-Christopher Davies (2 lines)
309-Barnabas Davoti
310-Dennis Day (2 lines)
311-Frederik De Bleser
312-Josh Deibert (2 lines)
313-David Demchuk
314-Christian Detweiler (2 lines)
315-JEAN P DEVRIES
316-valerie donelian
317-Robert Doner
318-Asa Dotzler
319-Charles Douthat
320-Janet Dragojevic
321-Deirdre Dreslough
322-Kevin Driscoll
323-Scott Dylewski
324-Robert Ebright
325-Cassandra Echerd
326-Kalmer Eek
327-Roland Engelhardt
328-Morten Fahrnholz (2 lines)
329-Richard Fenton
330-Guillermo Fernandez
331-Judith Finn
332-David Freer
333-Michael Gallagher
334-Owen Gallagher
335-Enrico Gallesio
336-Peter Gasston
337-Jeremy Genaro
338-Richard Giraud (5 lines)
339-Alroger Luiz Gomes Filho
340-Benjamin Goyette
341-Sune Graaskov (2 lines)
342-Hendrik Grahl
343-brett gronow
344-Sibylle Grosjean
345-rufo guerreschi (3 lines)
346-Beverly Gunter
347-fALk Gärtner
348-john haden
349-Peter Haight
350-Jay Harris
351-Robert Harris
352-Mark Hartsuyker (2 lines)
353-Chris Helbling
354-Steffen Hellmich
355-Amanda Helman
356-Chris Hemmings
357-Xavier Hernandez
358-Shaun Herrick
359-Alexander Holman
360-Jens Holze
361-Jane Howell
362-William W Hunter Jr
363-Odin Hørthe Omdal
364-Artur Iralin
365-Shafqat Islam
366-Joshua Jacobs
367-Nathanael T. Jady
368-Barbara Jansen
369-Dean Jansen (3 lines)
370-Joakim Jardenberg
371-beverly jones
372-Mike Jones
373-Jeffrey Joseph
374-Stephen Judge
375-Will Kahn-Greene
376-Sandra Kallmeyer
377-Cristie Kamiya
378-hayden karel chambers
379-Matthew Katz
380-Ryan Kelln
381-Tommy Kelly
382-Declan Kennedy
383-Henry Kielarowski
384-Virgil King (2 lines)
385-Dennis Kitt
386-Amanda Knutson
387-Laust Ladefoged
388-Susan M. LaFleur
389-Brent Laminack
390-Matthew Lancey
391-Sheila Marie Lane
392-Youcef Laribi
393-First Last (11 lines)
394-IP managers Leogriff
395-Carlos Eduardo Livino
396-Brandon Low
397-David Luff
398-Adam Lynn
399-Stefan Magdalinski (10 lines)
400-Jonathan Markow
401-Manuel Martins (3 lines)
402-Marcelino Mata
403-Pierre McCann
404-Ian McMurtrie
405-Jock McTavish
406-Robert Meeks
407-Michael Meiser
408-Kevin Metz
409-Peter Vestergaard Michaelsen
410-Michael Middleton
411-Chad Miller
412-Xander Mol
413-Henrik Moltke (2 lines)
414-Horacio Monteverde (3 lines)
415-David Moore
416-Tom Moore
417-MR DOMINIQUE GUMPELSON MR DOMINIQUE GUMPELSON
418-Patrick Mulcahy
419-Theron Muller
420-JACK MYERS
421-Mary Nichols
422-Chelsea Novak
423-Christian O'Brien
424-Kevin O'Brien
425-Damon Oehlman
426-thomas orieux
427-Paul Ortega
428-Christian Otkjaer
429-Linux Outlaws
430-Sean Palladino
431-Carolyn Papworth
432-Andrew Parfitt
433-Heather Parham (6 lines)
434-alberto pastori
435-Carl Pelletier
436-katharine perkins
437-Dominic Perry
438-Frank Petrie
439-danielle pickett
440-Christopher Pille
441-Jacqueline Plage
442-Alex Polvi (2 lines)
443-Vidal Postigo
444-Debora Prado
445-Matthew Quarisa
446-William Quiviger
447-Douglas Radcliffe
448-Mads Rahbek Hougaard
449-Joseph Raine
450-Stéphane Rangaya
451-Chris Reidenouer
452-Guillermo Restrepo
453-Nick Reville
454-Crispino Reyes
455-lars riber
456-Premasagar Rose
457-David Rosen
458-Ilari Sani
459-Zachary Sarver (2 lines)
460-Christopher Savory
461-Ivo Schmid
462-Peter Schmidt
463-Rachel Shadoan
464-Motek Sherman
465-Derek Shields
466-Derek Slenk
467-Robert Smol
468-Rodrigo Starr
469-Patrick Stedem
470-James Sutherland
471-Stephen and Lucinda Swartz
472-Istvan Szenasi
473-Carol Tardif
474-Ean Thompson
475-Richard Thompson
476-Aidan Thomson (2 lines)
477-Terry Thorpe (3 lines)
478-Alex Torrenegra
479-Arthur J Towson
480-Dan Trevino
481-Ed Triebe
482-Troy Truchon (2 lines)
483-Audun Vaaler
484-Ana Valdes
485-Thomas van de Hoef
486-Eric Van Haesendonck
487-Gerald Vandecar
488-Bas Verhoeven
489-Leonard Verwey
490-Jacques Vroom
491-Daniel Walmsley (2 lines)
492-Paul Walsh
493-Christopher Webber
494-Harald Weiss
495-Daniel Wichlacz
496-Rainer Wolf
497-Christina Xu
498-VJ Yetimon
499-Deg yong Yu
500-Fabricio Zuardi
501-per åström
502
503=== modified file 'CREDITS'
504--- CREDITS 2009-10-25 00:24:34 +0000
505+++ CREDITS 2010-04-14 21:08:30 +0000
506@@ -1,5 +1,5 @@
507 # Miro - an RSS based video player application
508-# Copyright (C) 2005-2009 Participatory Culture Foundation
509+# Copyright (C) 2005-2010 Participatory Culture Foundation
510
511 =======
512 CREDITS
513
514=== modified file 'LAYOUT'
515--- LAYOUT 2009-10-25 00:24:34 +0000
516+++ LAYOUT 2010-04-14 21:08:30 +0000
517@@ -1,5 +1,5 @@
518 # Miro - an RSS based video player application
519-# Copyright (C) 2005-2009 Participatory Culture Foundation
520+# Copyright (C) 2005-2010 Participatory Culture Foundation
521
522 ======
523 LAYOUT
524
525=== modified file 'MIRO_ROOT'
526--- MIRO_ROOT 2009-03-09 12:46:19 +0000
527+++ MIRO_ROOT 2010-04-14 21:08:30 +0000
528@@ -1,5 +1,5 @@
529 # Miro - an RSS based video player application
530-# Copyright (C) 2005-2009 Participatory Culture Foundation
531+# Copyright (C) 2005-2010 Participatory Culture Foundation
532
533 Hi,
534
535
536=== modified file 'README'
537--- README 2010-02-20 02:34:26 +0000
538+++ README 2010-04-14 21:08:30 +0000
539@@ -14,9 +14,9 @@
540 It is written primarily in Python and is distributed under the terms
541 of the GNU General Public License; see license.txt.
542
543-Prebuilt versions are available from::
544+Binaries are available from::
545
546- http://www.getmiro.com/downloads/
547+ http://www.getmiro.com/
548
549 Development information, instructions on how to submit bug reports,
550 source code, information on mailing lists, and other
551
552=== modified file 'debian/README.Debian'
553--- debian/README.Debian 2009-06-27 13:27:30 +0000
554+++ debian/README.Debian 2010-04-14 21:08:30 +0000
555@@ -12,28 +12,9 @@
556
557 * You can install 'python-psyco' which will likely speed up Miro a bit.
558
559- * If you want to redirect the sound output (but not video) to another
560- host via 'esddsp' here's what you have to do:
561-
562- - Edit ~/.xine/config to say 'audio.driver:esd' on your localhost.
563-
564- - Start an esd server on another (remote) host, e.g.
565- using 'esd -public -tcp'. Make sure you allow connections to your
566- esd server (check firewall settings for port 16001 and your
567- /etc/hosts.allow and /etc/hosts.deny).
568-
569- - Now run 'esddsp -s xxx.xxx.xxx.xxx:16001 miro' on localhost, where
570- xxx.xxx.xxx.xxx is the IP address of the host where esd runs.
571- The video will now be displayed on localhost, audio will be redirected
572- to the remote host's esd.
573-
574- * If you experience segfaults or incorrect colors with Miro and certain
575- X.org drivers, please try 'miro --set xine-driver=xhsm' as a work-around,
576- or, alternatively, use the gstreamer renderer (set it in the "Options"
577- dialog or run 'miro --set renderer=gstreamer'). See
578- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=459069
579- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=473310
580- for more information on this issue.
581+ * For even further audio/video support you can also install the following:
582+
583+ $ apt-get install gstreamer0.10-plugins-ugly
584
585 * If you experience Miro crashes/segfaults, please install 'gdb' and then
586 run 'miro --debug' (which runs Miro in gdb) and try to reproduce the
587@@ -41,21 +22,7 @@
588 output (type e.g. "bt" on the gdb prompt after the crash).
589
590 If needed, please also install additional -dbg packages, e.g.
591- python2.5-dbg, python-gtk2-dbg, or xulrunner-1.9-dbg.
592-
593- * The default Miro renderer in Debian is xine. If you want to switch to
594- gstreamer, you have to install a number of additional packages and switch
595- to gstreamer in the Miro options (and restart Miro). Alternatively,
596- you can start Miro via 'miro --set renderer=gstreamer'.
597-
598- You'll need at least the following packages for gstreamer:
599-
600- $ apt-get install python-gst0.10 gstreamer0.10-plugins-base \
601- gstreamer0.10-plugins-good gstreamer0.10-x gstreamer0.10-ffmpeg
602-
603- For even further audio/video support you can also install the following:
604-
605- $ apt-get install gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly
606-
607- -- Uwe Hermann <uwe@debian.org>, Tue, 10 Feb 2009 22:57:26 +0100
608+ python2.6-dbg, python-gtk2-dbg, or xulrunner-1.9.2-dbg.
609+
610+ -- Uwe Hermann <uwe@debian.org>, Sat, 20 Mar 2010 15:29:57 +0100
611
612
613=== modified file 'debian/changelog'
614--- debian/changelog 2010-02-21 03:47:01 +0000
615+++ debian/changelog 2010-04-14 21:08:30 +0000
616@@ -1,3 +1,45 @@
617+miro (3.0.1-0ubuntu1) lucid; urgency=low
618+
619+ * New upstream bugfix release.
620+
621+ -- Daniel Hahler <ubuntu@thequod.de> Wed, 14 Apr 2010 22:05:05 +0200
622+
623+miro (3.0-1ubuntu1) lucid; urgency=low
624+
625+ * Merge from Debian unstable (LP: #548389), remaining changes:
626+ - 100_catch_keyerror_in_update_items.patch: Catch exception
627+ caused by out of bounds array index.
628+ - 101_player_undefined_elapsed_time.patch: There are some cases
629+ where the elapsed_time returned is undefined; use a current
630+ time of 0 in this case when fast-forwarding.
631+ - debian/control, debian/pyversions, debian/README.Debian:
632+ Build with python 2.6 and xulrunner 1.9.2
633+ * Dropped 90_miro_boost_py26.patch: does not apply anymore.
634+
635+ -- Daniel Hahler <ubuntu@thequod.de> Tue, 13 Apr 2010 21:21:17 +0200
636+
637+miro (3.0-1) unstable; urgency=low
638+
639+ * New upstream release (Closes: #575463).
640+ + The xine backend was removed upstream, we use gstreamer only now.
641+ + Drop (build-)dependency on all Boost packages, no longer used upstream.
642+ + debian/patches/20_no_autoupdate.patch: Update.
643+ + debian/patches/30_disable_xine_hack.patch: Drop, obsolete.
644+ + debian/patches/40_boost_python.patch: Drop, obsolete.
645+ + debian/patches/80_xine_default_renderer.patch: Drop, obsolete.
646+ * Closing non-reproducible bugs with this release. Please reopen if needed.
647+ + "No sound when playing videos" (Closes: #527261).
648+ + "Two internal errors on startup" (Closes: #557347).
649+ + "Miro "internal error" and odd behavior" (Closes: #574822).
650+ + "Miro crashes after starts playing a video" (Closes: #522102).
651+ * Standards-Version: 3.8.4 (no changes required).
652+ * debian/miro.docs: Add ADOPTERS file.
653+ * debian/README.Debian: Drop xine related sections.
654+ * debian/rules: Simplified clean target.
655+ * debian/copyright: Updates (Boost and libtorrent stuff is gone).
656+
657+ -- Uwe Hermann <uwe@debian.org> Sun, 28 Mar 2010 01:02:12 +0200
658+
659 miro (2.5.4-1ubuntu2) lucid; urgency=low
660
661 * debian/control: Migrate from xulrunner-1.9.1 to xulrunner-1.9.2
662
663=== modified file 'debian/control'
664--- debian/control 2010-02-21 03:47:01 +0000
665+++ debian/control 2010-04-14 21:08:30 +0000
666@@ -8,22 +8,16 @@
667 python2.6,
668 python-support (>= 0.6),
669 python-pyrex (>= 0.9.6.4),
670- libboost-python-dev,
671- libboost-filesystem-dev,
672- libboost-date-time-dev,
673- libboost-thread-dev,
674- libboost-serialization-dev,
675 python-libtorrent (>= 0.14.2),
676 libtorrent-rasterbar-dev (>= 0.14.2),
677 python-gtk2-dev,
678 python-gnome2-extras-dev (>= 2.19.1),
679 xulrunner-dev (>= 1.9.2),
680- libxine-dev (>= 1.1.12),
681 pkg-config,
682 libxv-dev,
683 libssl-dev,
684 libffi-dev
685-Standards-Version: 3.8.3
686+Standards-Version: 3.8.4
687 Homepage: http://www.getmiro.com
688
689 Package: miro
690@@ -38,20 +32,18 @@
691 python-glade2,
692 python-pysqlite2,
693 python-libtorrent (>= 0.14.2),
694- libxine1-x (>= 1.1.12),
695- libxine1-plugins (>= 1.1.12),
696+ python-gst0.10 (>= 0.10.0),
697+ gstreamer0.10-x (>= 0.10.0),
698+ gstreamer0.10-ffmpeg (>= 0.10.0),
699+ gstreamer0.10-plugins-base (>= 0.10.0),
700+ gstreamer0.10-plugins-good (>= 0.10.0),
701+ gstreamer0.10-plugins-bad (>= 0.10.0),
702 xulrunner-1.9.2,
703- miro-data (>= 2.5.4)
704+ miro-data (>= 3.0-1)
705 Recommends: python-psyco [i386 hurd-i386 netbsd-i386 kfreebsd-i386]
706 Suggests: ttf-dejavu,
707 python-notify,
708- python-gst0.10 (>= 0.10.0),
709- gstreamer0.10-plugins-base (>= 0.10.0),
710- gstreamer0.10-plugins-good (>= 0.10.0),
711- gstreamer0.10-plugins-bad (>= 0.10.0),
712- gstreamer0.10-plugins-ugly (>= 0.10.0),
713- gstreamer0.10-x (>= 0.10.0),
714- gstreamer0.10-ffmpeg (>= 0.10.0)
715+ gstreamer0.10-plugins-ugly (>= 0.10.0)
716 Conflicts: miro-data (<< 1.2.1)
717 Description: GTK+ based RSS video aggregator
718 Miro (previously known as Democracy Player) is a platform for Internet
719
720=== modified file 'debian/copyright'
721--- debian/copyright 2009-10-25 00:24:34 +0000
722+++ debian/copyright 2010-04-14 21:08:30 +0000
723@@ -1,7 +1,6 @@
724-This package was debianized by Uwe Hermann <uwe@debian.org> on
725-Mon, 12 Jun 2006 13:34:47 +0200
726+This work was packaged for Debian by:
727
728-The current Debian maintainer is Uwe Hermann <uwe@debian.org>.
729+ Uwe Hermann <uwe@debian.org> on Mon, 12 Jun 2006 13:34:47 +0200
730
731 It was downloaded from:
732
733@@ -146,251 +145,10 @@
734 Copyright: © 2003 - 2007 Arvid Norberg
735 License: BSD-3
736
737--------------------------------------------------------------------------------
738-
739-Files: portable/libtorrent/bindings/python/src/*
740-Copyright: © 2006 - 2007 Daniel Wallin
741-License: other
742- Boost Software License - Version 1.0 - August 17th, 2003
743-
744- Permission is hereby granted, free of charge, to any person or organization
745- obtaining a copy of the software and accompanying documentation covered by
746- this license (the "Software") to use, reproduce, display, distribute,
747- execute, and transmit the Software, and to prepare derivative works of the
748- Software, and to permit third-parties to whom the Software is furnished to
749- do so, all subject to the following:
750-
751- The copyright notices in the Software and this entire statement, including
752- the above license grant, this restriction and the following disclaimer,
753- must be included in all copies of the Software, in whole or in part, and
754- all derivative works of the Software, unless such copies or derivative
755- works are solely in the form of machine-executable object code generated by
756- a source language processor.
757-
758- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
759- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
760- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
761- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
762- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
763- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
764- DEALINGS IN THE SOFTWARE.
765-
766--------------------------------------------------------------------------------
767-
768-Files: */python/src/extensions.cpp,
769- */python/src/session.cpp
770-Copyright: © 2006 - 2007 Daniel Wallin,
771- © 2006 - 2007 Arvid Norberg
772-License: other
773- Boost Software License - Version 1.0 - August 17th, 2003
774-
775- Permission is hereby granted, free of charge, to any person or organization
776- obtaining a copy of the software and accompanying documentation covered by
777- this license (the "Software") to use, reproduce, display, distribute,
778- execute, and transmit the Software, and to prepare derivative works of the
779- Software, and to permit third-parties to whom the Software is furnished to
780- do so, all subject to the following:
781-
782- The copyright notices in the Software and this entire statement, including
783- the above license grant, this restriction and the following disclaimer,
784- must be included in all copies of the Software, in whole or in part, and
785- all derivative works of the Software, unless such copies or derivative
786- works are solely in the form of machine-executable object code generated by
787- a source language processor.
788-
789- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
790- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
791- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
792- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
793- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
794- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
795- DEALINGS IN THE SOFTWARE.
796-
797--------------------------------------------------------------------------------
798-
799-Files: */include/libtorrent/alert.hpp,
800- */include/libtorrent/random_sample.hpp,
801- */include/libtorrent/variant_stream.hpp,
802- */include/libtorrent/invariant_check.hpp,
803- */include/libtorrent/kademlia/refresh.hpp,
804- */include/libtorrent/kademlia/find_data.hpp,
805- */include/libtorrent/kademlia/closest_nodes.hpp,
806- */include/libtorrent/kademlia/traversal_algorithm.hpp,
807- */include/libtorrent/kademlia/logging.hpp,
808- */libtorrent/src/alert.cpp,
809- */libtorrent/src/storage.cpp,
810- */libtorrent/src/kademlia/refresh.cpp,
811- */libtorrent/src/kademlia/find_data.hpp,
812- */libtorrent/src/kademlia/closest_nodes.hpp,
813- */libtorrent/src/kademlia/traversal_algorithm.hpp
814-Copyright: © 2003 - 2007 Daniel Wallin,
815- © 2003 - 2007 Arvid Norberg
816-License: BSD-3
817-
818--------------------------------------------------------------------------------
819-
820-Files: */include/libtorrent/allocate_resources.hpp,
821- */include/libtorrent/aux_/allocate_resources_impl.hpp
822-Copyright: © 2003 Magnus Jonsson
823-License: BSD-3
824-
825--------------------------------------------------------------------------------
826-
827-Files: */include/libtorrent/resource_request.hpp,
828- */include/libtorrent/bt_peer_connection.hpp,
829- */libtorrent/src/allocate_resources.cpp,
830- */libtorrent/src/file_win.cpp,
831- */libtorrent/src/session.cpp,
832- */libtorrent/src/session_impl.cpp
833-Copyright: © 2003 - 2007 Magnus Jonsson,
834- © 2003 - 2007 Arvid Norberg
835-License: BSD-3
836-
837--------------------------------------------------------------------------------
838-
839-Files: */include/libtorrent/extensions/ut_pex.hpp
840-Copyright: © 2006 MassaRoddel
841-License: BSD-3
842-
843--------------------------------------------------------------------------------
844-
845-Files: */libtorrent/src/ut_pex.hpp
846-Copyright: © 2006 MassaRoddel,
847- © 2006 Arvid Norberg
848-License: BSD-3
849-
850--------------------------------------------------------------------------------
851-
852-Files: */include/libtorrent/pe_crypto.hpp,
853- */libtorrent/src/pe_crypto.cpp
854-Copyright: © 2007 Un Shayam
855-License: BSD-3
856-
857--------------------------------------------------------------------------------
858-
859-Files: */libtorrent/src/bt_peer_connection.cpp
860-Copyright: © 2007 Un Shayam,
861- © 2003 - 2007 Avrid Norberg
862-License: BSD-3
863-
864--------------------------------------------------------------------------------
865-
866-Files: */include/libtorrent/utf8.hpp
867-Copyright: © 2004 - 2005 Cory Nelson
868-License: other
869- This software is provided 'as-is', without any express or implied
870- warranty. In no event will the authors be held liable for any damages
871- arising from the use of this software.
872-
873- Permission is granted to anyone to use this software for any purpose,
874- including commercial applications, and to alter it and redistribute it
875- freely, subject to the following restrictions:
876-
877- 1. The origin of this software must not be misrepresented; you must not
878- claim that you wrote the original software. If you use this software
879- in a product, an acknowledgment in the product documentation would be
880- appreciated but is not required.
881- 2. Altered source versions must be plainly marked as such, and must not be
882- misrepresented as being the original software.
883- 3. This notice may not be removed or altered from any source distribution.
884-
885--------------------------------------------------------------------------------
886-
887-Files: */libtorrent/asio/*,
888- */libtorrent/asio/ssl/context_base.hpp,
889- */libtorrent/asio/ssl/detail/openssl_types.hpp,
890- */libtorrent/asoi/ssl/stream_base.hpp
891-Copyright: © 2003 - 2007 Christopher M. Kohlhoff <chris@kohlhoff.com>
892-License: other
893- Boost Software License - Version 1.0 - August 17th, 2003
894-
895- Permission is hereby granted, free of charge, to any person or organization
896- obtaining a copy of the software and accompanying documentation covered by
897- this license (the "Software") to use, reproduce, display, distribute,
898- execute, and transmit the Software, and to prepare derivative works of the
899- Software, and to permit third-parties to whom the Software is furnished to
900- do so, all subject to the following:
901-
902- The copyright notices in the Software and this entire statement, including
903- the above license grant, this restriction and the following disclaimer,
904- must be included in all copies of the Software, in whole or in part, and
905- all derivative works of the Software, unless such copies or derivative
906- works are solely in the form of machine-executable object code generated by
907- a source language processor.
908-
909- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
910- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
911- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
912- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
913- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
914- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
915- DEALINGS IN THE SOFTWARE.
916-
917--------------------------------------------------------------------------------
918-
919-Files: */libtorrent/asio/ssl/*
920-Copyright: © 2003 - 2007 Christopher M. Kohlhoff <chris@kohlhoff.com>,
921- © 2005 Voipster <Indrek.Juhani@voipster.com>
922-License: other
923- Boost Software License - Version 1.0 - August 17th, 2003
924-
925- Permission is hereby granted, free of charge, to any person or organization
926- obtaining a copy of the software and accompanying documentation covered by
927- this license (the "Software") to use, reproduce, display, distribute,
928- execute, and transmit the Software, and to prepare derivative works of the
929- Software, and to permit third-parties to whom the Software is furnished to
930- do so, all subject to the following:
931-
932- The copyright notices in the Software and this entire statement, including
933- the above license grant, this restriction and the following disclaimer,
934- must be included in all copies of the Software, in whole or in part, and
935- all derivative works of the Software, unless such copies or derivative
936- works are solely in the form of machine-executable object code generated by
937- a source language processor.
938-
939- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
940- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
941- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
942- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
943- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
944- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
945- DEALINGS IN THE SOFTWARE.
946-
947--------------------------------------------------------------------------------
948-
949-Files: */libtorrent/asio/detail/kqueue_reactor.hpp,
950- */libtorrent/asio/detail/kqueue_reactor_fwd.hpp
951-Copyright: © 2003 - 2007 Christopher M. Kohlhoff <chris@kohlhoff.com>,
952- © 2005 Stefan Arentz <stefan@soze.com>
953-License: other
954- Boost Software License - Version 1.0 - August 17th, 2003
955-
956- Permission is hereby granted, free of charge, to any person or organization
957- obtaining a copy of the software and accompanying documentation covered by
958- this license (the "Software") to use, reproduce, display, distribute,
959- execute, and transmit the Software, and to prepare derivative works of the
960- Software, and to permit third-parties to whom the Software is furnished to
961- do so, all subject to the following:
962-
963- The copyright notices in the Software and this entire statement, including
964- the above license grant, this restriction and the following disclaimer,
965- must be included in all copies of the Software, in whole or in part, and
966- all derivative works of the Software, unless such copies or derivative
967- works are solely in the form of machine-executable object code generated by
968- a source language processor.
969-
970- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
971- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
972- FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
973- SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
974- FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
975- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
976- DEALINGS IN THE SOFTWARE.
977-
978--------------------------------------------------------------------------------
979+------------------------------------------------------------------------------
980
981 Files: debian/*
982-Copyright: © 2006 - 2009 Uwe Hermann <uwe@debian.org>
983+Copyright: © 2006 - 2010 Uwe Hermann <uwe@debian.org>
984 License: PD
985 The packaging done by Uwe Hermann <uwe@debian.org> is hereby
986 released as public domain.
987
988=== modified file 'debian/miro.docs'
989--- debian/miro.docs 2008-08-18 07:53:05 +0000
990+++ debian/miro.docs 2010-04-14 21:08:30 +0000
991@@ -1,2 +1,3 @@
992 README
993 CREDITS
994+ADOPTERS
995
996=== modified file 'debian/patches/20_no_autoupdate.patch'
997--- debian/patches/20_no_autoupdate.patch 2009-02-11 22:46:45 +0000
998+++ debian/patches/20_no_autoupdate.patch 2010-04-14 21:08:30 +0000
999@@ -1,8 +1,8 @@
1000---- portable/startup.py.orig 2009-02-08 21:03:01.000000000 +0100
1001-+++ portable/startup.py 2009-02-08 21:03:13.000000000 +0100
1002-@@ -250,7 +250,7 @@
1003+--- portable/startup.py.orig 2010-03-28 00:44:51.000000000 +0100
1004++++ portable/startup.py 2010-03-28 00:45:01.000000000 +0100
1005+@@ -304,7 +304,7 @@
1006 yield None
1007- parse_command_line_args()
1008+ commandline.startup()
1009 yield None
1010 - autoupdate.check_for_updates()
1011 + # autoupdate.check_for_updates()
1012
1013=== removed file 'debian/patches/30_disable_xine_hack.patch'
1014--- debian/patches/30_disable_xine_hack.patch 2009-10-25 00:24:34 +0000
1015+++ debian/patches/30_disable_xine_hack.patch 1970-01-01 00:00:00 +0000
1016@@ -1,15 +0,0 @@
1017-# This seems to cause segfaults with newer libxine (?) releases, so disable it.
1018-# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=512719
1019-# http://bugzilla.pculture.org/show_bug.cgi?id=11263
1020-
1021---- platform/gtk-x11/plat/options.py.orig 2009-07-24 15:11:34.000000000 +0200
1022-+++ platform/gtk-x11/plat/options.py 2009-07-24 15:11:42.000000000 +0200
1023-@@ -51,7 +51,7 @@
1024- help="Which renderer to use. (gstreamer, xine)" )
1025-
1026- USE_XINE_XV_HACK = GTKPref(key="UseXineXVHack",
1027-- default=True,
1028-+ default=False,
1029- alias="xine-xvhack",
1030- help="Whether or not to use the Xine xv hack. (true, false)" )
1031-
1032
1033=== removed file 'debian/patches/80_xine_default_renderer.patch'
1034--- debian/patches/80_xine_default_renderer.patch 2009-10-25 00:24:34 +0000
1035+++ debian/patches/80_xine_default_renderer.patch 1970-01-01 00:00:00 +0000
1036@@ -1,14 +0,0 @@
1037-# For now, keep xine as default renderer and make gstreamer optional.
1038-# This saves quite some disk space in dependency packages (e.g. for netbooks).
1039-
1040---- platform/gtk-x11/plat/options.py.orig 2009-07-24 15:20:37.000000000 +0200
1041-+++ platform/gtk-x11/plat/options.py 2009-07-24 15:20:43.000000000 +0200
1042-@@ -46,7 +46,7 @@
1043- self.help = help
1044-
1045- USE_RENDERER = GTKPref(key="useRenderer",
1046-- default=u"gstreamer",
1047-+ default=u"xine",
1048- alias="renderer",
1049- help="Which renderer to use. (gstreamer, xine)" )
1050-
1051
1052=== removed file 'debian/patches/90_miro_boost_py26.patch'
1053--- debian/patches/90_miro_boost_py26.patch 2010-01-19 22:42:30 +0000
1054+++ debian/patches/90_miro_boost_py26.patch 1970-01-01 00:00:00 +0000
1055@@ -1,16 +0,0 @@
1056-diff -Nurp miro-2.5.3/platform/gtk-x11/setup.py miro-2.5.3-working/platform/gtk-x11/setup.py
1057---- miro-2.5.3/platform/gtk-x11/setup.py 2009-10-14 15:18:23.000000000 -0700
1058-+++ miro-2.5.3-working/platform/gtk-x11/setup.py 2010-01-15 18:45:13.000000000 -0800
1059-@@ -303,9 +303,9 @@ all_libs = [mem for mem in all_libs if m
1060-
1061- def mt_or_not(s, all_libs=all_libs):
1062- for mem in all_libs:
1063-- if mem.startswith("lib%s-mt" % s):
1064-- print "Using %s-mt" % s
1065-- return "%s-mt" % s
1066-+ if mem.startswith("lib%s-mt-py26" % s):
1067-+ print "Using %s-mt-py26" % s
1068-+ return "%s-mt-py26" % s
1069- print "using %s" % s
1070- return s
1071-
1072
1073=== modified file 'debian/rules'
1074--- debian/rules 2009-10-25 00:24:34 +0000
1075+++ debian/rules 2010-04-14 21:08:30 +0000
1076@@ -43,20 +43,7 @@
1077 rm -rf debian/miro-data/usr/share/miro/resources/testdata
1078
1079 clean::
1080- @# TODO: This should probably be done in the upstream source.
1081- rm -f portable/database.c
1082- rm -f portable/sorts.c
1083- rm -f portable/frontends/widgets/gtk/pygtkhacks.c
1084- rm -f platform/gtk-x11/plat/frontends/widgets/mozprompt.[ch]
1085- rm -f platform/gtk-x11/plat/frontends/widgets/httpobserver.c
1086- rm -f platform/gtk-x11/plat/frontends/widgets/windowcreator.cpp
1087- rm -f platform/gtk-x11/plat/frontends/widgets/pluginsdir.cpp
1088- rm -f platform/gtk-x11/miro.1.gz
1089- rm -f platform/gtk-x11/miro.real.1.gz
1090- rm -f platform/gtk-x11/xine/xine_extractor
1091- rm -f platform/gtk-x11/plat/xlibhelper.c
1092- rm -f platform/gtk-x11/xine/xine.c
1093- rm -f platform/gtk-x11/miro
1094+ cd platform/gtk-x11/ && make clean
1095
1096 # For /usr/share/cdbs/1/rules/utils.mk sanity check.
1097 common-binary-post-install-arch:: list-missing
1098
1099=== added file 'platform/gtk-x11/Makefile'
1100--- platform/gtk-x11/Makefile 1970-01-01 00:00:00 +0000
1101+++ platform/gtk-x11/Makefile 2010-04-14 21:08:30 +0000
1102@@ -0,0 +1,50 @@
1103+SHELL = /bin/sh
1104+
1105+prefix = /usr
1106+distdir = dist
1107+exec_prefix = $(prefix)
1108+bindir = $(distdir)$(exec_prefix)/bin
1109+python = $(shell which python)
1110+python_version = $(shell $(python) -c 'import sys; info=sys.version_info; print "%s.%s" % (info[0], info[1])')
1111+
1112+SITE32PATH = $(shell pwd)/dist$(prefix)/lib/python$(python_version)/site-packages/
1113+SITE64PATH = $(shell pwd)/dist$(prefix)/lib64/python$(python_version)/site-packages/
1114+MIROPYTHONPATH = $(SITE32PATH):$(SITE64PATH)
1115+
1116+.PHONY: build run test pylint
1117+
1118+clean:
1119+ -rm -rf build dist
1120+ -rm -rf miro.1.gz miro.real.1.gz
1121+ -rm miro
1122+ -rm plat/xlibhelper.c
1123+ -rm plat/frontends/widgets/httpobserver.c
1124+ -rm plat/frontends/widgets/mozprompt.h plat/frontends/widgets/mozprompt.c
1125+ -rm plat/frontends/widgets/pluginsdir.cpp
1126+ -rm plat/frontends/widgets/windowcreator.cpp
1127+ -rm ../../portable/frontends/widgets/gtk/pygtkhacks.c
1128+ -rm -rf tmp
1129+
1130+build:
1131+ $(python) setup.py install --root=./dist --prefix=$(prefix)
1132+
1133+run: build
1134+ MIRO_SHARE_ROOT=dist/$(prefix)/share/ \
1135+ MIRO_RESOURCE_ROOT=dist/$(prefix)/share/miro/resources/ \
1136+ PATH=dist$(prefix)/bin \
1137+ PYTHONPATH=$(MIROPYTHONPATH) \
1138+ $(bindir)/miro
1139+
1140+test: build
1141+ MIRO_SHARE_ROOT=dist/$(prefix)/share/ \
1142+ MIRO_RESOURCE_ROOT=dist/$(prefix)/share/miro/resources/ \
1143+ PATH=dist$(prefix)/bin \
1144+ PYTHONPATH=$(MIROPYTHONPATH) \
1145+ $(bindir)/miro --unittest
1146+
1147+pylint: build
1148+ # remove .so files that pylint flips out on
1149+ find dist -name "*.so" | xargs rm
1150+ rm -rf dist/usr/lib/python2.6/site-packages/miro/test
1151+ cd dist/$(prefix)/lib/python$(python_version)/site-packages && \
1152+ pylint --rcfile ../../../../../pylintrc miro > ../../../../../pylint.output 2>&1
1153
1154=== modified file 'platform/gtk-x11/README'
1155--- platform/gtk-x11/README 2009-10-25 00:24:34 +0000
1156+++ platform/gtk-x11/README 2010-04-14 21:08:30 +0000
1157@@ -3,7 +3,7 @@
1158 ======
1159
1160 :Author: Will Kahn-Greene <will.guaraldi at pculture dot org>
1161-:Date: June 1st, 2009
1162+:Date: January 14, 2010
1163
1164
1165 Summary
1166@@ -51,13 +51,17 @@
1167 .. Note:: Setting ``HOME`` doesn't work in KDE--it causes other problems.
1168
1169
1170-Wiping out preferences
1171-======================
1172+Preferences
1173+===========
1174
1175 Miro stores preferences in gconf. To wipe out all preferences, do::
1176
1177 gconftool-2 --recursive-unset /apps/miro
1178
1179+To backup your preferences, do::
1180+
1181+ gconftool-2 --dump /apps/miro > /tmp/foobar
1182+
1183
1184 Unittest instructions
1185 =====================
1186@@ -89,27 +93,8 @@
1187 type errors.
1188
1189
1190-Problems with xine
1191-==================
1192-
1193-A while back, we had problems with xine and wrote "xine xv hack" code.
1194-This code helps some platforms and segfaults on others. Depending on
1195-your platform, you will want to enable/disable the hack. This can be
1196-done in two places. First, it can be done in setup.py with the
1197-``USE_XINE_HACK`` option. Second, if ``USE_XINE_HACK`` was True when
1198-Miro was compiled, then you can enable/disable the hack through the
1199-command line with::
1200-
1201- miro --set=xine-xvhack=true
1202-
1203-or::
1204-
1205- miro --set=xine-xvhack=False
1206-
1207-
1208 Problems with gstreamer
1209 =======================
1210
1211 Make sure you have gstreamer plugins installed. That solves most
1212 problems.
1213-
1214
1215=== removed file 'platform/gtk-x11/clean.sh'
1216--- platform/gtk-x11/clean.sh 2009-08-09 19:36:11 +0000
1217+++ platform/gtk-x11/clean.sh 1970-01-01 00:00:00 +0000
1218@@ -1,54 +0,0 @@
1219-#!/bin/sh
1220-
1221-# Miro - an RSS based video player application
1222-# Copyright (C) 2005-2009 Participatory Culture Foundation
1223-#
1224-# This program is free software; you can redistribute it and/or modify
1225-# it under the terms of the GNU General Public License as published by
1226-# the Free Software Foundation; either version 2 of the License, or
1227-# (at your option) any later version.
1228-#
1229-# This program is distributed in the hope that it will be useful,
1230-# but WITHOUT ANY WARRANTY; without even the implied warranty of
1231-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1232-# GNU General Public License for more details.
1233-#
1234-# You should have received a copy of the GNU General Public License
1235-# along with this program; if not, write to the Free Software
1236-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1237-#
1238-# In addition, as a special exception, the copyright holders give
1239-# permission to link the code of portions of this program with the OpenSSL
1240-# library.
1241-#
1242-# You must obey the GNU General Public License in all respects for all of
1243-# the code used other than OpenSSL. If you modify file(s) with this
1244-# exception, you may extend this exception to your version of the file(s),
1245-# but you are not obligated to do so. If you do not wish to do so, delete
1246-# this exception statement from your version. If you delete this exception
1247-# statement from all source files in the program, then also delete it here.
1248-
1249-
1250-# build and dist
1251-rm -rf build dist
1252-
1253-# xine/ stuff
1254-rm xine/xine_extractor xine/xine.c
1255-
1256-# plat/ stuff
1257-rm plat/xlibhelper.c
1258-
1259-# man pages
1260-rm miro.1.gz miro.real.1.gz
1261-
1262-# miro file
1263-rm miro
1264-
1265-# plat/frontends/widgets/
1266-rm 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
1267-
1268-# portable/ stuff
1269-rm ../../portable/sorts.c
1270-
1271-# portable/frontends/widgets/gtk/
1272-rm ../../portable/frontends/widgets/gtk/pygtkhacks.c
1273
1274=== added directory 'platform/gtk-x11/icons'
1275=== removed directory 'platform/gtk-x11/icons'
1276=== added directory 'platform/gtk-x11/icons/hicolor'
1277=== removed directory 'platform/gtk-x11/icons/hicolor'
1278=== added directory 'platform/gtk-x11/icons/hicolor/128x128'
1279=== removed directory 'platform/gtk-x11/icons/hicolor/128x128'
1280=== added directory 'platform/gtk-x11/icons/hicolor/128x128/apps'
1281=== removed directory 'platform/gtk-x11/icons/hicolor/128x128/apps'
1282=== added file 'platform/gtk-x11/icons/hicolor/128x128/apps/miro.png'
1283Binary 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
1284=== removed file 'platform/gtk-x11/icons/hicolor/128x128/apps/miro.png'
1285Binary 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
1286=== added directory 'platform/gtk-x11/icons/hicolor/24x24'
1287=== removed directory 'platform/gtk-x11/icons/hicolor/24x24'
1288=== added directory 'platform/gtk-x11/icons/hicolor/24x24/apps'
1289=== removed directory 'platform/gtk-x11/icons/hicolor/24x24/apps'
1290=== added file 'platform/gtk-x11/icons/hicolor/24x24/apps/miro.png'
1291Binary 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
1292=== removed file 'platform/gtk-x11/icons/hicolor/24x24/apps/miro.png'
1293Binary 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
1294=== added directory 'platform/gtk-x11/icons/hicolor/48x48'
1295=== removed directory 'platform/gtk-x11/icons/hicolor/48x48'
1296=== added directory 'platform/gtk-x11/icons/hicolor/48x48/apps'
1297=== removed directory 'platform/gtk-x11/icons/hicolor/48x48/apps'
1298=== added file 'platform/gtk-x11/icons/hicolor/48x48/apps/miro.png'
1299Binary 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
1300=== removed file 'platform/gtk-x11/icons/hicolor/48x48/apps/miro.png'
1301Binary 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
1302=== added directory 'platform/gtk-x11/icons/hicolor/72x72'
1303=== removed directory 'platform/gtk-x11/icons/hicolor/72x72'
1304=== added directory 'platform/gtk-x11/icons/hicolor/72x72/apps'
1305=== removed directory 'platform/gtk-x11/icons/hicolor/72x72/apps'
1306=== added file 'platform/gtk-x11/icons/hicolor/72x72/apps/miro.png'
1307Binary 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
1308=== removed file 'platform/gtk-x11/icons/hicolor/72x72/apps/miro.png'
1309Binary 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
1310=== modified file 'platform/gtk-x11/miro.1'
1311--- platform/gtk-x11/miro.1 2009-03-09 12:46:19 +0000
1312+++ platform/gtk-x11/miro.1 2010-04-14 21:08:30 +0000
1313@@ -1,9 +1,9 @@
1314-.TH MIRO 1 "February 11, 2009"
1315+.TH MIRO 1 "January 14, 2010"
1316 .SH NAME
1317 miro \- a GTK+ based RSS video aggregator and player
1318 .SH SYNOPSIS
1319 .B miro
1320-.RB [ OPTIONS ]
1321+.RB [ OPTIONS ] [ FILES ]
1322 .SH DESCRIPTION
1323 .B "Miro"
1324 is a platform for Internet television and video. An intuitive interface
1325@@ -12,6 +12,10 @@
1326 Please read
1327 .B "miro \-\-help"
1328 for a list of all available Miro command line options.
1329+.SH FILES
1330+You can launch Miro with one or more file names and urls for items
1331+to add to the Miro database, items to download and add to the Miro
1332+database, and feeds to subscribe to.
1333 .SH HELP
1334 Forums and other help are available at http://getmiro.com/ .
1335 .SH BUGS
1336
1337=== modified file 'platform/gtk-x11/miro.real'
1338--- platform/gtk-x11/miro.real 2009-10-25 00:24:34 +0000
1339+++ platform/gtk-x11/miro.real 2010-04-14 21:08:30 +0000
1340@@ -2,7 +2,7 @@
1341 # -*- mode: python -*-
1342
1343 # Miro - an RSS based video player application
1344-# Copyright (C) 2005-2009 Participatory Culture Foundation
1345+# Copyright (C) 2005-2010 Participatory Culture Foundation
1346 #
1347 # This program is free software; you can redistribute it and/or modify
1348 # it under the terms of the GNU General Public License as published by
1349@@ -73,7 +73,7 @@
1350 dest="set_prefs",
1351 metavar="<PREF>",
1352 nargs=1,
1353- help="Sets a preference and saves the new value for future Miro runs. Example: miro --set renderer=xine")
1354+ help="Sets a preference and saves the new value for future Miro runs. Example: miro --set renderer=gstreamer")
1355 parser.set_defaults(set_prefs=[])
1356 parser.add_option_group(group)
1357
1358@@ -109,6 +109,9 @@
1359 from miro.plat import options
1360 options.gconf_name = parsed_options.gconf_name
1361
1362+from miro.plat import utils
1363+utils.initialize_locale()
1364+
1365 from miro import gtcache
1366 gtcache.init()
1367
1368@@ -121,15 +124,15 @@
1369 sys.modules['feedparser'] = miro.feedparser
1370 sys.modules['storedatabase'] = miro.storedatabase
1371
1372-
1373 from miro import config
1374-from miro import plat
1375 from miro import prefs
1376 from miro import commandline
1377
1378 if '--unittest' in sys.argv:
1379 # handle this outside optparse, because unittest has its own option set
1380 sys.argv.remove('--unittest')
1381+ import logging
1382+ logging.basicConfig(level=logging.CRITICAL)
1383 import unittest
1384 from miro import test
1385 unittest.main(module=test)
1386@@ -198,8 +201,6 @@
1387 return p, val
1388
1389 def startapp():
1390- plat.utils.initializeLocale()
1391-
1392 # Create miro directories in the user's home
1393 support_dir = config.get(prefs.SUPPORT_DIRECTORY)
1394 if not os.path.exists(support_dir):
1395@@ -266,16 +267,15 @@
1396 try:
1397 onetime.OneTime()
1398 startapp()
1399- except onetime.NameExistsException:
1400- # This onetime.NameExistsException is either dbus.NameExistsException
1401- # or an exception we created ourselves. Change it to
1402- # dbus.NameExistsException when we get rid of code that allows Miro to
1403- # run on platforms with the older dbus-python bindings.
1404+ except dbus.NameExistsException:
1405 bus = dbus.SessionBus()
1406- proxy_obj = bus.get_object('org.participatoryculture.dtv.onetime', '/org/participatoryculture/dtv/OneTime')
1407- iface = dbus.Interface(proxy_obj, 'org.participatoryculture.dtv.OneTimeIface')
1408- for i in xrange(len(args)):
1409- args[i] = args[i].decode('latin1')
1410+ proxy_obj = bus.get_object(
1411+ 'org.participatoryculture.dtv.onetime',
1412+ '/org/participatoryculture/dtv/OneTime')
1413+ iface = dbus.Interface(
1414+ proxy_obj, 'org.participatoryculture.dtv.OneTimeIFace')
1415+ for i, arg in enumerate(args):
1416+ args[i] = arg.decode('latin1')
1417 dbusargs = dbus.Array(args, signature="s")
1418
1419 try:
1420
1421=== modified file 'platform/gtk-x11/plat/__init__.py'
1422--- platform/gtk-x11/plat/__init__.py 2009-10-25 00:24:34 +0000
1423+++ platform/gtk-x11/plat/__init__.py 2010-04-14 21:08:30 +0000
1424@@ -1,5 +1,5 @@
1425 # Miro - an RSS based video player application
1426-# Copyright (C) 2005-2009 Participatory Culture Foundation
1427+# Copyright (C) 2005-2010 Participatory Culture Foundation
1428 #
1429 # This program is free software; you can redistribute it and/or modify
1430 # it under the terms of the GNU General Public License as published by
1431
1432=== modified file 'platform/gtk-x11/plat/config.py'
1433--- platform/gtk-x11/plat/config.py 2009-10-25 00:24:34 +0000
1434+++ platform/gtk-x11/plat/config.py 2010-04-14 21:08:30 +0000
1435@@ -1,5 +1,5 @@
1436 # Miro - an RSS based video player application
1437-# Copyright (C) 2005-2009 Participatory Culture Foundation
1438+# Copyright (C) 2005-2010 Participatory Culture Foundation
1439 #
1440 # This program is free software; you can redistribute it and/or modify
1441 # it under the terms of the GNU General Public License as published by
1442
1443=== modified file 'platform/gtk-x11/plat/frontends/__init__.py'
1444--- platform/gtk-x11/plat/frontends/__init__.py 2009-10-25 00:24:34 +0000
1445+++ platform/gtk-x11/plat/frontends/__init__.py 2010-04-14 21:08:30 +0000
1446@@ -1,5 +1,5 @@
1447 # Miro - an RSS based video player application
1448-# Copyright (C) 2005-2009 Participatory Culture Foundation
1449+# Copyright (C) 2005-2010 Participatory Culture Foundation
1450 #
1451 # This program is free software; you can redistribute it and/or modify
1452 # it under the terms of the GNU General Public License as published by
1453
1454=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc'
1455--- platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc 2009-02-11 01:32:44 +0000
1456+++ platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.cc 2010-04-14 21:08:30 +0000
1457@@ -1,6 +1,6 @@
1458 /*
1459 # Miro - an RSS based video player application
1460-# Copyright (C) 2005-2009 Participatory Culture Foundation
1461+# Copyright (C) 2005-2010 Participatory Culture Foundation
1462 #
1463 # This program is free software; you can redistribute it and/or modify
1464 # it under the terms of the GNU General Public License as published by
1465
1466=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h'
1467--- platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h 2009-02-11 01:32:44 +0000
1468+++ platform/gtk-x11/plat/frontends/widgets/MiroPluginsDir.h 2010-04-14 21:08:30 +0000
1469@@ -1,6 +1,6 @@
1470 /*
1471 * Miro - an RSS based video player application
1472- * Copyright (C) 2005-2009 Participatory Culture Foundation
1473+ * Copyright (C) 2005-2010 Participatory Culture Foundation
1474
1475 * This program is free software; you can redistribute it and/or modify
1476 * it under the terms of the GNU General Public License as published by
1477
1478=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc'
1479--- platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc 2009-02-11 01:32:44 +0000
1480+++ platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.cc 2010-04-14 21:08:30 +0000
1481@@ -1,6 +1,6 @@
1482 /*
1483 * Miro - an RSS based video player application
1484- * Copyright (C) 2005-2009 Participatory Culture Foundation
1485+ * Copyright (C) 2005-2010 Participatory Culture Foundation
1486 *
1487 * This program is free software; you can redistribute it and/or modify
1488 * it under the terms of the GNU General Public License as published by
1489
1490=== modified file 'platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h'
1491--- platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h 2009-02-11 01:32:44 +0000
1492+++ platform/gtk-x11/plat/frontends/widgets/MiroWindowCreator.h 2010-04-14 21:08:30 +0000
1493@@ -1,6 +1,6 @@
1494 /*
1495 * Miro - an RSS based video player application
1496- * Copyright (C) 2005-2009 Participatory Culture Foundation
1497+ * Copyright (C) 2005-2010 Participatory Culture Foundation
1498 *
1499 * This program is free software; you can redistribute it and/or modify
1500 * it under the terms of the GNU General Public License as published by
1501
1502=== modified file 'platform/gtk-x11/plat/frontends/widgets/PromptService.cc'
1503--- platform/gtk-x11/plat/frontends/widgets/PromptService.cc 2009-02-11 01:32:44 +0000
1504+++ platform/gtk-x11/plat/frontends/widgets/PromptService.cc 2010-04-14 21:08:30 +0000
1505@@ -1,6 +1,6 @@
1506 /*
1507 # Miro - an RSS based video player application
1508-# Copyright (C) 2005-2009 Participatory Culture Foundation
1509+# Copyright (C) 2005-2010 Participatory Culture Foundation
1510 #
1511 # This program is free software; you can redistribute it and/or modify
1512 # it under the terms of the GNU General Public License as published by
1513
1514=== modified file 'platform/gtk-x11/plat/frontends/widgets/PromptService.h'
1515--- platform/gtk-x11/plat/frontends/widgets/PromptService.h 2009-02-11 01:32:44 +0000
1516+++ platform/gtk-x11/plat/frontends/widgets/PromptService.h 2010-04-14 21:08:30 +0000
1517@@ -1,6 +1,6 @@
1518 /*
1519 # Miro - an RSS based video player application
1520-# Copyright (C) 2005-2009 Participatory Culture Foundation
1521+# Copyright (C) 2005-2010 Participatory Culture Foundation
1522 #
1523 # This program is free software; you can redistribute it and/or modify
1524 # it under the terms of the GNU General Public License as published by
1525
1526=== modified file 'platform/gtk-x11/plat/frontends/widgets/__init__.py'
1527--- platform/gtk-x11/plat/frontends/widgets/__init__.py 2009-02-11 01:32:44 +0000
1528+++ platform/gtk-x11/plat/frontends/widgets/__init__.py 2010-04-14 21:08:30 +0000
1529@@ -1,5 +1,5 @@
1530 # Miro - an RSS based video player application
1531-# Copyright (C) 2005-2009 Participatory Culture Foundation
1532+# Copyright (C) 2005-2010 Participatory Culture Foundation
1533 #
1534 # This program is free software; you can redistribute it and/or modify
1535 # it under the terms of the GNU General Public License as published by
1536
1537=== modified file 'platform/gtk-x11/plat/frontends/widgets/application.py'
1538--- platform/gtk-x11/plat/frontends/widgets/application.py 2009-10-25 00:24:34 +0000
1539+++ platform/gtk-x11/plat/frontends/widgets/application.py 2010-04-14 21:08:30 +0000
1540@@ -1,5 +1,5 @@
1541 # Miro - an RSS based video player application
1542-# Copyright (C) 2005-2009 Participatory Culture Foundation
1543+# Copyright (C) 2005-2010 Participatory Culture Foundation
1544 #
1545 # This program is free software; you can redistribute it and/or modify
1546 # it under the terms of the GNU General Public License as published by
1547@@ -51,6 +51,7 @@
1548 from miro.plat.config import gconf_lock
1549 from miro.frontends.widgets.gtk import trayicon
1550 from miro.plat import resources
1551+from miro.plat.frontends.widgets import mediakeys
1552
1553 from miro.frontends.widgets.gtk.widgetset import Rect
1554
1555@@ -112,6 +113,7 @@
1556 langs = [(l, os.environ.get(l)) for l in langs if os.environ.get(l)]
1557 logging.info("Language: %s", langs)
1558 renderers.init_renderer()
1559+ self.mediakeyhandler = mediakeys.get_media_key_handler()
1560 gtk.main()
1561 app.controller.on_shutdown()
1562
1563
1564=== modified file 'platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx'
1565--- platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx 2009-02-11 01:32:44 +0000
1566+++ platform/gtk-x11/plat/frontends/widgets/httpobserver.pyx 2010-04-14 21:08:30 +0000
1567@@ -1,5 +1,5 @@
1568 # Miro - an RSS based video player application
1569-# Copyright (C) 2005-2009 Participatory Culture Foundation
1570+# Copyright (C) 2005-2010 Participatory Culture Foundation
1571 #
1572 # This program is free software; you can redistribute it and/or modify
1573 # it under the terms of the GNU General Public License as published by
1574
1575=== added file 'platform/gtk-x11/plat/frontends/widgets/mediakeys.py'
1576--- platform/gtk-x11/plat/frontends/widgets/mediakeys.py 1970-01-01 00:00:00 +0000
1577+++ platform/gtk-x11/plat/frontends/widgets/mediakeys.py 2010-04-14 21:08:30 +0000
1578@@ -0,0 +1,61 @@
1579+# Miro - an RSS based video player application
1580+# Copyright (C) 2010 Participatory Culture Foundation
1581+#
1582+# This program is free software; you can redistribute it and/or modify
1583+# it under the terms of the GNU General Public License as published by
1584+# the Free Software Foundation; either version 2 of the License, or
1585+# (at your option) any later version.
1586+#
1587+# This program is distributed in the hope that it will be useful,
1588+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1589+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1590+# GNU General Public License for more details.
1591+#
1592+# You should have received a copy of the GNU General Public License
1593+# along with this program; if not, write to the Free Software
1594+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1595+#
1596+# In addition, as a special exception, the copyright holders give
1597+# permission to link the code of portions of this program with the OpenSSL
1598+# library.
1599+#
1600+# You must obey the GNU General Public License in all respects for all of
1601+# the code used other than OpenSSL. If you modify file(s) with this
1602+# exception, you may extend this exception to your version of the file(s),
1603+# but you are not obligated to do so. If you do not wish to do so, delete
1604+# this exception statement from your version. If you delete this exception
1605+# statement from all source files in the program, then also delete it here.
1606+
1607+import logging
1608+import dbus
1609+
1610+from miro import app
1611+
1612+class MediaKeyHandler(object):
1613+ def __init__(self):
1614+ self.bus = dbus.Bus(dbus.Bus.TYPE_SESSION)
1615+ self.bus_object = self.bus.get_object(
1616+ 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys')
1617+
1618+ self.bus_object.GrabMediaPlayerKeys(
1619+ "Miro", 0, dbus_interface='org.gnome.SettingsDaemon.MediaKeys')
1620+
1621+ self.bus_object.connect_to_signal(
1622+ 'MediaPlayerKeyPressed', self.handle_mediakey)
1623+
1624+ def handle_mediakey(self, *mmkeys):
1625+ for key in mmkeys:
1626+ if key == "Play":
1627+ app.widgetapp.on_play_clicked()
1628+ elif key == "Stop":
1629+ app.widgetapp.on_stop_clicked()
1630+ elif key == "Next":
1631+ app.widgetapp.on_forward_clicked()
1632+ elif key == "Previous":
1633+ app.widgetapp.on_previous_clicked()
1634+
1635+def get_media_key_handler():
1636+ try:
1637+ return MediaKeyHandler()
1638+ except dbus.DBusException:
1639+ logging.debug("cannot load MediaKeyHandler")
1640
1641=== modified file 'platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx'
1642--- platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx 2009-02-11 01:32:44 +0000
1643+++ platform/gtk-x11/plat/frontends/widgets/mozprompt.pyx 2010-04-14 21:08:30 +0000
1644@@ -1,3 +1,31 @@
1645+# Miro - an RSS based video player application
1646+# Copyright (C) 2005-2010 Participatory Culture Foundation
1647+#
1648+# This program is free software; you can redistribute it and/or modify
1649+# it under the terms of the GNU General Public License as published by
1650+# the Free Software Foundation; either version 2 of the License, or
1651+# (at your option) any later version.
1652+#
1653+# This program is distributed in the hope that it will be useful,
1654+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1655+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1656+# GNU General Public License for more details.
1657+#
1658+# You should have received a copy of the GNU General Public License
1659+# along with this program; if not, write to the Free Software
1660+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1661+#
1662+# In addition, as a special exception, the copyright holders give
1663+# permission to link the code of portions of this program with the OpenSSL
1664+# library.
1665+#
1666+# You must obey the GNU General Public License in all respects for all of
1667+# the code used other than OpenSSL. If you modify file(s) with this
1668+# exception, you may extend this exception to your version of the file(s),
1669+# but you are not obligated to do so. If you do not wish to do so, delete
1670+# this exception statement from your version. If you delete this exception
1671+# statement from all source files in the program, then also delete it here.
1672+
1673 import logging
1674
1675 cdef extern from "nsError.h":
1676
1677=== modified file 'platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx' (properties changed: +x to -x)
1678--- platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx 2009-02-11 01:32:44 +0000
1679+++ platform/gtk-x11/plat/frontends/widgets/pluginsdir.pyx 2010-04-14 21:08:30 +0000
1680@@ -1,5 +1,5 @@
1681 # Miro - an RSS based video player application
1682-# Copyright (C) 2005-2009 Participatory Culture Foundation
1683+# Copyright (C) 2005-2010 Participatory Culture Foundation
1684 #
1685 # This program is free software; you can redistribute it and/or modify
1686 # it under the terms of the GNU General Public License as published by
1687
1688=== modified file 'platform/gtk-x11/plat/frontends/widgets/prefpanelset.py'
1689--- platform/gtk-x11/plat/frontends/widgets/prefpanelset.py 2009-10-25 00:24:34 +0000
1690+++ platform/gtk-x11/plat/frontends/widgets/prefpanelset.py 2010-04-14 21:08:30 +0000
1691@@ -1,5 +1,5 @@
1692 # Miro - an RSS based video player application
1693-# Copyright (C) 2005-2009 Participatory Culture Foundation
1694+# Copyright (C) 2005-2010 Participatory Culture Foundation
1695 #
1696 # This program is free software; you can redistribute it and/or modify
1697 # it under the terms of the GNU General Public License as published by
1698@@ -38,6 +38,7 @@
1699 from miro.frontends.widgets.widgetutil import align_left
1700 from miro.frontends.widgets.prefpanel import attach_boolean, attach_radio, attach_combo
1701
1702+from miro.plat import renderers
1703 from miro.plat import options
1704
1705 from miro import config, prefs
1706@@ -66,13 +67,15 @@
1707 grid.end_line(spacing=12)
1708
1709 rbg = widgetset.RadioButtonGroup()
1710- gstreamer_radio = widgetset.RadioButton("gstreamer", rbg)
1711- xine_radio = widgetset.RadioButton("xine", rbg)
1712- attach_radio([(gstreamer_radio, "gstreamer"), (xine_radio, "xine")],
1713- options.USE_RENDERER)
1714+ radio_map = {}
1715+ for mem in renderers.get_renderer_list():
1716+ radio_map[mem] = widgetset.RadioButton(mem, rbg)
1717+
1718+ buttons = [(v, k) for k, v in radio_map.items()]
1719+ attach_radio(buttons, options.USE_RENDERER)
1720
1721 grid.pack_label(_("Video renderer:"), grid.ALIGN_RIGHT)
1722- grid.pack(dialogwidgets.radio_button_list(gstreamer_radio, xine_radio))
1723+ grid.pack(dialogwidgets.radio_button_list(*radio_map.values()))
1724
1725 grid.end_line(spacing=12)
1726
1727@@ -84,4 +87,5 @@
1728 if panel_name == "general":
1729 return _general_panel()
1730 elif panel_name == "playback":
1731- return _playback_panel()
1732+ if len(renderers.get_renderer_list()) > 1:
1733+ return _playback_panel()
1734
1735=== modified file 'platform/gtk-x11/plat/frontends/widgets/threads.py'
1736--- platform/gtk-x11/plat/frontends/widgets/threads.py 2009-02-11 01:32:44 +0000
1737+++ platform/gtk-x11/plat/frontends/widgets/threads.py 2010-04-14 21:08:30 +0000
1738@@ -1,5 +1,5 @@
1739 # Miro - an RSS based video player application
1740-# Copyright (C) 2005-2009 Participatory Culture Foundation
1741+# Copyright (C) 2005-2010 Participatory Culture Foundation
1742 #
1743 # This program is free software; you can redistribute it and/or modify
1744 # it under the terms of the GNU General Public License as published by
1745
1746=== modified file 'platform/gtk-x11/plat/frontends/widgets/timer.py'
1747--- platform/gtk-x11/plat/frontends/widgets/timer.py 2009-02-11 01:32:44 +0000
1748+++ platform/gtk-x11/plat/frontends/widgets/timer.py 2010-04-14 21:08:30 +0000
1749@@ -1,5 +1,5 @@
1750 # Miro - an RSS based video player application
1751-# Copyright (C) 2005-2009 Participatory Culture Foundation
1752+# Copyright (C) 2005-2010 Participatory Culture Foundation
1753 #
1754 # This program is free software; you can redistribute it and/or modify
1755 # it under the terms of the GNU General Public License as published by
1756
1757=== modified file 'platform/gtk-x11/plat/frontends/widgets/widgetset.py'
1758--- platform/gtk-x11/plat/frontends/widgets/widgetset.py 2009-10-25 00:24:34 +0000
1759+++ platform/gtk-x11/plat/frontends/widgets/widgetset.py 2010-04-14 21:08:30 +0000
1760@@ -1,5 +1,5 @@
1761 # Miro - an RSS based video player application
1762-# Copyright (C) 2005-2009 Participatory Culture Foundation
1763+# Copyright (C) 2005-2010 Participatory Culture Foundation
1764 #
1765 # This program is free software; you can redistribute it and/or modify
1766 # it under the terms of the GNU General Public License as published by
1767
1768=== modified file 'platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx' (properties changed: +x to -x)
1769--- platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx 2009-02-11 01:32:44 +0000
1770+++ platform/gtk-x11/plat/frontends/widgets/windowcreator.pyx 2010-04-14 21:08:30 +0000
1771@@ -1,5 +1,5 @@
1772 # Miro - an RSS based video player application
1773-# Copyright (C) 2005-2009 Participatory Culture Foundation
1774+# Copyright (C) 2005-2010 Participatory Culture Foundation
1775 #
1776 # This program is free software; you can redistribute it and/or modify
1777 # it under the terms of the GNU General Public License as published by
1778
1779=== modified file 'platform/gtk-x11/plat/idletime.py'
1780--- platform/gtk-x11/plat/idletime.py 2009-02-11 01:32:44 +0000
1781+++ platform/gtk-x11/plat/idletime.py 2010-04-14 21:08:30 +0000
1782@@ -1,5 +1,5 @@
1783 # Miro - an RSS based video player application
1784-# Copyright (C) 2005-2009 Participatory Culture Foundation
1785+# Copyright (C) 2005-2010 Participatory Culture Foundation
1786 #
1787 # This program is free software; you can redistribute it and/or modify
1788 # it under the terms of the GNU General Public License as published by
1789
1790=== modified file 'platform/gtk-x11/plat/mozsetup.py'
1791--- platform/gtk-x11/plat/mozsetup.py 2009-06-26 21:29:54 +0000
1792+++ platform/gtk-x11/plat/mozsetup.py 2010-04-14 21:08:30 +0000
1793@@ -1,5 +1,5 @@
1794 # Miro - an RSS based video player application
1795-# Copyright (C) 2005-2009 Participatory Culture Foundation
1796+# Copyright (C) 2005-2010 Participatory Culture Foundation
1797 #
1798 # This program is free software; you can redistribute it and/or modify
1799 # it under the terms of the GNU General Public License as published by
1800
1801=== modified file 'platform/gtk-x11/plat/onetime.py'
1802--- platform/gtk-x11/plat/onetime.py 2009-02-11 01:32:44 +0000
1803+++ platform/gtk-x11/plat/onetime.py 2010-04-14 21:08:30 +0000
1804@@ -1,5 +1,5 @@
1805 # Miro - an RSS based video player application
1806-# Copyright (C) 2005-2009 Participatory Culture Foundation
1807+# Copyright (C) 2005-2010 Participatory Culture Foundation
1808 #
1809 # This program is free software; you can redistribute it and/or modify
1810 # it under the terms of the GNU General Public License as published by
1811@@ -28,122 +28,32 @@
1812
1813 import dbus
1814 import dbus.service
1815+import dbus.glib
1816+from dbus.service import BusName
1817
1818 from miro import messages
1819
1820-if getattr(dbus, 'version', (0, 0, 0)) >= (0, 41, 0):
1821- import dbus.glib
1822-
1823-# We do this crazy stuff so that Miro can run on platforms that have the
1824-# older dbus-python bindings. Dapper uses (0, 51, 0). I think once we
1825-# stop supporting Dapper, we can rip this whole section out.
1826-# This section was re-written so that it doesn't trigger the dbus-python
1827-# deprecation warning and is localized so we can just delete it and
1828-# move on with our lives when the time comes. - willkahn-greene10-29-2007
1829-
1830-# (0, 80, 0) is the first version that has do_not_queue
1831-if getattr(dbus, 'version', (0, 0, 0)) >= (0, 80, 0):
1832- BusName = dbus.service.BusName
1833- NameExistsException = dbus.NameExistsException
1834-
1835-else:
1836- import dbus.dbus_bindings
1837-
1838- class NameExistsException(dbus.DBusException):
1839- pass
1840-
1841- # these are in the dbus spec, so they're not going to change.
1842- REQUEST_NAME_REPLY_PRIMARY_OWNER = 1
1843- REQUEST_NAME_REPLY_IN_QUEUE = 2
1844- REQUEST_NAME_REPLY_EXISTS = 3
1845- REQUEST_NAME_REPLY_ALREADY_OWNER = 4
1846- NAME_FLAG_DO_NOT_QUEUE = 4
1847-
1848- class BusNameFlags(object):
1849- """A base class for exporting your own Named Services across the Bus
1850- """
1851- def __new__(cls, name, bus=None, flags=0, do_not_queue=False):
1852- if do_not_queue:
1853- flags = flags | NAME_FLAG_DO_NOT_QUEUE
1854-
1855- # get default bus
1856- if bus == None:
1857- bus = dbus.Bus()
1858-
1859- # otherwise register the name
1860- conn = bus.get_connection()
1861- retval = dbus.dbus_bindings.bus_request_name(conn, name, flags)
1862-
1863- # TODO: more intelligent tracking of bus name states?
1864- if retval == REQUEST_NAME_REPLY_PRIMARY_OWNER:
1865- pass
1866- elif retval == REQUEST_NAME_REPLY_IN_QUEUE:
1867- # queueing can happen by default, maybe we should
1868- # track this better or let the user know if they're
1869- # queued or not?
1870- pass
1871- elif retval == REQUEST_NAME_REPLY_EXISTS:
1872- raise NameExistsException(name)
1873- elif retval == REQUEST_NAME_REPLY_ALREADY_OWNER:
1874- # if this is a shared bus which is being used by someone
1875- # else in this process, this can happen legitimately
1876- pass
1877- else:
1878- raise RuntimeError('requesting bus name %s returned unexpected value %s' % (name, retval))
1879-
1880- # and create the object
1881- bus_name = object.__new__(cls)
1882- bus_name._bus = bus
1883- bus_name._name = name
1884- bus_name._conn = conn
1885-
1886- return bus_name
1887-
1888- # do nothing because this is called whether or not the bus name
1889- # object was retrieved from the cache or created new
1890- def __init__(self, *args, **keywords):
1891- pass
1892-
1893- # we can delete the low-level name here because these objects
1894- # are guaranteed to exist only once for each bus name
1895- def __del__(self):
1896- dbus.dbus_bindings.bus_release_name(self._bus.get_connection(), self._name)
1897-
1898- def get_bus(self):
1899- """Get the Bus this Service is on"""
1900- return self._bus
1901-
1902- def get_name(self):
1903- """Get the name of this service"""
1904- return self._name
1905-
1906- def get_connection(self):
1907- """Get the connection for this service"""
1908- return self._conn
1909-
1910- def __repr__(self):
1911- return '<dbus.service.BusName %s on %r at %#x>' % (self._name, self._bus, id(self))
1912- __str__ = __repr__
1913-
1914- BusName = BusNameFlags
1915-
1916 class OneTime(dbus.service.Object):
1917- """This makes sure we've only got one instance of Miro running at any given
1918- time.
1919+ """This makes sure we've only got one instance of Miro running at
1920+ any given time.
1921 """
1922 def __init__(self):
1923 bus = dbus.SessionBus()
1924- bus_name = BusName('org.participatoryculture.dtv.onetime', bus=bus, do_not_queue=True)
1925- dbus.service.Object.__init__(self, bus_name=bus_name,
1926- object_path='/org/participatoryculture/dtv/OneTime')
1927+ bus_name = BusName('org.participatoryculture.dtv.onetime',
1928+ bus=bus, do_not_queue=True)
1929+ dbus.service.Object.__init__(
1930+ self, bus_name=bus_name,
1931+ object_path='/org/participatoryculture/dtv/OneTime')
1932
1933- @dbus.service.method('org.participatoryculture.dtv.OneTimeIface')
1934+ @dbus.service.method(
1935+ dbus_interface='org.participatoryculture.dtv.OneTimeIFace',
1936+ in_signature='as')
1937 def handle_args(self, args):
1938 from miro import singleclick
1939 from miro import eventloop
1940- for i in xrange(len(args)):
1941- args[i] = args[i].encode('latin1')
1942- if args[i].startswith('file://'):
1943- args[i] = args[i][len('file://'):]
1944+ for i, arg in enumerate(args):
1945+ args[i] = arg.encode('latin1')
1946+ if arg.startswith('file://'):
1947+ args[i] = arg[len('file://'):]
1948
1949 messages.OpenIndividualFiles(args).send_to_backend()
1950
1951=== modified file 'platform/gtk-x11/plat/options.py'
1952--- platform/gtk-x11/plat/options.py 2009-10-25 00:24:34 +0000
1953+++ platform/gtk-x11/plat/options.py 2010-04-14 21:08:30 +0000
1954@@ -1,5 +1,5 @@
1955 # Miro - an RSS based video player application
1956-# Copyright (C) 2005-2009 Participatory Culture Foundation
1957+# Copyright (C) 2005-2010 Participatory Culture Foundation
1958 #
1959 # This program is free software; you can redistribute it and/or modify
1960 # it under the terms of the GNU General Public License as published by
1961@@ -48,17 +48,7 @@
1962 USE_RENDERER = GTKPref(key="useRenderer",
1963 default=u"gstreamer",
1964 alias="renderer",
1965- help="Which renderer to use. (gstreamer, xine)" )
1966-
1967-USE_XINE_XV_HACK = GTKPref(key="UseXineXVHack",
1968- default=True,
1969- alias="xine-xvhack",
1970- help="Whether or not to use the Xine xv hack. (true, false)" )
1971-
1972-XINE_DRIVER = GTKPref(key="DefaultXineDriver",
1973- default="xv",
1974- alias="xine-driver",
1975- help="Which Xine driver to use for video. (auto, xv, xshm)" )
1976+ help="Which renderer to use. (gstreamer, ...)" )
1977
1978 GSTREAMER_IMAGESINK = GTKPref(key="DefaultGstreamerImagesink",
1979 default="gconfvideosink",
1980
1981=== modified file 'platform/gtk-x11/plat/renderers/__init__.py'
1982--- platform/gtk-x11/plat/renderers/__init__.py 2009-10-25 00:24:34 +0000
1983+++ platform/gtk-x11/plat/renderers/__init__.py 2010-04-14 21:08:30 +0000
1984@@ -1,5 +1,5 @@
1985 # Miro - an RSS based video player application
1986-# Copyright (C) 2005-2009 Participatory Culture Foundation
1987+# Copyright (C) 2005-2010 Participatory Culture Foundation
1988 #
1989 # This program is free software; you can redistribute it and/or modify
1990 # it under the terms of the GNU General Public License as published by
1991@@ -30,11 +30,21 @@
1992
1993 import logging
1994 import traceback
1995+import os
1996+import os.path
1997
1998 from miro import app
1999 from miro import config
2000 from miro.plat import options
2001
2002+def get_renderer_list():
2003+ d = os.path.dirname(__file__)
2004+ contents = os.listdir(d)
2005+ # FIXME - this sucks. switch this to use extensions.
2006+ contents = [m for m in contents if m.endswith("renderer.py")]
2007+ contents = [m[:-11] for m in contents]
2008+ return contents
2009+
2010 def set_renderer(modname):
2011 """Attempt to set the video renderer."""
2012
2013@@ -47,7 +57,7 @@
2014 app.movie_data_program_info = module.movie_data_program_info
2015 app.get_item_type = module.get_item_type
2016 logging.info("set_renderer: successfully loaded %s", modname)
2017- except:
2018+ except StandardError:
2019 logging.info("set_renderer: couldn't load %s: %s", modname,
2020 traceback.format_exc())
2021 raise
2022@@ -66,14 +76,14 @@
2023 try:
2024 set_renderer("%srenderer" % r)
2025 return
2026- except:
2027+ except StandardError:
2028 logging.exception("init_renderer: error detected... trying to use gstreamerrenderer")
2029
2030 try:
2031 # try to add the gstreamer renderer if the preferences aren't right
2032 set_renderer("gstreamerrenderer")
2033 return
2034- except:
2035+ except StandardError:
2036 logging.exception("init_renderer: no valid renderer has been loaded")
2037 app.audio_renderer = None
2038 app.video_renderer = None
2039
2040=== modified file 'platform/gtk-x11/plat/renderers/gst_extractor.py'
2041--- platform/gtk-x11/plat/renderers/gst_extractor.py 2009-02-11 01:32:44 +0000
2042+++ platform/gtk-x11/plat/renderers/gst_extractor.py 2010-04-14 21:08:30 +0000
2043@@ -1,5 +1,5 @@
2044 # Miro - an RSS based video player application
2045-# Copyright (C) 2005-2009 Participatory Culture Foundation
2046+# Copyright (C) 2005-2010 Participatory Culture Foundation
2047 #
2048 # This program is free software; you can redistribute it and/or modify
2049 # it under the terms of the GNU General Public License as published by
2050@@ -39,7 +39,6 @@
2051
2052 class Extractor:
2053 def __init__(self, filename, thumbnail_filename, callback):
2054-# print "__init__(%s, %s, %s)" % (filename, thumbnail_filename, callback)
2055 self.thumbnail_filename = thumbnail_filename
2056 self.filename = filename
2057 self.callback = callback
2058@@ -50,95 +49,157 @@
2059 self.duration = -1
2060 self.buffer_probes = {}
2061 self.audio_only = False
2062-
2063- self.pipeline = gst.parse_launch('filesrc location="%s" ! decodebin ! ffmpegcolorspace ! video/x-raw-rgb,depth=24,bpp=24 ! fakesink signal-handoffs=True' % (filename,))
2064-
2065- for sink in self.pipeline.sinks():
2066+ self.saw_video_tag = self.saw_audio_tag = False
2067+
2068+ self.pipeline = gst.element_factory_make('playbin')
2069+ self.videosink = gst.element_factory_make("fakesink", "videosink")
2070+ self.pipeline.set_property("video-sink", self.videosink)
2071+ self.audiosink = gst.element_factory_make("fakesink", "audiosink")
2072+ self.pipeline.set_property("audio-sink", self.audiosink)
2073+
2074+ self.thumbnail_pipeline = None
2075+
2076+ self.bus = self.pipeline.get_bus()
2077+ self.bus.add_signal_watch()
2078+ self.watch_id = self.bus.connect("message", self.on_bus_message)
2079+
2080+ self.pipeline.set_property("uri", "file://%s" % filename)
2081+ self.pipeline.set_state(gst.STATE_PAUSED)
2082+
2083+ def on_bus_message(self, bus, message):
2084+ if message.src == self.pipeline:
2085+ if message.type == gst.MESSAGE_STATE_CHANGED:
2086+ prev, new, pending = message.parse_state_changed()
2087+ if new == gst.STATE_PAUSED:
2088+ gobject.idle_add(self.paused_reached)
2089+
2090+ elif message.type == gst.MESSAGE_ERROR:
2091+ gobject.idle_add(self.error_occurred)
2092+
2093+ elif message.src == self.thumbnail_pipeline:
2094+ if message.type == gst.MESSAGE_STATE_CHANGED:
2095+ prev, new, pending = message.parse_state_changed()
2096+ if new == gst.STATE_PAUSED:
2097+ seek_result = self.thumbnail_pipeline.seek(
2098+ 1.0, gst.FORMAT_TIME,
2099+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
2100+ gst.SEEK_TYPE_SET, self.duration / 2,
2101+ gst.SEEK_TYPE_NONE, 0)
2102+ if not seek_result:
2103+ self.disconnect()
2104+ self.done()
2105+
2106+ elif message.type == gst.MESSAGE_ERROR:
2107+ gobject.idle_add(self.error_occurred)
2108+
2109+ def done(self):
2110+ if self.saw_video_tag:
2111+ media_type = 'video'
2112+ elif self.saw_audio_tag:
2113+ media_type = 'audio'
2114+ else:
2115+ media_type = 'other'
2116+ self.callback(self.duration, self.success, media_type)
2117+
2118+ def get_duration(self, pipeline, attempts=0):
2119+ if attempts == 5:
2120+ return 0
2121+ try:
2122+ return pipeline.query_duration(gst.FORMAT_TIME)[0]
2123+ except gst.QueryError:
2124+ return self.get_duration(pipeline, attempts + 1)
2125+
2126+ def paused_reached(self):
2127+ self.saw_video_tag = False
2128+ self.saw_audio_tag = False
2129+
2130+ if not self.first_pause:
2131+ return False
2132+
2133+ self.first_pause = True
2134+ current_video = self.pipeline.get_property("current-video")
2135+ current_audio = self.pipeline.get_property("current-audio")
2136+
2137+ if current_video == 0:
2138+ self.saw_video_tag = True
2139+ if current_audio == 0:
2140+ self.saw_audio_tag = True
2141+
2142+ if self.saw_video_tag == False and self.saw_audio_tag == True:
2143+ self.audio_only = True
2144+ self.duration = self.get_duration(self.pipeline)
2145+ self.success = True
2146+ self.disconnect()
2147+ self.done()
2148+ return False
2149+
2150+ if self.saw_video_tag == False and self.saw_audio_tag == False:
2151+ self.audio_only = False
2152+ self.disconnect()
2153+ self.done()
2154+ return False
2155+
2156+ self.duration = self.get_duration(self.pipeline)
2157+ self.grabit = True
2158+ self.buffer_probes = {}
2159+
2160+ self.thumbnail_pipeline = gst.parse_launch(
2161+ 'filesrc location="%s" ! decodebin ! '
2162+ 'ffmpegcolorspace ! video/x-raw-rgb,depth=24,bpp=24 ! '
2163+ 'fakesink signal-handoffs=True' % self.filename)
2164+
2165+ for sink in self.thumbnail_pipeline.sinks():
2166 name = sink.get_name()
2167 factoryname = sink.get_factory().get_name()
2168 if factoryname == "fakesink":
2169 pad = sink.get_pad("sink")
2170- self.buffer_probes[name] = pad.add_buffer_probe(self.buffer_probe_handler, name)
2171-
2172- self.bus = self.pipeline.get_bus()
2173- self.bus.add_signal_watch()
2174- self.watch_id = self.bus.connect("message", self.on_bus_message)
2175-
2176- self.pipeline.set_state(gst.STATE_PAUSED)
2177-
2178- def start_audio_only(self):
2179- self.audio_only = True
2180-
2181- self.pipeline = gst.parse_launch('filesrc location="%s" ! decodebin ! fakesink' % (self.filename,))
2182-
2183- self.bus = self.pipeline.get_bus()
2184- self.bus.add_signal_watch()
2185- self.watch_id = self.bus.connect("message", self.on_bus_message)
2186-
2187- self.pipeline.set_state(gst.STATE_PAUSED)
2188-
2189- def done (self):
2190-# print "done()"
2191- self.callback(self.duration, self.success)
2192-
2193- def paused_reached(self):
2194-# print "paused_reached()"
2195- if self.audio_only:
2196- self.duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]
2197- self.success = True
2198- self.disconnect()
2199- self.done()
2200- if self.first_pause:
2201- self.duration = self.pipeline.query_duration(gst.FORMAT_TIME)[0]
2202- self.grabit = True
2203- seek_result = self.pipeline.seek(1.0,
2204- gst.FORMAT_TIME,
2205- gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
2206- gst.SEEK_TYPE_SET,
2207- self.duration / 2,
2208- gst.SEEK_TYPE_NONE, 0)
2209- if not seek_result:
2210- self.disconnect()
2211- self.done()
2212- self.first_pause = False
2213+ self.buffer_probes[name] = pad.add_buffer_probe(
2214+ self.buffer_probe_handler, name)
2215+
2216+ self.thumbnail_bus = self.thumbnail_pipeline.get_bus()
2217+ self.thumbnail_bus.add_signal_watch()
2218+ self.thumbnail_watch_id = self.thumbnail_bus.connect(
2219+ "message", self.on_bus_message)
2220+
2221+ self.thumbnail_pipeline.set_state(gst.STATE_PAUSED)
2222+
2223 return False
2224
2225 def error_occurred(self):
2226 self.disconnect()
2227- if self.audio_only:
2228- self.done()
2229- else:
2230- self.start_audio_only()
2231+ self.done()
2232 return False
2233
2234- def on_bus_message(self, bus, message):
2235- if message.src == self.pipeline:
2236- if message.type == gst.MESSAGE_STATE_CHANGED:
2237- prev, new, pending = message.parse_state_changed()
2238- if new == gst.STATE_PAUSED:
2239- gobject.idle_add(self.paused_reached)
2240- if message.type == gst.MESSAGE_ERROR:
2241- gobject.idle_add(self.error_occurred)
2242-
2243 def buffer_probe_handler_real(self, pad, buff, name):
2244- """Capture buffers as gdk_pixbufs when told to."""
2245- if self.grabit:
2246+ """Capture buffers as gdk_pixbufs when told to.
2247+ """
2248+ try:
2249 caps = buff.caps
2250- if caps is not None:
2251- filters = caps[0]
2252- self.width = filters["width"]
2253- self.height = filters["height"]
2254- timecode = self.pipeline.query_position(gst.FORMAT_TIME)[0]
2255- pixbuf = gtk.gdk.pixbuf_new_from_data(buff.data, gtk.gdk.COLORSPACE_RGB, False, 8, self.width, self.height, self.width * 3)
2256+ if caps is None:
2257+ self.success = False
2258+ self.disconnect()
2259+ self.done()
2260+ return False
2261+
2262+ filters = caps[0]
2263+ width = filters["width"]
2264+ height = filters["height"]
2265+ timecode = self.thumbnail_pipeline.query_position(gst.FORMAT_TIME)[0]
2266+ pixbuf = gtk.gdk.pixbuf_new_from_data(
2267+ buff.data, gtk.gdk.COLORSPACE_RGB, False, 8,
2268+ width, height, width * 3)
2269 pixbuf.save(self.thumbnail_filename, "png")
2270 del pixbuf
2271 self.success = True
2272 self.disconnect()
2273 self.done()
2274+ except gst.QueryError:
2275+ pass
2276 return False
2277
2278 def buffer_probe_handler(self, pad, buff, name):
2279- gobject.idle_add(lambda: self.buffer_probe_handler_real(pad, buff, name))
2280+ gobject.idle_add(
2281+ lambda: self.buffer_probe_handler_real(pad, buff, name))
2282 return True
2283
2284 def disconnect(self):
2285@@ -153,11 +214,27 @@
2286 pad.remove_buffer_probe(self.buffer_probes[name])
2287 del self.buffer_probes[name]
2288 self.pipeline = None
2289+
2290 if self.bus is not None:
2291 self.bus.disconnect(self.watch_id)
2292 self.bus = None
2293
2294-def handle_result(duration, success):
2295+def make_verbose():
2296+ import logging
2297+ logging.basicConfig(level=logging.INFO)
2298+ def wrap_func(func):
2299+ def _wrap_func(*args, **kwargs):
2300+ logging.info("calling %s (%s) (%s)",
2301+ func.__name__, repr(args), repr(kwargs))
2302+ return func(*args, **kwargs)
2303+ return _wrap_func
2304+
2305+ for mem in dir(Extractor):
2306+ fun = Extractor.__dict__[mem]
2307+ if callable(fun):
2308+ Extractor.__dict__[mem] = wrap_func(fun)
2309+
2310+def handle_result(duration, success, media_type):
2311 if duration != -1:
2312 print "Miro-Movie-Data-Length: %s" % (duration / 1000000)
2313 else:
2314@@ -166,8 +243,21 @@
2315 print "Miro-Movie-Data-Thumbnail: Success"
2316 else:
2317 print "Miro-Movie-Data-Thumbnail: Failure"
2318+ print "Miro-Movie-Data-Type: %s" % media_type
2319 sys.exit(0)
2320
2321-extractor = Extractor(sys.argv[1], sys.argv[2], handle_result)
2322-gtk.gdk.threads_init()
2323-gtk.main()
2324+def main(argv):
2325+ if len(argv) < 3:
2326+ print "Syntax: gst_extractor.py <filename> <thumbnail>"
2327+ sys.exit(1)
2328+
2329+ if "--verbose" in argv:
2330+ make_verbose()
2331+ argv.remove("--verbose")
2332+
2333+ extractor = Extractor(argv[1], argv[2], handle_result)
2334+ gtk.gdk.threads_init()
2335+ gtk.main()
2336+
2337+if __name__ == "__main__":
2338+ main(sys.argv)
2339
2340=== modified file 'platform/gtk-x11/plat/renderers/gstreamerrenderer.py'
2341--- platform/gtk-x11/plat/renderers/gstreamerrenderer.py 2009-10-25 00:24:34 +0000
2342+++ platform/gtk-x11/plat/renderers/gstreamerrenderer.py 2010-04-14 21:08:30 +0000
2343@@ -1,5 +1,5 @@
2344 # Miro - an RSS based video player application
2345-# Copyright (C) 2005-2009 Participatory Culture Foundation
2346+# Copyright (C) 2005-2010 Participatory Culture Foundation
2347 #
2348 # This program is free software; you can redistribute it and/or modify
2349 # it under the terms of the GNU General Public License as published by
2350@@ -29,8 +29,8 @@
2351 import sys
2352 import logging
2353 import os
2354-import time
2355 import thread
2356+import shutil
2357 from threading import Event
2358
2359 import pygst
2360@@ -39,11 +39,16 @@
2361 import gst.interfaces
2362 import gtk
2363
2364+# not sure why this isn't in the gst module, but it's easy to define
2365+GST_PLAY_FLAG_TEXT = (1 << 2)
2366+
2367 from miro import app
2368 from miro import config
2369 from miro import prefs
2370-from miro.download_utils import nextFreeFilename
2371+from miro.util import gather_subtitle_files, copy_subtitle_file
2372+from miro.gtcache import gettext as _
2373 from miro.plat import options
2374+from miro import iso_639
2375
2376 from miro.frontends.widgets.gtk.threads import call_on_ui_thread
2377
2378@@ -120,69 +125,104 @@
2379 self.rate = 1.0
2380 self.select_callbacks = None
2381
2382- self.playbin = gst.element_factory_make("playbin", "player")
2383- self.bus = self.playbin.get_bus()
2384- self.bus.add_signal_watch()
2385- self.bus.enable_sync_message_emission()
2386-
2387- self.bus.connect("message::eos", self.on_bus_message)
2388- self.bus.connect("message::state-changed", self.on_bus_message)
2389- self.bus.connect("message::error", self.on_bus_message)
2390-
2391 audiosink = config.get(options.GSTREAMER_AUDIOSINK)
2392 try:
2393- self.audiosink = gst.element_factory_make(audiosink, "sink")
2394+ self.audiosink = gst.element_factory_make(audiosink, "audiosink")
2395
2396 except gst.ElementNotFoundError:
2397- logging.info("gstreamerrenderer: ElementNotFoundError '%s'" % audiosink)
2398+ logging.info("gstreamerrenderer: ElementNotFoundError '%s'",
2399+ audiosink)
2400 audiosink = "autoaudiosink"
2401- self.audiosink = gst.element_factory_make(audiosink, "sink")
2402+ self.audiosink = gst.element_factory_make(audiosink, "audiosink")
2403
2404 except Exception, e:
2405 logging.info("gstreamerrenderer: Exception thrown '%s'" % e)
2406 logging.exception("sink exception")
2407 audiosink = "alsasink"
2408- self.audiosink = gst.element_factory_make(alsasink, "sink")
2409+ self.audiosink = gst.element_factory_make(audiosink, "audiosink")
2410
2411 logging.info("GStreamer audiosink: %s", audiosink)
2412+
2413+ self.supports_subtitles = True
2414+ self.playbin = None
2415+ self.bus = None
2416+ self.watch_ids = []
2417+
2418+ def build_playbin(self):
2419+ self.playbin = gst.element_factory_make("playbin2", "player")
2420+ self.bus = self.playbin.get_bus()
2421+ self.bus.add_signal_watch()
2422+ self.bus.enable_sync_message_emission()
2423+
2424+ self.watch_ids.append(self.bus.connect("message", self.on_bus_message))
2425 self.playbin.set_property("audio-sink", self.audiosink)
2426
2427+ def destroy_playbin(self):
2428+ if self.playbin is None:
2429+ return
2430+ for watch_id in self.watch_ids:
2431+ self.bus.disconnect(watch_id)
2432+ self.watch_ids = []
2433+ self.bus = None
2434+ self.playbin = None
2435+
2436 def on_bus_message(self, bus, message):
2437 """receives message posted on the GstBus"""
2438+ if message.src is not self.playbin:
2439+ return
2440+
2441 if message.type == gst.MESSAGE_ERROR:
2442+ err, debug = message.parse_error()
2443 if self.select_callbacks is not None:
2444 self.select_callbacks[1]()
2445 self.select_callbacks = None
2446+ logging.error("on_bus_message: gstreamer error: %s", err)
2447 else:
2448 err, debug = message.parse_error()
2449 logging.error("on_bus_message: gstreamer error: %s", err)
2450 elif message.type == gst.MESSAGE_STATE_CHANGED:
2451 prev, new, pending = message.parse_state_changed()
2452- if (message.src is self.playbin and new == gst.STATE_PAUSED and
2453- self.select_callbacks is not None):
2454+ if ((new == gst.STATE_PAUSED
2455+ and self.select_callbacks is not None)):
2456 self.select_callbacks[0]()
2457 self.select_callbacks = None
2458+ self.finish_select_file()
2459 elif message.type == gst.MESSAGE_EOS:
2460 app.playback_manager.on_movie_finished()
2461
2462- def select_file(self, filename, callback, errback):
2463+ def select_file(self, iteminfo, callback, errback, sub_filename=""):
2464 """starts playing the specified file"""
2465 self.stop()
2466+ self.destroy_playbin()
2467+ self.build_playbin()
2468+ self.enabled_track = None
2469+
2470+ self.iteminfo = iteminfo
2471+
2472 self.select_callbacks = (callback, errback)
2473- self.playbin.set_property("uri", "file://%s" % filename)
2474+ self.playbin.set_property("uri", "file://%s" % iteminfo.video_path)
2475+ if sub_filename:
2476+ self.playbin.set_property("suburi", "file://%s" % sub_filename)
2477+ else:
2478+ self.playbin.set_property("suburi", None)
2479 self.playbin.set_state(gst.STATE_PAUSED)
2480
2481- def get_current_time(self):
2482+ def finish_select_file(self):
2483+ pass
2484+
2485+ def get_current_time(self, attempt=0):
2486+ # query_position fails periodically, so this attempts it 5 times
2487+ # and if after that it fails, then we return 0.
2488+ if attempt == 5:
2489+ return 0
2490 try:
2491- position, format = self.playbin.query_position(gst.FORMAT_TIME)
2492+ position, fmt = self.playbin.query_position(gst.FORMAT_TIME)
2493 return to_seconds(position)
2494- except Exception, e:
2495- logging.warn("get_current_time: caught exception: %s" % e)
2496- return None
2497+ except gst.QueryError, qe:
2498+ logging.warn("get_current_time: caught exception: %s" % qe)
2499+ return self.get_current_time(attempt + 1)
2500
2501 def _seek(self, seconds):
2502- # FIXME - switch to self.playbin.seek_simple ?
2503- # self.player.seek_simple(self.time_format, gst.SEEK_FLAG_FLUSH, seek_ns)
2504 event = gst.event_new_seek(1.0,
2505 gst.FORMAT_TIME,
2506 gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
2507@@ -192,30 +232,36 @@
2508 if not result:
2509 logging.error("seek failed")
2510
2511- def _on_state_changed(self, bus, message, seconds):
2512- if self.playbin.get_state(0)[1] in (gst.STATE_PAUSED, gst.STATE_PLAYING):
2513+ def _set_current_time_actual(self, bus, message, seconds):
2514+ if self.playbin.get_state(0)[1] in (gst.STATE_PAUSED,
2515+ gst.STATE_PLAYING):
2516 self._seek(seconds)
2517- self.bus.disconnect(self._on_state_changed_id)
2518+ self.bus.disconnect(self._set_current_time_actual_id)
2519
2520 def set_current_time(self, seconds):
2521 # only want to kick these off when PAUSED or PLAYING
2522- if self.playbin.get_state(0)[1] not in (gst.STATE_PAUSED, gst.STATE_PLAYING):
2523- self._on_state_changed_id = self.bus.connect("message::state-changed",
2524- self._on_state_changed, seconds)
2525+ if self.playbin.get_state(0)[1] not in (gst.STATE_PAUSED,
2526+ gst.STATE_PLAYING):
2527+ self._set_current_time_actual_id = self.bus.connect(
2528+ "message::state-changed",
2529+ self._set_current_time_actual,
2530+ seconds)
2531 return
2532
2533 self._seek(seconds)
2534
2535 def get_duration(self):
2536 try:
2537- duration, format = self.playbin.query_duration(gst.FORMAT_TIME)
2538+ duration, fmt = self.playbin.query_duration(gst.FORMAT_TIME)
2539 return to_seconds(duration)
2540- except Exception, e:
2541- logging.warn("get_duration: caught exception: %s" % e)
2542+ except gst.QueryError, qe:
2543+ logging.warn("get_duration: caught exception: %s" % qe)
2544 return None
2545
2546 def reset(self):
2547- self.playbin.set_state(gst.STATE_NULL)
2548+ if self.playbin:
2549+ self.playbin.set_state(gst.STATE_NULL)
2550+ self.destroy_playbin()
2551
2552 def set_volume(self, level):
2553 self.playbin.set_property("volume", level)
2554@@ -227,7 +273,9 @@
2555 self.playbin.set_state(gst.STATE_PAUSED)
2556
2557 def stop(self):
2558- self.playbin.set_state(gst.STATE_NULL)
2559+ if self.playbin:
2560+ self.playbin.set_state(gst.STATE_NULL)
2561+ self.destroy_playbin()
2562
2563 def get_rate(self):
2564 return 256
2565@@ -238,46 +286,62 @@
2566 self.rate = rate
2567 position = self.playbin.query_position(gst.FORMAT_TIME, None)[0]
2568 if rate >= 0:
2569- self.playbin.seek(rate,
2570- gst.FORMAT_TIME,
2571- gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
2572- gst.SEEK_TYPE_SET,
2573- position + (rate * gst.SECOND),
2574- gst.SEEK_TYPE_SET,
2575- -1)
2576+ self.playbin.seek(rate,
2577+ gst.FORMAT_TIME,
2578+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
2579+ gst.SEEK_TYPE_SET,
2580+ position + (rate * gst.SECOND),
2581+ gst.SEEK_TYPE_SET,
2582+ -1)
2583 else:
2584 self.playbin.seek(rate,
2585- gst.FORMAT_TIME,
2586- gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
2587- gst.SEEK_TYPE_SET,
2588- 0,
2589- gst.SEEK_TYPE_SET,
2590- position + (rate * gst.SECOND))
2591+ gst.FORMAT_TIME,
2592+ gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_KEY_UNIT,
2593+ gst.SEEK_TYPE_SET,
2594+ 0,
2595+ gst.SEEK_TYPE_SET,
2596+ position + (rate * gst.SECOND))
2597+
2598+class AudioRenderer(Renderer):
2599+ pass
2600
2601 class VideoRenderer(Renderer):
2602 def __init__(self):
2603 Renderer.__init__(self)
2604- logging.info("GStreamer version: %s", gst.version_string())
2605-
2606- self.bus.connect('sync-message::element', self.on_sync_message)
2607
2608 videosink = config.get(options.GSTREAMER_IMAGESINK)
2609 try:
2610- self.sink = gst.element_factory_make(videosink, "sink")
2611+ self.videosink = gst.element_factory_make(videosink, "videosink")
2612
2613 except gst.ElementNotFoundError:
2614- logging.info("gstreamerrenderer: ElementNotFoundError '%s'" % videosink)
2615- videosink = "ximagesink"
2616- self.sink = gst.element_factory_make(videosink, "sink")
2617+ logging.info("gstreamerrenderer: ElementNotFoundError '%s'",
2618+ videosink)
2619+ videosink = "xvimagesink"
2620+ self.videosink = gst.element_factory_make(videosink, "videosink")
2621
2622 except Exception, e:
2623 logging.info("gstreamerrenderer: Exception thrown '%s'" % e)
2624 logging.exception("sink exception")
2625 videosink = "ximagesink"
2626- self.sink = gst.element_factory_make(videosink, "sink")
2627+ self.videosink = gst.element_factory_make(videosink, "videosink")
2628
2629 logging.info("GStreamer videosink: %s", videosink)
2630- self.playbin.set_property("video-sink", self.sink)
2631+ self.textsink = gst.element_factory_make("textoverlay", "textsink")
2632+
2633+ def build_playbin(self):
2634+ Renderer.build_playbin(self)
2635+ self.watch_ids.append(self.bus.connect('sync-message::element', self.on_sync_message))
2636+ self.playbin.set_property("video-sink", self.videosink)
2637+ try:
2638+ self.playbin.set_property("text-sink", self.textsink)
2639+ except TypeError:
2640+ logging.warning("this platform has an old version of playbin2--no subtitle support.")
2641+ self.supports_subtitles = False
2642+
2643+ def select_file(self, filename, callback, errback, sub_filename=""):
2644+ Renderer.select_file(self, filename, callback, errback, sub_filename)
2645+ if sub_filename != "" and self.supports_subtitles:
2646+ self.pick_subtitle_track = 0
2647
2648 def on_sync_message(self, bus, message):
2649 if message.structure is None:
2650@@ -296,11 +360,12 @@
2651 self.gc.foreground = gtk.gdk.color_parse("black")
2652
2653 def on_destroy(self, widget):
2654- self.playbin.set_state(gst.STATE_NULL)
2655+ if self.playbin:
2656+ self.playbin.set_state(gst.STATE_NULL)
2657
2658 def on_expose(self, widget, event):
2659- if self.sink and hasattr(self.sink, "expose"):
2660- self.sink.expose()
2661+ if self.videosink and hasattr(self.videosink, "expose"):
2662+ self.videosink.expose()
2663 else:
2664 # if we had an image to show, we could do so here... that image
2665 # would show for audio-only items.
2666@@ -319,11 +384,157 @@
2667 """Handle when the video window exits fullscreen mode."""
2668 logging.debug("haven't implemented exit_fullscreen method yet!")
2669
2670-class AudioRenderer(Renderer):
2671- pass
2672-
2673+ def finish_select_file(self):
2674+ Renderer.finish_select_file(self)
2675+ if hasattr(self, "pick_subtitle_track") and self.supports_subtitles:
2676+ flags = self.playbin.get_property('flags')
2677+ self.playbin.set_properties(flags=flags | GST_PLAY_FLAG_TEXT,
2678+ current_text=0)
2679+ del self.__dict__["pick_subtitle_track"]
2680+ return
2681+
2682+ if config.get(prefs.ENABLE_SUBTITLES) and self.supports_subtitles:
2683+ default_track = self.get_enabled_subtitle_track()
2684+ if default_track is None:
2685+ tracks = self.get_subtitle_tracks()
2686+ if len(tracks) > 0:
2687+ self.enable_subtitle_track(0)
2688+
2689+ def _get_subtitle_track_name(self, index):
2690+ """Returns the language for the track at the specified index.
2691+ """
2692+ if not self.supports_subtitles:
2693+ return None
2694+ tag_list = self.playbin.emit("get-text-tags", index)
2695+ lang = None
2696+ if tag_list is not None and gst.TAG_LANGUAGE_CODE in tag_list:
2697+ code = tag_list[gst.TAG_LANGUAGE_CODE]
2698+ lang = iso_639.find(code)
2699+ if lang is None:
2700+ return None
2701+ else:
2702+ return lang['name']
2703+
2704+ def _get_subtitle_file_name(self, filename):
2705+ """Returns the language for the file at the specified
2706+ filename.
2707+ """
2708+ if not self.supports_subtitles:
2709+ return None
2710+ basename, ext = os.path.splitext(filename)
2711+ movie_file, code = os.path.splitext(basename)
2712+
2713+ # if the filename is like "foo.srt" and "srt", then there
2714+ # is no language code, so we return None
2715+ if not code:
2716+ return None
2717+
2718+ # remove . in the code so we end up with what's probably
2719+ # a two or three letter language code
2720+ if "." in code:
2721+ code = code.replace(".", "")
2722+
2723+ lang = iso_639.find(code)
2724+ if lang is None:
2725+ return None
2726+ else:
2727+ return lang['name']
2728+
2729+ def get_subtitles(self):
2730+ """Returns a dict of index -> (language, filename) for available
2731+ tracks.
2732+ """
2733+ if not self.playbin or not self.supports_subtitles:
2734+ return {}
2735+
2736+ tracks = {}
2737+
2738+ for track_index in range(self.playbin.get_property("n-text")):
2739+ track_name = self._get_subtitle_track_name(track_index)
2740+ if track_name is None:
2741+ track_name = _("Track %(tracknumber)d",
2742+ {"tracknumber": track_index})
2743+ tracks[track_index] = (track_name, None)
2744+
2745+ files = gather_subtitle_files(self.iteminfo.video_path)
2746+
2747+ external_track_id = 100
2748+ for i, mem in enumerate(files):
2749+ track_name = self._get_subtitle_file_name(mem)
2750+ if track_name is None:
2751+ track_name = _("Subtitle file %(tracknumber)d",
2752+ {"tracknumber": i})
2753+ tracks[external_track_id + i] = (track_name, mem)
2754+
2755+ return tracks
2756+
2757+ def get_subtitle_tracks(self):
2758+ """Returns a 2-tuple of (index, language) for available
2759+ tracks.
2760+ """
2761+ if not self.supports_subtitles:
2762+ return []
2763+ tracks = [(index, filename)
2764+ for index, (filename, language) in self.get_subtitles().items()]
2765+ return tracks
2766+
2767+ def get_enabled_subtitle_track(self):
2768+ if not self.supports_subtitles:
2769+ return None
2770+ if self.enabled_track is not None:
2771+ return self.enabled_track
2772+ return self.playbin.get_property("current-text")
2773+
2774+ def enable_subtitle_track(self, track_index):
2775+ if not self.supports_subtitles:
2776+ return
2777+ tracks = self.get_subtitles()
2778+ if tracks.get(track_index) is None:
2779+ return
2780+
2781+ language, filename = tracks[track_index]
2782+
2783+ if filename is not None:
2784+ # file-based subtitle tracks have to get selected as files
2785+ # first, then enable_subtitle_track gets called again with
2786+ # the new track_index
2787+ pos = self.get_current_time()
2788+
2789+ # note: select_success needs to mirror what playback
2790+ # manager does
2791+ def select_success():
2792+ self.set_current_time(pos)
2793+ self.play()
2794+
2795+ self.select_subtitle_file(self.iteminfo, filename, select_success)
2796+ self.enabled_track = track_index
2797+ return
2798+ flags = self.playbin.get_property('flags')
2799+ self.playbin.set_properties(flags=flags | GST_PLAY_FLAG_TEXT,
2800+ current_text=track_index)
2801+
2802+ def disable_subtitles(self):
2803+ if not self.supports_subtitles:
2804+ return
2805+ flags = self.playbin.get_property('flags')
2806+ self.playbin.set_property('flags', flags & ~GST_PLAY_FLAG_TEXT)
2807+
2808+ def select_subtitle_file(self, iteminfo, sub_path,
2809+ handle_successful_select):
2810+ if not self.supports_subtitles:
2811+ return
2812+ def handle_ok():
2813+ handle_successful_select()
2814+ def handle_err():
2815+ app.playback_manager.stop()
2816+ filenames = [filename for lang, filename in self.get_subtitles().values()]
2817+ if sub_path not in filenames:
2818+ sub_path = copy_subtitle_file(sub_path, iteminfo.video_path)
2819+ self.select_file(iteminfo, handle_ok, handle_err, sub_path)
2820+
2821 def movie_data_program_info(movie_path, thumbnail_path):
2822- extractor_path = os.path.join(os.path.split(__file__)[0], "gst_extractor.py")
2823+ extractor_path = os.path.join(os.path.split(__file__)[0],
2824+ "gst_extractor.py")
2825 return ((sys.executable, extractor_path, movie_path, thumbnail_path), None)
2826
2827 def get_item_type(item_info, success_callback, error_callback):
2828
2829=== removed file 'platform/gtk-x11/plat/renderers/xinerenderer.py'
2830--- platform/gtk-x11/plat/renderers/xinerenderer.py 2009-10-25 00:24:34 +0000
2831+++ platform/gtk-x11/plat/renderers/xinerenderer.py 1970-01-01 00:00:00 +0000
2832@@ -1,268 +0,0 @@
2833-# Miro - an RSS based video player application
2834-# Copyright (C) 2005-2009 Participatory Culture Foundation
2835-#
2836-# This program is free software; you can redistribute it and/or modify
2837-# it under the terms of the GNU General Public License as published by
2838-# the Free Software Foundation; either version 2 of the License, or
2839-# (at your option) any later version.
2840-#
2841-# This program is distributed in the hope that it will be useful,
2842-# but WITHOUT ANY WARRANTY; without even the implied warranty of
2843-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2844-# GNU General Public License for more details.
2845-#
2846-# You should have received a copy of the GNU General Public License
2847-# along with this program; if not, write to the Free Software
2848-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2849-#
2850-# In addition, as a special exception, the copyright holders give
2851-# permission to link the code of portions of this program with the OpenSSL
2852-# library.
2853-#
2854-# You must obey the GNU General Public License in all respects for all of
2855-# the code used other than OpenSSL. If you modify file(s) with this
2856-# exception, you may extend this exception to your version of the file(s),
2857-# but you are not obligated to do so. If you do not wish to do so, delete
2858-# this exception statement from your version. If you delete this exception
2859-# statement from all source files in the program, then also delete it here.
2860-
2861-import os.path
2862-import logging
2863-
2864-import gtk
2865-import gobject
2866-
2867-from miro import app
2868-from miro import config
2869-from miro import xine
2870-from miro.plat import options
2871-from miro.plat import resources
2872-from miro.plat.frontends.widgets import threads
2873-
2874-class Sniffer:
2875- def __init__(self):
2876- self.xine = xine.Xine()
2877- self.xine.setup_sniffer()
2878-
2879- def get_item_type(self, filename):
2880- return self.xine.get_type(filename)
2881-
2882-class Renderer:
2883- def __init__(self):
2884- logging.info("Xine version: %s", xine.getXineVersion())
2885- self.xine = xine.Xine()
2886- self._playing = False
2887- self._volume = 0
2888- self.xine.set_eos_callback(self.on_eos)
2889-
2890- def on_eos(self):
2891- # on_eos gets called by one of the xine threads, so we want to switch
2892- # to the ui thread to do things.
2893- threads.call_on_ui_thread(app.playback_manager.on_movie_finished)
2894-
2895- def select_file(self, filename, success_callback, error_callback):
2896- logging.error("Not implemented.")
2897-
2898- def get_progress(self):
2899- try:
2900- pos, length = self.xine.get_position_and_length()
2901- except (SystemExit, KeyboardInterrupt):
2902- raise
2903- except:
2904- logging.warn("get_current_time: caught exception: %s" % e)
2905- return None
2906-
2907- def get_current_time(self):
2908- try:
2909- pos, length = self.xine.get_position_and_length()
2910- return pos / 1000.0
2911- except Exception, e:
2912- logging.warn("get_current_time: caught exception: %s" % e)
2913- return None
2914-
2915- def set_current_time(self, seconds):
2916- self.seek(seconds)
2917-
2918- def seek(self, seconds):
2919- # this is really funky. what's going on here is that xine-lib doesn't
2920- # provide a way to seek while paused. if you seek, then it induces
2921- # playing, but that's not what we want.
2922- # so we do this sneaky thing where if we're paused, we shut the volume
2923- # off, seek, pause, and turn the volume back on. that allows us to
2924- # seek, remain paused, and doesn't cause a hiccup in sound.
2925-
2926- if self._playing:
2927- self.xine.seek(int(seconds * 1000))
2928-
2929- else:
2930- self._playing = True
2931- self.xine.set_volume(0)
2932- self.xine.seek(int(seconds * 1000))
2933- self.pause()
2934- self.set_volume(self._volume)
2935-
2936- def get_duration(self):
2937- try:
2938- pos, length = self.xine.get_position_and_length()
2939- return length / 1000.0
2940- except (SystemExit, KeyboardInterrupt):
2941- raise
2942- except:
2943- logging.exception("get_duration: caught exception")
2944-
2945- def set_volume(self, level):
2946- self._volume = level
2947- self.xine.set_volume(int(level * 100))
2948-
2949- def play(self):
2950- self.xine.play()
2951- self._playing = True
2952-
2953- def pause(self):
2954- if self._playing:
2955- self.xine.pause()
2956- self._playing = False
2957-
2958- stop = pause
2959- reset = pause
2960-
2961- def get_rate(self):
2962- logging.warn("get_rate not implemented for xine")
2963-
2964- def set_rate(self, rate):
2965- logging.warn("set_rate not implemented for xine")
2966-
2967-class VideoRenderer(Renderer):
2968- def __init__(self):
2969- Renderer.__init__(self)
2970- self.driver = config.get(options.XINE_DRIVER)
2971- logging.info("Xine video driver: %s", self.driver)
2972-
2973- def set_widget(self, widget):
2974- widget.connect("destroy", self.on_destroy)
2975- widget.connect("configure-event", self.on_configure_event)
2976- widget.connect("expose-event", self.on_expose_event)
2977- self.widget = widget
2978-
2979- # flush gdk output to ensure that the window we're passing to xine has
2980- # been created
2981- gtk.gdk.flush()
2982- displayName = gtk.gdk.display_get_default().get_name()
2983- self.xine.attach(displayName,
2984- widget.persistent_window.xid,
2985- self.driver,
2986- int(options.shouldSyncX),
2987- int(config.get(options.USE_XINE_XV_HACK)))
2988- self.gc = widget.persistent_window.new_gc()
2989- self.gc.foreground = gtk.gdk.color_parse("black")
2990-
2991- def on_destroy(self, widget):
2992- self.xine.detach()
2993-
2994- def on_configure_event(self, widget, event):
2995- self.xine.set_area(event.x, event.y, event.width, event.height)
2996-
2997- def on_expose_event(self, widget, event):
2998- # if we wanted to draw an image for audio-only items, this is where
2999- # we'd do it.
3000- widget.window.draw_rectangle(self.gc,
3001- True,
3002- 0, 0,
3003- widget.allocation.width,
3004- widget.allocation.height)
3005- self.xine.got_expose_event(event.area.x, event.area.y, event.area.width,
3006- event.area.height)
3007-
3008- def go_fullscreen(self):
3009- """Handle when the video window goes fullscreen."""
3010- # Sometimes xine doesn't seem to handle the expose events properly and
3011- # only thinks part of the window is exposed. To work around this we
3012- # send it a couple of fake expose events for the entire window, after
3013- # a short time delay.
3014-
3015- def fullscreen_expose_workaround():
3016- try:
3017- _, _, width, height, _ = self.widget.window.get_geometry()
3018- self.xine.got_expose_event(0, 0, width, height)
3019- except (SystemExit, KeyboardInterrupt):
3020- raise
3021- except:
3022- return True
3023- return False
3024-
3025- gobject.timeout_add(500, fullscreen_expose_workaround)
3026- gobject.timeout_add(1000, fullscreen_expose_workaround)
3027-
3028- def exit_fullscreen(self):
3029- """Handle when the video window exits fullscreen mode."""
3030- # nothing to do here
3031- pass
3032-
3033- def select_file(self, filename, success_callback, error_callback):
3034- self._filename = filename
3035- if self.xine.select_file(filename):
3036- gobject.idle_add(success_callback)
3037- def expose_workaround():
3038- try:
3039- _, _, width, height, _ = self.widget.window.get_geometry()
3040- self.xine.got_expose_event(0, 0, width, height)
3041- except (SystemExit, KeyboardInterrupt):
3042- raise
3043- except:
3044- return True
3045- return False
3046-
3047- gobject.timeout_add(500, expose_workaround)
3048- self.seek(0)
3049- else:
3050- gobject.idle_add(error_callback)
3051-
3052-class AudioRenderer(Renderer):
3053- def __init__(self):
3054- Renderer.__init__(self)
3055- self._attached = False
3056-
3057- def attach(self):
3058- if self._attached:
3059- self.detach()
3060- self.xine.attach("", 0, "none", 0, 0)
3061- self._attached = True
3062-
3063- def detach(self):
3064- self.xine.detach()
3065- self._attached = False
3066-
3067- def select_file(self, filename, success_callback, error_callback):
3068- if not self._attached:
3069- self.attach()
3070-
3071- self._filename = filename
3072- if self.xine.select_file(filename):
3073- gobject.idle_add(success_callback)
3074- self.seek(0)
3075- else:
3076- gobject.idle_add(error_callback)
3077-
3078- def on_eos(self):
3079- Renderer.on_eos(self)
3080-
3081-def movie_data_program_info(movie_path, thumbnail_path):
3082- if os.path.exists(resources.path('../../../lib/miro/xine_extractor')):
3083- path = resources.path('../../../lib/miro/xine_extractor')
3084- return ((path, movie_path, thumbnail_path), None)
3085- else:
3086- logging.error("xine_extractor cannot be found.")
3087- raise NotImplementedError()
3088-
3089-_SNIFFER = Sniffer()
3090-
3091-def get_item_type(item_info, success_callback, error_callback):
3092- item_type = _SNIFFER.get_item_type(item_info.video_path)
3093- if item_type == -1:
3094- error_callback()
3095- elif item_type == 0:
3096- success_callback("video")
3097- elif item_type == 1:
3098- success_callback("audio")
3099- else:
3100- success_callback("unplayable")
3101
3102=== modified file 'platform/gtk-x11/plat/resources.py'
3103--- platform/gtk-x11/plat/resources.py 2010-02-20 02:34:26 +0000
3104+++ platform/gtk-x11/plat/resources.py 2010-04-14 21:08:30 +0000
3105@@ -1,5 +1,5 @@
3106 # Miro - an RSS based video player application
3107-# Copyright (C) 2005-2009 Participatory Culture Foundation
3108+# Copyright (C) 2005-2010 Participatory Culture Foundation
3109 #
3110 # This program is free software; you can redistribute it and/or modify
3111 # it under the terms of the GNU General Public License as published by
3112
3113=== modified file 'platform/gtk-x11/plat/screensaver.py'
3114--- platform/gtk-x11/plat/screensaver.py 2009-10-25 00:24:34 +0000
3115+++ platform/gtk-x11/plat/screensaver.py 2010-04-14 21:08:30 +0000
3116@@ -1,5 +1,5 @@
3117 # Miro - an RSS based video player application
3118-# Copyright (C) 2005-2009 Participatory Culture Foundation
3119+# Copyright (C) 2005-2010 Participatory Culture Foundation
3120 #
3121 # This program is free software; you can redistribute it and/or modify
3122 # it under the terms of the GNU General Public License as published by
3123
3124=== modified file 'platform/gtk-x11/plat/upgrade.py'
3125--- platform/gtk-x11/plat/upgrade.py 2009-10-25 00:24:34 +0000
3126+++ platform/gtk-x11/plat/upgrade.py 2010-04-14 21:08:30 +0000
3127@@ -1,5 +1,5 @@
3128 # Miro - an RSS based video player application
3129-# Copyright (C) 2005-2009 Participatory Culture Foundation
3130+# Copyright (C) 2005-2010 Participatory Culture Foundation
3131 #
3132 # This program is free software; you can redistribute it and/or modify
3133 # it under the terms of the GNU General Public License as published by
3134
3135=== modified file 'platform/gtk-x11/plat/utils.py'
3136--- platform/gtk-x11/plat/utils.py 2009-10-25 00:24:34 +0000
3137+++ platform/gtk-x11/plat/utils.py 2010-04-14 21:08:30 +0000
3138@@ -1,5 +1,5 @@
3139 # Miro - an RSS based video player application
3140-# Copyright (C) 2005-2009 Participatory Culture Foundation
3141+# Copyright (C) 2005-2010 Participatory Culture Foundation
3142 #
3143 # This program is free software; you can redistribute it and/or modify
3144 # it under the terms of the GNU General Public License as published by
3145@@ -39,7 +39,8 @@
3146 import urllib
3147 import sys
3148 import time
3149-from miro.util import returnsUnicode, returnsBinary, checkU, checkB, call_command
3150+from miro.util import (returns_unicode, returns_binary, check_u, check_b,
3151+ call_command)
3152 import miro
3153 from miro.plat import options
3154
3155@@ -49,10 +50,8 @@
3156 # very easy.
3157 from os.path import samefile
3158
3159-
3160 # this is used in portable/gtcache.py
3161-localeInitialized = True
3162-
3163+_locale_initialized = False
3164
3165 def get_available_bytes_for_movies():
3166 """Helper method used to get the free space on the disk where downloaded
3167@@ -92,10 +91,13 @@
3168 print "ui function called from thread %s" % threading.currentThread()
3169 traceback.print_stack()
3170
3171+def locale_initialized():
3172+ return _locale_initialized
3173
3174-# gettext understands *NIX locales, so we don't have to do anything
3175-def initializeLocale():
3176- pass
3177+def initialize_locale():
3178+ # gettext understands *NIX locales, so we don't have to do anything
3179+ global _locale_initialized
3180+ _locale_initialized = True
3181
3182 def setup_logging(inDownloader=False):
3183 if inDownloader:
3184@@ -121,13 +123,13 @@
3185 logging.getLogger('').addHandler(rotater)
3186 rotater.doRollover()
3187
3188-@returnsBinary
3189+@returns_binary
3190 def utf8_to_filename(filename):
3191 if not isinstance(filename, str):
3192 raise ValueError("filename is not a str")
3193 return filename
3194
3195-@returnsBinary
3196+@returns_binary
3197 def unicodeToFilename(filename, path=None):
3198 """Takes in a unicode string representation of a filename (NOT a file
3199 path) and creates a valid byte representation of it attempting to preserve
3200@@ -136,9 +138,9 @@
3201 Note: This is not guaranteed to give the same results every time it is run,
3202 nor is it guaranteed to reverse the results of filenameToUnicode.
3203 """
3204- @returnsUnicode
3205+ @returns_unicode
3206 def shortenFilename(filename):
3207- checkU(filename)
3208+ check_u(filename)
3209 first, last = os.path.splitext(filename)
3210
3211 if first:
3212@@ -146,9 +148,9 @@
3213
3214 return unicode(last[:-1])
3215
3216- checkU(filename)
3217+ check_u(filename)
3218 if path:
3219- checkB(path)
3220+ check_b(path)
3221 else:
3222 path = os.getcwd()
3223
3224@@ -175,7 +177,7 @@
3225
3226 return new_filename
3227
3228-@returnsUnicode
3229+@returns_unicode
3230 def filenameToUnicode(filename, path=None):
3231 """Given a filename in raw bytes, return the unicode representation
3232
3233@@ -183,8 +185,8 @@
3234 not is it guaranteed to reverse the results of unicodeToFilename.
3235 """
3236 if path:
3237- checkB(path)
3238- checkB(filename)
3239+ check_b(path)
3240+ check_b(filename)
3241 try:
3242 return filename.decode(locale.getpreferredencoding())
3243 except (SystemExit, KeyboardInterrupt):
3244@@ -192,59 +194,31 @@
3245 except:
3246 return filename.decode('ascii', 'replace')
3247
3248-# Takes filename given by the OS and turn it into a FilenameType
3249-def osFilenameToFilenameType(filename):
3250- return FilenameType(filename)
3251-
3252-# Takes an array of filenames given by the OS and turn them into a FilenameTypes
3253-def osFilenamesToFilenameTypes(filenames):
3254- return [osFilenameToFilenameType(filename) for filename in filenames]
3255-
3256-# Takes a FilenameType and turn it into something the OS accepts.
3257-def filenameTypeToOSFilename(filename):
3258- return filename
3259-
3260-@returnsUnicode
3261-def makeURLSafe(s, safe='/'):
3262+@returns_unicode
3263+def make_url_safe(s, safe='/'):
3264 """Takes in a byte string or a unicode string and does the right thing
3265 to make a URL
3266 """
3267 if isinstance(s, str):
3268 # quote the byte string
3269 return urllib.quote(s, safe=safe).decode('ascii')
3270- else:
3271- try:
3272- return urllib.quote(s.encode(locale.getpreferredencoding()), safe=safe).decode('ascii')
3273- except (SystemExit, KeyboardInterrupt):
3274- raise
3275- except:
3276- return s.decode('ascii', 'replace')
3277-
3278-@returnsBinary
3279-def unmakeURLSafe(s):
3280- """Undoes makeURLSafe (assuming it was passed a filenameType)
3281+
3282+ try:
3283+ return urllib.quote(s.encode(locale.getpreferredencoding()), safe=safe).decode('ascii')
3284+ except (SystemExit, KeyboardInterrupt):
3285+ raise
3286+ except:
3287+ return s.decode('ascii', 'replace')
3288+
3289+@returns_binary
3290+def unmake_url_safe(s):
3291+ """Undoes make_url_safe (assuming it was passed a filenameType)
3292 """
3293 # unquote the byte string
3294- checkU(s)
3295+ check_u(s)
3296 return urllib.unquote(s.encode('ascii'))
3297
3298-_convert_path_cache = None
3299-
3300-@returnsBinary
3301-def findConvert():
3302- global _convert_path_cache
3303-
3304- if _convert_path_cache != None:
3305- return _convert_path_cache
3306-
3307- search_path = os.environ.get('PATH', os.defpath)
3308- for d in search_path.split(os.pathsep):
3309- convert_path = os.path.join(d, 'convert')
3310- if os.path.exists(convert_path):
3311- _convert_path_cache = convert_path
3312- return _convert_path_cache
3313-
3314-def pidIsRunning(pid):
3315+def pid_is_running(pid):
3316 if pid is None:
3317 return False
3318 try:
3319@@ -253,15 +227,15 @@
3320 except OSError, err:
3321 return err.errno == errno.EPERM
3322
3323-def killProcess(pid):
3324+def kill_process(pid):
3325 if pid is None:
3326 return
3327- if pidIsRunning(pid):
3328+ if pid_is_running(pid):
3329 try:
3330 os.kill(pid, signal.SIGTERM)
3331 for i in xrange(100):
3332 time.sleep(.01)
3333- if not pidIsRunning(pid):
3334+ if not pid_is_running(pid):
3335 return
3336 os.kill(pid, signal.SIGKILL)
3337 except (SystemExit, KeyboardInterrupt):
3338@@ -269,10 +243,10 @@
3339 except:
3340 logging.exception("error killing download daemon")
3341
3342-def launchDownloadDaemon(oldpid, env):
3343+def launch_download_daemon(oldpid, env):
3344 # Use UNIX style kill
3345- if oldpid is not None and pidIsRunning(oldpid):
3346- killProcess(oldpid)
3347+ if oldpid is not None and pid_is_running(oldpid):
3348+ kill_process(oldpid)
3349
3350 environ = os.environ.copy()
3351 environ['MIRO_FRONTEND'] = options.frontend
3352
3353=== modified file 'platform/gtk-x11/plat/xlibhelper.pyx'
3354--- platform/gtk-x11/plat/xlibhelper.pyx 2009-02-11 01:32:44 +0000
3355+++ platform/gtk-x11/plat/xlibhelper.pyx 2010-04-14 21:08:30 +0000
3356@@ -1,5 +1,5 @@
3357 # Miro - an RSS based video player application
3358-# Copyright (C) 2005-2009 Participatory Culture Foundation
3359+# Copyright (C) 2005-2010 Participatory Culture Foundation
3360 #
3361 # This program is free software; you can redistribute it and/or modify
3362 # it under the terms of the GNU General Public License as published by
3363
3364=== added file 'platform/gtk-x11/pylintrc'
3365--- platform/gtk-x11/pylintrc 1970-01-01 00:00:00 +0000
3366+++ platform/gtk-x11/pylintrc 2010-04-14 21:08:30 +0000
3367@@ -0,0 +1,304 @@
3368+# lint Python modules using external checkers.
3369+#
3370+# This is the main checker controling the other ones and the reports
3371+# generation. It is itself both a raw checker and an astng checker in order
3372+# to:
3373+# * handle message activation / deactivation at the module level
3374+# * handle some basic but necessary stats'data (number of classes, methods...)
3375+#
3376+[MASTER]
3377+
3378+# Specify a configuration file.
3379+#rcfile=
3380+
3381+# Profiled execution.
3382+profile=no
3383+
3384+# Add <file or directory> to the black list. It should be a base name, not a
3385+# path. You may set this option multiple times.
3386+#ignore=.svn
3387+
3388+# Pickle collected data for later comparisons.
3389+persistent=yes
3390+
3391+# Set the cache size for astng objects.
3392+cache-size=5000
3393+
3394+# List of plugins (as comma separated values of python modules names) to load,
3395+# usually to register additional checkers.
3396+load-plugins=
3397+
3398+
3399+[MESSAGES CONTROL]
3400+
3401+# Enable only checker(s) with the given id(s). This option conflict with the
3402+# disable-checker option
3403+#enable-checker=
3404+
3405+# Enable all checker(s) except those with the given id(s). This option conflict
3406+# with the disable-checker option
3407+disable-checker=imports
3408+
3409+# Enable all messages in the listed categories.
3410+#enable-msg-cat=
3411+
3412+# Disable all messages in the listed categories.
3413+#disable-msg-cat=
3414+
3415+# Enable the message(s) with the given id(s).
3416+#enable-msg=
3417+
3418+# Disable the message(s) with the given id(s).
3419+# see http://pylint-messages.wikidot.com/all-codes for codes
3420+# C0111: Missing docstring
3421+# C0302: Too many lines in module (%s)
3422+disable-msg=C0302,C0111,R0801
3423+
3424+
3425+[REPORTS]
3426+
3427+# set the output format. Available formats are text, parseable, colorized and
3428+# html
3429+output-format=text
3430+
3431+# Include message's id in output
3432+include-ids=yes
3433+
3434+# Put messages in a separate file for each module / package specified on the
3435+# command line instead of printing them on stdout. Reports (if any) will be
3436+# written in a file name "pylint_global.[txt|html]".
3437+files-output=no
3438+
3439+# Tells wether to display a full report or only the messages
3440+reports=yes
3441+
3442+# Python expression which should return a note less than 10 (10 is the highest
3443+# note).You have access to the variables errors warning, statement which
3444+# respectivly contain the number of errors / warnings messages and the total
3445+# number of statements analyzed. This is used by the global evaluation report
3446+# (R0004).
3447+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
3448+
3449+# Add a comment according to your evaluation note. This is used by the global
3450+# evaluation report (R0004).
3451+comment=no
3452+
3453+# Enable the report(s) with the given id(s).
3454+#enable-report=
3455+
3456+# Disable the report(s) with the given id(s).
3457+#disable-report=
3458+
3459+
3460+# checks for
3461+# * unused variables / imports
3462+# * undefined variables
3463+# * redefinition of variable from builtins or from an outer scope
3464+# * use of variable before assigment
3465+#
3466+[VARIABLES]
3467+
3468+# Tells wether we should check for unused import in __init__ files.
3469+init-import=no
3470+
3471+# A regular expression matching names used for dummy variables (i.e. not used).
3472+dummy-variables-rgx=_|dummy
3473+
3474+# List of additional names supposed to be defined in builtins. Remember that
3475+# you should avoid to define new builtins when possible.
3476+additional-builtins=
3477+
3478+
3479+# try to find bugs in the code using type inference
3480+#
3481+[TYPECHECK]
3482+
3483+# Tells wether missing members accessed in mixin class should be ignored. A
3484+# mixin class is detected if its name ends with "mixin" (case insensitive).
3485+ignore-mixin-members=yes
3486+
3487+# When zope mode is activated, consider the acquired-members option to ignore
3488+# access to some undefined attributes.
3489+zope=no
3490+
3491+# List of members which are usually get through zope's acquisition mecanism and
3492+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
3493+acquired-members=REQUEST,acl_users,aq_parent
3494+
3495+
3496+# checks for :
3497+# * doc strings
3498+# * modules / classes / functions / methods / arguments / variables name
3499+# * number of arguments, local variables, branchs, returns and statements in
3500+# functions, methods
3501+# * required module attributes
3502+# * dangerous default values as arguments
3503+# * redefinition of function / method / class
3504+# * uses of the global statement
3505+#
3506+[BASIC]
3507+
3508+# Required attributes for module, separated by a comma
3509+required-attributes=
3510+
3511+# Regular expression which should only match functions or classes name which do
3512+# not require a docstring
3513+no-docstring-rgx=__.*__
3514+
3515+# Regular expression which should only match correct module names
3516+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
3517+
3518+# Regular expression which should only match correct module level names
3519+const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$
3520+
3521+# Regular expression which should only match correct class names
3522+class-rgx=[A-Z_][a-zA-Z0-9]+$
3523+
3524+# Regular expression which should only match correct function names
3525+function-rgx=[a-z_][a-z0-9_]{2,30}$
3526+
3527+# Regular expression which should only match correct method names
3528+method-rgx=[a-z_][a-z0-9_]{2,30}$
3529+
3530+# Regular expression which should only match correct instance attribute names
3531+attr-rgx=[a-z_][a-z0-9_]{2,30}$
3532+
3533+# Regular expression which should only match correct argument names
3534+argument-rgx=[a-z_][a-z0-9_]{2,30}$
3535+
3536+# Regular expression which should only match correct variable names
3537+variable-rgx=[a-z_][a-z0-9_]{2,30}$
3538+
3539+# Regular expression which should only match correct list comprehension /
3540+# generator expression variable names
3541+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
3542+
3543+# Good variable names which should always be accepted, separated by a comma
3544+good-names=i,f,fp,fn,j,k,ex,Run,_
3545+
3546+# Bad variable names which should always be refused, separated by a comma
3547+bad-names=foo,bar,baz,toto,tutu,tata
3548+
3549+# List of builtins function names that should not be used, separated by a comma
3550+bad-functions=apply,input
3551+
3552+
3553+# checks for sign of poor/misdesign:
3554+# * number of methods, attributes, local variables...
3555+# * size, complexity of functions, methods
3556+#
3557+[DESIGN]
3558+
3559+# Maximum number of arguments for function / method
3560+max-args=12
3561+
3562+# Maximum number of locals for function / method body
3563+max-locals=30
3564+
3565+# Maximum number of return / yield for function / method body
3566+max-returns=12
3567+
3568+# Maximum number of branch for function / method body
3569+max-branchs=30
3570+
3571+# Maximum number of statements in function / method body
3572+max-statements=60
3573+
3574+# Maximum number of parents for a class (see R0901).
3575+max-parents=7
3576+
3577+# Maximum number of attributes for a class (see R0902).
3578+max-attributes=20
3579+
3580+# Minimum number of public methods for a class (see R0903).
3581+min-public-methods=0
3582+
3583+# Maximum number of public methods for a class (see R0904).
3584+max-public-methods=20
3585+
3586+
3587+# checks for
3588+# * external modules dependencies
3589+# * relative / wildcard imports
3590+# * cyclic imports
3591+# * uses of deprecated modules
3592+#
3593+[IMPORTS]
3594+
3595+# Deprecated modules which should not be used, separated by a comma
3596+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
3597+
3598+# Create a graph of every (i.e. internal and external) dependencies in the
3599+# given file (report R0402 must not be disabled)
3600+import-graph=
3601+
3602+# Create a graph of external dependencies in the given file (report R0402 must
3603+# not be disabled)
3604+ext-import-graph=
3605+
3606+# Create a graph of internal dependencies in the given file (report R0402 must
3607+# not be disabled)
3608+int-import-graph=
3609+
3610+
3611+# checks for :
3612+# * methods without self as first argument
3613+# * overridden methods signature
3614+# * access only to existant members via self
3615+# * attributes not defined in the __init__ method
3616+# * supported interfaces implementation
3617+# * unreachable code
3618+#
3619+[CLASSES]
3620+
3621+# List of interface methods to ignore, separated by a comma. This is used for
3622+# instance to not check methods defines in Zope's Interface base class.
3623+ignore-iface-methods=
3624+
3625+# List of method names used to declare (i.e. assign) instance attributes.
3626+defining-attr-methods=__init__,__new__,setUp
3627+
3628+
3629+# checks for similarities and duplicated code. This computation may be
3630+# memory / CPU intensive, so you should disable it if you experiments some
3631+# problems.
3632+#
3633+[SIMILARITIES]
3634+
3635+# Minimum lines number of a similarity.
3636+min-similarity-lines=10
3637+
3638+# Ignore comments when computing similarities.
3639+ignore-comments=yes
3640+
3641+# Ignore docstrings when computing similarities.
3642+ignore-docstrings=yes
3643+
3644+
3645+# checks for:
3646+# * warning notes in the code like FIXME, XXX
3647+# * PEP 263: source code with non ascii character but no encoding declaration
3648+#
3649+[MISCELLANEOUS]
3650+
3651+# List of note tags to take in consideration, separated by a comma.
3652+notes=FIXME,XXX,TODO
3653+
3654+
3655+# checks for :
3656+# * unauthorized constructions
3657+# * strict indentation
3658+# * line length
3659+# * use of <> instead of !=
3660+#
3661+[FORMAT]
3662+
3663+# Maximum number of characters on a single line.
3664+max-line-length=100
3665+
3666+# Maximum number of lines in a module
3667+max-module-lines=10000
3668+
3669+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
3670+# tab).
3671+indent-string=' '
3672
3673=== modified file 'platform/gtk-x11/run.sh'
3674--- platform/gtk-x11/run.sh 2009-12-13 17:59:01 +0000
3675+++ platform/gtk-x11/run.sh 2010-04-14 21:08:30 +0000
3676@@ -1,7 +1,7 @@
3677 #!/bin/sh
3678
3679 # Miro - an RSS based video player application
3680-# Copyright (C) 2005-2009 Participatory Culture Foundation
3681+# Copyright (C) 2005-2010 Participatory Culture Foundation
3682 #
3683 # This program is free software; you can redistribute it and/or modify
3684 # it under the terms of the GNU General Public License as published by
3685@@ -29,7 +29,7 @@
3686 # statement from all source files in the program, then also delete it here.
3687
3688 PYTHON=`which python`
3689-PYTHON_VERSION=`python -c 'import sys; info=sys.version_info; print "%s.%s" % (info[0], info[1])'`
3690+PYTHON_VERSION=`${PYTHON} -c 'import sys; info=sys.version_info; print "%s.%s" % (info[0], info[1])'`
3691 PREFIX=/usr
3692 export MIRO_SHARE_ROOT=dist/$PREFIX/share/
3693 export MIRO_RESOURCE_ROOT=dist/$PREFIX/share/miro/resources/
3694
3695=== modified file 'platform/gtk-x11/setup.py' (properties changed: +x to -x)
3696--- platform/gtk-x11/setup.py 2010-02-20 02:34:26 +0000
3697+++ platform/gtk-x11/setup.py 2010-04-14 21:08:30 +0000
3698@@ -1,7 +1,7 @@
3699 #!/usr/bin/env python
3700
3701 # Miro - an RSS based video player application
3702-# Copyright (C) 2005-2009 Participatory Culture Foundation
3703+# Copyright (C) 2005-2010 Participatory Culture Foundation
3704 #
3705 # This program is free software; you can redistribute it and/or modify
3706 # it under the terms of the GNU General Public License as published by
3707@@ -32,16 +32,6 @@
3708 ## Paths and configuration ##
3709 ###############################################################################
3710
3711-# The xine hack helps older systems. See bug #7132.
3712-#
3713-# If this hack is enabled and Miro crashes at the end of playback when
3714-# the xine renderer is used, then try disabling the hack.
3715-#
3716-# As of Miro 2.0, there is a command-line option to enable/disable the
3717-# hack.
3718-USE_XINE_HACK = False
3719-
3720-
3721 # The following properties allow you to explicitly set xulrunner paths and
3722 # library names in the case that Miro guesses them wrong for your system.
3723 # When setting these, you must make sure that:
3724@@ -116,16 +106,24 @@
3725 GTKMOZEMBED_LIB = None
3726 XULRUNNER_19 = None
3727
3728-# The name of the boost python library. Used for building extensions.
3729-# If this is set to None, setup.py will divine the right lib to use.
3730-# It should probably be either "boost_python" or "boost_python-mt".
3731-BOOST_LIB = None
3732-
3733
3734 ###############################################################################
3735 ## End of configuration. No user-serviceable parts inside ##
3736 ###############################################################################
3737
3738+import sys
3739+
3740+# verify we have required bits for compiling Miro
3741+
3742+try:
3743+ from Pyrex.Compiler import Version
3744+ if Version.version.split(".") < ["0", "9", "6", "4"]:
3745+ print "Pyrex 0.9.6.4 or greater required. You have version %s." % Version.version
3746+ sys.exit(1)
3747+except ImportError:
3748+ print "Pyrex not found. Please install Pyrex."
3749+ sys.exit(1)
3750+
3751 from distutils.cmd import Command
3752 from distutils.core import setup
3753 from distutils.extension import Extension
3754@@ -139,7 +137,6 @@
3755 import pwd
3756 import subprocess
3757 import platform
3758-import sys
3759 import re
3760 import time
3761 import shutil
3762@@ -166,22 +163,18 @@
3763 root_try = os.path.abspath(os.path.join(root_try, '..'))
3764 return root_dir
3765
3766-def is_x64():
3767- return platform.machine() == "x86_64" or platform.machine() == "amd64"
3768-
3769 root_dir = get_root_dir()
3770 portable_dir = os.path.join(root_dir, 'portable')
3771 portable_frontend_dir = os.path.join(portable_dir, 'frontends')
3772 portable_xpcom_dir = os.path.join(portable_frontend_dir, 'widgets', 'gtk',
3773- 'xpcom')
3774+ 'xpcom')
3775 dl_daemon_dir = os.path.join(portable_dir, 'dl_daemon')
3776 test_dir = os.path.join(portable_dir, 'test')
3777 resource_dir = os.path.join(root_dir, 'resources')
3778 platform_dir = os.path.join(root_dir, 'platform', 'gtk-x11')
3779 platform_package_dir = os.path.join(platform_dir, 'plat')
3780 platform_widgets_dir = os.path.join(platform_package_dir, 'frontends',
3781- 'widgets')
3782-xine_dir = os.path.join(platform_dir, 'xine')
3783+ 'widgets')
3784
3785 # insert the root_dir to the beginning of sys.path so that we can
3786 # pick up portable and other packages
3787@@ -243,7 +236,6 @@
3788 """Wait for a command and return its output. Check for common errors and
3789 raise an exception if one of these occurs.
3790 """
3791-
3792 p = subprocess.Popen(cmd, shell=True, close_fds=True,
3793 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
3794 stdout, stderr = p.communicate()
3795@@ -294,31 +286,13 @@
3796
3797 return options_dict
3798
3799-all_libs = []
3800-if os.path.exists(os.path.join(sysconfig.PREFIX, "lib")):
3801- all_libs.extend(os.listdir(os.path.join(sysconfig.PREFIX, "lib")))
3802-if os.path.exists(os.path.join(sysconfig.PREFIX, "lib64")):
3803- all_libs.extend(os.listdir(os.path.join(sysconfig.PREFIX, "lib64")))
3804-all_libs = [mem for mem in all_libs if mem.startswith("libboost")]
3805-
3806-def mt_or_not(s, all_libs=all_libs):
3807- for mem in all_libs:
3808- if mem.startswith("lib%s-mt" % s):
3809- print "Using %s-mt" % s
3810- return "%s-mt" % s
3811- print "using %s" % s
3812- return s
3813-
3814-if BOOST_LIB is None:
3815- BOOST_LIB = mt_or_not("boost_python")
3816-else:
3817- print "Using %s" % BOOST_LIB
3818-
3819-def compile_xine_extractor():
3820- rv = os.system("gcc %s -o %s `pkg-config --libs --cflags gdk-pixbuf-2.0 glib-2.0 libxine`" %
3821- (os.path.join(platform_dir, "xine/xine_extractor.c"), os.path.join(platform_dir, "xine/xine_extractor")))
3822- if rv != 0:
3823- raise RuntimeError("xine_extractor compilation failed. Possibly missing libxine, gdk-pixbuf-2.0, or glib-2.0.")
3824+def package_exists(package_name):
3825+ """
3826+ Return True if the package is present in the system. False otherwise.
3827+ The check is made with pkg-config.
3828+ """
3829+ # pkg-config returns 0 if the package is present
3830+ return subprocess.call(['pkg-config', '--exists', package_name]) == 0
3831
3832 def generate_miro(xpcom_path):
3833 # build a miro script that wraps the miro.real script with an LD_LIBRARY_PATH
3834@@ -361,90 +335,8 @@
3835 f.close()
3836
3837
3838-#### The fasttypes extension ####
3839-fasttypes_ext = \
3840- Extension("miro.fasttypes",
3841- sources = [os.path.join(portable_dir, 'fasttypes.cpp')],
3842- libraries = [BOOST_LIB],
3843- )
3844-
3845-
3846-##### The libtorrent extension ####
3847-def fetch_sources(portable_dir):
3848- sources = []
3849- for root, dirs, files in os.walk(os.path.join(portable_dir, 'libtorrent')):
3850- if '.svn' in dirs:
3851- dirs.remove('.svn')
3852- for file in files:
3853- if file.endswith('.cpp') or file.endswith('.c'):
3854- sources.append(os.path.join(root, file))
3855- return sources
3856-
3857-def get_libtorrent_extension(portable_dir):
3858- libtorrent_installed = False
3859- try:
3860- ret = parse_pkg_config("pkg-config", "libtorrent-rasterbar")
3861- import libtorrent
3862- libtorrent_installed = True
3863- print "libtorrent-rasterbar (0.13 or later) and python bindings are installed--using system version."
3864- return None
3865- except RuntimeError:
3866- print "libtorrent-rasterbar not installed on this system."
3867- except ImportError:
3868- print "python bindings for libtorrent-rasterbar not installed on this system"
3869-
3870- include_dirs = [os.path.join(portable_dir, x) for x in
3871- ['libtorrent/include', 'libtorrent/include/libtorrent']]
3872-
3873- extra_compile_args = ["-Wno-missing-braces",
3874- "-D_FILE_OFFSET_BITS=64",
3875- "-DHAVE___INCLUDE_LIBTORRENT_ASIO_HPP=1",
3876- "-DHAVE___INCLUDE_LIBTORRENT_ASIO_SSL_STREAM_HPP=1",
3877- "-DHAVE___INCLUDE_LIBTORRENT_ASIO_IP_TCP_HPP=1",
3878- "-DHAVE_PTHREAD=1", "-DTORRENT_USE_OPENSSL=1", "-DHAVE_SSL=1",
3879- "-DNDEBUG=1", "-O2"]
3880-
3881- if is_x64():
3882- extra_compile_args.append("-DAMD64")
3883-
3884- libraries = ['z', 'pthread', 'ssl']
3885-
3886- # get mt or non-mt versions of the boost libraries
3887- libraries += [mt_or_not("boost_python"),
3888- mt_or_not("boost_filesystem"),
3889- mt_or_not("boost_date_time"),
3890- mt_or_not("boost_thread")]
3891-
3892- config_vars = sysconfig.get_config_vars()
3893- if "CFLAGS" in config_vars and "-Wstrict-prototypes" in config_vars["CFLAGS"]:
3894- config_vars["CFLAGS"] = config_vars["CFLAGS"].replace("-Wstrict-prototypes", " ")
3895-
3896- if "OPT" in config_vars and "-Wstrict-prototypes" in config_vars["OPT"]:
3897- config_vars["OPT"] = config_vars["OPT"].replace("-Wstrict-prototypes", " ")
3898-
3899- sources = fetch_sources(portable_dir)
3900-
3901- # versions of libtorrent prior to 0.14 have this file which we don't want to
3902- # compile or use
3903- if os.path.exists(os.path.join(portable_dir, "libtorrent", "src", "file_win.cpp")):
3904- sources.remove(os.path.join(portable_dir, "libtorrent", "src", "file_win.cpp"))
3905-
3906- return Extension("miro.libtorrent",
3907- include_dirs=include_dirs,
3908- libraries=libraries,
3909- extra_compile_args=extra_compile_args,
3910- sources=sources)
3911-
3912-libtorrent_ext = get_libtorrent_extension(portable_dir)
3913-
3914-
3915 #### MozillaBrowser Extension ####
3916 def get_mozilla_stuff():
3917- try:
3918- packages = get_command_output("pkg-config --list-all")
3919- except RuntimeError, error:
3920- sys.exit("Package config error:\n%s" % (error,))
3921-
3922 if XPCOM_LIB and GTKMOZEMBED_LIB and XULRUNNER_19 != None:
3923 print "\nUsing XPCOM_LIB, GTKMOZEMBED_LIB and XULRUNNER_19 values...."
3924 xulrunner19 = XULRUNNER_19
3925@@ -454,29 +346,31 @@
3926 else:
3927 print "\nTrying to figure out xpcom_lib, gtkmozembed_lib, and xulrunner_19 values...."
3928 xulrunner19 = False
3929- if re.search("^libxul", packages, re.MULTILINE):
3930+ if package_exists('libxul'):
3931 xulrunner19 = True
3932 xpcom_lib = 'libxul'
3933 gtkmozembed_lib = 'libxul'
3934
3935- elif re.search("^xulrunner-xpcom", packages, re.MULTILINE):
3936+ elif package_exists('xulrunner-xpcom'):
3937 xpcom_lib = 'xulrunner-xpcom'
3938 gtkmozembed_lib = 'xulrunner-gtkmozembed'
3939
3940- elif re.search("^seamonkey-xpcom", packages, re.MULTILINE):
3941+ elif package_exists('seamonkey-xpcom'):
3942 xpcom_lib = 'seamonkey-xpcom'
3943 gtkmozembed_lib = 'seamonkey-gtkmozembed'
3944
3945- elif re.search("^mozilla-xpcom", packages, re.MULTILINE):
3946+ elif package_exists('mozilla-xpcom'):
3947 xpcom_lib = 'mozilla-xpcom'
3948 gtkmozembed_lib = 'mozilla-gtkmozembed'
3949
3950- elif re.search("^firefox-xpcom", packages, re.MULTILINE):
3951+ elif package_exists('firefox-xpcom'):
3952 xpcom_lib = 'firefox-xpcom'
3953 gtkmozembed_lib = 'firefox-gtkmozembed'
3954
3955 else:
3956- sys.exit("Can't find libxul, xulrunner-xpcom, seamonkey-xpcom, mozilla-xpcom or firefox-xpcom")
3957+ print "Can't find libxul, xulrunner-xpcom, seamonkey-xpcom, mozilla-xpcom or firefox-xpcom"
3958+ print "One of these is required."
3959+ sys.exit(1)
3960
3961 print "using xpcom_lib: ", repr(xpcom_lib)
3962 print "using gtkmozembed_lib: ", repr(gtkmozembed_lib)
3963@@ -613,28 +507,6 @@
3964 )
3965
3966
3967-#### Xine Extension ####
3968-xine_options = parse_pkg_config('pkg-config',
3969- 'libxine pygtk-2.0 gtk+-2.0 glib-2.0 gthread-2.0')
3970-
3971-# If you get XINE crashes, uncommenting this might fix it. It's
3972-# necessary on Debian Etch and Ubuntu Feisty right now.
3973-#
3974-# We have a horrible workaround for buggy X drivers in xine_impl.c
3975-# controlled by this variable
3976-if USE_XINE_HACK:
3977- print "Using the Xine driver hack. If you experience trouble playing video,\n try setting USE_XINE_HACK to False in setup.py."
3978- if xine_options.has_key('define_macros'):
3979- xine_options['define_macros'].append(('INCLUDE_XINE_DRIVER_HACK', '1'))
3980- else:
3981- xine_options['define_macros'] = [('INCLUDE_XINE_DRIVER_HACK', '1')]
3982-
3983-xine_ext = Extension('miro.xine', [
3984- os.path.join(xine_dir, 'xine.pyx'),
3985- os.path.join(xine_dir, 'xine_impl.c'),],
3986- **xine_options)
3987-
3988-
3989 #### Build the data_files list ####
3990 def listfiles(path):
3991 return [f for f in glob(os.path.join(path, '*')) if os.path.isfile(f)]
3992@@ -673,15 +545,12 @@
3993 [os.path.join(platform_dir, 'miro.1.gz')]),
3994 ('/usr/share/man/man1',
3995 [os.path.join(platform_dir, 'miro.real.1.gz')]),
3996- ('/usr/lib/miro/',
3997- [os.path.join(platform_dir, 'xine/xine_extractor')]),
3998 ]
3999
4000
4001 # if we're not doing "python setup.py clean", then we can do a bunch of things
4002 # that have file-related side-effects
4003 if not "clean" in sys.argv:
4004- compile_xine_extractor()
4005 generate_miro(xpcom_runtime_path)
4006 # gzip the man page
4007 os.system ("gzip -9 < %s > %s" % (os.path.join(platform_dir, 'miro.1'), os.path.join(platform_dir, 'miro.1.gz')))
4008@@ -840,17 +709,12 @@
4009 shutil.rmtree('./dist/')
4010
4011 ext_modules = []
4012-ext_modules.append(fasttypes_ext)
4013-ext_modules.append(xine_ext)
4014 ext_modules.append(xlib_ext)
4015-if libtorrent_ext:
4016- ext_modules.append(libtorrent_ext)
4017 ext_modules.append(pygtkhacks_ext)
4018 ext_modules.append(mozprompt_ext)
4019 ext_modules.append(httpobserver_ext)
4020 ext_modules.append(windowcreator_ext)
4021 ext_modules.append(pluginsdir_ext)
4022-ext_modules.append(Extension("miro.sorts", [os.path.join(portable_dir, 'sorts.pyx')]))
4023
4024 #### Run setup ####
4025 setup(name='miro',
4026
4027=== removed directory 'platform/gtk-x11/xine'
4028=== removed file 'platform/gtk-x11/xine/xine.pyx'
4029--- platform/gtk-x11/xine/xine.pyx 2009-10-25 00:24:34 +0000
4030+++ platform/gtk-x11/xine/xine.pyx 1970-01-01 00:00:00 +0000
4031@@ -1,161 +0,0 @@
4032-# Miro - an RSS based video player application
4033-# Copyright (C) 2005-2009 Participatory Culture Foundation
4034-#
4035-# This program is free software; you can redistribute it and/or modify
4036-# it under the terms of the GNU General Public License as published by
4037-# the Free Software Foundation; either version 2 of the License, or
4038-# (at your option) any later version.
4039-#
4040-# This program is distributed in the hope that it will be useful,
4041-# but WITHOUT ANY WARRANTY; without even the implied warranty of
4042-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4043-# GNU General Public License for more details.
4044-#
4045-# You should have received a copy of the GNU General Public License
4046-# along with this program; if not, write to the Free Software
4047-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
4048-#
4049-# In addition, as a special exception, the copyright holders give
4050-# permission to link the code of portions of this program with the OpenSSL
4051-# library.
4052-#
4053-# You must obey the GNU General Public License in all respects for all of
4054-# the code used other than OpenSSL. If you modify file(s) with this
4055-# exception, you may extend this exception to your version of the file(s),
4056-# but you are not obligated to do so. If you do not wish to do so, delete
4057-# this exception statement from your version. If you delete this exception
4058-# statement from all source files in the program, then also delete it here.
4059-
4060-##############################################################################
4061-# Xine module.
4062-#
4063-# Contains the Xine class which is used to control libxine.
4064-# Code in here is basically just a wrapper for the functions in xine_impl.c.
4065-# See that file if you want to know what's going on under the hood
4066-#
4067-##############################################################################
4068-
4069-cdef extern from "X11/Xlib.h":
4070- ctypedef unsigned long Drawable
4071-
4072-cdef extern from "Python.h":
4073- ctypedef int PyGILState_STATE
4074- PyGILState_STATE PyGILState_Ensure()
4075- void PyGILState_Release(PyGILState_STATE)
4076- ctypedef struct PyThreadState
4077- ctypedef struct PyObject
4078- void Py_DECREF(PyObject*)
4079- void Py_INCREF(PyObject*)
4080- PyObject* PyObject_CallMethod(PyObject *o, char *method, char* format, ...)
4081- void PyErr_Print()
4082-
4083-cdef extern from "xine.h":
4084- ctypedef struct xine_event_t:
4085- int type
4086- ctypedef void (*xine_event_listener_cb_t) (void *user_data,
4087- xine_event_t *event)
4088- enum dummy:
4089- XINE_EVENT_UI_PLAYBACK_FINISHED
4090-
4091-cdef extern from "xine_impl.h":
4092- ctypedef struct _Xine
4093-
4094- _Xine* xineCreate(xine_event_listener_cb_t event_callback,
4095- void* event_callback_data)
4096- void xineDestroy(_Xine* xine)
4097- void xineAttach(_Xine* xine, char* displayName, Drawable d, char *driver, int sync, int use_xv_hack)
4098- void xineSetArea(_Xine* xine, int xpos, int ypos, int width, int height)
4099- void xineDetach(_Xine* xine)
4100- void xineSetupSniffer(_Xine* xine)
4101- int xineGetType(_Xine* xine, char* filename)
4102- int xineSelectFile(_Xine* xine, char* filename)
4103- void xineSetPlaying(_Xine* xine, int isPlaying)
4104- void xineSetViz(_Xine* xine, char *viz)
4105- void xineSetVolume(_Xine* xine, int volume)
4106- int xineGetVolume(_Xine* xine)
4107- void xineGotExposeEvent(_Xine* xine, int x, int y, int width, int height)
4108- void xineSeek(_Xine* xine, int position)
4109- int xineGetPosLength(_Xine* xine, int* position, int* length)
4110- char* xineVersion()
4111-
4112-def getXineVersion():
4113- return xineVersion()
4114-
4115-class CantQueryPositionLength(Exception):
4116- pass
4117-
4118-cdef class Xine:
4119- # Wrapper for the Xine class
4120- cdef _Xine* xine
4121- cdef object eosCallback
4122-
4123- def __new__(self):
4124- self.xine = xineCreate(on_xine_event, <void*>self)
4125- self.eosCallback = None
4126- def __dealloc__(self):
4127- xineDestroy(self.xine)
4128- def attach(self, char* displayName, int drawable, char *driver, sync, use_xv_hack):
4129- xineAttach(self.xine, displayName, drawable, driver, sync, use_xv_hack)
4130- def detach(self):
4131- xineDetach(self.xine)
4132- def setup_sniffer(self):
4133- xineSetupSniffer(self.xine)
4134- def set_area(self, int xpos, int ypos, int width, int height):
4135- xineSetArea(self.xine, xpos, ypos, width, height)
4136- def get_type(self, char* filename):
4137- return xineGetType(self.xine, filename)
4138- def select_file(self, char* filename):
4139- return xineSelectFile(self.xine, filename)
4140- def play(self):
4141- xineSetPlaying(self.xine, 1)
4142- def pause(self):
4143- xineSetPlaying(self.xine, 0)
4144- def set_viz(self, viz):
4145- xineSetViz(self.xine, viz)
4146- def set_volume(self, volume):
4147- volume = min(max(volume, 0), 100)
4148- xineSetVolume(self.xine, volume)
4149- def get_volume(self):
4150- return xineGetVolume(self.xine)
4151- def got_expose_event(self, int x, int y, int width, int height):
4152- xineGotExposeEvent(self.xine, x, y, width, height)
4153- def seek(self, int position):
4154- xineSeek(self.xine, position)
4155- def set_eos_callback(self, callback):
4156- """Set the callback invoke when xine reaches the end of its stream.
4157- Pass in None to clear the callback
4158-
4159- NOTE: this callback will be invoked outside of the gtk main thread,
4160- use gobject.idle_add if you need to use any gtk methods.
4161- """
4162- self.eosCallback = callback
4163- def on_eos_event(self):
4164- if self.eosCallback:
4165- self.eosCallback()
4166- def get_position_and_length(self):
4167- """Try to query the current stream position and stream length. If
4168- Xine doesn't know the values yet we throw a CantQueryPositionLength
4169- Exception.
4170- """
4171- cdef int position, length
4172- if xineGetPosLength(self.xine, &position, &length) == 0:
4173- raise CantQueryPositionLength
4174- else:
4175- return position, length
4176-
4177-cdef void on_xine_event(void* data, xine_event_t* event):
4178- cdef PyObject* self
4179- cdef PyGILState_STATE gil
4180- cdef PyObject* result
4181-
4182- if event.type == XINE_EVENT_UI_PLAYBACK_FINISHED:
4183- self = <PyObject*>data
4184- gil = PyGILState_Ensure()
4185- Py_INCREF(self)
4186- result = PyObject_CallMethod(self, "on_eos_event", "", NULL)
4187- if(result == NULL):
4188- PyErr_Print()
4189- else:
4190- Py_DECREF(result)
4191- Py_DECREF(self)
4192- PyGILState_Release(gil)
4193
4194=== removed file 'platform/gtk-x11/xine/xine_extractor.c'
4195--- platform/gtk-x11/xine/xine_extractor.c 2009-02-11 01:32:44 +0000
4196+++ platform/gtk-x11/xine/xine_extractor.c 1970-01-01 00:00:00 +0000
4197@@ -1,224 +0,0 @@
4198-/*
4199-# Miro - an RSS based video player application
4200-# Copyright (C) 2005-2009 Participatory Culture Foundation
4201-#
4202-# This program is free software; you can redistribute it and/or modify
4203-# it under the terms of the GNU General Public License as published by
4204-# the Free Software Foundation; either version 2 of the License, or
4205-# (at your option) any later version.
4206-#
4207-# This program is distributed in the hope that it will be useful,
4208-# but WITHOUT ANY WARRANTY; without even the implied warranty of
4209-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4210-# GNU General Public License for more details.
4211-#
4212-# You should have received a copy of the GNU General Public License
4213-# along with this program; if not, write to the Free Software
4214-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
4215-#
4216-# In addition, as a special exception, the copyright holders give
4217-# permission to link the code of portions of this program with the OpenSSL
4218-# library.
4219-#
4220-# You must obey the GNU General Public License in all respects for all of
4221-# the code used other than OpenSSL. If you modify file(s) with this
4222-# exception, you may extend this exception to your version of the file(s),
4223-# but you are not obligated to do so. If you do not wish to do so, delete
4224-# this exception statement from your version. If you delete this exception
4225-# statement from all source files in the program, then also delete it here.
4226-*/
4227-
4228-#define XINE_ENABLE_EXPERIMENTAL_FEATURES 1
4229-#include <xine.h>
4230-#include <xine/video_out.h>
4231-#include <gdk-pixbuf/gdk-pixbuf.h>
4232-#include <glib.h>
4233-
4234-typedef struct {
4235- xine_t* xine;
4236- xine_stream_t* stream;
4237- xine_video_port_t* videoPort;
4238- xine_audio_port_t* audioPort;
4239-} _Xine;
4240-
4241-static int Y_table[256];
4242-static int RCr_table[256];
4243-static int GCr_table[256];
4244-static int GCb_table[256];
4245-static int BCb_table[256];
4246-static int tables_initialized = 0;
4247-
4248-static void build_tables() {
4249- int i;
4250- if (tables_initialized)
4251- return;
4252- for (i = 0; i < 256; i++) {
4253- Y_table[i] = (i - 16) * 255 * 256 / 219;
4254- RCr_table[i] = (i - 128) * 127 * 256 * 1.402 / 112;
4255- GCr_table[i] = (i - 128) * 127 * 256 * -.714 / 112;
4256- GCb_table[i] = (i - 128) * 127 * 256 * -.344 / 112;
4257- BCb_table[i] = (i - 128) * 127 * 256 * 1.772 / 112;
4258- }
4259- tables_initialized = 1;
4260-}
4261-
4262-static void _make_new_data_mine(_Xine* xine) {
4263- xine->videoPort = xine_open_video_driver(xine->xine, "none", XINE_VISUAL_TYPE_NONE, NULL);
4264- xine->audioPort = xine_open_audio_driver(xine->xine, "none", NULL);
4265- xine->stream = xine_stream_new(xine->xine, xine->audioPort, xine->videoPort);
4266-}
4267-
4268-static void xineDataMineClose(_Xine *xine)
4269-{
4270- xine_close(xine->stream);
4271- xine_dispose(xine->stream);
4272- xine_close_audio_driver(xine->xine, xine->audioPort);
4273- xine_close_video_driver(xine->xine, xine->videoPort);
4274- /* _make_new_data_mine(xine);*/
4275-}
4276-
4277-static int xineDataMineFilename(_Xine* xine, const char* filename)
4278-{
4279- int rv;
4280- rv = xine_open(xine->stream, filename);
4281- return rv;
4282-}
4283-
4284-/* duration is in ms */
4285-static int xineFileDuration(_Xine* xine)
4286-{
4287- int rv;
4288- int duration;
4289- int dummy, dummy2;
4290- rv = xine_get_pos_length(xine->stream, &dummy, &dummy2, &duration);
4291- if (rv == 0)
4292- return -1;
4293- return duration;
4294-}
4295-
4296-static unsigned char normalize(int val) {
4297- if (val < 0)
4298- val = 0;
4299- if (val > (255 << 8))
4300- val = 255 << 8;
4301- val = val + 127;
4302- val = val >> 8;
4303- return val;
4304-}
4305-
4306-static int xineFileScreenshot(_Xine *xine, int position, const char *screenshot)
4307-{
4308- int rv;
4309- xine_video_frame_t frame;
4310- int i, j;
4311- int CbOffset;
4312- int CrOffset;
4313- unsigned char *out_data;
4314- GdkPixbuf *pixbuf;
4315- xine_video_port_t *video_out;
4316-
4317- if (!xine_get_stream_info (xine->stream, XINE_STREAM_INFO_HAS_VIDEO))
4318- return 0;
4319- rv = xine_play(xine->stream, 0, position);
4320- if (rv == 0)
4321- return 0;
4322- video_out = xine->videoPort;
4323- if (video_out->get_property (video_out, VO_PROP_NUM_STREAMS) == 0) {
4324- return 1;
4325- }
4326- rv = xine_get_next_video_frame (video_out, &frame);
4327- if (rv == 0)
4328- return 0;
4329- if (frame.colorspace != XINE_IMGFMT_YV12 &&
4330- frame.colorspace != XINE_IMGFMT_YUY2) {
4331- xine_free_video_frame (video_out, &frame);
4332- return 0;
4333- }
4334- build_tables();
4335- out_data = g_malloc (frame.width * frame.height * 3);
4336- switch (frame.colorspace) {
4337- case XINE_IMGFMT_YV12:
4338- CrOffset = frame.width * frame.height;
4339- CbOffset = frame.width * frame.height + (frame.width / 2) * (frame.height / 2);
4340- for (j = 0; j < frame.height; j++) {
4341- for (i = 0; i < frame.width; i++) {
4342- int pixel = j * frame.width + i;
4343- int subpixel = (j / 2) * (frame.width / 2) + (i / 2);
4344- int Y = Y_table[frame.data[pixel]];
4345- out_data[pixel * 3] =
4346- normalize(Y +
4347- RCr_table[frame.data[CrOffset + subpixel]]);
4348- out_data[pixel * 3 + 1] =
4349- normalize(Y +
4350- GCr_table[frame.data[CrOffset + subpixel]] +
4351- GCb_table[frame.data[CbOffset + subpixel]]);
4352- out_data[pixel * 3 + 2] =
4353- normalize(Y +
4354- BCb_table[frame.data[CbOffset + subpixel]]);
4355- }
4356- }
4357- break;
4358-
4359- case XINE_IMGFMT_YUY2:
4360- CrOffset = 3;
4361- CbOffset = 1;
4362- for (j = 0; j < frame.height; j++) {
4363- for (i = 0; i < frame.width; i++) {
4364- int pixel = j * frame.width + i;
4365- int subpixel = (j * frame.width + i) / 2 * 4;
4366- int Y = Y_table[frame.data[pixel * 2]];
4367- out_data[pixel * 3] =
4368- normalize(Y +
4369- RCr_table[frame.data[CrOffset + subpixel]]);
4370- out_data[pixel * 3 + 1] =
4371- normalize(Y +
4372- GCr_table[frame.data[CrOffset + subpixel]] +
4373- GCb_table[frame.data[CbOffset + subpixel]]);
4374- out_data[pixel * 3 + 2] =
4375- normalize(Y +
4376- BCb_table[frame.data[CbOffset + subpixel]]);
4377- }
4378- }
4379- break;
4380- }
4381- pixbuf = gdk_pixbuf_new_from_data (out_data, GDK_COLORSPACE_RGB, 0,
4382- 8, frame.width, frame.height, frame.width * 3,
4383- NULL, NULL);
4384- gdk_pixbuf_save (pixbuf, screenshot, "png", NULL, NULL);
4385- gdk_pixbuf_unref (pixbuf);
4386- g_free (out_data);
4387- xine_free_video_frame (xine->videoPort, &frame);
4388- return 1;
4389-}
4390-
4391-int main(int argc, char *argv[])
4392-{
4393- char *filename;
4394- char *screenshot_filename;
4395- int rv;
4396- int duration = -1;
4397- _Xine *xine;
4398- if (argc != 3) {
4399- return 0;
4400- }
4401- g_type_init();
4402- filename = argv[1];
4403- screenshot_filename = argv[2];
4404-
4405- xine = (_Xine*)g_malloc(sizeof(_Xine));
4406- xine->xine = xine_new();
4407- xine_init(xine->xine);
4408- _make_new_data_mine(xine);
4409-
4410- rv = xineDataMineFilename(xine, filename);
4411- if (rv != 0) {
4412- duration = xineFileDuration(xine);
4413- if (duration == -1)
4414- rv = 0;
4415- else
4416- rv = xineFileScreenshot(xine, duration / 2, screenshot_filename);
4417- }
4418- printf ("Miro-Movie-Data-Length: %d\n", duration);
4419- printf ("Miro-Movie-Data-Thumbnail: %s\n", rv ? "Success" : "Failure");
4420- return 0;
4421-}
4422
4423=== removed file 'platform/gtk-x11/xine/xine_impl.c'
4424--- platform/gtk-x11/xine/xine_impl.c 2009-10-25 00:24:34 +0000
4425+++ platform/gtk-x11/xine/xine_impl.c 1970-01-01 00:00:00 +0000
4426@@ -1,490 +0,0 @@
4427-/*
4428-# Miro - an RSS based video player application
4429-# Copyright (C) 2005-2009 Participatory Culture Foundation
4430-#
4431-# This program is free software; you can redistribute it and/or modify
4432-# it under the terms of the GNU General Public License as published by
4433-# the Free Software Foundation; either version 2 of the License, or
4434-# (at your option) any later version.
4435-#
4436-# This program is distributed in the hope that it will be useful,
4437-# but WITHOUT ANY WARRANTY; without even the implied warranty of
4438-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4439-# GNU General Public License for more details.
4440-#
4441-# You should have received a copy of the GNU General Public License
4442-# along with this program; if not, write to the Free Software
4443-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
4444-#
4445-# In addition, as a special exception, the copyright holders give
4446-# permission to link the code of portions of this program with the OpenSSL
4447-# library.
4448-#
4449-# You must obey the GNU General Public License in all respects for all of
4450-# the code used other than OpenSSL. If you modify file(s) with this
4451-# exception, you may extend this exception to your version of the file(s),
4452-# but you are not obligated to do so. If you do not wish to do so, delete
4453-# this exception statement from your version. If you delete this exception
4454-# statement from all source files in the program, then also delete it here.
4455-*/
4456-
4457-/*************************************************************************
4458- * xine_impl.c
4459- *
4460- * Implementations for the Xine class's methods.
4461- *
4462- * Almost all the work for the Xine class gets done in xine_impl.c. xine.pyx
4463- * then wraps the functions. This keeps xine.pyx from overflowing with "cdef
4464- * extern ..." statements
4465- *
4466- **************************************************************************/
4467-
4468-#include "Python.h"
4469-#include <stdlib.h>
4470-#include <stdio.h>
4471-#include <string.h>
4472-#include "xine_impl.h"
4473-#include <gdk-pixbuf/gdk-pixbuf.h>
4474-
4475-#ifdef INCLUDE_XINE_DRIVER_HACK
4476-static int miro_using_xv_driver_hack = 0;
4477-#endif
4478-
4479-const char *viz_available (_Xine* xine, const char *viz)
4480-{
4481- int j;
4482- for (j = 0; xine->viz_available[j]; j++) {
4483- if (!strcmp(viz, xine->viz_available[j])) {
4484- return xine->viz_available[j];
4485- }
4486- }
4487- return NULL;
4488-}
4489-
4490-const char *const pref_viz[] = {
4491- "goom",
4492- "oscope",
4493- "fftscope",
4494- "fftgraph",
4495- NULL
4496-};
4497-
4498-#ifdef INCLUDE_XINE_DRIVER_HACK
4499-static void miro_xine_list_recycle_elem(xine_list_t *list, xine_list_elem_t *elem) {
4500- elem->next = list->free_elem_list;
4501- elem->prev = NULL;
4502-
4503- list->free_elem_list = elem;
4504- list->free_elem_list_size++;
4505-}
4506-
4507-
4508-void miro_xine_list_remove(xine_list_t *list, xine_list_iterator_t position) {
4509- xine_list_elem_t *elem = (xine_list_elem_t*)position;
4510-
4511- if (elem) {
4512- xine_list_elem_t *prev = elem->prev;
4513- xine_list_elem_t *next = elem->next;
4514-
4515- if (prev)
4516- prev->next = next;
4517- else
4518- list->elem_list_front = next;
4519-
4520- if (next)
4521- next->prev = prev;
4522- else
4523- list->elem_list_back = prev;
4524-
4525- miro_xine_list_recycle_elem(list, elem);
4526- list->elem_list_size--;
4527- }
4528-}
4529-
4530-xine_list_iterator_t miro_xine_list_front(xine_list_t *list) {
4531- return list->elem_list_front;
4532-}
4533-#endif
4534-
4535-_Xine* xineCreate(xine_event_listener_cb_t event_callback,
4536- void* event_callback_data)
4537-{
4538- _Xine* xine;
4539- int i;
4540- /* const char *const *video_plugins;*/
4541-
4542- xine = (_Xine*)malloc(sizeof(_Xine));
4543- if(xine == NULL) return NULL;
4544- xine->xine = xine_new();
4545- xine_init(xine->xine);
4546- xine->attached = 0;
4547- xine->frameInfo.lock = g_mutex_new();
4548- xine->frameInfo.xpos = 0;
4549- xine->frameInfo.ypos = 0;
4550- xine->frameInfo.width = 0;
4551- xine->frameInfo.height = 0;
4552- xine->event_callback = event_callback;
4553- xine->event_callback_data = event_callback_data;
4554- xine->viz_available = xine_list_post_plugins_typed (xine->xine, XINE_POST_TYPE_AUDIO_VISUALIZATION);
4555- xine->viz_name = NULL;
4556- for (i = 0; pref_viz[i]; i++) {
4557- const char *viz = viz_available(xine, pref_viz[i]);
4558- if (viz) {
4559- xine->viz_name = viz;
4560- break;
4561- }
4562- }
4563- if (!xine->viz_name) {
4564- xine->viz_name = xine->viz_available [0];
4565- }
4566- xine->viz = NULL;
4567-
4568- return xine;
4569-}
4570-
4571-void xineDestroy(_Xine* xine)
4572-{
4573- if(xine->attached) {
4574- xineDetach(xine);
4575- }
4576- xine_exit(xine->xine);
4577- g_mutex_free(xine->frameInfo.lock);
4578- free(xine);
4579-}
4580-
4581-static void destSizeCallback(void *data, int video_width, int video_height,
4582- double video_pixel_aspect, int *dest_width, int *dest_height, double
4583- *dest_pixel_aspect)
4584-{
4585- _Xine* xine = (_Xine*)data;
4586- /* Should take video_pixel_aspect into account here... */
4587- g_mutex_lock(xine->frameInfo.lock);
4588- *dest_width = xine->frameInfo.width;
4589- *dest_height = xine->frameInfo.height;
4590- g_mutex_unlock(xine->frameInfo.lock);
4591- *dest_pixel_aspect = xine->screenPixelAspect;
4592-}
4593-
4594-static void frameOutputCallback(void *data, int video_width,
4595- int video_height, double video_pixel_aspect, int *dest_x, int *dest_y,
4596- int *dest_width, int *dest_height, double *dest_pixel_aspect, int
4597- *win_x, int *win_y)
4598-{
4599- _Xine* xine = (_Xine*)data;
4600- *dest_x = 0;
4601- *dest_y = 0;
4602- g_mutex_lock(xine->frameInfo.lock);
4603- *win_x = xine->frameInfo.xpos;
4604- *win_y = xine->frameInfo.ypos;
4605- *dest_width = xine->frameInfo.width;
4606- *dest_height = xine->frameInfo.height;
4607- g_mutex_unlock(xine->frameInfo.lock);
4608- *dest_pixel_aspect = xine->screenPixelAspect;
4609-}
4610-
4611-void _xineSwitchToViz(_Xine* xine)
4612-{
4613- const char *const *inputs;
4614- xine_post_out_t *source;
4615- xine_post_in_t *sink;
4616- xine_audio_port_t *audios[] = { xine->audioPort, NULL };
4617- xine_video_port_t *videos[] = { xine->videoPort, NULL };
4618-
4619- if (xine->viz || !xine->viz_name)
4620- return;
4621-
4622- xine->viz = xine_post_init (xine->xine, xine->viz_name, 1, audios, videos);
4623- if (xine->viz) {
4624- inputs = xine_post_list_inputs(xine->viz);
4625- source = xine_get_audio_source (xine->stream);
4626- sink = xine_post_input(xine->viz, inputs[0]);
4627- xine_post_wire (source, sink);
4628- }
4629-}
4630-
4631-void _xineSwitchToNormal(_Xine* xine)
4632-{
4633- xine_post_out_t *source;
4634-
4635- if (!xine->viz)
4636- return;
4637-
4638- source = xine_get_video_source (xine->stream);
4639- xine_post_wire_video_port(source, xine->videoPort);
4640-
4641- source = xine_get_audio_source (xine->stream);
4642- xine_post_wire_audio_port(source, xine->audioPort);
4643-
4644- xine_post_dispose (xine->xine, xine->viz);
4645- xine->viz = NULL;
4646-}
4647-
4648-/**
4649- * If you want to attach for a video player, pass in the display name,
4650- * drawable, driver, sync and use_xv_hack.
4651- *
4652- * If you want to attach for an audio player with no video stuff,
4653- * pass in an empty display name, 0 for the drawable, "none" for
4654- * the driver, and 0 for sync and use_xv_hack.
4655- *
4656- * The xineAttach code only sets up the video portions if d != 0.
4657- */
4658-void xineAttach(_Xine* xine, const char* displayName, Drawable d,
4659- const char *driver, int sync, int use_xv_hack)
4660-{
4661- x11_visual_t vis;
4662- double screenWidth, screenHeight;
4663-
4664- if(xine->attached) {
4665- xineDetach(xine);
4666- }
4667-
4668- xine->drawable = d;
4669- if (d != 0) {
4670- /* Store drawable info in the */
4671-
4672- xine->display = XOpenDisplay(displayName);
4673- XSynchronize(xine->display, sync);
4674-
4675- xine->screen = XDefaultScreen(xine->display);
4676- screenWidth = (DisplayWidth(xine->display, xine->screen) * 1000 /
4677- DisplayWidthMM(xine->display, xine->screen));
4678- screenHeight = (DisplayHeight(xine->display, xine->screen) * 1000 /
4679- DisplayHeightMM(xine->display, xine->screen));
4680- xine->screenPixelAspect = screenHeight / screenWidth;
4681-
4682- /* filling in the xine visual struct */
4683- vis.display = xine->display;
4684- vis.screen = xine->screen;
4685- vis.d = d;
4686- vis.dest_size_cb = destSizeCallback;
4687- vis.frame_output_cb = frameOutputCallback;
4688- vis.user_data = xine;
4689- }
4690-
4691- // FIXME - should check xine to see what the driver options are
4692- // and cycle through them if the specified one doesn't work.
4693-
4694- /* opening xine output ports */
4695- // try to use char *driver for video, default to "auto" if NULL
4696- if (!driver) {
4697- printf("xine_impl.c: no driver passed in, using auto\n");
4698- driver = "auto";
4699- }
4700-
4701- if (d != 0) {
4702- printf("xine_impl.c: trying driver %s\n", driver);
4703-
4704- xine->videoPort = xine_open_video_driver(xine->xine, driver,
4705- XINE_VISUAL_TYPE_X11, (void *)&vis);
4706-
4707- if (!xine->videoPort) {
4708- printf("xine_impl.c: driver failed--trying auto\n");
4709- xine->videoPort = xine_open_video_driver(xine->xine, "auto",
4710- XINE_VISUAL_TYPE_X11, (void *)&vis);
4711- }
4712-
4713-#ifdef INCLUDE_XINE_DRIVER_HACK
4714- // by default, don't use the hack
4715- miro_using_xv_driver_hack = 0;
4716- if (xine->videoPort) {
4717- // if we're using the hack and the driver is "xv", then
4718- // we turn the hack on.
4719- if (use_xv_hack && !strncmp("xv", driver, 3)) {
4720- miro_using_xv_driver_hack = 1;
4721- }
4722- }
4723-#endif
4724- } else {
4725- xine->videoPort = xine_open_video_driver(xine->xine, driver,
4726- XINE_VISUAL_TYPE_NONE, NULL);
4727- }
4728-
4729- xine->audioPort = xine_open_audio_driver(xine->xine, "auto", NULL);
4730-
4731- /* open a xine stream connected to these ports */
4732- xine->stream = xine_stream_new(xine->xine, xine->audioPort,
4733- xine->videoPort);
4734- /* hook our event handler into the streams events */
4735- xine->eventQueue = xine_event_new_queue(xine->stream);
4736- xine_event_create_listener_thread(xine->eventQueue,
4737- xine->event_callback, xine->event_callback_data);
4738-
4739- if (d != 0) {
4740- xine_port_send_gui_data(xine->videoPort, XINE_GUI_SEND_DRAWABLE_CHANGED,
4741- (void *)d);
4742- xine_port_send_gui_data(xine->videoPort, XINE_GUI_SEND_VIDEOWIN_VISIBLE,
4743- (void *) 1);
4744- }
4745-
4746- xine->attached = 1;
4747- _xineSwitchToNormal (xine);
4748-}
4749-
4750-void xineDetach(_Xine* xine)
4751-{
4752- xine_event_queue_t* eventQueue;
4753-#ifdef INCLUDE_XINE_DRIVER_HACK
4754- xv_driver_t* driver;
4755- xine_list_iterator_t ite;
4756-#endif
4757-
4758- if(!xine->attached) return;
4759-
4760- if (xine->drawable != 0) {
4761-#ifdef INCLUDE_XINE_DRIVER_HACK
4762- // HACK ALERT! For some reason, setting the XV port attributes
4763- //causes problems with certain xine-lib/X11 combinations this
4764- //caused #7132
4765-
4766- if (miro_using_xv_driver_hack) {
4767-
4768- driver = (xv_driver_t*)xine->videoPort->driver;
4769-
4770- while ((ite = miro_xine_list_front(driver->port_attributes)) != NULL) {
4771- miro_xine_list_remove (driver->port_attributes, ite);
4772- }
4773- }
4774-#endif
4775- }
4776- xine_close(xine->stream);
4777- xine_dispose(xine->stream);
4778- xine_close_audio_driver(xine->xine, xine->audioPort);
4779- xine_close_video_driver(xine->xine, xine->videoPort);
4780- if (xine->drawable != 0) {
4781- XCloseDisplay(xine->display);
4782- }
4783- xine->attached = 0;
4784-
4785- /* Save this so that no one accesses xine twice at once. */
4786- eventQueue = xine->eventQueue;
4787- /* Allow threads, since xine_event_dispose_queue joins on the queue thread. */
4788- Py_BEGIN_ALLOW_THREADS
4789- xine_event_dispose_queue(eventQueue);
4790- Py_END_ALLOW_THREADS
4791-}
4792-
4793-/**
4794- * Sets up this xine instance as a sniffer.
4795- */
4796-void xineSetupSniffer(_Xine* xine)
4797-{
4798- xine->videoPort = xine_open_video_driver(xine->xine, "auto",
4799- XINE_VISUAL_TYPE_NONE, NULL);
4800- xine->audioPort = xine_open_audio_driver(xine->xine, "none", NULL);
4801- xine->stream = xine_stream_new(xine->xine, xine->audioPort, xine->videoPort);
4802-}
4803-
4804-void xineSetArea(_Xine* xine, int xpos, int ypos, int width, int height)
4805-{
4806- g_mutex_lock(xine->frameInfo.lock);
4807- xine->frameInfo.xpos = xpos;
4808- xine->frameInfo.ypos = ypos;
4809- xine->frameInfo.width = width;
4810- xine->frameInfo.height = height;
4811- g_mutex_unlock(xine->frameInfo.lock);
4812-}
4813-
4814-int xineGetType(_Xine* xine, const char* filename)
4815-{
4816- xine_close(xine->stream);
4817- if (!xine_open(xine->stream, filename)) {
4818- return -1;
4819- }
4820- if (xine_get_stream_info(xine->stream, XINE_STREAM_INFO_HAS_VIDEO)) {
4821- return 0;
4822- }
4823- if (xine_get_stream_info(xine->stream, XINE_STREAM_INFO_HAS_AUDIO)) {
4824- return 1;
4825- }
4826- return 2;
4827-}
4828-
4829-int xineSelectFile(_Xine* xine, const char* filename)
4830-{
4831- if(!xine->attached) return;
4832- xine_close(xine->stream);
4833- if (!xine_open(xine->stream, filename)) {
4834- return 0;
4835- }
4836- if (xine_get_stream_info (xine->stream, XINE_STREAM_INFO_HAS_VIDEO)) {
4837- _xineSwitchToNormal(xine);
4838- } else {
4839- _xineSwitchToViz(xine);
4840- }
4841- return 1;
4842-}
4843-
4844-void xineSeek(_Xine* xine, int position)
4845-{
4846- if(!xine->attached) return;
4847- xine_play(xine->stream, 0, position);
4848-}
4849-
4850-void xineSetPlaying(_Xine* xine, int isPlaying)
4851-{
4852- if(!xine->attached) return;
4853- if(isPlaying) {
4854- xine_set_param(xine->stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
4855- } else {
4856- xine_set_param(xine->stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
4857- }
4858-}
4859-
4860-void xineSetViz (_Xine* xine, const char *viz)
4861-{
4862- if (!strcmp(viz, "none") || viz[0] == 0) {
4863- xine->viz_name = NULL;
4864- } else {
4865- viz = viz_available (xine, viz);
4866- if (viz)
4867- xine->viz_name = viz;
4868- else
4869- xine->viz_name = xine->viz_available [0];
4870- }
4871-}
4872-
4873-void xineSetVolume(_Xine* xine, int volume)
4874-{
4875- if(!xine->attached) return;
4876- xine_set_param(xine->stream, XINE_PARAM_AUDIO_AMP_LEVEL, volume);
4877-}
4878-
4879-int xineGetVolume(_Xine* xine)
4880-{
4881- if(!xine->attached) return 0;
4882- return xine_get_param(xine->stream, XINE_PARAM_AUDIO_AMP_LEVEL);
4883-}
4884-
4885-void xineGotExposeEvent(_Xine* xine, int x, int y, int width, int height)
4886-{
4887- XExposeEvent expose;
4888-
4889- if(!xine->attached) return;
4890- /* set as much of the XExposeEvent as we can. Some fields like serial
4891- * won't be filled in, but this doesn't cause problems in practice. Totem
4892- * doesn't fill in anything, so our method can't be too bad. */
4893- memset(&expose, 0, sizeof(XExposeEvent));
4894- expose.x = x;
4895- expose.y = y;
4896- expose.width = width;
4897- expose.height = height;
4898- expose.display = xine->display;
4899- expose.window = xine->drawable;
4900- xine_port_send_gui_data(xine->videoPort, XINE_GUI_SEND_EXPOSE_EVENT,
4901- &expose);
4902-}
4903-
4904-int xineGetPosLength(_Xine* xine, int* position, int* length)
4905-{
4906- int dummy;
4907- if(!xine->attached) {
4908- return 0; // This should cause an exception to be raised upstream
4909- }
4910- return xine_get_pos_length(xine->stream, &dummy, position, length);
4911-}
4912-
4913-char *xineVersion()
4914-{
4915- return xine_get_version_string();
4916-}
4917
4918=== removed file 'platform/gtk-x11/xine/xine_impl.h'
4919--- platform/gtk-x11/xine/xine_impl.h 2009-10-25 00:24:34 +0000
4920+++ platform/gtk-x11/xine/xine_impl.h 1970-01-01 00:00:00 +0000
4921@@ -1,273 +0,0 @@
4922-/*
4923-# Miro - an RSS based video player application
4924-# Copyright (C) 2005-2009 Participatory Culture Foundation
4925-#
4926-# This program is free software; you can redistribute it and/or modify
4927-# it under the terms of the GNU General Public License as published by
4928-# the Free Software Foundation; either version 2 of the License, or
4929-# (at your option) any later version.
4930-#
4931-# This program is distributed in the hope that it will be useful,
4932-# but WITHOUT ANY WARRANTY; without even the implied warranty of
4933-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4934-# GNU General Public License for more details.
4935-#
4936-# You should have received a copy of the GNU General Public License
4937-# along with this program; if not, write to the Free Software
4938-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
4939-#
4940-# In addition, as a special exception, the copyright holders give
4941-# permission to link the code of portions of this program with the OpenSSL
4942-# library.
4943-#
4944-# You must obey the GNU General Public License in all respects for all of
4945-# the code used other than OpenSSL. If you modify file(s) with this
4946-# exception, you may extend this exception to your version of the file(s),
4947-# but you are not obligated to do so. If you do not wish to do so, delete
4948-# this exception statement from your version. If you delete this exception
4949-# statement from all source files in the program, then also delete it here.
4950-*/
4951-
4952-/**************************************************************************
4953- * xine_impl.h
4954- *
4955- * Implementations for the Xine class's methods.
4956- *
4957- * Almost all the work for the Xine class gets done in xine_impl.c. xine.pyx
4958- * then wraps the functions. This keeps xine.pyx from overflowing with "cdef
4959- * extern ..." statements
4960- *
4961- **************************************************************************/
4962-
4963-#include <glib.h>
4964-#include <X11/Xlib.h>
4965-#include <X11/extensions/XShm.h>
4966-#include <X11/extensions/Xvlib.h>
4967-#include <X11/Xutil.h>
4968-
4969-#define XINE_ENABLE_EXPERIMENTAL_FEATURES 1
4970-#include <xine/video_out.h>
4971-#include <xine/configfile.h>
4972-#include <xine/vo_scale.h>
4973-#include <xine/alphablend.h>
4974-
4975-// Taken from XINE headers
4976-#ifdef INCLUDE_XINE_DRIVER_HACK
4977-typedef struct xine_list_chunk_s xine_list_chunk_t;
4978-typedef struct xine_list_s xine_list_t;
4979-typedef void* xine_list_iterator_t;
4980-typedef struct xine_list_elem_s xine_list_elem_t;
4981-
4982-struct xine_list_chunk_s {
4983- xine_list_chunk_t *next_chunk; /* singly linked list of chunks */
4984-
4985- xine_list_elem_t *elem_array; /* the allocated elements */
4986- int chunk_size; /* element count in the chunk */
4987- int current_elem_id; /* next free elem in the chunk */
4988-};
4989-
4990-struct xine_list_s {
4991- /* list of chunks */
4992- xine_list_chunk_t *chunk_list;
4993- size_t chunk_list_size;
4994- xine_list_chunk_t *last_chunk;
4995-
4996- /* list elements */
4997- xine_list_elem_t *elem_list_front;
4998- xine_list_elem_t *elem_list_back;
4999- size_t elem_list_size;
5000-
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: