summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBritney Fransen <brfransen@gmail.com>2019-03-19 20:11:10 (GMT)
committerBritney Fransen <brfransen@gmail.com>2019-03-19 20:11:10 (GMT)
commit73cfb83a5baecfe0529fda59ca57233d8843f783 (patch)
tree2dba2103a6f6e43912fc645ca8b48a85ab500ad2
parent7b41a9288f5d1332c8136df798bb8ca2465bc21c (diff)
parent448cb8d0708224d78c24ce3615dc7eef44d4689b (diff)
downloadlinhes_pkgbuild-73cfb83a5baecfe0529fda59ca57233d8843f783.zip
linhes_pkgbuild-73cfb83a5baecfe0529fda59ca57233d8843f783.tar.gz
linhes_pkgbuild-73cfb83a5baecfe0529fda59ca57233d8843f783.tar.bz2
Merge branch 'testing'
-rw-r--r--abs/core/LinHES-config/LinHES-release2
-rwxr-xr-xabs/core/LinHES-config/PKGBUILD10
-rwxr-xr-xabs/core/LinHES-config/xconfig.sh160
-rwxr-xr-xabs/core/LinHES-system/PKGBUILD8
-rwxr-xr-x[-rw-r--r--]abs/core/LinHES-system/lh_system_backup_job0
-rwxr-xr-x[-rw-r--r--]abs/core/LinHES-system/lh_system_restore_job12
-rw-r--r--abs/core/LinHES-system/myth_status.py7
-rw-r--r--abs/core/ca-certificates-cacert/LICENSE34
-rw-r--r--abs/core/ca-certificates-cacert/PKGBUILD26
-rw-r--r--abs/core/ca-certificates-cacert/ca-certificates-cacert.install11
-rw-r--r--abs/core/ca-certificates/PKGBUILD65
-rw-r--r--abs/core/ca-certificates/ca-certificates-utils.install44
-rw-r--r--abs/core/ca-certificates/update-ca-trust37
-rw-r--r--abs/core/ca-certificates/update-ca-trust.8.txt75
-rw-r--r--abs/core/ca-certificates/update-ca-trust.hook11
-rwxr-xr-xabs/core/ceton_infinitv/PKGBUILD4
-rw-r--r--abs/core/curl/0001-connection_check-restore-original-conn-data-after-th.patch77
-rw-r--r--abs/core/curl/0001-connection_check-set-data-to-the-transfer-doing-the-.patch31
-rw-r--r--abs/core/curl/0001-multi-remove-verbose-Expire-in-messages.patch26
-rw-r--r--abs/core/curl/0001-singlesocket-fix-the-sincebefore-placement.patch52
-rw-r--r--abs/core/curl/PKGBUILD43
-rw-r--r--abs/core/ffmpeg/PKGBUILD125
-rw-r--r--abs/core/freetype2/0001-Enable-table-validation-modules.patch12
-rw-r--r--abs/core/freetype2/0001-psaux-Correctly-handle-Flex-features-52846.patch38
-rw-r--r--abs/core/freetype2/0002-Enable-infinality-subpixel-hinting.patch14
-rw-r--r--abs/core/freetype2/0003-Enable-long-PCF-family-names.patch14
-rw-r--r--abs/core/freetype2/PKGBUILD23
-rw-r--r--abs/core/gdk-pixbuf2/PKGBUILD55
-rw-r--r--abs/core/gdk-pixbuf2/gdk-pixbuf-query-loaders.hook11
-rw-r--r--abs/core/gdk-pixbuf2/gdk-pixbuf2.install10
-rw-r--r--abs/core/glib2/PKGBUILD101
-rw-r--r--abs/core/glib2/gio-querymodules.hook11
-rw-r--r--abs/core/glib2/glib-compile-schemas.hook12
-rw-r--r--abs/core/glib2/memleak.patch25
-rw-r--r--abs/core/glib2/noisy-glib-compile-schemas.diff24
-rw-r--r--abs/core/glib2/revert-warn-glib-compile-schemas.patch33
-rw-r--r--abs/core/gobject-introspection/PKGBUILD66
-rw-r--r--abs/core/intltool/PKGBUILD24
-rw-r--r--abs/core/intltool/intltool-0.51.0-perl-5.26.patch51
-rw-r--r--abs/core/intltool/intltool-merge-Create-cache-file-atomically.patch38
-rw-r--r--abs/core/intltool/intltool_distcheck-fix.patch30
-rw-r--r--abs/core/libass/PKGBUILD12
-rw-r--r--abs/core/libdrm/PKGBUILD26
-rw-r--r--abs/core/libdrm/fix_mistake_in_initial_hole_size_calculation.diff39
-rw-r--r--abs/core/libdvdnav/PKGBUILD20
-rw-r--r--abs/core/libdvdnav/fix-crash-describe_title.patch29
-rw-r--r--abs/core/libdvdread/PKGBUILD16
-rw-r--r--abs/core/libglvnd/PKGBUILD7
-rw-r--r--abs/core/libglvnd/__changelog1
-rw-r--r--abs/core/libhdhomerun/PKGBUILD4
-rw-r--r--abs/core/libidn2/PKGBUILD15
-rw-r--r--abs/core/libpsl/PKGBUILD7
-rw-r--r--abs/core/libxml2/PKGBUILD19
-rw-r--r--abs/core/libxml2/libxml2-2.9.4-remove-pyverify_fd.patch12
-rw-r--r--abs/core/libxslt/PKGBUILD7
-rw-r--r--abs/core/lighttpd/PKGBUILD6
-rwxr-xr-xabs/core/linhes-theme/PKGBUILD12
-rw-r--r--abs/core/linhes-theme/schedule-ui.xml.patch11
-rw-r--r--abs/core/linhes-theme/standardsetting-ui.xml13
-rw-r--r--abs/core/linhes-theme/video-ui.xml.patch11
-rw-r--r--abs/core/linux/PKGBUILD7
-rw-r--r--abs/core/linux/linux.install.pkg2
-rw-r--r--abs/core/mesa/0001-glvnd-fix-gl-dot-pc.patch12
-rw-r--r--abs/core/mesa/LICENSE87
-rw-r--r--abs/core/mesa/PKGBUILD232
-rw-r--r--abs/core/mesa/get-program-name-based-on-path.patch58
-rw-r--r--abs/core/mplayer/PKGBUILD10
-rwxr-xr-xabs/core/mythdb-initial/PKGBUILD8
-rw-r--r--abs/core/mythdb-initial/custom.sql4
-rw-r--r--abs/core/mythdb-initial/mc.sql13
-rw-r--r--abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.cpp162
-rw-r--r--abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.h83
-rw-r--r--abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.cpp701
-rw-r--r--abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.h274
-rwxr-xr-xabs/core/mythinstall/MythVantage-app/mythinstall/mythinstall.pro19
-rw-r--r--abs/core/mythinstall/MythVantage-app/mythinstall/settings.cpp1236
-rw-r--r--abs/core/mythinstall/MythVantage-app/mythinstall/settings.h835
-rw-r--r--abs/core/mythinstall/PKGBUILD10
-rw-r--r--abs/core/mythtv/stable-29/git_src/git_hash2
-rw-r--r--abs/core/mythtv/stable-29/mythplugins/PKGBUILD2
-rw-r--r--abs/core/mythtv/stable-29/mythtv/PKGBUILD2
-rwxr-xr-xabs/core/mythtv/stable-30/git_src/checkout_mythtv.sh40
-rwxr-xr-xabs/core/mythtv/stable-30/git_src/checkout_mythweb.sh38
-rw-r--r--abs/core/mythtv/stable-30/git_src/git_hash1
-rw-r--r--abs/core/mythtv/stable-30/git_src/git_hash_web1
-rw-r--r--abs/core/mythtv/stable-30/mythplugins/0317-0336-MythMusic-Fix-Playlist-copyTracks-and-removeAllTrack.patch50
-rw-r--r--abs/core/mythtv/stable-30/mythplugins/PKGBUILD139
-rw-r--r--abs/core/mythtv/stable-30/mythplugins/mythburn.cpp-python2.patch13
-rw-r--r--abs/core/mythtv/stable-30/mythplugins/mythburn.py-aspectratio.patch138
-rw-r--r--abs/core/mythtv/stable-30/mythplugins/mythmusic_en_us.ts_Title_Case.patch2895
-rw-r--r--abs/core/mythtv/stable-30/mythplugins/mythplugins-mythzoneminder.install11
-rw-r--r--abs/core/mythtv/stable-30/mythtv/0031-UPnP-Reduce-startup-latency-by-moving-blocking-code-to-own-thread.patch82
-rw-r--r--abs/core/mythtv/stable-30/mythtv/0227-OSD-Add-interlaced-status-to-OSD-debug-screen.patch19
-rw-r--r--abs/core/mythtv/stable-30/mythtv/0294-0283-FE-Add-network-status-to-machine-status-dialog.patch71
-rw-r--r--abs/core/mythtv/stable-30/mythtv/PKGBUILD144
-rw-r--r--abs/core/mythtv/stable-30/mythtv/addEnableDisableAutoShutdownToSystemMenu.patch50
-rw-r--r--abs/core/mythtv/stable-30/mythtv/addHostnameIPtoMachineStatus.patch88
-rw-r--r--abs/core/mythtv/stable-30/mythtv/autoskip_reduce_commskip_jumpback.patch13
-rw-r--r--abs/core/mythtv/stable-30/mythtv/change_msg_types.patch20
-rw-r--r--abs/core/mythtv/stable-30/mythtv/defaultThemeLinHES.patch11
-rw-r--r--abs/core/mythtv/stable-30/mythtv/disable_mythnotification_tuner_failure.patch43
-rw-r--r--abs/core/mythtv/stable-30/mythtv/fixTranslations.patch130
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/HOST_SETTINGS.xml114
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/dvd_backup.xml39
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/game.xml12
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/info_menu.xml76
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/is.xml3
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/lh_backend_control.xml24
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/library.xml.patch25
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/linhes.xml70
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/linhes_tools.xml31
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/mainmenu.xml.patch15
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/mythbackup.xml22
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/mythrestore.xml24
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/optical_menu.xml.patch23
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/original/create_patch.sh5
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/siriusmenu.xml.del419
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/update.xml11
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/update2.xml25
-rw-r--r--abs/core/mythtv/stable-30/mythtv/menu-xml/xmmenu.xml.del574
-rw-r--r--abs/core/mythtv/stable-30/mythtv/myth_settings.patch1960
-rw-r--r--abs/core/mythtv/stable-30/mythtv/mythfrontend_en_us.ts_Title_Case.patch29547
-rw-r--r--abs/core/mythtv/stable-30/mythtv/mythtv.install34
-rw-r--r--abs/core/mythtv/stable-30/mythtv/pull103-Add-heuristic-in-TMDB-script-to-detect-movie-release-years.patch39
-rw-r--r--abs/core/mythtv/stable-30/mythtv/recordings145
-rw-r--r--abs/core/mythtv/stable-30/mythtv/revertQTsettingsForMythinstall.patch1118
-rw-r--r--abs/core/mythtv/stable-30/mythtv/searchMetatdataSelectedGrabber.patch18
-rw-r--r--abs/core/mythtv/stable-30/mythtv/suggestedstarttime.patch.v132
-rw-r--r--abs/core/mythtv/stable-30/mythtv/videoAlwaysUseBookmark.patch22
-rw-r--r--abs/core/mythtv/stable-30/mythweb/Channel.php_remove_small_icons.patch14
-rw-r--r--abs/core/mythtv/stable-30/mythweb/PKGBUILD60
-rw-r--r--abs/core/mythtv/stable-30/mythweb/mythweb.include8
-rw-r--r--abs/core/mythtv/stable-30/mythweb/mythweb.install22
-rw-r--r--abs/core/mythtv/stable-30/mythweb/mythweb_gen_light.conf1
-rw-r--r--abs/core/mythtv/stable-30/mythweb/video.css.patch98
-rw-r--r--abs/core/nano/PKGBUILD7
-rw-r--r--abs/core/nasm/PKGBUILD29
-rw-r--r--abs/core/nasm/nasm.install20
-rw-r--r--abs/core/nvidia-304xx/PKGBUILD2
-rw-r--r--abs/core/nvidia-340xx-settings/PKGBUILD62
-rw-r--r--abs/core/nvidia-340xx-settings/libxnvctrl_so.patch56
-rw-r--r--abs/core/nvidia-340xx-utils/PKGBUILD15
-rw-r--r--abs/core/nvidia-340xx-utils/__changelog1
-rw-r--r--abs/core/nvidia-340xx/PKGBUILD6
-rw-r--r--abs/core/nvidia-390xx-settings/PKGBUILD64
-rw-r--r--abs/core/nvidia-390xx-settings/libxnvctrl_so.patch (renamed from abs/extra/nvidia-settings/libxnvctrl_so.patch)0
-rw-r--r--abs/core/nvidia-390xx-utils/PKGBUILD168
-rw-r--r--abs/core/nvidia-390xx-utils/nvidia-390xx-utils.install7
-rw-r--r--abs/core/nvidia-390xx-utils/nvidia-390xx-utils.sysusers1
-rw-r--r--abs/core/nvidia-390xx-utils/nvidia-drm-outputclass.conf15
-rw-r--r--abs/core/nvidia-390xx/PKGBUILD87
-rw-r--r--abs/core/nvidia-390xx/kernel-4.16.patch33
-rw-r--r--abs/core/nvidia-settings/PKGBUILD (renamed from abs/extra/nvidia-settings/PKGBUILD)5
-rw-r--r--abs/core/nvidia-settings/libxnvctrl_so.patch67
-rw-r--r--abs/core/nvidia-utils/PKGBUILD35
-rw-r--r--abs/core/nvidia/PKGBUILD21
-rw-r--r--abs/core/openssl-1.0/PKGBUILD5
-rw-r--r--abs/core/openssl/PKGBUILD22
-rw-r--r--abs/core/openssl/ca-dir.patch12
-rw-r--r--abs/core/pango/PKGBUILD45
-rw-r--r--abs/core/pango/pango.install8
-rw-r--r--abs/core/perl_modules/perl-font-ttf/PKGBUILD40
-rw-r--r--abs/core/perl_modules/perl-io-string/PKGBUILD28
-rw-r--r--abs/core/perl_modules/perl-sort-versions/PKGBUILD35
-rw-r--r--abs/core/python/PKGBUILD21
-rw-r--r--abs/core/python/__changelog1
-rw-r--r--abs/core/python_modules/python-anytree/PKGBUILD46
-rw-r--r--abs/core/python_modules/python-lxml/PKGBUILD9
-rw-r--r--abs/core/python_modules/python-pycryptodomex/PKGBUILD49
-rw-r--r--abs/core/python_modules/python-pygments/PKGBUILD5
-rw-r--r--abs/core/sudo/PKGBUILD5
-rwxr-xr-xabs/core/system-templates/PKGBUILD6
-rw-r--r--abs/core/system-templates/templates/remotes/favorites/streamzap/Lircmap.xml2
-rw-r--r--abs/core/system-templates/templates/remotes/favorites/streamzap/lircrc8
-rw-r--r--abs/core/system-templates/templates/xorg/340xx_supported.txt14
-rw-r--r--abs/core/system-templates/templates/xorg/390xx_supported.txt923
-rw-r--r--abs/core/system-templates/templates/xorg/nvidia_supported.txt623
-rw-r--r--abs/core/wget/PKGBUILD8
-rw-r--r--abs/core/wpa_supplicant/0009-WPA-Ignore-unauthenticated-encrypted-EAPOL-Key-data.patch44
-rw-r--r--abs/core/wpa_supplicant/PKGBUILD9
-rw-r--r--abs/core/x264/PKGBUILD82
-rw-r--r--abs/core/x265/PKGBUILD100
-rw-r--r--abs/core/xf86-video-intel/0001-SNA-fix-PRIME-output-support-since-xserver-1.20.patch93
-rw-r--r--abs/core/xf86-video-intel/PKGBUILD17
-rw-r--r--abs/extra/adobe-source-sans-pro-fonts/PKGBUILD21
-rw-r--r--abs/extra/ant/PKGBUILD82
-rw-r--r--abs/extra/ant/ant.conf8
-rw-r--r--abs/extra/aom/PKGBUILD48
-rw-r--r--abs/extra/apache-ant/PKGBUILD74
-rw-r--r--abs/extra/apache-ant/ant_diagnostics.patch23
-rw-r--r--abs/extra/apache-ant/apache-ant.csh1
-rw-r--r--abs/extra/apache-ant/apache-ant.sh1
-rw-r--r--abs/extra/appstream-glib/PKGBUILD42
-rw-r--r--abs/extra/bubblewrap/PKGBUILD36
-rw-r--r--abs/extra/cantarell-fonts/PKGBUILD37
-rw-r--r--abs/extra/ccache/PKGBUILD51
-rw-r--r--abs/extra/clang/PKGBUILD106
-rw-r--r--abs/extra/clang/enable-SSP-and-PIE-by-default.patch (renamed from abs/extra/llvm/0002-Enable-SSP-and-PIE-by-default.patch)118
-rw-r--r--abs/extra/compiler-rt/PKGBUILD47
-rw-r--r--abs/extra/docbook-xml/PKGBUILD361
-rw-r--r--abs/extra/docbook-xsl/765567_non-recursive_string_subst.patch32
-rw-r--r--abs/extra/docbook-xsl/PKGBUILD49
-rw-r--r--abs/extra/docbook-xsl/docbook-xsl.install18
-rw-r--r--abs/extra/dune/PKGBUILD38
-rw-r--r--abs/extra/egl-wayland/10_nvidia_wayland.json6
-rw-r--r--abs/extra/egl-wayland/PKGBUILD44
-rw-r--r--abs/extra/eglexternalplatform/PKGBUILD33
-rw-r--r--abs/extra/emacs-nox/0001-Ignore-color-fonts-when-using-Xft.patch72
-rw-r--r--abs/extra/emacs-nox/0001-Port-FC_COLOR-change-to-older-fontconfig.patch32
-rw-r--r--abs/extra/emacs-nox/0001-src-ftfont.c-ftfont_spec_pattern-Fix-whitespace.patch25
-rw-r--r--abs/extra/emacs-nox/PKGBUILD55
-rw-r--r--abs/extra/emacs-nox/emacs-nox.changelog56
-rw-r--r--abs/extra/ffmpeg2.8/PKGBUILD4
-rw-r--r--abs/extra/ffnvcodec-headers/PKGBUILD26
-rw-r--r--abs/extra/fmt/PKGBUILD48
-rw-r--r--abs/extra/gcab/PKGBUILD36
-rw-r--r--abs/extra/glances/PKGBUILD4
-rw-r--r--abs/extra/google-chrome/.SRCINFO32
-rw-r--r--abs/extra/google-chrome/PKGBUILD4
-rwxr-xr-xabs/extra/google-chrome/update_version.sh31
-rw-r--r--abs/extra/gtk-doc/PKGBUILD46
-rw-r--r--abs/extra/gtk3/0001-x11-Only-do-cursor-name-fallback-for-standard-names.patch85
-rw-r--r--abs/extra/gtk3/0002-wayland-Only-do-cursor-name-fallback-for-standard-na.patch94
-rw-r--r--abs/extra/gtk3/PKGBUILD106
-rw-r--r--abs/extra/gtk3/gtk-query-immodules-3.0.hook11
-rw-r--r--abs/extra/gtk3/gtk-update-icon-cache.hook13
-rw-r--r--abs/extra/gtk3/gtk-update-icon-cache.install3
-rw-r--r--abs/extra/gtk3/gtk-update-icon-cache.script10
-rw-r--r--abs/extra/gtk3/gtk3.install15
-rw-r--r--abs/extra/handbrake/PKGBUILD26
-rw-r--r--abs/extra/java-common/PKGBUILD24
-rwxr-xr-xabs/extra/java-common/bin_archlinux-java20
-rwxr-xr-xabs/extra/java-common/test_archlinux-java299
-rw-r--r--abs/extra/java-hamcrest/LICENSE.txt27
-rw-r--r--abs/extra/java-hamcrest/PKGBUILD38
-rw-r--r--abs/extra/java8-openjdk/PKGBUILD280
-rw-r--r--abs/extra/java8-openjdk/install_jdk8-openjdk.sh50
-rw-r--r--abs/extra/java8-openjdk/install_jre8-openjdk-headless.sh48
-rw-r--r--abs/extra/java8-openjdk/install_jre8-openjdk.sh42
-rw-r--r--abs/extra/json-glib/PKGBUILD48
-rw-r--r--abs/extra/junit/PKGBUILD16
-rw-r--r--abs/extra/kodi-addon-inputstream-adaptive/PKGBUILD27
-rw-r--r--abs/extra/kodi-addon-pvr-mythtv-git/PKGBUILD64
-rw-r--r--abs/extra/kodi-addon-pvr-mythtv-git/__changelog4
-rw-r--r--abs/extra/kodi-addon-pvr-mythtv-git/p8-platform.patch509
-rw-r--r--abs/extra/kodi-addon-pvr-mythtv/PKGBUILD41
-rw-r--r--abs/extra/kodi/10160.patch22
-rw-r--r--abs/extra/kodi/10775.patch839
-rw-r--r--abs/extra/kodi/9703.patch1432
-rw-r--r--abs/extra/kodi/PKGBUILD210
-rw-r--r--abs/extra/kodi/__changelog1
-rw-r--r--abs/extra/kodi/cheat-sse-build.patch11
-rw-r--r--abs/extra/kodi/cpuinfo4
-rw-r--r--abs/extra/kodi/fix-ftpparse.patch71
-rw-r--r--abs/extra/kodi/fix-python-lib-path.patch29
-rw-r--r--abs/extra/kodi/kodi.install1
-rw-r--r--abs/extra/libbluray/PKGBUILD35
-rw-r--r--abs/extra/libdvdcss/PKGBUILD13
-rw-r--r--abs/extra/libepoxy/PKGBUILD48
-rw-r--r--abs/extra/libepoxy/__changelog1
-rw-r--r--abs/extra/libsass/PKGBUILD28
-rw-r--r--abs/extra/libsoup/PKGBUILD46
-rw-r--r--abs/extra/libsoup/__changelog1
-rw-r--r--abs/extra/libstemmer/PKGBUILD55
-rw-r--r--abs/extra/libstemmer/dynamiclib.patch39
-rw-r--r--abs/extra/libva-intel-driver/427.patch65
-rw-r--r--abs/extra/libva-intel-driver/PKGBUILD43
-rw-r--r--abs/extra/libva/PKGBUILD60
-rw-r--r--abs/extra/libva/not-finding-wl-drm-interface-with-libglvnd.patch48
-rw-r--r--abs/extra/libvpx/PKGBUILD7
-rw-r--r--abs/extra/llvm/0001-GCC-compatibility-Ignore-the-fno-plt-flag.patch37
-rw-r--r--abs/extra/llvm/PKGBUILD207
-rw-r--r--abs/extra/llvm/add-discriminator-to-debuginfo-test.patch25
-rw-r--r--abs/extra/llvm/disable-llvm-symbolizer-test.patch26
-rw-r--r--abs/extra/llvm/rusty-discriminator-thingy.patch57
-rw-r--r--abs/extra/mercurial/PKGBUILD62
-rw-r--r--abs/extra/mercurial/mercurial.profile1
-rw-r--r--abs/extra/meson/0001-tests-skip-objc-nsstring-test-if-gnustep-is-not-inst.patch30
-rw-r--r--abs/extra/meson/4878.patch26
-rw-r--r--abs/extra/meson/PKGBUILD41
-rw-r--r--abs/extra/meson/arch-meson28
-rw-r--r--abs/extra/ninja/PKGBUILD10
-rw-r--r--abs/extra/ocaml-ctypes/PKGBUILD7
-rw-r--r--abs/extra/ocaml-findlib/PKGBUILD19
-rw-r--r--abs/extra/ocaml-findlib/externalmeta6.patch13
-rw-r--r--abs/extra/ocaml-findlib/makefile.patch13
-rw-r--r--abs/extra/ocaml-integers/PKGBUILD30
-rw-r--r--abs/extra/ocaml-result/PKGBUILD32
-rw-r--r--abs/extra/ocaml-topkg/PKGBUILD28
-rw-r--r--abs/extra/ocaml/PKGBUILD7
-rw-r--r--abs/extra/ocamlbuild/PKGBUILD15
-rw-r--r--abs/extra/opam/PKGBUILD36
-rw-r--r--abs/extra/openpht/PKGBUILD2
-rw-r--r--abs/extra/plex-media-server/PKGBUILD6
-rw-r--r--abs/extra/rapidjson/PKGBUILD37
-rw-r--r--abs/extra/sassc/PKGBUILD29
-rw-r--r--abs/extra/screen/PKGBUILD70
-rw-r--r--abs/extra/screen/pam.d (renamed from abs/extra/screen/screen.pam)0
-rw-r--r--abs/extra/screen/screen-4.0.3-caption-colors.patch21
-rw-r--r--abs/extra/screen/screen-4.0.3-long-term.patch24
-rw-r--r--abs/extra/screen/screen.install21
-rw-r--r--abs/extra/screen/tmpfiles.d1
-rw-r--r--abs/extra/source-highlight/PKGBUILD14
-rw-r--r--abs/extra/source-highlight/fix-zsh-highlighting-hangups.patch13
-rw-r--r--abs/extra/ttf-google-fonts-git/PKGBUILD72
-rw-r--r--abs/extra/ttf-google-fonts-git/font.install15
-rw-r--r--abs/extra/wayland-protocols/PKGBUILD17
-rw-r--r--abs/extra/wayland/PKGBUILD47
-rw-r--r--abs/extra/yelp-tools/PKGBUILD33
309 files changed, 48625 insertions, 6369 deletions
diff --git a/abs/core/LinHES-config/LinHES-release b/abs/core/LinHES-config/LinHES-release
index 5afb5ff..203aeb3 100644
--- a/abs/core/LinHES-config/LinHES-release
+++ b/abs/core/LinHES-config/LinHES-release
@@ -1 +1 @@
-LinHES R8.5.2 (Gareth)
+LinHES R8.6.0 (Feeding the Kids)
diff --git a/abs/core/LinHES-config/PKGBUILD b/abs/core/LinHES-config/PKGBUILD
index 424d709..28fa7e3 100755
--- a/abs/core/LinHES-config/PKGBUILD
+++ b/abs/core/LinHES-config/PKGBUILD
@@ -1,6 +1,6 @@
pkgname=LinHES-config
-pkgver=8.5.2
-pkgrel=3
+pkgver=8.6.0
+pkgrel=2
conflicts=(MythVantage-config MythVantage-config-dev LinHES-config-dev LinHes-config )
pkgdesc="Install and configure your system"
depends=('bc' 'libstatgrab' 'mysql-python' 'expect' 'curl' 'dnsutils' 'parted'
@@ -8,7 +8,7 @@ depends=('bc' 'libstatgrab' 'mysql-python' 'expect' 'curl' 'dnsutils' 'parted'
'python2-pexpect' 'python-netifaces' 'xcursor-vanilla-dmz-aa'
'python-iplib' 'sudo' 'setserial' 'udevil' 'balance'
'mythinstall' 'runit-scripts>=8.3-4' )
-arch=('i686' 'x86_64')
+arch=('x86_64')
source=(mv_install.py 09_mythvantge_runit_grub
mv_config.py
@@ -156,11 +156,11 @@ md5sums=('49952a2375b8ee53d8673473f22f8d12'
'27e4fcacca9b9662dd782fbdc92fceea'
'2a7f3b34e522acfd08283b86c8926aba'
'da60447a2a5fe0e6f5aaed2e677281ef'
- '4239a837227ff97a24c5335de47ce029'
+ '29558e4560a305239ae126880b3af810'
'f0376c98a7986897406d393186c0365e'
'157e73d0f90d7b306aba8f5921aeedd3'
'1f58c0393a131f4a8f9a84b3fe08a7e4'
- '03ab4c6af061da01584b450ec83f26ed'
+ '4dd17c4e1ad6047872fab3a37e9997ed'
'5f890ea9bda6aef652d2560ca19dac07'
'ab2aa42c2947148c2b1cac0ade6d1d55'
'd429b59d3cfb37b0624c6a4a71a7c2c0'
diff --git a/abs/core/LinHES-config/xconfig.sh b/abs/core/LinHES-config/xconfig.sh
index 5514b00..f730f95 100755
--- a/abs/core/LinHES-config/xconfig.sh
+++ b/abs/core/LinHES-config/xconfig.sh
@@ -2,29 +2,43 @@
#set -x
#SET DISPLAYRES to force Xres, ENV takes precendent over cmdline
#SET VGACARDTYPE to force card type:
+ #VGACARDTYPE="ati" xconfig.sh
#VGACARDTYPE="intel" xconfig.sh
#VGACARDTYPE="nvidia" xconfig.sh
+ #VGACARDTYPE="nvidia-390xx" xconfig.sh
#VGACARDTYPE="nvidia-340xx" xconfig.sh
#VGACARDTYPE="nvidia-304xx" xconfig.sh
- #VGACARDTYPE="VMware" xconfig.sh
#VGACARDTYPE="vesa" xconfig.sh
+ #VGACARDTYPE="VMware" xconfig.sh
LOGFILE=/tmp/xconfig.log
echo -e "\n\n--------------------------------------------------------------------------------" >> $LOGFILE 2>&1
echo -e `date`"\n" >> $LOGFILE 2>&1
-for i in ati intel mga savage sis unichrome
+#libxnvctrl is needed as a dep of mythtv so must be installed for every driver
+ATI_PKGS="xf86-video-ati libglvnd libxnvctrl"
+INTEL_PKGS="xf86-video-intel libglvnd libxnvctrl"
+NVIDIA_PKGS="nvidia nvidia-utils opencl-nvidia nvidia-settings libglvnd libxnvctrl"
+NVIDIA_390xx_PKGS="nvidia-390xx nvidia-390xx-utils opencl-nvidia-390xx nvidia-390xx-settings libglvnd libxnvctrl-390xx"
+NVIDIA_340xx_PKGS="nvidia-340xx nvidia-340xx-utils opencl-nvidia-340xx nvidia-340xx-settings libglvnd libxnvctrl-340xx"
+NVIDIA_304xx_PKGS="nvidia-304xx nvidia-304xx-utils opencl-nvidia-304xx libglvnd libxnvctrl-340xx"
+NVIDIA_ALL_PKGS=`echo $NVIDIA_PKGS $NVIDIA_390xx_PKGS $NVIDIA_340xx_PKGS $NVIDIA_304xx_PKGS|xargs -n1|sort -u`
+VESA_PKGS="xf86-video-vesa libglvnd libxnvctrl"
+VMWARE_PKGS="xf86-input-vmmouse xf86-video-vmware xf86-video-vesa svga-dri libglvnd libxnvctrl"
+
+for i in ati intel mga savage sis unichrome vmware
do
templist=`echo $i-dri xf86-video-$i`
- NVPKGS=`echo $NVPKGS $templist`
+ OTHER_PKGS=`echo $OTHER_PKGS $templist`
done
BASE=""
MYTH_RUN_STATUS="1"
. /etc/profile
-NVIDIA_304xx="$TEMPLATES/xorg/304xx_supported.txt"
-NVIDIA_340xx="$TEMPLATES/xorg/340xx_supported.txt"
+NVIDIA_304xx_SUPPORTED="$TEMPLATES/xorg/304xx_supported.txt"
+NVIDIA_340xx_SUPPORTED="$TEMPLATES/xorg/340xx_supported.txt"
+NVIDIA_390xx_SUPPORTED="$TEMPLATES/xorg/340xx_supported.txt"
NVIDIA_SUPPORTED="$TEMPLATES/xorg/nvidia_supported.txt"
NVIDIA_DISABLE_MSI="$TEMPLATES/xorg/nvidia_disable_msi.txt"
NVIDIA_MSI_MODPROBE="$BASE/etc/modprobe.d/nvidia_msi.conf"
@@ -77,12 +91,13 @@ function presetupX {
function nvidia_prepare {
[[ -f "$NVIDIA_MSI_MODPROBE" ]] && rm -f "$NVIDIA_MSI_MODPROBE"
- for i in libva-intel-driver mesa-libgl nvidia nvidia-utils nvidia-libgl opencl-nvidia nvidia-settings libxnvctrl libglvnd nvidia-304xx nvidia-304xx-utils nvidia-304xx-libgl opencl-nvidia-304xx nvidia-340xx nvidia-340xx-utils nvidia-340xx-libgl opencl-nvidia-340xx
+ echo "Remove all nvidia pkgs" >> $LOGFILE 2>&1
+ for i in ${NVIDIA_ALL_PKGS}
do
pacman --noconfirm -Rdd $i >> $LOGFILE 2>&1
done
- for i in `echo ${NVPKGS}`
+ for i in ${OTHER_PKGS}
do
pacman --noconfirm -Rc $i >> $LOGFILE 2>&1
done
@@ -108,40 +123,63 @@ function nvidia_driver_install {
if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia" ]]
then
echo "$CARDNAME" | tee -a $LOGFILE
- LIST="nvidia nvidia-utils opencl-nvidia nvidia-settings libglvnd"
- for i in `echo ${LIST}`
+ for i in ${NVIDIA_PKGS}
do
pkg_check $i
done
echo "Installing current nvidia driver" | tee -a $LOGFILE
nvidia_prepare
- pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
+ pacman --noconfirm -S ${NVIDIA_PKGS} >> $LOGFILE 2>&1
if [[ $? != 0 ]]
then
echo "ERROR: Unable to install current nvidia driver" | tee -a $LOGFILE
else
+ echo " Successfully Installed" | tee -a $LOGFILE
INSTALLED=1
fi
fi
if [ $INSTALLED -eq 0 ]
then
- CARDNAME=`grep -i "$CARDID" "$NVIDIA_340xx"`
+ CARDNAME=`grep -i "$CARDID" "$NVIDIA_390xx_SUPPORTED"`
+ if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-390xx" ]]
+ then
+ echo "$CARDNAME" | tee -a $LOGFILE
+ for i in ${NVIDIA_390xx_PKGS}
+ do
+ pkg_check $i
+ done
+ echo "Installing nvidia-390xx driver" | tee -a $LOGFILE
+ nvidia_prepare
+ pacman --noconfirm -S ${NVIDIA_390xx_PKGS} >> $LOGFILE 2>&1
+ if [[ $? != 0 ]]
+ then
+ echo "ERROR: Unable to install nvidia-390xx driver" | tee -a $LOGFILE
+ else
+ echo " Successfully Installed" | tee -a $LOGFILE
+ INSTALLED=1
+ fi
+ fi
+ fi
+
+ if [ $INSTALLED -eq 0 ]
+ then
+ CARDNAME=`grep -i "$CARDID" "$NVIDIA_340xx_SUPPORTED"`
if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-340xx" ]]
then
echo "$CARDNAME" | tee -a $LOGFILE
- LIST="nvidia-340xx nvidia-340xx-utils opencl-nvidia-340xx libglvnd"
- for i in `echo ${LIST}`
+ for i in ${NVIDIA_340xx_PKGS}
do
pkg_check $i
done
echo "Installing nvidia-340xx driver" | tee -a $LOGFILE
nvidia_prepare
- pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
+ pacman --noconfirm -S ${NVIDIA_340xx_PKGS} >> $LOGFILE 2>&1
if [[ $? != 0 ]]
then
echo "ERROR: Unable to install nvidia-340xx driver" | tee -a $LOGFILE
else
+ echo " Successfully Installed" | tee -a $LOGFILE
INSTALLED=1
fi
fi
@@ -149,22 +187,22 @@ function nvidia_driver_install {
if [ $INSTALLED -eq 0 ]
then
- CARDNAME=`grep -i "$CARDID" "$NVIDIA_304xx"`
+ CARDNAME=`grep -i "$CARDID" "$NVIDIA_304xx_SUPPORTED"`
if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-304xx" ]]
then
echo "$CARDNAME" | tee -a $LOGFILE
- LIST="nvidia-304xx nvidia-304xx-utils opencl-nvidia-304xx libglvnd"
- for i in `echo ${LIST}`
+ for i in ${NVIDIA_304xx_PKGS}
do
pkg_check $i
done
echo "Installing nvidia-304xx driver" | tee -a $LOGFILE
nvidia_prepare
- pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
+ pacman --noconfirm -S ${NVIDIA_304xx_PKGS} >> $LOGFILE 2>&1
if [[ $? != 0 ]]
then
echo "ERROR: Unable to install nvidia-304xx driver" | tee -a $LOGFILE
else
+ echo " Successfully Installed" | tee -a $LOGFILE
INSTALLED=1
fi
fi
@@ -173,25 +211,23 @@ function nvidia_driver_install {
if [ $INSTALLED -eq 0 ]
then
#this is a failsafe, can't find the right driver, then use the latest'
- echo " Couldn't find the card id in any list" | tee -a $LOGFILE
- LIST="nvidia nvidia-utils opencl-nvidia nvidia-settings libglvnd"
- for i in `echo ${LIST}`
+ echo "Couldn't find the card ID. Installing current nvidia driver" | tee -a $LOGFILE
+ for i in ${NVIDIA_PKGS}
do
pkg_check $i
done
echo "Installing current nvidia driver" | tee -a $LOGFILE
nvidia_prepare
- pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
+ pacman --noconfirm -S ${NVIDIA_PKGS} >> $LOGFILE 2>&1
if [[ $? != 0 ]]
then
echo "ERROR: Unable to install current nvidia driver" | tee -a $LOGFILE
else
+ echo " Successfully Installed" | tee -a $LOGFILE
INSTALLED=1
fi
fi
- echo "/usr/lib/libXvMCNVIDIA_dynamic.so.1" > "$XVMC_CONFIG"
-
if [ $INSTALLED -eq 1 ]
then
grep -qi "$CARDID" "$NVIDIA_DISABLE_MSI"
@@ -204,37 +240,71 @@ function nvidia_driver_install {
}
function vmware_driver_install {
- LIST="xf86-input-vmmouse xf86-video-vmware xf86-video-vesa svga-dri libglvnd"
- for i in `echo ${LIST}`
+ for i in ${VMWARE_PKGS}
do
pkg_check $i
done
echo "Installing VMware driver" | tee -a $LOGFILE
#this is used to remove nvidia
nvidia_prepare
- for i in `echo ${LIST}`
- do
- pacman -S --noconfirm $i >> $LOGFILE 2>&1
- done
+ pacman --noconfirm -S ${VMWARE_PKGS} >> $LOGFILE 2>&1
+ if [[ $? != 0 ]]
+ then
+ echo "ERROR: Unable to install VMware driver" | tee -a $LOGFILE
+ else
+ echo " Successfully Installed" | tee -a $LOGFILE
+ fi
}
function vesa_driver_install {
- pkg_check xf86-video-vesa
- pkg_check libglvnd
+ for i in ${VESA_PKGS}
+ do
+ pkg_check $i
+ done
echo "Installing Vesa driver" | tee -a $LOGFILE
#this is used to remove nvidia
nvidia_prepare
- pacman -S --noconfirm xf86-video-vesa libglvnd >> $LOGFILE 2>&1
+ pacman --noconfirm -S ${VESA_PKGS} >> $LOGFILE 2>&1
+ if [[ $? != 0 ]]
+ then
+ echo "ERROR: Unable to install vesa driver" | tee -a $LOGFILE
+ else
+ echo " Successfully Installed" | tee -a $LOGFILE
+ fi
}
function intel_driver_install {
- pkg_check xf86-video-intel
- pkg_check libglvnd
+ for i in ${INTEL_PKGS}
+ do
+ pkg_check $i
+ done
echo "Installing Intel driver" | tee -a $LOGFILE
#this is used to remove nvidia
nvidia_prepare
- pacman -S --noconfirm xf86-video-intel libva-intel-driver libglvnd >> $LOGFILE 2>&1
- echo "/usr/lib/libIntelXvMC.so.1" > "$XVMC_CONFIG"
+ pacman --noconfirm -S ${INTEL_PKGS} >> $LOGFILE 2>&1
+ if [[ $? != 0 ]]
+ then
+ echo "ERROR: Unable to install Intel driver" | tee -a $LOGFILE
+ else
+ echo " Successfully Installed" | tee -a $LOGFILE
+ fi
+}
+
+function ati_driver_install {
+ for i in ${ATI_PKGS}
+ do
+ pkg_check $i
+ done
+ echo "Installing ATI driver" | tee -a $LOGFILE
+ #this is used to remove nvidia
+ nvidia_prepare
+ pacman --noconfirm -S ${ATI_PKGS} >> $LOGFILE 2>&1
+ if [[ $? != 0 ]]
+ then
+ echo "ERROR: Unable to install ATI driver" | tee -a $LOGFILE
+ else
+ echo " Successfully Installed" | tee -a $LOGFILE
+ fi
}
function set_res {
@@ -258,7 +328,7 @@ function setupX {
if [ x = x ]
then
case $VGACARDTYPE in
- nvidia|nvidia-340xx|nvidia-304xx)
+ nvidia|nvidia-390xx|nvidia-340xx|nvidia-304xx)
nvidia_driver_install
if [[ $Xres != "Auto" ]]
then
@@ -298,6 +368,18 @@ function setupX {
fi
;;
+ ati)
+ ati_driver_install
+ #cp $TEMPLATES/xorg/xorg.ati /etc/X11/xorg.conf.d/20-automv.conf
+ if [[ $Xres != "Auto" ]]
+ then
+ set_res
+ else
+ echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
+ rm -f /etc/X11/xorg.conf.d/30-screen.conf
+ fi
+ ;;
+
vesa|innotek|*) #leaving this as * and vesa for no real reason other then it's explicit to catch vesa
if [[ $VGACARDTYPE != "vesa" && $VGACARDTYPE != "innotek" ]]
then
@@ -387,8 +469,6 @@ fi
XORG_CONF="/etc/X11/xorg.conf"
-XVMC_CONFIG="/etc/X11/XvMCConfig"
-
pacman_wait
presetupX
diff --git a/abs/core/LinHES-system/PKGBUILD b/abs/core/LinHES-system/PKGBUILD
index 348996b..a236769 100755
--- a/abs/core/LinHES-system/PKGBUILD
+++ b/abs/core/LinHES-system/PKGBUILD
@@ -1,6 +1,6 @@
pkgname=LinHES-system
-pkgver=8.5.2
-pkgrel=3
+pkgver=8.6.0
+pkgrel=1
arch=('x86_64')
install=system.install
pkgdesc="Everything that makes LinHES an automated system"
@@ -91,7 +91,7 @@ md5sums=('c6e6b83a1f4c35ef4501e277657ab2ac'
'542e670e78d117657f93141e9689f54d'
'8da6a7f1703a002f84e66629e847d8a6'
'bb72ab230c7a71706285bd0f31a4fb1f'
- '14352e6d2cd3ed4206b1dff4ff35880d'
+ 'c25915a9c5382122f849a3a11b943010'
'962a3e9eaba2d1466251b7ab0956705d'
'1758aed160de64abfafb28a3a8f3390e'
'33fbebbd546672cedd3c5e7350ab414e'
@@ -99,7 +99,7 @@ md5sums=('c6e6b83a1f4c35ef4501e277657ab2ac'
'3edef50a49a47694bf8add39cc160add'
'01cbbf411d2a585feb71f2881755e5d8'
'f421f670a9c74724037f70d1dabcad00'
- 'bc69a520add58ede9b060c73e67ace13'
+ 'eab2d188992b1ac561e0ba968544d7a3'
'74e17d6f7453c52d56fecaed5c3f6ad5'
'47e093e8cfe4b5b96602358e1f540832'
'727a886a1ba237906f48cda2e4e7844b'
diff --git a/abs/core/LinHES-system/lh_system_backup_job b/abs/core/LinHES-system/lh_system_backup_job
index 8539ff2..8539ff2 100644..100755
--- a/abs/core/LinHES-system/lh_system_backup_job
+++ b/abs/core/LinHES-system/lh_system_backup_job
diff --git a/abs/core/LinHES-system/lh_system_restore_job b/abs/core/LinHES-system/lh_system_restore_job
index da7dbca..f39aeaa 100644..100755
--- a/abs/core/LinHES-system/lh_system_restore_job
+++ b/abs/core/LinHES-system/lh_system_restore_job
@@ -17,8 +17,9 @@ function usage(){
echo "------------------------------------------------------"
echo "This program will restore the database from a system backup."
- echo "Files are expected to be in the $BACKUPDIR"
- echo "usage:"
+ echo "System backup files are expected to be in the $BACKUPDIR"
+ echo ""
+ echo "Usage:"
echo ""
echo "lh_system_restore_job \$filename [cleanup partial]"
echo ""
@@ -26,9 +27,10 @@ function usage(){
echo ""
echo ""
- echo "If the script is called with cleanup, it will cleanup the the restore dir."
- echo "If the script is called with restore, it will restore the dir, and then copy back some settings."
- echo " It's intended to be used with restoring R7 databases only"
+ echo "If the script is called with cleanup, it will cleanup the restore dir."
+ echo "If the script is called with partial, it will restore the db,"
+ echo " and then copy back some settings."
+ echo " partial is intended to be used to restore R7 databases only."
echo "------------------------------------------------------"
exit 1
diff --git a/abs/core/LinHES-system/myth_status.py b/abs/core/LinHES-system/myth_status.py
index cd541ca..63328d0 100644
--- a/abs/core/LinHES-system/myth_status.py
+++ b/abs/core/LinHES-system/myth_status.py
@@ -144,11 +144,12 @@ class tuner_recording_status:
a=self.be.getRecorderList()
for i in a:
outline=''
- cmd="select cardtype,hostname from capturecard where cardid=%s;" %i
+ cmd="select cardtype,hostname,displayname from capturecard where cardid=%s;" %i
self.cursor.execute(cmd)
results=self.cursor.fetchall()
type = results[0][0]
hostname = results[0][1]
+ displayname = results[0][2]
id = i
try:
c=self.be.getCurrentRecording(i)
@@ -156,10 +157,10 @@ class tuner_recording_status:
current_recording = "Idle"
else:
current_recording = "Recording %s" %c.title
- outline = " Tuner %s (%s) on %s : %s " %(id, type, hostname, current_recording)
+ outline = " Tuner %s - %s (%s) on %s : %s " %(id, displayname, type, hostname, current_recording)
self.tuner_status_list.append(outline)
except:
- outline = " Tuner %s (%s) on %s : %s " %(id, type, hostname, "Tuner Error")
+ outline = " Tuner %s - %s (%s) on %s : %s " %(id, displayname, type, hostname, "Tuner Error")
self.tuner_status_list.append(outline)
def get_tuner_status(self):
diff --git a/abs/core/ca-certificates-cacert/LICENSE b/abs/core/ca-certificates-cacert/LICENSE
deleted file mode 100644
index d62429c..0000000
--- a/abs/core/ca-certificates-cacert/LICENSE
+++ /dev/null
@@ -1,34 +0,0 @@
-Root Distribution License
-
-1. Terms
-
-"CAcert Inc" means CAcert Incorporated, a non-profit association incorporated in New South Wales, Australia.
-"CAcert Community Agreement" means the agreement entered into by each person wishing to RELY.
-"Member" means a natural or legal person who has agreed to the CAcert Community Agreement.
-"Certificate" means any certificate or like device to which CAcert Inc's digital signature has been affixed.
-"CAcert Root Certificates" means any certificate issued by CAcert Inc to itself for the purposes of signing further CAcert Roots or for signing certificates of Members.
-"RELY" means the human act in taking on a risk or liability on the basis of the claim(s) bound within a certificate issued by CAcert.
-"Embedded" means a certificate that is contained within a software application or hardware system, when and only when, that software application or system is distributed in binary form only.
-
-2. Copyright
-
-CAcert Root Certificates are Copyright CAcert Incorporated. All rights reserved.
-
-3. License
-
-You may copy and distribute CAcert Root Certificates only in accordance with this license.
-
-CAcert Inc grants you a free, non-exclusive license to copy and distribute CAcert Root Certificates in any medium, with or without modification, provided that the following conditions are met:
-
- - Redistributions of Embedded CAcert Root Certificates must take reasonable steps to inform the recipient of the disclaimer in section 4 or reproduce this license and copyright notice in full in the documentation provided with the distribution.
- - Redistributions in all other forms must reproduce this license and copyright notice in full.
-
-4. Disclaimer
-
-THE CACERT ROOT CERTIFICATES ARE PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED TO THE MAXIMUM EXTENT PERMITTED BY LAW. IN NO EVENT SHALL CACERT INC, ITS MEMBERS, AGENTS, SUBSIDIARIES OR RELATED PARTIES BE LIABLE TO THE LICENSEE OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THESE CERTIFICATES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IN ANY EVENT, CACERT'S LIABILITY SHALL NOT EXCEED $1,000.00 AUSTRALIAN DOLLARS.
-
-THIS LICENSE SPECIFICALLY DOES NOT PERMIT YOU TO RELY UPON ANY CERTIFICATES ISSUED BY CACERT INC. IF YOU WISH TO RELY ON CERTIFICATES ISSUED BY CACERT INC, YOU MUST ENTER INTO A SEPARATE AGREEMENT WITH CACERT INC.
-
-5. Statutory Rights
-
-Nothing in this license affects any statutory rights that cannot be waived or limited by contract. In the event that any provision of this license is held to be invalid or unenforceable, the remaining provisions of this license remain in full force and effect.
diff --git a/abs/core/ca-certificates-cacert/PKGBUILD b/abs/core/ca-certificates-cacert/PKGBUILD
deleted file mode 100644
index f8bfeff..0000000
--- a/abs/core/ca-certificates-cacert/PKGBUILD
+++ /dev/null
@@ -1,26 +0,0 @@
-# $Id$
-# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
-
-pkgname=ca-certificates-cacert
-pkgver=20140824
-pkgrel=2
-pkgdesc="CAcert.org root certificates"
-arch=(any)
-url="https://www.cacert.org/index.php?id=3"
-license=('custom:RDL')
-depends=(ca-certificates-utils)
-install=ca-certificates-cacert.install
-source=(CAcert.org_root.crt::http://www.cacert.org/certs/root.crt
- CAcert.org_class3.crt::http://www.cacert.org/certs/class3.crt
- LICENSE)
-sha256sums=('c0e0773a79dceb622ef6410577c19c1e177fb2eb9c623a49340de3c9f1de2560'
- 'f5badaa5da1cc05b110a9492455a2c2790d00c7175dcf3a7bcb5441af71bf84f'
- '2d9007a467e72d437ecfa13cc605c371e98a469f1aac4c890be74f953559833c')
-
-package() {
- local _certdir="$pkgdir/usr/share/ca-certificates/trust-source/anchors"
- install -d "$_certdir"
- install -t "$_certdir" -m644 *.crt
-
- install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
-}
diff --git a/abs/core/ca-certificates-cacert/ca-certificates-cacert.install b/abs/core/ca-certificates-cacert/ca-certificates-cacert.install
deleted file mode 100644
index 433c35a..0000000
--- a/abs/core/ca-certificates-cacert/ca-certificates-cacert.install
+++ /dev/null
@@ -1,11 +0,0 @@
-post_install() {
- usr/bin/update-ca-trust
-}
-
-post_upgrade() {
- post_install
-}
-
-pre_remove() {
- post_install
-}
diff --git a/abs/core/ca-certificates/PKGBUILD b/abs/core/ca-certificates/PKGBUILD
index f377a79..1a7b291 100644
--- a/abs/core/ca-certificates/PKGBUILD
+++ b/abs/core/ca-certificates/PKGBUILD
@@ -1,50 +1,55 @@
-# $Id$
# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
# Contributor: Pierre Schmitz <pierre@archlinux.de>
pkgbase=ca-certificates
pkgname=(ca-certificates-utils ca-certificates)
-pkgver=20150402
+pkgver=20181109
pkgrel=1
-pkgdesc='Common CA certificates'
-arch=('any')
-url='http://pkgs.fedoraproject.org/cgit/ca-certificates.git'
-license=('GPL2')
-makedepends=('asciidoc' 'p11-kit')
-source=(update-ca-trust update-ca-trust.8.txt)
-sha256sums=('746d2cce8ec107fa3b7aaa246d69a7e238c3d2ac5cd82c5aeed996fe9cb0a874'
- '38c10446738c1e99bc95e42fe844a9e95ea106795059fa769f3b4ba82b395929')
+pkgdesc="Common CA certificates"
+url="https://src.fedoraproject.org/rpms/ca-certificates"
+arch=(any)
+license=(GPL2)
+makedepends=(asciidoc p11-kit)
+source=(update-ca-trust update-ca-trust.8.txt update-ca-trust.hook)
+sha256sums=('ba98e00f80f94e2648b66252119d1b0da2339b8c83860cd69738e5c4e2d0fcc3'
+ 'acf571f7d7a9df2149a373017280e8f22d07a2d36600256fa48159d22ab74751'
+ '15eb04e757b7c61c8ee1540fd697771b8ae8e31f92cfb39c260b423101e21af8')
build() {
- asciidoc.py -v -d manpage -b docbook update-ca-trust.8.txt
- xsltproc --nonet -o update-ca-trust.8 /etc/asciidoc/docbook-xsl/manpage.xsl update-ca-trust.8.xml
+ asciidoc.py -v -d manpage -b docbook update-ca-trust.8.txt
+ xsltproc --nonet -o update-ca-trust.8 /etc/asciidoc/docbook-xsl/manpage.xsl update-ca-trust.8.xml
}
package_ca-certificates-utils() {
- pkgdesc+=" (utilities)"
- depends=('bash' 'coreutils' 'findutils' 'p11-kit>=0.23.1')
- install=ca-certificates-utils.install
- provides=(ca-certificates ca-certificates-java)
- conflicts=(ca-certificates-java)
- replaces=(ca-certificates-java)
+ pkgdesc+=" (utilities)"
+ depends=('bash' 'coreutils' 'findutils' 'p11-kit>=0.23.1')
+ provides=(ca-certificates ca-certificates-java)
+ conflicts=(ca-certificates-java)
+ replaces=(ca-certificates-java)
- install -D update-ca-trust "${pkgdir}/usr/bin/update-ca-trust"
- install -Dm644 update-ca-trust.8 "${pkgdir}/usr/share/man/man8/update-ca-trust.8"
+ install -D update-ca-trust "$pkgdir/usr/bin/update-ca-trust"
+ install -Dm644 update-ca-trust.8 "$pkgdir/usr/share/man/man8/update-ca-trust.8"
+ install -Dm644 update-ca-trust.hook "$pkgdir/usr/share/libalpm/hooks/update-ca-trust.hook"
- # Trust source directories
- install -d "${pkgdir}"/{etc,usr/share}/${pkgbase}/trust-source/{anchors,blacklist}
+ # Trust source directories
+ install -d "$pkgdir"/{etc,usr/share}/$pkgbase/trust-source/{anchors,blacklist}
- # Directories used by update-ca-trust (aka "trust extract-compat")
- install -d "${pkgdir}"/etc/{ssl/certs/java,${pkgbase}/extracted}
+ # Directories used by update-ca-trust (aka "trust extract-compat")
+ install -d "$pkgdir"/etc/{ssl/certs/{edk2,java},$pkgbase/extracted}
- # Compatibility link for OpenSSL using /etc/ssl as CAdir
- # Used in preference to the individual links in /etc/ssl/certs
- ln -s ../${pkgbase}/extracted/tls-ca-bundle.pem "${pkgdir}/etc/ssl/cert.pem"
+ # Compatibility link for OpenSSL using /etc/ssl as CAdir
+ # Used in preference to the individual links in /etc/ssl/certs
+ ln -sr "$pkgdir/etc/$pkgbase/extracted/tls-ca-bundle.pem" "$pkgdir/etc/ssl/cert.pem"
+
+ # Compatiblity link for legacy bundle
+ ln -sr "$pkgdir/etc/$pkgbase/extracted/tls-ca-bundle.pem" "$pkgdir/etc/ssl/certs/ca-certificates.crt"
}
package_ca-certificates() {
- pkgdesc+=" (default providers)"
- depends=(ca-certificates-{mozilla,cacert})
+ pkgdesc+=" (default providers)"
+ depends=(ca-certificates-mozilla)
+ replaces=('ca-certificates-cacert<=20140824-4')
+ conflicts=('ca-certificates-cacert<=20140824-4')
}
-# vim:set noet ts=8 sw=8 sts=0:
+# vim:set et sw=2:
diff --git a/abs/core/ca-certificates/ca-certificates-utils.install b/abs/core/ca-certificates/ca-certificates-utils.install
deleted file mode 100644
index 8120878..0000000
--- a/abs/core/ca-certificates/ca-certificates-utils.install
+++ /dev/null
@@ -1,44 +0,0 @@
-export LC_ALL=C
-
-post_install() {
- usr/bin/update-ca-trust
-
- # This should be a normally packaged file, but that would
- # require user intervention at upgrade
- ln -srf etc/ca-certificates/extracted/tls-ca-bundle.pem \
- etc/ssl/certs/ca-certificates.crt
-}
-
-post_upgrade() {
- usr/bin/update-ca-trust
-
- if (( $(vercmp $2 20140923-7.1) < 0 )); then
- cat <<MSG
- The way local CA certificates are handled has changed.
- If you have added any certificates manually:
-
- 1. Move certificates from /usr/local/share/ca-certificates/
- to /etc/ca-certificates/trust-source/anchors/
- 2. Do the same with root certificates added to /etc/ssl/certs/
- 3. Instead of \`update-ca-certificates\`, run \`trust extract-compat\`
-
- Also see \`man 8 update-ca-trust\` and \`trust --help\`.
-MSG
- fi
-
- if (( $(vercmp $2 20150402) < 0 )); then
- ln -srf etc/ca-certificates/extracted/tls-ca-bundle.pem \
- etc/ssl/certs/ca-certificates.crt
-
- # Moved to etc/ca-certificates/extracted
- rm -f etc/ssl/certs/ca-bundle.trust.crt
- fi
-}
-
-pre_remove() {
- usr/bin/update-ca-trust
-
- rm -f etc/ssl/certs/{ca-certificates.crt,java/cacerts}
-}
-
-# vim:set noet ts=8 sw=8 sts=0:
diff --git a/abs/core/ca-certificates/update-ca-trust b/abs/core/ca-certificates/update-ca-trust
index 9a97e34..53441b3 100644
--- a/abs/core/ca-certificates/update-ca-trust
+++ b/abs/core/ca-certificates/update-ca-trust
@@ -1,27 +1,42 @@
#!/bin/bash
# At this time, while this script is trivial, we ignore any parameters given.
-# However, for backwards compatibility reasons, future versions of this script must
-# support the syntax "update-ca-trust extract" trigger the generation of output
+# However, for backwards compatibility reasons, future versions of this script must
+# support the syntax "update-ca-trust extract" trigger the generation of output
# files in $DEST.
DEST=/etc/ca-certificates/extracted
+# Prevent p11-kit from reading user configuration files.
+export P11_KIT_NO_USER_CONFIG=1
+
+extract() {
+ trust extract --overwrite "$@"
+}
+
+## Simple PEM bundles
+extract --comment --format=pem-bundle --filter=ca-anchors --purpose=server-auth $DEST/tls-ca-bundle.pem
+extract --comment --format=pem-bundle --filter=ca-anchors --purpose=email $DEST/email-ca-bundle.pem
+extract --comment --format=pem-bundle --filter=ca-anchors --purpose=code-signing $DEST/objsign-ca-bundle.pem
+
+## OpenSSL PEM bundle that includes trust flags
+extract --comment --format=openssl-bundle --filter=certificates $DEST/ca-bundle.trust.crt
+
+## TianoCore EDK II bundle
+extract --format=edk2-cacerts --filter=ca-anchors --purpose=server-auth $DEST/edk2-cacerts.bin
+
+## Java bundle
+extract --format=java-cacerts --filter=ca-anchors --purpose=server-auth /etc/ssl/certs/java/cacerts
+
+## OpenSSL-style directory with individual PEM files and hash links
# The directory-format extractors remove all files in the target directory, but not directories or files therein
-trust extract --overwrite --format=pem-directory-hash --filter=ca-anchors --purpose server-auth $DEST/cadir
-trust extract --overwrite --format=pem-bundle --filter=ca-anchors --purpose server-auth $DEST/tls-ca-bundle.pem
-trust extract --overwrite --format=pem-bundle --filter=ca-anchors --purpose email $DEST/email-ca-bundle.pem
-trust extract --overwrite --format=pem-bundle --filter=ca-anchors --purpose code-signing $DEST/objsign-ca-bundle.pem
-trust extract --overwrite --format=openssl-bundle --filter=certificates $DEST/ca-bundle.trust.crt
+extract --format=pem-directory-hash --filter=ca-anchors --purpose=server-auth $DEST/cadir
# We don't want to have to remove everything from the certs directory but neither
-# do we want to leave stale certs around, so symlink it all from somewhere else
+# do we want to leave stale certs around, so only place symlinks in the real cadir
for f in $DEST/cadir/*; do
ln -fsr -t /etc/ssl/certs "$f"
done
# Now find and remove all broken symlinks
find -L /etc/ssl/certs -maxdepth 1 -type l -delete
-
-# Java bundle
-trust extract --overwrite --format=java-cacerts --filter=ca-anchors --purpose server-auth /etc/ssl/certs/java/cacerts
diff --git a/abs/core/ca-certificates/update-ca-trust.8.txt b/abs/core/ca-certificates/update-ca-trust.8.txt
index 67e2ba3..ba9c830 100644
--- a/abs/core/ca-certificates/update-ca-trust.8.txt
+++ b/abs/core/ca-certificates/update-ca-trust.8.txt
@@ -74,11 +74,11 @@ will be scanned for any number of source files. *It is important to select
the correct subdirectory for adding files, as the subdirectory defines how
contained certificates will be trusted or distrusted, and which file formats are read.*
-Files in subdirectories below the directory hierarchy /usr/share/ca-certificates/trust-source/ contain CA certificates and
+Files in *subdirectories below the directory hierarchy /usr/share/ca-certificates/trust-source/* contain CA certificates and
trust settings in the PEM file format. The trust settings found here will be
interpreted with a *low priority*.
-Files in subdirectories below the directory hierarchy /etc/ca-certificates/trust-source/ contain CA certificates and
+Files in *subdirectories below the directory hierarchy /etc/ca-certificates/trust-source/* contain CA certificates and
trust settings in the PEM file format. The trust settings found here will be
interpreted with a *high priority*.
@@ -144,7 +144,7 @@ BEGIN/END CERTIFICATE and BEGIN/END TRUSTED CERTIFICATE file formats.
Applications that rely on a static file for a list of trusted CAs
may load one of the files found in the /etc/ssl/certs or /etc/ca-certificates/extracted
-directory. After modifying any file in the
+directories. After modifying any file in the
/usr/share/ca-certificates/trust-source/ or /etc/ca-certificates/trust-source/
directories or in any of their subdirectories, or after adding a file,
it is necessary to run the 'update-ca-trust extract' command,
@@ -161,7 +161,7 @@ the dynamically merged set of certificates and trust information stored in the
[[extractconf]]
EXTRACTED CONFIGURATION
-----------------------
-The directories /etc/ssl/certs and /etc/ca-certificates/extracted/ contains generated CA certificate
+The directories /etc/ssl/certs and /etc/ca-certificates/extracted/ contain generated CA certificate
bundle files which are created and updated, based on the <<sourceconf,SOURCE CONFIGURATION>>
by running the 'update-ca-trust extract' command.
@@ -189,8 +189,13 @@ and distrusted certificates are missing from these files.
File cacerts contains CA certificates trusted for TLS server authentication.
The directory /etc/ca-certificates/extracted contains
+a CA certificate bundle file in the extended BEGIN/END TRUSTED CERTIFICATE file format,
+as described in the x509(1) manual page.
+File ca-bundle.trust.crt contains the full set of all trusted
+or distrusted certificates, including the associated trust flags.
+It also contains
CA certificate bundle files in the simple BEGIN/END CERTIFICATE file format,
-as decribed in the x509(1) manual page.
+as described in the x509(1) manual page.
Distrust information cannot be represented in this file format,
and distrusted certificates are missing from these files.
File tls-ca-bundle.pem contains CA certificates
@@ -199,10 +204,14 @@ File email-ca-bundle.pem contains CA certificates
trusted for E-Mail protection.
File objsign-ca-bundle.pem contains CA certificates
trusted for code signing.
-File ca-bundle.trust.crt contains certificates in the extended
-BEGIN/END TRUSTED CERTIFICATE file format, as described in the x509(1) manual page.
-This bundle contains the full set of all trusted
-and distrusted certificates, including the associated trust flags.
+It also contains a CA
+certificate bundle ("edk2-cacerts.bin") in the "sequence of
+EFI_SIGNATURE_LISTs" format, defined in the UEFI-2.7 specification,
+sections "31.4.1 Signature Database" and
+"EFI_CERT_X509_GUID". Distrust information cannot be represented in
+this file format, and distrusted certificates are missing from these
+files. File "edk2-cacerts.bin" contains CA certificates trusted for TLS
+server authentication.
COMMANDS
@@ -215,11 +224,27 @@ COMMANDS
*extract*::
Instruct update-ca-trust to scan the <<sourceconf,SOURCE CONFIGURATION>> and produce
updated versions of the consolidated configuration files stored below
- the /etc/ssl/certs and /etc/ca-certificates/extracted directory
- hierarchies.
+ the /etc/ssl/certs and /etc/ca-certificates/extracted directory hierarchies.
FILES
-----
+/etc/ssl/certs::
+ Classic directory, files contain individual CA certificates trusted for TLS server authentication usage, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ Also includes the necessary hash symlinks expected by OpenSSL.
+ These files are symbolic links that are maintained by the update-ca-trust command.
+
+/etc/ssl/certs/ca-certificates.crt::
+ Classic filename, file contains a list of CA certificates trusted for TLS server authentication usage, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ This file is a symbolic link that refers to the consolidated output created by the update-ca-trust command.
+
+/etc/ssl/cert.pem::
+ Classic filename, file contains a list of CA certificates trusted for TLS server authentication usage, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ This file is a symbolic link that refers to the consolidated output created by the update-ca-trust command.
+
+/etc/ssl/java/cacerts::
+ Classic filename, file contains a list of CA certificates trusted for TLS server authentication usage, in the Java keystore file format, without distrust information.
+ This file is consolidated output created by the update-ca-trust command.
+
/usr/share/ca-certificates/trust-source::
Contains multiple, low priority source configuration files as explained in section <<sourceconf,SOURCE CONFIGURATION>>. Please pay attention to the specific meanings of the respective subdirectories.
@@ -232,32 +257,28 @@ FILES
See section <<extractconf,EXTRACTED CONFIGURATION>> for additional details.
/etc/ca-certificates/extracted/tls-ca-bundle.pem::
- Contains a list of CA certificates trusted for TLS server authentication, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ File contains a list of CA certificates trusted for TLS server authentication, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ This file is consolidated output created by the update-ca-trust command.
/etc/ca-certificates/extracted/email-ca-bundle.pem::
- Contains a list of CA certificates trusted for E-Mail protection, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ File contains a list of CA certificates trusted for E-Mail protection, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ This file is consolidated output created by the update-ca-trust command.
/etc/ca-certificates/extracted/objsign-ca-bundle.pem::
- Contains a list of CA certificates trusted for code signing, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ File contains a list of CA certificates trusted for code signing, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
+ This file is consolidated output created by the update-ca-trust command.
/etc/ca-certificates/extracted/ca-bundle.trust.crt::
- Contains a list of CA certificates in the extended BEGIN/END TRUSTED CERTIFICATE file format, which includes trust (and/or distrust) flags specific to certificate usage.
+ File contains a list of CA certificates in the extended BEGIN/END TRUSTED CERTIFICATE file format, which includes trust (and/or distrust) flags specific to certificate usage.
+ This file is consolidated output created by the update-ca-trust command.
/etc/ca-certificates/extracted/cadir::
Contains individual CA certificates trusted for TLS server authentication usage, in the simple BEGIN/END CERTIFICATE file format, without distrust information.
- Also includes the necessary hash symlinks expected by OpenSSL.
-
-/etc/ssl/certs::
- Classic directory, contains symlinks into /etc/ca-certificates/extracted/cadir which are maintained by the update-ca-trust command.
+ Also includes the necessary hash symlinks expected by OpenSSL.
+ These files are maintained by the update-ca-trust command.
-/etc/ssl/certs/ca-certificates.crt::
- Classic filename, a symlink to /etc/ca-certificates/extracted/tls-ca-bundle.pem.
-
-/etc/ssl/cert.pem::
- Classic filename, a symlink to /etc/ca-certificates/extracted/tls-ca-bundle.pem.
-
-/etc/ssl/java/cacerts::
- Classic filename, contains a list of CA certificates trusted for TLS server authentication usage, in the Java keystore file format, without distrust information.
+/etc/ca-certificates/extracted/edk2-cacerts.bin::
+ File contains a list of CA certificates trusted for TLS server authentication usage, in the UEFI signature database format, without distrust information.
This file is consolidated output created by the update-ca-trust command.
AUTHOR
diff --git a/abs/core/ca-certificates/update-ca-trust.hook b/abs/core/ca-certificates/update-ca-trust.hook
new file mode 100644
index 0000000..ace8ea8
--- /dev/null
+++ b/abs/core/ca-certificates/update-ca-trust.hook
@@ -0,0 +1,11 @@
+[Trigger]
+Operation = Install
+Operation = Upgrade
+Operation = Remove
+Type = File
+Target = usr/share/ca-certificates/trust-source/*
+
+[Action]
+Description = Rebuilding certificate stores...
+When = PostTransaction
+Exec = /usr/bin/update-ca-trust
diff --git a/abs/core/ceton_infinitv/PKGBUILD b/abs/core/ceton_infinitv/PKGBUILD
index 7264dd9..ff9c6fc 100755
--- a/abs/core/ceton_infinitv/PKGBUILD
+++ b/abs/core/ceton_infinitv/PKGBUILD
@@ -2,10 +2,10 @@
pkgname=ceton_infinitv
#_kernver=`uname -r`
-_kernver=4.9.109-1-ARCH
+_kernver=4.9.159-1-ARCH
_extramods="extramodules-4.9-ARCH"
pkgver=2013.0326.2226
-pkgrel=26
+pkgrel=27
usb_pkgver=0.1.0
pci_pkgver=`echo $pkgver | tr . _`
pkgdesc="Drivers for Ceton InfiniTV4 - pci/usb "
diff --git a/abs/core/curl/0001-connection_check-restore-original-conn-data-after-th.patch b/abs/core/curl/0001-connection_check-restore-original-conn-data-after-th.patch
new file mode 100644
index 0000000..e5ed809
--- /dev/null
+++ b/abs/core/curl/0001-connection_check-restore-original-conn-data-after-th.patch
@@ -0,0 +1,77 @@
+From 4015fae044ce52a639c9358e22a9e948f287c89f Mon Sep 17 00:00:00 2001
+Message-Id: <4015fae044ce52a639c9358e22a9e948f287c89f.1550326608.git.jan.steffens@gmail.com>
+From: Jay Satiro <raysatiro@yahoo.com>
+Date: Mon, 11 Feb 2019 23:00:00 -0500
+Subject: [PATCH] connection_check: restore original conn->data after the check
+
+- Save the original conn->data before it's changed to the specified
+ data transfer for the connection check and then restore it afterwards.
+
+This is a follow-up to 38d8e1b 2019-02-11.
+
+History:
+
+It was discovered a month ago that before checking whether to extract a
+dead connection that that connection should be associated with a "live"
+transfer for the check (ie original conn->data ignored and set to the
+passed in data). A fix was landed in 54b201b which did that and also
+cleared conn->data after the check. The original conn->data was not
+restored, so presumably it was thought that a valid conn->data was no
+longer needed.
+
+Several days later it was discovered that a valid conn->data was needed
+after the check and follow-up fix was landed in bbae24c which partially
+reverted the original fix and attempted to limit the scope of when
+conn->data was changed to only when pruning dead connections. In that
+case conn->data was not cleared and the original conn->data not
+restored.
+
+A month later it was discovered that the original fix was somewhat
+correct; a "live" transfer is needed for the check in all cases
+because original conn->data could be null which could cause a bad deref
+at arbitrary points in the check. A fix was landed in 38d8e1b which
+expanded the scope to all cases. conn->data was not cleared and the
+original conn->data not restored.
+
+A day later it was discovered that not restoring the original conn->data
+may lead to busy loops in applications that use the event interface, and
+given this observation it's a pretty safe assumption that there is some
+code path that still needs the original conn->data. This commit is the
+follow-up fix for that, it restores the original conn->data after the
+connection check.
+
+Assisted-by: tholin@users.noreply.github.com
+Reported-by: tholin@users.noreply.github.com
+
+Fixes https://github.com/curl/curl/issues/3542
+Closes #3559
+---
+ lib/url.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/lib/url.c b/lib/url.c
+index bc47685db..46c8fb5fb 100644
+--- a/lib/url.c
++++ b/lib/url.c
+@@ -964,8 +964,10 @@ static bool extract_if_dead(struct connectdata *conn,
+ /* The protocol has a special method for checking the state of the
+ connection. Use it to check if the connection is dead. */
+ unsigned int state;
++ struct Curl_easy *olddata = conn->data;
+ conn->data = data; /* use this transfer for now */
+ state = conn->handler->connection_check(conn, CONNCHECK_ISDEAD);
++ conn->data = olddata;
+ dead = (state & CONNRESULT_DEAD);
+ }
+ else {
+@@ -994,7 +996,6 @@ struct prunedead {
+ static int call_extract_if_dead(struct connectdata *conn, void *param)
+ {
+ struct prunedead *p = (struct prunedead *)param;
+- conn->data = p->data; /* transfer to use for this check */
+ if(extract_if_dead(conn, p->data)) {
+ /* stop the iteration here, pass back the connection that was extracted */
+ p->extracted = conn;
+--
+2.20.1
+
diff --git a/abs/core/curl/0001-connection_check-set-data-to-the-transfer-doing-the-.patch b/abs/core/curl/0001-connection_check-set-data-to-the-transfer-doing-the-.patch
new file mode 100644
index 0000000..cf486db
--- /dev/null
+++ b/abs/core/curl/0001-connection_check-set-data-to-the-transfer-doing-the-.patch
@@ -0,0 +1,31 @@
+From 38d8e1bd4ed1ae52930ae466ecbac78e888b142f Mon Sep 17 00:00:00 2001
+Message-Id: <38d8e1bd4ed1ae52930ae466ecbac78e888b142f.1550283194.git.jan.steffens@gmail.com>
+From: Daniel Stenberg <daniel@haxx.se>
+Date: Mon, 11 Feb 2019 07:56:00 +0100
+Subject: [PATCH] connection_check: set ->data to the transfer doing the check
+
+The http2 code for connection checking needs a transfer to use. Make
+sure a working one is set before handler->connection_check() is called.
+
+Reported-by: jnbr on github
+Fixes #3541
+Closes #3547
+---
+ lib/url.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/lib/url.c b/lib/url.c
+index bdb472999..bc47685db 100644
+--- a/lib/url.c
++++ b/lib/url.c
+@@ -964,6 +964,7 @@ static bool extract_if_dead(struct connectdata *conn,
+ /* The protocol has a special method for checking the state of the
+ connection. Use it to check if the connection is dead. */
+ unsigned int state;
++ conn->data = data; /* use this transfer for now */
+ state = conn->handler->connection_check(conn, CONNCHECK_ISDEAD);
+ dead = (state & CONNRESULT_DEAD);
+ }
+--
+2.20.1
+
diff --git a/abs/core/curl/0001-multi-remove-verbose-Expire-in-messages.patch b/abs/core/curl/0001-multi-remove-verbose-Expire-in-messages.patch
new file mode 100644
index 0000000..9677787
--- /dev/null
+++ b/abs/core/curl/0001-multi-remove-verbose-Expire-in-messages.patch
@@ -0,0 +1,26 @@
+From aabc7ae5ecf70973add429b5acbc86d6a57e4da5 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel@haxx.se>
+Date: Mon, 11 Feb 2019 22:57:33 +0100
+Subject: [PATCH] multi: remove verbose "Expire in" ... messages
+
+Reported-by: James Brown
+Bug: https://curl.haxx.se/mail/archive-2019-02/0013.html
+Closes #3558
+---
+ lib/multi.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/lib/multi.c b/lib/multi.c
+index 6b891620f6..cd9d758ca4 100644
+--- a/lib/multi.c
++++ b/lib/multi.c
+@@ -3032,9 +3032,6 @@ void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
+
+ DEBUGASSERT(id < EXPIRE_LAST);
+
+- infof(data, "Expire in %ld ms for %x (transfer %p)\n",
+- (long)milli, id, data);
+-
+ set = Curl_now();
+ set.tv_sec += milli/1000;
+ set.tv_usec += (unsigned int)(milli%1000)*1000;
diff --git a/abs/core/curl/0001-singlesocket-fix-the-sincebefore-placement.patch b/abs/core/curl/0001-singlesocket-fix-the-sincebefore-placement.patch
new file mode 100644
index 0000000..ecbed62
--- /dev/null
+++ b/abs/core/curl/0001-singlesocket-fix-the-sincebefore-placement.patch
@@ -0,0 +1,52 @@
+From b7753be57d7bdb6b909f1a0a4207950e18100d79 Mon Sep 17 00:00:00 2001
+Message-Id: <b7753be57d7bdb6b909f1a0a4207950e18100d79.1550588688.git.jan.steffens@gmail.com>
+From: Daniel Stenberg <daniel@haxx.se>
+Date: Tue, 19 Feb 2019 15:56:54 +0100
+Subject: [PATCH] singlesocket: fix the 'sincebefore' placement
+
+The variable wasn't properly reset within the loop and thus could remain
+set for sockets that hadn't been set before and thus missed notifying
+the app.
+
+Detected-by: Jan Alexander Steffens
+Fixes #3585
+---
+ lib/multi.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/multi.c b/lib/multi.c
+index aaae8b978..521262b2b 100644
+--- a/lib/multi.c
++++ b/lib/multi.c
+@@ -2349,26 +2349,26 @@ static CURLMcode singlesocket(struct Curl_multi *multi,
+ int num;
+ unsigned int curraction;
+ int actions[MAX_SOCKSPEREASYHANDLE];
+- unsigned int comboaction;
+- bool sincebefore = FALSE;
+
+ for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
+ socks[i] = CURL_SOCKET_BAD;
+
+ /* Fill in the 'current' struct with the state as it is now: what sockets to
+ supervise and for what actions */
+ curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
+
+ /* We have 0 .. N sockets already and we get to know about the 0 .. M
+ sockets we should have from now on. Detect the differences, remove no
+ longer supervised ones and add new ones */
+
+ /* walk over the sockets we got right now */
+ for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&
+ (curraction & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i)));
+ i++) {
+ unsigned int action = CURL_POLL_NONE;
+ unsigned int prevaction = 0;
++ unsigned int comboaction;
++ bool sincebefore = FALSE;
+
+ s = socks[i];
+
+--
+2.20.1
+
diff --git a/abs/core/curl/PKGBUILD b/abs/core/curl/PKGBUILD
index fed52a2..afa6928 100644
--- a/abs/core/curl/PKGBUILD
+++ b/abs/core/curl/PKGBUILD
@@ -1,4 +1,3 @@
-# $Id$
# Maintainer: Dave Reisner <dreisner@archlinux.org>
# Contributor: Angel Velasquez <angvp@archlinux.org>
# Contributor: Eric Belanger <eric@archlinux.org>
@@ -6,20 +5,41 @@
# Contributor: Daniel J Griffiths <ghost1227@archlinux.us>
pkgname=curl
-pkgver=7.58.0
-pkgrel=2
+pkgver=7.64.0
+pkgrel=9
pkgdesc="An URL retrieval utility and library"
arch=('x86_64')
url="https://curl.haxx.se"
license=('MIT')
-depends=('ca-certificates' 'krb5' 'libssh2' 'openssl' 'zlib' 'libpsl' 'libnghttp2')
+depends=('ca-certificates' 'krb5' 'libssh2' 'openssl' 'zlib' 'libpsl' 'libnghttp2'
+ 'libidn2' 'libidn2.so')
provides=('libcurl.so')
-options=('strip' 'debug')
-source=("https://curl.haxx.se/download/$pkgname-$pkgver.tar.gz"{,.asc})
-sha512sums=('7b12b79107558bb266672d6e128615fe5a8149c37f4ae540197e3298f5d312beb2d78fbb23e3ea84ea7afc41549898a1e5cd38509f0388b11707b48d5efb8ca3'
- 'SKIP')
-validpgpkeys=('27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2' # Daniel Stenberg
- '914C533DF9B2ADA2204F586D78E11C6B279D5C91') # Daniel Stenberg (old key)
+source=("https://curl.haxx.se/download/$pkgname-$pkgver.tar.gz"{,.asc}
+ "0001-connection_check-set-data-to-the-transfer-doing-the-.patch"
+ "0001-connection_check-restore-original-conn-data-after-th.patch"
+ "0001-singlesocket-fix-the-sincebefore-placement.patch"
+ "0001-multi-remove-verbose-Expire-in-messages.patch")
+sha512sums=('ea0e68f9cbf2eb4f235d8506962dcc7709f769ef3526c0e4c130fdaf7186a1a13b303c6ce919cb9125bbf7c64ddf4f8efb3d9269b906f856e6d7b3def027fb81'
+ 'SKIP'
+ 'e9fdd70ec6798f48080582e4cb554fc4cd247075c293c66dcf8b27cab151def1c709c306e4dc8a1439b9843f31fe51248b5d6c7f5183e4af65819a084fddcb1f'
+ 'adcbf6309e5d69ede876966790dd504da3097a9e03fedf77d44e10fddcb24a5eaa29b4c9229c813d54bd0c2141211e46b50ca58d89608f7c391434e469316cbd'
+ '17c8c19e874bfed0736d579300be5a94f87467d1a2c346fe4dca1698fb73c05d02639cf712c95125f32bbd869457d60be4a1ca0f3d5cbc8b091bb35eb2594b15'
+ 'f09b63c36bd958c35bf6e3885efe46fea75fa2780510cac66220bfc1d771de9040560586e0672dac5eb7db7acf67051cf74e56518a8ada6f691c6d8f9dc84fa4')
+validpgpkeys=('27EDEAF22F3ABCEB50DB9A125CC908FDB71E12C2') # Daniel Stenberg
+
+prepare() {
+ cd "$pkgname-$pkgver"
+
+ patch -Np1 < ../0001-multi-remove-verbose-Expire-in-messages.patch
+
+ # Crash in cargo:
+ # https://github.com/curl/curl/issues/3541
+ patch -Np1 < ../0001-connection_check-set-data-to-the-transfer-doing-the-.patch
+ patch -Np1 < ../0001-connection_check-restore-original-conn-data-after-th.patch
+
+ # https://bugs.archlinux.org/task/61688
+ patch -Np1 < ../0001-singlesocket-fix-the-sincebefore-placement.patch
+}
build() {
cd "$pkgname-$pkgver"
@@ -34,6 +54,7 @@ build() {
--enable-versioned-symbols \
--enable-threaded-resolver \
--with-gssapi \
+ --with-libssh2 \
--with-random=/dev/urandom \
--with-ca-bundle=/etc/ssl/certs/ca-certificates.crt
@@ -47,5 +68,5 @@ package() {
make DESTDIR="$pkgdir" install -C scripts
# license
- install -Dm644 COPYING "$pkgdir/usr/share/licenses/$pkgname/COPYING"
+ install -Dt "$pkgdir/usr/share/licenses/$pkgname" -m644 COPYING
}
diff --git a/abs/core/ffmpeg/PKGBUILD b/abs/core/ffmpeg/PKGBUILD
index 8e23c0f..1717a60 100644
--- a/abs/core/ffmpeg/PKGBUILD
+++ b/abs/core/ffmpeg/PKGBUILD
@@ -1,4 +1,3 @@
-# $Id$
# Maintainer: Maxime Gauduin <alucryd@archlinux.org>
# Contributor: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
# Contributor: Ionut Biru <ibiru@archlinux.org>
@@ -6,63 +5,103 @@
# Contributor: Paul Mattal <paul@archlinux.org>
pkgname=ffmpeg
-pkgver=3.4.2
-pkgrel=2
+pkgver=4.1
+pkgrel=3
epoch=1
pkgdesc='Complete solution to record, convert and stream audio and video'
-arch=('x86_64')
-url='http://ffmpeg.org/'
-license=('GPL3')
-depends=('alsa-lib' 'bzip2' 'fontconfig' 'fribidi' 'glibc' 'gmp' 'gnutls' 'gsm'
- 'lame' 'libavc1394' 'libiec61883' 'libmodplug'
- 'libraw1394' 'libsoxr' 'libssh' 'libtheora' 'libvdpau' 'libwebp'
- 'libx11' 'libxcb' 'libxml2' 'opencore-amr' 'openjpeg2' 'opus' 'sdl2'
- 'speex' 'v4l-utils' 'xz' 'zlib'
- 'libomxil-bellagio'
- 'libass.so' 'libbluray.so' 'libfreetype.so' 'libva-drm.so' 'libva.so'
- 'libva-x11.so' 'libvidstab.so' 'libvorbisenc.so' 'libvorbis.so'
- 'libvpx.so' 'libx264.so' 'libx265.so' 'libxvidcore.so')
-makedepends=('ladspa' 'libvdpau' 'yasm')
+arch=(x86_64)
+url=https://ffmpeg.org/
+license=(GPL3)
+depends=(
+ alsa-lib
+ aom
+ bzip2
+ fontconfig
+ fribidi
+ gmp
+ gnutls
+ gsm
+ lame
+ libass.so
+ libavc1394
+ libbluray.so
+ libdrm
+ libfreetype.so
+ libiec61883
+ libmodplug
+ libomxil-bellagio
+ libraw1394
+ libsoxr
+ libssh
+ libtheora
+ libva.so
+ libva-drm.so
+ libva-x11.so
+ libvdpau
+ libvidstab.so
+ libvorbisenc.so
+ libvorbis.so
+ libvpx.so
+ libwebp
+ libx11
+ libx264.so
+ libx265.so
+ libxcb
+ libxext
+ libxml2
+ libxv
+ libxvidcore.so
+ opencore-amr
+ openjpeg2
+ opus
+ sdl2
+ speex
+ v4l-utils
+ xz
+ zlib
+)
+makedepends=(
+ ffnvcodec-headers
+ git
+ ladspa
+ nasm
+)
optdepends=('ladspa: LADSPA filters')
-provides=('libavcodec.so' 'libavdevice.so' 'libavfilter.so' 'libavformat.so'
- 'libavresample.so' 'libavutil.so' 'libpostproc.so' 'libswresample.so'
- 'libswscale.so')
-source=("https://ffmpeg.org/releases/ffmpeg-${pkgver}.tar.xz"{,.asc}
- 'fs56089.patch')
-validpgpkeys=('FCF986EA15E6E293A5644F10B4322F04D67658D8')
-sha256sums=('2b92e9578ef8b3e49eeab229e69305f5f4cbc1fdaa22e927fc7fca18acccd740'
- 'SKIP'
- '0bfcd12d1992903f21c146ae56d9ad89b52818cfb2303197ee905347c25a5427')
-
-prepare() {
- cd ffmpeg-${pkgver}
-
- # https://bugs.archlinux.org/task/56089
- # Backport of http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=a606f27f4c610708fa96e35eed7b7537d3d8f712
- patch -Np1 -i ../fs56089.patch
-}
+provides=(
+ libavcodec.so
+ libavdevice.so
+ libavfilter.so
+ libavformat.so
+ libavutil.so
+ libpostproc.so
+ libswresample.so
+ libswscale.so
+)
+source=(git+https://git.ffmpeg.org/ffmpeg.git#tag=n${pkgver})
+sha256sums=(SKIP)
build() {
- cd ffmpeg-${pkgver}
+ cd ffmpeg
./configure \
--prefix='/usr' \
--disable-debug \
--disable-static \
--disable-stripping \
- --enable-avisynth \
- --enable-avresample \
--enable-fontconfig \
--enable-gmp \
--enable-gnutls \
--enable-gpl \
--enable-ladspa \
+ --enable-libaom \
--enable-libass \
--enable-libbluray \
+ --enable-libdrm \
--enable-libfreetype \
--enable-libfribidi \
--enable-libgsm \
--enable-libiec61883 \
+ --disable-libjack \
--enable-libmodplug \
--enable-libmp3lame \
--enable-libopencore_amrnb \
@@ -84,20 +123,20 @@ build() {
--enable-libxcb \
--enable-libxml2 \
--enable-libxvid \
+ --enable-nvdec \
+ --enable-nvenc \
+ --enable-omx \
--enable-shared \
- --enable-version3 \
- --enable-omx
+ --enable-version3
make
make tools/qt-faststart
- make doc/ff{mpeg,play,server}.1
+ make doc/ff{mpeg,play}.1
}
package() {
- cd ffmpeg-${pkgver}
-
- make DESTDIR="${pkgdir}" install install-man
- install -Dm 755 tools/qt-faststart "${pkgdir}"/usr/bin/
+ make DESTDIR="${pkgdir}" -C ffmpeg install install-man
+ install -Dm 755 ffmpeg/tools/qt-faststart "${pkgdir}"/usr/bin/
}
# vim: ts=2 sw=2 et:
diff --git a/abs/core/freetype2/0001-Enable-table-validation-modules.patch b/abs/core/freetype2/0001-Enable-table-validation-modules.patch
index 5fd339f..b492755 100644
--- a/abs/core/freetype2/0001-Enable-table-validation-modules.patch
+++ b/abs/core/freetype2/0001-Enable-table-validation-modules.patch
@@ -1,5 +1,5 @@
-From c7a6a2312313a971089fb592deb8c476be4dca0f Mon Sep 17 00:00:00 2001
-Message-Id: <c7a6a2312313a971089fb592deb8c476be4dca0f.1513462508.git.jan.steffens@gmail.com>
+From 7053fd3cef88991e2da6aac5f1dda2c30ce22b4c Mon Sep 17 00:00:00 2001
+Message-Id: <7053fd3cef88991e2da6aac5f1dda2c30ce22b4c.1525259379.git.jan.steffens@gmail.com>
From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
Date: Tue, 23 Jun 2015 08:40:29 +0200
Subject: [PATCH 1/4] Enable table validation modules
@@ -9,11 +9,11 @@ Subject: [PATCH 1/4] Enable table validation modules
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules.cfg b/modules.cfg
-index 56a2340e56d187aa..3a028329187275df 100644
+index 4bf344524..f9aa44b2a 100644
--- a/modules.cfg
+++ b/modules.cfg
@@ -120,30 +120,30 @@ AUX_MODULES += cache
- # TrueType GX/AAT table validation. Needs ftgxval.c below.
+ # TrueType GX/AAT table validation. Needs `ftgxval.c' below.
#
# No FT_CONFIG_OPTION_PIC support.
-# AUX_MODULES += gxvalid
@@ -37,7 +37,7 @@ index 56a2340e56d187aa..3a028329187275df 100644
# No FT_CONFIG_OPTION_PIC support.
AUX_MODULES += bzip2
- # OpenType table validation. Needs ftotval.c below.
+ # OpenType table validation. Needs `ftotval.c' below.
#
# No FT_CONFIG_OPTION_PIC support.
-# AUX_MODULES += otvalid
@@ -46,5 +46,5 @@ index 56a2340e56d187aa..3a028329187275df 100644
# Auxiliary PostScript driver component to share common code.
#
--
-2.15.1
+2.17.0
diff --git a/abs/core/freetype2/0001-psaux-Correctly-handle-Flex-features-52846.patch b/abs/core/freetype2/0001-psaux-Correctly-handle-Flex-features-52846.patch
deleted file mode 100644
index 44630fb..0000000
--- a/abs/core/freetype2/0001-psaux-Correctly-handle-Flex-features-52846.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From cc2f3cdecff5a351e7e8961b9f2e389ab740231a Mon Sep 17 00:00:00 2001
-From: Ewald Hew <ewaldhew@gmail.com>
-Date: Wed, 10 Jan 2018 13:24:56 +0800
-Subject: [PATCH] [psaux] Correctly handle Flex features (#52846).
-
-* src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdVMOVETO,
-cf2_cmdHMOVETO>: Do not move if doing Flex.
----
- src/psaux/psintrp.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/src/psaux/psintrp.c b/src/psaux/psintrp.c
-index 5c0ee78..da5a8da 100644
---- a/src/psaux/psintrp.c
-+++ b/src/psaux/psintrp.c
-@@ -852,7 +852,8 @@
-
- curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) );
-
-- cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-+ if ( !decoder->flex_state )
-+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
- break;
-
-@@ -2674,7 +2675,8 @@
-
- curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) );
-
-- cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-+ if ( !decoder->flex_state )
-+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
- break;
-
---
-2.16.1
-
diff --git a/abs/core/freetype2/0002-Enable-infinality-subpixel-hinting.patch b/abs/core/freetype2/0002-Enable-infinality-subpixel-hinting.patch
index 5f43915..461f8e9 100644
--- a/abs/core/freetype2/0002-Enable-infinality-subpixel-hinting.patch
+++ b/abs/core/freetype2/0002-Enable-infinality-subpixel-hinting.patch
@@ -1,7 +1,7 @@
-From 438b8c65e900d4c28db9eeb2a45e5998048eb471 Mon Sep 17 00:00:00 2001
-Message-Id: <438b8c65e900d4c28db9eeb2a45e5998048eb471.1513462508.git.jan.steffens@gmail.com>
-In-Reply-To: <c7a6a2312313a971089fb592deb8c476be4dca0f.1513462508.git.jan.steffens@gmail.com>
-References: <c7a6a2312313a971089fb592deb8c476be4dca0f.1513462508.git.jan.steffens@gmail.com>
+From ecb052d87dd80603aac454a65fd6e074bc57772c Mon Sep 17 00:00:00 2001
+Message-Id: <ecb052d87dd80603aac454a65fd6e074bc57772c.1525259379.git.jan.steffens@gmail.com>
+In-Reply-To: <7053fd3cef88991e2da6aac5f1dda2c30ce22b4c.1525259379.git.jan.steffens@gmail.com>
+References: <7053fd3cef88991e2da6aac5f1dda2c30ce22b4c.1525259379.git.jan.steffens@gmail.com>
From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
Date: Mon, 29 Aug 2016 08:43:10 +0200
Subject: [PATCH 2/4] Enable infinality subpixel hinting
@@ -11,10 +11,10 @@ Subject: [PATCH 2/4] Enable infinality subpixel hinting
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h
-index 06f3d50bb02fb5ac..e6f9720df9b5d004 100644
+index 4bcab2af5..862b926d5 100644
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
-@@ -654,8 +654,8 @@ FT_BEGIN_HEADER
+@@ -658,8 +658,8 @@ FT_BEGIN_HEADER
/* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
/* */
/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */
@@ -26,5 +26,5 @@ index 06f3d50bb02fb5ac..e6f9720df9b5d004 100644
/*************************************************************************/
--
-2.15.1
+2.17.0
diff --git a/abs/core/freetype2/0003-Enable-long-PCF-family-names.patch b/abs/core/freetype2/0003-Enable-long-PCF-family-names.patch
index be202c1..38623e3 100644
--- a/abs/core/freetype2/0003-Enable-long-PCF-family-names.patch
+++ b/abs/core/freetype2/0003-Enable-long-PCF-family-names.patch
@@ -1,7 +1,7 @@
-From 7e262bff01573c67432f8b8fd879bf858e1611b3 Mon Sep 17 00:00:00 2001
-Message-Id: <7e262bff01573c67432f8b8fd879bf858e1611b3.1513462508.git.jan.steffens@gmail.com>
-In-Reply-To: <c7a6a2312313a971089fb592deb8c476be4dca0f.1513462508.git.jan.steffens@gmail.com>
-References: <c7a6a2312313a971089fb592deb8c476be4dca0f.1513462508.git.jan.steffens@gmail.com>
+From bbb386e90cf9440c9c9952aa14bc309f2ec76205 Mon Sep 17 00:00:00 2001
+Message-Id: <bbb386e90cf9440c9c9952aa14bc309f2ec76205.1525259379.git.jan.steffens@gmail.com>
+In-Reply-To: <7053fd3cef88991e2da6aac5f1dda2c30ce22b4c.1525259379.git.jan.steffens@gmail.com>
+References: <7053fd3cef88991e2da6aac5f1dda2c30ce22b4c.1525259379.git.jan.steffens@gmail.com>
From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com>
Date: Sun, 14 May 2017 18:09:31 +0200
Subject: [PATCH 3/4] Enable long PCF family names
@@ -11,10 +11,10 @@ Subject: [PATCH 3/4] Enable long PCF family names
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h
-index e6f9720df9b5d004..832c9c3cd200f91a 100644
+index 862b926d5..bd6a4f7d3 100644
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
-@@ -845,7 +845,7 @@ FT_BEGIN_HEADER
+@@ -849,7 +849,7 @@ FT_BEGIN_HEADER
/* If this option is activated, it can be controlled with the */
/* `no-long-family-names' property of the pcf driver module. */
/* */
@@ -24,5 +24,5 @@ index e6f9720df9b5d004..832c9c3cd200f91a 100644
/*************************************************************************/
--
-2.15.1
+2.17.0
diff --git a/abs/core/freetype2/PKGBUILD b/abs/core/freetype2/PKGBUILD
index 251ac74..4406cca 100644
--- a/abs/core/freetype2/PKGBUILD
+++ b/abs/core/freetype2/PKGBUILD
@@ -1,10 +1,9 @@
-# $Id$
# Maintainer: Jan de Groot <jgc@archlinux.org>
pkgbase=freetype2
pkgname=('freetype2' 'freetype2-demos' 'freetype2-docs')
-pkgver=2.9
-pkgrel=2
+pkgver=2.9.1
+pkgrel=1
pkgdesc="Font rasterization library"
arch=(x86_64)
license=('GPL')
@@ -19,19 +18,17 @@ source=(https://download-mirror.savannah.gnu.org/releases/freetype/freetype-${pk
0001-Enable-table-validation-modules.patch
0002-Enable-infinality-subpixel-hinting.patch
0003-Enable-long-PCF-family-names.patch
- 0001-psaux-Correctly-handle-Flex-features-52846.patch
0005-freetype-2.5.2-more-demos.patch
freetype2.sh)
-sha1sums=('94c4399b1a55c5892812e732843fcb4a7c2fe657'
+sha1sums=('220c82062171c513e4017c523d196933c9de4a7d'
'SKIP'
- '63e171aa5b2c46e7bece3ae7781015380d012e1f'
+ 'bb6c973f9fef972ad4ecc03bc09ed676b8dc0d59'
'SKIP'
- 'bd8a5d17274f987284e6f934722fb7715d00892e'
+ '45704d7b75c4f9fdd6a9b3787918e8220b36aa77'
'SKIP'
- 'b69531770c343d403be294b7e4d25ac45738c833'
- '3d26a569f0cb94c28a550577f5dcaadb4e193d91'
- '770f1981734a837bcf065564c91644b4cc5e256a'
- '21ad7dd31e16adb5b39adfa5671018a736626562'
+ 'd9eb22e5c962923089b0c9fc5491cf28a19bd982'
+ 'd13503902e0404cf3558db76b477f23f9910d06e'
+ 'fc49742fb6c19fe0677e3552bb7c00aac8530265'
'72cfecbe738085eec475e012617661ad0cc9b76f'
'bc6df1661c4c33e20f5ce30c2da8ad3c2083665f')
validpgpkeys=('58E0C111E39F5408C5D3EC76C1A60EACE707FDA5')
@@ -46,10 +43,6 @@ prepare() {
patch -Np1 -i ../0002-Enable-infinality-subpixel-hinting.patch
patch -Np1 -i ../0003-Enable-long-PCF-family-names.patch
- # Freetype 2.9 regression: bad rendering for some Type 1 fonts
- # https://savannah.nongnu.org/bugs/?52846
- patch -Np1 -i ../0001-psaux-Correctly-handle-Flex-features-52846.patch
-
cd ../freetype2-demos
# enable more demos
patch -Np1 -i ../0005-freetype-2.5.2-more-demos.patch
diff --git a/abs/core/gdk-pixbuf2/PKGBUILD b/abs/core/gdk-pixbuf2/PKGBUILD
index ad535fc..d15d040 100644
--- a/abs/core/gdk-pixbuf2/PKGBUILD
+++ b/abs/core/gdk-pixbuf2/PKGBUILD
@@ -1,33 +1,48 @@
-# $Id$
-# Maintainer: Ionut Biru <ibiru@archlinux.org>
+# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+# Contributor: Ionut Biru <ibiru@archlinux.org>
pkgname=gdk-pixbuf2
-pkgver=2.31.1
-pkgrel=2
+pkgver=2.38.0
+pkgrel=1
pkgdesc="An image loading library"
-arch=('i686' 'x86_64')
-url="http://www.gtk.org/"
-license=('LGPL2.1')
-depends=('glib2' 'libpng' 'libtiff' 'libjpeg' 'libx11' 'jasper')
-makedepends=('gtk-doc' 'gobject-introspection')
+arch=(x86_64)
+url="https://wiki.gnome.org/Projects/GdkPixbuf"
+license=(LGPL2.1)
+depends=(glib2 libpng libtiff libjpeg libx11 jasper shared-mime-info)
+makedepends=(gtk-doc gobject-introspection git docbook-xsl meson)
install=gdk-pixbuf2.install
-source=(http://download.gnome.org/sources/gdk-pixbuf/${pkgver:0:4}/gdk-pixbuf-$pkgver.tar.xz)
-sha256sums=('25a75e3c61dac11e6ff6416ad846951ccafac6486b1c6a1bfb0b213b99db52cd')
+_commit=0b1eab312e77701c20b07fb8e38119009f8b34c3 # tags/2.38.0^0
+source=("git+https://gitlab.gnome.org/GNOME/gdk-pixbuf.git#commit=$_commit"
+ gdk-pixbuf-query-loaders.hook)
+sha256sums=('SKIP'
+ '963afcfacde9fd36031d93c8aa4c94a669ab1dbe9ba0d2cf17599b7d358e54c2')
+
+pkgver() {
+ cd gdk-pixbuf
+ git describe --tags | sed 's/-/+/g'
+}
+
+prepare() {
+ cd gdk-pixbuf
+}
build() {
- cd gdk-pixbuf-$pkgver
+ arch-meson gdk-pixbuf build \
+ -D jasper=true \
+ -D docs=true \
+ -D installed_tests=false
+ ninja -C build
+}
- ./configure --prefix=/usr \
- --with-x11 \
- --with-libjasper \
- --with-included-loaders=png
- make
+check() {
+ cd build
+ # pixbuf-randomly-modified fails randomly
+ meson test -t 3 || :
}
package() {
- cd gdk-pixbuf-$pkgver
-
- make DESTDIR="$pkgdir" install
+ DESTDIR="$pkgdir" meson install -C build
+ install -Dt "$pkgdir/usr/share/libalpm/hooks" -m644 *.hook
}
# vim:set ts=2 sw=2 et:
diff --git a/abs/core/gdk-pixbuf2/gdk-pixbuf-query-loaders.hook b/abs/core/gdk-pixbuf2/gdk-pixbuf-query-loaders.hook
new file mode 100644
index 0000000..3f6a3e4
--- /dev/null
+++ b/abs/core/gdk-pixbuf2/gdk-pixbuf-query-loaders.hook
@@ -0,0 +1,11 @@
+[Trigger]
+Type = File
+Operation = Install
+Operation = Upgrade
+Operation = Remove
+Target = usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so
+
+[Action]
+Description = Probing GDK-Pixbuf loader modules...
+When = PostTransaction
+Exec = /usr/bin/gdk-pixbuf-query-loaders --update-cache
diff --git a/abs/core/gdk-pixbuf2/gdk-pixbuf2.install b/abs/core/gdk-pixbuf2/gdk-pixbuf2.install
index f04c096..83fa07c 100644
--- a/abs/core/gdk-pixbuf2/gdk-pixbuf2.install
+++ b/abs/core/gdk-pixbuf2/gdk-pixbuf2.install
@@ -1,11 +1,3 @@
-post_install() {
- gdk-pixbuf-query-loaders --update-cache
-}
-
-post_upgrade() {
- post_install
-}
-
pre_remove() {
- rm -f /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders/loaders.cache
+ rm -f /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
}
diff --git a/abs/core/glib2/PKGBUILD b/abs/core/glib2/PKGBUILD
index 3498bde..d0e380b 100644
--- a/abs/core/glib2/PKGBUILD
+++ b/abs/core/glib2/PKGBUILD
@@ -1,69 +1,74 @@
-# $Id$
+# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
# Maintainer: Jan de Groot <jgc@archlinux.org>
pkgbase=glib2
pkgname=(glib2 glib2-docs)
-pkgver=2.46.2
-pkgrel=2
-pkgdesc="Common C routines used by GTK+ and other libs"
-url="http://www.gtk.org/"
-arch=(i686 x86_64)
-makedepends=('pkg-config' 'python2' 'libxslt' 'docbook-xml' 'pcre' 'libffi' 'libelf')
-source=(http://ftp.gnome.org/pub/GNOME/sources/glib/${pkgver:0:4}/glib-$pkgver.tar.xz
- revert-warn-glib-compile-schemas.patch memleak.patch)
-sha256sums=('5031722e37036719c1a09163cc6cf7c326e4c4f1f1e074b433c156862bd733db'
- '049240975cd2f1c88fbe7deb28af14d4ec7d2640495f7ca8980d873bb710cc97'
- '8337eeba4a32133d41575c8338fca32ac6a867e6e4a4e021355fcdeb606420a6')
+pkgver=2.58.3
+pkgrel=1
+pkgdesc="Low level core library"
+url="https://wiki.gnome.org/Projects/GLib"
+license=(LGPL2.1)
+arch=(x86_64)
+depends=(pcre libffi libutil-linux zlib)
+makedepends=(gettext gtk-doc shared-mime-info python libelf git util-linux meson dbus)
+checkdepends=(desktop-file-utils)
+optdepends=('python: gdbus-codegen, glib-genmarshal, glib-mkenums, gtester-report'
+ 'libelf: gresource inspection tool')
+options=(!emptydirs)
+_commit=f2d1128ffae0de87680e411fb62ccfccafed6b1c # tags/2.58.3^0
+source=("git+https://gitlab.gnome.org/GNOME/glib.git#commit=$_commit"
+ noisy-glib-compile-schemas.diff
+ glib-compile-schemas.hook gio-querymodules.hook)
+sha256sums=('SKIP'
+ '81a4df0b638730cffb7fa263c04841f7ca6b9c9578ee5045db6f30ff0c3fc531'
+ 'e1123a5d85d2445faac33f6dae1085fdd620d83279a4e130a83fe38db52b62b3'
+ '5ba204a2686304b1454d401a39a9d27d09dd25e4529664e3fd565be3d439f8b6')
+
+pkgver() {
+ cd glib
+ git describe --tags | sed 's/-/+/g'
+}
prepare() {
- cd glib-$pkgver
- patch -Rp1 -i ../revert-warn-glib-compile-schemas.patch
- patch -Np1 -i ../memleak.patch
+ cd glib
+
+ # Suppress noise from glib-compile-schemas.hook
+ patch -Np1 -i ../noisy-glib-compile-schemas.diff
}
-
+
build() {
- cd glib-$pkgver
- PYTHON=/usr/bin/python2 ./configure --prefix=/usr --libdir=/usr/lib \
- --sysconfdir=/etc \
- --with-pcre=system \
- --disable-fam
- make
+ arch-meson glib build \
+ -D selinux=false \
+ -D man=true \
+ -D gtk_doc=true
+ ninja -C build
}
check() {
- cd glib-$pkgver
- #make -k check || :
+ meson test -C build
}
package_glib2() {
- depends=('pcre' 'libffi')
- optdepends=('python2: for gdbus-codegen and gtester-report'
- 'libelf: gresource inspection tool')
- options=('!docs' '!emptydirs')
- license=('LGPL')
+ DESTDIR="$pkgdir" meson install -C build
+ install -Dt "$pkgdir/usr/share/libalpm/hooks" -m644 *.hook
- cd glib-$pkgver
- make completiondir=/usr/share/bash-completion/completions DESTDIR="$pkgdir" install
+ python -m compileall -d /usr/share/glib-2.0/codegen "$pkgdir/usr/share/glib-2.0/codegen"
+ python -O -m compileall -d /usr/share/glib-2.0/codegen "$pkgdir/usr/share/glib-2.0/codegen"
- for _i in "$pkgdir/usr/share/bash-completion/completions/"*; do
- chmod -x "$_i"
- done
-
- # Our gdb does not ship the required python modules, so remove it
- rm -rf "$pkgdir/usr/share/gdb/"
+ # Split docs
+ mv "$pkgdir/usr/share/gtk-doc" "$srcdir"
}
package_glib2-docs() {
- pkgdesc="Documentation for glib2"
- conflicts=('gobject2-docs')
- replaces=('gobject2-docs')
- license=('custom')
- options=('docs' '!emptydirs')
-
- cd glib-$pkgver/docs
- make DESTDIR="${pkgdir}" install
- install -m755 -d "${pkgdir}/usr/share/licenses/glib2-docs"
- install -m644 reference/COPYING "${pkgdir}/usr/share/licenses/glib2-docs/"
+ pkgdesc="Documentation for GLib"
+ depends=()
+ optdepends=()
+ license+=(custom)
+
+ mkdir -p "$pkgdir/usr/share"
+ mv gtk-doc "$pkgdir/usr/share"
- rm -rf "${pkgdir}/usr/share/man"
+ install -Dt "$pkgdir/usr/share/licenses/glib2-docs" -m644 glib/docs/reference/COPYING
}
+
+# vim:set sw=2 et:
diff --git a/abs/core/glib2/gio-querymodules.hook b/abs/core/glib2/gio-querymodules.hook
new file mode 100644
index 0000000..1932333
--- /dev/null
+++ b/abs/core/glib2/gio-querymodules.hook
@@ -0,0 +1,11 @@
+[Trigger]
+Type = File
+Operation = Install
+Operation = Upgrade
+Operation = Remove
+Target = usr/lib/gio/modules/*.so
+
+[Action]
+Description = Updating GIO module cache...
+When = PostTransaction
+Exec = /usr/bin/gio-querymodules /usr/lib/gio/modules
diff --git a/abs/core/glib2/glib-compile-schemas.hook b/abs/core/glib2/glib-compile-schemas.hook
new file mode 100644
index 0000000..04dc59b
--- /dev/null
+++ b/abs/core/glib2/glib-compile-schemas.hook
@@ -0,0 +1,12 @@
+[Trigger]
+Type = File
+Operation = Install
+Operation = Upgrade
+Operation = Remove
+Target = usr/share/glib-2.0/schemas/*.gschema.xml
+Target = usr/share/glib-2.0/schemas/*.gschema.override
+
+[Action]
+Description = Compiling GSettings XML schema files...
+When = PostTransaction
+Exec = /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
diff --git a/abs/core/glib2/memleak.patch b/abs/core/glib2/memleak.patch
deleted file mode 100644
index 2b927a1..0000000
--- a/abs/core/glib2/memleak.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From db641e32920ee8b553ab6f2d318aafa156e4390c Mon Sep 17 00:00:00 2001
-From: Evangelos Foutras <evangelos@foutrelis.com>
-Date: Wed, 25 Nov 2015 23:29:18 +0200
-Subject: GDBusProxy: Fix a memory leak during initialization
-
-https://bugzilla.gnome.org/show_bug.cgi?id=758641
----
- gio/gdbusproxy.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c
-index 52a22fb..7b1140f 100644
---- a/gio/gdbusproxy.c
-+++ b/gio/gdbusproxy.c
-@@ -1720,6 +1720,7 @@ async_initable_init_second_finish (GAsyncInitable *initable,
- if (result != NULL)
- {
- process_get_all_reply (proxy, result);
-+ g_variant_unref (result);
- }
-
- proxy->priv->initialized = TRUE;
---
-cgit v0.11.2
-
diff --git a/abs/core/glib2/noisy-glib-compile-schemas.diff b/abs/core/glib2/noisy-glib-compile-schemas.diff
new file mode 100644
index 0000000..f5f2d94
--- /dev/null
+++ b/abs/core/glib2/noisy-glib-compile-schemas.diff
@@ -0,0 +1,24 @@
+diff --git i/gio/glib-compile-schemas.c w/gio/glib-compile-schemas.c
+index b8de0907248f6860..130f89b1728f7932 100644
+--- i/gio/glib-compile-schemas.c
++++ w/gio/glib-compile-schemas.c
+@@ -1219,19 +1219,6 @@ parse_state_start_schema (ParseState *state,
+ return;
+ }
+
+- if (path && (g_str_has_prefix (path, "/apps/") ||
+- g_str_has_prefix (path, "/desktop/") ||
+- g_str_has_prefix (path, "/system/")))
+- {
+- gchar *message = NULL;
+- message = g_strdup_printf (_("Warning: Schema “%s” has path “%s”. "
+- "Paths starting with "
+- "“/apps/”, “/desktop/” or “/system/” are deprecated."),
+- id, path);
+- g_printerr ("%s\n", message);
+- g_free (message);
+- }
+-
+ state->schema_state = schema_state_new (path, gettext_domain,
+ extends, extends_name, list_of);
+
diff --git a/abs/core/glib2/revert-warn-glib-compile-schemas.patch b/abs/core/glib2/revert-warn-glib-compile-schemas.patch
deleted file mode 100644
index 75b0510..0000000
--- a/abs/core/glib2/revert-warn-glib-compile-schemas.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From 6560b37450cd19c4a7c7b690e279fe97b7bfdcaa Mon Sep 17 00:00:00 2001
-From: Ryan Lortie <desrt@desrt.ca>
-Date: Thu, 12 Apr 2012 23:55:34 +0000
-Subject: glib-compile-schemas: warn about bad dconf paths
-
-For quite some time the recommended usage of GSettings and dconf has
-been to use paths like /org/gnome/example/. Use of /apps/ has spilled
-over from GConf and is continuing to make its way into a number of
-applications as they port.
-
-glib-compile-schemas will now warn about these types of paths being
-used. This generates a lot of noise, but hopefully it will reduce the
-number of ported applications making this mistake.
----
-diff --git a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c
-index cf02389..27d0181 100644
---- a/gio/glib-compile-schemas.c
-+++ b/gio/glib-compile-schemas.c
-@@ -1204,6 +1204,12 @@ parse_state_start_schema (ParseState *state,
- return;
- }
-
-+ if (path && (g_str_has_prefix (path, "/apps/") ||
-+ g_str_has_prefix (path, "/desktop/") ||
-+ g_str_has_prefix (path, "/system/")))
-+ g_printerr ("warning: Schema '%s' has path '%s'. Paths starting with "
-+ "'/apps/', '/desktop/' or '/system/' are deprecated.\n", id, path);
-+
- state->schema_state = schema_state_new (path, gettext_domain,
- extends, extends_name, list_of);
-
---
-cgit v0.9.0.2
diff --git a/abs/core/gobject-introspection/PKGBUILD b/abs/core/gobject-introspection/PKGBUILD
index 9f5edfa..2316aa6 100644
--- a/abs/core/gobject-introspection/PKGBUILD
+++ b/abs/core/gobject-introspection/PKGBUILD
@@ -1,41 +1,55 @@
-# $Id$
+# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
# Maintainer: Jan de Groot <jgc@archlinux.org>
pkgbase=gobject-introspection
-pkgname=('gobject-introspection' 'gobject-introspection-runtime')
-pkgver=1.46.0
+pkgname=(gobject-introspection gobject-introspection-runtime)
+pkgver=1.58.3
pkgrel=1
-url="https://live.gnome.org/GObjectIntrospection"
-arch=('x86_64' 'i686')
-license=('LGPL' 'GPL')
-makedepends=('cairo' 'python2' 'python2-mako')
-source=(https://download.gnome.org/sources/$pkgbase/${pkgver:0:4}/$pkgbase-$pkgver.tar.xz)
-sha256sums=('6658bd3c2b8813eb3e2511ee153238d09ace9d309e4574af27443d87423e4233')
+pkgdesc="Introspection system for GObject-based libraries"
+url="https://wiki.gnome.org/Projects/GObjectIntrospection"
+arch=(x86_64)
+license=(LGPL GPL)
+depends=(python python-mako)
+makedepends=(cairo git gtk-doc python-sphinx meson)
+options=(!emptydirs)
+_commit=96e0b3f92624937093f0c683db6968bc53c694eb # tags/1.58.3^0
+source=("git+https://gitlab.gnome.org/GNOME/gobject-introspection.git#commit=$_commit")
+sha512sums=('SKIP')
-prepare() {
- cd $pkgbase-$pkgver
- sed -i '1s|#!/usr/bin/env python$|&2|' giscanner/*.py
+pkgver() {
+ cd $pkgbase
+ git describe --tags | sed 's/-/+/g'
}
+prepare() {
+ cd $pkgbase
+}
+
build() {
- cd $pkgbase-$pkgver
- PYTHON=/usr/bin/python2 ./configure --prefix=/usr --disable-static --enable-doctool
- make
+ arch-meson $pkgbase build -D cairo=true -D gtk-doc=true
+ ninja -C build
}
-package_gobject-introspection-runtime() {
- pkgdesc="Introspection system for GObject-based libraries - runtime files"
- depends=('glib2')
- cd $pkgbase-$pkgver
- make DESTDIR="$pkgdir" install-libLTLIBRARIES install-typelibsDATA
+check() {
+ meson test -C build
}
package_gobject-introspection() {
- pkgdesc="Introspection system for GObject-based libraries"
- depends=("gobject-introspection-runtime=$pkgver" 'python2-mako' 'python2')
- options=('!emptydirs')
+ depends+=("gobject-introspection-runtime=$pkgver-$pkgrel")
+
+ DESTDIR="$pkgdir" meson install -C build
+
+ python -m compileall -d /usr/lib/gobject-introspection "$pkgdir/usr/lib/gobject-introspection"
+ python -O -m compileall -d /usr/lib/gobject-introspection "$pkgdir/usr/lib/gobject-introspection"
+
+### Split runtime
+ mkdir -p "$srcdir/runtime/lib"
+ mv "$pkgdir"/usr/lib/{lib*,girepository-*} "$srcdir/runtime/lib"
+}
+
+package_gobject-introspection-runtime() {
+ pkgdesc+=" (runtime library)"
+ depends=(glib2)
- cd $pkgbase-$pkgver
- make DESTDIR="$pkgdir" install
- make DESTDIR="$pkgdir" uninstall-libLTLIBRARIES uninstall-typelibsDATA
+ mv "$srcdir/runtime" "$pkgdir/usr"
}
diff --git a/abs/core/intltool/PKGBUILD b/abs/core/intltool/PKGBUILD
index 3ddeaaf..36e18b7 100644
--- a/abs/core/intltool/PKGBUILD
+++ b/abs/core/intltool/PKGBUILD
@@ -1,19 +1,31 @@
-# $Id$
# Maintainer: Eric Bélanger <eric@archlinux.org>
pkgname=intltool
pkgver=0.51.0
-pkgrel=1
+pkgrel=4
pkgdesc="The internationalization tool collection"
arch=('any')
-url="https://edge.launchpad.net/intltool"
+url="https://launchpad.net/intltool"
license=('GPL')
depends=('perl-xml-parser')
-source=(http://launchpad.net/intltool/trunk/${pkgver}/+download/${pkgname}-${pkgver}.tar.gz{,.asc})
-sha1sums=('a0c3bcb99d1bcfc5db70f8d848232a47c47da090'
- 'SKIP')
+source=(https://launchpad.net/intltool/trunk/${pkgver}/+download/${pkgname}-${pkgver}.tar.gz{,.asc}
+ intltool-0.51.0-perl-5.26.patch
+ intltool-merge-Create-cache-file-atomically.patch
+ intltool_distcheck-fix.patch)
+sha256sums=('67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd'
+ 'SKIP'
+ '458f5d53ac358810879080f69b11649901babcacc14471c243eb850e9436d546'
+ '13bd6deb65dc94933f132919d4eea4c24354d7c1c1c9e5930cb6e70c75703763'
+ '58cb7d60796bc69c7d0865f106feb589d0271619e62f8741bff6f5ce1a2615ff')
validpgpkeys=('9EBD001680E8C8F9FAC61A9BE1A701D4C9DE75B5')
+prepare() {
+ cd ${pkgname}-${pkgver}
+ patch -Np1 -i ../intltool-0.51.0-perl-5.26.patch
+ patch -Np1 -i ../intltool-merge-Create-cache-file-atomically.patch
+ patch -Np1 -i ../intltool_distcheck-fix.patch
+}
+
build() {
cd ${pkgname}-${pkgver}
./configure --prefix=/usr
diff --git a/abs/core/intltool/intltool-0.51.0-perl-5.26.patch b/abs/core/intltool/intltool-0.51.0-perl-5.26.patch
new file mode 100644
index 0000000..8f6a0b3
--- /dev/null
+++ b/abs/core/intltool/intltool-0.51.0-perl-5.26.patch
@@ -0,0 +1,51 @@
+diff -Naur intltool-0.51.0.orig/intltool-update.in intltool-0.51.0/intltool-update.in
+--- intltool-0.51.0.orig/intltool-update.in 2015-03-09 02:39:54.000000000 +0100
++++ intltool-0.51.0/intltool-update.in 2017-07-21 22:35:10.613631420 +0200
+@@ -1062,13 +1062,13 @@
+ }
+ }
+
+- if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/)
++ if ($str =~ /^(.*)\$\{?([A-Z_]+)}?(.*)$/)
+ {
+ my $rest = $3;
+ my $untouched = $1;
+ my $sub = "";
+ # Ignore recursive definitions of variables
+- $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\${?$2}?/;
++ $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\$\{?$2}?/;
+
+ return SubstituteVariable ("$untouched$sub$rest");
+ }
+@@ -1190,10 +1190,10 @@
+ $name =~ s/\(+$//g;
+ $version =~ s/\(+$//g;
+
+- $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/);
+- $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/);
+- $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/);
+- $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/);
++ $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/);
++ $varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/);
++ $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/);
++ $varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/);
+ }
+
+ if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)[,]?([^,\)]+)?/m)
+@@ -1219,11 +1219,11 @@
+ $version =~ s/\(+$//g;
+ $bugurl =~ s/\(+$//g if (defined $bugurl);
+
+- $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/);
+- $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/);
+- $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/);
+- $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/);
+- $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\${?\w+}?/);
++ $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\$\{?AC_PACKAGE_NAME}?/);
++ $varhash{"PACKAGE"} = $name if (not $name =~ /\$\{?PACKAGE}?/);
++ $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\$\{?AC_PACKAGE_VERSION}?/);
++ $varhash{"VERSION"} = $version if (not $name =~ /\$\{?VERSION}?/);
++ $varhash{"PACKAGE_BUGREPORT"} = $bugurl if (defined $bugurl and not $bugurl =~ /\$\{?\w+}?/);
+ }
+
+ # \s makes this not work, why?
diff --git a/abs/core/intltool/intltool-merge-Create-cache-file-atomically.patch b/abs/core/intltool/intltool-merge-Create-cache-file-atomically.patch
new file mode 100644
index 0000000..677ea45
--- /dev/null
+++ b/abs/core/intltool/intltool-merge-Create-cache-file-atomically.patch
@@ -0,0 +1,38 @@
+From d328542bea50b9445c63cdf2454052392282a1ce Mon Sep 17 00:00:00 2001
+From: Colin Walters <walters@verbum.org>
+Date: Thu, 8 Oct 2015 16:25:47 -0400
+Subject: [PATCH] intltool-merge: Create cache file atomically
+
+It's going to be relatively common for build systems operating in
+parallel to run multiple copies of `intltool-merge`, yet the cache
+file is not created atomically (i.e. with the "open .tmp file and
+rename()" dance).
+
+I suspect (but have not yet determined conclusively) this is the cause
+of some systemd build issues where translations don't appear in the
+merged file.
+
+Regardless, this patch can't hurt.
+---
+ intltool-merge.in | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/intltool-merge.in b/intltool-merge.in
+index 1afa2a4..d1eba8f 100644
+--- a/intltool-merge.in
++++ b/intltool-merge.in
+@@ -371,9 +371,10 @@ sub create_cache
+
+ &create_translation_database;
+
+- open CACHE, ">$cache_file" || die;
++ open CACHE, ">$cache_file" . ".tmp" || die;
+ print CACHE join "\x01", %translations;
+ close CACHE;
++ rename("$cache_file" . ".tmp", "$cache_file");
+ }
+
+ sub load_cache
+--
+1.8.3.1
+
diff --git a/abs/core/intltool/intltool_distcheck-fix.patch b/abs/core/intltool/intltool_distcheck-fix.patch
new file mode 100644
index 0000000..6e7f198
--- /dev/null
+++ b/abs/core/intltool/intltool_distcheck-fix.patch
@@ -0,0 +1,30 @@
+diff -upr intltool-0.51.0-orig/intltool-update.in intltool-0.51.0/intltool-update.in
+--- intltool-0.51.0-orig/intltool-update.in 2016-07-29 14:08:06.276987000 +0200
++++ intltool-0.51.0/intltool-update.in 2016-07-29 14:11:09.562126918 +0200
+@@ -620,6 +620,14 @@ sub FindLeftoutFiles
+
+ my @result;
+
++ # If the builddir is a subdir of srcdir, the list of files found will be prefixed with
++ # an additional prefix (e.g. "_build/sub" for automake 1.15 make distcheck). Try to
++ # handle that, by removing those matches as well.
++ my $absbuilddir = Cwd::abs_path("..\/");
++ my $abssrcdir = Cwd::abs_path("$SRCDIR/..");
++ # Check if builddir is a subdir of srcdir
++ my ($abspath,$relpath) = split /\s*$abssrcdir\/\s*/, $absbuilddir, 2;
++
+ foreach (@buf_allfiles_sorted)
+ {
+ my $dummy = $_;
+@@ -628,7 +636,10 @@ sub FindLeftoutFiles
+ $srcdir =~ s#^../##;
+ $dummy =~ s#^$srcdir/../##;
+ $dummy =~ s#^$srcdir/##;
+- $dummy =~ s#_build/##;
++ if ($relpath)
++ {
++ $dummy =~ s#^$relpath/##;
++ }
+ if (!exists($in2{$dummy}))
+ {
+ push @result, $dummy
diff --git a/abs/core/libass/PKGBUILD b/abs/core/libass/PKGBUILD
index 9c38fe4..e6ab318 100644
--- a/abs/core/libass/PKGBUILD
+++ b/abs/core/libass/PKGBUILD
@@ -1,20 +1,20 @@
-# $Id$
# Maintainer: Giovanni Scafora <giovanni@archlinux.org>
# Maintainer: Maxime Gauduin <alucryd@archlinux.org>
# Contributor: G_Syme <demichan@mail.upb.de>
pkgname=libass
-pkgver=0.13.4
+pkgver=0.14.0
pkgrel=1
pkgdesc='A portable library for SSA/ASS subtitles rendering'
-arch=('i686' 'x86_64')
+arch=('x86_64')
url='https://github.com/libass/libass/'
license=('BSD')
-depends=('fribidi' 'fontconfig')
-makedepends=('pkg-config' 'yasm')
+depends=('fontconfig' 'fribidi' 'glib2' 'glibc' 'harfbuzz'
+ 'libfreetype.so')
+makedepends=('nasm')
provides=('libass.so')
source=("https://github.com/libass/libass/releases/download/${pkgver}/libass-${pkgver}.tar.xz")
-sha256sums=('d84a2fc89011b99d87fc47af91906622707c165d1860e9f774825ebbbc9c9fb6')
+sha256sums=('881f2382af48aead75b7a0e02e65d88c5ebd369fe46bc77d9270a94aa8fd38a2')
build() {
cd libass-${pkgver}
diff --git a/abs/core/libdrm/PKGBUILD b/abs/core/libdrm/PKGBUILD
index 59dd0ab..a1c902c 100644
--- a/abs/core/libdrm/PKGBUILD
+++ b/abs/core/libdrm/PKGBUILD
@@ -1,9 +1,8 @@
-# $Id$
# Maintainer: Jan de Groot <jgc@archlinux.org>
pkgname=libdrm
-pkgver=2.4.90
-pkgrel=3
+pkgver=2.4.97
+pkgrel=1
pkgdesc="Userspace interface to kernel DRM services"
url="https://dri.freedesktop.org/"
arch=(x86_64)
@@ -12,14 +11,11 @@ depends=('libpciaccess')
makedepends=('valgrind' 'libxslt' 'docbook-xsl' 'meson')
checkdepends=('cairo')
replaces=('libdrm-new' 'libdrm-nouveau')
-source=(https://dri.freedesktop.org/$pkgname/$pkgname-$pkgver.tar.bz2{,.sig}
+source=(https://dri.freedesktop.org/$pkgname/$pkgname-$pkgver.tar.bz2 #{,.sig}
no-drmdevice-test.diff
- fix_mistake_in_initial_hole_size_calculation.diff
COPYING)
-sha512sums=('3d32d60c44ffdcb58667d0926e6af8d375332add1f243d8b2d37567aeef4e4b26d786294aeecf46c3dea94fc002fb73756567c457300703acfc21e32ffbd458c'
- 'SKIP'
+sha512sums=('3e08ee9d6c9ce265d783a59b51e22449905ea73aa27f25a082a1e9e1532f7c99e1c9f7cb966eb0970be2a08e2e5993dc9aa55093b1bff548689fdb465e7145ed'
'f1dd5d8c2270c092ccb8e4f92a0da9ab27706dfa22dcedd3fb2414b968ced9333c8bf62baf0219b822e43dce0d804d1dd5cc27d09b0afe8c01967c1784d4a4bb'
- '679ba7ef4f29cc4d511d5fbb7b505d8eade4cd3fc16eceaed2d1aa47947ebf31bac113ead5f2a1db8f5626ba290e9e1ffeab28c2abb924d0c85efe816c1201f8'
'b0ca349b882a4326b19f81f22804fabdb6fb7aef31cdc7b16b0a7ae191bfbb50c7daddb2fc4e6c33f1136af06d060a273de36f6f3412ea326f16fa4309fda660')
validpgpkeys=('B97BD6A80CAC4981091AE547FE558C72A67013C3') # Maarten Lankhorst <maarten.lankhorst@canonical.com>
validpgpkeys+=('215DEE688925CCB965BE5DA97C03D7797B6E1AE2') # Damien Lespiau <damien.lespiau@intel.com>
@@ -37,26 +33,22 @@ validpgpkeys+=('CFD0E654BCBE5DD2D030D222CFCC297C6D0A120B') # Lucas Stach <l.stac
prepare() {
cd $pkgname-$pkgver
- # Fix version
- sed -i 's/2\.4\.89/2.4.90/' meson.build
-
# Fails in a container; autotools skipped this one already
patch -Np1 -i ../no-drmdevice-test.diff
- # FS#57576; fix amdgpu cards
- patch -Np1 -i ../fix_mistake_in_initial_hole_size_calculation.diff
}
build() {
- arch-meson $pkgname-$pkgver build -Dudev=true
+ arch-meson $pkgname-$pkgver build \
+ -Dudev=false \
+ -Dvalgrind=false
ninja -C build
}
check() {
- cd build
- meson test
+ meson test -C build
}
package() {
- DESTDIR="$pkgdir" ninja -C build install
+ DESTDIR="$pkgdir" meson install -C build
install -Dt "$pkgdir/usr/share/licenses/$pkgname" -m644 COPYING
}
diff --git a/abs/core/libdrm/fix_mistake_in_initial_hole_size_calculation.diff b/abs/core/libdrm/fix_mistake_in_initial_hole_size_calculation.diff
deleted file mode 100644
index 8998e45..0000000
--- a/abs/core/libdrm/fix_mistake_in_initial_hole_size_calculation.diff
+++ /dev/null
@@ -1,39 +0,0 @@
-From 33a2851ab9bc3cd8a68bedf4cf0fdc549b0f3596 Mon Sep 17 00:00:00 2001
-From: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
-Date: Mon, 19 Feb 2018 02:18:36 -0500
-Subject: amdgpu: Fix mistake in initial hole size calculation.
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
-Acked-by: Christian König <christian.koenig@amd.com>
----
- amdgpu/amdgpu_vamgr.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c
-index 722067f..5840042 100644
---- a/amdgpu/amdgpu_vamgr.c
-+++ b/amdgpu/amdgpu_vamgr.c
-@@ -57,7 +57,7 @@ drm_private void amdgpu_vamgr_init(struct amdgpu_bo_va_mgr *mgr, uint64_t start,
- pthread_mutex_init(&mgr->bo_va_mutex, NULL);
- pthread_mutex_lock(&mgr->bo_va_mutex);
- n = calloc(1, sizeof(struct amdgpu_bo_va_hole));
-- n->size = mgr->va_max;
-+ n->size = mgr->va_max - start;
- n->offset = start;
- list_add(&n->list, &mgr->va_holes);
- pthread_mutex_unlock(&mgr->bo_va_mutex);
-@@ -80,6 +80,7 @@ amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, uint64_t size,
- struct amdgpu_bo_va_hole *hole, *n;
- uint64_t offset = 0, waste = 0;
-
-+
- alignment = MAX2(alignment, mgr->va_alignment);
- size = ALIGN(size, mgr->va_alignment);
-
---
-cgit v1.1
-
-
diff --git a/abs/core/libdvdnav/PKGBUILD b/abs/core/libdvdnav/PKGBUILD
index 4bd01d5..d4bf282 100644
--- a/abs/core/libdvdnav/PKGBUILD
+++ b/abs/core/libdvdnav/PKGBUILD
@@ -1,25 +1,27 @@
-# $Id$
# Maintainer: Jan de Groot <jgc@archlinux.org>
# Contributor: Arjan <arjan@archlinux.org>
# contributor Sarah Hay <sarahhay@mb.sympatico.ca>
pkgname=libdvdnav
-pkgver=5.0.3
+pkgver=6.0.0
pkgrel=1
pkgdesc="The library for xine-dvdnav plugin."
-arch=('i686' 'x86_64')
+arch=('x86_64')
license=('GPL')
-url="http://dvdnav.mplayerhq.hu/"
+url="https://www.videolan.org/developers/libdvdnav.html"
depends=('libdvdread')
makedepends=('git')
-source=(git+https://code.videolan.org/videolan/libdvdnav.git#tag=$pkgver
- fix-crash-describe_title.patch)
-sha256sums=('SKIP'
- '6a8e9c777dd9dbfa8a7f981796bd7a60412e3a5c7a8400253c567d956412c64b')
+_commit=dcb9109e45ccd304ec82a7c7bf46cca63620adf9 # tags/6.0.0^0
+source=("git+https://code.videolan.org/videolan/libdvdnav.git#commit=$_commit")
+sha256sums=('SKIP')
+
+pkgver() {
+ cd $pkgname
+ git describe --tags | sed -e 's/-/+/g'
+}
prepare() {
cd $pkgname
- patch -Np1 -i ../fix-crash-describe_title.patch
autoreconf -fi
}
diff --git a/abs/core/libdvdnav/fix-crash-describe_title.patch b/abs/core/libdvdnav/fix-crash-describe_title.patch
deleted file mode 100644
index 1c07336..0000000
--- a/abs/core/libdvdnav/fix-crash-describe_title.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 8a270d6dd40ac43c98c948fe9d10e5bcb4aa3d41 Mon Sep 17 00:00:00 2001
-From: Jean-Baptiste Kempf <jb@videolan.org>
-Date: Tue, 1 Sep 2015 16:00:59 +0200
-Subject: [PATCH] Fix crashes with some DVDs on describe_title
-
-This is a stop-over, but the actual issue is not fixed
----
- src/searching.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/searching.c b/src/searching.c
-index 70c0f85..f638b61 100644
---- a/src/searching.c
-+++ b/src/searching.c
-@@ -644,6 +644,11 @@ uint32_t dvdnav_describe_title_chapters(dvdnav_t *this, int32_t title, uint64_t
- if(!tmp)
- goto fail;
-
-+ if(!ptt) {
-+ printerr("ptt NULL");
-+ goto fail;
-+ }
-+
- length = 0;
- for(i=0; i<parts; i++) {
- uint32_t cellnr, endcellnr;
---
-1.7.10.4
-
diff --git a/abs/core/libdvdread/PKGBUILD b/abs/core/libdvdread/PKGBUILD
index 04e4431..4bab96e 100644
--- a/abs/core/libdvdread/PKGBUILD
+++ b/abs/core/libdvdread/PKGBUILD
@@ -1,22 +1,26 @@
-# $Id$
# Maintainer: Jan de Groot <jgc@archlinux.org>
# Contributor: Thomas Baechler <thomas@archlinux.org>
# Contributor: Tom Newsom <Jeepster@gmx.co.uk>
pkgname=libdvdread
-pkgver=5.0.4
+pkgver=6.0.0
pkgrel=1
pkgdesc="Provides a simple foundation for reading DVD video disks"
-arch=(i686 x86_64)
-url="http://dvdnav.mplayerhq.hu"
+arch=(x86_64)
+url="https://www.videolan.org/developers/libdvdnav.html"
license=('GPL')
depends=('glibc')
makedepends=('libdvdcss' 'git')
optdepends=('libdvdcss: for decoding encrypted DVDs')
-_gitver=5ec409508803037dfa931591aef93851458d1d2a
-source=(git+https://code.videolan.org/videolan/libdvdread.git#commit=$_gitver)
+_commit=95fdbe8337d2ff31dcfb68f35f3e4441dc27d92f # tags/6.0.0^0
+source=("git+https://code.videolan.org/videolan/libdvdread.git#commit=$_commit")
sha256sums=('SKIP')
+pkgver() {
+ cd $pkgname
+ git describe --tags | sed -e 's/-/+/g'
+}
+
prepare() {
cd $pkgname
autoreconf -fi
diff --git a/abs/core/libglvnd/PKGBUILD b/abs/core/libglvnd/PKGBUILD
index e589b42..40df6b6 100644
--- a/abs/core/libglvnd/PKGBUILD
+++ b/abs/core/libglvnd/PKGBUILD
@@ -1,18 +1,17 @@
-# $Id: PKGBUILD 249779 2015-10-27 00:47:25Z eric $
# Maintainer: Felix Yan <felixonmars@archlinux.org>
pkgname=libglvnd
-pkgver=1.0.0
+pkgver=1.1.0
pkgrel=1
pkgdesc="The GL Vendor-Neutral Dispatch library"
arch=('x86_64')
url="https://github.com/NVIDIA/libglvnd"
license=('custom:BSD-like')
-makedepends=('libxext' 'libx11' 'glproto' 'python2')
+makedepends=('libxext' 'libx11' 'glproto' 'python')
provides=('libgl' 'libegl' 'libgles')
source=("$pkgname-$pkgver.tar.gz::https://github.com/NVIDIA/libglvnd/archive/v$pkgver.tar.gz"
LICENSE)
-sha512sums=('c6040b0a508a6b74d7113f8e375fcaf93ec6f2875504953f30e2882e58e22f954bd4027a7d9ab8ac41abef266039e5834fdaf4ce2a69d5d98acf3bbdd54f04b6'
+sha512sums=('40c81f334f44927af4ebdd291f4447d4c01cbaa9f39ebcd519c86e360357b7427b574514a70b62c9538dc90fa312ed632f49cc5e818a800e23b250ec92f4ae29'
'bf0f4a7e04220a407400f89226ecc1f798cc43035f2538cc8860e5088e1f84140baf0d4b0b28f66e4b802d4d6925769a1297c24e1ba39c1c093902b2931781a5')
build() {
diff --git a/abs/core/libglvnd/__changelog b/abs/core/libglvnd/__changelog
deleted file mode 100644
index 99dab7b..0000000
--- a/abs/core/libglvnd/__changelog
+++ /dev/null
@@ -1 +0,0 @@
-PKGBUILD: change python dep to python2
diff --git a/abs/core/libhdhomerun/PKGBUILD b/abs/core/libhdhomerun/PKGBUILD
index 347baa2..8aa590e 100644
--- a/abs/core/libhdhomerun/PKGBUILD
+++ b/abs/core/libhdhomerun/PKGBUILD
@@ -2,7 +2,7 @@
# Contributor: Grey Christoforo <first name [at] last name [dot] net>
pkgname=libhdhomerun
-pkgver=20170930
+pkgver=20180817
pkgrel=1
pkgdesc="Library and command line utility for interfacing with HDHomeRun device"
arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64')
@@ -12,7 +12,7 @@ optdepends=('hdhomerun-firmware-bin: firmware for hdhomerun devices'
'hdhomerun_config_gui: hdhomerun configuration gui')
source=("http://download.silicondust.com/hdhomerun/${pkgname}_${pkgver}.tgz")
-sha256sums=('0cb392231961fab6c226c69012503e2ebe46ac0f13512689bd37d6cf9ee838a1')
+sha256sums=('437888b27206f526827ee7a4c57c1c167a36483b0445232e07fb7bb7ee854b42')
build() {
cd "$srcdir/$pkgname"
diff --git a/abs/core/libidn2/PKGBUILD b/abs/core/libidn2/PKGBUILD
index c0a1a25..f20827a 100644
--- a/abs/core/libidn2/PKGBUILD
+++ b/abs/core/libidn2/PKGBUILD
@@ -1,30 +1,31 @@
-# $Id$
# Maintainer: Evangelos Foutras <evangelos@foutrelis.com>
# Contributor: Daurnimator <quae@daurnimator.com>
pkgname=libidn2
-pkgver=2.0.4
+pkgver=2.1.1
pkgrel=2
pkgdesc="Free software implementation of IDNA2008, Punycode and TR46"
arch=('x86_64')
url="https://www.gnu.org/software/libidn/#libidn2"
license=('GPL2' 'LGPL3')
depends=('libunistring')
-makedepends=('gtk-doc' 'ruby-ronn')
+makedepends=('ruby-ronn')
+provides=('libidn2.so')
source=(https://ftp.gnu.org/gnu/libidn/$pkgname-$pkgver.tar.gz{,.sig})
-sha256sums=('644b6b03b285fb0ace02d241d59483d98bc462729d8bb3608d5cad5532f3d2f0'
+sha256sums=('95416080329298a13269e13175041b530cec3d98b54cafae9424b8dfd22078b1'
'SKIP')
validpgpkeys=('1CB27DBC98614B2D5841646D08302DB6A2670428')
prepare() {
cd $pkgname-$pkgver
- # https://gitlab.com/libidn/libidn2/issues/39
- autoreconf -fvi
}
build() {
cd $pkgname-$pkgver
- ./configure --prefix=/usr
+
+ ./configure \
+ --prefix=/usr \
+ --disable-static
make
}
diff --git a/abs/core/libpsl/PKGBUILD b/abs/core/libpsl/PKGBUILD
index 5689be0..329b8c7 100644
--- a/abs/core/libpsl/PKGBUILD
+++ b/abs/core/libpsl/PKGBUILD
@@ -2,16 +2,17 @@
# Contributor: Darshit Shah <darnir@gmail.com>
pkgname=libpsl
-pkgver=0.19.1
-pkgrel=1
+pkgver=0.20.2
+pkgrel=3
pkgdesc='Public Suffix List library'
url='https://github.com/rockdaboot/libpsl'
arch=('x86_64')
license=('MIT')
depends=('libidn2' 'libunistring')
makedepends=('libxslt' 'python' 'publicsuffix-list' 'gtk-doc')
+provides=('libpsl.so')
source=(https://github.com/rockdaboot/libpsl/releases/download/${pkgname}-${pkgver}/${pkgname}-${pkgver}.tar.gz)
-sha512sums=('86bb2f35764491c65cacec8cd5de97c7d7e1c4d1cc2590d54f394ed17acc75922494115019631b2d930d64dbdc73c266efb323036ac7e52131111287ee6381d5')
+sha512sums=('fa9f6f7f0447d9fe00f5dfca5262c56ff26217eea44d0f7fc1e5d982224c41874e753f0aa06dd9e5d7d03d4f04e3dacd4f36034cc8dd0fc6e2c28b49a23e62fe')
prepare() {
cd ${pkgname}-${pkgver}
diff --git a/abs/core/libxml2/PKGBUILD b/abs/core/libxml2/PKGBUILD
index 2ab74b4..594b4ef 100644
--- a/abs/core/libxml2/PKGBUILD
+++ b/abs/core/libxml2/PKGBUILD
@@ -1,31 +1,30 @@
-# $Id$
+# Maintainer: Levente Polyak <anthraxx[at]archlinux[dot]org>
# Maintainer: Jan de Groot <jgc@archlinux.org>
# Contributor: Tom Gundersen <teg@jklm.no>
# Contributor: John Proctor <jproctor@prium.net>
pkgname=libxml2
-pkgver=2.9.8
+pkgver=2.9.9
pkgrel=1
-pkgdesc="XML parsing library, version 2"
-url="http://www.xmlsoft.org/"
+pkgdesc='XML parsing library, version 2'
+url='http://www.xmlsoft.org/'
arch=(x86_64)
license=(MIT)
depends=(zlib readline ncurses xz icu)
makedepends=(python2 python git)
-_commit=18890f471c420411aa3c989e104d090966ec9dbf # tags/v2.9.8^0
-source=(git+https://git.gnome.org/browse/libxml2#commit=$_commit
+_commit=f8a8c1f59db355b46962577e7b74f1a1e8149dc6 # tags/v2.9.9^0
+source=("git+https://git.gnome.org/browse/libxml2#commit=$_commit"
https://www.w3.org/XML/Test/xmlts20130923.tar.gz)
sha256sums=('SKIP'
'9b61db9f5dbffa545f4b8d78422167083a8568c59bd1129f94138f936cf6fc1f')
pkgver() {
cd $pkgname
- git describe --tags | sed 's/-rc/rc/;s/^v//;s/-/+/g'
+ git describe --always --tags | sed 's/-rc/rc/;s/^v//;s/\([^-]*-g\)/r\1/;s/-/./g'
}
prepare() {
mkdir build-py{2,3}
-
cd $pkgname
NOCONFIGURE=1 ./autogen.sh
}
@@ -57,5 +56,7 @@ check() {
package() {
make -C build-py2 DESTDIR="$pkgdir" install
make -C build-py3/python DESTDIR="$pkgdir" install
- install -Dt "$pkgdir/usr/share/licenses/$pkgname" -m644 build-py2/COPYING
+ install -Dm 644 build-py2/COPYING -t "$pkgdir/usr/share/licenses/$pkgname"
}
+
+# vim: ts=2 sw=2 et:
diff --git a/abs/core/libxml2/libxml2-2.9.4-remove-pyverify_fd.patch b/abs/core/libxml2/libxml2-2.9.4-remove-pyverify_fd.patch
deleted file mode 100644
index d05d4cb..0000000
--- a/abs/core/libxml2/libxml2-2.9.4-remove-pyverify_fd.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Nur libxml2-2.9.4.orig/python/types.c libxml2-2.9.4/python/types.c
---- libxml2-2.9.4.orig/python/types.c 2016-02-09 03:17:33.000000000 -0700
-+++ libxml2-2.9.4/python/types.c 2016-12-21 12:34:06.755650986 -0700
-@@ -31,8 +31,6 @@
- const char *mode;
-
- fd = PyObject_AsFileDescriptor(f);
-- if (!_PyVerify_fd(fd))
-- return(NULL);
- /*
- * Get the flags on the fd to understand how it was opened
- */
diff --git a/abs/core/libxslt/PKGBUILD b/abs/core/libxslt/PKGBUILD
index 3f8af1b..dd40c30 100644
--- a/abs/core/libxslt/PKGBUILD
+++ b/abs/core/libxslt/PKGBUILD
@@ -1,9 +1,8 @@
-# $Id$
# Maintainer: Eric Belanger <eric@archlinux.org>
# Contributor: John Proctor <jproctor@prium.net>
pkgname=libxslt
-pkgver=1.1.32+3+g32c8821
+pkgver=1.1.33
pkgrel=1
pkgdesc="XML stylesheet transformation library"
url="http://xmlsoft.org/XSLT/"
@@ -12,8 +11,8 @@ license=(custom)
depends=(libxml2 libgcrypt)
makedepends=(python2 git)
checkdepends=(docbook-xml python)
-_commit=32c88216ddbaa0f3491f45bc84ee89285c6a1129 # master
-source=("git+https://git.gnome.org/browse/libxslt#commit=$_commit")
+_commit=f1eb717f04d9cc297cc5e58e94b81ac96f47e741 # tags/v1.1.33^0
+source=("git+https://gitlab.gnome.org/GNOME/libxslt.git#commit=$_commit")
sha256sums=('SKIP')
pkgver() {
diff --git a/abs/core/lighttpd/PKGBUILD b/abs/core/lighttpd/PKGBUILD
index 365d92e..23614cb 100644
--- a/abs/core/lighttpd/PKGBUILD
+++ b/abs/core/lighttpd/PKGBUILD
@@ -2,14 +2,14 @@
# Maintainer: Pierre Schmitz <pierre@archlinux.de>
pkgname=lighttpd
-pkgver=1.4.48
+pkgver=1.4.51
pkgrel=1
pkgdesc='A secure, fast, compliant and very flexible web-server'
license=('custom')
arch=('i686' 'x86_64')
url="http://www.lighttpd.net/"
depends=('pcre' 'openssl' 'zlib' 'bzip2' 'attr' 'libldap' 'php-cgi')
-makedepends=('fcgi' 'libmysqlclient' 'lua51' 'libxml2' 'e2fsprogs' 'sqlite' 'gdbm' 'pkgconfig')
+makedepends=('fcgi' 'libmysqlclient' 'lua' 'libxml2' 'e2fsprogs' 'sqlite' 'gdbm' 'pkgconfig')
optdepends=('libxml2: mod_webdav' \
'e2fsprogs: mod_webdav' \
'libmysqlclient: mod_mysql_vhost' \
@@ -62,7 +62,7 @@ package() {
install -D -m644 COPYING ${pkgdir}/usr/share/licenses/${pkgname}/COPYING
}
-md5sums=('fe9ea4dccacd9738be03245c364bc055'
+md5sums=('c23b731846163620c24576ec0f145546'
'42d106b101d21ffd76ed9f3f1621e164'
'fd4afd737fd16a82ba99b9a99533d34b'
'62779511e3f1127c3cc9b94c49f99c29'
diff --git a/abs/core/linhes-theme/PKGBUILD b/abs/core/linhes-theme/PKGBUILD
index 35a8d82..f275e0d 100755
--- a/abs/core/linhes-theme/PKGBUILD
+++ b/abs/core/linhes-theme/PKGBUILD
@@ -1,8 +1,8 @@
pkgname=linhes-theme
-pkgver=8.5.1
-pkgrel=10
+pkgver=8.6.0
+pkgrel=2
pkgdesc="Default LinHES MythTV theme"
-arch=('i686' 'x86_64')
+arch=('x86_64')
license=('GPL2')
url="http://linhes.org/"
@@ -116,11 +116,11 @@ md5sums=('2dca856c2a4d1f959473512c94e43b60'
'dd1e013e806efc26049ea89637a51f83'
'9fe3371a8b964a7028126405cfaa330b'
'814b52b7ad9a6918585764f5790d1c3b'
- 'a65ab8c1c409e89358373aa51f0b3eb3'
+ '373e1fd01ba18640992bd5d2e7fd7bfe'
'384871202030f41148536e2e89bb1801'
'8efbd524cef4dd3f5fbe5b7d5ad854f0'
'8312aff444945f80a76100696c81cb2e'
- '2803a328cd276393964240842da03010'
+ 'f1e0b73f5118c0a6f8c75e47beefdcdc'
'4125880d1739b196a8041ecc3d773ee2'
'5a8fb2a5f0e657d52be6f0a6a006ce72'
'274b6f8cb5cd82c5ce28422decd7754b'
@@ -136,6 +136,6 @@ md5sums=('2dca856c2a4d1f959473512c94e43b60'
'e8ac15e38b3dc99c9e889e439ba356de'
'e8cf0d3a55ba3be47deae55c05432141'
'3f600b966bd813dd27f620762ddb3ac8'
- 'a2d7c855d78b4fa5e9714509891a6cb9'
+ 'e92bd22caf09a1d2b709f4d5b2519540'
'b51ef0cbf8ed2d3a8c1a8257a89aceff'
'09ad14842f828b7a8d24070ec8214fe5')
diff --git a/abs/core/linhes-theme/schedule-ui.xml.patch b/abs/core/linhes-theme/schedule-ui.xml.patch
index 729b250..33d6119 100644
--- a/abs/core/linhes-theme/schedule-ui.xml.patch
+++ b/abs/core/linhes-theme/schedule-ui.xml.patch
@@ -1,5 +1,5 @@
--- schedule-ui.xml.orig 2018-06-06 17:48:28.091163462 +0000
-+++ schedule-ui.xml 2018-06-06 18:04:00.119905930 +0000
++++ schedule-ui.xml 2019-03-11 20:58:29.671094834 +0000
@@ -119,14 +119,14 @@
<channels>6</channels>
<timeslots>5</timeslots>
@@ -251,3 +251,12 @@
</statetype>
</buttonlist>
+@@ -3583,7 +3661,7 @@
+ <area>112,65,180,40</area>
+ <font>basesmall</font>
+ <align>right,vcenter</align>
+- <value>TMDB/TVDB #:</value>
++ <value>Video #:</value>
+ </textarea>
+
+ <textedit name="inetref_edit" from="base_textedit">
diff --git a/abs/core/linhes-theme/standardsetting-ui.xml b/abs/core/linhes-theme/standardsetting-ui.xml
index a50e985..255b120 100644
--- a/abs/core/linhes-theme/standardsetting-ui.xml
+++ b/abs/core/linhes-theme/standardsetting-ui.xml
@@ -121,6 +121,7 @@
<group name="select_bar" from="base_select_bar_active_group">
<area>0,0,100%,100%</area>
</group>
+
<textarea name="buttontext">
<area>15,0,50%-5,30</area>
</textarea>
@@ -196,8 +197,14 @@
<group name="select_bar" from="base_select_bar_selectedactive_group">
<area>0,0,100%,100%</area>
</group>
+
+ <imagetype name="parentarrow">
+ <position>5,50%-15</position>
+ <filename>images/lists_left_arrow_large.png</filename>
+ </imagetype>
+
<textarea name="buttontext">
- <area>15,0,1194,64</area>
+ <area>33,0,1194,64</area>
<font>basesmallyellow</font>
<align>left,vcenter</align>
<scroll direction="horizontal" />
@@ -286,6 +293,10 @@
</shape>
</statetype>
+ <imagetype name="buttonarrow">
+ <position>100%-23,50%-15</position>
+ <filename>images/lists_right_arrow_large.png</filename>
+ </imagetype>
</state>
<state name="disabledactive" from="active">
<textarea name="buttontext">
diff --git a/abs/core/linhes-theme/video-ui.xml.patch b/abs/core/linhes-theme/video-ui.xml.patch
index 2a336ef..5f56372 100644
--- a/abs/core/linhes-theme/video-ui.xml.patch
+++ b/abs/core/linhes-theme/video-ui.xml.patch
@@ -1,5 +1,5 @@
--- video-ui.xml.orig 2018-04-17 14:44:43.827360598 +0000
-+++ video-ui.xml 2018-04-17 14:47:36.544853593 +0000
++++ video-ui.xml 2019-03-09 13:31:34.326974622 +0000
@@ -58,8 +58,8 @@
<textarea name="label" from="basetextarea">
<area>10,4,543,70</area>
@@ -1297,6 +1297,15 @@
</textedit>
<textarea name="tagline_text" from="basetextarea">
+@@ -2418,7 +2482,7 @@
+
+ <textarea name="inetref_text" from="basetextarea">
+ <area>556,86,124,36</area>
+- <value>TMDB:</value>
++ <value>Video #:</value>
+ <align>right,vcenter</align>
+ </textarea>
+
@@ -2947,83 +3011,85 @@
<multiline>no</multiline>
<font>basesmalldarkyellow</font>
diff --git a/abs/core/linux/PKGBUILD b/abs/core/linux/PKGBUILD
index 2e481b0..085929b 100644
--- a/abs/core/linux/PKGBUILD
+++ b/abs/core/linux/PKGBUILD
@@ -4,7 +4,7 @@
pkgbase=linux
#pkgbase=linux-custom
_srcname=linux-4.9
-pkgver=4.9.109
+pkgver=4.9.159
pkgrel=1
arch=('x86_64')
url="https://www.kernel.org/"
@@ -12,7 +12,7 @@ license=('GPL2')
makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc' 'libelf' 'git')
options=('!strip')
source=(https://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.{xz,sign}
- https://www.kernel.org/pub/linux/kernel/v4.x/patch-${pkgver}.{xz,sign}
+ https://www.kernel.org/pub/linux/kernel/v4.x/patch-${pkgver}.xz
# the main kernel config files
'config'
# pacman hook for initramfs regeneration
@@ -25,8 +25,7 @@ source=(https://www.kernel.org/pub/linux/kernel/v4.x/${_srcname}.tar.{xz,sign}
# https://www.kernel.org/pub/linux/kernel/v4.x/sha256sums.asc
sha256sums=('029098dcffab74875e086ae970e3828456838da6e0ba22ce3f64ef764f3d7f1a'
'SKIP'
- 'e688e9626b60b6e3ded8545803f6c9a81ee8dcdc12c908bba757793d3ea2e427'
- 'SKIP'
+ '97baf52684cacf4b644172389366b475048774b61f74bf1a3a856d09d26f75df'
'a11c6643d5b39bd4a37caa1ff3135cecdd1239348580b36e0abaaa425b5ced07'
'834bd254b56ab71d73f59b3221f056c72f559553c04718e350ab2a3e2991afe0'
'1f036f7464da54ae510630f0edb69faa115287f86d9f17641197ffda8cfd49e0'
diff --git a/abs/core/linux/linux.install.pkg b/abs/core/linux/linux.install.pkg
index c9b1687..0437fef 100644
--- a/abs/core/linux/linux.install.pkg
+++ b/abs/core/linux/linux.install.pkg
@@ -2,7 +2,7 @@
# arg 2: the old package version
KERNEL_NAME=
-KERNEL_VERSION=4.9.109-1-ARCH
+KERNEL_VERSION=4.9.159-1-ARCH
post_install () {
# updating module dependencies
diff --git a/abs/core/mesa/0001-glvnd-fix-gl-dot-pc.patch b/abs/core/mesa/0001-glvnd-fix-gl-dot-pc.patch
deleted file mode 100644
index 68118f4..0000000
--- a/abs/core/mesa/0001-glvnd-fix-gl-dot-pc.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up mesa-12.0.3/src/mesa/gl.pc.in.jx mesa-12.0.3/src/mesa/gl.pc.in
---- mesa-12.0.3/src/mesa/gl.pc.in.jx 2016-01-18 02:39:26.000000000 -0500
-+++ mesa-12.0.3/src/mesa/gl.pc.in 2016-10-25 13:06:44.013159358 -0400
-@@ -7,7 +7,7 @@ Name: gl
- Description: Mesa OpenGL library
- Requires.private: @GL_PC_REQ_PRIV@
- Version: @PACKAGE_VERSION@
--Libs: -L${libdir} -l@GL_LIB@
-+Libs: -L${libdir} -lGL
- Libs.private: @GL_PC_LIB_PRIV@
- Cflags: -I${includedir} @GL_PC_CFLAGS@
- glx_tls: @GLX_TLS@
diff --git a/abs/core/mesa/LICENSE b/abs/core/mesa/LICENSE
index ae33d27..060f4a9 100644
--- a/abs/core/mesa/LICENSE
+++ b/abs/core/mesa/LICENSE
@@ -1,33 +1,34 @@
+The Mesa 3D Graphics Library
+
Disclaimer
-Mesa is a 3-D graphics library with an API which is very similar to
-that of OpenGL*
-To the extent that Mesa utilizes the OpenGL command syntax or state
-machine, it is being used with authorization from Silicon Graphics,
-Inc.(SGI). However, the author does not possess an OpenGL license
-from SGI, and makes no claim that Mesa is in any way a compatible
-replacement for OpenGL or associated with SGI. Those who want a
-licensed implementation of OpenGL should contact a licensed
-vendor.
+ Mesa is a 3-D graphics library with an API which is very similar to
+ that of [1]OpenGL.* To the extent that Mesa utilizes the OpenGL command
+ syntax or state machine, it is being used with authorization from
+ [2]Silicon Graphics, Inc.(SGI). However, the author does not possess an
+ OpenGL license from SGI, and makes no claim that Mesa is in any way a
+ compatible replacement for OpenGL or associated with SGI. Those who
+ want a licensed implementation of OpenGL should contact a licensed
+ vendor.
-Please do not refer to the library as MesaGL (for legal
-reasons). It's just Mesa or The Mesa 3-D graphics
-library
+ Please do not refer to the library as MesaGL (for legal reasons). It's
+ just Mesa or The Mesa 3-D graphics library.
-* OpenGL is a trademark of Silicon Graphics Incorporated.
+ * OpenGL is a trademark of [3]Silicon Graphics Incorporated.
License / Copyright Information
-The Mesa distribution consists of several components. Different copyrights
-and licenses apply to different components. For example, GLUT is copyrighted
-by Mark Kilgard, some demo programs are copyrighted by SGI, some of the Mesa
-device drivers are copyrighted by their authors. See below for a list of
-Mesa's main components and the license for each.
+ The Mesa distribution consists of several components. Different
+ copyrights and licenses apply to different components. For example, the
+ GLX client code uses the SGI Free Software License B, and some of the
+ Mesa device drivers are copyrighted by their authors. See below for a
+ list of Mesa's main components and the license for each.
-The core Mesa library is licensed according to the terms of the MIT license.
-This allows integration with the XFree86, Xorg and DRI projects.
+ The core Mesa library is licensed according to the terms of the MIT
+ license. This allows integration with the XFree86, Xorg and DRI
+ projects.
-The default Mesa license is as follows:
+ The default Mesa license is as follows:
Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
@@ -44,39 +45,39 @@ in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Attention, Contributors
-When contributing to the Mesa project you must agree to the licensing terms
-of the component to which you're contributing.
-The following section lists the primary components of the Mesa distribution
-and their respective licenses.
-
+ When contributing to the Mesa project you must agree to the licensing
+ terms of the component to which you're contributing. The following
+ section lists the primary components of the Mesa distribution and their
+ respective licenses.
Mesa Component Licenses
-Component Location Primary Author License
-----------------------------------------------------------------------------
-Main Mesa code src/mesa/ Brian Paul Mesa (MIT)
+Component Location License
+------------------------------------------------------------------
+Main Mesa code src/mesa/ MIT
-Device drivers src/mesa/drivers/* See drivers See drivers
+Device drivers src/mesa/drivers/* MIT, generally
-Ext headers include/GL/glext.h SGI SGI Free B
- include/GL/glxext.h
+Gallium code src/gallium/ MIT
-GLUT src/glut/ Mark Kilgard Mark's copyright
-
-Mesa GLU library src/glu/mesa/ Brian Paul GNU-LGPL
+Ext headers include/GL/glext.h Khronos
+ include/GL/glxext.h
-SGI GLU library src/glu/sgi/ SGI SGI Free B
+GLX client code src/glx/ SGI Free Software License B
-demo programs progs/demos/ various see source files
+C11 thread include/c11/threads*.h Boost (permissive) emulation
-X demos progs/xdemos/ Brian Paul see source files
+ In general, consult the source files for license terms.
-SGI demos progs/samples/ SGI SGI copyright
+References
-RedBook demos progs/redbook/ SGI SGI copyright
+ 1. https://www.opengl.org/
+ 2. https://www.sgi.com/
+ 3. https://www.sgi.com/
diff --git a/abs/core/mesa/PKGBUILD b/abs/core/mesa/PKGBUILD
index 504d32b..8cfff58 100644
--- a/abs/core/mesa/PKGBUILD
+++ b/abs/core/mesa/PKGBUILD
@@ -1,110 +1,115 @@
-# $Id$
# Maintainer: Jan de Groot <jgc@archlinux.org>
# Maintainer: Andreas Radke <andyrtr@archlinux.org>
pkgbase=mesa
pkgname=('opencl-mesa' 'vulkan-intel' 'vulkan-radeon' 'libva-mesa-driver' 'mesa-vdpau' 'mesa')
-pkgver=17.3.6
+pkgdesc="An open-source implementation of the OpenGL specification"
+pkgver=18.3.4
pkgrel=1
arch=('x86_64')
-makedepends=('python2-mako' 'libxml2' 'libx11' 'glproto' 'libdrm' 'dri2proto' 'dri3proto' 'presentproto'
+makedepends=('python-mako' 'libxml2' 'libx11' 'glproto' 'libdrm' 'dri2proto' 'dri3proto' 'presentproto'
'libxshmfence' 'libxxf86vm' 'libxdamage' 'libvdpau' 'libva' 'wayland' 'wayland-protocols'
- 'elfutils' 'llvm' 'libomxil-bellagio' 'libclc' 'clang' 'libglvnd' 'libunwind' 'lm_sensors')
+ 'elfutils' 'llvm' 'libomxil-bellagio' 'libclc' 'clang' 'libglvnd' 'libunwind' 'lm_sensors'
+ 'libxrandr' 'meson')
url="https://www.mesa3d.org/"
license=('custom')
source=(https://mesa.freedesktop.org/archive/mesa-${pkgver}.tar.xz{,.sig}
- LICENSE
- 0001-glvnd-fix-gl-dot-pc.patch)
-sha512sums=('5164ed5a1d3d25031b712a9f443f0e467a29b2bca0a1aa11324ed5c10279411979c9c7482825053926a813e76c58b78a3439c7c81fcd51a7808f53977080828f'
+ get-program-name-based-on-path.patch
+ LICENSE)
+sha512sums=('e4ead944ba053aa05425e9e199d633f576dfa424976253fc32438e8db6da5e8d381122e4c4b7fb18f94177421f208bab5567cfec8d2692d104e266483ca02a99'
'SKIP'
- '25da77914dded10c1f432ebcbf29941124138824ceecaf1367b3deedafaecabc082d463abcfa3d15abff59f177491472b505bcb5ba0c4a51bb6b93b4721a23c2'
- '75849eca72ca9d01c648d5ea4f6371f1b8737ca35b14be179e14c73cc51dca0739c333343cdc228a6d464135f4791bcdc21734e2debecd29d57023c8c088b028')
-validpgpkeys=('8703B6700E7EE06D7A39B8D6EDAE37B02CEB490D') # Emil Velikov <emil.l.velikov@gmail.com>
-validpgpkeys+=('946D09B5E4C9845E63075FF1D961C596A7203456') # Andres Gomez <tanty@igalia.com>
-validpgpkeys+=('E3E8F480C52ADD73B278EE78E1ECBE07D7D70895') # Juan Antonio Suárez Romero (Igalia, S.L.) <jasuarez@igalia.com>"
-
+ '3c851ec0f1d8c1d918756c5b5315901d2a9c1de22624378bb2ba49ae8d7abc0b6c015a91c455f1d40d50532939f60db81cab0d7c9f832d41162c684582783fa6'
+ 'f9f0d0ccf166fe6cb684478b6f1e1ab1f2850431c06aa041738563eb1808a004e52cdec823c103c9e180f03ffc083e95974d291353f0220fe52ae6d4897fecc7')
+validpgpkeys=('8703B6700E7EE06D7A39B8D6EDAE37B02CEB490D' # Emil Velikov <emil.l.velikov@gmail.com>
+ '946D09B5E4C9845E63075FF1D961C596A7203456' # Andres Gomez <tanty@igalia.com>
+ 'E3E8F480C52ADD73B278EE78E1ECBE07D7D70895' # Juan Antonio Suárez Romero (Igalia, S.L.) <jasuarez@igalia.com>
+ 'A5CC9FEC93F2F837CB044912336909B6B25FADFA' # Juan A. Suarez Romero <jasuarez@igalia.com>
+ '71C4B75620BC75708B4BDB254C95FAAB3EB073EC') # Dylan Baker <dylan@pnwbakers.com>
+
prepare() {
- cd ${srcdir}/mesa-${pkgver}
+ cd mesa-${pkgver}
- # glvnd support patches - from Fedora
- # non-upstreamed ones
- patch -Np1 -i ../0001-glvnd-fix-gl-dot-pc.patch
-
- autoreconf -fiv
+ # Needed in order to target Chromium in drirc (included upstream in Mesa 19)
+ patch -Np1 -i ../get-program-name-based-on-path.patch
}
build() {
- cd ${srcdir}/mesa-${pkgver}
-
- ./configure --prefix=/usr \
- --sysconfdir=/etc \
- --with-gallium-drivers=r300,r600,radeonsi,nouveau,svga,swrast,virgl,swr \
- --with-dri-drivers=i915,i965,r200,radeon,nouveau,swrast \
- --with-platforms=x11,drm,wayland \
- --with-vulkan-drivers=intel,radeon \
- --disable-xvmc \
- --enable-llvm \
- --enable-llvm-shared-libs \
- --enable-shared-glapi \
- --enable-libglvnd \
- --enable-libunwind \
- --enable-lmsensors \
- --enable-egl \
- --enable-glx \
- --enable-glx-tls \
- --enable-gles1 \
- --enable-gles2 \
- --enable-gbm \
- --enable-dri \
- --enable-gallium-osmesa \
- --enable-gallium-extra-hud \
- --enable-texture-float \
- --enable-xa \
- --enable-vdpau \
- --enable-omx-bellagio \
- --enable-nine \
- --enable-opencl \
- --enable-opencl-icd \
- --with-clang-libdir=/usr/lib
-
- make
-
- # fake installation
- mkdir $srcdir/fakeinstall
- make DESTDIR=${srcdir}/fakeinstall install
+ # -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,swrast,swr ### swr doesn't build https://bugs.freedesktop.org/show_bug.cgi?id=107865
+
+ arch-meson mesa-$pkgver build \
+ -D b_lto=false \
+ -D b_ndebug=true \
+ -D platforms=x11,wayland,drm,surfaceless \
+ -D dri-drivers=i915,i965,r100,r200,nouveau \
+ -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,swrast \
+ -D vulkan-drivers=amd,intel \
+ -D swr-arches=avx,avx2 \
+ -D dri3=true \
+ -D egl=true \
+ -D gallium-extra-hud=true \
+ -D gallium-nine=true \
+ -D gallium-omx=bellagio \
+ -D gallium-opencl=icd \
+ -D gallium-va=true \
+ -D gallium-vdpau=true \
+ -D gallium-xa=true \
+ -D gallium-xvmc=false \
+ -D gbm=true \
+ -D gles1=true \
+ -D gles2=true \
+ -D glvnd=true \
+ -D glx=dri \
+ -D libunwind=true \
+ -D llvm=true \
+ -D lmsensors=true \
+ -D osmesa=gallium \
+ -D shared-glapi=true \
+ -D texture-float=true \
+ -D valgrind=false
+
+ # Print config
+ meson configure build
+
+ ninja -C build
+
+ # fake installation to be seperated into packages
+ # outside of fakeroot but mesa doesn't need to chown/mod
+ DESTDIR="${srcdir}/fakeinstall" ninja -C build install
+}
+
+_install() {
+ local src f dir
+ for src; do
+ f="${src#fakeinstall/}"
+ dir="${pkgdir}/${f%/*}"
+ install -m755 -d "${dir}"
+ mv -v "${src}" "${dir}/"
+ done
}
package_opencl-mesa() {
pkgdesc="OpenCL support for AMD/ATI Radeon mesa drivers"
- depends=('expat' 'libdrm' 'libelf' 'lm_sensors' 'libunwind' 'libclc' 'clang')
+ depends=('expat' 'libdrm' 'libelf' 'libclc' 'clang')
optdepends=('opencl-headers: headers necessary for OpenCL development')
provides=('opencl-driver')
- install -m755 -d ${pkgdir}/etc
- cp -rv ${srcdir}/fakeinstall/etc/OpenCL ${pkgdir}/etc/
-
- install -m755 -d ${pkgdir}/usr/lib/gallium-pipe
- cp -rv ${srcdir}/fakeinstall/usr/lib/lib*OpenCL* ${pkgdir}/usr/lib/
- cp -rv ${srcdir}/fakeinstall/usr/lib/gallium-pipe/pipe_{r600,radeonsi}.so ${pkgdir}/usr/lib/gallium-pipe/
+ _install fakeinstall/etc/OpenCL
+ _install fakeinstall/usr/lib/lib*OpenCL*
+ _install fakeinstall/usr/lib/gallium-pipe
- install -m755 -d "${pkgdir}/usr/share/licenses/opencl-mesa"
- install -m644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/opencl-mesa/"
+ install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" LICENSE
}
package_vulkan-intel() {
pkgdesc="Intel's Vulkan mesa driver"
- depends=('wayland' 'libx11' 'libxshmfence')
+ depends=('wayland' 'libx11' 'libxshmfence' 'libdrm')
provides=('vulkan-driver')
- install -m755 -d ${pkgdir}/usr/share/vulkan/icd.d
- mv -v ${srcdir}/fakeinstall/usr/share/vulkan/icd.d/intel_icd*.json ${pkgdir}/usr/share/vulkan/icd.d/
+ _install fakeinstall/usr/share/vulkan/icd.d/intel_icd*.json
+ _install fakeinstall/usr/lib/libvulkan_intel.so
+ _install fakeinstall/usr/include/vulkan/vulkan_intel.h
- install -m755 -d ${pkgdir}/usr/{include/vulkan,lib}
- mv -v ${srcdir}/fakeinstall/usr/lib/libvulkan_intel.so ${pkgdir}/usr/lib/
- mv -v ${srcdir}/fakeinstall/usr/include/vulkan/vulkan_intel.h ${pkgdir}/usr/include/vulkan
-
- install -m755 -d "${pkgdir}/usr/share/licenses/vulkan-intel"
- install -m644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/vulkan-intel/"
+ install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" LICENSE
}
package_vulkan-radeon() {
@@ -112,40 +117,31 @@ package_vulkan-radeon() {
depends=('wayland' 'libx11' 'libxshmfence' 'libelf' 'libdrm' 'llvm-libs')
provides=('vulkan-driver')
- install -m755 -d ${pkgdir}/usr/share/vulkan/icd.d
- mv -v ${srcdir}/fakeinstall/usr/share/vulkan/icd.d/radeon_icd*.json ${pkgdir}/usr/share/vulkan/icd.d/
-
- install -m755 -d ${pkgdir}/usr/lib
- mv -v ${srcdir}/fakeinstall/usr/lib/libvulkan_radeon.so ${pkgdir}/usr/lib/
+ _install fakeinstall/usr/share/vulkan/icd.d/radeon_icd*.json
+ _install fakeinstall/usr/lib/libvulkan_radeon.so
- install -m755 -d "${pkgdir}/usr/share/licenses/vulkan-radeon"
- install -m644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/vulkan-radeon/"
+ install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" LICENSE
}
package_libva-mesa-driver() {
pkgdesc="VA-API implementation for gallium"
- depends=('libdrm' 'libx11' 'llvm-libs' 'expat' 'libelf' 'libxshmfence' 'lm_sensors' 'libunwind')
+ depends=('libdrm' 'libx11' 'llvm-libs' 'expat' 'libelf' 'libxshmfence')
- install -m755 -d ${pkgdir}/usr/lib/dri
- cp -av ${srcdir}/fakeinstall/usr/lib/dri/*_drv_video.so ${pkgdir}/usr/lib/dri
+ _install fakeinstall/usr/lib/dri/*_drv_video.so
- install -m755 -d "${pkgdir}/usr/share/licenses/libva-mesa-driver"
- install -m644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/libva-mesa-driver/"
+ install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" LICENSE
}
package_mesa-vdpau() {
pkgdesc="Mesa VDPAU drivers"
- depends=('libdrm' 'libx11' 'llvm-libs' 'expat' 'libelf' 'libxshmfence' 'lm_sensors' 'libunwind')
+ depends=('libdrm' 'libx11' 'llvm-libs' 'expat' 'libelf' 'libxshmfence')
- install -m755 -d ${pkgdir}/usr/lib/vdpau
- cp -av ${srcdir}/fakeinstall/usr/lib/vdpau/* ${pkgdir}/usr/lib/vdpau
+ _install fakeinstall/usr/lib/vdpau
- install -m755 -d "${pkgdir}/usr/share/licenses/mesa-vdpau"
- install -m644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/mesa-vdpau/"
+ install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" LICENSE
}
package_mesa() {
- pkgdesc="an open-source implementation of the OpenGL specification"
depends=('libdrm' 'wayland' 'libxxf86vm' 'libxdamage' 'libxshmfence' 'libelf'
'libomxil-bellagio' 'libunwind' 'llvm-libs' 'lm_sensors' 'libglvnd')
optdepends=('opengl-man-pages: for the OpenGL API man pages'
@@ -154,38 +150,38 @@ package_mesa() {
provides=('ati-dri' 'intel-dri' 'nouveau-dri' 'svga-dri' 'mesa-dri' 'mesa-libgl' 'opengl-driver')
conflicts=('ati-dri' 'intel-dri' 'nouveau-dri' 'svga-dri' 'mesa-dri' 'mesa-libgl')
replaces=('ati-dri' 'intel-dri' 'nouveau-dri' 'svga-dri' 'mesa-dri' 'mesa-libgl')
- backup=('etc/drirc')
- install -m755 -d ${pkgdir}/etc
- cp -rv ${srcdir}/fakeinstall/etc/drirc ${pkgdir}/etc
-
- install -m755 -d ${pkgdir}/usr/share/glvnd/egl_vendor.d
- cp -rv ${srcdir}/fakeinstall/usr/share/glvnd/egl_vendor.d/50_mesa.json ${pkgdir}/usr/share/glvnd/egl_vendor.d/
+ _install fakeinstall/usr/share/drirc.d/00-mesa-defaults.conf
+ _install fakeinstall/usr/share/glvnd/egl_vendor.d/50_mesa.json
- install -m755 -d ${pkgdir}/usr/lib/dri
# ati-dri, nouveau-dri, intel-dri, svga-dri, swrast
- cp -av ${srcdir}/fakeinstall/usr/lib/dri/*_dri.so ${pkgdir}/usr/lib/dri
+ _install fakeinstall/usr/lib/dri/*_dri.so
- cp -rv ${srcdir}/fakeinstall/usr/lib/bellagio ${pkgdir}/usr/lib
- cp -rv ${srcdir}/fakeinstall/usr/lib/d3d ${pkgdir}/usr/lib
- cp -rv ${srcdir}/fakeinstall/usr/lib/lib{gbm,glapi}.so* ${pkgdir}/usr/lib/
- cp -rv ${srcdir}/fakeinstall/usr/lib/libOSMesa.so* ${pkgdir}/usr/lib/
- cp -rv ${srcdir}/fakeinstall/usr/lib/libwayland*.so* ${pkgdir}/usr/lib/
- cp -rv ${srcdir}/fakeinstall/usr/lib/libxatracker.so* ${pkgdir}/usr/lib/
- cp -rv ${srcdir}/fakeinstall/usr/lib/libswrAVX*.so* ${pkgdir}/usr/lib/
-
- cp -rv ${srcdir}/fakeinstall/usr/include ${pkgdir}/usr
- cp -rv ${srcdir}/fakeinstall/usr/lib/pkgconfig ${pkgdir}/usr/lib/
+ _install fakeinstall/usr/lib/bellagio
+ _install fakeinstall/usr/lib/d3d
+ _install fakeinstall/usr/lib/lib{gbm,glapi}.so*
+ _install fakeinstall/usr/lib/libOSMesa.so*
+ _install fakeinstall/usr/lib/libxatracker.so*
+ # _install fakeinstall/usr/lib/libswrAVX*.so*
+
+ # in libglvnd
+ rm -v fakeinstall/usr/lib/libGLESv{1_CM,2}.so*
- # remove vulkan headers
- rm -rf ${pkgdir}/usr/include/vulkan
+ # in vulkan-headers
+ rm -rv fakeinstall/usr/include/vulkan
+
+ _install fakeinstall/usr/include
+ _install fakeinstall/usr/lib/pkgconfig
# libglvnd support
- cp -rv ${srcdir}/fakeinstall/usr/lib/libGLX_mesa.so* ${pkgdir}/usr/lib/
- cp -rv ${srcdir}/fakeinstall/usr/lib/libEGL_mesa.so* ${pkgdir}/usr/lib/
+ _install fakeinstall/usr/lib/libGLX_mesa.so*
+ _install fakeinstall/usr/lib/libEGL_mesa.so*
+
# indirect rendering
- ln -s /usr/lib/libGLX_mesa.so.0 ${pkgdir}/usr/lib/libGLX_indirect.so.0
+ ln -s /usr/lib/libGLX_mesa.so.0 "${pkgdir}/usr/lib/libGLX_indirect.so.0"
+
+ # make sure there are no files left to install
+ find fakeinstall -depth -print0 | xargs -0 rmdir
- install -m755 -d "${pkgdir}/usr/share/licenses/mesa"
- install -m644 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/mesa/"
+ install -m644 -Dt "${pkgdir}/usr/share/licenses/${pkgname}" LICENSE
}
diff --git a/abs/core/mesa/get-program-name-based-on-path.patch b/abs/core/mesa/get-program-name-based-on-path.patch
new file mode 100644
index 0000000..66e97f5
--- /dev/null
+++ b/abs/core/mesa/get-program-name-based-on-path.patch
@@ -0,0 +1,58 @@
+From 759b94038987bb983398cd4b1d2cb1c8f79817a9 Mon Sep 17 00:00:00 2001
+From: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Date: Tue, 23 Oct 2018 11:38:48 -0400
+Subject: [PATCH] util: Get program name based on path when possible
+
+Some programs start with the path and command line arguments in
+argv[0] (program_invocation_name). Chromium is an example of
+an application using mesa that does this.
+
+This tries to query the real path for the symbolic link /proc/self/exe
+to find the program name instead. It only uses the realpath if it
+was a prefix of the invocation to avoid breaking wine programs.
+
+Cc: Timothy Arceri <tarceri@itsqueeze.com>
+Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
+Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
+---
+ src/util/u_process.c | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+diff --git a/src/util/u_process.c b/src/util/u_process.c
+index 5e5927678d8..a1667e78074 100644
+--- a/src/util/u_process.c
++++ b/src/util/u_process.c
+@@ -41,8 +41,29 @@ static const char *
+ __getProgramName()
+ {
+ char * arg = strrchr(program_invocation_name, '/');
+- if (arg)
++ if (arg) {
++ /* If the / character was found this is likely a linux path or
++ * an invocation path for a 64-bit wine program.
++ *
++ * However, some programs pass command line arguments into argv[0].
++ * Strip these arguments out by using the realpath only if it was
++ * a prefix of the invocation name.
++ */
++ static char *path;
++
++ if (!path)
++ path = realpath("/proc/self/exe", NULL);
++
++ if (path && strncmp(path, program_invocation_name, strlen(path)) == 0) {
++ /* This shouldn't be null because path is a a prefix,
++ * but check it anyway since path is static. */
++ char * name = strrchr(path, '/');
++ if (name)
++ return name + 1;
++ }
++
+ return arg+1;
++ }
+
+ /* If there was no '/' at all we likely have a windows like path from
+ * a wine application.
+--
+2.18.1
+
diff --git a/abs/core/mplayer/PKGBUILD b/abs/core/mplayer/PKGBUILD
index c59bebe..b8d0459 100644
--- a/abs/core/mplayer/PKGBUILD
+++ b/abs/core/mplayer/PKGBUILD
@@ -5,8 +5,8 @@
pkgbase=mplayer
pkgname=('mplayer' 'mencoder')
-pkgver=38017
-pkgrel=1
+pkgver=38101
+pkgrel=2
pkgdesc='Media player for Linux'
url='http://www.mplayerhq.hu/'
arch=('x86_64')
@@ -14,7 +14,7 @@ license=('GPL')
makedepends=('libxxf86dga' 'libmad' 'libxinerama' 'libmng' 'libxss' 'smbclient' 'aalib'
'libcaca' 'faac' 'faad2' 'lirc' 'libxvmc' 'enca' 'libdca' 'a52dec' 'libvpx' 'unzip'
'mesa' 'live-media' 'yasm' 'git' 'mpg123' 'ladspa' 'libcdio-paranoia' 'subversion'
- 'x264' 'libx264' 'rtmpdump' 'libdvdcss' 'libdvdread' 'libdvdnav' 'ffmpeg')
+ 'x264' 'rtmpdump' 'libdvdcss' 'libdvdread' 'libdvdnav' 'ffmpeg')
options=('!emptydirs')
source=(${pkgbase}-${pkgver}::"svn://svn.mplayerhq.hu/mplayer/trunk#revision=${pkgver}"
mplayer.desktop
@@ -68,7 +68,7 @@ package_mplayer() {
pkgdesc='Media player for Linux'
backup=('etc/mplayer/codecs.conf' 'etc/mplayer/input.conf')
depends=('desktop-file-utils' 'ttf-font' 'enca' 'libxss' 'a52dec' 'libvpx'
- 'lirc' 'libx264' 'libmng' 'libdca' 'aalib' 'libxinerama' 'smbclient'
+ 'lirc' 'x264' 'libmng' 'libdca' 'aalib' 'libxinerama' 'smbclient'
'libmad' 'libcaca' 'libxxf86dga' 'faac' 'faad2' 'libxvmc' 'mpg123'
'libcdio-paranoia' 'rtmpdump' 'libdvdnav' 'ffmpeg')
@@ -82,7 +82,7 @@ package_mplayer() {
package_mencoder() {
pkgdesc='Free command line video decoding, encoding and filtering tool'
- depends=('enca' 'a52dec' 'libvpx' 'libx264' 'libmng' 'libdca' 'smbclient' 'libmad'
+ depends=('enca' 'a52dec' 'libvpx' 'x264' 'libmng' 'libdca' 'smbclient' 'libmad'
'faac' 'faad2' 'mpg123' 'libcdio-paranoia' 'rtmpdump' 'libdvdnav' 'ffmpeg')
make -C ${pkgbase}-${pkgver} DESTDIR="${pkgdir}" install-mencoder install-mencoder-man
diff --git a/abs/core/mythdb-initial/PKGBUILD b/abs/core/mythdb-initial/PKGBUILD
index 6d014bc..29d49d2 100755
--- a/abs/core/mythdb-initial/PKGBUILD
+++ b/abs/core/mythdb-initial/PKGBUILD
@@ -1,6 +1,6 @@
pkgname=mythdb-initial
-pkgver=8.5
-pkgrel=4
+pkgver=8.6
+pkgrel=1
pkgdesc="setup the initial mythtv database for linhes"
url=""
license=()
@@ -20,6 +20,6 @@ package() {
cp $srcdir/custom.sql $pkgdir/data/database/custom.sql
}
-md5sums=('fb6be5fd1f77fd4211e9727061e2dca5'
+md5sums=('67114acfb6661e5d5c57644fe8d7fe0c'
'ad0e57ac5e7c3677808a670e16634bba'
- '9246104782d867342c63510d3c77f573')
+ 'bce3cebbe4e6ec360745093e5a3fcde9')
diff --git a/abs/core/mythdb-initial/custom.sql b/abs/core/mythdb-initial/custom.sql
index a666a2f..913938e 100644
--- a/abs/core/mythdb-initial/custom.sql
+++ b/abs/core/mythdb-initial/custom.sql
@@ -182,9 +182,9 @@ INSERT INTO `settings` (`value`, `data`, `hostname`) VALUES
-- Defaults for OS install
INSERT INTO `settings` (`value`, `data`, `hostname`) VALUES
('HOSTuprootfstype','ext4' , 'apheleia'),
-('HOSTOSsize', '5' , 'apheleia'),
+('HOSTOSsize', '6' , 'apheleia'),
('HOSTrootfstype', 'ext4' , 'apheleia'),
-('HOSTHOMEsize', '5' , 'apheleia'),
+('HOSTHOMEsize', '6' , 'apheleia'),
('HOSTDatabasesize','3' , 'apheleia'),
('HostUseSWAP', '1' , 'apheleia'),
('HostUseALLdata', '1' , 'apheleia'),
diff --git a/abs/core/mythdb-initial/mc.sql b/abs/core/mythdb-initial/mc.sql
index c0343f0..f3ceb4e 100644
--- a/abs/core/mythdb-initial/mc.sql
+++ b/abs/core/mythdb-initial/mc.sql
@@ -1,8 +1,8 @@
--- MySQL dump 10.13 Distrib 5.6.35, for Linux (x86_64)
+-- MySQL dump 10.13 Distrib 5.6.39, for Linux (x86_64)
--
-- Host: localhost Database: mythconverg
-- ------------------------------------------------------
--- Server version 5.6.35
+-- Server version 5.6.39
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -872,7 +872,7 @@ CREATE TABLE `housekeeping` (
LOCK TABLES `housekeeping` WRITE;
/*!40000 ALTER TABLE `housekeeping` DISABLE KEYS */;
-INSERT INTO `housekeeping` VALUES ('BackupDB',NULL,'2017-09-18 03:10:11',NULL);
+INSERT INTO `housekeeping` VALUES ('BackupDB',NULL,'2019-02-28 22:31:49',NULL);
/*!40000 ALTER TABLE `housekeeping` ENABLE KEYS */;
UNLOCK TABLES;
@@ -1118,7 +1118,7 @@ CREATE TABLE `keybindings` (
LOCK TABLES `keybindings` WRITE;
/*!40000 ALTER TABLE `keybindings` DISABLE KEYS */;
-INSERT INTO `keybindings` VALUES ('Global','UP','Up Arrow','Up','apheleia'),('Global','DOWN','Down Arrow','Down','apheleia'),('Global','LEFT','Left Arrow','Left','apheleia'),('Global','RIGHT','Right Arrow','Right','apheleia'),('Global','NEXT','Move to next widget','Tab','apheleia'),('Global','PREVIOUS','Move to preview widget','Backtab','apheleia'),('Global','SELECT','Select','Return,Enter,Space','apheleia'),('Global','BACKSPACE','Backspace','Backspace','apheleia'),('Global','ESCAPE','Escape','Esc','apheleia'),('Global','MENU','Pop-up menu','M','apheleia'),('Global','INFO','More information','I','apheleia'),('Global','DELETE','Delete','D','apheleia'),('Global','EDIT','Edit','E','apheleia'),('Global','SCREENSHOT','Save screenshot','','apheleia'),('Global','HANDLEMEDIA','Play a media resource','','apheleia'),('Global','PAGEUP','Page Up','PgUp','apheleia'),('Global','PAGEDOWN','Page Down','PgDown','apheleia'),('Global','PAGETOP','Page to top of list','','apheleia'),('Global','PAGEMIDDLE','Page to middle of list','','apheleia'),('Global','PAGEBOTTOM','Page to bottom of list','','apheleia'),('Global','PREVVIEW','Previous View','Home','apheleia'),('Global','NEXTVIEW','Next View','End','apheleia'),('Global','HELP','Help','F1','apheleia'),('Global','EJECT','Eject Removable Media','','apheleia'),('Global','CUT','Cut text from textedit','Ctrl+X','apheleia'),('Global','COPY','Copy text from textedit','Ctrl+C','apheleia'),('Global','PASTE','Paste text into textedit','Ctrl+V','apheleia'),('Global','NEWLINE','Insert newline into textedit','Ctrl+Return','apheleia'),('Global','UNDO','Undo','Ctrl+Z','apheleia'),('Global','REDO','Redo','Ctrl+Y','apheleia'),('Global','SEARCH','Show incremental search dialog','Ctrl+S','apheleia'),('Global','0','0','0','apheleia'),('Global','1','1','1','apheleia'),('Global','2','2','2','apheleia'),('Global','3','3','3','apheleia'),('Global','4','4','4','apheleia'),('Global','5','5','5','apheleia'),('Global','6','6','6','apheleia'),('Global','7','7','7','apheleia'),('Global','8','8','8','apheleia'),('Global','9','9','9','apheleia'),('Global','TVPOWERON','Turn the display on','','apheleia'),('Global','TVPOWEROFF','Turn the display off','','apheleia'),('Global','SYSEVENT01','Trigger System Key Event #1','','apheleia'),('Global','SYSEVENT02','Trigger System Key Event #2','','apheleia'),('Global','SYSEVENT03','Trigger System Key Event #3','','apheleia'),('Global','SYSEVENT04','Trigger System Key Event #4','','apheleia'),('Global','SYSEVENT05','Trigger System Key Event #5','','apheleia'),('Global','SYSEVENT06','Trigger System Key Event #6','','apheleia'),('Global','SYSEVENT07','Trigger System Key Event #7','','apheleia'),('Global','SYSEVENT08','Trigger System Key Event #8','','apheleia'),('Global','SYSEVENT09','Trigger System Key Event #9','','apheleia'),('Global','SYSEVENT10','Trigger System Key Event #10','','apheleia'),('Browser','ZOOMIN','Zoom in on browser window','.,>','apheleia'),('Browser','ZOOMOUT','Zoom out on browser window',',,<','apheleia'),('Browser','TOGGLEINPUT','Toggle where keyboard input goes to','F1','apheleia'),('Browser','MOUSEUP','Move mouse pointer up','2','apheleia'),('Browser','MOUSEDOWN','Move mouse pointer down','8','apheleia'),('Browser','MOUSELEFT','Move mouse pointer left','4','apheleia'),('Browser','MOUSERIGHT','Move mouse pointer right','6','apheleia'),('Browser','MOUSELEFTBUTTON','Mouse Left button click','5','apheleia'),('Browser','PAGEDOWN','Scroll down half a page','9','apheleia'),('Browser','PAGEUP','Scroll up half a page','3','apheleia'),('Browser','PAGELEFT','Scroll left half a page','7','apheleia'),('Browser','PAGERIGHT','Scroll right half a page','1','apheleia'),('Browser','NEXTLINK','Move selection to next link','Z','apheleia'),('Browser','PREVIOUSLINK','Move selection to previous link','Q','apheleia'),('Browser','FOLLOWLINK','Follow selected link','Return,Space,Enter','apheleia'),('Browser','HISTORYBACK','Go back to previous page','R,Backspace','apheleia'),('Browser','HISTORYFORWARD','Go forward to previous page','F','apheleia'),('Main Menu','EXITPROMPT','Display System Exit Prompt','Esc','apheleia'),('Main Menu','EXIT','System Exit','','apheleia'),('Main Menu','STANDBYMODE','Enter Standby Mode','','apheleia');
+INSERT INTO `keybindings` VALUES ('Global','UP','Up Arrow','Up','apheleia'),('Global','DOWN','Down Arrow','Down','apheleia'),('Global','LEFT','Left Arrow','Left','apheleia'),('Global','RIGHT','Right Arrow','Right','apheleia'),('Global','NEXT','Move to next widget','Tab','apheleia'),('Global','PREVIOUS','Move to preview widget','Backtab','apheleia'),('Global','SELECT','Select','Return,Enter,Space','apheleia'),('Global','BACKSPACE','Backspace','Backspace','apheleia'),('Global','ESCAPE','Escape','Esc','apheleia'),('Global','MENU','Pop-up menu','M,Meta+Enter','apheleia'),('Global','INFO','More information','I','apheleia'),('Global','DELETE','Delete','D','apheleia'),('Global','EDIT','Edit','E','apheleia'),('Global','SCREENSHOT','Save screenshot','','apheleia'),('Global','HANDLEMEDIA','Play a media resource','','apheleia'),('Global','PAGEUP','Page Up','PgUp','apheleia'),('Global','PAGEDOWN','Page Down','PgDown','apheleia'),('Global','PAGETOP','Page to top of list','','apheleia'),('Global','PAGEMIDDLE','Page to middle of list','','apheleia'),('Global','PAGEBOTTOM','Page to bottom of list','','apheleia'),('Global','PREVVIEW','Previous View','Home','apheleia'),('Global','NEXTVIEW','Next View','End','apheleia'),('Global','HELP','Help','F1','apheleia'),('Global','EJECT','Eject Removable Media','','apheleia'),('Global','CUT','Cut text from textedit','Ctrl+X','apheleia'),('Global','COPY','Copy text from textedit','Ctrl+C','apheleia'),('Global','PASTE','Paste text into textedit','Ctrl+V','apheleia'),('Global','NEWLINE','Insert newline into textedit','Ctrl+Return','apheleia'),('Global','UNDO','Undo','Ctrl+Z','apheleia'),('Global','REDO','Redo','Ctrl+Y','apheleia'),('Global','SEARCH','Show incremental search dialog','Ctrl+S','apheleia'),('Global','0','0','0','apheleia'),('Global','1','1','1','apheleia'),('Global','2','2','2','apheleia'),('Global','3','3','3','apheleia'),('Global','4','4','4','apheleia'),('Global','5','5','5','apheleia'),('Global','6','6','6','apheleia'),('Global','7','7','7','apheleia'),('Global','8','8','8','apheleia'),('Global','9','9','9','apheleia'),('Global','TVPOWERON','Turn the display on','','apheleia'),('Global','TVPOWEROFF','Turn the display off','','apheleia'),('Global','SYSEVENT01','Trigger System Key Event #1','','apheleia'),('Global','SYSEVENT02','Trigger System Key Event #2','','apheleia'),('Global','SYSEVENT03','Trigger System Key Event #3','','apheleia'),('Global','SYSEVENT04','Trigger System Key Event #4','','apheleia'),('Global','SYSEVENT05','Trigger System Key Event #5','','apheleia'),('Global','SYSEVENT06','Trigger System Key Event #6','','apheleia'),('Global','SYSEVENT07','Trigger System Key Event #7','','apheleia'),('Global','SYSEVENT08','Trigger System Key Event #8','','apheleia'),('Global','SYSEVENT09','Trigger System Key Event #9','','apheleia'),('Global','SYSEVENT10','Trigger System Key Event #10','','apheleia'),('Browser','ZOOMIN','Zoom in on browser window','.,>','apheleia'),('Browser','ZOOMOUT','Zoom out on browser window',',,<','apheleia'),('Browser','TOGGLEINPUT','Toggle where keyboard input goes to','F1','apheleia'),('Browser','MOUSEUP','Move mouse pointer up','2','apheleia'),('Browser','MOUSEDOWN','Move mouse pointer down','8','apheleia'),('Browser','MOUSELEFT','Move mouse pointer left','4','apheleia'),('Browser','MOUSERIGHT','Move mouse pointer right','6','apheleia'),('Browser','MOUSELEFTBUTTON','Mouse Left button click','5','apheleia'),('Browser','PAGEDOWN','Scroll down half a page','9','apheleia'),('Browser','PAGEUP','Scroll up half a page','3','apheleia'),('Browser','PAGELEFT','Scroll left half a page','7','apheleia'),('Browser','PAGERIGHT','Scroll right half a page','1','apheleia'),('Browser','NEXTLINK','Move selection to next link','Z','apheleia'),('Browser','PREVIOUSLINK','Move selection to previous link','Q','apheleia'),('Browser','FOLLOWLINK','Follow selected link','Return,Space,Enter','apheleia'),('Browser','HISTORYBACK','Go back to previous page','R,Backspace','apheleia'),('Browser','HISTORYFORWARD','Go forward to previous page','F','apheleia'),('Main Menu','EXITPROMPT','Display System Exit Prompt','Esc','apheleia'),('Main Menu','EXIT','System Exit','','apheleia'),('Main Menu','STANDBYMODE','Enter Standby Mode','','apheleia'),('Long Press','LONGPRESS1','Up to 16 Keys that allow Long Press','','apheleia'),('Long Press','LONGPRESS2','Up to 16 Keys that allow Long Press','','apheleia'),('Long Press','LONGPRESS3','Up to 16 Keys that allow Long Press','','apheleia'),('Long Press','LONGPRESS4','Up to 16 Keys that allow Long Press','','apheleia');
/*!40000 ALTER TABLE `keybindings` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2205,7 +2205,7 @@ CREATE TABLE `settings` (
LOCK TABLES `settings` WRITE;
/*!40000 ALTER TABLE `settings` DISABLE KEYS */;
-INSERT INTO `settings` VALUES ('mythfilldatabaseLastRunStart','',NULL),('mythfilldatabaseLastRunEnd','',NULL),('mythfilldatabaseLastRunStatus','',NULL),('DataDirectMessage','',NULL),('HaveRepeats','0',NULL),('DBSchemaVer','1348',NULL),('Language','en_US',NULL),('Country','US',NULL),('FreqTable','us-bcast',NULL),('ISO639Language0','eng',NULL),('ISO639Language1','eng',NULL),('TVFormat','NTSC',NULL),('VbiFormat','NTSC Closed Caption',NULL),('BackupDBLastRunStart','2017-09-18 03:10:10',NULL),('BackupDBLastRunEnd','2017-09-18 03:10:11',NULL),('HardwareProfileEnabled','0',NULL),('BackendServerIP','127.0.0.1','apheleia'),('BackendServerIP6','::1','apheleia'),('AllowLinkLocal','1','apheleia'),('BackendServerPort','6543','apheleia'),('BackendStatusPort','6544','apheleia'),('MasterServerIP','127.0.0.1',NULL),('MasterServerPort','6543',NULL),('MasterBackendOverride','1',NULL),('DeletesFollowLinks','0',NULL),('TruncateDeletesSlowly','0','apheleia'),('HDRingbufferSize','9400',NULL),('StorageScheduler','BalancedFreeSpace',NULL),('UPnP/WMPSource','0',NULL),('DisableAutomaticBackup','0',NULL),('DisableFirewireReset','0','apheleia'),('EITTransportTimeout','5',NULL),('EITCrawIdleStart','60',NULL),('blockSDWUwithoutClient','1',NULL),('idleWaitForRecordingTime','15',NULL),('StartupSecsBeforeRecording','120',NULL),('WakeupTimeFormat','hh:mm yyyy-MM-dd',NULL),('ServerHaltCommand','sudo /sbin/halt -p',NULL),('WOLbackendConnectRetry','5',NULL),('BackendStopCommand','killall mythbackend',NULL),('BackendStartCommand','mythbackend',NULL),('JobQueueMaxSimultaneousJobs','1','apheleia'),('JobQueueCheckFrequency','60','apheleia'),('JobQueueWindowStart','00:00','apheleia'),('JobQueueWindowEnd','23:59','apheleia'),('JobQueueCPU','0','apheleia'),('JobAllowMetadata','1','apheleia'),('JobAllowCommFlag','1','apheleia'),('JobAllowTranscode','1','apheleia'),('JobAllowUserJob1','0','apheleia'),('JobAllowUserJob2','0','apheleia'),('JobAllowUserJob3','0','apheleia'),('JobAllowUserJob4','0','apheleia'),('JobsRunOnRecordHost','0',NULL),('AutoCommflagWhileRecording','0',NULL),('JobQueueCommFlagCommand','mythcommflag',NULL),('JobQueueTranscodeCommand','mythtranscode',NULL),('AutoTranscodeBeforeAutoCommflag','0',NULL),('SaveTranscoding','0',NULL),('UserJobDesc1','User Job #1',NULL),('UserJobDesc2','User Job #2',NULL),('UserJobDesc3','User Job #3',NULL),('UserJobDesc4','User Job #4',NULL),('MythFillEnabled','1',NULL),('MythFillDatabasePath','mythfilldatabase',NULL),('MythFillMaxHour','23',NULL),('MythFillGrabberSuggestsTime','1',NULL),('DateFormat','ddd MMM d yyyy','apheleia'),('MythArchiveDateFormat','%a %b %d %Y','apheleia'),('MythArchiveTimeFormat','%I:%M %p','apheleia'),('MythArchiveVideoFormat','NTSC','apheleia'),('ShortDateFormat','M/d','apheleia'),('TimeFormat','h:mm AP','apheleia'),('WebBrowserZoomLevel','1','apheleia'),('ImageStorageGroupName','Images',NULL),('ImageSortOrder','0',NULL),('ImageShowHiddenFiles','0',NULL),('ImageSlideShowTime','3500',NULL),('ImageTransitionType','1',NULL),('ImageTransitionTime','1000',NULL),('MasterServerName','apheleia',NULL),('BackendServerAddr','127.0.0.1','apheleia');
+INSERT INTO `settings` VALUES ('mythfilldatabaseLastRunStart','',NULL),('mythfilldatabaseLastRunEnd','',NULL),('mythfilldatabaseLastRunStatus','',NULL),('DataDirectMessage','',NULL),('HaveRepeats','0',NULL),('DBSchemaVer','1350',NULL),('Language','en_US',NULL),('Country','US',NULL),('FreqTable','us-bcast',NULL),('ISO639Language0','eng',NULL),('ISO639Language1','eng',NULL),('TVFormat','NTSC',NULL),('VbiFormat','NTSC Closed Caption',NULL),('BackupDBLastRunStart','2019-02-28 22:31:49',NULL),('BackupDBLastRunEnd','2019-02-28 22:31:49',NULL),('HardwareProfileEnabled','0',NULL),('BackendServerIP','127.0.0.1','apheleia'),('BackendServerIP6','::1','apheleia'),('AllowLinkLocal','1','apheleia'),('BackendServerPort','6543','apheleia'),('BackendStatusPort','6544','apheleia'),('MasterServerIP','127.0.0.1',NULL),('MasterServerPort','6543',NULL),('MasterBackendOverride','1',NULL),('DeletesFollowLinks','0',NULL),('TruncateDeletesSlowly','0','apheleia'),('HDRingbufferSize','9400',NULL),('StorageScheduler','BalancedFreeSpace',NULL),('UPnP/WMPSource','0',NULL),('DisableAutomaticBackup','0',NULL),('DisableFirewireReset','0','apheleia'),('EITTransportTimeout','5',NULL),('EITCrawIdleStart','60',NULL),('blockSDWUwithoutClient','1',NULL),('idleWaitForRecordingTime','15',NULL),('StartupSecsBeforeRecording','120',NULL),('WakeupTimeFormat','hh:mm yyyy-MM-dd',NULL),('ServerHaltCommand','sudo /sbin/halt -p',NULL),('WOLbackendConnectRetry','5',NULL),('BackendStopCommand','killall mythbackend',NULL),('BackendStartCommand','mythbackend',NULL),('JobQueueMaxSimultaneousJobs','1','apheleia'),('JobQueueCheckFrequency','60','apheleia'),('JobQueueWindowStart','00:00','apheleia'),('JobQueueWindowEnd','23:59','apheleia'),('JobQueueCPU','0','apheleia'),('JobAllowMetadata','1','apheleia'),('JobAllowCommFlag','1','apheleia'),('JobAllowTranscode','1','apheleia'),('JobAllowUserJob1','0','apheleia'),('JobAllowUserJob2','0','apheleia'),('JobAllowUserJob3','0','apheleia'),('JobAllowUserJob4','0','apheleia'),('JobsRunOnRecordHost','0',NULL),('AutoCommflagWhileRecording','0',NULL),('JobQueueCommFlagCommand','mythcommflag',NULL),('JobQueueTranscodeCommand','mythtranscode',NULL),('AutoTranscodeBeforeAutoCommflag','0',NULL),('SaveTranscoding','0',NULL),('UserJobDesc1','User Job #1',NULL),('UserJobDesc2','User Job #2',NULL),('UserJobDesc3','User Job #3',NULL),('UserJobDesc4','User Job #4',NULL),('MythFillEnabled','1',NULL),('MythFillDatabasePath','mythfilldatabase',NULL),('MythFillMaxHour','23',NULL),('MythFillGrabberSuggestsTime','1',NULL),('DateFormat','ddd MMM d yyyy','apheleia'),('MythArchiveDateFormat','%a %b %d %Y','apheleia'),('MythArchiveTimeFormat','%I:%M %p','apheleia'),('MythArchiveVideoFormat','NTSC','apheleia'),('ShortDateFormat','M/d','apheleia'),('TimeFormat','h:mm AP','apheleia'),('WebBrowserZoomLevel','1','apheleia'),('ImageStorageGroupName','Images',NULL),('ImageSortOrder','0',NULL),('ImageShowHiddenFiles','0',NULL),('ImageSlideShowTime','3500',NULL),('ImageTransitionType','1',NULL),('ImageTransitionTime','1000',NULL),('MasterServerName','apheleia',NULL),('BackendServerAddr','127.0.0.1','apheleia'),('DateFormat','ddd MMM d yyyy','apheleia'),('MythArchiveDateFormat','%a %b %d %Y','apheleia'),('MythArchiveTimeFormat','%I:%M %p','apheleia'),('MythArchiveVideoFormat','NTSC','apheleia'),('ShortDateFormat','M/d','apheleia'),('TimeFormat','h:mm AP','apheleia'),('WebBrowserZoomLevel','1','apheleia');
/*!40000 ALTER TABLE `settings` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2786,4 +2786,5 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2017-09-17 22:11:31
+-- Dump completed on 2019-02-28 16:32:31
+
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.cpp b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.cpp
new file mode 100644
index 0000000..f530872
--- /dev/null
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.cpp
@@ -0,0 +1,162 @@
+// -*- Mode: c++ -*-
+
+
+#include "mythconfigdialogs.h"
+
+#include "mythwizard.h"
+#include "mythuihelper.h"
+
+// C++ headers
+#include <vector>
+using std::vector;
+
+#include <QApplication>
+#include <QWidget>
+#include <QHBoxLayout>
+
+static void clear_widgets(vector<Configurable*> &children,
+ vector<QWidget*> &childwidget)
+{
+ for (uint i = 0; (i < childwidget.size()) && (i < children.size()); i++)
+ {
+ if (children[i] && childwidget[i])
+ children[i]->widgetInvalid(childwidget[i]);
+ }
+ childwidget.clear();
+}
+
+void ConfigurationDialogWidget::keyPressEvent(QKeyEvent* e)
+{
+ bool handled = false;
+ QStringList actions;
+
+ handled = GetMythMainWindow()->TranslateKeyPress("qt", e, actions);
+
+ for (int i = 0; i < actions.size() && !handled; i++)
+ {
+ const QString &action = actions[i];
+ handled = true;
+
+ if (action == "SELECT")
+ accept();
+ else if (action == "ESCAPE")
+ reject();
+ else if (action == "EDIT")
+ emit editButtonPressed();
+ else if (action == "DELETE")
+ emit deleteButtonPressed();
+ else
+ handled = false;
+ }
+
+ if (!handled)
+ MythDialog::keyPressEvent(e);
+}
+
+ConfigurationDialog::~ConfigurationDialog()
+{
+ clear_widgets(cfgChildren, childwidget);
+ cfgGrp->deleteLater();
+}
+
+MythDialog* ConfigurationDialog::dialogWidget(MythMainWindow *parent,
+ const char *widgetName)
+{
+ dialog = new ConfigurationDialogWidget(parent, widgetName);
+
+ float wmult = 0, hmult = 0;
+
+ GetMythUI()->GetScreenSettings(wmult, hmult);
+
+ QVBoxLayout *layout = new QVBoxLayout(dialog);
+ layout->setSpacing((int)(20 * hmult));
+
+ ChildList::iterator it = cfgChildren.begin();
+ childwidget.clear();
+ childwidget.resize(cfgChildren.size());
+ for (uint i = 0; it != cfgChildren.end(); ++it, ++i)
+ {
+ if ((*it)->isVisible())
+ {
+ childwidget[i] = (*it)->configWidget(cfgGrp, dialog);
+ layout->addWidget(childwidget[i]);
+ }
+ }
+
+ return dialog;
+}
+
+DialogCode ConfigurationDialog::exec(bool saveOnAccept, bool doLoad)
+{
+ if (doLoad)
+ Load();
+
+ MythDialog *dialog = dialogWidget(
+ GetMythMainWindow(), "Configuration Dialog");
+
+ dialog->Show();
+
+ DialogCode ret = dialog->exec();
+
+ if ((QDialog::Accepted == ret) && saveOnAccept)
+ Save();
+
+ clear_widgets(cfgChildren, childwidget);
+
+ dialog->deleteLater();
+ dialog = NULL;
+
+ return ret;
+}
+
+void ConfigurationDialog::addChild(Configurable *child)
+{
+ cfgChildren.push_back(child);
+ cfgGrp->addChild(child);
+}
+
+void ConfigurationDialog::setLabel(const QString &label)
+{
+ if (label.isEmpty())
+ {
+ cfgGrp->setUseLabel(false);
+ cfgGrp->setLabel("");
+ }
+ else
+ {
+ cfgGrp->setLabel(label);
+ cfgGrp->setUseLabel(true);
+ cfgGrp->setUseFrame(true);
+ }
+}
+
+MythDialog *ConfigurationWizard::dialogWidget(MythMainWindow *parent,
+ const char *widgetName)
+{
+ MythWizard *wizard = new MythWizard(parent, widgetName);
+ dialog = wizard;
+
+ QObject::connect(cfgGrp, SIGNAL(changeHelpText(QString)),
+ wizard, SLOT( setHelpText( QString)));
+
+ QWidget *widget = parent;
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+ if (qApp->platformName().contains("egl"))
+ widget = wizard;
+#endif
+ QWidget *child = NULL;
+ ChildList::iterator it = cfgChildren.begin();
+ for (; it != cfgChildren.end(); ++it)
+ {
+ if (!(*it)->isVisible())
+ continue;
+
+ child = (*it)->configWidget(cfgGrp, widget);
+ wizard->addPage(child, (*it)->getLabel());
+ }
+
+ if (child)
+ wizard->setFinishEnabled(child, true);
+
+ return wizard;
+}
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.h b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.h
new file mode 100644
index 0000000..4d9969c
--- /dev/null
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfigdialogs.h
@@ -0,0 +1,83 @@
+// -*- Mode: c++ -*-
+
+#ifndef MYTH_CONFIG_DIALOGS_H
+#define MYTH_CONFIG_DIALOGS_H
+
+// Qt headers
+#include <QObject>
+#include <QString>
+
+// MythTV headers
+#include "mythexp.h"
+#include "mythdialogs.h"
+#include "mythstorage.h"
+#include "mythconfiggroups.h"
+
+class MPUBLIC ConfigurationDialogWidget : public MythDialog
+{
+ Q_OBJECT
+
+ public:
+ ConfigurationDialogWidget(MythMainWindow *parent,
+ const char *widgetName) :
+ MythDialog(parent, widgetName) { }
+
+ virtual void keyPressEvent(QKeyEvent *e);
+
+ signals:
+ void editButtonPressed(void);
+ void deleteButtonPressed(void);
+};
+
+/** \class ConfigurationDialog
+ * \brief A ConfigurationDialog that uses a ConfigurationGroup
+ * all children on one page in a vertical layout.
+ */
+class MPUBLIC ConfigurationDialog : public Storage
+{
+ public:
+ ConfigurationDialog() : dialog(NULL), cfgGrp(new ConfigurationGroup()) { }
+ virtual ~ConfigurationDialog();
+
+ // Make a modal dialog containing configWidget
+ virtual MythDialog *dialogWidget(MythMainWindow *parent,
+ const char *widgetName);
+
+ // Show a dialogWidget, and save if accepted
+ virtual DialogCode exec(bool saveOnExec = true, bool doLoad = true);
+
+ virtual void addChild(Configurable *child);
+
+ virtual Setting *byName(const QString &settingName)
+ { return cfgGrp->byName(settingName); }
+
+ void setLabel(const QString &label);
+
+ // Storage
+ virtual void Load(void) { cfgGrp->Load(); }
+ virtual void Save(void) { cfgGrp->Save(); }
+ virtual void Save(QString destination) { cfgGrp->Save(destination); }
+
+ protected:
+ typedef std::vector<Configurable*> ChildList;
+
+ ChildList cfgChildren;
+ std::vector<QWidget*> childwidget;
+ MythDialog *dialog;
+ ConfigurationGroup *cfgGrp;
+};
+
+/** \class ConfigurationWizard
+ * \brief A ConfigurationDialog that uses a ConfigurationGroup
+ * with one child per page.
+ */
+class MPUBLIC ConfigurationWizard : public ConfigurationDialog
+{
+ public:
+ ConfigurationWizard() : ConfigurationDialog() {}
+
+ virtual MythDialog *dialogWidget(MythMainWindow *parent,
+ const char *widgetName);
+};
+
+#endif // MYTH_CONFIG_DIALOGS_H
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.cpp b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.cpp
new file mode 100644
index 0000000..08cf134
--- /dev/null
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.cpp
@@ -0,0 +1,701 @@
+#include <algorithm>
+
+using namespace std;
+
+#include <QStackedWidget>
+
+#include "mythconfiggroups.h"
+#include "mythcontext.h"
+#include "mythlogging.h"
+#include "mythuihelper.h"
+
+static void clear_widgets(vector<Configurable*> &children,
+ vector<QWidget*> &childwidget)
+{
+ for (uint i = 0; (i < childwidget.size()) && (i < children.size()); i++)
+ {
+ if (children[i] && childwidget[i])
+ children[i]->widgetInvalid(childwidget[i]);
+ }
+ childwidget.clear();
+}
+
+ConfigurationGroup::ConfigurationGroup(bool luselabel, bool luseframe,
+ bool lzeroMargin, bool lzeroSpace) :
+ Setting(this),
+ uselabel(luselabel), useframe(luseframe),
+ zeroMargin(lzeroMargin), zeroSpace(lzeroSpace)
+{
+ // Pre-calculate the margin and spacing that all sub-classes will use:
+
+ if (lzeroMargin)
+ margin = 2;
+ else
+ {
+ float wmult = 0, hmult = 0;
+
+ GetMythUI()->GetScreenSettings(wmult, hmult);
+
+ if (luselabel)
+ margin = (int)(28 * hmult * 0.5);
+ else
+ margin = (int)(10 * hmult * 0.5);
+ }
+
+ space = (lzeroSpace) ? 2 : -1;
+}
+
+ConfigurationGroup::~ConfigurationGroup()
+{
+ childList::iterator it = children.begin();
+ for (; it != children.end() ; ++it)
+ {
+ if (*it)
+ {
+ (*it)->disconnect();
+ (*it)->deleteLater();
+ }
+ }
+ children.clear();
+}
+
+void ConfigurationGroup::deleteLater(void)
+{
+ childList::iterator it = children.begin();
+ for (; it != children.end() ; ++it)
+ {
+ if (*it)
+ (*it)->disconnect();
+ }
+ Setting::deleteLater();
+}
+
+Setting *ConfigurationGroup::byName(const QString &name)
+{
+ Setting *tmp = NULL;
+
+ childList::iterator it = children.begin();
+ for (; !tmp && (it != children.end()); ++it)
+ {
+ if (*it)
+ tmp = (*it)->byName(name);
+ }
+
+ return tmp;
+}
+
+void ConfigurationGroup::Load(void)
+{
+ childList::iterator it = children.begin();
+ for (; it != children.end() ; ++it)
+ if (*it && (*it)->GetStorage())
+ (*it)->GetStorage()->Load();
+}
+
+void ConfigurationGroup::Save(void)
+{
+ childList::iterator it = children.begin();
+ for (; it != children.end() ; ++it)
+ if (*it && (*it)->GetStorage())
+ (*it)->GetStorage()->Save();
+}
+
+void ConfigurationGroup::Save(QString destination)
+{
+ childList::iterator it = children.begin();
+ for (; it != children.end() ; ++it)
+ if (*it && (*it)->GetStorage())
+ (*it)->GetStorage()->Save(destination);
+}
+
+void ConfigurationGroup::SetSaveRequired(void)
+{
+ childList::iterator it = children.begin();
+ for (; it != children.end() ; ++it)
+ if (*it && (*it)->GetStorage())
+ (*it)->GetStorage()->SetSaveRequired();
+}
+
+QWidget *VerticalConfigurationGroup::configWidget(
+ ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName)
+{
+ if (layout)
+ layout->deleteLater();
+ layout = new QVBoxLayout();
+ layout->setMargin(margin);
+ layout->setSpacing((space<0) ? margin : space);
+
+ childwidget.resize(children.size());
+ for (uint i = 0; i < children.size(); i++)
+ {
+ if (children[i] && children[i]->isVisible())
+ {
+ childwidget[i] = children[i]->configWidget(cg, NULL, NULL);
+ layout->addWidget(childwidget[i]);
+ children[i]->setEnabled(children[i]->isEnabled());
+ }
+ }
+
+ if (cg)
+ {
+ connect(this, SIGNAL(changeHelpText(QString)),
+ cg, SIGNAL(changeHelpText(QString)));
+ confgrp = cg;
+ }
+
+ if (uselabel)
+ {
+ MythGroupBox *groupbox = new MythGroupBox(parent);
+ groupbox->setObjectName(QString("VCG(%1)_groupbox").arg(widgetName));
+ groupbox->setTitle(getLabel());
+ widget = groupbox;
+ }
+ else if (useframe)
+ {
+ QFrame *frame = new QFrame(parent);
+ frame->setFrameStyle(QFrame::Box);
+ frame->setObjectName(QString("VCG(%1)_frame").arg(widgetName));
+ widget = frame;
+ }
+ else
+ {
+ widget = new QWidget(parent);
+ widget->setObjectName(QString("VCG(%1)_widget").arg(widgetName));
+ }
+
+ widget->setLayout(layout);
+ connect(widget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+ return widget;
+}
+
+void VerticalConfigurationGroup::widgetInvalid(QObject *obj)
+{
+ widget = (widget == obj) ? NULL : widget;
+}
+
+void VerticalConfigurationGroup::deleteLater(void)
+{
+ clear_widgets(children, childwidget);
+ ConfigurationGroup::deleteLater();
+}
+
+bool VerticalConfigurationGroup::replaceChild(
+ Configurable *old_child, Configurable *new_child)
+{
+ childList::iterator it = children.begin();
+ for (uint i = 0; it != children.end(); ++it, ++i)
+ {
+ if (*it != old_child)
+ continue;
+
+ *it = new_child;
+
+ if (!widget)
+ {
+ old_child->deleteLater();
+ return true;
+ }
+
+ if (childwidget[i])
+ {
+ old_child->widgetInvalid(childwidget[i]);
+ layout->removeWidget(childwidget[i]);
+ childwidget[i]->deleteLater();
+ childwidget[i] = NULL;
+ }
+
+ bool was_visible = old_child->isVisible();
+ bool was_enabled = old_child->isEnabled();
+
+ old_child->deleteLater();
+
+ if (was_visible)
+ {
+ childwidget[i] = new_child->configWidget(confgrp, widget, NULL);
+ layout->addWidget(childwidget[i]);
+ new_child->setEnabled(was_enabled);
+ childwidget[i]->resize(1,1);
+ childwidget[i]->show();
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+void VerticalConfigurationGroup::repaint(void)
+{
+ if (widget)
+ widget->repaint();
+}
+
+QWidget *HorizontalConfigurationGroup::configWidget(
+ ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName)
+{
+ QHBoxLayout *layout = new QHBoxLayout();
+ layout->setMargin(margin);
+ layout->setSpacing((space<0) ? margin : space);
+
+ for (uint i = 0 ; i < children.size() ; ++i)
+ {
+ if (children[i] && children[i]->isVisible())
+ {
+ QWidget *child = children[i]->configWidget(cg, NULL, NULL);
+ layout->addWidget(child);
+ children[i]->setEnabled(children[i]->isEnabled());
+ }
+ }
+
+ if (cg)
+ {
+ connect(this, SIGNAL(changeHelpText(QString)),
+ cg, SIGNAL(changeHelpText(QString)));
+ }
+
+ QWidget *widget = NULL;
+ if (uselabel)
+ {
+ MythGroupBox *groupbox = new MythGroupBox(parent);
+ groupbox->setObjectName(QString("HCG(%1)_groupbox").arg(widgetName));
+ groupbox->setTitle(getLabel());
+ widget = groupbox;
+ }
+ else if (useframe)
+ {
+ QFrame *frame = new QFrame(parent);
+ frame->setFrameStyle(QFrame::Box);
+ frame->setObjectName(QString("HCG(%1)_frame").arg(widgetName));
+ widget = frame;
+ }
+ else
+ {
+ widget = new QWidget(parent);
+ widget->setObjectName(QString("HCG(%1)_widget").arg(widgetName));
+ }
+
+ widget->setLayout(layout);
+ return widget;
+}
+
+QWidget* GridConfigurationGroup::configWidget(
+ ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName)
+{
+ QGridLayout *layout = new QGridLayout();
+ layout->setMargin(margin);
+ layout->setSpacing(space < 0 ? margin : space);
+
+ for (uint i = 0; i < children.size(); i++)
+ {
+ if (children[i] && children[i]->isVisible())
+ {
+ QWidget *child = children[i]->configWidget(cg, NULL, NULL);
+ layout->addWidget(child, i / columns, i % columns);
+ children[i]->setEnabled(children[i]->isEnabled());
+ }
+ }
+
+ if (cg)
+ {
+ connect(this, SIGNAL(changeHelpText(QString)),
+ cg, SIGNAL(changeHelpText(QString)));
+ }
+
+ QWidget *widget = NULL;
+ if (uselabel)
+ {
+ MythGroupBox *groupbox = new MythGroupBox(parent);
+ groupbox->setObjectName(QString("GCG(%1)_groupbox").arg(widgetName));
+ groupbox->setTitle(getLabel());
+ widget = groupbox;
+ }
+ else if (useframe)
+ {
+ QFrame *frame = new QFrame(parent);
+ frame->setFrameStyle(QFrame::Box);
+ frame->setObjectName(QString("GCG(%1)_frame").arg(widgetName));
+ widget = frame;
+ }
+ else
+ {
+ widget = new QWidget(parent);
+ widget->setObjectName(QString("GCG(%1)_widget").arg(widgetName));
+ }
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+StackedConfigurationGroup::~StackedConfigurationGroup()
+{
+ clear_widgets(children, childwidget);
+ ConfigurationGroup::deleteLater();
+}
+
+void StackedConfigurationGroup::deleteLater(void)
+{
+ clear_widgets(children, childwidget);
+ ConfigurationGroup::deleteLater();
+}
+
+QWidget* StackedConfigurationGroup::configWidget(ConfigurationGroup *cg,
+ QWidget* parent,
+ const char* widgetName)
+{
+ widget = new QStackedWidget(parent);
+ widget->setObjectName(widgetName);
+
+ connect(widget, SIGNAL(destroyed(QObject*)),
+ this, SLOT( widgetDeleted(QObject*)));
+
+ for (uint i = 0 ; i < children.size() ; ++i)
+ {
+ if (!children[i]->isVisible())
+ continue;
+
+ childwidget[i] = children[i]->configWidget(cg, widget, NULL);
+ if (!childwidget[i])
+ continue;
+
+ connect(childwidget[i], SIGNAL(destroyed( QObject*)),
+ this, SLOT( widgetInvalid(QObject*)));
+ widget->addWidget(childwidget[i]);
+ children[i]->setEnabled(children[i]->isEnabled());
+ }
+
+ if (childwidget[top])
+ widget->setCurrentWidget(childwidget[top]);
+
+ if (cg)
+ {
+ connect(this, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+ }
+ confgrp = cg;
+
+ return widget;
+}
+
+void StackedConfigurationGroup::widgetInvalid(QObject *obj)
+{
+ widget = (widget == obj) ? NULL : widget;
+ for (uint i = 0; i < childwidget.size(); i++)
+ {
+ if ((QObject*)childwidget[i] == obj)
+ childwidget[i] = NULL;
+ }
+}
+
+void StackedConfigurationGroup::addChild(Configurable *child)
+{
+ ConfigurationGroup::addChild(child);
+ childwidget.resize(childwidget.size() + 1);
+ if (!widget)
+ return;
+
+ uint i = children.size() - 1;
+ if ((i < children.size()) && children[i]->isVisible())
+ {
+ childwidget[i] = children[i]->configWidget(confgrp, widget, NULL);
+ widget->addWidget(childwidget[i]);
+ childwidget[i]->resize(1,1);
+ childwidget[i]->show();
+ }
+}
+
+void StackedConfigurationGroup::removeChild(Configurable *child)
+{
+ childList::iterator it = find(children.begin(), children.end(), child);
+ if (it == children.end())
+ return;
+
+ uint i = it - children.begin();
+ if ((i >= children.size()) || (i >= childwidget.size()))
+ return;
+
+ children.erase(it);
+
+ vector<QWidget*>::iterator cit = childwidget.begin() + i;
+ QWidget *cw = *cit;
+ childwidget.erase(cit);
+
+ if (widget && cw)
+ {
+ child->widgetInvalid(cw);
+ widget->removeWidget(cw);
+ }
+}
+
+void StackedConfigurationGroup::raise(Configurable* child)
+{
+ for (uint i = 0 ; i < children.size() ; i++)
+ {
+ if (children[i] == child)
+ {
+ top = i;
+ if (widget && childwidget[top])
+ widget->setCurrentWidget(childwidget[top]);
+ return;
+ }
+ }
+
+ LOG(VB_GENERAL, LOG_ALERT,
+ QString("BUG: StackedConfigurationGroup::raise(): "
+ "unrecognized child 0x%1 on setting %2/%3")
+ .arg((uint64_t)child,0,16).arg(getName()).arg(getLabel()));
+}
+
+void StackedConfigurationGroup::Save(void)
+{
+ if (saveAll)
+ ConfigurationGroup::Save();
+ else if (top < children.size())
+ children[top]->GetStorage()->Save();
+}
+
+void StackedConfigurationGroup::Save(QString destination)
+{
+ if (saveAll)
+ ConfigurationGroup::Save(destination);
+ else if (top < children.size())
+ children[top]->GetStorage()->Save(destination);
+}
+
+void TriggeredConfigurationGroup::addChild(Configurable* child)
+{
+ VerifyLayout();
+ configLayout->addChild(child);
+}
+
+void TriggeredConfigurationGroup::addTarget(QString triggerValue,
+ Configurable *target)
+{
+ VerifyLayout();
+ triggerMap[triggerValue] = target;
+
+ if (!configStack)
+ {
+ configStack = new StackedConfigurationGroup(
+ stackUseLabel, stackUseFrame, stackZeroMargin, stackZeroSpace);
+ configStack->setSaveAll(isSaveAll);
+ }
+
+ configStack->addChild(target);
+}
+
+Setting *TriggeredConfigurationGroup::byName(const QString &settingName)
+{
+ VerifyLayout();
+ Setting *setting = ConfigurationGroup::byName(settingName);
+
+ if (!setting)
+ setting = configLayout->byName(settingName);
+
+ if (!setting && !widget)
+ setting = configStack->byName(settingName);
+
+ return setting;
+}
+
+void TriggeredConfigurationGroup::Load(void)
+{
+ VerifyLayout();
+
+ configLayout->Load();
+
+ if (!widget && configStack)
+ configStack->Load();
+}
+
+void TriggeredConfigurationGroup::Save(void)
+{
+ VerifyLayout();
+
+ configLayout->Save();
+
+ if (!widget)
+ configStack->Save();
+}
+
+void TriggeredConfigurationGroup::Save(QString destination)
+{
+ VerifyLayout();
+
+ configLayout->Save(destination);
+
+ if (!widget)
+ configStack->Save(destination);
+}
+
+void TriggeredConfigurationGroup::repaint(void)
+{
+ VerifyLayout();
+
+ if (widget)
+ widget->repaint();
+}
+
+void TriggeredConfigurationGroup::setTrigger(Configurable *_trigger)
+{
+ if (trigger)
+ {
+ trigger->disconnect();
+ }
+
+ trigger = _trigger;
+
+ if (trigger)
+ {
+ connect(trigger, SIGNAL(valueChanged( const QString&)),
+ this, SLOT( triggerChanged(const QString&)));
+ }
+}
+
+void TriggeredConfigurationGroup::triggerChanged(const QString &value)
+{
+ if (!configStack)
+ return;
+
+ QMap<QString,Configurable*>::iterator it = triggerMap.find(value);
+
+ if (it == triggerMap.end())
+ {
+ LOG(VB_GENERAL, LOG_ALERT,
+ "TriggeredConfigurationGroup::" +
+ QString("triggerChanged(%1) Error:").arg(value) +
+ "Failed to locate value in triggerMap");
+ }
+ else
+ {
+ configStack->raise(*it);
+ }
+}
+
+/** \fn TriggeredConfigurationGroup::SetVertical(bool)
+ * \brief By default we use a vertical layout, but you can call this
+ * with a false value to use a horizontal layout instead.
+ *
+ * NOTE: This must be called before this addChild() is first called.
+ */
+void TriggeredConfigurationGroup::SetVertical(bool vert)
+{
+ if (configLayout)
+ {
+ LOG(VB_GENERAL, LOG_ALERT,
+ "TriggeredConfigurationGroup::setVertical(): "
+ "Sorry, this must be called before any children are added "
+ "to the group.");
+ return;
+ }
+
+ isVertical = vert;
+}
+
+void TriggeredConfigurationGroup::removeTarget(QString triggerValue)
+{
+ ComboBoxSetting *combobox = dynamic_cast<ComboBoxSetting*>(trigger);
+ if (!combobox)
+ {
+ LOG(VB_GENERAL, LOG_ALERT,
+ "TriggeredConfigurationGroup::removeTarget(): "
+ "Failed to cast trigger to ComboBoxSetting -- aborting");
+ return;
+ }
+
+ QMap<QString,Configurable*>::iterator cit = triggerMap.find(triggerValue);
+ if (cit == triggerMap.end())
+ {
+ LOG(VB_GENERAL, LOG_ALERT,
+ QString("TriggeredConfigurationGroup::removeTarget(): "
+ "Failed to find desired value(%1) -- aborting")
+ .arg(triggerValue));
+ return;
+ }
+
+ // remove trigger value from trigger combobox
+ bool ok = false;
+ for (uint i = 0; i < combobox->size(); i++)
+ {
+ if (combobox->GetValue(i) == triggerValue)
+ {
+ ok = combobox->removeSelection(
+ combobox->GetLabel(i), combobox->GetValue(i));
+ break;
+ }
+ }
+
+ if (!ok)
+ {
+ LOG(VB_GENERAL, LOG_ALERT,
+ QString("TriggeredConfigurationGroup::removeTarget(): "
+ "Failed to remove '%1' from combobox -- aborting")
+ .arg(triggerValue));
+ return;
+ }
+
+ // actually remove the pane
+ configStack->removeChild(*cit);
+ triggerMap.erase(cit);
+}
+
+void TriggeredConfigurationGroup::VerifyLayout(void)
+{
+ if (configLayout)
+ return;
+
+ if (isVertical)
+ {
+ configLayout = new VerticalConfigurationGroup(
+ uselabel, useframe, zeroMargin, zeroSpace);
+ }
+ else
+ {
+ configLayout = new HorizontalConfigurationGroup(
+ uselabel, useframe, zeroMargin, zeroSpace);
+ }
+
+ ConfigurationGroup::addChild(configLayout);
+}
+
+QWidget *TriggeredConfigurationGroup::configWidget(
+ ConfigurationGroup *cg, QWidget *parent, const char *widgetName)
+{
+ VerifyLayout();
+
+ configLayout->addChild(configStack);
+
+ widget = configLayout->configWidget(cg, parent, widgetName);
+ connect(widget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ return widget;
+}
+
+void TriggeredConfigurationGroup::widgetInvalid(QObject *obj)
+{
+ widget = (widget == obj) ? NULL : widget;
+}
+
+JumpPane::JumpPane(const QStringList &labels, const QStringList &helptext) :
+ VerticalConfigurationGroup(true, false, true, true)
+{
+ //setLabel(tr("Jump To Buttons"));
+ for (int i = 0; i < labels.size(); i++)
+ {
+ TransButtonSetting *button =
+ new TransButtonSetting(QString::number(i));
+ button->setLabel(labels[i]);
+ button->setHelpText(helptext[i]);
+ connect(button, SIGNAL(pressed(QString)),
+ this, SIGNAL(pressed(QString)));
+ addChild(button);
+ }
+}
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.h b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.h
new file mode 100644
index 0000000..85a17f8
--- /dev/null
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/mythconfiggroups.h
@@ -0,0 +1,274 @@
+// -*- Mode: c++ -*-
+
+#ifndef MYTH_CONFIG_GROUPS_H
+#define MYTH_CONFIG_GROUPS_H
+
+#include <QVBoxLayout>
+
+// MythTV headers
+#include "mythexp.h"
+#include "mythstorage.h"
+
+// C++ headers
+#include <vector>
+
+#define MYTHCONFIG
+#include "settings.h"
+#undef MYTHCONFIG
+
+class QStackedWidget;
+class MythGroupBox;
+
+class MPUBLIC ConfigurationGroup : public Setting, public Storage
+{
+ Q_OBJECT
+
+ public:
+ ConfigurationGroup(bool luselabel = true, bool luseframe = true,
+ bool lzeroMargin = false, bool lzeroSpace = false);
+
+ virtual void deleteLater(void);
+
+ void addChild(Configurable *child)
+ {
+ children.push_back(child);
+ };
+
+ virtual Setting *byName(const QString &name);
+
+ void setUseLabel(bool useit) { uselabel = useit; }
+ void setUseFrame(bool useit) { useframe = useit; }
+
+ void setOptions(bool luselabel = true, bool luseframe = true,
+ bool lzeroMargin = false, bool lzeroSpace = false)
+ {
+ uselabel = luselabel; useframe = luseframe;
+ zeroMargin = lzeroMargin; zeroSpace = lzeroSpace;
+ }
+
+ // Storage
+ virtual void Load(void);
+ virtual void Save(void);
+ virtual void Save(QString destination);
+ virtual void SetSaveRequired(void);
+
+ signals:
+ void changeHelpText(QString);
+
+ protected:
+ virtual ~ConfigurationGroup();
+
+ protected:
+ typedef std::vector<Configurable*> childList;
+ childList children;
+ bool uselabel;
+ bool useframe;
+ bool zeroMargin;
+ bool zeroSpace;
+ int margin;
+ int space;
+};
+
+class MPUBLIC VerticalConfigurationGroup : public ConfigurationGroup
+{
+ public:
+ VerticalConfigurationGroup(
+ bool luselabel = true, bool luseframe = true,
+ bool lzeroMargin = false, bool lzeroSpace = false) :
+ ConfigurationGroup(luselabel, luseframe, lzeroMargin, lzeroSpace),
+ widget(NULL), confgrp(NULL), layout(NULL)
+ {
+ }
+
+ virtual void deleteLater(void);
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName);
+ virtual void widgetInvalid(QObject *obj);
+
+ bool replaceChild(Configurable *old_child, Configurable *new_child);
+ void repaint(void);
+
+ protected:
+ /// You need to call deleteLater to delete QObject
+ virtual ~VerticalConfigurationGroup() { }
+
+ private:
+ std::vector<QWidget*> childwidget;
+ QWidget *widget;
+ ConfigurationGroup *confgrp;
+ QVBoxLayout *layout;
+};
+
+class MPUBLIC HorizontalConfigurationGroup : public ConfigurationGroup
+{
+ public:
+ HorizontalConfigurationGroup(
+ bool luselabel = true, bool luseframe = true,
+ bool lzeroMargin = false, bool lzeroSpace = false) :
+ ConfigurationGroup(luselabel, luseframe, lzeroMargin, lzeroSpace)
+ {
+ }
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName);
+
+ protected:
+ /// You need to call deleteLater to delete QObject
+ virtual ~HorizontalConfigurationGroup() { }
+};
+
+class MPUBLIC GridConfigurationGroup : public ConfigurationGroup
+{
+ public:
+ GridConfigurationGroup(uint col,
+ bool uselabel = true, bool useframe = true,
+ bool zeroMargin = false, bool zeroSpace = false) :
+ ConfigurationGroup(uselabel, useframe, zeroMargin, zeroSpace),
+ columns(col)
+ {
+ }
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName);
+
+ protected:
+ /// You need to call deleteLater to delete QObject
+ virtual ~GridConfigurationGroup() { }
+
+ private:
+ uint columns;
+};
+
+class MPUBLIC StackedConfigurationGroup : public ConfigurationGroup
+{
+ Q_OBJECT
+
+ public:
+ StackedConfigurationGroup(
+ bool uselabel = true, bool useframe = true,
+ bool zeroMargin = false, bool zeroSpace = false) :
+ ConfigurationGroup(uselabel, useframe, zeroMargin, zeroSpace),
+ widget(NULL), confgrp(NULL), top(0), saveAll(true)
+ {
+ }
+
+ virtual void deleteLater(void);
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = 0);
+
+ void raise(Configurable *child);
+ virtual void Save(void);
+ virtual void Save(QString destination);
+
+ // save all children, or only the top?
+ void setSaveAll(bool b) { saveAll = b; };
+
+ void addChild(Configurable*);
+ void removeChild(Configurable*);
+
+ public slots:
+ virtual void widgetInvalid(QObject *obj);
+
+ protected:
+ /// You need to call deleteLater to delete QObject
+ virtual ~StackedConfigurationGroup();
+
+ protected:
+ std::vector<QWidget*> childwidget;
+ QStackedWidget *widget;
+ ConfigurationGroup *confgrp;
+ uint top;
+ bool saveAll;
+};
+
+class MPUBLIC TriggeredConfigurationGroup : public ConfigurationGroup
+{
+ Q_OBJECT
+
+ public:
+ TriggeredConfigurationGroup(
+ bool uselabel = true, bool useframe = true,
+ bool zeroMargin = false, bool zeroSpace = false,
+ bool stack_uselabel = true, bool stack_useframe = true,
+ bool stack_zeroMargin = false, bool stack_zeroSpace = false) :
+ ConfigurationGroup(uselabel, useframe, zeroMargin, zeroSpace),
+ stackUseLabel(stack_uselabel), stackUseFrame(stack_useframe),
+ stackZeroMargin(stack_zeroMargin), stackZeroSpace(stack_zeroSpace),
+ isVertical(true), isSaveAll(true),
+ configLayout(NULL), configStack(NULL),
+ trigger(NULL), widget(NULL)
+ {
+ }
+
+ // Commands
+
+ virtual void addChild(Configurable *child);
+
+ void addTarget(QString triggerValue, Configurable *target);
+ void removeTarget(QString triggerValue);
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName);
+ virtual void widgetInvalid(QObject *obj);
+
+ virtual Setting *byName(const QString &settingName);
+
+ virtual void Load(void);
+ virtual void Save(void);
+ virtual void Save(QString destination);
+
+ void repaint(void);
+
+ // Sets
+
+ void SetVertical(bool vert);
+
+ virtual void setSaveAll(bool b)
+ {
+ if (configStack)
+ configStack->setSaveAll(b);
+ isSaveAll = b;
+ }
+
+ void setTrigger(Configurable *_trigger);
+
+ protected slots:
+ virtual void triggerChanged(const QString &value);
+
+ protected:
+ /// You need to call deleteLater to delete QObject
+ virtual ~TriggeredConfigurationGroup() { }
+ void VerifyLayout(void);
+
+ protected:
+ bool stackUseLabel;
+ bool stackUseFrame;
+ bool stackZeroMargin;
+ bool stackZeroSpace;
+ bool isVertical;
+ bool isSaveAll;
+ ConfigurationGroup *configLayout;
+ StackedConfigurationGroup *configStack;
+ Configurable *trigger;
+ QMap<QString,Configurable*> triggerMap;
+ QWidget *widget;
+};
+
+class MPUBLIC JumpPane : public VerticalConfigurationGroup
+{
+ Q_OBJECT
+
+ public:
+ JumpPane(const QStringList &labels, const QStringList &helptext);
+
+ signals:
+ void pressed(QString);
+};
+
+#endif // MYTH_CONFIG_GROUPS_H
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/mythinstall.pro b/abs/core/mythinstall/MythVantage-app/mythinstall/mythinstall.pro
index 6405b52..099d0f0 100755
--- a/abs/core/mythinstall/MythVantage-app/mythinstall/mythinstall.pro
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/mythinstall.pro
@@ -1,8 +1,8 @@
#This is the path to the mythtv src
PREFIX = /usr/include/mythtv
-LIBVERSION = 29
-VERSION = 29.0
+LIBVERSION = 30
+VERSION = 30.0
INCLUDEPATH += $$PREFIX
INCLUDEPATH += $$PREFIX/libmyth
@@ -41,7 +41,18 @@ QMAKE_CLEAN += $(TARGET)
//HEADERS += commandlineparser.h
//SOURCES += main.cpp commandlineparser.cpp
-HEADERS += installdialog.h commandlineparser.h installsettings.h settemplate.h installationtype.h xorgsettings.h password_manage.h misc_settings.h mv_common.h infrared.h compat-mv.h supplemental.h vnc.h fileshare.h questionnotice.h
-SOURCES += main.cpp commandlineparser.cpp installdialog.cpp installsettings.cpp settemplate.cpp installationtype.cpp xorgsettings.cpp password_manage.cpp misc_settings.cpp infrared.cpp compat-mv.cpp supplemental.cpp vnc.cpp fileshare.cpp questionnotice.cpp
+HEADERS += installdialog.h commandlineparser.h installsettings.h
+HEADERS += settemplate.h installationtype.h xorgsettings.h password_manage.h
+HEADERS += misc_settings.h mv_common.h infrared.h compat-mv.h supplemental.h
+HEADERS += vnc.h fileshare.h questionnotice.h
+HEADERS += mythconfigdialogs.h mythconfiggroups.h
+HEADERS += settings.h
+
+SOURCES += main.cpp commandlineparser.cpp installdialog.cpp installsettings.cpp
+SOURCES += settemplate.cpp installationtype.cpp xorgsettings.cpp
+SOURCES += password_manage.cpp misc_settings.cpp infrared.cpp compat-mv.cpp
+SOURCES += supplemental.cpp vnc.cpp fileshare.cpp questionnotice.cpp
+SOURCES += mythconfigdialogs.cpp mythconfiggroups.cpp
+SOURCES += settings.cpp
QT += sql xml network widgets
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/settings.cpp b/abs/core/mythinstall/MythVantage-app/mythinstall/settings.cpp
new file mode 100644
index 0000000..41c3cf8
--- /dev/null
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/settings.cpp
@@ -0,0 +1,1236 @@
+// C++ headers
+#include <algorithm>
+#include <cmath>
+using namespace std;
+
+// POSIX headers
+#include <unistd.h>
+
+// Qt widgets
+#include <QLineEdit>
+#include <QSlider>
+#include <QLCDNumber>
+#include <QButtonGroup>
+#include <QRadioButton>
+#include <QProgressBar>
+
+// Qt utils
+#include <QFile>
+#include <QDateTime>
+#include <QDir>
+
+// MythTV headers
+#define MYTHCONFIG
+#include "settings.h"
+#include "mythconfiggroups.h"
+#undef MYTHCONFIG
+
+#include "mythwidgets.h"
+#include "mythcontext.h"
+#include "mythdb.h"
+#include "mythlogging.h"
+//#include "DisplayRes.h"
+#include "mythuihelper.h"
+
+/** \class Configurable
+ * \brief Configurable is the root of all the database aware widgets.
+ *
+ * This is an abstract class and some methods must be implemented
+ * in children. byName(const &QString) is abstract. While
+ * configWidget(ConfigurationGroup *, QWidget*, const char*)
+ * has an implementation, all it does is print an error message
+ * and return a NULL pointer.
+ */
+
+QWidget* Configurable::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName)
+{
+ (void)cg;
+ (void)parent;
+ (void)widgetName;
+ LOG(VB_GENERAL, LOG_ALERT,
+ "BUG: Configurable is visible, but has no configWidget");
+ return NULL;
+}
+
+/** \brief This slot calls the virtual widgetInvalid(QObject*) method.
+ *
+ * This should not be needed, anyone calling configWidget() should
+ * also be calling widgetInvalid() directly before configWidget()
+ * is called again on the Configurable. If widgetInvalid() is not
+ * called directly before the Configurable's configWidget() is
+ * called the Configurable may not update properly on screen, but
+ * if this is connected to from the widget's destroyed(QObject*)
+ * signal this will prevent a segfault from occurring.
+ */
+void Configurable::widgetDeleted(QObject *obj)
+{
+ widgetInvalid(obj);
+}
+
+/** \fn Configurable::enableOnSet(const QString &val)
+ * \brief This slot allows you to enable this configurable when a
+ * binary configurable is set to true.
+ * \param val signal value, should be "0" to disable, other to disable.
+ */
+void Configurable::enableOnSet(const QString &val)
+{
+ setEnabled( val != "0" );
+}
+
+/** \fn Configurable::enableOnUnset(const QString &val)
+ * \brief This slot allows you to enable this configurable when a
+ * binary configurable is set to false.
+ * \param val signal value, should be "0" to enable, other to disable.
+ */
+void Configurable::enableOnUnset(const QString &val)
+{
+ setEnabled( val == "0" );
+}
+
+QString Setting::getValue(void) const
+{
+ return settingValue;
+}
+
+void Setting::setValue(const QString &newValue)
+{
+ settingValue = newValue;
+ emit valueChanged(settingValue);
+}
+
+int SelectSetting::findSelection(const QString &label, QString value) const
+{
+ value = (value.isEmpty()) ? label : value;
+
+ for (uint i = 0; i < values.size(); i++)
+ {
+ if ((values[i] == value) && (labels[i] == label))
+ return i;
+ }
+
+ return -1;
+}
+
+void SelectSetting::addSelection(const QString &label, QString value,
+ bool select)
+{
+ value = (value.isEmpty()) ? label : value;
+
+ int found = findSelection(label, value);
+ if (found < 0)
+ {
+ labels.push_back(label);
+ values.push_back(value);
+ emit selectionAdded( label, value);
+ }
+
+ if (select || !isSet)
+ setValue(value);
+}
+
+bool SelectSetting::removeSelection(const QString &label, QString value)
+{
+ value = (value.isEmpty()) ? label : value;
+
+ int found = findSelection(label, value);
+ if (found < 0)
+ return false;
+
+ bool wasSet = isSet;
+ isSet = false;
+
+ labels.erase(labels.begin() + found);
+ values.erase(values.begin() + found);
+
+ isSet = wasSet && labels.size();
+ if (isSet)
+ {
+ current = (current > (uint)found) ? current - 1 : current;
+ current = min(current, (uint) (labels.size() - 1));
+ }
+
+ emit selectionRemoved(label, value);
+
+ return true;
+}
+
+void SelectSetting::fillSelectionsFromDir(const QDir& dir, bool absPath)
+{
+ QFileInfoList il = dir.entryInfoList();
+
+ for (QFileInfoList::Iterator it = il.begin();
+ it != il.end();
+ ++it )
+ {
+ QFileInfo &fi = *it;
+
+ if (absPath)
+ addSelection( fi.absoluteFilePath() );
+ else
+ addSelection( fi.fileName() );
+ }
+}
+
+void SelectSetting::clearSelections(void) {
+ labels.clear();
+ values.clear();
+ isSet = false;
+ emit selectionsCleared();
+}
+
+void SelectSetting::setValue(const QString &newValue)
+{
+ int found = getValueIndex(newValue);
+ if (found < 0)
+ {
+ addSelection(newValue, newValue, true);
+ }
+ else
+ {
+ current = found;
+ isSet = true;
+ Setting::setValue(newValue);
+ }
+}
+
+void SelectSetting::setValue(int which)
+{
+ if ((which >= ((int) values.size())) || (which < 0))
+ {
+ LOG(VB_GENERAL, LOG_ERR,
+ QString("SelectSetting::setValue(): invalid index: %1 size: %2")
+ .arg(which).arg(values.size()));
+ }
+ else
+ {
+ current = which;
+ isSet = true;
+ Setting::setValue(values[current]);
+ }
+}
+
+QString SelectSetting::getSelectionLabel(void) const
+{
+ if (!isSet || (current >= values.size()))
+ return QString::null;
+
+ return labels[current];
+}
+
+/** \fn SelectSetting::getValueIndex(QString)
+ * \brief Returns index of value in SelectSetting, or -1 if not found.
+ */
+int SelectSetting::getValueIndex(QString value)
+{
+ int ret = 0;
+
+ selectionList::const_iterator it = values.begin();
+ for (; it != values.end(); ++it, ++ret)
+ {
+ if (*it == value)
+ return ret;
+ }
+
+ return -1;
+}
+
+bool SelectSetting::ReplaceLabel(const QString &new_label, const QString &value)
+{
+ int i = getValueIndex(value);
+
+ if (i >= 0)
+ labels[i] = new_label;
+
+ return (i >= 0);
+}
+
+QWidget* LabelSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName) {
+ (void)cg;
+
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QHBoxLayout *layout = new QHBoxLayout();
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+ MythLabel *value = new MythLabel();
+ value->setText(getValue());
+ layout->addWidget(value);
+
+ connect(this, SIGNAL(valueChanged(const QString&)),
+ value, SLOT(setText(const QString&)));
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+QWidget* LineEditSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char *widgetName)
+{
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QBoxLayout *layout = NULL;
+ if (labelAboveWidget)
+ {
+ layout = new QVBoxLayout();
+ widget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Maximum));
+ }
+ else
+ layout = new QHBoxLayout();
+
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+ bxwidget = widget;
+ connect(bxwidget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ edit = new MythLineEdit(
+ settingValue, NULL,
+ QString(QString(widgetName) + "-edit").toLatin1().constData());
+ edit->setHelpText(getHelpText());
+ edit->setText( getValue() );
+ edit->setMinimumHeight(25);
+ layout->addWidget(edit);
+
+ connect(this, SIGNAL(valueChanged(const QString&)),
+ edit, SLOT(setText(const QString&)));
+ connect(edit, SIGNAL(textChanged(const QString&)),
+ this, SLOT(setValue(const QString&)));
+
+ if (cg)
+ connect(edit, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+
+ setRW(rw);
+ SetPasswordEcho(password_echo);
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+void LineEditSetting::widgetInvalid(QObject *obj)
+{
+ if (bxwidget == obj)
+ {
+ bxwidget = NULL;
+ edit = NULL;
+ }
+}
+
+void LineEditSetting::setEnabled(bool b)
+{
+ Configurable::setEnabled(b);
+ if (edit)
+ edit->setEnabled(b);
+}
+
+void LineEditSetting::setVisible(bool b)
+{
+ Configurable::setVisible(b);
+ if (edit)
+ {
+ //QWidget *parent = edit->parentWidget();
+ if (b)
+ edit->show();
+ else
+ edit->hide();
+ }
+}
+
+void LineEditSetting::SetPasswordEcho(bool b)
+{
+ password_echo = b;
+ if (edit)
+ edit->setEchoMode(b ? QLineEdit::Password : QLineEdit::Normal);
+}
+
+void LineEditSetting::setHelpText(const QString &str)
+{
+ if (edit)
+ edit->setHelpText(str);
+ Setting::setHelpText(str);
+}
+
+void BoundedIntegerSetting::setValue(int newValue)
+{
+ newValue = std::max(std::min(newValue, max), min);
+ IntegerSetting::setValue(newValue);
+}
+
+QWidget* SliderSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName)
+{
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QBoxLayout *layout = NULL;
+ if (labelAboveWidget)
+ {
+ layout = new QVBoxLayout();
+ widget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Maximum));
+ }
+ else
+ layout = new QHBoxLayout();
+
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setObjectName(QString(widgetName) + "-label");
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+ MythSlider *slider = new MythSlider(
+ NULL, QString(QString(widgetName) + "-slider").toLatin1().constData());
+ slider->setHelpText(getHelpText());
+ slider->setMinimum(min);
+ slider->setMaximum(max);
+ slider->setOrientation( Qt::Horizontal );
+ slider->setSingleStep(step);
+ slider->setValue(intValue());
+ layout->addWidget(slider);
+
+ QLCDNumber *lcd = new QLCDNumber();
+ lcd->setObjectName(QString(QString(widgetName) + "-lcd")
+ .toLatin1().constData());
+ lcd->setMode(QLCDNumber::Dec);
+ lcd->setSegmentStyle(QLCDNumber::Flat);
+ lcd->display(intValue());
+ layout->addWidget(lcd);
+
+ connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));
+ connect(slider, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
+ connect(this, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
+
+ if (cg)
+ connect(slider, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+SpinBoxSetting::SpinBoxSetting(
+ Storage *_storage, int _min, int _max, int _step,
+ bool _allow_single_step, QString _special_value_text) :
+ BoundedIntegerSetting(_storage, _min, _max, _step),
+ bxwidget(NULL), spinbox(NULL), relayEnabled(true),
+ sstep(_allow_single_step), svtext("")
+{
+ if (!_special_value_text.isEmpty())
+ svtext = _special_value_text;
+
+ IntegerSetting *iset = (IntegerSetting *) this;
+ connect(iset, SIGNAL(valueChanged( int)),
+ this, SLOT( relayValueChanged(int)));
+}
+
+QWidget* SpinBoxSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName)
+{
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QBoxLayout *layout = NULL;
+ if (labelAboveWidget)
+ {
+ layout = new QVBoxLayout();
+ widget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Maximum));
+ }
+ else
+ layout = new QHBoxLayout();
+
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+ bxwidget = widget;
+ connect(bxwidget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ QString sbname = QString(widgetName) + "MythSpinBox";
+ spinbox = new MythSpinBox(NULL, sbname.toLatin1().constData(), sstep);
+ spinbox->setHelpText(getHelpText());
+ spinbox->setMinimum(min);
+ spinbox->setMaximum(max);
+ spinbox->setMinimumHeight(25);
+ layout->addWidget(spinbox);
+
+ // only set step size if greater than default (1), otherwise
+ // this will screw up the single-step/jump behavior of the MythSpinBox
+ if (1 < step)
+ spinbox->setSingleStep(step);
+ spinbox->setValue(intValue());
+ if (!svtext.isEmpty())
+ spinbox->setSpecialValueText(svtext);
+
+ connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
+
+ if (cg)
+ connect(spinbox, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+void SpinBoxSetting::widgetInvalid(QObject *obj)
+{
+ if (bxwidget == obj)
+ {
+ bxwidget = NULL;
+ spinbox = NULL;
+ }
+}
+
+void SpinBoxSetting::setValue(int newValue)
+{
+ newValue = std::max(std::min(newValue, max), min);
+ if (spinbox && (spinbox->value() != newValue))
+ {
+ //int old = intValue();
+ spinbox->setValue(newValue);
+ }
+ else if (intValue() != newValue)
+ {
+ BoundedIntegerSetting::setValue(newValue);
+ }
+}
+
+void SpinBoxSetting::setFocus(void)
+{
+ if (spinbox)
+ spinbox->setFocus();
+}
+
+void SpinBoxSetting::clearFocus(void)
+{
+ if (spinbox)
+ spinbox->clearFocus();
+}
+
+bool SpinBoxSetting::hasFocus(void) const
+{
+ if (spinbox)
+ return spinbox->hasFocus();
+
+ return false;
+}
+
+void SpinBoxSetting::relayValueChanged(int newValue)
+{
+ if (relayEnabled)
+ emit valueChanged(configName, newValue);
+}
+
+void SpinBoxSetting::setHelpText(const QString &str)
+{
+ if (spinbox)
+ spinbox->setHelpText(str);
+ BoundedIntegerSetting::setHelpText(str);
+}
+
+QWidget* SelectLabelSetting::configWidget(ConfigurationGroup *cg,
+ QWidget *parent,
+ const char *widgetName)
+{
+ (void)cg;
+
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QBoxLayout *layout = NULL;
+ if (labelAboveWidget)
+ {
+ layout = new QVBoxLayout();
+ widget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Maximum));
+ }
+ else
+ layout = new QHBoxLayout();
+
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+
+ MythLabel *value = new MythLabel();
+ value->setText(labels[current]);
+ layout->addWidget(value);
+
+ connect(this, SIGNAL(valueChanged(const QString&)),
+ value, SLOT(setText(const QString&)));
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+QWidget* ComboBoxSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName)
+{
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QBoxLayout *layout = NULL;
+ if (labelAboveWidget)
+ {
+ layout = new QVBoxLayout();
+ widget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Maximum));
+ }
+ else
+ layout = new QHBoxLayout();
+
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+ bxwidget = widget;
+ connect(bxwidget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ cbwidget = new MythComboBox(rw);
+ cbwidget->setHelpText(getHelpText());
+
+ for(unsigned int i = 0 ; i < labels.size() ; ++i)
+ cbwidget->insertItem(labels[i]);
+
+ resetMaxCount(cbwidget->count());
+
+ if (isSet)
+ cbwidget->setCurrentIndex(current);
+
+ if (1 < step)
+ cbwidget->setStep(step);
+
+ connect(cbwidget, SIGNAL(highlighted(int)),
+ this, SLOT(setValue(int)));
+ connect(cbwidget, SIGNAL(activated(int)),
+ this, SLOT(setValue(int)));
+ connect(this, SIGNAL(selectionsCleared()),
+ cbwidget, SLOT(clear()));
+
+ if (rw)
+ connect(cbwidget, SIGNAL(editTextChanged(const QString &)),
+ this, SLOT(editTextChanged(const QString &)));
+
+ if (cg)
+ connect(cbwidget, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+
+ cbwidget->setMinimumHeight(25);
+
+ layout->addWidget(cbwidget);
+ layout->setStretchFactor(cbwidget, 1);
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+void ComboBoxSetting::widgetInvalid(QObject *obj)
+{
+ if (bxwidget == obj)
+ {
+ bxwidget = NULL;
+ cbwidget = NULL;
+ }
+}
+
+void ComboBoxSetting::setEnabled(bool b)
+{
+ Configurable::setEnabled(b);
+ if (cbwidget)
+ cbwidget->setEnabled(b);
+}
+
+void ComboBoxSetting::setVisible(bool b)
+{
+ Configurable::setVisible(b);
+ if (cbwidget)
+ {
+ if (b)
+ cbwidget->show();
+ else
+ cbwidget->hide();
+ }
+}
+
+void ComboBoxSetting::setValue(const QString &newValue)
+{
+ for (uint i = 0; i < values.size(); i++)
+ {
+ if (values[i] == newValue)
+ {
+ setValue(i);
+ break;
+ }
+ }
+
+ if (rw)
+ {
+ Setting::setValue(newValue);
+ if (cbwidget)
+ cbwidget->setCurrentIndex(current);
+ }
+}
+
+void ComboBoxSetting::setValue(int which)
+{
+ if (cbwidget)
+ cbwidget->setCurrentIndex(which);
+ SelectSetting::setValue(which);
+}
+
+void ComboBoxSetting::addSelection(
+ const QString &label, QString value, bool select)
+{
+ if ((findSelection(label, value) < 0) && cbwidget)
+ {
+ resetMaxCount(cbwidget->count()+1);
+ cbwidget->insertItem(label);
+ }
+
+ SelectSetting::addSelection(label, value, select);
+
+ if (cbwidget && isSet)
+ cbwidget->setCurrentIndex(current);
+}
+
+bool ComboBoxSetting::removeSelection(const QString &label, QString value)
+{
+ SelectSetting::removeSelection(label, value);
+ if (!cbwidget)
+ return true;
+
+ for (uint i = 0; ((int) i) < cbwidget->count(); i++)
+ {
+ if (cbwidget->itemText(i) == label)
+ {
+ cbwidget->removeItem(i);
+ if (isSet)
+ cbwidget->setCurrentIndex(current);
+ resetMaxCount(cbwidget->count());
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void ComboBoxSetting::editTextChanged(const QString &newText)
+{
+ if (cbwidget)
+ {
+ for (uint i = 0; i < labels.size(); i++)
+ if (labels[i] == newText)
+ return;
+
+ if (labels.size() == static_cast<size_t>(cbwidget->maxCount()))
+ {
+ SelectSetting::removeSelection(labels[cbwidget->maxCount() - 1],
+ values[cbwidget->maxCount() - 1]);
+ cbwidget->setItemText(cbwidget->maxCount() - 1, newText);
+ }
+ else
+ {
+ cbwidget->insertItem(newText);
+ }
+
+ SelectSetting::addSelection(newText, newText, true);
+ cbwidget->setCurrentIndex(cbwidget->maxCount() - 1);
+ }
+}
+
+void ComboBoxSetting::setHelpText(const QString &str)
+{
+ if (cbwidget)
+ cbwidget->setHelpText(str);
+ SelectSetting::setHelpText(str);
+}
+
+void HostRefreshRateComboBox::ChangeResolution(const QString& resolution)
+{
+ clearSelections();
+
+ const vector<double> list = GetRefreshRates(resolution);
+ addSelection(QObject::tr("Auto"), "0");
+ int hz50 = -1, hz60 = -1;
+ for (uint i=0; i<list.size(); ++i)
+ {
+ QString sel = QString::number((double) list[i],'f', 3);
+ addSelection(sel+" Hz", sel);
+ hz50 = (fabs(50.0 - list[i]) < 0.01) ? i : hz50;
+ hz60 = (fabs(60.0 - list[i]) < 0.01) ? i : hz60;
+ }
+
+ setValue(0);
+ if ("640x480" == resolution || "720x480" == resolution)
+ setValue(hz60+1);
+ if ("640x576" == resolution || "720x576" == resolution)
+ setValue(hz50+1);
+
+ setEnabled(list.size());
+}
+
+const vector<double> HostRefreshRateComboBox::GetRefreshRates(const QString &res)
+{
+ QStringList slist = res.split("x");
+ int w = 0, h = 0;
+ bool ok0 = false, ok1 = false;
+ if (2 == slist.size())
+ {
+ w = slist[0].toInt(&ok0);
+ h = slist[1].toInt(&ok1);
+ }
+
+// DisplayRes *display_res = DisplayRes::GetDisplayRes();
+// if (display_res && ok0 && ok1)
+// return display_res->GetRefreshRates(w, h);
+
+ vector<double> list;
+ return list;
+}
+
+void PathSetting::addSelection(const QString& label,
+ QString value,
+ bool select) {
+ QString pathname = label;
+ if (value != QString::null)
+ pathname = value;
+
+ if (mustexist && !QFile(pathname).exists())
+ return;
+
+ ComboBoxSetting::addSelection(label, value, select);
+}
+
+QTime TimeSetting::timeValue(void) const {
+ return QTime::fromString(getValue(), Qt::ISODate);
+}
+
+void TimeSetting::setValue(const QTime& newValue) {
+ Setting::setValue(newValue.toString(Qt::ISODate));
+}
+
+QString DateSetting::getValue(void) const
+{
+ return settingValue;
+}
+
+QDate DateSetting::dateValue(void) const {
+ return QDate::fromString(getValue(), Qt::ISODate);
+}
+
+void DateSetting::setValue(const QDate& newValue) {
+ Setting::setValue(newValue.toString(Qt::ISODate));
+}
+
+void DateSetting::setValue(const QString &newValue)
+{
+ QDate date = QDate::fromString(newValue, Qt::ISODate);
+ if (date.isValid())
+ setValue(date);
+}
+
+void TimeSetting::setValue(const QString &newValue)
+{
+ QTime time = QTime::fromString(newValue, Qt::ISODate);
+ if (time.isValid())
+ setValue(time);
+}
+
+QWidget* CheckBoxSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName) {
+ widget = new MythCheckBox(parent, widgetName);
+ connect(widget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ widget->setHelpText(getHelpText());
+ widget->setText(getLabel());
+ widget->setChecked(boolValue());
+
+ connect(widget, SIGNAL(toggled(bool)),
+ this, SLOT(setValue(bool)));
+ connect(this, SIGNAL(valueChanged(bool)),
+ widget, SLOT(setChecked(bool)));
+
+ if (cg)
+ connect(widget, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+
+ return widget;
+}
+
+void CheckBoxSetting::widgetInvalid(QObject *obj)
+{
+ widget = (widget == obj) ? NULL : widget;
+}
+
+void CheckBoxSetting::setVisible(bool b)
+{
+ BooleanSetting::setVisible(b);
+ if (widget)
+ {
+ if (b)
+ widget->show();
+ else
+ widget->hide();
+ }
+}
+
+void CheckBoxSetting::setLabel(QString str)
+{
+ // QT treats a single ampersand as special,
+ // we must double up ampersands to display them
+ str = str.replace(" & ", " && ");
+ BooleanSetting::setLabel(str);
+ if (widget)
+ widget->setText(str);
+}
+
+void CheckBoxSetting::setEnabled(bool fEnabled)
+{
+ BooleanSetting::setEnabled(fEnabled);
+ if (widget)
+ widget->setEnabled(fEnabled);
+}
+
+void CheckBoxSetting::setHelpText(const QString &str)
+{
+ if (widget)
+ widget->setHelpText(str);
+ BooleanSetting::setHelpText(str);
+}
+
+void AutoIncrementDBSetting::Save(QString table)
+{
+ if (intValue() == 0)
+ {
+ // Generate a new, unique ID
+ QString querystr = QString("INSERT INTO " + table + " ("
+ + GetColumnName() + ") VALUES (0);");
+
+ MSqlQuery query(MSqlQuery::InitCon());
+
+ if (!query.exec(querystr))
+ {
+ MythDB::DBError("inserting row", query);
+ return;
+ }
+ // XXX -- HACK BEGIN:
+ // lastInsertID fails with "QSqlQuery::value: not positioned on a valid record"
+ // if we get a invalid QVariant we workaround the problem by taking advantage
+ // of mysql always incrementing the auto increment pointer
+ // this breaks if someone modifies the auto increment pointer
+ //setValue(query.lastInsertId().toInt());
+
+ QVariant var = query.lastInsertId();
+
+ if (var.type())
+ setValue(var.toInt());
+ else
+ {
+ querystr = QString("SELECT MAX(" + GetColumnName() + ") FROM " + table + ";");
+ if (query.exec(querystr) && query.next())
+ {
+ int lii = query.value(0).toInt();
+ lii = lii ? lii : 1;
+ setValue(lii);
+ }
+ else
+ LOG(VB_GENERAL, LOG_EMERG,
+ "Can't determine the Id of the last insert "
+ "QSqlQuery.lastInsertId() failed, the workaround "
+ "failed too!");
+ }
+ // XXX -- HACK END:
+ }
+}
+
+void AutoIncrementDBSetting::Save(void)
+{
+ Save(GetTableName());
+}
+
+void ListBoxSetting::setEnabled(bool b)
+{
+ Configurable::setEnabled(b);
+ if (lbwidget)
+ lbwidget->setEnabled(b);
+}
+
+void ListBoxSetting::clearSelections(void)
+{
+ SelectSetting::clearSelections();
+ if (lbwidget)
+ lbwidget->clear();
+}
+
+void ListBoxSetting::addSelection(
+ const QString &label, QString value, bool select)
+{
+ SelectSetting::addSelection(label, value, select);
+ if (lbwidget)
+ {
+ lbwidget->insertItem(label);
+ //lbwidget->triggerUpdate(true);
+ }
+};
+
+bool ListBoxSetting::ReplaceLabel(
+ const QString &new_label, const QString &value)
+{
+ int i = getValueIndex(value);
+
+ if ((i >= 0) && SelectSetting::ReplaceLabel(label, value) && lbwidget)
+ {
+ lbwidget->changeItem(new_label, i);
+ return true;
+ }
+
+ return false;
+}
+
+QWidget* ListBoxSetting::configWidget(ConfigurationGroup *cg, QWidget* parent,
+ const char* widgetName)
+{
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+
+ QVBoxLayout *layout = new QVBoxLayout();
+
+ if (getLabel() != "")
+ {
+ MythLabel *label = new MythLabel();
+ label->setText(getLabel());
+ layout->addWidget(label);
+ }
+
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ bxwidget = widget;
+ connect(bxwidget, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ lbwidget = new MythListBox(NULL);
+ lbwidget->setHelpText(getHelpText());
+ if (eventFilter)
+ lbwidget->installEventFilter(eventFilter);
+
+ for(unsigned int i = 0 ; i < labels.size() ; ++i) {
+ lbwidget->insertItem(labels[i]);
+ if (isSet && current == i)
+ lbwidget->setCurrentRow(i);
+ }
+
+ connect(this, SIGNAL(selectionsCleared()),
+ lbwidget, SLOT( clear()));
+ connect(this, SIGNAL(valueChanged(const QString&)),
+ lbwidget, SLOT( setCurrentItem(const QString&)));
+
+ connect(lbwidget, SIGNAL(accepted(int)),
+ this, SIGNAL(accepted(int)));
+ connect(lbwidget, SIGNAL(menuButtonPressed(int)),
+ this, SIGNAL(menuButtonPressed(int)));
+ connect(lbwidget, SIGNAL(editButtonPressed(int)),
+ this, SIGNAL(editButtonPressed(int)));
+ connect(lbwidget, SIGNAL(deleteButtonPressed(int)),
+ this, SIGNAL(deleteButtonPressed(int)));
+
+ connect(lbwidget, SIGNAL(highlighted(int)),
+ this, SLOT( setValueByIndex(int)));
+
+ if (cg)
+ connect(lbwidget, SIGNAL(changeHelpText(QString)), cg,
+ SIGNAL(changeHelpText(QString)));
+
+ lbwidget->setFocus();
+ lbwidget->setSelectionMode(selectionMode);
+ layout->addWidget(lbwidget);
+
+ widget->setLayout(layout);
+
+ return widget;
+}
+
+void ListBoxSetting::widgetInvalid(QObject *obj)
+{
+ if (bxwidget == obj)
+ {
+ bxwidget = NULL;
+ lbwidget = NULL;
+ }
+}
+
+void ListBoxSetting::setSelectionMode(MythListBox::SelectionMode mode)
+{
+ selectionMode = mode;
+ if (lbwidget)
+ lbwidget->setSelectionMode(selectionMode);
+}
+
+void ListBoxSetting::setValueByIndex(int index)
+{
+ if (((uint)index) < values.size())
+ setValue(values[index]);
+}
+
+void ListBoxSetting::setHelpText(const QString &str)
+{
+ if (lbwidget)
+ lbwidget->setHelpText(str);
+ SelectSetting::setHelpText(str);
+}
+
+HostnameSetting::HostnameSetting(Storage *storage) : Setting(storage)
+{
+ setVisible(false);
+
+ setValue(gCoreContext->GetHostName());
+}
+
+void ChannelSetting::fillSelections(SelectSetting* setting) {
+
+ // this should go somewhere else, in something that knows about
+ // channels and how they're stored in the database. We're just a
+ // selector.
+
+ MSqlQuery query(MSqlQuery::InitCon());
+ query.prepare("SELECT name, chanid FROM channel;");
+ if (query.exec() && query.isActive() && query.size() > 0)
+ while (query.next())
+ setting->addSelection(query.value(0).toString(),
+ QString::number(query.value(1).toInt()));
+}
+
+QWidget* ButtonSetting::configWidget(ConfigurationGroup* cg, QWidget* parent,
+ const char* widgetName)
+{
+ (void) cg;
+ button = new MythPushButton(parent, widgetName);
+ connect(button, SIGNAL(destroyed(QObject*)),
+ this, SLOT(widgetDeleted(QObject*)));
+
+ button->setText(getLabel());
+ button->setHelpText(getHelpText());
+
+ connect(button, SIGNAL(pressed()), this, SIGNAL(pressed()));
+ connect(button, SIGNAL(pressed()), this, SLOT(SendPressedString()));
+
+ if (cg)
+ connect(button, SIGNAL(changeHelpText(QString)),
+ cg, SIGNAL(changeHelpText(QString)));
+
+ return button;
+}
+
+void ButtonSetting::widgetInvalid(QObject *obj)
+{
+ button = (button == obj) ? NULL : button;
+}
+
+void ButtonSetting::SendPressedString(void)
+{
+ emit pressed(name);
+}
+
+void ButtonSetting::setEnabled(bool fEnabled)
+{
+ Configurable::setEnabled(fEnabled);
+ if (button)
+ button->setEnabled(fEnabled);
+}
+
+void ButtonSetting::setLabel(QString str)
+{
+ if (button)
+ button->setText(str);
+ Setting::setLabel(str);
+}
+
+void ButtonSetting::setHelpText(const QString &str)
+{
+ if (button)
+ button->setHelpText(str);
+ Setting::setHelpText(str);
+}
+
+QWidget* ProgressSetting::configWidget(ConfigurationGroup* cg, QWidget* parent,
+ const char* widgetName) {
+ (void)cg;
+ QWidget *widget = new QWidget(parent);
+ widget->setObjectName(widgetName);
+ QBoxLayout *layout = new QHBoxLayout();
+ layout->setContentsMargins(0,0,0,0);
+ layout->setSpacing(0);
+
+ if (getLabel() != "")
+ {
+ MythLabel* label = new MythLabel();
+ label->setObjectName(QString(widgetName) + "_label");
+ label->setText(getLabel() + ": ");
+ layout->addWidget(label);
+ }
+
+ QProgressBar *progress = new QProgressBar(NULL);
+ progress->setObjectName(widgetName);
+ progress->setRange(0,totalSteps);
+ layout->addWidget(progress);
+
+ connect(this, SIGNAL(valueChanged(int)), progress, SLOT(setValue(int)));
+ progress->setValue(intValue());
+
+ widget->setLayout(layout);
+
+ return widget;
+}
diff --git a/abs/core/mythinstall/MythVantage-app/mythinstall/settings.h b/abs/core/mythinstall/MythVantage-app/mythinstall/settings.h
new file mode 100644
index 0000000..2df5dcd
--- /dev/null
+++ b/abs/core/mythinstall/MythVantage-app/mythinstall/settings.h
@@ -0,0 +1,835 @@
+// -*- Mode: c++ -*-
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+// C++ headers
+#include <vector>
+
+// Qt headers
+#include <QObject>
+#include <QDate>
+#include <QTime>
+
+// MythTV headers
+#include "mythexp.h"
+#include "mythwidgets.h"
+#include "mythstorage.h"
+
+class QWidget;
+class ConfigurationGroup;
+class QDir;
+class Setting;
+
+class MPUBLIC Configurable : public QObject
+{
+ Q_OBJECT
+
+ public:
+ /// Create and return a QWidget for configuring this entity
+ /// Note: Any class calling this should call widgetInvalid()
+ /// before configWidget() is called on the class again,
+ /// and before the class is deleted; just before removing
+ /// the instance from a layout or scheduling the delete
+ /// of a parent container is a good time. Some UI classes
+ /// depend on this for properly updating the UI.
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+ /// Tell any Configurable keeping a pointer to a widget,
+ /// that the pointer returned by an earlier configWidget
+ /// call is invalid.
+ /// Note: It is possible that this may be called after
+ /// configWidget() has been called another time
+ /// so you must check the pointer param.
+ virtual void widgetInvalid(QObject*) { }
+
+ // A name for looking up the setting
+ void setName(const QString &str)
+ {
+ configName = str;
+ if (label.isEmpty())
+ setLabel(str);
+ }
+ QString getName(void) const { return configName; }
+ virtual Setting *byName(const QString &name) = 0;
+
+ // A label displayed to the user
+ virtual void setLabel(QString str) { label = str; }
+ QString getLabel(void) const { return label; }
+ void setLabelAboveWidget(bool l = true) { labelAboveWidget = l; }
+
+ virtual void setHelpText(const QString &str)
+ { helptext = str; }
+ QString getHelpText(void) const { return helptext; }
+
+ void setVisible(bool b) { visible = b; };
+ bool isVisible(void) const { return visible; };
+
+ virtual void setEnabled(bool b) { enabled = b; }
+ bool isEnabled() { return enabled; }
+
+ Storage *GetStorage(void) { return storage; }
+
+ public slots:
+ virtual void enableOnSet(const QString &val);
+ virtual void enableOnUnset(const QString &val);
+ virtual void widgetDeleted(QObject *obj);
+
+ protected:
+ explicit Configurable(Storage *_storage) :
+ labelAboveWidget(false), enabled(true), storage(_storage),
+ configName(""), label(""), helptext(""), visible(true) { }
+ virtual ~Configurable() { }
+
+ protected:
+ bool labelAboveWidget;
+ bool enabled;
+ Storage *storage;
+ QString configName;
+ QString label;
+ QString helptext;
+ bool visible;
+};
+
+class MPUBLIC Setting : public Configurable, public StorageUser
+{
+ Q_OBJECT
+
+ public:
+ // Gets
+ virtual QString getValue(void) const;
+
+ // non-const Gets
+ virtual Setting *byName(const QString &name)
+ { return (name == configName) ? this : NULL; }
+
+ // StorageUser
+ void SetDBValue(const QString &val) { setValue(val); }
+ QString GetDBValue(void) const { return getValue(); }
+ public slots:
+ virtual void setValue(const QString &newValue);
+
+ signals:
+ void valueChanged(const QString&);
+
+ protected:
+ explicit Setting(Storage *_storage) : Configurable(_storage) {};
+ virtual ~Setting() {};
+
+ protected:
+ QString settingValue;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+// Read-only display of a setting
+class MPUBLIC LabelSetting : public Setting
+{
+ protected:
+ explicit LabelSetting(Storage *_storage) : Setting(_storage) { }
+ public:
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+};
+
+class MPUBLIC LineEditSetting : public Setting
+{
+ protected:
+ LineEditSetting(Storage *_storage, bool readwrite = true) :
+ Setting(_storage), bxwidget(NULL), edit(NULL),
+ rw(readwrite), password_echo(false) { }
+
+ public:
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+ virtual void widgetInvalid(QObject *obj);
+
+ void setRW(bool readwrite = true)
+ {
+ rw = readwrite;
+ if (edit)
+ edit->setRW(rw);
+ }
+
+ void setRO(void) { setRW(false); }
+
+ virtual void setEnabled(bool b);
+ virtual void setVisible(bool b);
+ virtual void SetPasswordEcho(bool b);
+
+ virtual void setHelpText(const QString &str);
+
+ private:
+ QWidget *bxwidget;
+ MythLineEdit *edit;
+ bool rw;
+ bool password_echo;
+};
+
+// TODO: set things up so that setting the value as a string emits
+// the int signal also
+class MPUBLIC IntegerSetting : public Setting
+{
+ Q_OBJECT
+
+ protected:
+ explicit IntegerSetting(Storage *_storage) : Setting(_storage)
+ {
+ settingValue = QString::number(0);
+ }
+
+ public:
+ int intValue(void) const { return settingValue.toInt(); }
+
+ public slots:
+ virtual void setValue(int newValue)
+ {
+ Setting::setValue(QString::number(newValue));
+ emit valueChanged(newValue);
+ }
+ virtual void setValue(const QString &nv) { setValue(nv.toInt()); }
+
+ signals:
+ void valueChanged(int newValue);
+};
+
+class MPUBLIC BoundedIntegerSetting : public IntegerSetting
+{
+ protected:
+ BoundedIntegerSetting(Storage *_storage, int _min, int _max, int _step) :
+ IntegerSetting(_storage), min(_min), max(_max), step(_step) { }
+
+ public:
+ virtual void setValue(int newValue);
+ virtual void setValue(const QString &nv) { setValue(nv.toInt()); }
+
+ protected:
+ int min;
+ int max;
+ int step;
+};
+
+class MPUBLIC SliderSetting: public BoundedIntegerSetting
+{
+ Q_OBJECT
+
+ protected:
+ SliderSetting(Storage *_storage, int min, int max, int step) :
+ BoundedIntegerSetting(_storage, min, max, step) { }
+ public:
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+};
+
+class MPUBLIC SpinBoxSetting: public BoundedIntegerSetting
+{
+ Q_OBJECT
+
+ public:
+ SpinBoxSetting(Storage *_storage, int min, int max, int step,
+ bool allow_single_step = false,
+ QString special_value_text = "");
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+ virtual void widgetInvalid(QObject *obj);
+
+ void setFocus(void);
+ void clearFocus(void);
+ bool hasFocus(void) const;
+
+ void SetRelayEnabled(bool enabled) { relayEnabled = enabled; }
+ bool IsRelayEnabled(void) const { return relayEnabled; }
+
+ virtual void setHelpText(const QString &str);
+
+ public slots:
+ virtual void setValue(int newValue);
+ virtual void setValue(const QString &nv) { setValue(nv.toInt()); }
+
+ signals:
+ void valueChanged(const QString &name, int newValue);
+
+ private slots:
+ void relayValueChanged(int newValue);
+
+ private:
+ QWidget *bxwidget;
+ MythSpinBox *spinbox;
+ bool relayEnabled;
+ bool sstep;
+ QString svtext;
+};
+
+class MPUBLIC SelectSetting : public Setting
+{
+ Q_OBJECT
+
+ protected:
+ explicit SelectSetting(Storage *_storage) :
+ Setting(_storage), current(0), isSet(false) { }
+
+ public:
+ virtual int findSelection( const QString &label,
+ QString value = QString::null) const;
+ virtual void addSelection( const QString &label,
+ QString value = QString::null,
+ bool select = false);
+ virtual bool removeSelection(const QString &label,
+ QString value = QString::null);
+
+ virtual void clearSelections(void);
+
+ virtual void fillSelectionsFromDir(const QDir &dir, bool absPath=true);
+
+ virtual uint size(void) const { return labels.size(); }
+
+ virtual QString GetLabel(uint i) const
+ { return (i < labels.size()) ? labels[i] : QString::null; }
+ virtual QString GetValue(uint i) const
+ { return (i < values.size()) ? values[i] : QString::null; }
+
+ signals:
+ void selectionAdded(const QString &label, QString value);
+ void selectionRemoved(const QString &label, const QString &value);
+ void selectionsCleared(void);
+
+ public slots:
+ virtual void setValue(const QString &newValue);
+ virtual void setValue(int which);
+
+ virtual QString getSelectionLabel(void) const;
+ virtual int getValueIndex(QString value);
+
+ protected:
+ virtual bool ReplaceLabel(
+ const QString &new_label, const QString &value);
+
+ typedef std::vector<QString> selectionList;
+ selectionList labels;
+ selectionList values;
+ unsigned current;
+ bool isSet;
+};
+
+class MPUBLIC SelectLabelSetting : public SelectSetting
+{
+ protected:
+ explicit SelectLabelSetting(Storage *_storage) : SelectSetting(_storage) { }
+
+ public:
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+};
+
+class MPUBLIC ComboBoxSetting: public SelectSetting
+{
+ Q_OBJECT
+
+ protected:
+ ComboBoxSetting(Storage *_storage, bool _rw = false, int _step = 1) :
+ SelectSetting(_storage), rw(_rw),
+ bxwidget(NULL), cbwidget(NULL), step(_step) { }
+
+ public:
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+ virtual void widgetInvalid(QObject *obj);
+
+ void setFocus(void) { if (cbwidget) cbwidget->setFocus(); }
+ void resetMaxCount(int count)
+ { if (cbwidget) cbwidget->setMaxCount(count + rw); }
+
+ virtual void setEnabled(bool b);
+ virtual void setVisible(bool b);
+
+ virtual void setHelpText(const QString &str);
+
+ public slots:
+ virtual void SetDBValue(const QString &newValue)
+ { SelectSetting::setValue(newValue); }
+ virtual void setValue(const QString &newValue);
+ virtual void setValue(int which);
+
+ void addSelection(const QString &label,
+ QString value = QString::null,
+ bool select = false);
+ bool removeSelection(const QString &label,
+ QString value = QString::null);
+ void editTextChanged(const QString &newText);
+
+ private:
+ bool rw;
+ QWidget *bxwidget;
+ MythComboBox *cbwidget;
+
+ protected:
+ int step;
+};
+
+class MPUBLIC ListBoxSetting: public SelectSetting
+{
+ Q_OBJECT
+
+ public:
+ explicit ListBoxSetting(Storage *_storage) :
+ SelectSetting(_storage),
+ bxwidget(NULL), lbwidget(NULL), eventFilter(NULL),
+ selectionMode(MythListBox::SingleSelection) { }
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+ virtual void widgetInvalid(QObject *obj);
+
+ void setFocus(void)
+ { if (lbwidget) lbwidget->setFocus(); }
+ void setSelectionMode(MythListBox::SelectionMode mode);
+ void setCurrentItem(int i)
+ { if (lbwidget) lbwidget->setCurrentRow(i); }
+ void setCurrentItem(const QString &str)
+ { if (lbwidget) lbwidget->setCurrentItem(str, true, false); }
+ int currentItem(void)
+ { return (lbwidget) ? lbwidget->currentRow() : -1; }
+
+ virtual void setEnabled(bool b);
+
+ virtual void clearSelections(void);
+
+ virtual void setHelpText(const QString &str);
+
+ virtual void SetEventFilter(QObject *filter) { eventFilter = filter; }
+ virtual bool ReplaceLabel(
+ const QString &new_label, const QString &value);
+
+ signals:
+ void accepted(int);
+ void menuButtonPressed(int);
+ void editButtonPressed(int);
+ void deleteButtonPressed(int);
+
+ public slots:
+ void addSelection(const QString &label,
+ QString value = QString::null,
+ bool select = false);
+
+ void setValueByIndex(int index);
+
+ protected:
+ QWidget *bxwidget;
+ MythListBox *lbwidget;
+ QObject *eventFilter;
+ MythListBox::SelectionMode selectionMode;
+};
+
+class MPUBLIC BooleanSetting : public Setting
+{
+ Q_OBJECT
+
+ public:
+ explicit BooleanSetting(Storage *_storage) : Setting(_storage) {}
+
+ bool boolValue(void) const { return getValue().toInt(); }
+
+ public slots:
+ virtual void setValue(bool check)
+ {
+ if (check)
+ Setting::setValue("1");
+ else
+ Setting::setValue("0");
+ emit valueChanged(check);
+ };
+
+ virtual void setValue(const QString &newValue)
+ {
+ setValue((newValue=="1" ||
+ newValue.toLower().startsWith("y") ||
+ newValue.toLower().startsWith("t")));
+ }
+
+ signals:
+ void valueChanged(bool);
+};
+
+class MPUBLIC CheckBoxSetting: public BooleanSetting
+{
+ Q_OBJECT
+
+ public:
+ explicit CheckBoxSetting(Storage *_storage) :
+ BooleanSetting(_storage), widget(NULL) { }
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+
+ virtual void widgetInvalid(QObject*);
+
+ virtual void setVisible(bool b);
+ virtual void setLabel(QString str);
+ virtual void setEnabled(bool b);
+
+ virtual void setHelpText(const QString &str);
+
+ protected:
+ MythCheckBox *widget;
+};
+
+class MPUBLIC PathSetting : public ComboBoxSetting
+{
+ Q_OBJECT
+
+ public:
+ PathSetting(Storage *_storage, bool _mustexist):
+ ComboBoxSetting(_storage, true), mustexist(_mustexist) { }
+
+ // TODO: this should support globbing of some sort
+ virtual void addSelection(const QString &label,
+ QString value=QString::null,
+ bool select=false);
+
+ // Use a combobox for now, maybe a modified file dialog later
+ //virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ // const char *widgetName = NULL);
+
+ protected:
+ bool mustexist;
+};
+
+class MPUBLIC HostnameSetting : public Setting
+{
+ Q_OBJECT
+ public:
+ explicit HostnameSetting(Storage *_storage);
+};
+
+class MPUBLIC ChannelSetting : public SelectSetting
+{
+ Q_OBJECT
+ public:
+ explicit ChannelSetting(Storage *_storage) : SelectSetting(_storage)
+ {
+ setLabel("Channel");
+ };
+
+ static void fillSelections(SelectSetting *setting);
+ virtual void fillSelections(void) { fillSelections(this); }
+};
+
+class MPUBLIC DateSetting : public Setting
+{
+ Q_OBJECT
+
+ public:
+ explicit DateSetting(Storage *_storage) : Setting(_storage) { }
+
+ QString getValue(void) const;
+
+ QDate dateValue(void) const;
+
+ public slots:
+ void setValue(const QDate &newValue);
+ void setValue(const QString &newValue);
+};
+
+class MPUBLIC TimeSetting : public Setting
+{
+ Q_OBJECT
+
+ public:
+ explicit TimeSetting(Storage *_storage) : Setting(_storage) { }
+ QTime timeValue(void) const;
+
+ public slots:
+ void setValue(const QTime &newValue);
+ void setValue(const QString &newValue);
+};
+
+class MPUBLIC AutoIncrementDBSetting :
+ public IntegerSetting, public DBStorage
+{
+ Q_OBJECT
+
+ public:
+ AutoIncrementDBSetting(QString _table, QString _column) :
+ IntegerSetting(this), DBStorage(this, _table, _column)
+ {
+ setValue(0);
+ }
+
+ virtual void Load(void) { }
+ virtual void Save(void);
+ virtual void Save(QString destination);
+};
+
+class MPUBLIC ButtonSetting: public Setting
+{
+ Q_OBJECT
+
+ public:
+ ButtonSetting(Storage *_storage, QString _name = "button") :
+ Setting(_storage), name(_name), button(NULL) { }
+
+ virtual QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName=0);
+ virtual void widgetInvalid(QObject *obj);
+
+ virtual void setEnabled(bool b);
+
+ virtual void setLabel(QString);
+
+ virtual void setHelpText(const QString &);
+
+ signals:
+ void pressed(void);
+ void pressed(QString name);
+
+ protected slots:
+ void SendPressedString();
+
+ protected:
+ QString name;
+ MythPushButton *button;
+};
+
+class MPUBLIC ProgressSetting : public IntegerSetting
+{
+ Q_OBJECT
+ public:
+ ProgressSetting(Storage *_storage, int _totalSteps) :
+ IntegerSetting(_storage), totalSteps(_totalSteps) { }
+
+ QWidget *configWidget(ConfigurationGroup *cg, QWidget *parent,
+ const char *widgetName = NULL);
+
+ private:
+ int totalSteps;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class MPUBLIC TransButtonSetting :
+ public ButtonSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ explicit TransButtonSetting(QString name = "button") :
+ ButtonSetting(this, name), TransientStorage() { }
+};
+
+class MPUBLIC TransLabelSetting :
+ public LabelSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ TransLabelSetting() : LabelSetting(this), TransientStorage() { }
+};
+
+class MPUBLIC TransLineEditSetting :
+ public LineEditSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ explicit TransLineEditSetting(bool rw = true) :
+ LineEditSetting(this, rw), TransientStorage() { }
+};
+
+class MPUBLIC TransCheckBoxSetting :
+ public CheckBoxSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ TransCheckBoxSetting() : CheckBoxSetting(this), TransientStorage() { }
+};
+
+class MPUBLIC TransComboBoxSetting :
+ public ComboBoxSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ TransComboBoxSetting(bool rw = false, int _step = 1) :
+ ComboBoxSetting(this, rw, _step), TransientStorage() { }
+};
+
+class MPUBLIC TransSpinBoxSetting :
+ public SpinBoxSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ TransSpinBoxSetting(int minv, int maxv, int step,
+ bool allow_single_step = false,
+ QString special_value_text = "") :
+ SpinBoxSetting(this, minv, maxv, step,
+ allow_single_step, special_value_text) { }
+};
+
+class MPUBLIC TransListBoxSetting :
+ public ListBoxSetting, public TransientStorage
+{
+ Q_OBJECT
+ public:
+ TransListBoxSetting() : ListBoxSetting(this), TransientStorage() { }
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+class MPUBLIC HostSlider : public SliderSetting, public HostDBStorage
+{
+ Q_OBJECT
+ public:
+ HostSlider(const QString &name, int min, int max, int step) :
+ SliderSetting(this, min, max, step),
+ HostDBStorage(this, name) { }
+};
+
+class MPUBLIC HostSpinBox: public SpinBoxSetting, public HostDBStorage
+{
+ Q_OBJECT
+ public:
+ HostSpinBox(const QString &name, int min, int max, int step,
+ bool allow_single_step = false) :
+ SpinBoxSetting(this, min, max, step, allow_single_step),
+ HostDBStorage(this, name) { }
+};
+
+class MPUBLIC HostCheckBox : public CheckBoxSetting, public HostDBStorage
+{
+ Q_OBJECT
+ public:
+ explicit HostCheckBox(const QString &name) :
+ CheckBoxSetting(this), HostDBStorage(this, name) { }
+ virtual ~HostCheckBox() { ; }
+};
+
+class MPUBLIC HostComboBox : public ComboBoxSetting, public HostDBStorage
+{
+ Q_OBJECT
+ public:
+ HostComboBox(const QString &name, bool rw = false) :
+ ComboBoxSetting(this, rw), HostDBStorage(this, name) { }
+ virtual ~HostComboBox() { ; }
+};
+
+class MPUBLIC HostRefreshRateComboBox : public HostComboBox
+{
+ Q_OBJECT
+ public:
+ HostRefreshRateComboBox(const QString &name, bool rw = false) :
+ HostComboBox(name, rw) { }
+ virtual ~HostRefreshRateComboBox() { ; }
+
+ public slots:
+ virtual void ChangeResolution(const QString &resolution);
+
+ private:
+ static const std::vector<double> GetRefreshRates(const QString &resolution);
+};
+
+class MPUBLIC HostTimeBox : public ComboBoxSetting, public HostDBStorage
+{
+ Q_OBJECT
+ public:
+ HostTimeBox(const QString &name, const QString &defaultTime = "00:00",
+ const int interval = 1) :
+ ComboBoxSetting(this, false, 30 / interval),
+ HostDBStorage(this, name)
+ {
+ int hour;
+ int minute;
+ QString timeStr;
+
+ for (hour = 0; hour < 24; hour++)
+ {
+ for (minute = 0; minute < 60; minute += interval)
+ {
+ timeStr = timeStr.sprintf("%02d:%02d", hour, minute);
+ addSelection(timeStr, timeStr,
+ timeStr == defaultTime);
+ }
+ }
+ }
+};
+
+class MPUBLIC HostLineEdit: public LineEditSetting, public HostDBStorage
+{
+ Q_OBJECT
+ public:
+ HostLineEdit(const QString &name, bool rw = true) :
+ LineEditSetting(this, rw), HostDBStorage(this, name) { }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class MPUBLIC GlobalSlider : public SliderSetting, public GlobalDBStorage
+{
+ Q_OBJECT
+ public:
+ GlobalSlider(const QString &name, int min, int max, int step) :
+ SliderSetting(this, min, max, step), GlobalDBStorage(this, name) { }
+};
+
+class MPUBLIC GlobalSpinBox : public SpinBoxSetting, public GlobalDBStorage
+{
+ Q_OBJECT
+ public:
+ GlobalSpinBox(const QString &name, int min, int max, int step,
+ bool allow_single_step = false) :
+ SpinBoxSetting(this, min, max, step, allow_single_step),
+ GlobalDBStorage(this, name) { }
+};
+
+class MPUBLIC GlobalCheckBox : public CheckBoxSetting, public GlobalDBStorage
+{
+ Q_OBJECT
+ public:
+ explicit GlobalCheckBox(const QString &name) :
+ CheckBoxSetting(this), GlobalDBStorage(this, name) { }
+};
+
+class MPUBLIC GlobalComboBox : public ComboBoxSetting, public GlobalDBStorage
+{
+ Q_OBJECT
+ public:
+ GlobalComboBox(const QString &name, bool rw = false) :
+ ComboBoxSetting(this, rw), GlobalDBStorage(this, name) { }
+};
+
+class MPUBLIC GlobalLineEdit : public LineEditSetting, public GlobalDBStorage
+{
+ Q_OBJECT
+ public:
+ GlobalLineEdit(const QString &name, bool rw = true) :
+ LineEditSetting(this, rw), GlobalDBStorage(this, name) { }
+};
+
+class MPUBLIC GlobalTimeBox : public ComboBoxSetting, public GlobalDBStorage
+{
+ Q_OBJECT
+ public:
+ GlobalTimeBox(const QString &name, const QString &defaultTime = "00:00",
+ const int interval = 1) :
+ ComboBoxSetting(this, false, 30 / interval),
+ GlobalDBStorage(this, name)
+ {
+ int hour;
+ int minute;
+ QString timeStr;
+
+ for (hour = 0; hour < 24; hour++)
+ {
+ for (minute = 0; minute < 60; minute += interval)
+ {
+ timeStr = timeStr.sprintf("%02d:%02d", hour, minute);
+ addSelection(timeStr, timeStr,
+ timeStr == defaultTime);
+ }
+ }
+ }
+};
+
+#ifndef MYTHCONFIG
+#include "mythconfigdialogs.h"
+#include "mythconfiggroups.h"
+#endif // MYTHCONFIG
+
+#endif // SETTINGS_H
diff --git a/abs/core/mythinstall/PKGBUILD b/abs/core/mythinstall/PKGBUILD
index 75ffe99..24a8235 100644
--- a/abs/core/mythinstall/PKGBUILD
+++ b/abs/core/mythinstall/PKGBUILD
@@ -1,11 +1,11 @@
# Maintainer: Jams
pkgname=mythinstall
-pkgver=8.5.1
-pkgrel=4
+pkgver=8.6
+pkgrel=1
pkgdesc="LinHES installer/systemconfig GUI."
-arch=('i686' 'x86_64')
-depends=('mythtv>=29' 'LinHES-config')
-makedepends=('mythtv>=29')
+arch=('x86_64')
+depends=('mythtv>=30.0' 'LinHES-config')
+makedepends=('mythtv>=30.0')
logofiles=`ls logo*.png`
source=('install-ui.xml' $logofiles)
diff --git a/abs/core/mythtv/stable-29/git_src/git_hash b/abs/core/mythtv/stable-29/git_src/git_hash
index 3fed727..b17c7bf 100644
--- a/abs/core/mythtv/stable-29/git_src/git_hash
+++ b/abs/core/mythtv/stable-29/git_src/git_hash
@@ -1 +1 @@
-951f1fe7ea0bd54a8bb5ef08f3b55feee5169340
+af5d819671ebd4fe4fbd1ff6c2fc978561bde9f3
diff --git a/abs/core/mythtv/stable-29/mythplugins/PKGBUILD b/abs/core/mythtv/stable-29/mythplugins/PKGBUILD
index 69128c3..57288c0 100644
--- a/abs/core/mythtv/stable-29/mythplugins/PKGBUILD
+++ b/abs/core/mythtv/stable-29/mythplugins/PKGBUILD
@@ -9,7 +9,7 @@ pkgname=('mytharchive'
'mythweather'
'mythzoneminder')
pkgver=29.1
-pkgrel=11
+pkgrel=12
arch=('x86_64')
url="http://www.mythtv.org"
license=('GPL')
diff --git a/abs/core/mythtv/stable-29/mythtv/PKGBUILD b/abs/core/mythtv/stable-29/mythtv/PKGBUILD
index 1e3d14c..6dae83c 100644
--- a/abs/core/mythtv/stable-29/mythtv/PKGBUILD
+++ b/abs/core/mythtv/stable-29/mythtv/PKGBUILD
@@ -1,6 +1,6 @@
pkgname=mythtv
pkgver=29.1
-pkgrel=11
+pkgrel=12
commit_hash=`cat ../git_src/git_hash`
pkgdesc="A Homebrew PVR project $commit_hash"
arch=('x86_64')
diff --git a/abs/core/mythtv/stable-30/git_src/checkout_mythtv.sh b/abs/core/mythtv/stable-30/git_src/checkout_mythtv.sh
new file mode 100755
index 0000000..6ad4f0d
--- /dev/null
+++ b/abs/core/mythtv/stable-30/git_src/checkout_mythtv.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#Quick script used to checkout the MythTV source
+#This source should be used build all mythplugins & main program
+
+_gitroot="https://github.com/MythTV/mythtv.git"
+_gitname="mythtv"
+_gitbranch="fixes/30"
+
+startdir=`pwd`
+
+#Set this to True, to update mythtv to the latest.
+#If not true then it will use the hash stored in git_hash
+_current="True"
+
+_checkoutHASH=`cat git_hash`
+
+if [ -d $_gitname ]
+then
+ cd $_gitname
+ git checkout $_gitbranch
+ git pull
+ echo "The local files are updated."
+ cd $startdir
+else
+ git clone -b $_gitbranch $_gitroot
+fi
+
+if [ -d $_gitname ]
+then
+ cd $_gitname
+ if [ $_current == True ]
+ then
+ git rev-parse HEAD > $startdir/git_hash
+ else
+ git checkout $_checkoutHASH
+ fi
+ cd mythtv
+ sh ./version.sh `pwd`
+fi
+echo "GIT checkout done or server timeout"
diff --git a/abs/core/mythtv/stable-30/git_src/checkout_mythweb.sh b/abs/core/mythtv/stable-30/git_src/checkout_mythweb.sh
new file mode 100755
index 0000000..5ba77cb
--- /dev/null
+++ b/abs/core/mythtv/stable-30/git_src/checkout_mythweb.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+#Quick script used to checkout the Mythweb source
+#This source should be used build all mythplugins & main program
+
+_gitroot="https://github.com/MythTV/mythweb.git"
+_gitname="mythweb"
+_gitbranch="fixes/30"
+
+startdir=`pwd`
+
+#Set this to True, to update mythtv to the latest.
+#If not true then it will use the hash stored in git_hash
+_current="True"
+
+_checkoutHASH=`cat git_hash_web`
+
+if [ -d $_gitname ]
+then
+ cd $_gitname
+ git checkout $_gitbranch
+ git pull
+ echo "The local files are updated."
+ cd $startdir
+else
+ git clone -b $_gitbranch $_gitroot
+fi
+
+if [ -d $_gitname ]
+then
+ cd $_gitname
+ if [ $_current == True ]
+ then
+ git rev-parse HEAD > $startdir/git_hash_web
+ else
+ git checkout $_checkoutHASH
+ fi
+fi
+echo "GIT checkout done or server timeout"
diff --git a/abs/core/mythtv/stable-30/git_src/git_hash b/abs/core/mythtv/stable-30/git_src/git_hash
new file mode 100644
index 0000000..49df4ff
--- /dev/null
+++ b/abs/core/mythtv/stable-30/git_src/git_hash
@@ -0,0 +1 @@
+60cfb7c05ae21d0049537aaa66f8f70a836a1138
diff --git a/abs/core/mythtv/stable-30/git_src/git_hash_web b/abs/core/mythtv/stable-30/git_src/git_hash_web
new file mode 100644
index 0000000..b192069
--- /dev/null
+++ b/abs/core/mythtv/stable-30/git_src/git_hash_web
@@ -0,0 +1 @@
+8dc8a715aae7db7bbc3b857a337a4761af8341f7
diff --git a/abs/core/mythtv/stable-30/mythplugins/0317-0336-MythMusic-Fix-Playlist-copyTracks-and-removeAllTrack.patch b/abs/core/mythtv/stable-30/mythplugins/0317-0336-MythMusic-Fix-Playlist-copyTracks-and-removeAllTrack.patch
new file mode 100644
index 0000000..5c0f623
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythplugins/0317-0336-MythMusic-Fix-Playlist-copyTracks-and-removeAllTrack.patch
@@ -0,0 +1,50 @@
+From e7c80f43a3ec0fc2024f64e17d13461840429029 Mon Sep 17 00:00:00 2001
+From: Lawrence Rust <lvr@softsystem.co.uk>
+Date: Fri, 17 Jun 2016 18:40:37 +0100
+Subject: [PATCH 336/348] MythMusic: Fix Playlist::copyTracks and
+ removeAllTracks
+
+Correct these 2 functions to call gPlayer->activePlaylistChanged
+
+Signed-off-by: Lawrence Rust <lvr@softsystem.co.uk>
+---
+ mythplugins/mythmusic/mythmusic/playlist.cpp | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/mythplugins/mythmusic/mythmusic/playlist.cpp b/mythplugins/mythmusic/mythmusic/playlist.cpp
+index 79a509a..94146a4 100644
+--- a/mythplugins/mythmusic/mythmusic/playlist.cpp
++++ src/mythplugins/mythmusic/mythmusic/playlist.cpp
+@@ -46,7 +46,7 @@ bool Playlist::checkTrack(MusicMetadata::IdType trackID) const
+
+ void Playlist::copyTracks(Playlist *to_ptr, bool update_display)
+ {
+- disableSaves();
++ to_ptr->disableSaves();
+
+ for (int x = 0; x < m_songs.size(); x++)
+ {
+@@ -58,9 +58,9 @@ void Playlist::copyTracks(Playlist *to_ptr, bool update_display)
+ }
+ }
+
+- enableSaves();
++ to_ptr->enableSaves();
+
+- changed();
++ to_ptr->changed();
+ }
+
+ /// Given a tracks ID, add that track to this playlist
+@@ -94,6 +94,8 @@ void Playlist::removeAllTracks(void)
+ m_shuffledSongs.clear();
+
+ changed();
++
++ gPlayer->activePlaylistChanged(-1, true);
+ }
+
+ void Playlist::removeAllCDTracks(void)
+--
+1.7.9.5
+
diff --git a/abs/core/mythtv/stable-30/mythplugins/PKGBUILD b/abs/core/mythtv/stable-30/mythplugins/PKGBUILD
new file mode 100644
index 0000000..7828a2c
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythplugins/PKGBUILD
@@ -0,0 +1,139 @@
+pkgbase=mythplugins
+pkgname=('mytharchive'
+ 'mythbrowser'
+ 'mythgallery'
+ 'mythgame'
+ 'mythmusic'
+ 'mythnetvision'
+ 'mythnews'
+ 'mythweather'
+ 'mythzoneminder')
+pkgver=30.0
+pkgrel=5
+arch=('x86_64')
+url="http://www.mythtv.org"
+license=('GPL')
+makedepends=('cdrkit' 'dcraw' 'dvdauthor' 'dvd+rw-tools' 'ffmpeg' 'flac' 'libexif'
+ 'libvorbis' 'mesa' 'libgl' 'mplayer' "mythtv>=${pkgver}"
+ 'perl-datetime-format-iso8601' 'perl-date-manip' 'perl-image-size'
+ 'perl-json' 'perl-libwww' 'perl-soap-lite' 'perl-xml-sax'
+ 'perl-xml-simple' 'perl-xml-xpath' 'python2-oauth' 'python2-pillow'
+ 'python2-pycurl' 'qt5-tools' 'zlib')
+source=('mythburn.py-aspectratio.patch'
+ 'mythburn.cpp-python2.patch'
+ '0317-0336-MythMusic-Fix-Playlist-copyTracks-and-removeAllTrack.patch'
+ 'mythmusic_en_us.ts_Title_Case.patch'
+ )
+
+prepare() {
+ if [ -e ${srcdir}/mythplugins ]
+ then
+ msg "Removing old mythplugins src"
+ rm -rf ${srcdir}/mythplugins
+ fi
+
+ cd ${startdir}
+ msg "Copying in mythplugins git_src"
+ cp -rp ../git_src/mythtv/mythplugins $srcdir
+
+ msg "Patch MythMusic Playlist"
+ cd ${srcdir}
+ patch -Np1 -i "$srcdir/0317-0336-MythMusic-Fix-Playlist-copyTracks-and-removeAllTrack.patch"
+
+ msg "Change python to python2"
+ find . -name '*.py' -type f | xargs sed -i 's@^#!.*python$@#!/usr/bin/python2@'
+ patch -Np1 -i "$srcdir/mythburn.cpp-python2.patch"
+
+ msg "Patch and update MythMusic translations"
+ patch -Np1 -i "$srcdir/mythmusic_en_us.ts_Title_Case.patch"
+ cd ${srcdir}/$pkgbase/mythmusic/i18n
+ lrelease -removeidentical mythmusic_en_us.ts
+}
+
+build() {
+ cd ${srcdir}/${pkgbase}
+ msg "Configuring mythplugins"
+ ./configure --prefix=/usr \
+ --enable-all \
+ --python=python2
+
+ msg "Compiling mythplugins"
+ qmake-qt5 mythplugins.pro || return 1
+ make || return 1
+}
+
+package_mytharchive() {
+ pkgdesc="Create DVDs or archive recorded shows in MythTV"
+ depends=('cdrkit' 'dvdauthor' 'dvd+rw-tools' 'ffmpeg' "mythtv>=${pkgver}"
+ 'm2vrequantiser' 'mjpegtools' 'python2-pillow')
+ optdepends=('projectx: for subtitle support')
+ cd "${srcdir}/${_gitname}/${pkgbase}/mytharchive"
+ patch mythburn/scripts/mythburn.py < $srcdir/mythburn.py-aspectratio.patch || return 1
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythbrowser() {
+ pkgdesc="Mini web browser for MythTV"
+ depends=("mythtv>=${pkgver}")
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythbrowser"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythgallery() {
+ pkgdesc="Image gallery plugin for MythTV"
+ depends=('libexif' "mythtv>=${pkgver}" 'dcraw')
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythgallery"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythgame() {
+ pkgdesc="Game emulator plugin for MythTV"
+ depends=("mythtv>=${pkgver}" 'zlib')
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythgame"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythmusic() {
+ pkgdesc="Music playing plugin for MythTV"
+ depends=('cdparanoia' 'fftw' 'flac' 'libcdaudio' 'libcdio-paranoia'
+ 'libvisual-plugins' 'libvorbis' "mythtv>=${pkgver}" 'taglib')
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythmusic"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythnetvision() {
+ pkgdesc="MythNetvision plugin for MythTV"
+ depends=("mythtv>=${pkgver}" 'python2-pycurl' 'python2-oauth'
+ 'python2-lxml' 'python2')
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythnetvision"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythnews() {
+ pkgdesc="News checking plugin for MythTV"
+ depends=("mythtv>=${pkgver}")
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythnews"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythweather() {
+ pkgdesc="Weather checking plugin for MythTV"
+ depends=("mythtv>=${pkgver}" 'perl-date-manip' 'perl-json' 'perl-soap-lite'
+ 'perl-xml-sax' 'perl-xml-simple' 'perl-xml-xpath' 'perl-image-size'
+ 'perl-datetime-format-iso8601')
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythweather"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+package_mythzoneminder() {
+ pkgdesc="View CCTV footage from zoneminder in MythTV"
+ depends=("mythtv>=${pkgver}")
+# install=mythplugins-mythzoneminder.install
+ cd "${srcdir}/${_gitname}/${pkgbase}/mythzoneminder"
+ make INSTALL_ROOT="${pkgdir}" install || return 1
+}
+
+md5sums=('e98c2a09bcb051fdde959fb4bb2e5ab2'
+ 'b9edd8f7da64ffa74baa91092bd48cc9'
+ '0299d0214c0d3a452c0284352435d698'
+ 'df4b92d6886db1fdd59fc02dbe33df60')
diff --git a/abs/core/mythtv/stable-30/mythplugins/mythburn.cpp-python2.patch b/abs/core/mythtv/stable-30/mythplugins/mythburn.cpp-python2.patch
new file mode 100644
index 0000000..2c43f9e
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythplugins/mythburn.cpp-python2.patch
@@ -0,0 +1,13 @@
+diff --git a/mythplugins/mytharchive/mytharchive/mythburn.cpp b/mythplugins/mytharchive/mytharchive/mythburn.cpp
+index 4188579bb0..639f17abe9 100644
+--- a/mythplugins/mytharchive/mytharchive/mythburn.cpp
++++ b/mythplugins/mytharchive/mytharchive/mythburn.cpp
+@@ -950,7 +950,7 @@ void MythBurn::runScript()
+ QFile::remove(logDir + "/mythburncancel.lck");
+
+ createConfigFile(configDir + "/mydata.xml");
+- commandline = "python " + GetShareDir() + "mytharchive/scripts/mythburn.py";
++ commandline = "python2 " + GetShareDir() + "mytharchive/scripts/mythburn.py";
+ commandline += " -j " + configDir + "/mydata.xml"; // job file
+ commandline += " -l " + logDir + "/progress.log"; // progress log
+ commandline += " > " + logDir + "/mythburn.log 2>&1 &"; // Logs
diff --git a/abs/core/mythtv/stable-30/mythplugins/mythburn.py-aspectratio.patch b/abs/core/mythtv/stable-30/mythplugins/mythburn.py-aspectratio.patch
new file mode 100644
index 0000000..377de95
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythplugins/mythburn.py-aspectratio.patch
@@ -0,0 +1,138 @@
+--- mythburn.py.orig 2013-12-16 22:41:31.532703825 +0000
++++ mythburn.py 2013-12-16 22:40:52.191109409 +0000
+@@ -98,6 +98,7 @@
+ from fcntl import ioctl
+ import CDROM
+ from shutil import copy
++from subprocess import Popen, PIPE
+
+ import MythTV
+ from MythTV import datetime
+@@ -440,7 +441,7 @@
+ os.remove(os.path.join(root, name))
+
+ #############################################################
+-# Romoves all the objects from a directory
++# Removes all the objects from a directory
+
+ def deleteEverythingInFolder(folder):
+ for root, dirs, files in os.walk(folder, topdown=False):
+@@ -666,14 +667,14 @@
+ # Gets the aspect ratio of a video file from its stream info file
+
+ def getAspectRatioOfVideo(index):
+- """Returns the aspect ratio of the video file (1.333, 1.778, etc)"""
++ """Returns the aspect ratio of the original video file (1.333, 1.778, etc)"""
+
+ #open the XML containing information about this file
+- infoDOM = xml.dom.minidom.parse(os.path.join(getItemTempPath(index), 'streaminfo.xml'))
++ infoDOM = xml.dom.minidom.parse(os.path.join(getItemTempPath(index), 'streaminfo_orig.xml'))
+
+ #error out if its the wrong XML
+ if infoDOM.documentElement.tagName != "file":
+- fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo.xml'))
++ fatalError("Stream info file doesn't look right (%s)" % os.path.join(getItemTempPath(index), 'streaminfo_orig.xml'))
+ video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0]
+ if video.attributes["aspectratio"].value != 'N/A':
+ aspect_ratio = float(video.attributes["aspectratio"].value)
+@@ -1695,6 +1696,37 @@
+ fatalError("Failed while running mytharchivehelper to get stream information.\n"
+ "Result: %d, Command was %s" % (result, command))
+
++ #open the XML containing information about this file
++ infoDOM = xml.dom.minidom.parse(xmlFilename)
++
++ #error out if its the wrong XML
++ if infoDOM.documentElement.tagName != "file":
++ fatalError("This info file doesn't look right (%s)." % xmlFilename)
++
++ file = infoDOM.getElementsByTagName("file")[0]
++ video = infoDOM.getElementsByTagName("file")[0].getElementsByTagName("streams")[0].getElementsByTagName("video")[0]
++
++ #use ffmpeg to get display aspect ratio (DAR) of video
++ cmd = "mythffmpeg -i " + quoteCmdArg(file.attributes["filename"].value) + " 2>&1"
++ aspect_ratio = Popen(cmd, shell=True, stdout=PIPE).stdout.read()
++ if "DAR" in aspect_ratio:
++ #clean DAR string
++ aspect_ratio = aspect_ratio.split("DAR ")[-1].split(",")[0]
++ aspect_ratio = ''.join([c for c in aspect_ratio if c in '1234567890:']).split(":")
++ else:
++ #calculate aspect from video size
++ aspect_ratio = getVideoSize(xmlFilename)
++
++ #convert to decimal+
++ aspect_ratio = float(aspect_ratio[0]) / float(aspect_ratio[1])
++
++ write("Video %s aspect ratio is: %s" % (filename, aspect_ratio))
++
++ #set aspect ratio
++ video.setAttribute("aspectratio",str(aspect_ratio))
++
++ WriteXMLToFile (infoDOM,xmlFilename)
++
+ # print out the streaminfo.xml file to the log
+ infoDOM = xml.dom.minidom.parse(xmlFilename)
+ write(xmlFilename + ":-\n" + infoDOM.toprettyxml(" ", ""), False)
+@@ -2010,7 +2042,7 @@
+ #############################################################
+ # Re-encodes a file to mpeg2
+
+-def encodeVideoToMPEG2(source, destvideofile, video, audio1, audio2, aspectratio, profile):
++def encodeVideoToMPEG2(source, destvideofile, video, folder, audio1, audio2, aspectratio, profile):
+ """Encodes an unknown video source file eg. AVI to MPEG2 video and AC3 audio, use mythffmpeg"""
+
+ profileNode = findEncodingProfile(profile)
+@@ -2035,6 +2067,35 @@
+ value = quoteCmdArg(destvideofile)
+ if value == "%aspect":
+ value = aspectratio
++ if value == "720x480" or value == "720x576":
++ videores, fps, videoAR = getVideoParams(folder)
++ videoWidth = int(videores.split("x")[0])
++ videoHeight = int(videores.split("x")[1])
++
++ #add padding to correct for aspects > than 1.9:1
++ if float(videoAR) >= 1.9:
++ #check which video type and set the correct height
++ if videomode == "ntsc":
++ videoModeHeight = 480
++ else:
++ videoModeHeight = 576
++
++ #calculate the video height based on the aspect ratio of the video
++ #multiply by 1.185 to compensate for dvds non-square pixels
++ calVideoHeight = int(round((720 / float(videoAR)) * 1.185))
++ if calVideoHeight % 2 == 1:
++ calVideoHeight = calVideoHeight + 1
++ #write("calVideoHeight: %s" % calVideoHeight)
++
++ #use original video height if the calculated video height is close
++ if (calVideoHeight + 20 < videoHeight) or (calVideoHeight - 20 > videoHeight):
++ videoHeight = calVideoHeight
++
++ cropPixels = videoModeHeight - videoHeight
++
++ write("Crop Pixels Total: %s" % cropPixels)
++ name = "-vf"
++ value = "\"scale=720:%d, setsar=1:1, pad=720:%d:0:%d:black\"" % (videoModeHeight - cropPixels, videoModeHeight, cropPixels / 2)
+
+ # only re-encode the audio if it is not already in AC3 format
+ if audio1[AUDIO_CODEC] == "AC3":
+@@ -4608,7 +4669,7 @@
+
+ #do the re-encode
+ encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video,
+- audio1, audio2, aspectratio, profile)
++ folder, audio1, audio2, aspectratio, profile)
+ mediafile = os.path.join(folder, 'newfile2.mpg')
+
+ #remove the old mediafile that was run through mythtranscode
+@@ -4762,7 +4823,7 @@
+
+ #do the re-encode
+ encodeVideoToMPEG2(mediafile, os.path.join(folder, "newfile2.mpg"), video,
+- audio1, audio2, aspectratio, profile)
++ folder, audio1, audio2, aspectratio, profile)
+ mediafile = os.path.join(folder, 'newfile2.mpg')
+
+ #remove an intermediate file
diff --git a/abs/core/mythtv/stable-30/mythplugins/mythmusic_en_us.ts_Title_Case.patch b/abs/core/mythtv/stable-30/mythplugins/mythmusic_en_us.ts_Title_Case.patch
new file mode 100644
index 0000000..e97cbdf
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythplugins/mythmusic_en_us.ts_Title_Case.patch
@@ -0,0 +1,2895 @@
+--- src/mythplugins/mythmusic/i18n/mythmusic_en_us.ts.orig 2019-02-27 18:13:10.875044646 +0000
++++ src/mythplugins/mythmusic/i18n/mythmusic_en_us.ts 2019-02-27 18:11:15.120068810 +0000
+@@ -6,7 +6,7 @@
+ <message>
+ <location filename="../mythmusic/musicdata.cpp" line="114"/>
+ <source>Loading Music. Please wait ...</source>
+- <translation>Loading Music. Please wait ...</translation>
++ <translation>Loading Music...</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/main.cpp" line="92"/>
+@@ -28,20 +28,20 @@
+ <message>
+ <location filename="../mythmusic/main.cpp" line="221"/>
+ <source>MythMusic hasn&apos;t been built with libcdio support so ripping CDs is not possible</source>
+- <translation>MythMusic hasn&apos;t been built with libcdio support so ripping CDs is not possible</translation>
++ <translation>MythMusic hasn&apos;t been built with libcdio support so ripping CDs is not possible.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="549"/>
++ <location filename="../mythmusic/main.cpp" line="546"/>
+ <source>Searching for music files...</source>
+- <translation>Searching for music files...</translation>
++ <translation>Searching for Music Files...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="572"/>
++ <location filename="../mythmusic/main.cpp" line="569"/>
+ <source>Loading music tracks</source>
+- <translation>Loading music tracks</translation>
++ <translation>Loading Music Tracks...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="731"/>
++ <location filename="../mythmusic/main.cpp" line="728"/>
+ <source>Unknown</source>
+ <translation>Unknown</translation>
+ </message>
+@@ -49,7 +49,7 @@
+ <context>
+ <name>AlbumArt</name>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="1549"/>
++ <location filename="../mythmusic/visualize.cpp" line="1512"/>
+ <source>?</source>
+ <translation>?</translation>
+ </message>
+@@ -57,7 +57,7 @@
+ <context>
+ <name>CDRipperThread</name>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="272"/>
++ <location filename="../mythmusic/cdrip.cpp" line="268"/>
+ <source>Importing %1</source>
+ <translation>Importing %1</translation>
+ </message>
+@@ -86,27 +86,27 @@
+ <context>
+ <name>CriteriaRowEditor</name>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1590"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1580"/>
+ <source>Select an Artist</source>
+ <translation>Select an Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1595"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1585"/>
+ <source>Select a Compilation Artist</source>
+ <translation>Select a Compilation Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1600"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1590"/>
+ <source>Select an Album</source>
+ <translation>Select an Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1605"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1595"/>
+ <source>Select a Genre</source>
+ <translation>Select a Genre</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1610"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1600"/>
+ <source>Select a Title</source>
+ <translation>Select a Title</translation>
+ </message>
+@@ -116,224 +116,224 @@
+ <message>
+ <location filename="../mythmusic/decoderhandler.cpp" line="314"/>
+ <source>Retrieving playlist</source>
+- <translation>Retrieving playlist</translation>
++ <translation>Retrieving Playlist...</translation>
+ </message>
+ </context>
+ <context>
+ <name>EditAlbumartDialog</name>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1036"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1097"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1192"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1029"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1090"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1185"/>
+ <source>Change Image Type</source>
+ <translation>Change Image Type</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1038"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1031"/>
+ <source>What image type do you want to use for this image?</source>
+ <translation>What image type do you want to use for this image?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1073"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1066"/>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1087"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1186"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1080"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1179"/>
+ <source>Edit Metadata</source>
+ <translation>Edit Metadata</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1088"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1188"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1081"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1181"/>
+ <source>Rescan For Images</source>
+- <translation>Rescan For Images</translation>
++ <translation>Rescan for Images</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1091"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1190"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1084"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1183"/>
+ <source>Search Internet For Images</source>
+- <translation>Search Internet For Images</translation>
++ <translation>Search Internet for Images</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1110"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1194"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1103"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1187"/>
+ <source>Copy Selected Image To Tag</source>
+- <translation>Copy Selected Image To Tag</translation>
++ <translation>Copy Selected Image to Tag</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1115"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1196"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1108"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1189"/>
+ <source>Remove Selected Image From Tag</source>
+- <translation>Remove Selected Image From Tag</translation>
++ <translation>Remove Selected Image from Tag</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1125"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="1198"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1118"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1191"/>
+ <source>Copy Image To Tag</source>
+- <translation>Copy Image To Tag</translation>
++ <translation>Copy Image to Tag</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1304"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1297"/>
+ <source>Are you sure you want to permanently remove this image from the tag?</source>
+ <translation>Are you sure you want to permanently remove this image from the tag?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="1357"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="1350"/>
+ <source>Copying image to tag...</source>
+- <translation>Copying image to tag...</translation>
++ <translation>Copying Image to Tag...</translation>
+ </message>
+ </context>
+ <context>
+ <name>EditLyricsDialog</name>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="688"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="681"/>
+ <source>Save changes?</source>
+- <translation>Save changes?</translation>
++ <translation>Save Changes?</translation>
+ </message>
+ </context>
+ <context>
+ <name>EditMetadataCommon</name>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="171"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="168"/>
+ <source>Save Changes?</source>
+ <translation>Save Changes?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="186"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="188"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="183"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="185"/>
+ <source>Save Changes</source>
+ <translation>Save Changes</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="190"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="187"/>
+ <source>Exit/Do Not Save</source>
+- <translation>Exit/Do Not Save</translation>
++ <translation>Do Not Save</translation>
+ </message>
+ </context>
+ <context>
+ <name>EditMetadataDialog</name>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="505"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="501"/>
+ <source>Options</source>
+ <translation>Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="519"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="783"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="515"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="779"/>
+ <source>Edit Albumart Images</source>
+- <translation>Edit Albumart Images</translation>
++ <translation>Edit Album Art Images</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="520"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="790"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="516"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="786"/>
+ <source>Search Internet For Artist Image</source>
+- <translation>Search Internet For Artist Image</translation>
++ <translation>Search Internet for Artist Image</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="521"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="795"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="517"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="791"/>
+ <source>Search Internet For Album Image</source>
+- <translation>Search Internet For Album Image</translation>
++ <translation>Search Internet for Album Image</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="522"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="785"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="518"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="781"/>
+ <source>Search Internet For Genre Image</source>
+- <translation>Search Internet For Genre Image</translation>
++ <translation>Search Internet for Genre Image</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="523"/>
+- <location filename="../mythmusic/editmetadata.cpp" line="800"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="519"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="796"/>
+ <source>Check Track Length</source>
+ <translation>Check Track Length</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="558"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="554"/>
+ <source>Various Artists</source>
+ <translation>Various Artists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="565"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="561"/>
+ <source>Select an Artist</source>
+ <translation>Select an Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="610"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="606"/>
+ <source>Select a Compilation Artist</source>
+ <translation>Select a Compilation Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="635"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="631"/>
+ <source>Select an Album</source>
+ <translation>Select an Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="678"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="674"/>
+ <source>Select a Genre</source>
+ <translation>Select a Genre</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/editmetadata.cpp" line="810"/>
++ <location filename="../mythmusic/editmetadata.cpp" line="806"/>
+ <source>Asked the backend to check the tracks length</source>
+- <translation>Asked the backend to check the tracks length</translation>
++ <translation>Asked the backend to check the length of the track.</translation>
+ </message>
+ </context>
+ <context>
+ <name>GeneralSettings</name>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="77"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="72"/>
+ <source>Audio Device used for playback. &apos;default&apos; will use the device specified in MythTV</source>
+- <translation>Audio Device used for playback. &apos;default&apos; will use the device specified in MythTV</translation>
++ <translation>Audio Device used for playback. &apos;default&apos; will use the device specified in MythTV.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="79"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="74"/>
+ <source>MythTV can upconvert stereo tracks to 5.1 audio. Set this option to enable it by default. You can enable or disable the upconversion during playback at anytime.</source>
+- <translation>MythTV can upconvert stereo tracks to 5.1 audio. Set this option to enable it by default. You can enable or disable the upconversion during playback at anytime.</translation>
++ <translation>MythTV can upconvert stereo tracks to 5.1 audio. Set this option to enable it by default. You can enable or disable the upconversion during playback.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="83"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="78"/>
+ <source>CD-ROM device used for ripping/playback.</source>
+ <translation>CD-ROM device used for ripping/playback.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="84"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="79"/>
+ <source>Directory and filename format used to grab information if no ID3 information is found. Accepts GENRE, ARTIST, ALBUM, TITLE, ARTIST_TITLE and TRACK_TITLE.</source>
+ <translation>Directory and filename format used to grab information if no ID3 information is found. Accepts GENRE, ARTIST, ALBUM, TITLE, ARTIST_TITLE and TRACK_TITLE.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="88"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="83"/>
+ <source>If set, MythMusic will skip checking ID3 tags in files and just try to determine Genre, Artist, Album, and Track number and title from the filename.</source>
+ <translation>If set, MythMusic will skip checking ID3 tags in files and just try to determine Genre, Artist, Album, and Track number and title from the filename.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="92"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="87"/>
+ <source>If set, MythMusic will be allowed to update the metadata in the file (e.g. ID3) to match the database. This means allowing MythTV to write to the file and permissions must be set accordingly. Features such as ID3 playcounts and ratings depend on this being enabled.</source>
+ <translation>If set, MythMusic will be allowed to update the metadata in the file (e.g. ID3) to match the database. This means allowing MythTV to write to the file and permissions must be set accordingly. Features such as ID3 playcounts and ratings depend on this being enabled.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="99"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="94"/>
+ <source>This will clear all the MythMusic database tables allowing for a fresh start. NOTE: You may lose any manual or automatic changes made to a tracks metadata like rating or playcount unless you told MythMusic to write those to the tag.</source>
+ <translation>This will clear all the MythMusic database tables allowing for a fresh start. NOTE: You may lose any manual or automatic changes made to a tracks metadata like rating or playcount unless you told MythMusic to write those to the tag.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="103"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="98"/>
+ <source>Exit without saving settings</source>
+- <translation>Exit without saving settings</translation>
++ <translation>Exit Without Saving</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="104"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="99"/>
+ <source>Save settings and Exit</source>
+- <translation>Save settings and Exit</translation>
++ <translation>Save and Exit</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="115"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="110"/>
+ <source>Are you sure you want to reset the music database?</source>
+ <translation>Are you sure you want to reset the music database?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/generalsettings.cpp" line="161"/>
++ <location filename="../mythmusic/generalsettings.cpp" line="156"/>
+ <source>Music database has been cleared.
+ You must now scan, rip or import some tracks.</source>
+ <translation>Music database has been cleared.
+@@ -343,56 +343,56 @@
+ <context>
+ <name>ImportCoverArtDialog</name>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1035"/>
+- <location filename="../mythmusic/importmusic.cpp" line="1230"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1028"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1223"/>
+ <source>Front Cover</source>
+ <translation>Front Cover</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1037"/>
+- <location filename="../mythmusic/importmusic.cpp" line="1232"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1030"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1225"/>
+ <source>Back Cover</source>
+ <translation>Back Cover</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1039"/>
+- <location filename="../mythmusic/importmusic.cpp" line="1236"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1032"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1229"/>
+ <source>CD</source>
+ <translation>CD</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1041"/>
+- <location filename="../mythmusic/importmusic.cpp" line="1234"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1034"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1227"/>
+ <source>Inlay</source>
+ <translation>Inlay</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1043"/>
+- <location filename="../mythmusic/importmusic.cpp" line="1238"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1036"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1231"/>
+ <source>&lt;Unknown&gt;</source>
+ <translation>&lt;Unknown&gt;</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1081"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1074"/>
+ <source>Copy CoverArt Failed.
+ Copying to %1</source>
+ <extracomment>%1 is the filename</extracomment>
+- <translation>Copy CoverArt Failed.
++ <translation>Copying Cover Art Failed
+ Copying to %1</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1163"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1156"/>
+ <source>%1 of %2</source>
+ <comment>Current file copied</comment>
+ <translation>%1 of %2</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1205"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1198"/>
+ <source>File Already Exists</source>
+ <translation>File Already Exists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="1207"/>
++ <location filename="../mythmusic/importmusic.cpp" line="1200"/>
+ <source>New File</source>
+ <translation>New File</translation>
+ </message>
+@@ -419,89 +419,89 @@
+ <message>
+ <location filename="../mythmusic/importmusic.cpp" line="156"/>
+ <source>Not found</source>
+- <translation>Not found</translation>
++ <translation>Not Found</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="219"/>
++ <location filename="../mythmusic/importmusic.cpp" line="218"/>
+ <source>You might have unsaved changes.
+ Are you sure you want to exit this screen?</source>
+ <translation>You might have unsaved changes.
+ Are you sure you want to exit this screen?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="424"/>
++ <location filename="../mythmusic/importmusic.cpp" line="423"/>
+ <source>Copy Failed
+ Could not copy file to: %1</source>
+ <translation>Copy Failed
+ Could not copy file to: %1</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="448"/>
++ <location filename="../mythmusic/importmusic.cpp" line="447"/>
+ <source>This track is already in the database</source>
+- <translation>This track is already in the database</translation>
++ <translation>This track is already in the database.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="477"/>
++ <location filename="../mythmusic/importmusic.cpp" line="476"/>
+ <source>%1 new tracks were added to the database</source>
+- <translation>%1 new tracks were added to the database</translation>
++ <translation>%1 new tracks were added to the database.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="505"/>
++ <location filename="../mythmusic/importmusic.cpp" line="504"/>
+ <source>Copying music file to the &apos;Music&apos; storage group on %1</source>
+- <translation>Copying music file to the &apos;Music&apos; storage group on %1</translation>
++ <translation>Copying Music File to the &apos;Music&apos; Storage Group on %1...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="547"/>
++ <location filename="../mythmusic/importmusic.cpp" line="546"/>
+ <source>Searching for music files</source>
+- <translation>Searching for music files</translation>
++ <translation>Searching for Music Files...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="682"/>
++ <location filename="../mythmusic/importmusic.cpp" line="681"/>
+ <source>Select Where To Save Tracks</source>
+- <translation>Select Where To Save Tracks</translation>
++ <translation>Select Where to Save Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="683"/>
++ <location filename="../mythmusic/importmusic.cpp" line="682"/>
+ <source>Save Defaults</source>
+ <translation>Save Defaults</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="687"/>
++ <location filename="../mythmusic/importmusic.cpp" line="686"/>
+ <source>Change Compilation Flag</source>
+ <translation>Change Compilation Flag</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="688"/>
++ <location filename="../mythmusic/importmusic.cpp" line="687"/>
+ <source>Change Compilation Artist</source>
+ <translation>Change Compilation Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="690"/>
++ <location filename="../mythmusic/importmusic.cpp" line="689"/>
+ <source>Change Artist</source>
+ <translation>Change Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="691"/>
++ <location filename="../mythmusic/importmusic.cpp" line="690"/>
+ <source>Change Album</source>
+ <translation>Change Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="692"/>
++ <location filename="../mythmusic/importmusic.cpp" line="691"/>
+ <source>Change Genre</source>
+ <translation>Change Genre</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="693"/>
++ <location filename="../mythmusic/importmusic.cpp" line="692"/>
+ <source>Change Year</source>
+ <translation>Change Year</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="694"/>
++ <location filename="../mythmusic/importmusic.cpp" line="693"/>
+ <source>Change Rating</source>
+ <translation>Change Rating</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importmusic.cpp" line="723"/>
++ <location filename="../mythmusic/importmusic.cpp" line="722"/>
+ <source>Select where to save tracks</source>
+ <translation>Select where to save tracks</translation>
+ </message>
+@@ -509,162 +509,162 @@
+ <context>
+ <name>ImportSettings</name>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="54"/>
++ <location filename="../mythmusic/importsettings.cpp" line="49"/>
+ <source>Full</source>
+ <translation>Full</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="55"/>
++ <location filename="../mythmusic/importsettings.cpp" line="50"/>
+ <source>Faster</source>
+ <translation>Faster</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="70"/>
++ <location filename="../mythmusic/importsettings.cpp" line="65"/>
+ <source>Ogg Vorbis</source>
+ <translation>Ogg Vorbis</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="71"/>
++ <location filename="../mythmusic/importsettings.cpp" line="66"/>
+ <source>Lame (MP3)</source>
+ <translation>Lame (MP3)</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="74"/>
++ <location filename="../mythmusic/importsettings.cpp" line="69"/>
+ <source>Low</source>
+ <translation>Low</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="75"/>
++ <location filename="../mythmusic/importsettings.cpp" line="70"/>
+ <source>Medium</source>
+ <translation>Medium</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="76"/>
++ <location filename="../mythmusic/importsettings.cpp" line="71"/>
+ <source>High</source>
+ <translation>High</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="77"/>
++ <location filename="../mythmusic/importsettings.cpp" line="72"/>
+ <source>Perfect</source>
+ <translation>Perfect</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="87"/>
++ <location filename="../mythmusic/importsettings.cpp" line="82"/>
+ <source>Paranoia level of the CD ripper. Set to faster if you&apos;re not concerned about possible errors in the audio.</source>
+ <translation>Paranoia level of the CD ripper. Set to faster if you&apos;re not concerned about possible errors in the audio.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="90"/>
++ <location filename="../mythmusic/importsettings.cpp" line="85"/>
+ <source>Defines the location/name for new songs. Valid tokens are:
+ GENRE, ARTIST, ALBUM, TRACK, TITLE, YEAR</source>
+ <translation>Defines the location/name for new songs. Valid tokens are:
+ GENRE, ARTIST, ALBUM, TRACK, TITLE, YEAR</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="93"/>
++ <location filename="../mythmusic/importsettings.cpp" line="88"/>
+ <source>If set, whitespace characters in filenames will be replaced with underscore characters.</source>
+ <translation>If set, whitespace characters in filenames will be replaced with underscore characters.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="95"/>
++ <location filename="../mythmusic/importsettings.cpp" line="90"/>
+ <source>If present this script will be executed after a CD Rip is completed.</source>
+ <translation>If present this script will be executed after a CD Rip is completed.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="97"/>
++ <location filename="../mythmusic/importsettings.cpp" line="92"/>
+ <source>If set, the CD tray will automatically open after the CD has been ripped.</source>
+ <translation>If set, the CD tray will automatically open after the CD has been ripped.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="99"/>
++ <location filename="../mythmusic/importsettings.cpp" line="94"/>
+ <source>Audio encoder to use for CD ripping. Note that the quality level &apos;Perfect&apos; will use the FLAC encoder.</source>
+ <translation>Audio encoder to use for CD ripping. Note that the quality level &apos;Perfect&apos; will use the FLAC encoder.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="102"/>
++ <location filename="../mythmusic/importsettings.cpp" line="97"/>
+ <source>Default quality for new CD rips.</source>
+ <translation>Default quality for new CD rips.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="103"/>
++ <location filename="../mythmusic/importsettings.cpp" line="98"/>
+ <source>If set, the MP3 encoder will use variable bitrates (VBR) except for the low quality setting. The Ogg encoder will always use variable bitrates.</source>
+ <translation>If set, the MP3 encoder will use variable bitrates (VBR) except for the low quality setting. The Ogg encoder will always use variable bitrates.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="106"/>
++ <location filename="../mythmusic/importsettings.cpp" line="101"/>
+ <source>Exit without saving settings</source>
+- <translation>Exit without saving settings</translation>
++ <translation>Exit Without Saving</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/importsettings.cpp" line="107"/>
++ <location filename="../mythmusic/importsettings.cpp" line="102"/>
+ <source>Save settings and Exit</source>
+- <translation>Save settings and Exit</translation>
++ <translation>Save and Exit</translation>
+ </message>
+ </context>
+ <context>
+ <name>LyricsView</name>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="156"/>
+- <location filename="../mythmusic/lyricsview.cpp" line="246"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="155"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="245"/>
+ <source>Save Lyrics</source>
+ <translation>Save Lyrics</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="160"/>
+- <location filename="../mythmusic/lyricsview.cpp" line="241"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="159"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="240"/>
+ <source>Edit Lyrics</source>
+ <translation>Edit Lyrics</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="164"/>
+- <location filename="../mythmusic/lyricsview.cpp" line="243"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="163"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="242"/>
+ <source>Add Lyrics</source>
+ <translation>Add Lyrics</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="168"/>
+- <location filename="../mythmusic/lyricsview.cpp" line="250"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="167"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="249"/>
+ <source>Auto Scroll Lyrics</source>
+ <translation>Auto Scroll Lyrics</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="230"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="229"/>
+ <source>Actions</source>
+ <translation>Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="236"/>
+- <location filename="../mythmusic/lyricsview.cpp" line="267"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="235"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="266"/>
+ <source>Find Lyrics</source>
+ <translation>Find Lyrics</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="253"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="252"/>
+ <source>Other Options</source>
+ <translation>Other Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="270"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="269"/>
+ <source>Search All Grabbers</source>
+ <translation>Search All Grabbers</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="276"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="275"/>
+ <source>Search %1</source>
+ <translation>Search %1</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="459"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="455"/>
+ <source>Syncronized</source>
+ <translation>Syncronized</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="459"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="455"/>
+ <source>Unsyncronized</source>
+ <translation>Unsyncronized</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/lyricsview.cpp" line="460"/>
++ <location filename="../mythmusic/lyricsview.cpp" line="456"/>
+ <source>** Lyrics from %1 (%2) **</source>
+ <translation>** Lyrics from %1 (%2) **</translation>
+ </message>
+@@ -672,225 +672,231 @@
+ <context>
+ <name>MusicCommon</name>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1215"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1217"/>
+ <source>Playing stream.</source>
+- <translation>Playing stream.</translation>
++ <translation>Playing Stream.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1244"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1246"/>
+ <source>Buffering stream.</source>
+- <translation>Buffering stream.</translation>
++ <translation>Buffering Stream.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1248"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1250"/>
+ <source>Stream paused.</source>
+- <translation>Stream paused.</translation>
++ <translation>Stream Paused.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1316"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1319"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1323"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1331"/>
+ <source>kbps</source>
+ <translation>kbps</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1316"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="1322"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1319"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1323"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1331"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1335"/>
+ <source>kHz</source>
+ <translation>kHz</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1316"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="1322"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1319"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1323"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1331"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1335"/>
+ <source>ch</source>
+ <translation>ch</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1340"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1354"/>
+ <source>Stream stopped.</source>
+- <translation>Stream stopped.</translation>
++ <translation>Stream Stopped.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1377"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2229"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1391"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2243"/>
+ <source>Playlist Editor</source>
+ <translation>Playlist Editor</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1386"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2225"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1400"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2239"/>
+ <source>Switch To Gallery View</source>
+- <translation>Switch To Gallery View</translation>
++ <translation>Switch to Gallery View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1388"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2227"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1402"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2241"/>
+ <source>Switch To Tree View</source>
+- <translation>Switch To Tree View</translation>
++ <translation>Switch to Tree View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1390"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2246"/>
+- <location filename="../mythmusic/streamview.cpp" line="101"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1404"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2260"/>
++ <location filename="../mythmusic/streamview.cpp" line="93"/>
+ <source>Lyrics</source>
+ <translation>Lyrics</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1422"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2297"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1436"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2311"/>
+ <source>Save To New Playlist</source>
+- <translation>Save To New Playlist</translation>
++ <translation>Save to New Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1424"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1438"/>
+ <source>Enter new playlist name</source>
+- <translation>Enter new playlist name</translation>
++ <translation>Enter new playlist name:</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1438"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2298"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1452"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2312"/>
+ <source>Save To Existing Playlist</source>
+- <translation>Save To Existing Playlist</translation>
++ <translation>Save to Existing Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1440"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1454"/>
+ <source>Select the playlist to save to</source>
+ <translation>Select the playlist to save to</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1505"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2339"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1519"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2353"/>
+ <source>Change Volume</source>
+ <translation>Change Volume</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1507"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2340"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1521"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2354"/>
+ <source>Mute</source>
+ <translation>Mute</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1509"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2341"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1523"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2355"/>
+ <source>Previous Track</source>
+ <translation>Previous Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1511"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2342"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1525"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2356"/>
+ <source>Next Track</source>
+ <translation>Next Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1513"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2346"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1527"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2360"/>
+ <source>Jump Back</source>
+ <translation>Jump Back</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1515"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2347"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1529"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2361"/>
+ <source>Jump Forward</source>
+ <translation>Jump Forward</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1517"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2350"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1531"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2364"/>
+ <source>Play</source>
+ <translation>Play</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1519"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2351"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1533"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2365"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1521"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2354"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1535"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2368"/>
+ <source>Pause</source>
+ <translation>Pause</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1526"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2397"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1540"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2411"/>
+ <source>All Tracks</source>
+ <translation>All Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1528"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2400"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1542"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2414"/>
+ <source>From CD</source>
+ <translation>From CD</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2248"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2547"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2262"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2561"/>
+ <source>More Options</source>
+ <translation>More Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2255"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2269"/>
+ <source>Actions</source>
+ <translation>Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2139"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2153"/>
+ <source>Default Playlist</source>
+ <translation>Default Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2141"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2155"/>
+ <source>Stream Playlist</source>
+ <translation>Stream Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2265"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2283"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2279"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2297"/>
+ <source>Playlist Options</source>
+ <translation>Playlist Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2266"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2376"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2280"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2390"/>
+ <source>Set Shuffle Mode</source>
+ <translation>Set Shuffle Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2267"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2361"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2281"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2375"/>
+ <source>Set Repeat Mode</source>
+ <translation>Set Repeat Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2270"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2284"/>
+ <source>Player Options</source>
+ <translation>Player Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2273"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2393"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2287"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2407"/>
+ <source>Quick Playlists</source>
+ <translation>Quick Playlists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2276"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2290"/>
+ <source>Change Visualizer</source>
+ <translation>Change Visualizer</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1384"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2240"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1398"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2254"/>
+ <source>Search for Music</source>
+ <translation>Search for Music</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1375"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2243"/>
+- <location filename="../mythmusic/streamview.cpp" line="100"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1389"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2257"/>
++ <location filename="../mythmusic/streamview.cpp" line="92"/>
+ <source>Fullscreen Visualizer</source>
+ <translation>Fullscreen Visualizer</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2311"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2325"/>
+ <source>Exiting Music Player.
+
+ Do you want to continue playing in the background?</source>
+@@ -899,160 +905,160 @@
+ Do you want to continue playing in the background?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2335"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2349"/>
+ <source>Player Actions</source>
+ <translation>Player Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2365"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2380"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2379"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2394"/>
+ <source>None</source>
+ <translation>None</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2366"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2380"/>
+ <source>Track</source>
+ <translation>Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2367"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2381"/>
+ <source>All</source>
+ <translation>All</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2381"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2395"/>
+ <source>Random</source>
+ <translation>Random</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2382"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2396"/>
+ <source>Smart</source>
+ <translation>Smart</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2383"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2397"/>
+ <source>Album</source>
+ <translation>Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2384"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2398"/>
+ <source>Artist</source>
+ <translation>Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2416"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2430"/>
+ <source>Choose Visualizer</source>
+ <translation>Choose Visualizer</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2430"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2444"/>
+ <source>Add to Playlist Options</source>
+ <translation>Add to Playlist Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1395"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2261"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1409"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2275"/>
+ <source>Search List...</source>
+ <translation>Search List...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1400"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2289"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1414"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2303"/>
+ <source>Sync List With Current Track</source>
+ <translation>Sync List With Current Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1404"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2290"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1418"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2304"/>
+ <source>Remove Selected Track</source>
+ <translation>Remove Selected Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1414"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2293"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1428"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2307"/>
+ <source>Remove All Tracks</source>
+ <translation>Remove All Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1453"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2303"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1467"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2317"/>
+ <source>Switch To Move Mode</source>
+- <translation>Switch To Move Mode</translation>
++ <translation>Switch to Move Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1461"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2301"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1475"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2315"/>
+ <source>Switch To Select Mode</source>
+- <translation>Switch To Select Mode</translation>
++ <translation>Switch to Select Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1530"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2404"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1544"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2418"/>
+ <source>Tracks By Current Artist</source>
+- <translation>Tracks By Current Artist</translation>
++ <translation>Tracks by Current Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1532"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2406"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1546"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2420"/>
+ <source>Tracks From Current Genre</source>
+- <translation>Tracks From Current Genre</translation>
++ <translation>Tracks from Current Genre</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1534"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2405"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1548"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2419"/>
+ <source>Tracks From Current Album</source>
+- <translation>Tracks From Current Album</translation>
++ <translation>Tracks from Current Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1536"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2407"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1550"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2421"/>
+ <source>Tracks From Current Year</source>
+- <translation>Tracks From Current Year</translation>
++ <translation>Tracks from Current Year</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1538"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2408"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1552"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2422"/>
+ <source>Tracks With Same Title</source>
+ <translation>Tracks With Same Title</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1543"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2434"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1557"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2448"/>
+ <source>Replace Tracks</source>
+ <translation>Replace Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1548"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2435"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1562"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2449"/>
+ <source>Add Tracks</source>
+ <translation>Add Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2130"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2144"/>
+ <source>%1 of %2</source>
+ <translation>%1 of %2</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2220"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2234"/>
+ <source>View Actions</source>
+ <translation>View Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="2328"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2342"/>
+ <source>Cancel</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1492"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2326"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1506"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2340"/>
+ <source>No - Exit, Stop Playing</source>
+- <translation>No - Exit, Stop Playing</translation>
++ <translation>Stop Playing and Exit</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/musiccommon.cpp" line="1498"/>
+- <location filename="../mythmusic/musiccommon.cpp" line="2327"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="1512"/>
++ <location filename="../mythmusic/musiccommon.cpp" line="2341"/>
+ <source>Yes - Exit, Continue Playing</source>
+- <translation>Yes - Exit, Continue Playing</translation>
++ <translation>Continue Playing and Exit</translation>
+ </message>
+ </context>
+ <context>
+@@ -1060,7 +1066,7 @@
+ <message>
+ <location filename="../mythmusic/musicdata.cpp" line="71"/>
+ <source>Rebuilding music tree</source>
+- <translation>Rebuilding music tree</translation>
++ <translation>Rebuilding Music Tree...</translation>
+ </message>
+ </context>
+ <context>
+@@ -1081,7 +1087,7 @@
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="349"/>
+ <source>Got too many track unavailable errors. Maybe the host with the music on is off-line?</source>
+- <translation>Got too many track unavailable errors. Maybe the host with the music on is off-line?</translation>
++ <translation>Too many track unavailable errors. Maybe the host with the music on is off-line?</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="357"/>
+@@ -1091,7 +1097,7 @@
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="778"/>
+ <source>A music file scan has started on %1</source>
+- <translation>A music file scan has started on %1</translation>
++ <translation>A music file scan has started on %1.</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="779"/>
+@@ -1104,24 +1110,24 @@
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="780"/>
+ <source>This may take a while I&apos;ll give a shout when finished</source>
+- <translation>This may take a while I&apos;ll give a shout when finished</translation>
++ <translation>This may take a while I&apos;ll give a shout when finished.</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="798"/>
+ <source>A music file scan has finished on %1</source>
+- <translation>A music file scan has finished on %1</translation>
++ <translation>A music file scan has finished on %1.</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="816"/>
+ <source>Can&apos;t run the music file scanner because it is already running on %1</source>
+- <translation>Can&apos;t run the music file scanner because it is already running on %1</translation>
++ <translation>Can&apos;t run the music file scanner because it is already running on %1.</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="820"/>
+ <source>The music file scanner has been running for more than 60 minutes on %1.
+ Resetting and trying again</source>
+ <translation>The music file scanner has been running for more than 60 minutes on %1.
+-Resetting and trying again</translation>
++Resetting and trying again.</translation>
+ </message>
+ <message>
+ <location filename="../mythmusic/musicplayer.cpp" line="857"/>
+@@ -1148,310 +1154,300 @@
+ <context>
+ <name>MythControls</name>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="799"/>
++ <location filename="../mythmusic/main.cpp" line="796"/>
+ <source>Play music</source>
+- <translation>Play music</translation>
++ <translation>Play Music</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="801"/>
++ <location filename="../mythmusic/main.cpp" line="798"/>
+ <source>Select music playlists</source>
+- <translation>Select music playlists</translation>
++ <translation>Select Music Playlists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="803"/>
++ <location filename="../mythmusic/main.cpp" line="800"/>
+ <source>Play radio stream</source>
+- <translation>Play radio stream</translation>
++ <translation>Play Radio Stream</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="805"/>
++ <location filename="../mythmusic/main.cpp" line="802"/>
+ <source>Rip CD</source>
+ <translation>Rip CD</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="807"/>
++ <location filename="../mythmusic/main.cpp" line="804"/>
+ <source>Scan music</source>
+- <translation>Scan music</translation>
++ <translation>Scan Music</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="809"/>
++ <location filename="../mythmusic/main.cpp" line="806"/>
+ <source>Show Music Miniplayer</source>
+ <translation>Show Music Miniplayer</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="812"/>
++ <location filename="../mythmusic/main.cpp" line="809"/>
+ <source>Move to the next track</source>
+- <translation>Move to the next track</translation>
++ <translation>Move to the Next Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="814"/>
++ <location filename="../mythmusic/main.cpp" line="811"/>
+ <source>Move to the previous track</source>
+- <translation>Move to the previous track</translation>
++ <translation>Move to the Previous Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="816"/>
++ <location filename="../mythmusic/main.cpp" line="813"/>
+ <source>Fast forward</source>
+- <translation>Fast forward</translation>
++ <translation>Fast Forward</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="818"/>
++ <location filename="../mythmusic/main.cpp" line="815"/>
+ <source>Rewind</source>
+ <translation>Rewind</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="820"/>
++ <location filename="../mythmusic/main.cpp" line="817"/>
+ <source>Pause/Start playback</source>
+- <translation>Pause/Start playback</translation>
++ <translation>Pause/Start Playback</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="822"/>
++ <location filename="../mythmusic/main.cpp" line="819"/>
+ <source>Start playback</source>
+- <translation>Start playback</translation>
++ <translation>Start Playback</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="824"/>
++ <location filename="../mythmusic/main.cpp" line="821"/>
+ <source>Stop playback</source>
+- <translation>Stop playback</translation>
++ <translation>Stop Playback</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="826"/>
++ <location filename="../mythmusic/main.cpp" line="823"/>
+ <source>Volume down</source>
+- <translation>Volume down</translation>
++ <translation>Volume Down</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="828"/>
++ <location filename="../mythmusic/main.cpp" line="825"/>
+ <source>Volume up</source>
+- <translation>Volume up</translation>
++ <translation>Volume Up</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="830"/>
++ <location filename="../mythmusic/main.cpp" line="827"/>
+ <source>Mute</source>
+ <translation>Mute</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="832"/>
++ <location filename="../mythmusic/main.cpp" line="829"/>
+ <source>Toggle audio upmixer</source>
+- <translation>Toggle audio upmixer</translation>
++ <translation>Toggle Audio Upmixer</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="834"/>
++ <location filename="../mythmusic/main.cpp" line="831"/>
+ <source>Cycle visualizer mode</source>
+- <translation>Cycle visualizer mode</translation>
++ <translation>Cycle Visualizer Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="836"/>
++ <location filename="../mythmusic/main.cpp" line="833"/>
+ <source>Blank screen</source>
+- <translation>Blank screen</translation>
++ <translation>Blank Screen</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="838"/>
++ <location filename="../mythmusic/main.cpp" line="835"/>
+ <source>Increase rating</source>
+- <translation>Increase rating</translation>
++ <translation>Increase Rating</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="840"/>
++ <location filename="../mythmusic/main.cpp" line="837"/>
+ <source>Decrease rating</source>
+- <translation>Decrease rating</translation>
++ <translation>Decrease Rating</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="842"/>
++ <location filename="../mythmusic/main.cpp" line="839"/>
+ <source>Refresh music tree</source>
+- <translation>Refresh music tree</translation>
++ <translation>Refresh Music Tree</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="844"/>
++ <location filename="../mythmusic/main.cpp" line="841"/>
+ <source>Increase Play Speed</source>
+ <translation>Increase Play Speed</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="846"/>
++ <location filename="../mythmusic/main.cpp" line="843"/>
+ <source>Decrease Play Speed</source>
+ <translation>Decrease Play Speed</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="848"/>
++ <location filename="../mythmusic/main.cpp" line="845"/>
+ <source>Toggle track selection</source>
+- <translation>Toggle track selection</translation>
++ <translation>Toggle Track Selection</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="850"/>
++ <location filename="../mythmusic/main.cpp" line="847"/>
+ <source>Toggle shuffle mode</source>
+- <translation>Toggle shuffle mode</translation>
++ <translation>Toggle Shuffle Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="852"/>
++ <location filename="../mythmusic/main.cpp" line="849"/>
+ <source>Toggle repeat mode</source>
+- <translation>Toggle repeat mode</translation>
++ <translation>Toggle Repeat Mode</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="854"/>
++ <location filename="../mythmusic/main.cpp" line="851"/>
+ <source>Switch to previous radio stream</source>
+- <translation>Switch to previous radio stream</translation>
++ <translation>Switch to Previous Radio Stream</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="858"/>
++ <location filename="../mythmusic/main.cpp" line="855"/>
+ <source>Switch to the current playlist view</source>
+- <translation>Switch to the current playlist view</translation>
++ <translation>Switch to the Current Playlist View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="860"/>
++ <location filename="../mythmusic/main.cpp" line="857"/>
+ <source>Switch to the playlist editor tree view</source>
+- <translation>Switch to the playlist editor tree view</translation>
++ <translation>Switch to the Playlist Editor Tree View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="862"/>
++ <location filename="../mythmusic/main.cpp" line="859"/>
+ <source>Switch to the playlist editor gallery view</source>
+- <translation>Switch to the playlist editor gallery view</translation>
++ <translation>Switch to the Playlist Editor Gallery View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="864"/>
++ <location filename="../mythmusic/main.cpp" line="861"/>
+ <source>Switch to the search view</source>
+- <translation>Switch to the search view</translation>
++ <translation>Switch to the Search View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="866"/>
++ <location filename="../mythmusic/main.cpp" line="863"/>
+ <source>Switch to the fullscreen visualiser view</source>
+- <translation>Switch to the fullscreen visualiser view</translation>
++ <translation>Switch to the Fullscreen Visualizer View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="868"/>
++ <location filename="../mythmusic/main.cpp" line="865"/>
+ <source>Switch to the radio stream view</source>
+- <translation>Switch to the radio stream view</translation>
++ <translation>Switch to the Radio Stream View</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="872"/>
++ <location filename="../mythmusic/main.cpp" line="868"/>
+ <source>MythMusic Media Handler 1/2</source>
+ <translation>MythMusic Media Handler 1/2</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/main.cpp" line="873"/>
+- <source>MythMusic audio CD</source>
+- <translation>MythMusic audio CD</translation>
+- </message>
+- <message>
+- <location filename="../mythmusic/main.cpp" line="879"/>
++ <location filename="../mythmusic/main.cpp" line="874"/>
+ <source>MythMusic Media Handler 2/2</source>
+ <translation>MythMusic Media Handler 2/2</translation>
+ </message>
+- <message>
+- <location filename="../mythmusic/main.cpp" line="880"/>
+- <source>MythMusic audio files</source>
+- <translation>MythMusic audio files</translation>
+- </message>
+ </context>
+ <context>
+ <name>PlayerSettings</name>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="53"/>
+- <location filename="../mythmusic/playersettings.cpp" line="59"/>
+- <location filename="../mythmusic/playersettings.cpp" line="65"/>
++ <location filename="../mythmusic/playersettings.cpp" line="48"/>
++ <location filename="../mythmusic/playersettings.cpp" line="54"/>
++ <location filename="../mythmusic/playersettings.cpp" line="60"/>
+ <source>Off</source>
+ <translation>Off</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="54"/>
+- <location filename="../mythmusic/playersettings.cpp" line="60"/>
++ <location filename="../mythmusic/playersettings.cpp" line="49"/>
++ <location filename="../mythmusic/playersettings.cpp" line="55"/>
+ <source>First</source>
+ <translation>First</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="55"/>
+- <location filename="../mythmusic/playersettings.cpp" line="61"/>
++ <location filename="../mythmusic/playersettings.cpp" line="50"/>
++ <location filename="../mythmusic/playersettings.cpp" line="56"/>
+ <source>Track</source>
+ <translation>Track</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="56"/>
+- <location filename="../mythmusic/playersettings.cpp" line="62"/>
++ <location filename="../mythmusic/playersettings.cpp" line="51"/>
++ <location filename="../mythmusic/playersettings.cpp" line="57"/>
+ <source>Exact</source>
+ <translation>Exact</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="66"/>
++ <location filename="../mythmusic/playersettings.cpp" line="61"/>
+ <source>On</source>
+ <translation>On</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="69"/>
++ <location filename="../mythmusic/playersettings.cpp" line="64"/>
+ <source>Prompt</source>
+ <translation>Prompt</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="70"/>
+- <location filename="../mythmusic/playersettings.cpp" line="74"/>
++ <location filename="../mythmusic/playersettings.cpp" line="65"/>
++ <location filename="../mythmusic/playersettings.cpp" line="69"/>
+ <source>Stop playing</source>
+- <translation>Stop playing</translation>
++ <translation>Stop Playing</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="71"/>
+- <location filename="../mythmusic/playersettings.cpp" line="75"/>
++ <location filename="../mythmusic/playersettings.cpp" line="66"/>
++ <location filename="../mythmusic/playersettings.cpp" line="70"/>
+ <source>Continue Playing</source>
+ <translation>Continue Playing</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="85"/>
++ <location filename="../mythmusic/playersettings.cpp" line="80"/>
+ <source>Playback screen - Resume playback at either the beginning of the active play queue, the beginning of the last track played, or an exact point within the last track played or not at all.</source>
+ <translation>Playback screen - Resume playback at either the beginning of the active play queue, the beginning of the last track played, or an exact point within the last track played or not at all.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="88"/>
++ <location filename="../mythmusic/playersettings.cpp" line="83"/>
+ <source>Playlist Editor screen - Resume playback at either the beginning of the active play queue, the beginning of the last track played, or an exact point within the last track played or not at all.</source>
+ <translation>Playlist Editor screen - Resume playback at either the beginning of the active play queue, the beginning of the last track played, or an exact point within the last track played or not at all.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="91"/>
++ <location filename="../mythmusic/playersettings.cpp" line="86"/>
+ <source>Radio screen - Resume playback at the previous station or not at all</source>
+- <translation>Radio screen - Resume playback at the previous station or not at all</translation>
++ <translation>Radio screen - Resume playback at the previous station or not at all.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="92"/>
++ <location filename="../mythmusic/playersettings.cpp" line="87"/>
+ <source>Specify what action to take when exiting MythMusic plugin.</source>
+- <translation>Specify what action to take when exiting MythMusic plugin.</translation>
++ <translation>Specify what action to take when exiting MythMusic.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="93"/>
++ <location filename="../mythmusic/playersettings.cpp" line="88"/>
+ <source>Specify what action to take when exiting MythMusic plugin due to a jumppoint being executed.</source>
+- <translation>Specify what action to take when exiting MythMusic plugin due to a jumppoint being executed.</translation>
++ <translation>Specify what action to take when exiting MythMusic due to a jumppoint being executed.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="94"/>
++ <location filename="../mythmusic/playersettings.cpp" line="89"/>
+ <source>Automatically lookup an audio CD if it is present and show its information in the Music Selection Tree.</source>
+ <translation>Automatically lookup an audio CD if it is present and show its information in the Music Selection Tree.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="97"/>
++ <location filename="../mythmusic/playersettings.cpp" line="92"/>
+ <source>Automatically put a new CD on the playlist and start playing the CD.</source>
+ <translation>Automatically put a new CD on the playlist and start playing the CD.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="99"/>
++ <location filename="../mythmusic/playersettings.cpp" line="94"/>
+ <source>Exit without saving settings</source>
+- <translation>Exit without saving settings</translation>
++ <translation>Exit Without Saving</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playersettings.cpp" line="100"/>
++ <location filename="../mythmusic/playersettings.cpp" line="95"/>
+ <source>Save settings and Exit</source>
+- <translation>Save settings and Exit</translation>
++ <translation>Save and Exit</translation>
+ </message>
+ </context>
+ <context>
+ <name>Playlist</name>
+ <message>
+- <location filename="../mythmusic/playlist.cpp" line="150"/>
++ <location filename="../mythmusic/playlist.cpp" line="149"/>
+ <source>oops</source>
+ <translation>oops</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlist.cpp" line="606"/>
++ <location filename="../mythmusic/playlist.cpp" line="623"/>
+ <source>Default Playlist</source>
+ <translation>Default Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlist.cpp" line="1336"/>
++ <location filename="../mythmusic/playlist.cpp" line="1353"/>
+ <source>Creating CD File System</source>
+ <translation>Creating CD File System</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlist.cpp" line="1385"/>
++ <location filename="../mythmusic/playlist.cpp" line="1402"/>
+ <source>Burning CD</source>
+ <translation>Burning CD</translation>
+ </message>
+@@ -1467,154 +1463,154 @@
+ <context>
+ <name>PlaylistEditorView</name>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="266"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="745"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="755"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="260"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="732"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="742"/>
+ <source>New Smart Playlist</source>
+ <translation>New Smart Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="288"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="756"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="282"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="743"/>
+ <source>Remove Smart Playlist</source>
+ <translation>Remove Smart Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="293"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="478"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="287"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="468"/>
+ <source>Are you sure you want to delete this Smart Playlist?
+ Category: %1 - Name: %2</source>
+ <translation>Are you sure you want to delete this Smart Playlist?
+ Category: %1 - Name: %2</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="297"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="754"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="291"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="741"/>
+ <source>Edit Smart Playlist</source>
+ <translation>Edit Smart Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="318"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="352"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="719"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="751"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="312"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="346"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="706"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="738"/>
+ <source>Replace Tracks</source>
+ <translation>Replace Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="324"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="358"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="720"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="752"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="318"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="352"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="707"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="739"/>
+ <source>Add Tracks</source>
+ <translation>Add Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="344"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="721"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="338"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="708"/>
+ <source>Remove Playlist</source>
+ <translation>Remove Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="348"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="487"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="342"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="477"/>
+ <source>Are you sure you want to delete this Playlist?
+ Name: %1</source>
+ <translation>Are you sure you want to delete this Playlist?
+ Name: %1</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="687"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="674"/>
+ <source>More Options</source>
+ <translation>More Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="718"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="705"/>
+ <source>Playlist Actions</source>
+ <translation>Playlist Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="741"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="749"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="728"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="736"/>
+ <source>Smart Playlist Actions</source>
+ <translation>Smart Playlist Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="768"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1347"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="755"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1335"/>
+ <source>All Tracks</source>
+ <translation>All Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="772"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1353"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="759"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1341"/>
+ <source>Albums</source>
+ <translation>Albums</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="776"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1360"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="763"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1348"/>
+ <source>Artists</source>
+ <translation>Artists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="780"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1408"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="767"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1396"/>
+ <source>Genres</source>
+ <translation>Genres</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="784"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1415"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="771"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1403"/>
+ <source>Tags</source>
+ <translation>Tags</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="788"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1422"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="775"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1410"/>
+ <source>Ratings</source>
+ <translation>Ratings</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="792"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1429"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="779"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1417"/>
+ <source>Years</source>
+ <translation>Years</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="796"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="783"/>
+ <source>Compilations</source>
+ <translation>Compilations</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="816"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="803"/>
+ <source>CD - %1</source>
+ <translation>CD - %1</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="821"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1274"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="808"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1262"/>
+ <source>Directory</source>
+ <translation>Directory</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="825"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="812"/>
+ <source>Playlists</source>
+ <translation>Playlists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="828"/>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1732"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="815"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1720"/>
+ <source>Smart Playlists</source>
+ <translation>Smart Playlists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="964"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="951"/>
+ <source>%1 of %2</source>
+ <translation>%1 of %2</translation>
+ </message>
+ <message numerus="yes">
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1203"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1191"/>
+ <source>%n Star(s)</source>
+ <translatorcomment>I&apos;m not sure this about that uppercase S should really be there...</translatorcomment>
+ <translation>
+@@ -1623,17 +1619,17 @@
+ </translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1400"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1388"/>
+ <source>Compilation Artists</source>
+ <translation>Compilation Artists</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1591"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1579"/>
+ <source>** No matching tracks **</source>
+- <translation>** No matching tracks **</translation>
++ <translation>** No Matching Tracks **</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/playlisteditorview.cpp" line="1649"/>
++ <location filename="../mythmusic/playlisteditorview.cpp" line="1637"/>
+ <source>** Empty Playlist!! **</source>
+ <translation>** Empty Playlist!! **</translation>
+ </message>
+@@ -1641,50 +1637,50 @@
+ <context>
+ <name>RatingSettings</name>
+ <message>
+- <location filename="../mythmusic/ratingsettings.cpp" line="52"/>
++ <location filename="../mythmusic/ratingsettings.cpp" line="47"/>
+ <source>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to your rating of a given track when ordering a group of songs.</source>
+ <translation>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to your rating of a given track when ordering a group of songs.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/ratingsettings.cpp" line="56"/>
++ <location filename="../mythmusic/ratingsettings.cpp" line="51"/>
+ <source>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to how many times a given track has been played when ordering a group of songs.</source>
+ <translation>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to how many times a given track has been played when ordering a group of songs.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/ratingsettings.cpp" line="60"/>
++ <location filename="../mythmusic/ratingsettings.cpp" line="55"/>
+ <source>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to how long it has been since a given track was played when ordering a group of songs.</source>
+ <translation>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to how long it has been since a given track was played when ordering a group of songs.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/ratingsettings.cpp" line="64"/>
++ <location filename="../mythmusic/ratingsettings.cpp" line="59"/>
+ <source>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to good old (pseudo-)randomness when ordering a group of songs.</source>
+ <translation>Used in &quot;Smart&quot; Shuffle mode. This weighting affects how much strength is given to good old (pseudo-)randomness when ordering a group of songs.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/ratingsettings.cpp" line="68"/>
++ <location filename="../mythmusic/ratingsettings.cpp" line="63"/>
+ <source>Exit without saving settings</source>
+- <translation>Exit without saving settings</translation>
++ <translation>Exit Without Saving</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/ratingsettings.cpp" line="69"/>
++ <location filename="../mythmusic/ratingsettings.cpp" line="64"/>
+ <source>Save settings and Exit</source>
+- <translation>Save settings and Exit</translation>
++ <translation>Save and Exit</translation>
+ </message>
+ </context>
+ <context>
+ <name>RipStatus</name>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1603"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1583"/>
+ <source>Cancel ripping the CD?</source>
+ <translation>Cancel ripping the CD?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1671"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1652"/>
+ <source>Copying Track ...</source>
+- <translation>Copying Track ...</translation>
++ <translation>Copying Track...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1700"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1681"/>
+ <source>The encoder failed to create the file.
+ Do you have write permissions for the music directory?</source>
+ <translation>The encoder failed to create the file.
+@@ -1694,194 +1690,194 @@
+ <context>
+ <name>Ripper</name>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="668"/>
++ <location filename="../mythmusic/cdrip.cpp" line="662"/>
+ <source>Low</source>
+ <translation>Low</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="669"/>
++ <location filename="../mythmusic/cdrip.cpp" line="663"/>
+ <source>Medium</source>
+ <translation>Medium</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="670"/>
++ <location filename="../mythmusic/cdrip.cpp" line="664"/>
+ <source>High</source>
+ <translation>High</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="671"/>
++ <location filename="../mythmusic/cdrip.cpp" line="665"/>
+ <source>Perfect</source>
+ <translation>Perfect</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="726"/>
++ <location filename="../mythmusic/cdrip.cpp" line="719"/>
+ <source>Select Where To Save Tracks</source>
+ <translation>Select Where To Save Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="727"/>
++ <location filename="../mythmusic/cdrip.cpp" line="720"/>
+ <source>Edit Track Metadata</source>
+ <translation>Edit Track Metadata</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="760"/>
++ <location filename="../mythmusic/cdrip.cpp" line="753"/>
+ <source>Select where to save tracks</source>
+- <translation>Select where to save tracks</translation>
++ <translation>Select Where To Save Tracks</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="790"/>
++ <location filename="../mythmusic/cdrip.cpp" line="783"/>
+ <source>Scanning CD. Please Wait ...</source>
+- <translation>Scanning CD. Please Wait ...</translation>
++ <translation>Scanning CD...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1162"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1144"/>
+ <source>There are no tracks to rip?</source>
+ <translation>There are no tracks to rip?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1190"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1172"/>
+ <source>Rip completed successfully.</source>
+ <translation>Rip completed successfully.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1205"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1187"/>
+ <source>Ejecting CD. Please Wait ...</source>
+- <translation>Ejecting CD. Please Wait ...</translation>
++ <translation>Ejecting CD...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1308"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1290"/>
+ <source>Select an Artist</source>
+ <translation>Select an Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1332"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1314"/>
+ <source>Select an Album</source>
+ <translation>Select an Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1356"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1338"/>
+ <source>Select a Genre</source>
+ <translation>Select a Genre</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1459"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1441"/>
+ <source>This track has been disabled because it is already present in the database.
+ Do you want to permanently delete the existing file(s)?</source>
+ <translation>This track has been disabled because it is already present in the database.
+ Do you want to permanently delete the existing file(s)?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1475"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1457"/>
+ <source>No, Cancel</source>
+- <translation>No, Cancel</translation>
++ <translation>Do Not Delete</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1476"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1458"/>
+ <source>Yes, Delete</source>
+- <translation>Yes, Delete</translation>
++ <translation>Delete</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/cdrip.cpp" line="1477"/>
++ <location filename="../mythmusic/cdrip.cpp" line="1459"/>
+ <source>Yes, Delete All</source>
+- <translation>Yes, Delete All</translation>
++ <translation>Delete All</translation>
+ </message>
+ </context>
+ <context>
+ <name>SearchStream</name>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="915"/>
+- <location filename="../mythmusic/streamview.cpp" line="932"/>
+- <location filename="../mythmusic/streamview.cpp" line="1043"/>
++ <location filename="../mythmusic/streamview.cpp" line="903"/>
++ <location filename="../mythmusic/streamview.cpp" line="920"/>
++ <location filename="../mythmusic/streamview.cpp" line="1031"/>
+ <source>&lt;All Broadcasters&gt;</source>
+ <translation>&lt;All Broadcasters&gt;</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="939"/>
+- <location filename="../mythmusic/streamview.cpp" line="956"/>
+- <location filename="../mythmusic/streamview.cpp" line="1044"/>
++ <location filename="../mythmusic/streamview.cpp" line="927"/>
++ <location filename="../mythmusic/streamview.cpp" line="944"/>
++ <location filename="../mythmusic/streamview.cpp" line="1032"/>
+ <source>&lt;All Genres&gt;</source>
+ <translation>&lt;All Genres&gt;</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="965"/>
+- <location filename="../mythmusic/streamview.cpp" line="982"/>
+- <location filename="../mythmusic/streamview.cpp" line="1029"/>
+- <location filename="../mythmusic/streamview.cpp" line="1046"/>
++ <location filename="../mythmusic/streamview.cpp" line="953"/>
++ <location filename="../mythmusic/streamview.cpp" line="970"/>
++ <location filename="../mythmusic/streamview.cpp" line="1017"/>
++ <location filename="../mythmusic/streamview.cpp" line="1034"/>
+ <source>&lt;All Countries&gt;</source>
+ <translation>&lt;All Countries&gt;</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="992"/>
+- <location filename="../mythmusic/streamview.cpp" line="1009"/>
+- <location filename="../mythmusic/streamview.cpp" line="1028"/>
+- <location filename="../mythmusic/streamview.cpp" line="1045"/>
++ <location filename="../mythmusic/streamview.cpp" line="980"/>
++ <location filename="../mythmusic/streamview.cpp" line="997"/>
++ <location filename="../mythmusic/streamview.cpp" line="1016"/>
++ <location filename="../mythmusic/streamview.cpp" line="1033"/>
+ <source>&lt;All Languages&gt;</source>
+ <translation>&lt;All Languages&gt;</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="1133"/>
++ <location filename="../mythmusic/streamview.cpp" line="1121"/>
+ <source>Updating stream list. Please Wait ...</source>
+- <translation>Updating stream list. Please Wait ...</translation>
++ <translation>Updating Stream List...</translation>
+ </message>
+ </context>
+ <context>
+ <name>SearchView</name>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="60"/>
++ <location filename="../mythmusic/searchview.cpp" line="54"/>
+ <source>All Fields</source>
+ <translation>All Fields</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="62"/>
++ <location filename="../mythmusic/searchview.cpp" line="56"/>
+ <source>Artist</source>
+ <translation>Artist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="64"/>
++ <location filename="../mythmusic/searchview.cpp" line="58"/>
+ <source>Album</source>
+ <translation>Album</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="66"/>
++ <location filename="../mythmusic/searchview.cpp" line="60"/>
+ <source>Title</source>
+ <translation>Title</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="68"/>
++ <location filename="../mythmusic/searchview.cpp" line="62"/>
+ <source>Genre</source>
+ <translation>Genre</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="177"/>
+- <location filename="../mythmusic/searchview.cpp" line="288"/>
++ <location filename="../mythmusic/searchview.cpp" line="171"/>
++ <location filename="../mythmusic/searchview.cpp" line="278"/>
+ <source>Add To Playlist</source>
+- <translation>Add To Playlist</translation>
++ <translation>Add to Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="177"/>
+- <location filename="../mythmusic/searchview.cpp" line="285"/>
++ <location filename="../mythmusic/searchview.cpp" line="171"/>
++ <location filename="../mythmusic/searchview.cpp" line="275"/>
+ <source>Remove From Playlist</source>
+- <translation>Remove From Playlist</translation>
++ <translation>Remove from Playlist</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="189"/>
+- <location filename="../mythmusic/searchview.cpp" line="289"/>
++ <location filename="../mythmusic/searchview.cpp" line="183"/>
++ <location filename="../mythmusic/searchview.cpp" line="279"/>
+ <source>Add To Playlist And Play</source>
+- <translation>Add To Playlist And Play</translation>
++ <translation>Add to Playlist and Play</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="201"/>
+- <location filename="../mythmusic/searchview.cpp" line="295"/>
++ <location filename="../mythmusic/searchview.cpp" line="195"/>
++ <location filename="../mythmusic/searchview.cpp" line="285"/>
+ <source>Search List...</source>
+ <translation>Search List...</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="274"/>
++ <location filename="../mythmusic/searchview.cpp" line="264"/>
+ <source>Search Actions</source>
+ <translation>Search Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/searchview.cpp" line="297"/>
++ <location filename="../mythmusic/searchview.cpp" line="287"/>
+ <source>More Options</source>
+ <translation>More Options</translation>
+ </message>
+@@ -1889,7 +1885,7 @@
+ <context>
+ <name>SmartPLCriteriaRow</name>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="361"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="357"/>
+ <source>and</source>
+ <translation>and</translation>
+ </message>
+@@ -1897,7 +1893,7 @@
+ <context>
+ <name>SmartPLDateDialog</name>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="2256"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="2233"/>
+ <source>Invalid Date</source>
+ <translation>Invalid Date</translation>
+ </message>
+@@ -1905,7 +1901,7 @@
+ <context>
+ <name>SmartPLResultViewer</name>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1780"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1765"/>
+ <source>%1 of %2</source>
+ <translation>%1 of %2</translation>
+ </message>
+@@ -1913,84 +1909,84 @@
+ <context>
+ <name>SmartPlaylistEditor</name>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="429"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="764"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="870"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="425"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="759"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="865"/>
+ <source>All</source>
+ <translation>All</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="430"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="872"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="1037"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="426"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="867"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="1031"/>
+ <source>Any</source>
+ <translation>Any</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="505"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="688"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="500"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="683"/>
+ <source>New Category</source>
+ <translation>New Category</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="508"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="503"/>
+ <source>Enter Name Of New Category</source>
+- <translation>Enter Name Of New Category</translation>
++ <translation>Enter Name of New Category</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="520"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="689"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="515"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="684"/>
+ <source>Delete Category</source>
+ <translation>Delete Category</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="522"/>
+- <location filename="../mythmusic/smartplaylist.cpp" line="690"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="517"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="685"/>
+ <source>Rename Category</source>
+ <translation>Rename Category</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="525"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="520"/>
+ <source>Enter New Name For Category: %1</source>
+- <translation>Enter New Name For Category: %1</translation>
++ <translation>Enter New Name for Category: %1</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="582"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="577"/>
+ <source>Delete Criteria?</source>
+ <translation>Delete Criteria?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="674"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="669"/>
+ <source>Category Actions</source>
+ <translation>Category Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="697"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="692"/>
+ <source>Criteria Actions</source>
+ <translation>Criteria Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="714"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="709"/>
+ <source>Edit Criteria</source>
+ <translation>Edit Criteria</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="716"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="711"/>
+ <source>Add Criteria</source>
+ <translation>Add Criteria</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="719"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="714"/>
+ <source>Delete Criteria</source>
+ <translation>Delete Criteria</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="958"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="952"/>
+ <source>Are you sure you want to delete this Category?</source>
+ <translation>Are you sure you want to delete this Category?</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/smartplaylist.cpp" line="960"/>
++ <location filename="../mythmusic/smartplaylist.cpp" line="954"/>
+ <source>It will also delete any Smart Playlists belonging to this category.</source>
+ <translation>It will also delete any Smart Playlists belonging to this category.</translation>
+ </message>
+@@ -1998,35 +1994,35 @@
+ <context>
+ <name>StreamView</name>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="91"/>
++ <location filename="../mythmusic/streamview.cpp" line="83"/>
+ <source>Stream Actions</source>
+ <translation>Stream Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="92"/>
+- <location filename="../mythmusic/streamview.cpp" line="309"/>
++ <location filename="../mythmusic/streamview.cpp" line="84"/>
++ <location filename="../mythmusic/streamview.cpp" line="301"/>
+ <source>Add Stream</source>
+ <translation>Add Stream</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="96"/>
+- <location filename="../mythmusic/streamview.cpp" line="323"/>
++ <location filename="../mythmusic/streamview.cpp" line="88"/>
++ <location filename="../mythmusic/streamview.cpp" line="315"/>
+ <source>Edit Stream</source>
+ <translation>Edit Stream</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="97"/>
+- <location filename="../mythmusic/streamview.cpp" line="319"/>
++ <location filename="../mythmusic/streamview.cpp" line="89"/>
++ <location filename="../mythmusic/streamview.cpp" line="311"/>
+ <source>Remove Stream</source>
+ <translation>Remove Stream</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="103"/>
++ <location filename="../mythmusic/streamview.cpp" line="95"/>
+ <source>More Options</source>
+ <translation>More Options</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/streamview.cpp" line="411"/>
++ <location filename="../mythmusic/streamview.cpp" line="399"/>
+ <source>Are you sure you want to delete this Stream?
+ Broadcaster: %1 - Channel: %2</source>
+ <translation>Are you sure you want to delete this Stream?
+@@ -2154,7 +2150,7 @@
+ <message>
+ <location filename="themestrings.h" line="52"/>
+ <source>Already in database</source>
+- <translation>Already in database</translation>
++ <translation>Already in Database</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="46"/>
+@@ -2369,17 +2365,17 @@
+ <message>
+ <location filename="themestrings.h" line="178"/>
+ <source>Directory to hold music:</source>
+- <translation>Directory to hold music:</translation>
++ <translation>Directory to Hold Music:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="101"/>
+ <source>CD device:</source>
+- <translation>CD device:</translation>
++ <translation>CD Device:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="102"/>
+ <source>Audio device:</source>
+- <translation>Audio device:</translation>
++ <translation>Audio Device:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="104"/>
+@@ -2394,7 +2390,7 @@
+ <message>
+ <location filename="themestrings.h" line="240"/>
+ <source>Convert stereo to 5.1 sound</source>
+- <translation>Convert stereo to 5.1 sound</translation>
++ <translation>Convert Stereo to 5.1 Sound</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="241"/>
+@@ -2404,7 +2400,7 @@
+ <message>
+ <location filename="themestrings.h" line="242"/>
+ <source>Allow metadata to be written to tags</source>
+- <translation>Allow metadata to be written to tags</translation>
++ <translation>Allow Metadata to be Written to Tags</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="77"/>
+@@ -2419,17 +2415,17 @@
+ <message>
+ <location filename="themestrings.h" line="108"/>
+ <source>Resume mode:</source>
+- <translation>Resume mode:</translation>
++ <translation>Resume Mode:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="109"/>
+ <source>Action on exit:</source>
+- <translation>Action on exit:</translation>
++ <translation>Action on Exit:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="244"/>
+ <source>Automatically lookup CDs</source>
+- <translation>Automatically lookup CDs</translation>
++ <translation>Automatically Lookup CDs</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="245"/>
+@@ -2479,22 +2475,22 @@
+ <message>
+ <location filename="themestrings.h" line="119"/>
+ <source>File storage location:</source>
+- <translation>File storage location:</translation>
++ <translation>File Storage Location:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="246"/>
+ <source>Replace space with underscore</source>
+- <translation>Replace space with underscore</translation>
++ <translation>Replace Space with Underscore</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="247"/>
+ <source>Use variable bitrates</source>
+- <translation>Use variable bitrates</translation>
++ <translation>Use Variable Bitrates</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="248"/>
+ <source>Automatically eject CDs after ripping</source>
+- <translation>Automatically eject CDs after ripping</translation>
++ <translation>Automatically Eject CDs After Ripping</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="125"/>
+@@ -2534,7 +2530,7 @@
+ <message>
+ <location filename="themestrings.h" line="250"/>
+ <source>Enable directories on MP3 Creation</source>
+- <translation>Enable directories on MP3 Creation</translation>
++ <translation>Enable Directories on MP3 Creation</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="133"/>
+@@ -2555,12 +2551,12 @@
+ <message>
+ <location filename="themestrings.h" line="251"/>
+ <source>Change Visualizer on each song</source>
+- <translation>Change Visualizer on each song</translation>
++ <translation>Change Visualizer on Each Song</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="252"/>
+ <source>Randomize Visualizer order</source>
+- <translation>Randomize Visualizer order</translation>
++ <translation>Randomize Visualizer Order</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="138"/>
+@@ -2610,7 +2606,7 @@
+ <message>
+ <location filename="themestrings.h" line="22"/>
+ <source>You haven&apos;t selected any tracks to play</source>
+- <translation>You haven&apos;t selected any tracks to play</translation>
++ <translation>You haven&apos;t selected any tracks to play.</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="10"/>
+@@ -2630,17 +2626,17 @@
+ <message>
+ <location filename="themestrings.h" line="190"/>
+ <source>Play List Editor (tree)</source>
+- <translation>Play List Editor (tree)</translation>
++ <translation>Play List Editor (Tree)</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="191"/>
+ <source>Play List Editor (gallery)</source>
+- <translation>Play List Editor (gallery)</translation>
++ <translation>Play List Editor (Gallery)</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="192"/>
+ <source>Play List Editor (search)</source>
+- <translation>Play List Editor (search)</translation>
++ <translation>Play List Editor (Search)</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="23"/>
+@@ -2985,17 +2981,17 @@
+ <message>
+ <location filename="themestrings.h" line="179"/>
+ <source>Resume mode (Playlist Editor):</source>
+- <translation>Resume mode (Playlist Editor):</translation>
++ <translation>Resume Mode (Playlist Editor):</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="180"/>
+ <source>Resume mode (Radio):</source>
+- <translation>Resume mode (Radio):</translation>
++ <translation>Resume Mode (Radio):</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="181"/>
+ <source>Action on jumppoint:</source>
+- <translation>Action on jumppoint:</translation>
++ <translation>Action on Jumppoint:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="182"/>
+@@ -3015,7 +3011,7 @@
+ <message>
+ <location filename="themestrings.h" line="209"/>
+ <source>Clears the entire database:</source>
+- <translation>Clears the entire database:</translation>
++ <translation>Clears the Entire Database:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="210"/>
+@@ -3090,7 +3086,7 @@
+ <message>
+ <location filename="themestrings.h" line="221"/>
+ <source>Date added:</source>
+- <translation>Date added:</translation>
++ <translation>Date Added:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="223"/>
+@@ -3155,7 +3151,7 @@
+ <message>
+ <location filename="themestrings.h" line="103"/>
+ <source>Convert stereo to 5.1 sound:</source>
+- <translation>Convert stereo to 5.1 sound:</translation>
++ <translation>Convert Stereo to 5.1 Sound:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="105"/>
+@@ -3165,12 +3161,12 @@
+ <message>
+ <location filename="themestrings.h" line="106"/>
+ <source>Allow metadata to be written to tags:</source>
+- <translation>Allow metadata to be written to tags:</translation>
++ <translation>Allow Metadata to be Written to Tags:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="110"/>
+ <source>Automatically lookup CDs:</source>
+- <translation>Automatically lookup CDs:</translation>
++ <translation>Automatically Lookup CDs:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="111"/>
+@@ -3180,27 +3176,27 @@
+ <message>
+ <location filename="themestrings.h" line="120"/>
+ <source>Replace space with underscore:</source>
+- <translation>Replace space with underscore:</translation>
++ <translation>Replace Space with Underscore:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="123"/>
+ <source>Use variable bitrates:</source>
+- <translation>Use variable bitrates:</translation>
++ <translation>Use Variable Bitrates:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="124"/>
+ <source>Automatically eject CDs after ripping:</source>
+- <translation>Automatically eject CDs after ripping:</translation>
++ <translation>Automatically Eject CDs After Ripping:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="134"/>
+ <source>Change Visualizer on each song:</source>
+- <translation>Change Visualizer on each song:</translation>
++ <translation>Change Visualizer on Each Song:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="135"/>
+ <source>Randomize Visualizer order:</source>
+- <translation>Randomize Visualizer order:</translation>
++ <translation>Randomize Visualizer Order:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="127"/>
+@@ -3210,7 +3206,7 @@
+ <message>
+ <location filename="themestrings.h" line="132"/>
+ <source>Enable directories on MP3 Creation:</source>
+- <translation>Enable directories on MP3 Creation:</translation>
++ <translation>Enable Directories on MP3 Creation:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="147"/>
+@@ -3320,7 +3316,7 @@
+ <message>
+ <location filename="themestrings.h" line="243"/>
+ <source>Resume mode (Playlist):</source>
+- <translation>Resume mode (Playlist):</translation>
++ <translation>Resume Mode (Playlist):</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="253"/>
+@@ -3390,7 +3386,7 @@
+ <message>
+ <location filename="themestrings.h" line="268"/>
+ <source>Allow writing metadata to tags:</source>
+- <translation>Allow writing metadata to tags:</translation>
++ <translation>Allow Writing Metadata to Tags:</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="269"/>
+@@ -3445,7 +3441,7 @@
+ <message>
+ <location filename="themestrings.h" line="280"/>
+ <source>Reset music database</source>
+- <translation>Reset music database</translation>
++ <translation>Reset Music Database</translation>
+ </message>
+ <message>
+ <location filename="themestrings.h" line="285"/>
+@@ -3511,51 +3507,51 @@
+ <context>
+ <name>VisualizationSettings</name>
+ <message>
+- <location filename="../mythmusic/visualizationsettings.cpp" line="58"/>
++ <location filename="../mythmusic/visualizationsettings.cpp" line="53"/>
+ <source>Change the visualizer when the song changes.</source>
+ <translation>Change the visualizer when the song changes.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizationsettings.cpp" line="59"/>
++ <location filename="../mythmusic/visualizationsettings.cpp" line="54"/>
+ <source>On changing the visualizer pick a new one at random.</source>
+ <translation>On changing the visualizer pick a new one at random.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizationsettings.cpp" line="60"/>
+- <location filename="../mythmusic/visualizationsettings.cpp" line="64"/>
++ <location filename="../mythmusic/visualizationsettings.cpp" line="55"/>
++ <location filename="../mythmusic/visualizationsettings.cpp" line="59"/>
+ <source>If set to &quot;2&quot;, visualizations will be scaled in half. Currently only used by the goom visualization. Reduces CPU load on slower machines.</source>
+ <translation>If set to &quot;2&quot;, visualizations will be scaled in half. Currently only used by the goom visualization. Reduces CPU load on slower machines.</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizationsettings.cpp" line="68"/>
++ <location filename="../mythmusic/visualizationsettings.cpp" line="63"/>
+ <source>Exit without saving settings</source>
+- <translation>Exit without saving settings</translation>
++ <translation>Exit Without Saving</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizationsettings.cpp" line="69"/>
++ <location filename="../mythmusic/visualizationsettings.cpp" line="64"/>
+ <source>Save settings and Exit</source>
+- <translation>Save settings and Exit</translation>
++ <translation>Save and Exit</translation>
+ </message>
+ </context>
+ <context>
+ <name>VisualizerView</name>
+ <message>
+- <location filename="../mythmusic/visualizerview.cpp" line="102"/>
++ <location filename="../mythmusic/visualizerview.cpp" line="92"/>
+ <source>Actions</source>
+ <translation>Actions</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizerview.cpp" line="106"/>
++ <location filename="../mythmusic/visualizerview.cpp" line="96"/>
+ <source>Change Visualizer</source>
+ <translation>Change Visualizer</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizerview.cpp" line="107"/>
++ <location filename="../mythmusic/visualizerview.cpp" line="97"/>
+ <source>Show Track Info</source>
+ <translation>Show Track Info</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualizerview.cpp" line="108"/>
++ <location filename="../mythmusic/visualizerview.cpp" line="98"/>
+ <source>Other Options</source>
+ <translation>Other Options</translation>
+ </message>
+@@ -3563,52 +3559,52 @@
+ <context>
+ <name>Visualizers</name>
+ <message>
+- <location filename="../mythmusic/bumpscope.cpp" line="566"/>
++ <location filename="../mythmusic/bumpscope.cpp" line="557"/>
+ <source>BumpScope</source>
+ <translation>BumpScope</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/goom/mythgoom.cpp" line="126"/>
++ <location filename="../mythmusic/mythgoom.cpp" line="126"/>
+ <source>Goom</source>
+ <translation>Goom</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/synaesthesia.cpp" line="652"/>
++ <location filename="../mythmusic/synaesthesia.cpp" line="650"/>
+ <source>Synaesthesia</source>
+ <translation>Synaesthesia</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="536"/>
++ <location filename="../mythmusic/visualize.cpp" line="520"/>
+ <source>StereoScope</source>
+ <translation>StereoScope</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="562"/>
++ <location filename="../mythmusic/visualize.cpp" line="546"/>
+ <source>MonoScope</source>
+ <translation>MonoScope</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="811"/>
++ <location filename="../mythmusic/visualize.cpp" line="789"/>
+ <source>Spectrum</source>
+ <translation>Spectrum</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="903"/>
++ <location filename="../mythmusic/visualize.cpp" line="877"/>
+ <source>Squares</source>
+ <translation>Squares</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="1372"/>
++ <location filename="../mythmusic/visualize.cpp" line="1339"/>
+ <source>Piano</source>
+ <translation>Piano</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="1570"/>
++ <location filename="../mythmusic/visualize.cpp" line="1533"/>
+ <source>AlbumArt</source>
+- <translation>AlbumArt</translation>
++ <translation>Album Art</translation>
+ </message>
+ <message>
+- <location filename="../mythmusic/visualize.cpp" line="1620"/>
++ <location filename="../mythmusic/visualize.cpp" line="1579"/>
+ <source>Blank</source>
+ <translation>Blank</translation>
+ </message>
+@@ -3616,7 +3612,7 @@
+ <context>
+ <name>avfDecoderFactory</name>
+ <message>
+- <location filename="../mythmusic/avfdecoder.cpp" line="628"/>
++ <location filename="../mythmusic/avfdecoder.cpp" line="624"/>
+ <source>Internal Decoder</source>
+ <translation>Internal Decoder</translation>
+ </message>
diff --git a/abs/core/mythtv/stable-30/mythplugins/mythplugins-mythzoneminder.install b/abs/core/mythtv/stable-30/mythplugins/mythplugins-mythzoneminder.install
new file mode 100644
index 0000000..a4e0c0d
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythplugins/mythplugins-mythzoneminder.install
@@ -0,0 +1,11 @@
+post_install() {
+ . /etc/systemconfig
+ if [ $SystemType = Master_backend -o $SystemType = Standalone ]
+ then
+ echo "This looks a zoneminder server install"
+ echo "Installing zoneminder"
+ #for reference the pacman statement below will not work because of a db lock.
+ pacman -S zoneminder
+ fi
+
+}
diff --git a/abs/core/mythtv/stable-30/mythtv/0031-UPnP-Reduce-startup-latency-by-moving-blocking-code-to-own-thread.patch b/abs/core/mythtv/stable-30/mythtv/0031-UPnP-Reduce-startup-latency-by-moving-blocking-code-to-own-thread.patch
new file mode 100644
index 0000000..4a2c4c3
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/0031-UPnP-Reduce-startup-latency-by-moving-blocking-code-to-own-thread.patch
@@ -0,0 +1,82 @@
+diff -Naur mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythupnp/ssdp.cpp mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythupnp/ssdp.cpp
+--- mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythupnp/ssdp.cpp 2019-01-05 12:44:55.383333333 +0100
++++ mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythupnp/ssdp.cpp 2019-01-05 12:44:56.990000000 +0100
+@@ -170,21 +170,21 @@
+ // ------------------------------------------------------------------
+
+ LOG(VB_UPNP, LOG_INFO,
+- "SSDP::EnableNotifications() - sending NTS_byebye");
+- m_pNotifyTask->SetNTS( NTS_byebye );
+- m_pNotifyTask->Execute( nullptr );
+-
+- m_bAnnouncementsEnabled = true;
++ "SSDP::EnableNotifications() - sending NTS_byebye2");
++ m_pNotifyTask->SetNTS( NTS_byebye2 );
++ }
++ else
++ {
++ LOG(VB_UPNP, LOG_INFO,
++ "SSDP::EnableNotifications() - sending NTS_alive");
++ m_pNotifyTask->SetNTS( NTS_alive );
+ }
+
++ m_bAnnouncementsEnabled = true;
++
+ // ------------------------------------------------------------------
+ // Add Announcement Task to the Queue
+ // ------------------------------------------------------------------
+-
+- LOG(VB_UPNP, LOG_INFO, "SSDP::EnableNotifications() - sending NTS_alive");
+-
+- m_pNotifyTask->SetNTS( NTS_alive );
+-
+ TaskQueue::Instance()->AddTask(m_pNotifyTask);
+
+ LOG(VB_UPNP, LOG_INFO,
+diff -Naur mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythupnp/upnptasknotify.cpp mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythupnp/upnptasknotify.cpp
+--- mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythupnp/upnptasknotify.cpp 2019-01-05 12:44:55.383333333 +0100
++++ mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythupnp/upnptasknotify.cpp 2019-01-05 12:44:56.990000000 +0100
+@@ -127,7 +127,9 @@
+
+ pSocket->writeBlock( scPacket, scPacket.length(),
+ pSocket->address(), pSocket->port() );
+- std::this_thread::sleep_for(std::chrono::milliseconds(random() % 250));
++ // Only wait if not sending final bybbye. This speeds up shutdown
++ if (m_eNTS != NTS_byebye)
++ std::this_thread::sleep_for(std::chrono::milliseconds(random() % 250));
+ pSocket->writeBlock( scPacket, scPacket.length(),
+ pSocket->address(), pSocket->port() );
+ }
+@@ -168,6 +170,11 @@
+
+ if (m_eNTS == NTS_alive)
+ pQueue->AddTask( (m_nMaxAge / 2) * 1000, (Task *)this );
++ else if (m_eNTS == NTS_byebye2)
++ {
++ m_eNTS = NTS_alive;
++ pQueue->AddTask( this );
++ }
+
+ m_mutex.unlock();
+
+diff -Naur mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythupnp/upnptasknotify.h mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythupnp/upnptasknotify.h
+--- mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythupnp/upnptasknotify.h 2019-01-05 12:44:55.383333333 +0100
++++ mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythupnp/upnptasknotify.h 2019-01-05 12:44:56.990000000 +0100
+@@ -38,7 +38,8 @@
+ typedef enum
+ {
+ NTS_alive = 0,
+- NTS_byebye = 1
++ NTS_byebye = 1,
++ NTS_byebye2
+
+ } UPnpNotifyNTS;
+
+@@ -90,6 +91,7 @@
+ {
+ case NTS_alive : return( "ssdp:alive" );
+ case NTS_byebye: return( "ssdp:byebye" );
++ case NTS_byebye2: return( "ssdp:byebye" );
+ }
+ return( "unknown" );
+ }
diff --git a/abs/core/mythtv/stable-30/mythtv/0227-OSD-Add-interlaced-status-to-OSD-debug-screen.patch b/abs/core/mythtv/stable-30/mythtv/0227-OSD-Add-interlaced-status-to-OSD-debug-screen.patch
new file mode 100644
index 0000000..f61693d
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/0227-OSD-Add-interlaced-status-to-OSD-debug-screen.patch
@@ -0,0 +1,19 @@
+diff -Naur mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythtv/mythplayer.cpp mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythtv/mythplayer.cpp
+--- mythtv-master-20190105-g3382e1a-old/mythtv/libs/libmythtv/mythplayer.cpp 2019-01-05 12:45:37.260000000 +0100
++++ mythtv-master-20190105-g3382e1a-new/mythtv/libs/libmythtv/mythplayer.cpp 2019-01-05 12:45:38.720000000 +0100
+@@ -5074,13 +5074,13 @@
+ if (decoder)
+ infoMap["videocodecdesc"] = decoder->GetRawEncodingType();
+ infoMap["videowidth"] = QString::number(width);
+- infoMap["videoheight"] = QString::number(height);
++ bool interlaced = is_interlaced(m_scan);
++ infoMap["videoheight"] = QString::number(height) + (interlaced ? "i" : "");
+ infoMap["videoframerate"] = QString::number(video_frame_rate, 'f', 2);
+
+ if (width < 640)
+ return;
+
+- bool interlaced = is_interlaced(m_scan);
+ if (width == 1920 || height == 1080 || height == 1088)
+ infoMap["videodescrip"] = interlaced ? "HD_1080_I" : "HD_1080_P";
+ else if ((width == 1280 || height == 720) && !interlaced)
diff --git a/abs/core/mythtv/stable-30/mythtv/0294-0283-FE-Add-network-status-to-machine-status-dialog.patch b/abs/core/mythtv/stable-30/mythtv/0294-0283-FE-Add-network-status-to-machine-status-dialog.patch
new file mode 100644
index 0000000..192f0fc
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/0294-0283-FE-Add-network-status-to-machine-status-dialog.patch
@@ -0,0 +1,71 @@
+From 273937c9ee4ba00ad049ac3c9fe62ecabd2f8fdb Mon Sep 17 00:00:00 2001
+From: Lawrence Rust <lvr@softsystem.co.uk>
+Date: Thu, 1 Oct 2015 09:56:13 +0100
+Subject: [PATCH 283/290] FE: Add network status to machine status dialog
+
+Signed-off-by: Lawrence Rust <lvr@softsystem.co.uk>
+---
+ mythtv/programs/mythfrontend/statusbox.cpp | 33 ++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+diff --git a/mythtv/programs/mythfrontend/statusbox.cpp b/mythtv/programs/mythfrontend/statusbox.cpp
+index f0078ea..23c5a24 100644
+--- a/mythtv/programs/mythfrontend/statusbox.cpp
++++ src/mythtv/programs/mythfrontend/statusbox.cpp
+@@ -5,6 +5,8 @@ using namespace std;
+
+ #include <QRegExp>
+ #include <QHostAddress>
++#include <QHostInfo>
++#include <QNetworkInterface>
+
+ #include "mythcorecontext.h"
+ #include "filesysteminfo.h"
+@@ -1221,6 +1223,12 @@ void StatusBox::doMachineStatus()
+ line = tr("This machine:");
+ AddLogLine(line, machineStr);
+
++ // Hostname
++ line = " " + tr("Hostname") + ": " + QHostInfo::localHostName();
++ if ( !QHostInfo::localDomainName().isEmpty())
++ line += "." + QHostInfo::localDomainName();
++ AddLogLine(line, machineStr);
++
+ // uptime
+ if (!getUptime(uptime))
+ uptime = 0;
+@@ -1264,6 +1272,31 @@ void StatusBox::doMachineStatus()
+ }
+ }
+
++ // Network status
++ line = " " + tr("Interfaces") + ":";
++ QString sep = " ";
++ foreach( QNetworkInterface iface, QNetworkInterface::allInterfaces())
++ {
++ QNetworkInterface::InterfaceFlags f = iface.flags();
++ if (!(f & QNetworkInterface::IsUp))
++ continue;
++ if (!(f & QNetworkInterface::IsRunning))
++ continue;
++ if (f & QNetworkInterface::IsLoopBack)
++ continue;
++
++ line += sep + iface.humanReadableName() + " [";
++ sep = ", ";
++ QString sep2 = "";
++ foreach( QNetworkAddressEntry addr, iface.addressEntries())
++ {
++ line += sep2 + addr.ip().toString();
++ sep2 = ", ";
++ }
++ line += "]";
++ }
++ AddLogLine(line, machineStr);
++
+ if (!m_isBackendActive)
+ {
+ line = tr("MythTV server") + ':';
+--
+1.7.9.5
+
diff --git a/abs/core/mythtv/stable-30/mythtv/PKGBUILD b/abs/core/mythtv/stable-30/mythtv/PKGBUILD
new file mode 100644
index 0000000..1aefb62
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/PKGBUILD
@@ -0,0 +1,144 @@
+pkgname=mythtv
+pkgver=30.0
+pkgrel=5
+commit_hash=`cat ../git_src/git_hash`
+pkgdesc="A Homebrew PVR project $commit_hash"
+arch=('x86_64')
+url="http://www.mythtv.org/"
+license=('GPL')
+depends=('avahi' 'exiv2' 'faad2' 'fftw' 'glew' 'lame' 'libass' 'libavc1394' 'libbluray'
+ 'libcdio' 'libcec' 'libcrystalhd-git' 'libgl' 'libhdhomerun' 'libiec61883'
+ 'libsamplerate' 'libva' 'libvdpau' 'libvpx' 'libxnvctrl' 'libxinerama'
+ 'libxml2' 'libxrandr' 'LinHES-config>=8.1-6' 'LinHES-system>=8.4-4'
+ 'lirc-utils' 'minizip' 'mysql-clients' 'mysql-python'
+ 'openssl' 'perl-date-manip' 'perl-dbd-mysql'
+ 'perl-io-socket-inet6' 'perl-libwww' 'perl-math-round'
+ 'perl-net-upnp' 'perl-soap-lite' 'perl-xml-sax' 'python2-future'
+ 'python2-pycurl' 'python2-requests' 'python2-requests-cache'
+ 'python2-lxml' 'qt5-script' 'qt5-webkit' 'sdl' 'taglib' 'unzip' 'urlgrabber'
+ 'wget' 'x264' 'x265' 'xmltv')
+makedepends=('apache-ant' 'mesa' 'mesa-libgl' 'yasm' 'git' 'rsync' 'qt5-tools')
+replaces=()
+groups=('pvr')
+backup=()
+install='mythtv.install'
+
+patches=(
+ 'myth_settings.patch'
+ '0031-UPnP-Reduce-startup-latency-by-moving-blocking-code-to-own-thread.patch'
+ '0227-OSD-Add-interlaced-status-to-OSD-debug-screen.patch'
+ 'videoAlwaysUseBookmark.patch'
+ 'autoskip_reduce_commskip_jumpback.patch'
+ 'change_msg_types.patch'
+# 'disable_mythnotification_tuner_failure.patch'
+ 'searchMetatdataSelectedGrabber.patch'
+ 'defaultThemeLinHES.patch'
+ 'addEnableDisableAutoShutdownToSystemMenu.patch'
+ 'mythfrontend_en_us.ts_Title_Case.patch'
+ 'fixTranslations.patch'
+ 'pull103-Add-heuristic-in-TMDB-script-to-detect-movie-release-years.patch'
+ 'addHostnameIPtoMachineStatus.patch'
+ 'revertQTsettingsForMythinstall.patch'
+ )
+
+optdepends=()
+source=(`echo ${patches[@]:0}` 'recordings')
+
+prepare() {
+ if [ -e ${srcdir}/mythtv ]
+ then
+ msg "Removing old mythtv src"
+ rm -rf ${srcdir}/mythtv
+ fi
+
+ cd ${startdir}
+ msg "Copying in mythtv git_src"
+ cp -rp ../git_src/mythtv/mythtv $srcdir
+ cd ${srcdir}/$pkgname
+ echo "#!/bin/bash" > version.sh
+
+ msg "--------------------------applying patches------------------------------"
+ for i in `echo ${patches[@]:0}`
+ do
+ echo applying $i
+ patch -Np2 -i ${startdir}/src/$i || return 1
+ echo "-----------------------------"
+ done
+ msg "--------------------------done applying patches-------------------------"
+
+ msg "Change python to python2"
+ find 'bindings/python' 'contrib' 'programs/scripts' -type f | xargs sed -i 's@^#!.*python$@#!/usr/bin/python2@'
+
+ msg "Updating en_us Translation"
+ cd ${srcdir}/$pkgname/i18n
+ lrelease -removeidentical mythfrontend_en_us.ts
+}
+
+build() {
+ cd ${srcdir}/$pkgname
+
+ msg "Configuring mythtv"
+ ARCH=${CARCH/_/-}
+ ./configure --prefix=/usr \
+ --cpu=${ARCH} \
+ --disable-altivec \
+ --disable-audio-jack \
+ --disable-audio-pulseoutput \
+ --disable-distcc \
+ --dvb-path=/usr/include \
+ --enable-bdjava \
+ --enable-libmp3lame \
+ --enable-libvpx \
+ --enable-libxvid \
+ --enable-libx264 \
+ --enable-libx265 \
+ --enable-sdl \
+ --enable-sdl2 \
+ --python=python2 \
+ --with-bindings=perl,python || return 1
+ msg "Compiling mythtv"
+ make all || return 1
+}
+
+package() {
+ cd "${srcdir}/${pkgname}"
+ # basic install
+ make INSTALL_ROOT="${pkgdir}" install
+ # install contrib files
+ rsync -arp --exclude .svn --delete-excluded contrib ${pkgdir}/usr/share/mythtv/ || return 1
+ # install database structure
+ rsync -arp --exclude .svn --delete-excluded database ${pkgdir}/usr/share/mythtv/ || return 1
+ # install docs
+ rsync -arp --exclude .svn --delete-excluded docs ${pkgdir}/usr/share/mythtv/ || return 1
+
+ # patch the xml LinHES style
+ cp -r ${startdir}/menu-xml/*.xml ${pkgdir}/usr/share/mythtv/themes/defaultmenu/
+ cd ${pkgdir}/usr/share/mythtv
+ patch -p0 < ${startdir}/menu-xml/mainmenu.xml.patch || return 1
+ patch -p0 < ${startdir}/menu-xml/optical_menu.xml.patch || return 1
+ patch -p0 < ${startdir}/menu-xml/library.xml.patch || return 1
+
+ # make mythtv log dir for old scripts that use it
+ mkdir -p ${pkgdir}/var/log/mythtv
+ chown 1000.1000 ${pkgdir}/var/log/mythtv
+
+ #install recordings (was pretty)
+ mkdir -p ${pkgdir}/etc/cron.hourly/
+ install -m0755 ${srcdir}/recordings ${pkgdir}/etc/cron.hourly/
+}
+
+md5sums=('fb5a87c52a31168a0c8fdde72f27cc45'
+ '8488776c337ec5d1b15d026c5be40b04'
+ 'e4ced95f173911eaf735e5975788d51e'
+ '41098e898361a5a3cde3eaae358482a8'
+ '2f983590a8a3cf81f386cc65b9628e13'
+ 'f764758832f8e9068ffda1ac0c8aacba'
+ '0f674b9cad031ba1e03aaf6b5ee1499f'
+ 'b0b238320fa78a4928dce2cea7c85071'
+ '8e4492d1777234a021f368bd6ee964ee'
+ '208f46d91c5911e9572d300d89381d7b'
+ '72404ebfec2f18536ccc10d8e2bc8757'
+ 'd05eaf66c434a131c8efb4d87e99b402'
+ 'b3ae1cc55f40c6953121415e08c166f4'
+ '73ad2f3bec8745f7a3bbf2169ee34db3'
+ '633cd853a89aeee5388daaad21ccec28')
diff --git a/abs/core/mythtv/stable-30/mythtv/addEnableDisableAutoShutdownToSystemMenu.patch b/abs/core/mythtv/stable-30/mythtv/addEnableDisableAutoShutdownToSystemMenu.patch
new file mode 100644
index 0000000..b14e2e0
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/addEnableDisableAutoShutdownToSystemMenu.patch
@@ -0,0 +1,50 @@
+diff --git a/mythtv/libs/libmythui/myththemedmenu.cpp b/mythtv/libs/libmythui/myththemedmenu.cpp
+index ed2e54c..77aaf73 100644
+--- a/mythtv/libs/libmythui/myththemedmenu.cpp
++++ b/mythtv/libs/libmythui/myththemedmenu.cpp
+@@ -308,6 +308,8 @@ void MythThemedMenu::ShowMenu()
+ return;
+
+ int override_menu = GetMythDB()->GetNumSetting("OverrideExitMenu");
++ int MythShutdownLock = GetMythDB()->GetNumSetting("MythShutdownLock");
++ int idleTimeoutSecs = GetMythDB()->GetNumSetting("idleTimeoutSecs");
+ QString label = tr("System Menu");
+ MythScreenStack* mainStack = GetMythMainWindow()->GetMainStack();
+ m_menuPopup = new MythDialogBox(label, mainStack, "menuPopup");
+@@ -325,6 +327,21 @@ void MythThemedMenu::ShowMenu()
+ if (override_menu != 7)
+ m_menuPopup->AddButton(tr("Exit application"), QVariant("exit"));
+
++ // don't offer to enable/disable auto shutdown if auto shutdown is disabled
++ if (idleTimeoutSecs != 0)
++ {
++ if (MythShutdownLock == 0)
++ {
++ m_menuPopup->AddButton(tr("Disable Auto Shutdown"),
++ QVariant("lockShutdown"));
++ }
++ else
++ {
++ m_menuPopup->AddButton(tr("Enable Auto Shutdown"),
++ QVariant("unlockShutdown"));
++ }
++ }
++
+ switch (override_menu)
+ {
+ case 2:
+@@ -416,6 +433,14 @@ void MythThemedMenu::customEvent(QEvent *event)
+ QString arg("exiting_app");
+ m_state->m_callback(m_state->m_callbackdata, arg);
+ }
++ else if (action == "lockShutdown")
++ {
++ GetMythDB()->SaveSettingOnHost("MythShutdownLock", "1", NULL);
++ }
++ else if (action == "unlockShutdown")
++ {
++ GetMythDB()->SaveSettingOnHost("MythShutdownLock", "0", NULL);
++ }
+ }
+ else if (resultid == "password")
+ {
diff --git a/abs/core/mythtv/stable-30/mythtv/addHostnameIPtoMachineStatus.patch b/abs/core/mythtv/stable-30/mythtv/addHostnameIPtoMachineStatus.patch
new file mode 100644
index 0000000..2fd8b88
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/addHostnameIPtoMachineStatus.patch
@@ -0,0 +1,88 @@
+diff --git a/mythtv/programs/mythfrontend/statusbox.cpp b/mythtv/programs/mythfrontend/statusbox.cpp
+index e45016af50..73e7792a61 100644
+--- a/mythtv/programs/mythfrontend/statusbox.cpp
++++ b/mythtv/programs/mythfrontend/statusbox.cpp
+@@ -5,6 +5,7 @@ using namespace std;
+
+ #include <QRegExp>
+ #include <QHostAddress>
++ #include <QNetworkInterface>
+
+ #include "mythcorecontext.h"
+ #include "filesysteminfo.h"
+@@ -1271,9 +1272,10 @@ void StatusBox::doMachineStatus()
+ m_iconState->DisplayState("machine");
+ m_logList->Reset();
+ QString machineStr = tr("Machine Status shows some operating system "
+- "statistics of this machine");
++ "statistics of this machine.");
+ if (!m_isBackendActive)
+- machineStr.append(" " + tr("and the MythTV server"));
++ machineStr = tr("Machine Status shows some operating system "
++ "statistics of this machine and the MythTV server.");
+
+ if (m_helpText)
+ m_helpText->SetText(machineStr);
+@@ -1291,13 +1293,41 @@ void StatusBox::doMachineStatus()
+ line = tr("This machine:");
+ AddLogLine(line, machineStr);
+
++ // Hostname & IP
++ line = " " + tr("Hostname") + ": " + gCoreContext->GetHostName();
++ line.append(" " + tr("IP") + ": ");
++ QString sep = " ";
++ foreach(QNetworkInterface iface, QNetworkInterface::allInterfaces())
++ {
++ QNetworkInterface::InterfaceFlags f = iface.flags();
++ if (!(f & QNetworkInterface::IsUp))
++ continue;
++ if (!(f & QNetworkInterface::IsRunning))
++ continue;
++ if (f & QNetworkInterface::IsLoopBack)
++ continue;
++
++ sep = ", ";
++ QString sep2 = "";
++ foreach(QNetworkAddressEntry addr, iface.addressEntries())
++ {
++ if (addr.ip().protocol() == QAbstractSocket::IPv4Protocol || addr.ip().protocol() == QAbstractSocket::IPv6Protocol)
++ {
++ line += sep2 + addr.ip().toString();
++ sep2 = ", ";
++ }
++ }
++ line += "";
++ }
++ AddLogLine(line, machineStr);
++
+ // uptime
+ if (!getUptime(uptime))
+ uptime = 0;
+ line = uptimeStr(uptime);
+
+ // weighted average loads
+- line.append(". " + tr("Load") + ": ");
++ line.append(" " + tr("Load") + ": ");
+
+ #if defined(_WIN32) || defined(Q_OS_ANDROID)
+ line.append(tr("unknown") + " - getloadavg() " + tr("failed"));
+@@ -1339,13 +1369,18 @@ void StatusBox::doMachineStatus()
+ line = tr("MythTV server") + ':';
+ AddLogLine(line, machineStr);
+
++ // Hostname & IP
++ line = " " + tr("Hostname") + ": " + gCoreContext->GetSetting("MasterServerName");
++ line.append(" " + tr("IP") + ": " + gCoreContext->GetSetting("MasterServerIP"));
++ AddLogLine(line, machineStr);
++
+ // uptime
+ if (!RemoteGetUptime(uptime))
+ uptime = 0;
+ line = uptimeStr(uptime);
+
+ // weighted average loads
+- line.append(". " + tr("Load") + ": ");
++ line.append(" " + tr("Load") + ": ");
+ float floads[3];
+ if (RemoteGetLoad(floads))
+ {
diff --git a/abs/core/mythtv/stable-30/mythtv/autoskip_reduce_commskip_jumpback.patch b/abs/core/mythtv/stable-30/mythtv/autoskip_reduce_commskip_jumpback.patch
new file mode 100644
index 0000000..b6815ef
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/autoskip_reduce_commskip_jumpback.patch
@@ -0,0 +1,13 @@
+--- src/mythtv/libs/libmythtv/commbreakmap.cpp.orig 2017-03-15 20:34:21.722746111 +0000
++++ src/mythtv/libs/libmythtv/commbreakmap.cpp 2017-03-15 20:35:21.531732684 +0000
+@@ -271,8 +271,8 @@
+ {
+ comm_msg = tr("Skipping Back.");
+
+- if (lastCommSkipStart > (2.0 * video_frame_rate))
+- lastCommSkipStart -= (long long) (2.0 * video_frame_rate);
++ if (lastCommSkipStart > (video_frame_rate))
++ lastCommSkipStart -= (long) (video_frame_rate);
+ lastCommSkipDirection = 0;
+ lastCommSkipTime = time(NULL);
+ jumpToFrame = lastCommSkipStart;
diff --git a/abs/core/mythtv/stable-30/mythtv/change_msg_types.patch b/abs/core/mythtv/stable-30/mythtv/change_msg_types.patch
new file mode 100644
index 0000000..029dd9a
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/change_msg_types.patch
@@ -0,0 +1,20 @@
+--- src/mythtv/libs/libmythtv/tv_play.cpp.orig 2017-03-15 20:27:51.672833870 +0000
++++ src/mythtv/libs/libmythtv/tv_play.cpp 2017-03-15 20:29:10.646025774 +0000
+@@ -12714,7 +12714,7 @@
+ ctx->UnlockPlayingInfo(__FILE__, __LINE__);
+
+ if (!desc.isEmpty())
+- UpdateOSDSeekMessage(ctx, desc, kOSDTimeout_Med);
++ SetOSDMessage(ctx, desc);
+ }
+
+ void TV::SetAutoCommercialSkip(const PlayerContext *ctx,
+@@ -12731,7 +12731,7 @@
+ ctx->UnlockDeletePlayer(__FILE__, __LINE__);
+
+ if (!desc.isEmpty())
+- UpdateOSDSeekMessage(ctx, desc, kOSDTimeout_Med);
++ SetOSDMessage(ctx, desc);
+ }
+
+ void TV::SetManualZoom(const PlayerContext *ctx, bool zoomON, QString desc)
diff --git a/abs/core/mythtv/stable-30/mythtv/defaultThemeLinHES.patch b/abs/core/mythtv/stable-30/mythtv/defaultThemeLinHES.patch
new file mode 100644
index 0000000..947176e
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/defaultThemeLinHES.patch
@@ -0,0 +1,11 @@
+--- src/mythtv/libs/libmythui/mythuihelper.h.orig 2016-12-29 16:08:28.319634823 +0000
++++ src/mythtv/libs/libmythui/mythuihelper.h 2016-12-29 16:09:03.245104062 +0000
+@@ -9,7 +9,7 @@
+ #include "mythuiexp.h"
+ #include "themeinfo.h"
+
+-#define DEFAULT_UI_THEME "MythCenter"
++#define DEFAULT_UI_THEME "LinHES"
+ #define FALLBACK_UI_THEME "Terra"
+
+ class MythUIHelperPrivate;
diff --git a/abs/core/mythtv/stable-30/mythtv/disable_mythnotification_tuner_failure.patch b/abs/core/mythtv/stable-30/mythtv/disable_mythnotification_tuner_failure.patch
new file mode 100644
index 0000000..8e03f24
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/disable_mythnotification_tuner_failure.patch
@@ -0,0 +1,43 @@
+--- src/mythtv/libs/libmythtv/tv_rec.cpp.orig 2017-09-15 21:17:57.761339002 +0000
++++ src/mythtv/libs/libmythtv/tv_rec.cpp 2017-09-15 21:16:22.383499573 +0000
+@@ -3956,19 +3956,6 @@ MPEGStreamData *TVRec::TuningSignalCheck
+ newRecStatus = RecStatus::Failing;
+ curRecording->SaveVideoProperties(VID_DAMAGED, VID_DAMAGED);
+
+- QString desc = tr("Good signal seen after %1 ms")
+- .arg(genOpt.channel_timeout +
+- startRecordingDeadline.msecsTo(current_time));
+- QString title = curRecording->GetTitle();
+- if (!curRecording->GetSubtitle().isEmpty())
+- title += " - " + curRecording->GetSubtitle();
+-
+- MythNotification mn(MythNotification::Check, desc,
+- "Recording", title,
+- tr("See 'Tuning timeout' in mythtv-setup "
+- "for this input."));
+- gCoreContext->SendEvent(MythEvent(mn));
+-
+ LOG(VB_GENERAL, LOG_WARNING, LOC +
+ QString("It took longer than %1 ms to get a signal lock. "
+ "Keeping status of '%2'")
+@@ -4016,19 +4003,6 @@ MPEGStreamData *TVRec::TuningSignalCheck
+
+ SendMythSystemRecEvent("REC_FAILING", curRecording);
+
+- QString desc = tr("Taking more than %1 ms to get a lock.")
+- .arg(genOpt.channel_timeout);
+- QString title = curRecording->GetTitle();
+- if (!curRecording->GetSubtitle().isEmpty())
+- title += " - " + curRecording->GetSubtitle();
+-
+- MythNotification mn(MythNotification::Error, desc,
+- "Recording", title,
+- tr("See 'Tuning timeout' in mythtv-setup "
+- "for this input."));
+- mn.SetDuration(30);
+- gCoreContext->SendEvent(MythEvent(mn));
+-
+ LOG(VB_GENERAL, LOG_WARNING, LOC +
+ QString("TuningSignalCheck: taking more than %1 ms to get a lock. "
+ "marking this recording as '%2'.")
+
diff --git a/abs/core/mythtv/stable-30/mythtv/fixTranslations.patch b/abs/core/mythtv/stable-30/mythtv/fixTranslations.patch
new file mode 100644
index 0000000..ba2c4fe
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/fixTranslations.patch
@@ -0,0 +1,130 @@
+diff --git a/mythtv/programs/mythfrontend/audiogeneralsettings.h b/mythtv/programs/mythfrontend/audiogeneralsettings.h
+index 79aa41dd8d..46421a84c2 100644
+--- a/mythtv/programs/mythfrontend/audiogeneralsettings.h
++++ b/mythtv/programs/mythfrontend/audiogeneralsettings.h
+@@ -19,6 +19,8 @@ class AudioTest;
+
+ class AudioConfigScreen : public StandardSettingDialog
+ {
++ Q_OBJECT
++
+ public:
+ AudioConfigScreen(MythScreenStack *parent, const char *name,
+ GroupSetting *groupSetting);
+diff --git a/mythtv/programs/mythfrontend/globalsettings.cpp b/mythtv/programs/mythfrontend/globalsettings.cpp
+index 4507619170..0618f9762b 100644
+--- a/mythtv/programs/mythfrontend/globalsettings.cpp
++++ b/mythtv/programs/mythfrontend/globalsettings.cpp
+@@ -3871,7 +3871,7 @@ class PlayBackScaling : public GroupSetting
+ PlayBackScaling::PlayBackScaling()
+ :GroupSetting()
+ {
+- setLabel(tr("Scaling"));
++ setLabel(PlaybackSettings::tr("Scaling"));
+ addChild(m_VertScan = VertScanPercentage());
+ addChild(m_YScan = YScanDisplacement());
+ addChild(m_HorizScan = HorizScanPercentage());
+@@ -3894,7 +3894,7 @@ void PlayBackScaling::updateButton(MythUIButtonListItem *item)
+ m_HorizScan->getValue() == "0" &&
+ m_YScan->getValue() == "0" &&
+ m_XScan->getValue() == "0")
+- item->SetText(tr("No scaling"),"value");
++ item->SetText(PlaybackSettings::tr("No scaling"),"value");
+ else
+ item->SetText(QString("%1%x%2%+%3%+%4%")
+ .arg(m_HorizScan->getValue())
+@@ -4364,7 +4364,7 @@ ChannelCheckBoxSetting::ChannelCheckBoxSetting(uint chanid,
+ m_channelId(chanid)
+ {
+ setLabel(QString("%1 %2").arg(channum).arg(channame));
+- setHelpText(tr("Select/Unselect channels for this channel group"));
++ setHelpText(ChannelGroupSettings::tr("Select/Unselect channels for this channel group"));
+ }
+
+ ChannelGroupSetting::ChannelGroupSetting(const QString &groupName,
+diff --git a/mythtv/programs/mythfrontend/globalsettings.h b/mythtv/programs/mythfrontend/globalsettings.h
+index e069ec1cfb..8c1de7a02e 100644
+--- a/mythtv/programs/mythfrontend/globalsettings.h
++++ b/mythtv/programs/mythfrontend/globalsettings.h
+@@ -259,6 +259,8 @@ class PlaybackProfileConfig : public GroupSetting
+
+ class ChannelGroupSetting : public GroupSetting
+ {
++ Q_OBJECT
++
+ public:
+ ChannelGroupSetting(const QString &groupName, int groupId);
+ virtual void Load();
+diff --git a/mythtv/programs/mythtv-setup/backendsettings.cpp b/mythtv/programs/mythtv-setup/backendsettings.cpp
+index 6de0bae49d..bf24cc4f1a 100644
+--- a/mythtv/programs/mythtv-setup/backendsettings.cpp
++++ b/mythtv/programs/mythtv-setup/backendsettings.cpp
+@@ -126,11 +126,12 @@ class IpAddressSettings : public HostCheckBoxSetting
+ explicit IpAddressSettings(/*Setting* trigger*/) :
+ HostCheckBoxSetting("ListenOnAllIps")
+ {
+- setLabel(QObject::tr("Listen on All IP Addresses"));
++ setLabel(BackendSettings::tr("Listen on All IP Addresses"));
+ setValue(true);
+- setHelpText(tr("Allow this backend to receive connections on any IP "
+- "Address assigned to it. Recommended for most users "
+- "for ease and reliability."));
++ setHelpText(BackendSettings::tr("Allow this backend to receive "
++ "connections on any IP Address assigned to it. "
++ "Recommended for most users for ease and "
++ "reliability."));
+
+ localServerIP = LocalServerIP();
+ localServerIP6 = LocalServerIP6();
+diff --git a/mythtv/i18n/translate.pro b/mythtv/i18n/translate.pro
+index 210d9907f1..d51ec37ee5 100644
+--- a/mythtv/i18n/translate.pro
++++ b/mythtv/i18n/translate.pro
+@@ -10,6 +10,8 @@ SOURCES += ../libs/libmyth/audio/*.cpp
+ SOURCES += ../libs/libmyth/audio/*.h
+ SOURCES += ../libs/libmythmetadata/*.cpp
+ SOURCES += ../libs/libmythmetadata/*.h
++SOURCES += ../libs/libmythservicecontracts/enums/*.cpp
++SOURCES += ../libs/libmythservicecontracts/enums/*.h
+ SOURCES += ../libs/libmythtv/*.cpp
+ SOURCES += ../libs/libmythtv/*.h
+ SOURCES += ../libs/libmythtv/AirPlay/*.cpp
+diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
+index ea0aa806d5..710650dc95 100644
+--- a/mythtv/libs/libmythtv/tv_play.cpp
++++ b/mythtv/libs/libmythtv/tv_play.cpp
+@@ -12018,7 +12018,7 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
+ if (m_tvm_canupmix)
+ {
+ active = m_tvm_upmixing;
+- BUTTON(actionName, tr("Auto Detect"));
++ BUTTON(actionName, tr("Enable Audio Upmixer"));
+ }
+ }
+ else if (actionName == "AUTODETECT_FILL")
+@@ -12035,6 +12035,14 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
+ {
+ BUTTON(actionName, tr("Manual Zoom Mode"));
+ }
++ else if (actionName == "BOTTOMLINEMOVE")
++ {
++ BUTTON(actionName, tr("Move BottomLine off screen"));
++ }
++ else if (actionName == "BOTTOMLINESAVE")
++ {
++ BUTTON(actionName, tr("Save manual zoom for BottomLine"));
++ }
+ else if (actionName == "TOGGLENIGHTMODE")
+ {
+ if (m_tvm_sup != kPictureAttributeSupported_None)
+@@ -12222,6 +12230,10 @@ bool TV::MenuItemDisplayPlayback(const MenuItemContext &c)
+ BUTTON2(actionName, tr("DVD Root Menu"), tr("Top menu"));
+ }
+ }
++ else if (actionName == "JUMPBKMRK")
++ {
++ BUTTON(actionName, tr("Jump to bookmark"));
++ }
+ else if (actionName == "JUMPTOPOPUPMENU")
+ {
+ if (m_tvm_isbd)
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/HOST_SETTINGS.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/HOST_SETTINGS.xml
new file mode 100644
index 0000000..c9ec7fa
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/HOST_SETTINGS.xml
@@ -0,0 +1,114 @@
+<mythmenu name="HOST_SETTINGS">
+ <button>
+ <type>MV_ACCESS_SETUP_MENU</type>
+ <text>Access</text>
+ <description>Manage which LinHES Settings can be used</description>
+ <action>EXEC mythinstall -s accesscontrol </action>
+ </button>
+
+ <button>
+ <type>MV_ADVANCED_SETUP_MENU</type>
+ <text>Advanced</text>
+ <description>Manage various Advanced Settings</description>
+ <action>EXEC mythinstall -s advanced</action>
+ </button>
+
+ <button>
+ <type>MV_AUDIO_SETUP_MENU</type>
+ <text>Audio</text>
+ <description>Manage Audio drivers, cards &amp; devices</description>
+ <action>EXEC mythinstall -s sound </action>
+ </button>
+
+ <button>
+ <type>MV_ADVANCED_X_SETUP_MENU</type>
+ <text>Display</text>
+ <description>Set the display resolution</description>
+ <action>EXEC mythinstall -s advancedX</action>
+ </button>
+
+ <button>
+ <type>MV_NETWORK_SETUP_MENU</type>
+ <text>Dynamic DNS</text>
+ <description>Manage your dyndns.com account</description>
+ <action>EXEC mythinstall -s ddns </action>
+ </button>
+
+ <button>
+ <type>MV_FILESHARES_MENU</type>
+ <text>File Sharing</text>
+ <description>Manage file sharing via NFS or SMB</description>
+ <action>EXEC mythinstall -s fileshare</action>
+ </button>
+
+ <button>
+ <type>MV_SYSTEM_SETUP_MENU</type>
+ <text>Host</text>
+ <description>Manage LinHES system type, pointer size &amp; MythWelcome</description>
+ <action>EXEC mythinstall -s hostype </action>
+ </button>
+
+ <button>
+ <type>MV_MISC_SETUP_MENU</type>
+ <text>Miscellaneous</text>
+ <description>Set timezone, shortcuts &amp; auto updates</description>
+ <action>EXEC mythinstall -s misc </action>
+ </button>
+
+ <button>
+ <type>MV_NETWORK_SETUP_MENU</type>
+ <text>Network</text>
+ <description>Manage network devices &amp; hostname</description>
+ <action>EXEC mythinstall -s network </action>
+ </button>
+
+ <button>
+ <type>MV_SOFTWARE_MENU</type>
+ <text>Programs</text>
+ <description>Manage programs for LinHES</description>
+ <action>EXEC mythinstall -s plugins,software </action>
+ </button>
+
+ <button>
+ <type>MV_IR_SETUP_MENU</type>
+ <text>Remotes</text>
+ <description>Manage remotes, receivers &amp; blasters</description>
+ <action>EXEC mythinstall -s ir </action>
+ </button>
+
+ <button>
+ <type>MV_SCREENSAVER_SETUP_MENU</type>
+ <text>Screensaver</text>
+ <description>Manage the Screensaver</description>
+ <action>EXEC mythinstall -s screensaver </action>
+ </button>
+
+ <button>
+ <type>MV_VNC_SETUP_MENU</type>
+ <text>Screen Sharing</text>
+ <description>Manage VNC and XVNC screen sharing</description>
+ <action>EXEC mythinstall -s vnc </action>
+ </button>
+
+ <button>
+ <type>MV_SHUTDOWN_SETUP_MENU</type>
+ <text>Shutdown</text>
+ <description>Set when to turn off LinHES</description>
+ <action>EXEC mythinstall -s sleep </action>
+ </button>
+<!-- disabled in the db so no need to show
+ <button>
+ <type>MV_USER_SETUP_MENU</type>
+ <text>User Accounts</text>
+ <description>Manage Users on LinHES</description>
+ <action>EXEC mythinstall -s user </action>
+ </button>
+-->
+ <button>
+ <type>MV_WEBACCESS_SETUP_MENU</type>
+ <text>Web Security</text>
+ <description>Manage local website security</description>
+ <action>EXEC mythinstall -s webuser </action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/dvd_backup.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/dvd_backup.xml
new file mode 100644
index 0000000..2647d81
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/dvd_backup.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<mythmenu name="OPTICAL_DISK">
+
+ <button>
+ <type>DVD_RIP</type>
+ <text>Mirror DVD</text>
+ <description>Creates a mirror of your DVD</description>
+ <action>EXEC /usr/LH/bin/ripD_eject.sh m &amp;</action>
+ </button>
+
+ <button>
+ <type>DVD_RIP</type>
+ <text>ISO of DVD</text>
+ <description>Creates an ISO of your DVD</description>
+ <action>EXEC /usr/LH/bin/ripD_eject.sh i &amp;</action>
+ </button>
+
+ <button>
+ <type>DVD_RIP</type>
+ <text>High Quality</text>
+ <description>Creates a high quality MPEG4 of your DVD</description>
+ <action>EXEC /usr/LH/bin/ripD_eject.sh h &amp;</action>
+ </button>
+
+ <button>
+ <type>DVD_RIP</type>
+ <text>Normal Quality</text>
+ <description>Creates a normal quality MPEG4 of your DVD</description>
+ <action>EXEC /usr/LH/bin/ripD_eject.sh n &amp;</action>
+ </button>
+
+ <button>
+ <type>DVD_RIP</type>
+ <text>Low Quality</text>
+ <description>Creates a low quality MPEG4 of your DVD</description>
+ <action>EXEC /usr/LH/bin/ripD_eject.sh l &amp;</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/game.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/game.xml
new file mode 100644
index 0000000..293a9e6
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/game.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<mythmenu name="GAME">
+
+ <button>
+ <type>GAME</type>
+ <text>MythGame</text>
+ <description>Play video games</description>
+ <action>PLUGIN mythgame</action>
+ <depends>mythgame</depends>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/info_menu.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/info_menu.xml
new file mode 100644
index 0000000..017f90b
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/info_menu.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<mythmenu name="INFO">
+
+ <button>
+ <type>NEWS</type>
+ <text>News Feeds</text>
+ <description>Keep up with the news</description>
+ <action>PLUGIN mythnews</action>
+ <depends>mythnews</depends>
+ </button>
+
+ <button>
+ <type>MYTHTWITTER_TIMELINE</type>
+ <text>Twitter</text>
+ <description>Send and receive tweets</description>
+ <action>JUMP MythTwitter_Timeline</action>
+ <depends>mythtwitter</depends>
+ </button>
+
+ <button>
+ <type>WEATHER</type>
+ <text>Weather</text>
+ <action>PLUGIN mythweather</action>
+ <description>Local weather forecast</description>
+ <depends>mythweather</depends>
+ </button>
+
+ <button>
+ <type>WEATHER</type>
+ <text>Weather Station</text>
+ <action>PLUGIN mythwstation</action>
+ <depends>mythwstation</depends>
+ </button>
+
+ <button>
+ <type>WEBPAGE</type>
+ <text>Web</text>
+ <description>Browse the web</description>
+ <action>PLUGIN mythbrowser</action>
+ <depends>mythbrowser</depends>
+ </button>
+
+ <button>
+ <type>RECIPE</type>
+ <text>Recipes</text>
+ <description>Start cooking!</description>
+ <action>PLUGIN mythRecipe</action>
+ <depends>mythrecipe</depends>
+ </button>
+
+ <button>
+ <type>TV_STATUS</type>
+ <text>System Status</text>
+ <description>See what your system is doing</description>
+ <action>TV_STATUS</action>
+ </button>
+
+ <button>
+ <type>ZONEMINDER</type>
+ <text>ZoneMinder</text>
+ <description>Home surveillance</description>
+ <action>PLUGIN mythzoneminder</action>
+ <depends>mythzoneminder</depends>
+ </button>
+
+<!--
+ <button>
+ <type>SMOLT</type>
+ <text>Hardware profile</text>
+ <description>Tell us what hardware you have so we can support it</description>
+ <action>PLUGIN mythsmolt</action>
+ <depends>mythsmolt</depends>
+ </button>
+ -->
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/is.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/is.xml
new file mode 100644
index 0000000..19efc34
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/is.xml
@@ -0,0 +1,3 @@
+<mythmenu name="INTERNET_STREAMS">
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/lh_backend_control.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/lh_backend_control.xml
new file mode 100644
index 0000000..0b0cc17
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/lh_backend_control.xml
@@ -0,0 +1,24 @@
+<mythmenu name="LH_BACKEND">
+
+ <button>
+ <type></type>
+ <text>Start MythBackend</text>
+ <description>Start the Master MythBackend</description>
+ <action>EXEC lh_backend_control.sh start</action>
+ </button>
+
+ <button>
+ <type></type>
+ <text>Stop MythBackend</text>
+ <description>Stop the Master MythBackend</description>
+ <action>EXEC lh_backend_control.sh stop</action>
+ </button>
+
+ <button>
+ <type></type>
+ <text>Restart MythBackend</text>
+ <description>Restart the Master MythBackend</description>
+ <action>EXEC lh_backend_control.sh restart</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/library.xml.patch b/abs/core/mythtv/stable-30/mythtv/menu-xml/library.xml.patch
new file mode 100644
index 0000000..0c0177a
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/library.xml.patch
@@ -0,0 +1,25 @@
+--- themes/defaultmenu/library.xml.orig 2014-11-26 20:21:35.092552944 +0000
++++ themes/defaultmenu/library.xml 2014-11-26 20:22:43.103983263 +0000
+@@ -56,6 +56,13 @@
+ </button>
+
+ <button>
++ <type>STREAM</type>
++ <text>Online Content</text>
++ <description>Play content from online sources</description>
++ <action>MENU gen_is.xml</action>
++ </button>
++
++ <button>
+ <type>IMAGES</type>
+ <text>Image Gallery</text>
+ <description>Look at Pictures</description>
+@@ -67,7 +74,7 @@
+ <type>GAME</type>
+ <text>Play Games</text>
+ <description>Play video games</description>
+- <action>PLUGIN mythgame</action>
++ <action>MENU game.xml</action>
+ <depends>mythgame</depends>
+ </button>
+
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/linhes.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/linhes.xml
new file mode 100644
index 0000000..fe7640d
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/linhes.xml
@@ -0,0 +1,70 @@
+<mythmenu name="LH_SERVICE_MENU">
+
+ <button>
+ <type>SETUP_GENERAL</type>
+ <text>MythTV Settings</text>
+ <text lang="IT">Impostazioni</text>
+ <text lang="ES">Configuración</text>
+ <text lang="DE">Zubehör / Konfiguration</text>
+ <text lang="DA">Tilbehør/Indstillinger</text>
+ <text lang="IS">Uppsetning</text>
+ <text lang="NL">Configuratie</text>
+ <text lang="PT">Utensílios</text>
+ <text lang="SV">Verktyg / Inställningar</text>
+ <text lang="JA">設~Z</text>
+ <text lang="FI">Oheis/Asetukset</text>
+ <text lang="ZH_TW">工~E/設~Z</text>
+ <text lang="SL">Nastavitve</text>
+ <text lang="ET">Utiliidid / sätted</text>
+ <text lang="RU">У~Bили~B~K / ~]а~A~B~@ойки</text>
+ <text lang="AR">تضب~Jطات</text>
+ <text lang="PL">Narz~Ydzia / ustawienia</text>
+ <text lang="HE">ע~Vר~Y~] / ~T~R~Sר~Uת</text>
+ <text lang="HU">Eszközök / Beállítások</text>
+ <alttext lang="DE">Verschiedenes</alttext>
+ <alttext lang="SV">Inställningar</alttext>
+ <alttext lang="ET">Sätted</alttext>
+ <alttext lang="RU">~]а~A~B~@ойки</alttext>
+ <alttext lang="AR">تضب~Jطات</alttext>
+ <description>Configure MythTV and Plugins</description>
+ <description lang="DE">MythTV und Plugins konfigurieren</description>
+ <action>MENU util_menu.xml</action>
+ </button>
+
+ <button>
+ <type>LINHES_SETUP</type>
+ <text>LinHES Settings</text>
+ <description>Configure the LinHES System</description>
+ <action>MENU HOST_SETTINGS.xml</action>
+ </button>
+
+ <button>
+ <type>TOOLS</type>
+ <text>LinHES Tools</text>
+ <description>Utilities for LinHES System</description>
+ <action>MENU linhes_tools.xml</action>
+ </button>
+
+ <button>
+ <type>BACKUP</type>
+ <text>Backup LinHES</text>
+ <description>Backup the LinHES System</description>
+ <action>MENU mythbackup.xml</action>
+ </button>
+
+ <button>
+ <type>RESTORE</type>
+ <text>Restore LinHES</text>
+ <description>Restore the LinHES System</description>
+ <action>MENU mythrestore.xml</action>
+ </button>
+
+<!--#Check for updates-->
+ <button>
+ <type>UPGRADE</type>
+ <text>Update LinHES</text>
+ <description>Update the LinHES System</description>
+ <action>MENU update.xml</action>
+ </button>
+<!--#Check for updates-->
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/linhes_tools.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/linhes_tools.xml
new file mode 100644
index 0000000..feabe8e
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/linhes_tools.xml
@@ -0,0 +1,31 @@
+<mythmenu name="LH_TOOLS">
+
+ <button>
+ <type></type>
+ <text>Show Help</text>
+ <description>Display the LinHES help screen</description>
+ <action>EXEC mythinstall -H</action>
+ </button>
+
+ <button>
+ <type></type>
+ <text>Toggle Pointer</text>
+ <description>Show/Hide the mouse pointer</description>
+ <action>EXEC unclutter-toggle.sh</action>
+ </button>
+
+ <button>
+ <type></type>
+ <text>MythBackend</text>
+ <description>Start/Stop MythBackend</description>
+ <action>MENU lh_backend_control.xml</action>
+ </button>
+
+ <button>
+ <type></type>
+ <text>MythTV-Setup</text>
+ <description>Open mythtv-setup</description>
+ <action>EXEC mythtv-setup</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/mainmenu.xml.patch b/abs/core/mythtv/stable-30/mythtv/menu-xml/mainmenu.xml.patch
new file mode 100644
index 0000000..3ddce0b
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/mainmenu.xml.patch
@@ -0,0 +1,15 @@
+--- themes/defaultmenu/mainmenu.xml.orig 2014-09-02 20:03:34.658600292 +0000
++++ themes/defaultmenu/mainmenu.xml 2014-09-03 15:49:34.820056829 +0000
+@@ -45,9 +45,9 @@
+
+ <button>
+ <type>MENU_UTILITIES_SETUP</type>
+- <text>Setup</text>
+- <description>Configure MythTV and plugins</description>
+- <action>MENU main_settings.xml</action>
++ <text>Service Menu</text>
++ <description>Configure your system</description>
++ <action>MENU linhes.xml</action>
+ <password>SetupPinCode</password>
+ </button>
+
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/mythbackup.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/mythbackup.xml
new file mode 100644
index 0000000..176591b
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/mythbackup.xml
@@ -0,0 +1,22 @@
+<mythmenu name="LH_BACKUP">
+ <button>
+ <type>BACKUP</type>
+ <text>Backup Now?</text>
+ <description></description>
+ <action>NONE</action>
+ </button>
+
+ <button>
+ <type>BACKUP</type>
+ <text>Yes</text>
+ <description>Start Backup</description>
+ <action>EXEC sudo /usr/LH/bin/lh_system_backup &amp;</action>
+ </button>
+
+ <button>
+ <type>JUMP_RELOAD_THEME</type>
+ <text>No</text>
+ <description>Return to Main Menu</description>
+ <action>JUMP Reload Theme</action>
+ </button>
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/mythrestore.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/mythrestore.xml
new file mode 100644
index 0000000..d37ba2b
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/mythrestore.xml
@@ -0,0 +1,24 @@
+<mythmenu name="LH_RESTORE">
+
+ <button>
+ <type>RESTORE</type>
+ <text>Restore Now?</text>
+ <description>Restore the database from the most recent backup</description>
+ <action>NONE</action>
+ </button>
+
+ <button>
+ <type>RESTORE</type>
+ <text>Yes</text>
+ <description>Start Restore</description>
+ <action>EXEC sudo /usr/LH/bin/lh_system_restore &amp;</action>
+ </button>
+
+ <button>
+ <type>JUMP_RELOAD_THEME</type>
+ <text>No</text>
+ <description>Return to Main Menu</description>
+ <action>JUMP Reload Theme</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/optical_menu.xml.patch b/abs/core/mythtv/stable-30/mythtv/menu-xml/optical_menu.xml.patch
new file mode 100644
index 0000000..b836e85
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/optical_menu.xml.patch
@@ -0,0 +1,23 @@
+--- themes/defaultmenu/optical_menu.xml.orig 2012-05-02 18:41:38.000000000 +0000
++++ themes/defaultmenu/optical_menu.xml 2012-07-30 05:33:03.000000000 +0000
+@@ -17,6 +17,20 @@
+ </button>
+
+ <button>
++ <type>DVD_RIP</type>
++ <text>Backup DVD</text>
++ <description>Backup your DVDs</description>
++ <action>MENU dvd_backup.xml</action>
++ </button>
++
++ <button>
++ <type>DVD_RIP</type>
++ <text>Import Files from DVD</text>
++ <description>Import all files from a data DVD</description>
++ <action>EXEC /usr/LH/bin/importfiles.sh &amp;</action>
++ </button>
++
++ <button>
+ <type>MUSIC_RIP</type>
+ <text>Import CD</text>
+ <description>Import music from an audio CD</description>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/original/create_patch.sh b/abs/core/mythtv/stable-30/mythtv/menu-xml/original/create_patch.sh
new file mode 100644
index 0000000..34d8b8c
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/original/create_patch.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+for i in *.xml
+do
+ diff -u $i.orig $i > ../$i.patch
+done
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/siriusmenu.xml.del b/abs/core/mythtv/stable-30/mythtv/menu-xml/siriusmenu.xml.del
new file mode 100644
index 0000000..e317b36
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/siriusmenu.xml.del
@@ -0,0 +1,419 @@
+<mythmenu name="SIRIUS">
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Hits 1</text>
+ <action>EXEC /usr/bin/cliSipie siriushits1</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>StarLite</text>
+ <action>EXEC /usr/bin/cliSipie starlite</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Love</text>
+ <action>EXEC /usr/bin/cliSipie siriuslove</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Movin EZ</text>
+ <action>EXEC /usr/bin/cliSipie movineasy</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Gold</text>
+ <action>EXEC /usr/bin/cliSipie siriusgold</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>'60s Vibrations</text>
+ <action>EXEC /usr/bin/cliSipie 60svibrations</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Totally '70s</text>
+ <action>EXEC /usr/bin/cliSipie totally70s</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Big '80s</text>
+ <action>EXEC /usr/bin/cliSipie big80s</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>ThePulse</text>
+ <action>EXEC /usr/bin/cliSipie thepulse</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Bridge</text>
+ <action>EXEC /usr/bin/cliSipie thebridge</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>BBC Radio 1</text>
+ <action>EXEC /usr/bin/cliSipie bbcradio1</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Super Shuffle</text>
+ <action>EXEC /usr/bin/cliSipie supershuffle</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Elvis Radio</text>
+ <action>EXEC /usr/bin/cliSipie elvisradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Classic Vinyl</text>
+ <action>EXEC /usr/bin/cliSipie classicvinyl</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Classic Rewind</text>
+ <action>EXEC /usr/bin/cliSipie classicrewind</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>TheVault</text>
+ <action>EXEC /usr/bin/cliSipie thevault</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Jam_ON</text>
+ <action>EXEC /usr/bin/cliSipie jamon</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Spectrum</text>
+ <action>EXEC /usr/bin/cliSipie thespectrum</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>BuzzSaw</text>
+ <action>EXEC /usr/bin/cliSipie buzzsaw</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Octane</text>
+ <action>EXEC /usr/bin/cliSipie octane</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Alt Nation</text>
+ <action>EXEC /usr/bin/cliSipie altnation</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>1st Wave</text>
+ <action>EXEC /usr/bin/cliSipie firstwave</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hair Nation</text>
+ <action>EXEC /usr/bin/cliSipie hairnation</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>'90s Alternative</text>
+ <action>EXEC /usr/bin/cliSipie 90salternative</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Garage</text>
+ <action>EXEC /usr/bin/cliSipie undergroundgarage</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Left of Center</text>
+ <action>EXEC /usr/bin/cliSipie leftofcenter</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hard Attack</text>
+ <action>EXEC /usr/bin/cliSipie hardattack</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Faction</text>
+ <action>EXEC /usr/bin/cliSipie faction</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Punk</text>
+ <action>EXEC /usr/bin/cliSipie punk</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>The Coffee House</text>
+ <action>EXEC /usr/bin/cliSipie coffeehouse</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Margaritaville</text>
+ <action>EXEC /usr/bin/cliSipie radiomargaritaville</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Disorder</text>
+ <action>EXEC /usr/bin/cliSipie siriusdisorder</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Reggae</text>
+ <action>EXEC /usr/bin/cliSipie reggaerhythms</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Area 33</text>
+ <action>EXEC /usr/bin/cliSipie area33</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Boombox</text>
+ <action>EXEC /usr/bin/cliSipie boombox</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Chill</text>
+ <action>EXEC /usr/bin/cliSipie chill</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>The Beat</text>
+ <action>EXEC /usr/bin/cliSipie thebeat</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Strobe</text>
+ <action>EXEC /usr/bin/cliSipie thestrobe</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hip-Hop Nation</text>
+ <action>EXEC /usr/bin/cliSipie hiphopnation</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>BackSpin</text>
+ <action>EXEC /usr/bin/cliSipie backspin</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Shade 45</text>
+ <action>EXEC /usr/bin/cliSipie shade45</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Hot Jamz</text>
+ <action>EXEC /usr/bin/cliSipie hotjamz</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Heart &amp; Soul</text>
+ <action>EXEC /usr/bin/cliSipie heartandsoul</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>SoulTown</text>
+ <action>EXEC /usr/bin/cliSipie soultown</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>New Country</text>
+ <action>EXEC /usr/bin/cliSipie newcountry</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Prime Country</text>
+ <action>EXEC /usr/bin/cliSipie primecountry</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Roadhouse</text>
+ <action>EXEC /usr/bin/cliSipie theroadhouse</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Outlaw Country</text>
+ <action>EXEC /usr/bin/cliSipie outlawcountry</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Bluegrass</text>
+ <action>EXEC /usr/bin/cliSipie bluegrass</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Spirit</text>
+ <action>EXEC /usr/bin/cliSipie spirit</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Praise</text>
+ <action>EXEC /usr/bin/cliSipie praise</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Planet Jazz</text>
+ <action>EXEC /usr/bin/cliSipie planetjazz</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>JazzCafe</text>
+ <action>EXEC /usr/bin/cliSipie jazzcafe</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>PureJazz</text>
+ <action>EXEC /usr/bin/cliSipie purejazz</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Spa 73</text>
+ <action>EXEC /usr/bin/cliSipie spa73</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Blues</text>
+ <action>EXEC /usr/bin/cliSipie siriusblues</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Siriusly Sinatra</text>
+ <action>EXEC /usr/bin/cliSipie siriuslysinatra</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Broadway's Best</text>
+ <action>EXEC /usr/bin/cliSipie broadwaysbest</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Symphony Hall</text>
+ <action>EXEC /usr/bin/cliSipie symphonyhall</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Met Opera Radio</text>
+ <action>EXEC /usr/bin/cliSipie metropolitanopera</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Pops</text>
+ <action>EXEC /usr/bin/cliSipie siriuspops</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Universo Latino</text>
+ <action>EXEC /usr/bin/cliSipie universolatino</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Rumbon</text>
+ <action>EXEC /usr/bin/cliSipie rumbon</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Martha Stewart</text>
+ <action>EXEC /usr/bin/cliSipie marthastewartlivingradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius Stars</text>
+ <action>EXEC /usr/bin/cliSipie siriusstars</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>OutQ Gay Radio</text>
+ <action>EXEC /usr/bin/cliSipie siriusoutq</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Patriot</text>
+ <action>EXEC /usr/bin/cliSipie siriuspatriot</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Left</text>
+ <action>EXEC /usr/bin/cliSipie siriusleft</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>CNN</text>
+ <action>EXEC /usr/bin/cliSipie cnn</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>wrn</text>
+ <action>EXEC /usr/bin/cliSipie wrn</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Blue Collar Comedy</text>
+ <action>EXEC /usr/bin/cliSipie bluecollarcomedy</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Raw Dog Comedy</text>
+ <action>EXEC /usr/bin/cliSipie rawdog</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Laugh Break Comedy</text>
+ <action>EXEC /usr/bin/cliSipie laughbreak</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>thefoxxhole</text>
+ <action>EXEC /usr/bin/cliSipie thefoxxhole</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>lime</text>
+ <action>EXEC /usr/bin/cliSipie lime</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Kids Stuff</text>
+ <action>EXEC /usr/bin/cliSipie kidsstuff</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Catholic Channel</text>
+ <action>EXEC /usr/bin/cliSipie thecatholicchannel</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>EWTN</text>
+ <action>EXEC /usr/bin/cliSipie ewtnglobal</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>christiantalk</text>
+ <action>EXEC /usr/bin/cliSipie christiantalk</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Sirius NFL Radio</text>
+ <action>EXEC /usr/bin/cliSipie siriusnflradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Maxim Radio</text>
+ <action>EXEC /usr/bin/cliSipie maximradio</action>
+ </button>
+ <button>
+ <type>MUSIC</type>
+ <text>Cosmo Radio</text>
+ <action>EXEC /usr/bin/cliSipie cosmopolitanradio</action>
+ </button>
+ <button>
+ <type>TV_DELETE</type>
+ <text>Stop Listening</text>
+ <action>EXEC /usr/bin/sipie_kill</action>
+ </button>
+
+</mythmenu>
+
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/update.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/update.xml
new file mode 100644
index 0000000..2d47e7d
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/update.xml
@@ -0,0 +1,11 @@
+<mythmenu name="LH_UPDATE">
+
+ <button>
+ <type>JUMP Reload Theme</type>
+ <text>Check for Updates</text>
+ <description>Search for LinHES system updates</description>
+ <action>EXEC sudo /usr/LH/bin/linhes_update.sh</action>
+ <action>JUMP Reload Theme</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/update2.xml b/abs/core/mythtv/stable-30/mythtv/menu-xml/update2.xml
new file mode 100644
index 0000000..4eee8cc
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/update2.xml
@@ -0,0 +1,25 @@
+<mythmenu name="LH_UPDATE">
+
+ <button>
+ <type>UPGRADE</type>
+ <text>Install Updates</text>
+ <description>Install updates for the LinHES system</description>
+ <action>EXEC sudo /usr/LH/bin/linhes_update2.sh install</action>
+ <action>JUMP Reload Theme</action>
+ </button>
+
+ <button>
+ <type>JUMP_RELOAD_THEME</type>
+ <text>Cancel Updates</text>
+ <description>Return to Main Menu</description>
+ <action>EXEC sudo /usr/LH/bin/linhes_update2.sh</action>
+ <action>JUMP Reload Theme</action>
+ </button>
+
+ <button>
+ <type>UPGRADE</type>
+ <text>View Updates</text>
+ <description>Displays the packages to be updated</description>
+ <action>MENU update3.xml</action>
+ </button>
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/menu-xml/xmmenu.xml.del b/abs/core/mythtv/stable-30/mythtv/menu-xml/xmmenu.xml.del
new file mode 100644
index 0000000..6b26d11
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/menu-xml/xmmenu.xml.del
@@ -0,0 +1,574 @@
+<!-- Current as of April 25, 2007 -->
+<mythmenu name="XM">
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '40s</text>
+ <action>EXEC /usr/bin/xamp kill 4</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '50s</text>
+ <action>EXEC /usr/bin/xamp kill 5</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '60s</text>
+ <action>EXEC /usr/bin/xamp kill 6</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '70s</text>
+ <action>EXEC /usr/bin/xamp kill 7</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '80s</text>
+ <action>EXEC /usr/bin/xamp kill 8</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The '90s</text>
+ <action>EXEC /usr/bin/xamp kill 9</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>America</text>
+ <action>EXEC /usr/bin/xamp kill 10</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>X Country</text>
+ <action>EXEC /usr/bin/xamp kill 12</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Willie's Place</text>
+ <action>EXEC /usr/bin/xamp kill 13</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Bluegrass Junction</text>
+ <action>EXEC /usr/bin/xamp kill 14</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Village</text>
+ <action>EXEC /usr/bin/xamp kill 15</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Highway 16</text>
+ <action>EXEC /usr/bin/xamp kill 16</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>US Country</text>
+ <action>EXEC /usr/bin/xamp kill 17</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>20 on 20</text>
+ <action>EXEC /usr/bin/xamp kill 20</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Heart</text>
+ <action>EXEC /usr/bin/xamp kill 23</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Blend</text>
+ <action>EXEC /usr/bin/xamp kill 25</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Flight 26</text>
+ <action>EXEC /usr/bin/xamp kill 26</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Cinemagic</text>
+ <action>EXEC /usr/bin/xamp kill 27</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>On Broadway</text>
+ <action>EXEC /usr/bin/xamp kill 28</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>U-Pop</text>
+ <action>EXEC /usr/bin/xamp kill 29</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Hitlist</text>
+ <action>EXEC /usr/bin/xamp kill 30</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Torch</text>
+ <action>EXEC /usr/bin/xamp kill 31</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Message</text>
+ <action>EXEC /usr/bin/xamp kill 32</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Spirit</text>
+ <action>EXEC /usr/bin/xamp kill 33</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>enLighten</text>
+ <action>EXEC /usr/bin/xamp kill 34</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Deep Tracks</text>
+ <action>EXEC /usr/bin/xamp kill 40</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Boneyard</text>
+ <action>EXEC /usr/bin/xamp kill 41</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Liquid Metal</text>
+ <action>EXEC /usr/bin/xamp kill 42</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XMU</text>
+ <action>EXEC /usr/bin/xamp kill 43</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fred</text>
+ <action>EXEC /usr/bin/xamp kill 44</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Cafe</text>
+ <action>EXEC /usr/bin/xamp kill 45</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Top Tracks</text>
+ <action>EXEC /usr/bin/xamp kill 46</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Ethel</text>
+ <action>EXEC /usr/bin/xamp kill 47</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Squizz</text>
+ <action>EXEC /usr/bin/xamp kill 48</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Big Tracks</text>
+ <action>EXEC /usr/bin/xamp kill 49</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Loft</text>
+ <action>EXEC /usr/bin/xamp kill 50</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Music Lab</text>
+ <action>EXEC /usr/bin/xamp kill 51</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Verge</text>
+ <action>EXEC /usr/bin/xamp kill 52</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fungus</text>
+ <action>EXEC /usr/bin/xamp kill 53</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Lucy</text>
+ <action>EXEC /usr/bin/xamp kill 54</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Soul Street</text>
+ <action>EXEC /usr/bin/xamp kill 60</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Flow</text>
+ <action>EXEC /usr/bin/xamp kill 61</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Suite 62</text>
+ <action>EXEC /usr/bin/xamp kill 62</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Groove</text>
+ <action>EXEC /usr/bin/xamp kill 64</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Rhyme</text>
+ <action>EXEC /usr/bin/xamp kill 65</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>RAW</text>
+ <action>EXEC /usr/bin/xamp kill 66</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The City</text>
+ <action>EXEC /usr/bin/xamp kill 67</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Heat</text>
+ <action>EXEC /usr/bin/xamp kill 68</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Real Jazz</text>
+ <action>EXEC /usr/bin/xamp kill 70</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Watercolors</text>
+ <action>EXEC /usr/bin/xamp kill 71</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Beyond Jazz</text>
+ <action>EXEC /usr/bin/xamp kill 72</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>High Standards</text>
+ <action>EXEC /usr/bin/xamp kill 73</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Bluesville</text>
+ <action>EXEC /usr/bin/xamp kill 74</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Hear Music</text>
+ <action>EXEC /usr/bin/xamp kill 75</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fine Tuning</text>
+ <action>EXEC /usr/bin/xamp kill 76</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Audio Visions</text>
+ <action>EXEC /usr/bin/xamp kill 77</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Escape</text>
+ <action>EXEC /usr/bin/xamp kill 78</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>On The Rocks</text>
+ <action>EXEC /usr/bin/xamp kill 79</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Move</text>
+ <action>EXEC /usr/bin/xamp kill 80</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>BPM</text>
+ <action>EXEC /usr/bin/xamp kill 81</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The System</text>
+ <action>EXEC /usr/bin/xamp kill 82</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Chrome</text>
+ <action>EXEC /usr/bin/xamp kill 83</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM-Chill</text>
+ <action>EXEC /usr/bin/xamp kill 84</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Fuego</text>
+ <action>EXEC /usr/bin/xamp kill 90</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Viva</text>
+ <action>EXEC /usr/bin/xamp kill 91</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Aguila</text>
+ <action>EXEC /usr/bin/xamp kill 92</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Caliente</text>
+ <action>EXEC /usr/bin/xamp kill 94</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Luna</text>
+ <action>EXEC /usr/bin/xamp kill 95</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Air Musique</text>
+ <action>EXEC /usr/bin/xamp kill 100</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Joint</text>
+ <action>EXEC /usr/bin/xamp kill 101</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Sur La Route</text>
+ <action>EXEC /usr/bin/xamp kill 102</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>World Zone</text>
+ <action>EXEC /usr/bin/xamp kill 103</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Ngoma</text>
+ <action>EXEC /usr/bin/xamp kill 104</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Classics</text>
+ <action>EXEC /usr/bin/xamp kill 110</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Vox</text>
+ <action>EXEC /usr/bin/xamp kill 112</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Pops</text>
+ <action>EXEC /usr/bin/xamp kill 113</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Kids</text>
+ <action>EXEC /usr/bin/xamp kill 116</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Bob Edwards Show</text>
+ <action>EXEC /usr/bin/xamp kill 133</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>XM Comedy</text>
+ <action>EXEC /usr/bin/xamp kill 150</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Laugh USA</text>
+ <action>EXEC /usr/bin/xamp kill 151</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Special X</text>
+ <action>EXEC /usr/bin/xamp kill 154</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Agenda</text>
+ <action>EXEC /usr/bin/xamp kill 134</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Oprah and Friends</text>
+ <action>EXEC /usr/bin/xamp kill 156</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>The Virus</text>
+ <action>EXEC /usr/bin/xamp kill 202</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>1 Hit Wonders</text>
+ <action>EXEC /usr/bin/xamp kill 300</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Metalcore</text>
+ <action>EXEC /usr/bin/xamp kill 301</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Indie First</text>
+ <action>EXEC /usr/bin/xamp kill 302</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Late Night Mix</text>
+ <action>EXEC /usr/bin/xamp kill 303</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Sessions@AOL</text>
+ <action>EXEC /usr/bin/xamp kill 304</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>Shuffle</text>
+ <action>EXEC /usr/bin/xamp kill 305</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Rock First</text>
+ <action>EXEC /usr/bin/xamp kill 306</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Country First</text>
+ <action>EXEC /usr/bin/xamp kill 307</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Hip Hop First</text>
+ <action>EXEC /usr/bin/xamp kill 308</action>
+ </button>
+
+ <button>
+ <type>MUSIC</type>
+ <text>New Pop First</text>
+ <action>EXEC /usr/bin/xamp kill 309</action>
+ </button>
+
+ <button>
+ <type>TV_DELETE</type>
+ <text>Stop Listening</text>
+ <action>EXEC /usr/bin/xamp kill</action>
+ </button>
+
+</mythmenu>
diff --git a/abs/core/mythtv/stable-30/mythtv/myth_settings.patch b/abs/core/mythtv/stable-30/mythtv/myth_settings.patch
new file mode 100644
index 0000000..aebff2a
--- /dev/null
+++ b/abs/core/mythtv/stable-30/mythtv/myth_settings.patch
@@ -0,0 +1,1960 @@
+commit 0bfb6515f1c6f10d4d9d5d7297ca56a18ac3c138
+Author: James Meyer <james.meyer@operamail.com>
+Date: Sun Nov 17 18:58:50 2013 -0600
+
+ mythutil updated with myth_settings for .27
+
+diff --git a/mythtv/libs/libmythbase/mythcorecontext.cpp b/mythtv/libs/libmythbase/mythcorecontext.cpp
+index e9cc880..4f7a3bd 100644
+--- a/mythtv/libs/libmythbase/mythcorecontext.cpp
++++ b/mythtv/libs/libmythbase/mythcorecontext.cpp
+@@ -1262,6 +1262,90 @@ void MythCoreContext::ResetLanguage(void)
+ d->language.clear();
+ }
+
++//JM ADDED
++void MythCoreContext::savesettings_togroup (QString src_hostname,
++ QString saved_settingsgroupname )
++{
++ return d->m_database->savesettings_togroup(src_hostname,
++ saved_settingsgroupname);
++}
++
++void MythCoreContext::deletesettings(QString delete_hostname,
++ QString saved_settingsgroupname)
++{
++ return d->m_database->deletesettings(delete_hostname,
++ saved_settingsgroupname);
++}
++
++QMap<QString,QStringList> MythCoreContext::list_settingsgroupname()
++{
++ return d->m_database->list_settingsgroupname();
++}
++
++QMap<QString,QStringList> MythCoreContext::diff_settingsgroupname(
++ QString diff_hostname1,
++ QString diff_hostname2,
++ QStringList table_list)
++{
++ return d->m_database->diff_settingsgroupname(diff_hostname1,
++ diff_hostname2,
++ table_list);
++}
++
++void MythCoreContext::clonesettings(QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list,
++ bool is_full_clone,
++ QString dest_hostname)
++{
++ return d->m_database->clonesettings(src_hostname,
++ saved_settingsgroupname,
++ table_list,
++ is_full_clone,
++ dest_hostname);
++}
++
++void MythCoreContext::restoresettings(QString dest_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list )
++{
++ return d->m_database->restoresettings( dest_hostname,
++ saved_settingsgroupname,
++ table_list);
++}
++
++void MythCoreContext::change_hostname(QString old_hostname,
++ QString new_hostname)
++{
++ return d->m_database->change_hostname(old_hostname, new_hostname) ;
++}
++
++bool MythCoreContext::settings_check(QString src_hostname,
++ QString saved_settingsgroupname)
++{
++ return d->m_database->settings_check(src_hostname,saved_settingsgroupname);
++}
++
++void MythCoreContext::import_settings(QMap<QString,QString> vp_map,
++ QString table)
++{
++ return d->m_database->import_settings(vp_map, table);
++}
++
++
++QMap<QString, QMap<QString,QString> > MythCoreContext::export_settings(
++ QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list, bool skip_host )
++{
++ return d->m_database->export_settings(src_hostname,
++ saved_settingsgroupname,
++ table_list , skip_host );
++}
++
++//END JM ADDED
++
++
+ void MythCoreContext::InitLocale(void )
+ {
+ if (!d->m_locale)
+diff --git a/mythtv/libs/libmythbase/mythcorecontext.h b/mythtv/libs/libmythbase/mythcorecontext.h
+index aed83d7..3f0de5e 100644
+--- a/mythtv/libs/libmythbase/mythcorecontext.h
++++ b/mythtv/libs/libmythbase/mythcorecontext.h
+@@ -240,6 +240,39 @@ class MBASE_PUBLIC MythCoreContext : pub
+ void emitTVPlaybackAborted(void) { emit TVPlaybackAborted(); }
+ void emitTVPlaybackPlaying(void) { emit TVPlaybackPlaying(); }
+
++ //JM ADDED
++ void savesettings_togroup(QString src_hostname,
++ QString saved_settingsgroupname );
++
++ void deletesettings(QString delete_hostname,
++ QString saved_settingsgroupname);
++
++ QMap<QString,QStringList> list_settingsgroupname();
++ QMap<QString,QStringList> diff_settingsgroupname(QString diff_hostname1,
++ QString diff_hostname2,
++ QStringList table_list);
++
++ void clonesettings(QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list,
++ bool is_full_clone = true,
++ QString dest_hostname="");
++
++ void restoresettings (QString dest_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list);
++
++ void change_hostname (QString old_hostname, QString new_hostname);
++
++ bool settings_check (QString src_hostname ,QString saved_settingsgroupname);
++ void import_settings(QMap<QString,QString> vp_map, QString table);
++
++ QMap<QString,QMap <QString,QString> > export_settings(
++ QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list,
++ bool skip_host = false );
++ //END JM ADDED
+
+ signals:
+ void TVPlaybackStarted(void);
+diff --git a/mythtv/libs/libmythbase/mythdb.cpp b/mythtv/libs/libmythbase/mythdb.cpp
+index e60fce0..ed3bdf7 100644
+--- a/mythtv/libs/libmythbase/mythdb.cpp
++++ b/mythtv/libs/libmythbase/mythdb.cpp
+@@ -896,6 +896,1015 @@ void MythDB::WriteDelayedSettings(void)
+ }
+ }
+
++//JM ADDED
++void MythDB::savesettings_togroup(QString src_hostname,
++ QString saved_settingsgroupname )
++{
++ LOG(VB_GENERAL, LOG_ERR, QString("Using hostname of : %1")
++ .arg(src_hostname));
++ LOG(VB_GENERAL, LOG_ERR, QString("Saving to group: %1")
++ .arg(saved_settingsgroupname));
++ if ( settings_check( src_hostname , "current" ) )
++ {
++ QStringList table_list;
++ QString hostname_clause;
++ table_list.append("settings");
++ table_list.append("keybindings");
++ table_list.append("jumppoints");
++ if ( src_hostname == "GLOBAL" )
++ hostname_clause = "hostname IS NULL";
++ else
++ hostname_clause ="hostname = :HOSTNAME";
++
++ foreach (QString table, table_list)
++ {
++ QString dest_tablename = table +"_" + saved_settingsgroupname ;
++ create_new_table(dest_tablename,table);
++
++ QString query_string;
++ // Remove old saved values
++ MSqlQuery query(MSqlQuery::InitCon());
++ query_string = QString("DELETE FROM %1 WHERE %2")
++ .arg(dest_tablename)
++ .arg(hostname_clause);
++
++ //query_string = QString("DELETE FROM %1 WHERE "
++ // "hostname = :HOSTNAME").arg(dest_tablename);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME" ,src_hostname);
++ query.exec();
++
++ //insert all new settings
++ query_string = QString("REPLACE INTO %1 "
++ "SELECT * from %2 where %3")
++ .arg(dest_tablename)
++ .arg(table)
++ .arg(hostname_clause);
++// query_string = QString("REPLACE INTO %1 "
++// "SELECT * from %2 where hostname = :HOSTNAME)")
++// .arg(dest_tablename)
++// .arg(table);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME",src_hostname);
++ query.exec();
++ }
++ }
++ else
++ LOG(VB_GENERAL| VB_STDIO|VB_FLUSH, LOG_ERR,
++ QString("Couldn't find settings for: %1 \n").arg(src_hostname));
++ return;
++
++};
++
++void MythDB::deletesettings(QString delete_hostname,
++ QString saved_settingsgroupname)
++{
++ LOG(VB_GENERAL, LOG_ERR, QString("Using hostname of : %1")
++ .arg(delete_hostname));
++ LOG(VB_GENERAL, LOG_ERR, QString("Deleting: %1")
++ .arg(saved_settingsgroupname));
++ int tempItem;
++ QString src_tablename;
++ QStringList table_list;
++
++ table_list.append("settings");
++ table_list.append("keybindings");
++ table_list.append("jumppoints");
++ QString hostname_clause;
++ if ( delete_hostname == "GLOBAL" )
++ hostname_clause = "hostname IS NULL";
++ else
++ hostname_clause ="hostname = :HOSTNAME";
++
++ foreach (QString table, table_list)
++ {
++ src_tablename = find_group_table_name(table, saved_settingsgroupname);
++ MSqlQuery query(MSqlQuery::InitCon());
++ // Remove old saved values
++ if ( does_table_exist(src_tablename))
++ {
++ QString query_string = QString("DELETE from %1 "
++ "WHERE %2")
++ .arg(src_tablename)
++ .arg(hostname_clause);
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME" ,delete_hostname);
++ query.exec();
++
++ //check if ok to delete table
++ query_string = QString("SELECT count(*) from %1")
++ .arg(src_tablename);
++ query.prepare(query_string);
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ query.next();
++ tempItem = query.value(0).toInt();
++ if ( tempItem == 0 )
++ drop_temp_table(src_tablename);
++ }
++ }
++ else
++ LOG(VB_GENERAL, LOG_ERR,
++ QString("Couldn't find table: %1").arg(src_tablename));
++ }
++ return;
++}; // end delete settings
++
++
++QMap<QString,QStringList> MythDB::list_settingsgroupname()
++{
++ //Returns a QMAP of "settings_groups: hostname"
++ MSqlQuery query(MSqlQuery::InitCon());
++ MSqlQuery subquery(MSqlQuery::InitCon());
++ QString tempItem;
++ QString temp_hostnameItem;
++ QStringList hostname_list;
++ QMap<QString,QStringList> return_list;
++ QString full_table_name;
++ query.prepare( "show tables like \"settings%\" " );
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ full_table_name = query.value(0).toString();
++ tempItem=query.value(0).toString().remove(QRegExp("settings_"));
++ if ( tempItem != "distro_default" )
++ {
++ //loop over tables looking for hostnames
++ QString query_string = QString("SELECT DISTINCT "
++ "hostname from %1")
++ .arg(full_table_name);
++ subquery.prepare(query_string);
++
++ if (subquery.exec() && subquery.isActive()
++ && subquery.size() > 0)
++ {
++ while (subquery.next())
++ {
++ temp_hostnameItem = subquery.value(0).toString();
++ hostname_list.append(temp_hostnameItem);
++ }
++ }
++ //Special case of naming for the settings table;
++ //This only affects output.
++ if ( tempItem == "settings" )
++ return_list["current"] = hostname_list;
++ else
++ return_list[tempItem] = hostname_list;
++
++ //reset hostname_list for the next group
++ hostname_list = QStringList();
++ }
++ }
++ }
++ return return_list;
++}; // end list_settingsgroupname
++
++QMap<QString,QStringList> MythDB::diff_settingsgroupname(
++ QString diff_hostname1 ,
++ QString diff_hostname2,
++ QStringList table_list )
++{
++ // Returns a QMAP of tablename : diff results
++ LOG(VB_GENERAL, LOG_ERR, QString("Comparing settings for:"));
++ LOG(VB_GENERAL, LOG_ERR, QString("host 1: %1").arg(diff_hostname1));
++ LOG(VB_GENERAL, LOG_ERR, QString("host 2: %1").arg(diff_hostname2));
++
++ QString qstr;
++ QString tempItem;
++ QString tempString;
++
++ QStringList diff_list;
++ QStringList settings_list;
++ QStringList keybinding_list;
++
++ QMap<QString,QStringList> return_list;
++ if ( table_list.isEmpty() )
++ {
++ table_list.append("settings");
++ table_list.append("keybindings");
++ }
++
++ MSqlQuery query(MSqlQuery::InitCon());
++ foreach (QString table, table_list)
++ {
++ if ( table == "settings")
++ {
++
++ qstr= "SELECT distinct settings.value, :DIFF_HOSTNAME1 AS `hostname`, settings_a.data, :DIFF_HOSTNAME2 AS `hostname`"
++ " , settings_b.data FROM settings LEFT JOIN settings AS settings_a ON settings_a.value = settings.value AND settings_a.hostname = :DIFF_HOSTNAME1"
++ " LEFT JOIN settings AS settings_b ON settings_b.value = settings.value AND settings_b.hostname = :DIFF_HOSTNAME2"
++ " WHERE settings_a.data != settings_b.data OR "
++ " (settings_a.data IS NULL AND settings_b.data IS NOT NULL) OR (settings_a.data IS NOT NULL AND settings_b.data IS NULL);";
++
++ query.prepare(qstr);
++ query.bindValue(":DIFF_HOSTNAME1" , diff_hostname1);
++ query.bindValue(":DIFF_HOSTNAME2" , diff_hostname2);
++
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ tempString="";
++ //value
++ tempItem = query.value(0).toString();
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //hostname_1
++ tempItem = query.value(1).toString();
++ if (tempItem.isEmpty())
++ tempItem=diff_hostname1;
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //data
++ tempItem = query.value(2).toString();
++ if (tempItem.isEmpty())
++ tempItem="NULL";
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //hostname_2
++ tempItem = query.value(3).toString();
++ if (tempItem.isEmpty())
++ tempItem=diff_hostname2;
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //data
++ tempItem = query.value(4).toString();
++ if (tempItem.isEmpty())
++ tempItem="NULL";
++ tempString.append(tempItem);
++
++ settings_list.append(tempString);
++ }
++ return_list["Settings"] = settings_list;
++ }
++ }
++ else if ( table == "keybindings")
++ {
++
++ qstr="SELECT distinct keybindings.context, keybindings.action, :DIFF_HOSTNAME1 AS `hostname`, keybindings_a.keylist, :DIFF_HOSTNAME2 AS `hostname`, keybindings_b.keylist FROM keybindings "
++ " LEFT JOIN keybindings AS keybindings_a ON keybindings_a.context = keybindings.context AND keybindings_a.action = keybindings.action "
++ " AND keybindings_a.hostname = :DIFF_HOSTNAME1 "
++ " LEFT JOIN keybindings AS keybindings_b ON keybindings_b.context = keybindings.context "
++ " AND keybindings_b.action = keybindings.action AND keybindings_b.hostname = :DIFF_HOSTNAME2 "
++ " WHERE keybindings_a.keylist != keybindings_b.keylist OR "
++ " (keybindings_a.keylist IS NULL AND keybindings_b.keylist IS NOT NULL) OR (keybindings_a.keylist IS NOT NULL AND keybindings_b.keylist IS NULL);";
++ query.prepare(qstr);
++ query.bindValue(":DIFF_HOSTNAME1" , diff_hostname1);
++ query.bindValue(":DIFF_HOSTNAME2" , diff_hostname2);
++
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ tempString="";
++ //context
++ tempItem = query.value(0).toString();
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //action
++ tempItem = query.value(1).toString();
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //hostname
++ tempItem = query.value(2).toString();
++ if (tempItem.isEmpty())
++ tempItem=diff_hostname1;
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //keylist
++ tempItem = query.value(3).toString();
++ if (tempItem.isEmpty())
++ tempItem="NULL";
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //hostname
++ tempItem = query.value(4).toString();
++ if (tempItem.isEmpty())
++ tempItem=diff_hostname2;
++ tempString.append(tempItem);
++ tempString.append("|");
++
++ //keylist
++ tempItem = query.value(5).toString();
++ if (tempItem.isEmpty())
++ tempItem="NULL";
++ tempString.append(tempItem);
++ keybinding_list.append(tempString);
++ }
++ return_list["Keybindings"] = keybinding_list;
++ }
++ }
++
++ }
++ return return_list;
++}; //end diff_settingsgroupname
++
++void MythDB::clonesettings(QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list,
++ bool is_full_clone, QString dest_hostname)
++{
++ LOG(VB_GENERAL, LOG_ERR, QString("Using src hostname of : %1")
++ .arg(src_hostname));
++ LOG(VB_GENERAL, LOG_ERR, QString("Using dest hostname of : %1")
++ .arg(dest_hostname));
++ LOG(VB_GENERAL, LOG_ERR, QString("Cloning setting group: %1")
++ .arg(saved_settingsgroupname));
++ LOG(VB_GENERAL, LOG_ERR, QString("Full Copy : %1")
++ .arg(is_full_clone));
++
++ MSqlQuery query(MSqlQuery::InitCon());
++ QStringList::Iterator it;
++ QString current_table;
++ QString dest_tablename;
++ QString temptable;
++
++ if ( table_list.isEmpty() )
++ {
++ table_list.append("settings");
++ table_list.append("keybindings");
++ table_list.append("jumppoints");
++ }
++
++ for ( it = table_list.begin(); it != table_list.end(); ++it )
++ {
++ current_table = *it ;
++ dest_tablename = find_group_table_name(current_table,
++ saved_settingsgroupname);
++
++ if ( does_table_exist(dest_tablename))
++ {
++ // create temp table for merging settings
++ temptable="temp_table_" + dest_tablename;
++ create_temp_table(temptable, current_table );
++
++ // copy in stored settings
++ QString query_string = QString("REPLACE INTO %1 "
++ "(SELECT * from %2 where hostname = :HOSTNAME)")
++ .arg(temptable)
++ .arg(dest_tablename);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME",src_hostname );
++ query.exec();
++
++ // update hostname for dest_hostname
++ query_string = QString("UPDATE %1 set hostname = :HOSTNAME")
++ .arg(temptable);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME" , dest_hostname );
++ query.exec();
++
++ //if not full clone remove HOST% settings from temp table;
++ if ( current_table == "settings" && !is_full_clone)
++ {
++ query_string = QString("DELETE FROM %1 WHERE "
++ "hostname=:HOSTNAME and value like 'HOST%' " )
++ .arg(temptable);
++
++ query.prepare(query_string);
++ query.bindValue( ":HOSTNAME" , dest_hostname );
++ query.exec();
++ }
++
++ //remove current settings from dest table,
++ //if not full clone, then leave HOST%
++ //Need to remove because the old table allows for duplicates
++
++ if ( current_table == "settings" && !is_full_clone)
++ query_string = QString ("DELETE FROM %1 WHERE "
++ "hostname = :HOSTNAME "
++ "and value not like 'HOST%'")
++ .arg(dest_tablename);
++
++ else
++ query_string = QString ("DELETE FROM %1 WHERE "
++ "hostname = :HOSTNAME ")
++ .arg(dest_tablename);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME",dest_hostname);
++ query.exec();
++
++ // copy new settings from temp to current
++ query_string = QString("REPLACE INTO %1 "
++ "(SELECT * from %2)")
++ .arg(dest_tablename)
++ .arg(temptable);
++
++ query.prepare(query_string);
++ query.exec();
++
++ // drop temptable
++ drop_temp_table(temptable);
++ }
++ else
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Couldn't find table: %1")
++ .arg(dest_tablename));
++ }
++}; //end clonesettings
++
++void MythDB::restoresettings (QString dest_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list )
++{
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Restoring Settings:"));
++ LOG(VB_GENERAL, LOG_NOTICE, QString(" src: %1")
++ .arg(saved_settingsgroupname));
++ LOG(VB_GENERAL, LOG_NOTICE, QString(" dest:%1")
++ .arg(dest_hostname));
++
++ QString hostname_clause;
++ if ( dest_hostname == "GLOBAL" )
++ hostname_clause = "hostname IS NULL";
++ else
++ hostname_clause ="hostname = :HOSTNAME";
++
++ bool table_check;
++ if ( saved_settingsgroupname == "distro_default" )
++ table_check = settings_check ( "distro_default" , saved_settingsgroupname );
++ else
++ table_check = settings_check ( dest_hostname , saved_settingsgroupname );
++
++
++ if ( table_check == true )
++ {
++ MSqlQuery query(MSqlQuery::InitCon());
++ QStringList::Iterator it;
++ QString current_table;
++ if ( table_list.isEmpty() )
++ {
++ table_list.append("settings");
++ table_list.append("keybindings");
++ table_list.append("jumppoints");
++ }
++
++ for ( it = table_list.begin(); it != table_list.end(); ++it )
++ {
++ current_table = *it ;
++ //find tablenames to use
++ QString src_tablename = find_group_table_name(current_table,
++ saved_settingsgroupname);
++
++ QString temptable="temp_table_" + src_tablename;
++ if ( ! does_table_exist(src_tablename))
++ {
++ LOG(VB_GENERAL, LOG_NOTICE, QString("table does not exist: %1")
++ .arg(src_tablename));
++ continue;
++ }
++ // create temp table for merging settings
++ create_temp_table(temptable, current_table );
++
++ //could copy in current settings here to account for new stuff
++
++
++
++ // copy in stored settings
++ QString query_string;
++ if ( saved_settingsgroupname == "distro_default" )
++ { //special case for restoring default settings
++ query_string = QString("REPLACE INTO %1 "
++ "(SELECT * from %2 WHERE %3)")
++ .arg(temptable)
++ .arg(src_tablename)
++ .arg(hostname_clause);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME", "distro_default" );
++ query.exec();
++
++ // update hostname in temp table from distro_default
++ query_string = QString("UPDATE %1 set hostname = :HOSTNAME")
++ .arg(temptable);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME" , dest_hostname );
++ query.exec();
++
++ }
++ else
++ { //normal use case
++ query_string = QString("REPLACE INTO %1 "
++ "(SELECT * from %2 WHERE %3)")
++ .arg(temptable)
++ .arg(src_tablename)
++ .arg(hostname_clause);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME",dest_hostname );
++ query.exec();
++ }
++
++ //Remove current settings.
++ //Need to remove because the old table allows for duplicates
++ query_string = QString("DELETE FROM %1 WHERE "
++ "%2")
++ .arg(current_table)
++ .arg(hostname_clause);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME",dest_hostname);
++ query.exec();
++
++ // copy new settings from temp to current
++ query_string = QString("REPLACE INTO %1 "
++ "(SELECT * from %2)")
++ .arg(current_table)
++ .arg(temptable);
++
++ query.prepare(query_string);
++ query.exec();
++ // drop temptable
++ drop_temp_table(temptable);
++ }
++ }
++}; //end restore settings
++
++void MythDB::change_hostname (QString old_hostname, QString new_hostname)
++{
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Changing hostname from %1 -> %2")
++ .arg(old_hostname)
++ .arg(new_hostname));
++
++ MSqlQuery query(MSqlQuery::InitCon());
++ MSqlQuery sub_query(MSqlQuery::InitCon());
++ query.prepare( "SHOW TABLES" );
++
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ QString table_name = query.value(0).toString();
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Scanning %1")
++ .arg(table_name));
++
++ // LOOP OVER TABLES, CHECK IF IT HAS A HOSTNAME FIELD
++ QString query_string=QString("SHOW COLUMNS from %1 "
++ "where field='hostname'")
++ .arg(table_name);
++ sub_query.prepare(query_string);
++
++ if (sub_query.exec() && sub_query.size() > 0)
++ { //update hostname
++ LOG(VB_GENERAL, LOG_NOTICE, QString(" Updating hostname in: %1")
++ .arg(table_name));
++ query_string = QString("UPDATE %1 SET hostname = :NEW_HOSTNAME "
++ "WHERE hostname = :OLD_HOSTNAME")
++ .arg(table_name);
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":NEW_HOSTNAME" , new_hostname);
++ sub_query.bindValue(":OLD_HOSTNAME" , old_hostname);
++ sub_query.exec();
++ }
++ }
++ }
++
++
++
++
++
++
++}
++
++bool MythDB::settings_check(QString src_hostname,
++ QString saved_settingsgroupname)
++{
++ int tempItem;
++ bool returncode = false ;
++ QString table="settings";
++
++ QString tablename = find_group_table_name(table, saved_settingsgroupname);
++ QString hostname_clause;
++ if ( src_hostname == "GLOBAL" )
++ hostname_clause = "hostname IS NULL";
++ else
++ hostname_clause ="hostname = :HOSTNAME";
++
++ if (does_table_exist (tablename))
++ {
++ MSqlQuery query(MSqlQuery::InitCon());
++ QString query_string = QString("SELECT COUNT(data) from %1 "
++ "WHERE %2")
++ .arg(tablename)
++ .arg(hostname_clause);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME" , src_hostname );
++
++ if (query.exec() && query.isActive() && query.size() > 0 )
++ {
++ while (query.next())
++ {
++ tempItem = query.value(0).toInt();
++ if ( tempItem >= 1 )
++ returncode = true;
++ else
++ {
++ LOG(VB_GENERAL, LOG_NOTICE,
++ QString("Group %1 does not contain"
++ " valid settings")
++ .arg(saved_settingsgroupname));
++ }
++ }
++ }
++ }
++ else
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Couldn't find table: %1")
++ .arg(tablename));
++ return returncode;
++}; // end settings_check
++
++void MythDB::import_settings(QMap<QString,QString> vp_map,
++ QString table)
++{
++ MSqlQuery query(MSqlQuery::InitCon());
++
++ //IMPORT SETTINGS TABLE
++ if (table.startsWith("settings"))
++ {
++ if ( table != "settings" )
++ create_new_table(table,"settings");
++ QString hostname = vp_map.value("hostname");
++ QString value = vp_map.value("value");
++ QString data = vp_map.value("data");
++
++ QString hostname_clause;
++ QVariant import_hostname = QVariant(QVariant::String);
++
++ if ( hostname.isEmpty())
++ hostname_clause = "hostname IS NULL";
++ else
++ {
++ hostname_clause ="hostname = :HOSTNAME";
++ import_hostname = hostname;
++ }
++
++ QString query_string=QString("SELECT value, data, hostname "
++ "FROM %1 "
++ "WHERE %2 AND value = :VALUE "
++ "ORDER BY value")
++ .arg(table)
++ .arg(hostname_clause);
++
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME", hostname);
++ query.bindValue(":VALUE", value);
++
++ // if already exisiting records then update, otherwise insert
++ if (query.exec() && query.isActive())
++ {
++ MSqlQuery sub_query(MSqlQuery::InitCon());
++ if ( query.size() > 0 )
++ {
++ query_string = QString("UPDATE "
++ "%1 "
++ "set data = :DATA "
++ "WHERE %2 AND "
++ "value = :VALUE ")
++ .arg(table)
++ .arg(hostname_clause);
++
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":HOSTNAME", import_hostname);
++ sub_query.bindValue(":VALUE", value);
++ sub_query.bindValue(":DATA", data);
++ sub_query.exec();
++ }
++ else
++ {
++ query_string = QString("INSERT INTO "
++ " %1 "
++ "(value,data,hostname) "
++ "VALUES ( :VALUE , :DATA , :HOSTNAME)").arg(table);
++
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":HOSTNAME", import_hostname);
++ sub_query.bindValue(":VALUE", value);
++ sub_query.bindValue(":DATA", data);
++ sub_query.exec();
++ }
++ }
++ }
++ //KEYBINDINGS TABLE
++ else if (table.startsWith("keybindings"))
++ {
++ if ( table != "keybindings" )
++ create_new_table(table,"keybindings");
++ QString hostname = vp_map.value("hostname");
++ QString context = vp_map.value("context");
++ QString action = vp_map.value("action");
++ QString description = vp_map.value("description");
++ QString keylist = vp_map.value("keylist");
++
++ QString query_string=QString("SELECT context,action,hostname "
++ "FROM %1 "
++ "WHERE hostname = :HOSTNAME AND "
++ "context = :CONTEXT "
++ "AND action = :ACTION ").arg(table);
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME", hostname);
++ query.bindValue(":CONTEXT", context);
++ query.bindValue(":ACTION", action);
++
++ if (query.exec() && query.isActive())
++ {
++ MSqlQuery sub_query(MSqlQuery::InitCon());
++ if ( query.size() > 0 )
++ {
++ query_string = QString("UPDATE "
++ " %1 "
++ "set keylist = :KEYLIST "
++ "WHERE hostname = :HOSTNAME AND "
++ "context = :CONTEXT "
++ "AND action = :ACTION ").arg(table);
++
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":HOSTNAME", hostname);
++ sub_query.bindValue(":KEYLIST", keylist);
++ sub_query.bindValue(":CONTEXT", context);
++ sub_query.bindValue(":ACTION", action);
++ sub_query.exec();
++ }
++ else
++ {
++ query_string = QString("INSERT INTO "
++ " %1 "
++ " (context , action , description , keylist , hostname) "
++ " VALUES( "
++ " :CONTEXT ,"
++ " :ACTION , "
++ " :DESCRIPTION , "
++ " :KEYLIST , "
++ " :HOSTNAME)").arg(table) ;
++
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":HOSTNAME", hostname);
++ sub_query.bindValue(":KEYLIST", keylist);
++ sub_query.bindValue(":CONTEXT", context);
++ sub_query.bindValue(":ACTION", action);
++ sub_query.bindValue(":DESCRIPTION", description);
++ sub_query.exec();
++ }
++ }
++ }
++ //JUMP POINTS
++ else if (table.startsWith("jumppoints"))
++ {
++ if ( table != "jumppoints" )
++ create_new_table(table,"jumppoints");
++ QString hostname = vp_map.value("hostname");
++ QString description = vp_map.value("description");
++ QString destination = vp_map.value("destination");
++ QString keylist = vp_map.value("keylist");
++
++ QString query_string=QString("SELECT destination, keylist "
++ "FROM %1 "
++ "WHERE hostname = :HOSTNAME AND "
++ "destination = :DESTINATION "
++ "AND keylist = :KEYLIST ").arg(table);
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME", hostname);
++ query.bindValue(":DESTINATION", destination);
++ query.bindValue(":KEYLIST", keylist);
++
++ if (query.exec() && query.isActive())
++ {
++ MSqlQuery sub_query(MSqlQuery::InitCon());
++ if ( query.size() > 0 )
++ {
++ query_string = QString("UPDATE "
++ " %1 "
++ "set keylist = :KEYLIST "
++ "WHERE hostname = :HOSTNAME AND "
++ "destination = :DESTINATION ").arg(table);
++
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":HOSTNAME", hostname);
++ sub_query.bindValue(":KEYLIST", keylist);
++ sub_query.bindValue(":DESTINATION", destination);
++ sub_query.exec();
++ }
++ else
++ {
++ query_string = QString("INSERT INTO "
++ " %1 "
++ " (description , destination, keylist , hostname) "
++ " VALUES( "
++ " :DESCRIPTION ,"
++ " :DESTINATION , "
++ " :KEYLIST , "
++ " :HOSTNAME)").arg(table) ;
++
++ sub_query.prepare(query_string);
++ sub_query.bindValue(":HOSTNAME", hostname);
++ sub_query.bindValue(":KEYLIST", keylist);
++ sub_query.bindValue(":DESTINATION", destination);
++ sub_query.bindValue(":DESCRIPTION", description);
++ sub_query.exec();
++ }
++ }
++ }
++}; //end import_settings
++
++QMap<QString, QMap<QString,QString> >
++ MythDB::export_settings(QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list, bool skip_host )
++{
++ QMap<QString, QMap<QString,QString> > result_set;
++ QStringList::Iterator it;
++ QString current_table;
++ int record_count = 0;
++
++ if ( table_list.isEmpty() )
++ {
++ table_list.append("settings");
++ table_list.append("keybindings");
++ table_list.append("jumppoints");
++ }
++
++ MSqlQuery query(MSqlQuery::InitCon());
++ QString query_string;
++
++ //loop over tablelist
++ for ( it = table_list.begin(); it != table_list.end(); ++it )
++ {
++ current_table = *it ;
++ QString sub_sql;
++ QStringList fields;
++ QString field_query;
++
++ QString table_name = find_group_table_name(current_table,
++ saved_settingsgroupname);
++
++ QString hostname_clause;
++ if ( src_hostname == "GLOBAL" )
++ hostname_clause = "hostname IS NULL";
++ else
++ hostname_clause ="hostname = :HOSTNAME";
++
++ // find field names
++ query_string = QString("SHOW COLUMNS from %1").arg(table_name);
++ query.prepare(query_string);
++
++ //build up field name vars
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ if (! field_query.isEmpty())
++ field_query +=',';
++ QString tempItem = query.value(0).toString();
++ fields.append(tempItem);
++ field_query += tempItem;
++ }
++ }
++ // when working with settings table skip HOST if skip_host is true
++ if ( current_table == "settings" && skip_host == true )
++ {
++ QString skip_host_clause;
++ skip_host_clause = " VALUE not like 'HOST%' AND DATA not like 'HardwareProfile%UUID'" ;
++ query_string = QString("SELECT %1 FROM %2 WHERE %3 AND %4")
++ .arg(field_query)
++ .arg(table_name)
++ .arg(hostname_clause)
++ .arg(skip_host_clause);
++
++ }
++ else
++ {
++ query_string = QString("SELECT %1 FROM %2 WHERE %3")
++ .arg(field_query)
++ .arg(table_name)
++ .arg(hostname_clause);
++ }
++ query.prepare(query_string);
++ query.bindValue(":HOSTNAME" , src_hostname);
++
++ //looping over each record in the table query
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ //construct qmap of elements
++ //add table name
++ QMap<QString,QString> value_pair;
++ value_pair["table"]=table_name;
++
++ for ( int i=0 ; i < fields.size();i++ )
++ {
++ QString tempvalue = fields[i];
++ QString tempItem = query.value(i).toString();
++ value_pair[tempvalue]=tempItem;
++ }
++ result_set[QString(record_count)] = value_pair;
++ record_count++;
++ }
++ }
++
++ } // end table loop
++ return result_set;
++}; //end export_settings
++
++
++void MythDB::create_new_table (QString create_table_name,QString like_name)
++{
++ if ( ! does_table_exist(create_table_name))
++ {
++ MSqlQuery query(MSqlQuery::InitCon());
++ QString query_string = QString("CREATE TABLE %1 like %2")
++ .arg(create_table_name)
++ .arg(like_name);
++
++ query.prepare(query_string);
++ query.exec();
++ }
++ else
++ LOG(VB_GENERAL, LOG_NOTICE, QString("Table is already present,"
++ "will not create it: %1")
++ .arg(create_table_name));
++};
++
++
++void MythDB::drop_temp_table (QString table_name)
++{
++ MSqlQuery query(MSqlQuery::InitCon());
++ if (table_name == "settings" | table_name == "keybindings" | table_name == "jumppoints")
++ return;
++ QString query_string = QString("DROP TABLE %1").arg(table_name);
++ query.prepare(query_string);
++ query.exec();
++ return;
++}
++
++void MythDB::create_temp_table (QString create_table_name,QString like_name)
++{
++ MSqlQuery query(MSqlQuery::InitCon());
++ create_new_table(create_table_name,like_name);
++ QString query_string;
++ if ( like_name == "settings")
++ {
++ query_string = QString ("ALTER TABLE %1 ADD UNIQUE( value)")
++ .arg(create_table_name);
++ query.prepare(query_string);
++ query.exec();
++ }
++
++ query_string = QString("TRUNCATE %1").arg(create_table_name);
++ query.prepare(query_string);
++ query.exec();
++ return;
++}
++
++bool MythDB::does_table_exist(QString table_name)
++{
++ bool table_exist = false;
++ QString full_table_name;
++ MSqlQuery query(MSqlQuery::InitCon());
++
++ query.prepare( "SHOW TABLES" );
++ if (query.exec() && query.isActive() && query.size() > 0)
++ {
++ while (query.next())
++ {
++ full_table_name = query.value(0).toString();
++ if (table_name == full_table_name)
++ {
++ table_exist = true;
++ break;
++ }
++ }
++ }
++ return table_exist;
++};
++
++
++QString MythDB::find_group_table_name(QString current_table,
++ QString saved_settingsgroupname)
++{
++ QString table_name;
++ if ( saved_settingsgroupname.toLower() == "current" )
++ table_name = current_table ;
++ else
++ table_name = current_table + "_" + saved_settingsgroupname ;
++
++ return table_name;
++};
++//END JM ADDED
++
+ /**
+ * \brief Set a flag indicating we have successfully connected to the database
+ */
+diff --git a/mythtv/libs/libmythbase/mythdb.h b/mythtv/libs/libmythbase/mythdb.h
+index ac2a8ec..f3689a5 100644
+--- a/mythtv/libs/libmythbase/mythdb.h
++++ b/mythtv/libs/libmythbase/mythdb.h
+@@ -74,6 +74,49 @@ class MBASE_PUBLIC MythDB
+
+ void WriteDelayedSettings(void);
+
++ //JM ADDED
++ void savesettings_togroup(QString src_hostname,
++ QString saved_settingsgroupname );
++ void deletesettings(QString delete_hostname,
++ QString saved_settingsgroupname);
++
++ QMap<QString,QStringList> list_settingsgroupname();
++
++ QMap<QString,QStringList> diff_settingsgroupname(QString diff_hostname1,
++ QString diff_hostname2,
++ QStringList table_list);
++
++ void clonesettings(QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list,
++ bool is_full_clone = true,
++ QString dest_hostname="");
++
++ void restoresettings (QString dest_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list);
++
++ void change_hostname (QString old_hostname, QString new_hostname);
++ bool settings_check (QString src_hostname, QString saved_settingsgroupname);
++ void import_settings(QMap<QString,QString> vp_map, QString table);
++
++
++ QMap<QString,QMap <QString,QString> > export_settings(
++ QString src_hostname,
++ QString saved_settingsgroupname,
++ QStringList table_list,
++ bool skip_host = false);
++
++ void create_new_table (QString create_table_name,QString like_name);
++ void drop_temp_table (QString table_name);
++ void create_temp_table (QString create_table_name,QString like_name);
++ bool does_table_exist(QString table_name);
++ QString find_group_table_name(QString current_table,
++ QString saved_settingsgroupname);
++ //END JM ADDED
++
++
++
+ void SetHaveDBConnection(bool connected);
+ void SetHaveSchema(bool schema);
+ bool HaveSchema(void) const;
+diff --git a/mythtv/programs/mythutil/commandlineparser.cpp b/mythtv/programs/mythutil/commandlineparser.cpp
+index 902314d..d86b548 100644
+--- a/mythtv/programs/mythutil/commandlineparser.cpp
++++ b/mythtv/programs/mythutil/commandlineparser.cpp
+@@ -144,6 +144,37 @@ void MythUtilCommandLineParser::LoadArguments(void)
+ << add("--print-notification-template", "printntemplate", false,
+ "P