#!/usr/bin/env python
# coding=utf8
import sys
from subprocess import Popen,PIPE

# Fonction recompressant un JPEG avec une qualité donnée
def shell_command(quality,filename):
  p1=Popen(["djpeg","-pnm","-dct","float",filename],stdout=PIPE)
  p2=Popen(["cjpeg","-quality",str(quality),"-dct","float","-restart",
           "0","-sample","1x1"],stdin=p1.stdout,stdout=PIPE)
  p3=Popen(["jpegtran","-trim","-optimize","-restart","0"],
           stdin=p2.stdout,stdout=PIPE)

  return p3.communicate()[0]

# Fonction de calcul de taille de fichier, utilisée par find_param
def compute(quality,filename):
  return len(shell_command(quality,filename))

# Prend un fichier en entrée et applique la fonction shell_command
def generate(quality,filename_in,filename_out):
  output=shell_command(quality,filename_in)

  f=open(filename_out,"w")
  f.write(output)
  f.close()

# Fonction générique de recherche dichotomique
def find_param(minimum,maximum,search_result,function,func_parms):
  index      =(minimum+maximum)/2
  best_index =index
  best_result=function(best_index,func_parms)
  result     =best_result

  while index not in (minimum,maximum) and best_result!=search_result:
    result=function(index,func_parms)

    if result<search_result: minimum=index
    else:                    maximum=index

    if abs(search_result-best_result)>abs(search_result-result):
      best_result=result
      best_index =index

    index=(minimum+maximum)/2

  if abs(search_result-best_result)>abs(search_result-result):
    best_result=result
    best_index =index

  return best_index

# Passe en revue tous les arguments sauf le premier qui est la taille maxi
for arg in sys.argv[2:]:
  quality=find_param(0,100,int(sys.argv[1])*1024,compute,arg)
  generate(quality,arg,arg)

