Projects
Multimedia
ffx264
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 21
View file
ffx264.changes
Changed
@@ -1,4 +1,195 @@ ------------------------------------------------------------------- +Wed Nov 16 09:10:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.8 + * Added support for 3-pass encoding + * Added support for setting a default audio codec in the config + file. Bumps up config file version to 28 + * Moved setting the video bitrate before the video filters + * More variables renamings and other small code tweaks + * Do some checking on duplicate entries when using additional + containers and warn and exit + * Updated the man page + +------------------------------------------------------------------- +Mon Nov 14 09:18:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.7 + * Set default amount of subtitles to 1 instead of exiting when no + value is given + * Allow the user to choose the amount of audio tracks he wants at + run time instead of requiring it to be set in the config file. + This removes config file var MAX_AUD_TRACKS and bumps up version + to 27 + * Renamed array variables audmapval and submapval to audindex and + subindex since we're not mapping but specifying the audio/sub + index id with these vars + * Fixed a possible case where audio params weren't cleared in + case the nosound option was chosen + +------------------------------------------------------------------- +Sun Nov 13 11:36:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.6 + * Added support for batch encoding mode, to be activated with the + new -b option. It's used to encode directories with video files + * Renamed variable $mode to $encmode for clarity + * Reworked the input/output code + * Instead of relying on a config var to set the subtitles amount + to support, ask the user each time to provide it. Makes the + code less complex and easier to extend in the future. Bumps up + config file version to 26 + * Check if the X264PARAMS var is missing from config in case we're + not using an x264 preset + * Updated the man page + +------------------------------------------------------------------- +Sat Nov 12 10:48:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.5 + * Added support for importing external srt/ssa subtitles for the + mkv, m2ts, mts and ts containers + * Moved the subtitle code into its own video_subtitles_func() + function + * Added support for simultaneously copying subtitles from the + input file and copying external ones + * Renamed variable SUBT to SUBNR for clarity + * Updated the README file and man page + +------------------------------------------------------------------- +Thu Nov 10 21:15:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.4 + * Check if name of input file matches that of output file and warn + and exit. Requires the realpath utility + * Added support for the m2ts, mts, ts and flv containers + * Merged the code that checks if an audio codec is supported by a + container with that that checks for additional output containers. + Removes code duplication and maintainability + * Update to the audio sample rates. Sync them with + ffmpeg -h encoder=<encoder> + * Restrict TrueHD channels to 2, 5 and 6 as that's what the encoder + currently supports + * Updated the README file + +------------------------------------------------------------------- +Wed Nov 09 07:00:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.3 + * Renamed config var CON to CONFMT. Updates config file version + to 25 + * Reduced some duplication in the audio codec checks for the + container formats + * Reduced some error message duplication when checking if an + additional container supports an audio codec + * Rework to the additional container selection code + * Added color functions for the additional container conversion + +------------------------------------------------------------------- +Tue Nov 08 10:10:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.2 + * Added support for encoding to TrueHD audio. Requires a very + recent ffmpeg version, preferably latest from git + * Some small improvements to the additional container output + * Moved the video_deinterlace_func() function inside the actual + deinterlace code + * Update to the README file + * Update to the man page + +------------------------------------------------------------------- +Mon Nov 07 16:25:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.1 + * Cosmetics in the code for deinterlacing + * Instead of skipping FPS conversion if the FPS can't be detected, + ask the user to provide it + * Use single brackets instead of double ones in the nosound + setup code + * Added license snippet at the top of the script + * Added support for outputting to additional container formats + * Do some checking on supported audio codecs for the supported + containers + * Check specified container and warn and exit if it's not supported + * Support setting the FLAC compression level + * Added h264_mp4toannexb flag in case we're outputting to the AVI + container + * Break out of the if conditionals in the audio code and replace + them with two case statements + * Update to the README file + +------------------------------------------------------------------- +Sun Nov 06 09:52:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.1.0 + * Bugfix: resampling wasn't working for fdk-aac due to missing + value in the case statement + * Check if output file exists and if so, move it to $file.old + * Use test directly instead of an if condition to set the audio + filters + * Support bitrate calculations for target file size when doing + audio copy + * Use fdk* in the case statements for easier typing + * Renamed variable astrm to astream for clarity + * Use 1-2p in the case statements for passmodes instead of 1p|2p + * New function, video_field_parity_func(), to detect and report the + interlace field order. Used by motion-compensation deinterlacing + and interlaced encoding + * Detect and display audio sample rate in case resampling is chosen + * Improvements to the video_fps_func() function. Get the FPS value + directly instead of outputting to a file and reading it + +------------------------------------------------------------------- +Fri Nov 04 10:43:00 UTC 2016 - neutrino8@opensuse.org + +- Update to version 3.0.8 + * Bugfix: the scale variable was used twice for different things + causing an overwrite of the scale filter parameters, which + eventually results in ffmpeg complaining and exiting + * Added support for NTSC <-> NTSC and NTSC <-> PAL frame rate + conversions + * New var in config file, VID_FPS_CONVERT, to enable/disable + FPS conversion. Bumps up config file version to 24 + * Moved the FPS detection code into its own function so it can + be easily reused + * Minor cosmetics + * Updated the README file + +------------------------------------------------------------------- +Thu Nov 03 15:31:00 UTC 2016 - neutrino8@gmail.com + +- Update to version 3.0.7 + * Added support for interlace-aware encoding + * Added support for the spp, uspp and pp7 deblockers + * Support asking for software scaler during exec time + * Added new SCALE var to the config file to enable/disable + support for software scaling. Bumps up the config file + version to 23 + * Do a test write to see if output directory is writable by + the script executing user + * Updated the README file + +------------------------------------------------------------------- +Wed Nov 02 19:41:00 UTC 2016 - neutrino8@gmail.com + +- Update to version 3.0.6 + * Added support for motion compensation deinterlacing for both + deinterlacing at original FPS and bobbing + * Use denoise var instead of denoiser for the denoise filters + and rotate var instead of transpose for the transpose filter + * Added support for deblocking with the fspp filter. This bumps + up the config file version to 22 + * Update to the README file + +------------------------------------------------------------------- +Tue Nov 01 00:35:00 UTC 2016 - neutrino8@gmail.com + +- Update to version 3.0.5 + * Added support for bobbing (deinterlace at double FPS) + * Cosmetics: add menu header to the Color Primaries option + +------------------------------------------------------------------- +======= Mon Nov 14 09:18:00 UTC 2016 - neutrino8@opensuse.org - Update to version 3.1.7 @@ -176,6 +367,7 @@ * Cosmetics: add menu header to the Color Primaries option ------------------------------------------------------------------- +>>>>>>> ./ffx264.changes.r2 Tue Oct 18 20:27:00 UTC 2016 - neutrino8@gmail.com - Add changes file
View file
ffx264.spec
Changed
@@ -17,7 +17,7 @@ Name: ffx264 -Version: 3.1.7 +Version: 3.1.8 Release: 0 Summary: A small shell script for encoding to H.264 with ffmpeg License: GPL-2.0+ @@ -29,7 +29,8 @@ BuildArch: noarch %description -A very basic and small shell script for encoding video files to the H.264 video format using ffmpeg and libx264. +A small shell script for encoding video files to the H.264/AVC video format +using ffmpeg and libx264. %prep %setup -q
View file
ffx264-3.1.7.tar.gz/ChangeLog -> ffx264-3.1.8.tar.gz/ChangeLog
Changed
@@ -1,3 +1,13 @@ +2016-11-16 - ffx264 3.1.8 + * Added support for 3-pass encoding + * Added support for setting a default audio codec in the config + file. Bumps up config file version to 28 + * Moved setting the video bitrate before the video filters + * More variables renamings and other small code tweaks + * Do some checking on duplicate entries when using additional + containers and warn and exit + * Updated the man page + 2016-11-14 - ffx264 3.1.7 * Set default amount of subtitles to 1 instead of exiting when no value is given
View file
ffx264-3.1.7.tar.gz/ffx264 -> ffx264-3.1.8.tar.gz/ffx264
Changed
@@ -2,8 +2,8 @@ # # Small script to encode to H.264/AVC video using FFmpeg and libx264. # Author: Grozdan "microchip" Nikolov <neutrino8@opensuse.org> -# Version: 3.1.7 -# Date: 2016-11-14 +# Version: 3.1.8 +# Date: 2016-11-16 # # ffx264 is free software ; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -23,10 +23,10 @@ brown() { echo -e "\e0;33m$1\e0;39;49m"; } error() { echo -e "\e1;31m$1\e0;39;49m"; } -version="3.1.7" +version="3.1.8" CFG="$HOME/.ffx264" -cfgversion="27" +cfgversion="28" genconfig_func() { cat<<EOF>>"$CFG" @@ -44,7 +44,7 @@ # Container format extension # Leave empty to ask each time -CONFMT="mkv" +CONFMT="" # Nice value (0-19) NICE="19" @@ -90,6 +90,10 @@ AUD_VOLUME="y" AUD_RESAMPLE="y" +# Set a default audio codec +# Leave empty to ask each time +DEFAULT_AUD_CODEC="" + # Enable subtitles support? # Note: not all containers support # all types of subs! @@ -126,7 +130,7 @@ ;; m) case "$OPTARG" in - 1-2p|crf) true ;; + 1-3p|crf) true ;; *) error "-> Invalid mode!" error "-> Use: $(basename $0) -h" @@ -143,7 +147,7 @@ error "-> No such file!" exit 1 fi - PRSTFILE="$OPTARG" + PRESETFILE="$OPTARG" ;; p) case "$OPTARG" in @@ -186,6 +190,7 @@ echo " defaults to crf mode. Valid pass modes are:" echo " 1p (1-pass mode)" echo " 2p (2-pass mode)" + echo " 3p (3-pass mode)" echo " crf (constant rate factor mode)" echo brown " -b" @@ -289,9 +294,9 @@ source "$CFG" fi -if ! -z "$PRSTFILE" ; then +if ! -z "$PRESETFILE" ; then if ! -z "$vpreset" ; then - if ! -z "$(grep '^X264PARAMS' "$PRSTFILE")" ; then + if ! -z "$(grep '^X264PARAMS' "$PRESETFILE")" ; then error "-> x264 presets/tune profiles are mutually exclusive with custom presets!" error "-> If you want to use a custom configuration file, don't add or comment" error " out the X264PARAMS variable in it. Then you can use the built-in" @@ -300,14 +305,14 @@ exit 1 fi else - if -z "$(grep '^X264PARAMS' "$PRSTFILE")" ; then + if -z "$(grep '^X264PARAMS' "$PRESETFILE")" ; then error "-> The X264PARAMS variable is commented out or missing in your file!" error "-> Please at least add to the file: X264PARAMS=\"ref=4\" (for example)" echo exit 1 fi fi - source "$PRSTFILE" + source "$PRESETFILE" else if -z "$vpreset" ; then if -f "$CFG" -a -z "$(grep '^X264PARAMS' "$CFG")" ; then @@ -359,12 +364,14 @@ echo exit 1 else - mkdir -p "$OUTDIR" 2>/dev/null - if $? != 0 ; then - error "-> Could not create the output directory!" - error "-> Check your config in '$CFG'" - echo - exit 1 + if ! -d "$OUTDIR" ; then + mkdir -p "$OUTDIR" 2>/dev/null + if $? != 0 ; then + error "-> Could not create the output directory!" + error "-> Check your config in '$CFG'" + echo + exit 1 + fi fi fi @@ -418,7 +425,7 @@ fi # Check if output dir is writable -WRITE="$(dirname "$OUTPUT")/.ff_writable$$" +WRITE="$(dirname "$OUTPUT")/.$(basename $0)_writable$$" touch "$WRITE" 2>/dev/null if $? != 0 ; then error "-> Specified output directory is not writable by user '$(id -un)'" @@ -486,7 +493,7 @@ if "$acf" = "y" -o "$acf" = "Y" ; then printf "Specify the Container Formats example: mp4,m2ts,mov - press 'Enter' to skip: " read econ - test ! -z "$econ" && extracon="$(echo "$econ" | sed 's|,| |g' | tr ':upper:' ':lower:')" + test ! -z "$econ" && extracon="$(echo "$econ" | tr ':upper:' ':lower:' | tr ':punct:' ' ')" if ! -z "$extracon" ; then container_func() { case "$1" in @@ -509,12 +516,19 @@ esac } + DUPS="$(echo -e "$extracon" | sed 's| |\n|g' | sort | uniq -d)" + if ! -z "$DUPS" ; then + error "-> You provided a duplicate container entry!" + exit 1 + fi + for i in $extracon; do + echo if "$i" = "$CONFMT" ; then - error "-> Additional container matches the main output container!" + error "-> Additional container $i matches the main output container!" + echo exit 1 fi - echo case "$i" in mkv|m2ts|mts|ts) green "-> Note: additional container $i supports all the audio codecs" @@ -570,7 +584,7 @@ fi case "$encmode" in - 1-2p) + 1-3p) printf "Specify the desired Video Bitrate in kbps default is 8000: " read vbtr test -z "$vbtr" && vbitrate="8000" || vbitrate="$vbtr" @@ -686,6 +700,7 @@ video_field_parity_func() { echo green "-> Detecting Field Parity..." + sleep 1 FPAR="$($FFPROBE -i "$input" -show_streams -select_streams v:0 -show_frames -read_intervals %+7 2>&1 | sed -n 's|^field_order=||p' | tail -1)" case "$FPAR" in t*|T*) fp="tff"; fparity="Top Field First (TFF)" ;; @@ -1095,15 +1110,12 @@ if ! -z "${subnri}" ; then printf "Sub $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " read slangi - if ! -z "${slangi}" ; then - sublangi="-metadata:s:s:${subindexi} language=${slangi}" - fi - subcopyi="-map ${subnri} -c:s:${subindexi} copy ${sublangi}" + test ! -z "${slangi}" && sublangi="-metadata:s:s:${subindexi} language=${slangi}" # Workaround for an ffmpeg disposition issue - # where in some cases it sets subsequent tracks + # where in some cases it flags subsequent tracks # as default. test "$i" = "1" && sdis="default" || sdis="none" - subdisi="-disposition:s:${subindexi} $sdis" + subcopyi="-map ${subnri} -c:s:${subindexi} copy ${sublangi} -disposition:s:${subindexi} $sdis" else error "-> No value given!" exit 1 @@ -1158,17 +1170,14 @@ else printf "Sub $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " read slngi - if ! -z "${slngi}" ; then - sublngi="-metadata:s:s:${subidxi} language=${slngi}" - fi - EXTSUBSi="-i \"${subfilei}\"" + test ! -z "${slngi}" && sublngi="-metadata:s:s:${subidxi} language=${slngi}" if ! -z "${subindex*}" ; then sdispo="none" else test "$i" = "1" && sdispo="default" || sdispo="none" fi - subdispoi="-disposition:s:${subidxi} $sdispo" - subcpyi="-map $i:0 -c:s:${subidxi} copy ${sublngi}" + EXTSUBSi="-i \"${subfilei}\"" + subcpyi="-map $i:0 -c:s:${subidxi} copy ${sublngi} -disposition:s:${subidxi} $sdispo" fi done fi @@ -1256,39 +1265,46 @@ test -z "${astreami}" && atracki="0:1" || atracki="${astreami}" printf "Track $i: Specify the 3-letter Language Code for Metadata press 'Enter' to skip: " read alangi - if ! -z "${alangi}" ; then - audlangi="-metadata:s:a:${audindexi} language=${alangi}" - fi + test ! -z "${alangi}" && audlangi="-metadata:s:a:${audindexi} language=${alangi}" audmapi="-map ${atracki}" done - echo - brown " Available Audio Codecs" - brown " ~~~~~~~~~~~~~~~~~~~~~~" - echo " AC3 -----> Channels Support: 6 (codec max)" - echo " EAC3 ----> Channels Support: 6 (encoder max)" - echo " DTS -----> Channels Support: 6 (codec max)" - echo " AAC -----> Channels Support: 8 (ffmpeg max)" - echo " FDK-AAC -> Channels Support: 8 (ffmpeg max)" - echo " Opus ----> Channels Support: 8 (ffmpeg max)" - echo " Vorbis --> Channels Support: 8 (ffmpeg max)" - echo " MP3 -----> Channels Support: 2 (codec max)" - echo " TrueHD --> Channels Support: 6 (encoder max)" - echo " FLAC ----> Channels Support: 8 (codec max)" - echo " PCM -----> Channels Support: 8 (ffmpeg max)" - echo " COPY ----> Channels Support: depends on audio codec" - echo " NOSOUND -> Channels Support: N/A" + if -z "$DEFAULT_AUD_CODEC" ; then + echo + brown " Available Audio Codecs" + brown " ~~~~~~~~~~~~~~~~~~~~~~" + echo " AC3 -----> Channels Support: 6 (codec max)" + echo " EAC3 ----> Channels Support: 6 (encoder max)" + echo " DTS -----> Channels Support: 6 (codec max)" + echo " AAC -----> Channels Support: 8 (ffmpeg max)" + echo " FDK-AAC -> Channels Support: 8 (ffmpeg max)" + echo " Opus ----> Channels Support: 8 (ffmpeg max)" + echo " Vorbis --> Channels Support: 8 (ffmpeg max)" + echo " MP3 -----> Channels Support: 2 (codec max)" + echo " TrueHD --> Channels Support: 6 (encoder max)" + echo " FLAC ----> Channels Support: 8 (codec max)" + echo " PCM -----> Channels Support: 8 (ffmpeg max)" + echo " COPY ----> Channels Support: depends on audio codec" + echo " NOSOUND -> Channels Support: N/A" + else + echo + green "-> Using default audio codec set in config file: $DEFAULT_AUD_CODEC" + fi for i in $(eval echo "{1..$ATRACKS}"); do echo # Workaround for an ffmpeg disposition issue # where in some cases it flags subsequent # tracks as default. - test "$i" = "1" && adis="default" || adis="none" - auddisi="-disposition:a:${audindexi} $adis" + test "$i" = "1" && adispo="default" || adispo="none" + auddispoi="-disposition:a:${audindexi} $adispo" - printf "Track $i: Specify the Audio Codec default is AC3: " - read acodeci + if -z "$DEFAULT_AUD_CODEC" ; then + printf "Track $i: Specify the Audio Codec default is AC3: " + read acodeci + else + acodeci="$DEFAULT_AUD_CODEC" + fi acodeci="$(echo "${acodeci}" | tr ':upper:' ':lower:')" case "${acodeci}" in ac3|"") @@ -1380,7 +1396,7 @@ # clear any audio options given for t in $(eval echo "{1..$ATRACKS}"); do audparamst= - auddist= + auddispot= done echo error "-> NOSOUND chosen. Clearing all other audio options!" @@ -1588,7 +1604,7 @@ printf "Track $i: Set the Audio Volume? y/N: " read setavoli if "${setavoli}" = "y" -o "${setavoli}" = "Y" ; then - printf "Track $i: Specify the Audio Volume filter value in dB -100-100 - default is 4.0: " + printf "Track $i: Specify the Audio Volume value in dB -100-100 - default is 4.0: " read avoli test -z "${avoli}" && audvoli="4" || audvoli="${avoli}" avolumei="volume=${audvoli}dB," @@ -1791,7 +1807,7 @@ test ! -z "${afiltersi}" && audfiltersi="-filter:a:${audindexi} ${afiltersi}" fi - audparamsi="${audmapi} -c:a:${audindexi} ${acdci} ${audprofilei} ${audcompleveli} ${audbtri} ${audchani} ${audfiltersi} ${audlangi} ${audmetai}" + audparamsi="${audmapi} -c:a:${audindexi} ${acdci} ${audprofilei} ${audcompleveli} ${audbtri} ${audchani} ${audfiltersi} ${audlangi} ${audmetai} ${auddispoi}" done fi @@ -1802,7 +1818,7 @@ fi case "$encmode" in - 1-2p) + 1-3p) # Haven't found a reliable way to make it work with # FLAC and PCM audio so just skip this if one of # these audio codecs is chosen. Patch welcome @@ -1872,6 +1888,7 @@ case "$encmode" in 1p) pass="1-pass" ;; 2p) pass="2-pass" ;; + 3p) pass="3-pass" ;; crf|"") pass="CRF"; encmode="crf" ;; esac @@ -1904,24 +1921,35 @@ test ! -z "$COMMENT" && METACOMMENT="-metadata comment=\"$COMMENT\"" encoder_func() { - OPTS1="${EXTSUBS*} -map 0:0 -disposition:v:0 default $ofps $annexb $NOSUBS $MDATA $CHPS $METATITLE $METAGENRE $METAYEAR $METACOMMENT $vfilters $sws" + VIDOPTS="${EXTSUBS*} -map 0:0 -disposition:v:0 default $ofps $annexb $NOSUBS $MDATA $CHPS $METATITLE $METAGENRE $METAYEAR $METACOMMENT $vfilters $sws" case "$1" in 1p|crf) test "$encmode" = "1p" && passone="bitrate=$vbitrate" || passone="crf=$CRF" - OPTS2="${audparams*} ${auddis*} ${subcopy*} ${subcpy*} ${subdis*} ${subdispo*} $strict $movflags $METACOVER \"$OUTPUT\"" + OPTS1="${audparams*} ${subcopy*} ${subcpy*} $strict $movflags $METACOVER \"$OUTPUT\"" ;; 2p) passone="stats=\"${OUTFILE%.*}.log\":pass=1:bitrate=$vbitrate" passtwo="stats=\"${OUTFILE%.*}.log\":pass=2:bitrate=$vbitrate" + OPTS1="-an -f null -y /dev/null" + OPTS2="${audparams*} ${subcopy*} ${subcpy*} $strict $movflags $METACOVER \"$OUTPUT\"" + ;; + 3p) + passone="stats=\"${OUTFILE%.*}.log\":pass=1:bitrate=$vbitrate" + passtwo="stats=\"${OUTFILE%.*}.log\":pass=3:bitrate=$vbitrate" + OPTS1="-an -f null -y /dev/null" OPTS2="-an -f null -y /dev/null" - OPTS3="${audparams*} ${auddis*} ${subcopy*} ${subcpy*} ${subdis*} ${subdispo*} $strict $movflags $METACOVER \"$OUTPUT\"" + OPTS3="${audparams*} ${subcopy*} ${subcpy*} $strict $movflags $METACOVER \"$OUTPUT\"" ;; esac - echo "nice -n $NICE $FFMPEG -i \"$input\" $OPTS1 -c:v libx264 -x264opts $passone$X264PARAMS $OPTS2" + echo "nice -n $NICE $FFMPEG -i \"$input\" $VIDOPTS -c:v libx264 -x264opts $passone$X264PARAMS $OPTS1" case "$1" in - 2p) + 2p|3p) echo - echo "nice -n $NICE $FFMPEG -i \"$input\" $OPTS1 -c:v libx264 -x264opts $passtwo$X264PARAMS $OPTS3" + echo "nice -n $NICE $FFMPEG -i \"$input\" $VIDOPTS -c:v libx264 -x264opts $passtwo$X264PARAMS $OPTS2" + if "$1" = "3p" ; then + echo + echo "nice -n $NICE $FFMPEG -i \"$input\" $VIDOPTS -c:v libx264 -x264opts $passtwo$X264PARAMS $OPTS3" + fi ;; esac }
View file
ffx264-3.1.7.tar.gz/ffx264.1 -> ffx264-3.1.8.tar.gz/ffx264.1
Changed
@@ -3,7 +3,7 @@ .de IPs .IP "\\$1" .. -.TH ffx264 1 "Nov 12, 2016" +.TH ffx264 1 "Nov 14, 2016" .SH NAME ffx264 @@ -39,6 +39,8 @@ .br .B 2p (2-pass mode) .br +.B 3p (3-pass mode) +.br .B crf (constant rate factor mode) .RE .
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.