2017-02-17
Initial patch
2017-03-04
Additional information
2 pass encoding
To apply two pass encoding use "2Pass" in the preset name.
Example:
diff -3ur a/Sinthgunt/app.py b/Sinthgunt/app.py
--- a/Sinthgunt/app.py 2010-11-22 21:27:55.000000000 +0300
+++ b/Sinthgunt/app.py 2017-03-04 20:18:39.000000000 +0300
@@ -1,4 +1,5 @@
#!/usr/bin/python
+# -*- coding: utf-8 -*-
# $Id: app.py 196 2010-11-22 18:27:50Z kare1234 $
####################
@@ -35,17 +36,21 @@
# Import Python Libraries
####################
import os
+import errno
import sys
import pygtk; pygtk.require("2.0")
import gtk.glade
import subprocess
import gobject
import time
-import sys
-import urllib
from xml.etree import ElementTree as etree
-
+def logfile_remove(self):
+ try:
+ os.remove(self)
+ except OSError as e: # this would be "except OSError, e:" before Python 2.6
+ if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
+ raise # re-raise exception if a different error occurred
def main():
####################
@@ -58,20 +63,22 @@
print('It seems, that ffmpeg is not installed on this computer. \nSee http://www.sinthgunt.org for installation instructions.') # Display error message, then carry on
# Define data and temp directories
- DATA_DIR="/usr/share/sinthgunt/"
- TEMP_DIR="/tmp/"
+ DATA_DIR = "/usr/share/sinthgunt/"
+ TEMP_DIR = "/tmp/"
# Opens the log file and write the name and curent data and time
logfile_filename = os.path.expanduser("~/.sinthgunt.log")
+ logfile_remove(logfile_filename)
logfile = open(logfile_filename, 'a')
- logfile.writelines('****** Sinthgunt log file START - '+
- str(time.ctime())+' *******\n')
- logo_filename=DATA_DIR+"logo.png"
+ logfile.writelines('\n******* Sinthgunt log file START - '+
+ str(time.ctime())+' *******\n\n')
+ logo_filename = DATA_DIR+"logo.png"
# Carry over variables to class
sinthgunt.logo_filename = logo_filename
sinthgunt.DATA_DIR = DATA_DIR
sinthgunt.logfile = logfile
sinthgunt.TEMP_DIR = TEMP_DIR
+ sinthgunt.function_activate = False
# Run the main loop
program = sinthgunt()
@@ -98,7 +105,7 @@
# -
####################
- def ResetSinthgunt(self,widget):
+ def ResetSinthgunt(self, widget):
####################
# Description
# ===========
@@ -112,10 +119,10 @@
#
####################
# Write default stuff to gui
- self.labelGuide.set_text('Input file(s):')
+ self.labelGuide.set_text("Input file(s):")
self.labelOperation.set_text('')
context_id = self.statusbar.get_context_id("Activation")
- self.statusbar.push(context_id,"Welcome to sinthgunt!")
+ self.statusbar.push(context_id, "Welcome to sinthgunt!")
self.labelInput.set_text('')
# Load the logo
@@ -143,8 +150,8 @@
# Load XML config file
self.parseXML()
# Local variables
- categorylist=self.categorylist # List of categories
- presetlist=self.presetlist # List of presets in the categories
+ categorylist = self.categorylist # List of categories
+ presetlist = self.presetlist # List of presets in the categories
# Connect to menu
actionmenu = self.wTree.get_widget("menu2")
# Constants
@@ -152,9 +159,10 @@
self.Npreset = len(presetlist) # Number of presets
counter = 0 # Counter that keeps track of the categories in the categorylist
counter2 = 0 # Counter that keeps track of the codecs in the self.preset_enabled list
+ self.already_executed = False
# Create first, dummy item in group. All later items are attached to this group
- item = gtk.RadioMenuItem(group=None,label='')
+ item = gtk.RadioMenuItem(group = None, label = '')
# Initialise presetmenuheaderholder, a holder for the submenues
self.presetmenu1headerholder = []
self.preset_enabled = []
@@ -170,32 +178,32 @@
if presetlist[i][0] == categorylist[counter]:
self.preset_enabled.append('')
# Create radio button for the preset
- item = gtk.RadioMenuItem(group=item,label=presetlist[i][1])
+ item = gtk.RadioMenuItem(group = item, label = presetlist[i][1])
# What to do when the radiobutton is clicked
item.connect("activate", self.menuradiobuttonselect)
# Check to see if the codecs required by the preset are supported by the users version of ffmpeg
for requiredcodec in self.presetlist[i][4]:
- flag =0
+ flag = 0
notfound = 1
for codec in self.codecs:
# If encoding true
- if requiredcodec==codec[0] and codec[1]==True and flag==0: # preset will work
+ if requiredcodec == codec[0] and codec[1] == True and flag == 0: # preset will work
notfound = 0
- self.preset_enabled[counter2]=True
+ self.preset_enabled[counter2] = True
# if encoding false
- if requiredcodec==codec[0] and codec[1]==False:
+ if requiredcodec == codec[0] and codec[1] == False:
label = item.get_children()[0]
label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#888888')) # preset will not work - grayed out
notfound = 0
- flag=1
+ flag = 1
item.set_tooltip_text('Your version of ffmpeg does not support this preset.')
- self.preset_enabled[counter2]=False
+ self.preset_enabled[counter2] = False
# if codec was not found
- if notfound==1 and flag==0:
+ if notfound == 1 and flag == 0:
label = item.get_children()[0]
label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#888888')) # preset might work - grayed out
item.set_tooltip_text('Your version of ffmpeg does not support this preset.')
- self.preset_enabled[counter2]=False
+ self.preset_enabled[counter2] = False
counter2 = counter2+1
# add item to the headerholder
self.presetmenu1headerholder[counter].append(item)
@@ -219,41 +227,39 @@
# ===============
#
####################
- context_id = self.statusbar.get_context_id("Activation")
+ context_id = self.statusbar.get_context_id("Activation")
output = ''
try:
output_raw = str(self.process.stdout.read(80))
- output = output_raw.replace('\n','')
+ output = output_raw.replace('=', ' ').replace('\r', '\n')
except:
pass
- self.logfile.writelines('Conversion status: '+output+'\n')
+ self.logfile.writelines(output)
output_split = output.split(' ')
- N=len(output_split)
+ N = len(output_split)
# get the number of frames converted
for i in range(N):
- if i>=2 and output_split[i]=='fps=':
- file_frames_completed = output_split[i-1]
- self.logfile.writelines('Frames completed: '+file_frames_completed+'\n')
- # update progressbar and statusbar
- try:
- context_id = self.statusbar.get_context_id("Activation")
- self.statusbar.push(context_id,'Frames converted: '+str(file_frames_completed))
- except:
- pass
- try:
- self.progressbar.set_fraction(float(\
- file_frames_completed)/float(self.file_frames))
- self.progressbar.set_text(str(file_frames_completed)+\
- ' of '+str(self.file_frames)+' frames converted.')
- except:
- pass
+ if i >= 2 and output_split[i] == 'fps':
+ file_frames_completed = output_split[i-1]
+ # update progressbar and statusbar
+ try:
+ context_id = self.statusbar.get_context_id("Activation")
+ self.statusbar.push(context_id, 'Frames converted: '+str(file_frames_completed))
+ except:
+ pass
+ try:
+ self.progressbar.set_fraction(float(\
+ file_frames_completed)/float(self.file_frames))
+ self.progressbar.set_text('Converting '+self.input[self.NextInputFileToConvert])
+ except:
+ pass
# Look for Classic errors. This should be done in a separate function sometime soon
# "Must supply at least one output file"
for i in range(N-1):
- if i>=2 and output_split[i]=='Must=' and output_split[i+1]=='supply': # an error has occured
- self.statusbar.push(context_id,'An error has occured. See the log file for details.')
+ if i >= 2 and output_split[i] == 'Must=' and output_split[i+1] == 'supply': # an error has occured
+ self.statusbar.push(context_id, 'An error has occured. See the log file for details.')
self.progressbar.set_fraction(0.0)
self.progressbar.set_text('')
return False
@@ -261,24 +267,25 @@
# if no output detected, stop watching the process and write to statusbar
- if output =='':
- self.statusbar.push(context_id,'Conversion completed!')
- self.progressbar.set_fraction(0.99999)
+ if output == '':
+ self.statusbar.push(context_id, 'Conversion completed!')
+ self.progressbar.set_text('')
+ self.progressbar.set_fraction(1.0)
# We are now done with the current file. Move on to next one if there are any left
if self.NextInputFileToConvert <= len(self.input) - 2:
- self.NextInputFileToConvert = self.NextInputFileToConvert + 1
+ self.NextInputFileToConvert = self.NextInputFileToConvert+1
self.activate(self.window)
else:
- self.NextInputFileToConvert = 0
+ #self.NextInputFileToConvert = 0
self.ResetSinthgunt(self.window)
- self.statusbar.push(context_id,'Conversion completed!')
+ self.statusbar.push(context_id, 'Conversion completed!')
return False
else:
return True
- def menuopenfile(self,widget):
+ def menuopenfile(self, widget):
####################
# Description
# ===========
@@ -322,6 +329,8 @@
filter.add_pattern("*.3G2")
filter.add_pattern("*.mts")
filter.add_pattern("*.MTS")
+ filter.add_pattern("*.mkv")
+ filter.add_pattern("*.MKV")
fc.add_filter(filter)
# all files
filter = gtk.FileFilter()
@@ -357,7 +366,7 @@
#
####################
# generate thumbnail from input file
- self.thumbnail_filename=self.generateThumbnail(self.input[-1])
+ self.thumbnail_filename = self.generateThumbnail(self.input[-1])
# update thumbnail
try:
@@ -369,20 +378,23 @@
# fill label with file info
self.labelInput.set_text('')
- self.labelInput.set_text('Codec info for '+self.input[-1]+'\n\n'\
- 'Audio codec: '+str(self.audio_codec[0])+'\n'\
- 'Audio bitrate: '+str(self.audio_codec[4])+' kb/s\n'\
- +'Video codec: '+ str(self.video_codec[0])\
- +'\nVideo resolution: '+ str(self.video_codec[2])\
- +'\nVideo bitrate: '+ str(self.video_codec[3])\
- +'\n'+'Number of frames: '+str(self.file_frames))
- self.ListOfInputFiles='\n'
+ self.labelInput.set_text(' Codec info for\n '+self.input[-1]+'\n\n'\
+ ' Audio codec: '+str(self.audio_codec[0])+\
+ ', '+str(self.audio_codec[1])+\
+ ', '+str(self.audio_codec[2])+'\n'\
+ ' Video codec: '+str(self.video_codec[0])+\
+ ', '+str(self.video_codec[1])+\
+ ', '+str(self.video_codec[2])+\
+ ', '+str(self.video_codec[3])+'\n'\
+ ' Bitrate: '+str(self.bitrate_info[0])+'\n'
+ ' Number of frames: '+str(self.file_frames)+'\n')
+ self.ListOfInputFiles = '\n'
for i in range(len(self.input)):
- StringToAdd=str(i+1)+'. '+self.input[i]+'\n'
- self.ListOfInputFiles=self.ListOfInputFiles+StringToAdd
+ StringToAdd = str(i+1)+'. '+self.input[i]+'\n'
+ self.ListOfInputFiles = self.ListOfInputFiles+StringToAdd
self.labelGuide.set_text('Input file(s): '+self.ListOfInputFiles)
- def RemoveInputFile(self,widget):
+ def RemoveInputFile(self, widget):
####################
# Description
# ===========
@@ -398,7 +410,7 @@
#
####################
#base this on a message dialog
- dialog = gtk.MessageDialog(None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,gtk.MESSAGE_QUESTION,gtk.BUTTONS_OK_CANCEL,None)
+ dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, None)
dialog.set_markup('Enter the number of the input file you wish to remove')
#create the text input field
entry = gtk.Entry()
@@ -414,18 +426,17 @@
dialog.vbox.pack_end(hbox, True, True, 0)
dialog.show_all()
#go go go
- Response=dialog.run()
+ Response = dialog.run()
if Response == gtk.RESPONSE_OK:
try:
InputFileToRemove = int(entry.get_text())-1
- # Clear everything if we are removing the last tile
+ # Clear everything if we are removing the last tile
if len(self.input) >= 2:
del self.input[InputFileToRemove]
self.setinput(widget)
self.NextInputFileToConvert = 0
else:
self.ResetSinthgunt(widget)
- self.ResetSinthgunt(widget)
except:
pass
@@ -447,25 +458,21 @@
# This function uses ffmpeg to generate a thumbnail.
####################
- # get file base name
- temp = videoFile.split('/')
- N = len(temp)
- videoFileBaseName = temp[N-1]
- # set thumbnail filename
- thumbnailFileName = sinthgunt.TEMP_DIR+str(videoFileBaseName)+".jpg"
+ thumbnailFileName = sinthgunt.TEMP_DIR+"videothumbnail.jpg"
+ logfile_remove(thumbnailFileName)
# ffmpeg command line
- subcommand = ['ffmpeg', '-y', '-itsoffset', '-5' ,'-i' ,videoFile,\
- "-vcodec","mjpeg","-vframes", "1", "-an", "-f", "rawvideo", "-s", "170x128",\
- thumbnailFileName]
+ subcommand = ['ffmpeg', '-v', 'warning', '-y', '-itsoffset', '-5', '-i', videoFile, \
+ '-vcodec', 'mjpeg', '-vframes', '1', '-an', '-f', 'rawvideo', '-s', '172x129', \
+ '-vf', 'crop=4/3*in_h:in_h', '-filter', 'format=rgb24', thumbnailFileName]
- thumbProcess = subprocess.Popen(args=subcommand,
- stdout=subprocess.PIPE,stdin=subprocess.PIPE,
- stderr=subprocess.STDOUT,shell=False)
+ thumbProcess = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
# Read output from thumbnail process and write it to the log file
- output = str(thumbProcess.stdout.read(100))
- self.logfile.writelines('Thumbnail process status: '+output+'\n')
+ output = str(thumbProcess.stdout.read(300))
+ self.logfile.writelines('\n\nThumbnail process status:\n'+output+'\n')
# Wait for thumbnail process to complete
thumbProcess.wait()
@@ -474,7 +481,7 @@
return thumbnailFileName
- def generatePreview(self,widget):
+ def generatePreview(self, widget):
####################
# Description
# ===========
@@ -495,17 +502,64 @@
try:
operation = self.operation_radiobutton
context_id = self.statusbar.get_context_id("Activation")
- self.statusbar.push(context_id,'Creating preview of '+self.input[-1]+'. You can view it using the Play menu.')
+ self.statusbar.push(context_id, 'Creating preview of '+self.input[-1]+'. You can view it using the Play menu.')
#for now, operate on last input file
- InputFileName=self.input[-1]
+ InputFileName = self.input[-1]
+
for i in range(self.Npreset):
- if operation == self.presetlist[i][1]:
+ if operation == self.presetlist[i][1] and '2Pass' in self.presetlist[i][1]:
# generate command line in subprocess syntax
- subcommand = ['/usr/bin/ffmpeg','-y','-i']
+ subcommand = ['/usr/bin/ffmpeg', '-v', 'warning', '-y', '-i']
subcommand.extend([InputFileName])
- subcommand.extend(['-t','5'])
- temp1=self.presetlist[i][2].split(' ')
+ subcommand.extend(['-t', '5', '-an', '-pass', '1', '-passlogfile', '/tmp/twopass'])
+ temp1 = self.presetlist[i][2].split(' ')
+ # remove empty entries ('') from the array
+ for ii in range(20):
+ try:
+ temp1.remove('')
+ except:
+ pass
+ temp1.extend(['/dev/null'])
+ subcommand.extend(temp1)
+ # Start converting
+ first_pass_process = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
+
+ self.logfile.writelines('\nConversion command:\n'+str(subcommand)+'\n')
+
+ first_pass_process.wait()
+
+ # generate command line in subprocess syntax
+ subcommand = ['/usr/bin/ffmpeg', '-v', 'warning', '-y', '-i']
+ subcommand.extend([InputFileName])
+ subcommand.extend(['-t', '5', '-pass', '2', '-passlogfile', '/tmp/twopass'])
+ temp1 = self.presetlist[i][2].split(' ')
+ # remove empty entries ('') from the array
+ for ii in range(20):
+ try:
+ temp1.remove('')
+ except:
+ pass
+ temp1.extend([str(InputFileName+"_preview_twopass."+self.presetlist[i][3])])
+ # path to output file
+ self.output = str(InputFileName+"_preview_twopass."+self.presetlist[i][3])
+ subcommand.extend(temp1)
+ # Start converting
+ second_pass_process = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
+
+ self.logfile.writelines('\n'+str(subcommand)+'\n')
+
+ second_pass_process.wait()
+
+ if operation == self.presetlist[i][1] and '2Pass' not in self.presetlist[i][1]:
+ subcommand = ['/usr/bin/ffmpeg', '-v', 'warning', '-y', '-i']
+ subcommand.extend([InputFileName])
+ subcommand.extend(['-t', '5'])
+ temp1 = self.presetlist[i][2].split(' ')
# remove empty entries ('') from the array
for ii in range(20):
try:
@@ -514,19 +568,21 @@
pass
temp1.extend([str(InputFileName+"_preview."+self.presetlist[i][3])])
# path to output file
- self.output=str(InputFileName+"_preview."+self.presetlist[i][3])
+ self.output = str(InputFileName+"_preview."+self.presetlist[i][3])
subcommand.extend(temp1)
# Start converting
- self.process = subprocess.Popen(args=subcommand,
- stdout=subprocess.PIPE,stdin=subprocess.PIPE,
- stderr=subprocess.STDOUT,shell=False)
+ converting_process = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
+
+ self.logfile.writelines('\nConversion command:\n'+str(subcommand)+'\n')
- self.logfile.writelines('Conversion command: '+str(subcommand)+'\n')
+ converting_process.wait()
except:
self.no_file_selected_dialog(widget)
- def BeginConversion(self,widget,InputFileIndex):
+ def BeginConversion(self, widget, InputFileIndex):
####################
# Description
# ===========
@@ -542,7 +598,7 @@
####################
- def activate(self,widget):
+ def activate(self, widget):
####################
# Description
# ===========
@@ -556,24 +612,96 @@
# ===============
#
####################
+
+ self.function_activate = True
# Get selected operation from menu
try:
operation = self.operation_radiobutton
- self.progressbar.set_fraction(0.01)
- context_id = self.statusbar.get_context_id("Activation")
- self.statusbar.push(context_id,'Converting '+self.input[self.NextInputFileToConvert])
+ InputFileName = self.input[self.NextInputFileToConvert]
+ # generate thumbnail from input file
+ self.thumbnail_filename = self.generateThumbnail(InputFileName)
- #start watching output
- self.source_id = gobject.timeout_add(500, self.checkfile)
- InputFileName=self.input[self.NextInputFileToConvert]
+ # update thumbnail
+ try:
+ self.thumbnail.set_from_file(self.thumbnail_filename)
+ except:
+ pass
+ # get media file info
+ mediaFileInformation = self.file_getinfo()
+
+ # fill label with file info
+ self.labelInput.set_text('')
+ self.labelInput.set_text(' Codec info for\n '+InputFileName+'\n\n'\
+ ' Audio codec: '+str(self.audio_codec[0])+\
+ ', '+str(self.audio_codec[1])+\
+ ', '+str(self.audio_codec[2])+'\n'\
+ ' Video codec: '+str(self.video_codec[0])+\
+ ', '+str(self.video_codec[1])+\
+ ', '+str(self.video_codec[2])+\
+ ', '+str(self.video_codec[3])+'\n'\
+ ' Bitrate: '+str(self.bitrate_info[0])+'\n'
+ ' Number of frames: '+str(self.file_frames)+'\n')
+
for i in range(self.Npreset):
- if operation == self.presetlist[i][1]:
+
+ if operation == self.presetlist[i][1] and '2Pass' in self.presetlist[i][1]:
+ # generate command line in subprocess syntax
+ subcommand = ['/usr/bin/ffmpeg', '-v', 'warning', '-y', '-i']
+ subcommand.extend([InputFileName])
+ subcommand.extend(['-an', '-pass', '1', '-passlogfile', '/tmp/twopass'])
+ temp1 = self.presetlist[i][2].split(' ')
+ # remove empty entries ('') from the array
+ for ii in range(20):
+ try:
+ temp1.remove('')
+ except:
+ pass
+ temp1.extend(['/dev/null'])
+ subcommand.extend(temp1)
+ # Start converting
+ first_pass_process = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
+
+ self.logfile.writelines('\nConversion command:\n'+str(subcommand)+'\n')
+
+ first_pass_process.wait()
+
+ # generate command line in subprocess syntax
+ subcommand = ['/usr/bin/ffmpeg', '-v', 'warning', '-stats', '-y', '-i']
+ subcommand.extend([InputFileName])
+ subcommand.extend(['-pass', '2', '-passlogfile', '/tmp/twopass'])
+ temp1 = self.presetlist[i][2].split(' ')
+ # remove empty entries ('') from the array
+ for ii in range(20):
+ try:
+ temp1.remove('')
+ except:
+ pass
+ temp1.extend([str(InputFileName+"_twopass."+self.presetlist[i][3])])
+ # path to output file
+ self.output = str(InputFileName+"_twopass."+self.presetlist[i][3])
+ subcommand.extend(temp1)
+ # Start converting
+ self.process = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
+
+ self.logfile.writelines('\n'+str(subcommand)+'\n\n')
+ self.progressbar.set_fraction(0.0)
+ context_id = self.statusbar.get_context_id("Activation")
+ self.statusbar.push(context_id, 'Converting '+self.input[self.NextInputFileToConvert]+' (second pass)')
+ #start watching output
+ self.source_id = gobject.timeout_add(500, self.checkfile)
+ self.function_activate = False
+
+ if operation == self.presetlist[i][1] and '2Pass' not in self.presetlist[i][1]:
# generate command line in subprocess syntax
- subcommand = ['/usr/bin/ffmpeg','-y','-i']
+ subcommand = ['/usr/bin/ffmpeg', '-v', 'warning', '-stats', '-y', '-i']
subcommand.extend([InputFileName])
- temp1=self.presetlist[i][2].split(' ')
+ temp1 = self.presetlist[i][2].split(' ')
# remove empty entries ('') from the array
for ii in range(20):
try:
@@ -582,19 +710,25 @@
pass
temp1.extend([str(InputFileName+"."+self.presetlist[i][3])])
# path to output file
- self.output=str(InputFileName+"."+self.presetlist[i][3])
+ self.output = str(InputFileName+"."+self.presetlist[i][3])
subcommand.extend(temp1)
# Start converting
- self.process = subprocess.Popen(args=subcommand,
- stdout=subprocess.PIPE,stdin=subprocess.PIPE,
- stderr=subprocess.STDOUT,shell=False)
+ self.process = subprocess.Popen(args = subcommand,
+ stdout = subprocess.PIPE, stdin = subprocess.PIPE,
+ stderr = subprocess.STDOUT, shell = False)
- self.logfile.writelines('Conversion command: '+str(subcommand)+'\n')
+ self.logfile.writelines('\nConversion command:\n'+str(subcommand)+'\n\n')
+ self.progressbar.set_fraction(0.0)
+ context_id = self.statusbar.get_context_id("Activation")
+ self.statusbar.push(context_id, 'Converting '+self.input[self.NextInputFileToConvert])
+ #start watching output
+ self.source_id = gobject.timeout_add(500, self.checkfile)
+ self.function_activate = False
except:
self.no_file_selected_dialog(widget)
- def stop(self,widget):
+ def stop(self, widget):
####################
# Description
# ===========
@@ -608,19 +742,19 @@
#
####################
try:
- os.kill(self.process.pid,9)
+ os.kill(self.process.pid, 9)
gobject.source_remove(self.source_id)
self.progressbar.set_fraction(0.0)
self.progressbar.set_text('')
- self.logfile.writelines('Conversion aborted by user\n')
+ self.logfile.writelines('\nConversion aborted by user\n')
context_id = self.statusbar.get_context_id("Activation")
- self.statusbar.push(context_id,'Conversion aborted!')
+ self.statusbar.push(context_id, 'Conversion aborted!')
except:
pass
- def quit_program(self,widget):
+ def quit_program(self, widget):
####################
# Description
# ===========
@@ -634,7 +768,7 @@
#
####################
self.stop
- self.logfile.writelines('****** Sinthgunt log file STOP - '+str(time.ctime())+' *******\n')
+ self.logfile.writelines('\n******* Sinthgunt log file STOP - '+str(time.ctime())+' *******\n\n')
self.logfile.close
gtk.main_quit()
@@ -653,17 +787,21 @@
# ===============
#
####################
- self.audio_codec = ['N/A','N/A','N/A','N/A','N/A']
- self.video_codec = ['N/A','N/A','N/A','N/A','N/A']
+ self.audio_codec = ['N/A', 'N/A', 'N/A']
+ self.video_codec = ['N/A', 'N/A', 'N/A', 'N/A']
+ self.bitrate_info = ['N/A']
self.file_frames = 0
- InputFileName=self.input[-1]
- command = ["ffmpeg","-i",InputFileName]
+ if self.function_activate == True:
+ InputFileName = self.input[self.NextInputFileToConvert]
+ else:
+ InputFileName = self.input[-1]
+ command = ['ffmpeg', '-i', InputFileName]
- process = subprocess.Popen(args=command,stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
+ process = subprocess.Popen(args = command, stdout = subprocess.PIPE,
+ stdin = subprocess.PIPE, stderr = subprocess.STDOUT)
flag = 1
- counter=0
+ counter = 0
try:
while flag == 1:
try:
@@ -672,49 +810,66 @@
break
if output != '\n' and output != '':
- self.logfile.writelines('Get file info status: '+output+'\n')
+ self.logfile.writelines('\nGet file info status:\n'+output+'\n')
output_split = output.split(' ')
- N=len(output_split)
+ N = len(output_split)
for i in range(N):
# Find length of audio/video file in seconds
- if output_split[i]=='Duration:':
- file_length_min=output_split[i+1]
- file_length_min_split=file_length_min.split(':')
+ if output_split[i] == 'Duration:':
+ file_length_min = output_split[i+1]
+ file_length_min_split = file_length_min.split(':')
temp = file_length_min_split[2].split('.')
- file_length_min_split[2]=temp[0]
+ file_length_min_split[2] = temp[0]
# Calculate length of file in seconds
- file_length_sec=3600*float(file_length_min_split[0])+\
+ file_length_sec = 3600*float(file_length_min_split[0])+\
60*float(file_length_min_split[1])+\
float(file_length_min_split[2])
+
+ # Find video bitrate
+ if output_split[i] == 'bitrate:':
+ self.bitrate_info[0] = output_split[i+1].strip(',')+' kb/s'
# Find video codec
- if output_split[i]=='Video:':
+ if output_split[i] == 'Video:':
self.video_codec[0] = output_split[i+1].strip(',')
- self.video_codec[1] = output_split[i+2].strip(',')
- self.video_codec[2] = output_split[i+3].strip(',')
-
- # Find video bitrate
- if output_split[i]=='bitrate:':
- self.video_codec[3] = output_split[i+1].strip(',')+' kb/s'
+
+ if i >= 2 and (output_split[i] == 'yuv420p,'):
+ self.video_codec[1] = output_split[i+1].strip(',')
+ elif i >= 2 and (output_split[i] == 'rgb24,'):
+ self.video_codec[1] = output_split[i+1].strip(',')
+ elif i >= 2 and (output_split[i] == 'yuv444p,'):
+ self.video_codec[1] = output_split[i+1].strip(',')
+ elif i >= 2 and (output_split[i] == 'yuv420p(tv),'):
+ self.video_codec[1] = output_split[i+1].strip(',')
+
+ if i >= 2 and (output_split[i] == 'kb/s,'):
+ self.video_codec[2] = output_split[i-1]+' kb/s'
+
+ if i >= 2 and (output_split[i] == 'fps,'):
+ self.video_codec[3] = output_split[i-1]+' fps'
# Find frames pr. second in the file
- if i>=2 and (output_split[i]=='tb(r)\n' or output_split[i]=='tb(r)\nMust' or output_split[i]=='tbr,'):
- file_fps=output_split[i-1]
+ if i >= 2 and (output_split[i] == 'tb(r)\n' or output_split[i] == 'tb(r)\nMust' or output_split[i] == 'tbr,'):
+ file_fps = output_split[i-1]
# Calculate total number of frames
self.file_frames = int(file_length_sec*float(file_fps))
# Find audio codec
- if output_split[i]=='Audio:':
- self.audio_codec = [output_split[i+1].strip(','),
- output_split[i+2].strip(','),
- output_split[i+3].strip(','),
- output_split[i+4].strip(','),
- output_split[i+5]]
- #flag = 0
+ if output_split[i] == 'Audio:':
+ self.audio_codec[0] = output_split[i+1].strip(',')
+
+ if i >= 2 and (output_split[i] == 'Hz,'):
+ self.audio_codec[1] = output_split[i-1]+' Hz'
+
+ if i >= 2 and (output_split[i] == 'fltp,'):
+ self.audio_codec[2] = output_split[i+1]+' kb/s'
+ elif i >= 2 and (output_split[i] == 's16p,'):
+ self.audio_codec[2] = output_split[i+1]+' kb/s'
+
# Stop if we reach the end of ffmpeg's output
- if counter >= 1000 or output_spilt[i]=='file\n':
+ if counter >= 1000 or output_split[i] == 'file\n':
flag = 0
counter = counter+1
except:
@@ -723,7 +878,7 @@
self.logfile.writelines('Video codec: '+str(self.video_codec)+'\n')
self.logfile.writelines('Number of frames: '+str(self.file_frames)+'\n')
- def aboutdialog(self,widget):
+ def aboutdialog(self, widget):
####################
# Description
# ===========
@@ -746,9 +901,9 @@
\nConvert button in the main window.\
\n\nPlease visit http://www.sinthgunt.org\
\nfor more info."
- self.InformationDialog(widget,dialogtext)
+ self.InformationDialog(widget, dialogtext)
- def no_file_selected_dialog(self,widget):
+ def no_file_selected_dialog(self, widget):
####################
# Description
# ===========
@@ -761,11 +916,11 @@
# ===============
#
####################
- dialogtext = "You have to select a file and/or a preset before you \
+ dialogtext = "\n You have to select a file and/or a preset before you \
\ncan begin converting!"
- self.ErrorDialog(widget,dialogtext)
+ self.ErrorDialog(widget, dialogtext)
- def unsupported_codec_dialog(self,widget):
+ def unsupported_codec_dialog(self, widget):
####################
# Description
# ===========
@@ -778,13 +933,13 @@
# ===============
#
####################
- dialogtext = "You have selected a preset which is (probably) not supported by your version of ffmpeg. \
+ dialogtext = " You have selected a preset which is (probably) not supported by your version of ffmpeg. \
To upgrade ffmpeg, please check your distribution documentation. \
-\n If you want, you may disregard this warning and check the log file (sinthgunt.log) \
-after pressing the convert button"
- self.ErrorDialog(widget,dialogtext)
+\n If you want, you may disregard this warning and check the log file (~/.sinthgunt.log) \
+after pressing the convert button."
+ self.ErrorDialog(widget, dialogtext)
- def ErrorDialog(self,widget,dialogtext):
+ def ErrorDialog(self, widget, dialogtext):
####################
# Description
# ===========
@@ -802,10 +957,10 @@
gtk.BUTTONS_NONE, dialogtext)
message.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
resp = message.run()
- if resp == gtk.RESPONSE_CLOSE:
+ if resp == gtk.RESPONSE_CLOSE or gtk.STOCK_CLOSE:
message.destroy()
- def InformationDialog(self,widget,dialogtext):
+ def InformationDialog(self, widget, dialogtext):
####################
# Description
# ===========
@@ -821,13 +976,13 @@
message = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, dialogtext)
message.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
resp = message.run()
- if resp == gtk.RESPONSE_CLOSE:
+ if resp == gtk.RESPONSE_CLOSE or gtk.STOCK_CLOSE:
message.destroy()
- def menuradiobuttonselect(self,widget):
+ def menuradiobuttonselect(self, widget):
####################
# Description
# ===========
@@ -840,18 +995,22 @@
#
####################
self.operation_radiobutton = ''
- counter=0
+ counter = 0
for presetmenu1header in self.presetmenu1headerholder:
for item in presetmenu1header:
if item.get_active() == True:
self.operation_radiobutton = self.presetlist[counter][1]
- self.labelOperation.set_text('Output to '+self.presetlist[counter][1])
+ self.labelOperation.set_text('Output to '+self.presetlist[counter][1]+' ')
# if preset is not supported, display unsupported_codec_dialog
- if self.preset_enabled[counter]==False:
+ if self.preset_enabled[counter] == False and self.already_executed == False:
self.unsupported_codec_dialog(widget)
- self.labelOperation.set_text('Output to '+self.presetlist[counter][1]+'\n(Preset not supported by ffmpeg)')
+ self.labelOperation.set_text('Output to '+self.presetlist[counter][1]+' (preset not supported) ')
+ #item.set_active(True)
+ self.already_executed = True
+ elif self.preset_enabled[counter] == False and self.already_executed == True:
+ self.labelOperation.set_text('Output to '+self.presetlist[counter][1]+' (preset not supported) ')
#item.set_active(True)
- counter = counter + 1
+ counter = counter+1
def parseXML(self):
@@ -877,48 +1036,48 @@
xml_file = os.path.dirname(xml_file) # load xml file
xml_file = os.path.join(xml_file, self.DATA_DIR+"presets.xml")
optionsXML = etree.parse(xml_file)
- presets=[]
- row = [' ',' ',' ',' ',[]]
+ presets = []
+ row = [' ', ' ', ' ', ' ', []]
- # Iterate through presets in xml file
+ # Iterate through presets in xml file
for child in optionsXML.getiterator():
if child.tag == 'label': # preset name
- row[1]=child.text
+ row[1] = child.text
if child.tag == 'params': # preset ffmpeg command line options
- row[2]=child.text
+ row[2] = child.text
if child.tag == 'extension': # output file extension
- row[3]=child.text.strip(' ')
+ row[3] = child.text.strip(' ')
if child.tag == 'category': # preset category
- row[0]=child.text
+ row[0] = child.text
if child.tag == 'codecs': # encoding codecs required by preset
- row[4]=child.text.split(',')
+ row[4] = child.text.split(',')
presets.append(row)
- row = [' ',' ',' ',' ',[]]
+ row = [' ', ' ', ' ', ' ', []]
# (planned): Test if codec will work
- # Sort by category name
- presets.sort(lambda x, y: cmp(x[0],y[0]))
+ # Sort by category name
+ presets.sort(lambda x, y: cmp(x[0], y[0]))
- # find category list
- categories=[presets[0][0]]
- for row in presets:
- if row[0]!=categories[-1]:
- categories.append(row[0])
+ # find category list
+ categories = [presets[0][0]]
+ for row in presets:
+ if row[0] != categories[-1]:
+ categories.append(row[0])
# make lists global
- self.presetlist=presets
- self.categorylist=categories
+ self.presetlist = presets
+ self.categorylist = categories
# Get codecs and check if encoding and/or decoding is avaliable
self.ffmpeg_getcodecs()
- def ffmpeg_getinfo(self,widget):
+ def ffmpeg_getinfo(self, widget):
####################
# Description
# ===========
@@ -936,16 +1095,16 @@
#
####################
self.ffmpeg_getcodecs()
- command = ["ffmpeg","-version"]
+ command = ['ffmpeg', '-version']
output = ''
try:
- process = subprocess.Popen(args=command,stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
+ process = subprocess.Popen(args = command, stdout = subprocess.PIPE,
+ stdin = subprocess.PIPE, stderr = subprocess.STDOUT)
output = str(process.stdout.read(10000))
except:
None
- dialogtext=output
- self.InformationDialog(widget,dialogtext)
+ dialogtext = output
+ self.InformationDialog(widget, dialogtext)
def ffmpeg_getcodecs(self):
####################
@@ -960,224 +1119,73 @@
# ===============
#
####################
- command = ["ffmpeg","-formats"]
+ command = ['ffmpeg', '-v', 'warning', '-formats']
output = ''
try:
- process = subprocess.Popen(args=command,stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
+ process = subprocess.Popen(args = command, stdout = subprocess.PIPE,
+ stdin = subprocess.PIPE, stderr = subprocess.STDOUT)
output = str(process.stdout.read(20000))
except:
None
- #self.logfile.writelines('ffmpeg_getformats output: '+str(output))
- command = ["ffmpeg","-codecs"]
+ command = ['ffmpeg', '-v', 'warning', '-codecs']
try:
- process = subprocess.Popen(args=command,stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
+ process = subprocess.Popen(args = command, stdout = subprocess.PIPE,
+ stdin = subprocess.PIPE, stderr = subprocess.STDOUT)
output += str(process.stdout.read(20000))
except:
None
- self.logfile.writelines('ffmpeg_getcodecs output: '+str(output))
+ self.logfile.writelines('\nCodecs output:\n'+str(output)+'\n')
- output_lines=output.split('\n')
- codecs_raw=[]
- Ncodecs=0
+ output_lines = output.split('\n')
+ codecs_raw = []
+ Ncodecs = 0
for line in output_lines:
- line_split=line.split(' ')
- line_codec=line_split[0:7]
+ line_split = line.split(' ')
+ line_codec = line_split[0:7]
for i in range(20):
try:
line_codec.remove('')
except:
pass
codecs_raw.append(line_codec)
- Ncodecs=Ncodecs+1
- self.logfile.writelines('ffmpeg_getcodecs codecs_raw: '+str(codecs_raw))
+ Ncodecs = Ncodecs+1
+ self.logfile.writelines('\nRaw codecs:\n'+str(codecs_raw)+'\n')
# look for encoding
- self.codecs=[]
+ self.codecs = []
for i in range(Ncodecs):
- flag = 0
+ flagA = 0
+ flagB = 0
try:
# row: codec name, encode, decode
- row = ['',False,False]
+ row = ['', False, False]
# Check to see if we can encode
- if codecs_raw[i][0].find('E')== 0 or codecs_raw[i][0].find('E')== 1:
- row[0]=codecs_raw[i][-1]
- row[1]=True
- flag = 1
+ if codecs_raw[i][0].find('E') == 0 or codecs_raw[i][0].find('E') == 1:
+ row[0] = codecs_raw[i][-1]
+ row[1] = True
+ flagA = 1
# Check to see if we can decode
- if codecs_raw[i][0].find('D')== 0 or codecs_raw[i][0].find('D')== 1:
- row[0]=codecs_raw[i][-1]
- row[2]=True
- flag =1
+ if codecs_raw[i][0].find('D') == 0 or codecs_raw[i][0].find('D') == 1:
+ row[0] = codecs_raw[i][-1]
+ row[2] = True
+ flagB = 1
# Only add codec if we can either encode or decode
- if flag==1:
+ if flagA and flagB == 1:
self.codecs.append(row)
except:
pass
# Debugging codec row
- row = ['debugcodec',True,True]
+ row = ['debugcodec', True, True]
self.codecs.append(row)
- self.logfile.writelines('ffmpeg_getcodecs self.codecs: '+str(self.codecs))
-
-
-#####################
-## YouTube functions
-#####################
- def menuopenyoutube(self,widget):
- ####################
- # Description
- # ===========
- """ Dialog that allows the user to enter a YouTube url.
- Once the user presses the 'ok' button, the download will begin"""
- # Arguments
- # =========
- #
- # Further Details
- # ===============
- #
- ####################
- #base this on a message dialog
- dialog = gtk.MessageDialog(None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,gtk.MESSAGE_QUESTION,gtk.BUTTONS_OK_CANCEL,None)
- dialog.set_markup('Please enter a link to a video file, eg.')
- #create the text input field
- entry = gtk.Entry()
- #allow the user to press enter to do ok
- #entry.connect("activate", dialog.response(response), dialog, gtk.RESPONSE_OK)
- #create a horizontal box to pack the entry and a label
- hbox = gtk.HBox()
- hbox.pack_start(gtk.Label("URL:"), False, 5, 5)
- hbox.pack_end(entry)
- #some secondary text
- dialog.format_secondary_markup("http://www.youtube.com/watch?v=LkCNJRfSZBU\n\n\
-Sinthgunt supports YouTube, Metacafe, Google Video, Photobucket and Yahoo! Video.")
- #add it and show it
- dialog.vbox.pack_end(hbox, True, True, 0)
- dialog.show_all()
- # Start dialog.
- Response = dialog.run()
- self.youtubeurl = entry.get_text()
- dialog.destroy()
- dialog.destroy()
- # Did we press Ok? If yes, proceed
- if Response == gtk.RESPONSE_OK:
- try:
- # Look for direct link to media file
- if self.youtubeurl[-4]=='.':
- # find last '/'
- for i in range(len(self.youtubeurl)):
- if self.youtubeurl[-i]=='/':
- output=self.youtubeurl[-i+1:]
- break
- self.input.extend([os.getenv("HOME")+'/'+output])
- self.download(widget,self.youtubeurl)
- self.setinput(widget)
- else:
- self.download_youtube_dl(widget,self.youtubeurl)
- self.setinput(widget)
- except:
- pass
-
-
- def download(self,widget,url):
- ####################
- # Description
- # ===========
- """Copy the contents of a file from a given URL to a local file."""
- # Arguments
- # =========
- # url http url of the remote file to download eg. http://www.example.org/movie.mpg
- #
- # Further Details
- # ===============
- #
- ####################
- webFile=urllib.urlretrieve(url, self.input[-1],lambda nb, bs, fs, url=url: self._reporthook(widget,nb,bs,fs,url))
-
- def download_youtube_dl(self,widget,url):
- ####################
- # Description
- # ===========
- """Downloads video files from sites like youtube.com, metacafe.com and video.google.com."""
- # Arguments
- # =========
- # url http url of the remote file to download eg. http://www.example.org/movie.mpg
- #
- # Further Details
- # ===============
- # This function uses youtube-dl to get the url of the video and the title.
- ####################
-
- # Get video url from youtube-dl
- command = ["youtube-dl-sinthgunt","-g",url]
- output = ''
- try:
- process = subprocess.Popen(args=command,stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
- output = str(process.stdout.read())
- except:
- None
-
- # Remove trailing newline
- video_url = output.strip()
-
- # Get video title from youtube-dl
- command = ["youtube-dl-sinthgunt","-e",url]
- output = ''
- try:
- process = subprocess.Popen(args=command,stdout=subprocess.PIPE,
- stdin=subprocess.PIPE,stderr=subprocess.STDOUT)
- output = str(process.stdout.read())
- except:
- None
-
- # Remove trailing newline
- video_title = output.strip()
-
- # Add file to input que
- self.input.extend([os.getenv("HOME")+'/'+video_title+".flv"])
-
- # Download the file
- webFile=urllib.urlretrieve(video_url, self.input[-1],lambda nb, bs, fs, url=url: self._reporthook(widget,nb,bs,fs,url))
-
-
- def _reporthook(self,widget,numblocks, blocksize, filesize, url=None):
- ####################
- # Description
- # ===========
- """Prints the download status to the status bar."""
- # Arguments
- # =========
- #
- # Further Details
- # ===============
- #
- ####################
- base = os.path.basename(url)
- #Should handle possible filesize=-1.
- try:
- percent = min((numblocks*blocksize*100)/filesize, 100)
- except:
- percent = 100
- if numblocks != 0:
- sys.stdout.write("\b"*70)
- context_id = self.statusbar.get_context_id("Activation")
- self.statusbar.push(context_id,'Downloaded '+str(percent)+'% from '+self.youtubeurl)
- self.progressbar.set_fraction(float(percent)/100)
- if percent==100:
- self.statusbar.push(context_id,'Downloaded completed. Saved as '+self.input[-1])
- self.setinput(widget)
- # Wait for gui to update
- while gtk.events_pending():
- gtk.main_iteration(False)
+ self.logfile.writelines('\nRow codecs:\n'+str(self.codecs)+'\n')
#####################
## mplayer functions
#####################
- def mplayer_check(self,widget):
+ def mplayer_check(self, widget):
####################
# Description
# ===========
@@ -1190,12 +1198,12 @@
#
####################
return False
- if os.path.exist('/usr/bin/mplayer'):
+ if os.path.exists('/usr/bin/mplayer'):
return True
else:
return False
- def mplayer_play_input_file(self,widget):
+ def mplayer_play_input_file(self, widget):
####################
# Description
# ===========
@@ -1209,17 +1217,17 @@
#
####################
if self.mplayer_check:
- whattoplay=' '
+ whattoplay = ' '
try:
- whattoplay=self.input[-1]
+ whattoplay = self.input[-1]
except Exception, e:
raise e
- command = ["mplayer","-vo","x11",whattoplay]
- process = subprocess.Popen(args=command)
+ command = ['mplayer', '-vo', 'x11', whattoplay]
+ process = subprocess.Popen(args = command)
else:
print 'Mplayer must be installed and found in /usr/bin for this function to work'
- def mplayer_play_output_file(self,widget):
+ def mplayer_play_output_file(self, widget):
####################
# Description
# ===========
@@ -1233,13 +1241,13 @@
#
####################
if self.mplayer_check:
- whattoplay=' '
+ whattoplay = ' '
try:
- whattoplay=self.output
+ whattoplay = self.output
except Exception, e:
raise e
- command = ["mplayer","-vo","x11",whattoplay]
- process = subprocess.Popen(args=command)
+ command = ['mplayer', '-vo', 'x11', whattoplay]
+ process = subprocess.Popen(args = command)
else:
print 'Mplayer must be installed and found in /usr/bin for this function to work'
@@ -1286,13 +1294,11 @@
"MainWindow_destroy" : self.quit_program,
"on_menuquit_activate" : self.quit_program,
"on_menuopen_activate" : self.menuopenfile,
- "on_menuopenyoutube_activate" : self.menuopenyoutube,
"on_toolbaropen_clicked" : self.menuopenfile,
- "on_toolbaropenyoutube_clicked" : self.menuopenyoutube,
"on_menuconvert_activate" : self.activate,
"on_menuabout_activate" : self.aboutdialog,
"on_menuffmpeginfo_activate" : self.ffmpeg_getinfo,
- "on_menuPlayInput_activate" : self.mplayer_play_input_file,
- "on_menuPlayOutput_activate" : self.mplayer_play_output_file}
+ "on_menuPlayInput_activate" : self.mplayer_play_input_file,
+ "on_menuPlayOutput_activate" : self.mplayer_play_output_file}
#Do the magic connecting to the widgets
self.wTree.signal_autoconnect(self.dic)
diff -3ur a/setup.py b/setup.py
--- a/setup.py 2013-02-15 18:23:20.000000000 +0400
+++ b/setup.py 2017-02-20 16:38:40.000000000 +0300
@@ -17,7 +17,7 @@
license = 'GPLv3',
packages = ['Sinthgunt'],
package_data = {'sinthgunt': files},
- scripts = ['sinthgunt','youtube-dl-sinthgunt'],
+ scripts = ['sinthgunt'],
data_files=[
('/usr/share/sinthgunt',['share/sinthgunt.glade','share/presets.xml','share/logo.png','share/icon.png','README.txt','LICENSE.txt','sinthgunt.html']),
('/usr/share/applications',['share/sinthgunt.desktop']),
diff -3ur a/share/presets.xml b/share/presets.xml
--- a/share/presets.xml 2010-11-14 15:02:41.000000000 +0300
+++ b/share/presets.xml 2017-03-03 23:52:17.000000000 +0300
@@ -9,199 +9,199 @@
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x240 -b 600k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x240 -b:v 600k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x176 -b 600k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x176 -b:v 600k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x128 -b 224k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x128 -b:v 224k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x96 -b 224k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x96 -b:v 224k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 128x96 -b 224k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 128x96 -b:v 224k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 128x80 -b 224k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 128x80 -b:v 224k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 96k -ar 44100 -vcodec mpeg2video -s 224x176 -b 224k -r 10 -strict -1
+ -acodec libmp3lame -ab 96k -ar 44100 -vcodec mpeg2video -s 224x176 -b:v 224k -r 10 -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 96k -ar 44100 -vcodec mpeg2video -s 224x128 -b 256k -r 15 -strict -1
+ -acodec libmp3lame -ab 96k -ar 44100 -vcodec mpeg2video -s 224x128 -b:v 256k -r 15 -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x240 -b 400k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x240 -b:v 400k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x176 -b 400k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 320x176 -b:v 400k -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
-vn -acodec libfaac -ab 112k -ac 2
- m4a
+ aac
Audio
- libfaac
+ aac
- -f mp4 -r 29.97 -vcodec libxvid -vf scale=640:480,aspect=4:3 -maxrate 2500k -b 2000k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libfaac -ar 48000 -ab 128k -ac 2
+ -f mp4 -r 29.97 -vcodec libxvid -s 640x480 -aspect 4:3 -b:v 2000k -acodec libfaac -ar 48000 -ab 128k -ac 2
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -r 25 -vcodec libxvid -vf scale=640:480,aspect=4:3 -maxrate 2500k -b 2000k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libfaac -ar 48000 -ab 128k -ac 2
+ -f mp4 -r 25 -vcodec libxvid -s 640x480 -aspect 4:3 -b:v 2000k -acodec libfaac -ar 48000 -ab 128k -ac 2
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -b 800k -r 29.97 -vf scale=320:240,aspect=4:3 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
+ -f mp4 -b:v 800k -r 29.97 -s 320x240 -aspect 4:3 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -b 800k -r 25 -vf scale=320:240,aspect=4:3 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
+ -f mp4 -b:v 800k -r 25 -s 320x240 -aspect 4:3 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -r 29.97 -vcodec libxvid -vf scale=704:384,aspect=16:9 -maxrate 3000k -b 2500k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -bf 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libfaac -ar 48000 -ab 128k -ac 2
+ -f mp4 -r 29.97 -vcodec libxvid -s 704x384 -aspect 16:9 -b:v 2500k -acodec libfaac -ar 48000 -ab 128k -ac 2
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -r 25 -vcodec libxvid -vf scale=704:384,aspect=16:9 -maxrate 3000k -b 2500k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -bf 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libfaac -ar 48000 -ab 128k -ac 2
+ -f mp4 -r 25 -vcodec libxvid -s 704x384 -aspect 16:9 -b:v 2500k -acodec libfaac -ar 48000 -ab 128k -ac 2
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -b 800k -r 29.97 -vf scale=352:240,aspect=16:9 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
+ -f mp4 -b:v 800k -r 29.97 -s=352x240 -aspect 16:9 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -b 800k -r 25 -vf scale=352:240,aspect=16:9 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
+ -f mp4 -b:v 800k -r 25 -s 352x240 -aspect 16:9 -vcodec libxvid -ar 48000 -ab 80k -ac 2 -acodec libfaac
mp4
Neuros OSD
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -r 29.97 -vcodec libxvid -vf scale=428:320,aspect=4:3 -maxrate 550k -b 500k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libfaac -ar 44100 -ab 80k -ac 2
+ -f mp4 -vcodec libxvid -s 428x320 -aspect 4:3 -b:v 500k -acodec libfaac -ar 44100 -ab 80k -ac 2
mp4
Palm
- libxvid,libfaac
+ mpeg4,aac
- -f mp4 -r 29.97 -vcodec libxvid -vf scale=480:320,aspect=3:2 -maxrate 450k -b 430k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libfaac -ar 44100 -ab 80k -ac 2
+ -f mp4 -vcodec libxvid -s 480x320 -aspect 3:2 -b:v 430k -acodec libfaac -ar 44100 -ab 80k -ac 2
mp4
Palm
- libxvid,libfaac
+ mpeg4,aac
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x176 -b 320k -r 15 -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x176 -b:v 320k -r 15 -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x128 -b 320k -r 24 -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x128 -b:v 320k -r 24 -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x128 -b 176k -r 15 -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x128 -b:v 176k -r 15 -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x96 -b 224k -r 24 -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 160x96 -b:v 224k -r 24 -strict -1
mpg
Rockbox
- libmp3lame,mpeg2video
+ mp3,mpeg2video
- -f avi -r 29.97 -vcodec libxvid -vtag XVID -vf scale=640:480,aspect=4:3 -maxrate 1800k -b 1500k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -bf 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libmp3lame -ar 48000 -ab 128k -ac 2
+ -f avi -vcodec libxvid -vtag xvid -s 640x480 -aspect 4:3 -b:v 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
avi
AVI
- libxvid,libmp3lame
+ mpeg4,mp3
- -f avi -r 29.97 -vcodec libxvid -vtag XVID -vf scale=704:384,aspect=16:9 -maxrate 1800k -b 1500k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -bf 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libmp3lame -ar 48000 -ab 128k -ac 2
+ -f avi -vcodec libxvid -vtag xvid -s 704x396 -aspect 16:9 -b:v 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
avi
AVI
- libxvid,libmp3lame
+ mpeg4,mp3
- -f avi -r 29.97 -croptop 58 -cropbottom 62 -vcodec libxvid -vtag XVID -vf scale=640:272 -aspect 2.35 -maxrate 1800k -b 1500k -qmin 3 -qmax 5 -bufsize 4096 -mbd 2 -bf 2 -flags +mv4 -trellis -aic -cmp 2 -subcmp 2 -g 300 -acodec libmp3lame -ar 48000 -ab 128k -ac 2
+ -f avi -vf crop=in_h-2*60 -vcodec libxvid -vtag xvid -s 640x272 -aspect 2.35 -b:v 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
avi
AVI
- libxvid,libmp3lame
+ mpeg4,mp3
@@ -219,10 +219,10 @@
- -acodec libmp3lame -vcodec msmpeg4 -ab 192k -b 1000k -s 640x480
+ -acodec libmp3lame -vcodec msmpeg4v3 -ab 192k -b:v 1000k -s 640x480
avi
AVI
- msmpeg4,libmp3lame
+ msmpeg4v3,mp3
@@ -240,14 +240,14 @@
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x176 -b 320k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x176 -b:v 320k -strict -1
mpg
Rockbox
mpeg2video,libmp3lame
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x128 -b 320k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 224x128 -b:v 320k -strict -1
mpg
Rockbox
mpeg2video,libmp3lame
@@ -257,116 +257,116 @@
-acodec libmp3lame -ab 160k -ac 2 -ar 44100
mp3
Audio
- libmp3lame
+ mp3
-acodec libmp3lame -ab 32k -ac 1 -ar 22050
mp3
Mobile Phones
- libmp3lame
+ mp3
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 176x128 -b 256k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 176x128 -b:v 256k -strict -1
mpg
Rockbox
mpeg2video,libmp3lame
- -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 176x128 -b 256k -strict -1
+ -acodec libmp3lame -ab 128k -ar 44100 -vcodec mpeg2video -s 176x128 -b:v 256k -strict -1
mpg
Rockbox
mpeg2video,libmp3lame
- -f dvd -vcodec mpeg2video -r 29.97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
+ -f dvd -vcodec mpeg2video -r 29.97 -s 352x480 -aspect 4:3 -b:v 4000k -mbd rd -trellis 2 -flags mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
mpg
DVD
mpeg2video,mp2
- -f dvd -vcodec mpeg2video -r 29.97 -s 352x480 -aspect 16:9 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
+ -f dvd -vcodec mpeg2video -r 29.97 -s 352x480 -aspect 16:9 -b:v 4000k -mbd rd -trellis 2 -flags mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
mpg
DVD
mpeg2video,mp2
- -f dvd -target ntsc-dvd -r 29.97 -s 720x480 -aspect 4:3 -b 8000k -mbd rd -trellis -mv0 -cmp 0 -subcmp 2
+ -f dvd -target ntsc-dvd -r 29.97 -s 720x480 -aspect 4:3 -b:v 8000k -mbd rd -trellis 2 -flags mv0 -cmp 0 -subcmp 2
mpg
DVD
- dvd
+ mpeg2video,mp2
- -f dvd -target ntsc-dvd -r 29.97 -s 720x480 -aspect 16:9 -b 8000k -g 12 -mbd rd -trellis -mv0 -cmp 0 -subcmp 2
+ -f dvd -target ntsc-dvd -r 29.97 -s 720x480 -aspect 16:9 -b:v 8000k -g 12 -mbd rd -trellis 2 -flags mv0 -cmp 0 -subcmp 2
mpg
DVD
- dvd
+ mpeg2video,mp2
- -f dvd -target ntsc-dvd -b 5000k -r 29.97 -s 720x480 -ar 48000 -ab 384kb
+ -f dvd -target ntsc-dvd -b:v 5000k -r 29.97 -s 720x480 -ar 48000 -ab 384kb
mpg
DVD
- dvd
+ mpeg2video,mp2
- -f vcd -target ntsc-vcd -mbd rd -trellis -mv0 -cmp 0 -subcmp 2
+ -f vcd -target ntsc-vcd -mbd rd -trellis 2 -flags mv0 -cmp 0 -subcmp 2
mpg
VCD
vcd
- -f dvd -vcodec mpeg2video -r 25.00 -s 352x576 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
+ -f dvd -vcodec mpeg2video -r 25.00 -s 576x324 -aspect 4:3 -b:v 4000k -mbd rd -trellis 2 -flags mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
mpg
DVD
mpeg2video,mp2
- -f dvd -vcodec mpeg2video -r 25.00 -s 352x576 -aspect 16:9 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
+ -f dvd -vcodec mpeg2video -r 25.00 -s 576x324 -aspect 16:9 -b:v 4000k -mbd rd -trellis 2 -flags mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2
mpg
DVD
mpeg2video,mp2
- -f dvd -target pal-dvd -aspect 4:3 -b 8000k -mbd rd -trellis -mv0 -cmp 0 -subcmp 2
+ -f dvd -target pal-dvd -aspect 4:3 -b:v 8000k -mbd rd -trellis 2 -flags mv0 -cmp 0 -subcmp 2
mpg
DVD
- dvd
+ mpeg2video,mp2
- -f dvd -target pal-dvd -aspect 16:9 -b 8000k -mbd rd -trellis -mv0 -cmp 0 -subcmp 2
+ -f dvd -target pal-dvd -aspect 16:9 -b:v 8000k -mbd rd -trellis 2 -flags mv0 -cmp 0 -subcmp 2
mpg
DVD
- dvd
+ mpeg2video,mp2
- -f dvd -target pal-dvd -b 5000k -r 25 -s 720x576 -ar 48000 -ab 384kb
+ -f dvd -target pal-dvd -b:v 5000k -r 25 -s 720x576 -ar 48000 -ab 384kb
mpg
DVD
- dvd
+ mpeg2video,mp2
- -f vcd -target pal-vcd -mbd rd -trellis -mv0 -cmp 0 -subcmp 2
+ -f vcd -target pal-vcd -mbd rd -trellis 2 -flags mv0 -cmp 0 -subcmp 2
mpg
VCD
vcd
- -f mov -acodec libfaac -b 1250k -r 25 -ab 128k -s 640x480
+ -f mov -acodec libfaac -b:v 1250k -r 25 -ab 128k -s 640x480
mov
Quicktime
mov,libfaac
@@ -380,72 +380,72 @@
- -vcodec wmv2 -acodec wmav2 -b 1000k -ab 160k -r 25
+ -vcodec wmv2 -acodec wmav2 -b:v 1000k -ab 160k -r 25
wmv
Microsoft
wmv2,wmav2
- -f mp4 -r 29.97 -vcodec libx264 -vpre medium -s 640x480 -b 1000k -aspect 4:3 -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -b 1250k -maxrate 1500k -bufsize 4M -bt 256k -refs 1 -bf 3 -coder 1 -me_method umh -me_range 16 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 250 -keyint_min 25 -level 30 -qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -f mp4 -vcodec libx264 -s 640x480 -b:v 1000k -aspect 4:3 -acodec libfaac -ab 112k -ar 44100 -ac 2
mp4
MPEG4
- libx264,libfaac
+ h264,aac
- -f mp4 -r 29.97 -vcodec libx264 -vpre medium -s 640x480 -aspect 4:3 -b 1250k -maxrate 4M -bufsize 4M -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -me_method umh -subq 6 -trellis 1 -refs 2 -bf 1 -coder 1 -me_range 16 -g 300 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 1250k -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 21 -acodec libfaac -ab 128k -ar 48000 -ac 2
+ -f mp4 -vcodec libx264 -s 640x480 -aspect 4:3 -b:v 1250k -acodec libfaac -ab 128k -ar 48000 -ac 2
mp4
PSP
- libx264,libfaac
+ h264,aac
- -f mp4 -r 29.97 -vcodec libx264 -vpre medium -s 704x384 -b 1000k -aspect 16:9 -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -b 1250k -maxrate 1500k -bufsize 4M -bt 256k -refs 1 -bf 3 -coder 1 -me_method umh -me_range 16 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 250 -keyint_min 25 -level 30 -qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -f mp4 -vcodec libx264 -s 704x396 -b:v 1000k -aspect 16:9 -acodec libfaac -ab 112k -ar 44100 -ac 2
mp4
MPEG4
- libx264,libfaac
+ h264,aac
-f 3g2 -ar 22050 -ab 128k -acodec libfaac -s qcif -r 14.985 -vn
3g2
Mobile Phones
- 3g2,libfaac
+ 3g2,aac
- -f avi -r 29.97 -vcodec libxvid -vtag XVID -vf scale=320:240,aspect=4:3 -maxrate 1800k -b 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
+ -f avi -vcodec libxvid -vtag xvid -s 320x240 -aspect 4:3 -maxrate 1800k -b:v 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
avi
Creative Zen
- libxvid,libmp3lame
+ mpeg4,mp3
- -f avi -r 29.97 -vcodec libxvid -vtag XVID -vf scale=320:240,aspect=16:9 -maxrate 1800k -b 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
+ -f avi -vcodec libxvid -vtag xvid -s 320x240 -aspect 16:9 -maxrate 1800k -b:v 1500k -acodec libmp3lame -ar 48000 -ab 128k -ac 2
avi
Creative Zen
- libxvid,libmp3lame
+ mpeg4,mp3
- -f mp4 -vcodec mpeg4 -b 400k -r 24 -s 320x240 -aspect 4:3 -acodec libfaac -ar 22050 -ac 2 -ab 48kb
+ -f mp4 -vcodec mpeg4 -b:v 400k -r 24 -s 320x240 -aspect 4:3 -acodec libfaac -ar 22050 -ac 2 -ab 48kb
mp4
Blackberry
- mpeg4,libfaac
+ mpeg4,aac
- -f mp4 -vcodec mpeg4 -b 400k -r 24 -s 320x180 -aspect 16:9 -acodec libfaac -ar 22050 -ac 2 -ab 48kb
+ -f mp4 -vcodec mpeg4 -b:v 400k -r 24 -s 320x180 -aspect 16:9 -acodec libfaac -ar 22050 -ac 2 -ab 48kb
mp4
Blackberry
- -f mp4 -vf scale=240:192 -r 11.988 -b 192k -ab 56k -vcodec libxvid -acodec libfaac
+ -f mp4 -s 240x192 -r 11.988 -b:v 192k -ab 56k -vcodec libxvid -acodec libfaac
mp4
LG
- mp4,libxvid,libfaac
+ mpeg4,aac
@@ -456,44 +456,44 @@
- -f mp4 -r 24 -vcodec libx264 -vpre medium -s 320x180 -aspect 16:9 -maxrate 800k -bufsize 80k -b 400k -acodec libfaac -ar 44100 -ab 80k -ac 2
+ -f mp4 -r 24 -vcodec libx264 -s 320x180 -aspect 16:9 -b:v 400k -acodec libfaac -ar 44100 -ab 80k -ac 2
mp4
Blackberry
- libx264,libfaac
+ h264,aac
- -f mp4 -r 24 -vcodec libx264 -vpre medium -s 240x180 -aspect 4:3 -maxrate 800k -bufsize 80k -b 400k -acodec libfaac -ar 44100 -ab 80k -ac 2
+ -f mp4 -r 24 -vcodec libx264 -s 240x180 -aspect 4:3 -b:v 400k -acodec libfaac -ar 44100 -ab 80k -ac 2
mp4
Blackberry
- libx264,libfaac
+ h264,aac
- -vcodec flv -ar 22050 -r 24 -b 50k -s 448x336 -acodec libmp3lame
+ -vcodec flv -ar 22050 -r 24 -b:v 50k -s 448x336 -acodec libmp3lame
flv
Websites
- flv,libmp3lame
+ flv,mp3
- -vcodec flv -ar 22050 -r 24 -b 150k -s 448x336 -acodec libmp3lame
+ -vcodec flv -ar 22050 -r 24 -b:v 150k -s 448x336 -acodec libmp3lame
flv
Websites
- flv,libmp3lame
+ flv,mp3
- -vcodec flv -ar 22050 -r 24 -b 350k -s 448x336 -acodec libmp3lame
+ -vcodec flv -ar 22050 -r 24 -b:v 350k -s 448x336 -acodec libmp3lame
flv
Websites
- flv,libmp3lame
+ flv,mp3
- -f mp4 -r 29.97 -vcodec libx264 -vpre medium -s 480x272 -aspect 16:9 -b 1250k -maxrate 4M -bufsize 4M -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -me_method umh -subq 6 -trellis 1 -refs 2 -bf 1 -coder 1 -me_range 16 -g 300 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 1250k -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 21 -acodec libfaac -ab 128k -ar 48000 -ac 2
+ -f mp4 -vcodec libx264 -s 480x272 -aspect 16:9 -b:v 1250k -acodec libfaac -ab 128k -ar 48000 -ac 2
mp4
PSP
- libx264,libfaac
+ h264,aac
-f webm -s 640x480 -aspect 4:3 -vcodec libvpx -deinterlace -g 120 -level 216 -profile 0 -qmax 42 -qmin 10 -rc_buf_aggressivity 0.95 -vb 2M -acodec libvorbis -aq 60 -ac 2
@@ -525,101 +525,101 @@
- -r 29.97 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 320x240 -aspect 4:3 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vcodec libx264 -bt 256k -s 320x240 -aspect 4:3 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 320x176 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vcodec libx264 -bt 256k -s 320x176 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -croptop 60 -cropbottom 60 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 320x144 -aspect 2.35 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vf crop=in_h-2*60 -vcodec libx264 -bt 256k -s 320x144 -aspect 2.35 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -croptop 64 -cropbottom 64 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 320x176 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vf crop=in_h-2*64 -vcodec libx264 -bt 256k -s 320x176 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 512x384 -aspect 4:3 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vcodec libx264 -bt 256k -s 512x384 -aspect 4:3 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 624x352 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vcodec libx264 -bt 256k -s 624x352 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -croptop 60 -cropbottom 60 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 640x272 -aspect 2.35 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vf crop=in_h-2*60 -vcodec libx264 -bt 256k -s 640x272 -aspect 2.35 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -r 29.97 -croptop 64 -cropbottom 64 -vcodec libx264 -vpre medium -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -crf 21 -bt 256k -refs 1 -coder 0 -me_method full -me_range 16 -subq 5 -partitions +parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -s 640x352 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
+ -r 29.97 -vf crop=in_h-2*64 -vcodec libx264 -bt 256k -s 640x352 -aspect 16:9 -acodec libfaac -ab 112k -ar 48000 -ac 2
m4v
iPod-iTunes
- libx264,libfaac
+ h264,aac
- -acodec vorbis -aq 60 -vn
- OGG
+ -acodec libvorbis -aq 60 -vn
+ ogg
Audio
- vorbis
+ ogg
- -vcodec wmv2 -acodec wmav2 -aspect 4:3 -b 500k -ab 32k -ac 1 -ar 22050 -s 320x240
+ -vcodec wmv2 -acodec wmav2 -aspect 4:3 -b:v 500k -ab 32k -ac 1 -ar 22050 -s 320x240
wmv
Microsoft
wmv2,wmav2
- -vcodec wmv2 -acodec wmav2 -b 640k -ab 128k -r 23.97 -s 320x240
+ -vcodec wmv2 -acodec wmav2 -b:v 640k -ab 128k -r 23.97 -s 320x240
wmv
Microsoft
wmv2,wmav2
- -vcodec wmv2 -acodec wmav2 -b 640k -ab 128k -r 29.97 -s 320x240
+ -vcodec wmv2 -acodec wmav2 -b:v 640k -ab 128k -r 29.97 -s 320x240
wmv
Microsoft
wmv2,wmav2
- -f mp4 -r 23.976 -vcodec libx264 -vpre medium -s 1280x720 -b 3000k -aspect 16:9 -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -maxrate 3500k -bufsize 4M -bt 256k -refs 1 -bf 3 -coder 1 -me_method umh -me_range 16 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 250 -keyint_min 25 -level 30 -qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 384k -ar 48000
+ -f mp4 -r 23.976 -vcodec libx264 -s 1280x720 -b:v 3000k -aspect 16:9 -bt 256k -acodec libfaac -ab 384k -ar 48000
mp4
PS3
- libx264,libfaac
+ h264,aac
- -f mp4 -r 23.976 -vcodec libx264 -vpre medium -s 1280x720 -b 3000k -aspect 4:3 -flags +loop -cmp +chroma -deblockalpha 0 -deblockbeta 0 -maxrate 3500k -bufsize 4M -bt 256k -refs 1 -bf 3 -coder 1 -me_method umh -me_range 16 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 250 -keyint_min 25 -level 30 -qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 384k -ar 48000
+ -f mp4 -r 23.976 -vcodec libx264 -s 1280x720 -b:v 3000k -aspect 4:3 -bt 256k -acodec libfaac -ab 384k -ar 48000
mp4
PS3
- libx264,libfaac
+ h264,aac
@@ -674,36 +674,49 @@
-s 480x320 -vcodec mpeg4 -acodec libfaac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2
mp4
Mobile Phones
- mpeg4,libfaac
+ mpeg4,aac
- -s 480x320 -vcodec mpeg4 -b 480k -acodec libfaac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2
+ -s 480x320 -vcodec mpeg4 -b:v 480k -acodec libfaac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2
mp4
Mobile Phones
- mpeg4,libfaac
+ mpeg4,aac
-
+
- -f mp4 -s 432x320 -aspect 432:320 -acodec aac -async
- 4800 -dts_delta_threshold 1 -vcodec xvid -qscale 7
+ -f mp4 -s 432x324 -aspect 4:3 -acodec libfaac -async 4800 -dts_delta_threshold 1 -vcodec libxvid -q:v 7
mp4
Mobile Phones
- xvid,aac,mp4
+ mpeg4,aac
+
+
+ -f 3gp -vf crop=4/3*in_h:in_h -s 320x240 -aspect 4:3 -acodec libfaac -ar 44100 -vcodec mpeg4 -q:v 7
+ 3gp
+ Mobile Phones
+ mpeg4,aac
+
+
+
+ -f 3gp -vf crop=4/3*in_h:in_h -s 320x240 -aspect 4:3 -acodec libfaac -ab 64k -ar 44100 -vcodec mpeg4 -b:v 400k
+ 3gp
+ Mobile Phones
+ mpeg4,aac
+
- -f avi -g 1 -b 256k -r 12 -async 2 -vf scale=160:120 -vtag XVID -vcodec libxvid -ab 128k -ar 44100 -ac 2 -acodec libmp3lame
+ -f avi -g 1 -b:v 256k -r 12 -async 2 -s 160x120 -vtag xvid -vcodec libxvid -ab 128k -ar 44100 -ac 2 -acodec libmp3lame
avi
Portable Media Players
- libxvid,libmp3lame
+ mpeg4,mp3
- -f avi -g 1 -b 384k -vcodec libxvid -vtag XVID -ab 128k -ar 44100 -ac 2 -acodec libmp3lame -vf scale=160:128,aspect=4:3 -r 15
+ -f avi -g 1 -b:v 384k -vcodec libxvid -vtag xvid -ab 128k -ar 44100 -ac 2 -acodec libmp3lame -s 160x128 -aspect 4:3 -r 15
avi
Portable Media Players
- libxvid,libmp3lame
+ mpeg4,mp3
diff -3ur a/share/sinthgunt.glade b/share/sinthgunt.glade
--- a/share/sinthgunt.glade 2013-02-14 23:15:54.000000000 +0400
+++ b/share/sinthgunt.glade 2017-02-20 16:38:40.000000000 +0300
@@ -45,20 +45,6 @@
-
-
-
@@ -229,17 +215,6 @@
True
-
-
-
-
- True
- Open online video
- gtk-network
-
-
-
- True
diff -3ur a/sinthgunt b/sinthgunt
--- a/sinthgunt 2010-11-14 15:02:41.000000000 +0300
+++ b/sinthgunt 2017-02-20 16:38:40.000000000 +0300
@@ -1,4 +1,5 @@
#!/usr/bin/python
+# -*- coding: utf-8 -*-
"""
sinthgunt wrapper script.