Показаны сообщения с ярлыком wallpaper. Показать все сообщения
Показаны сообщения с ярлыком wallpaper. Показать все сообщения

среда, 22 августа 2012 г.

Linux. How to delete duplicate images 2?

Для создания и поддержания в актуальном виде коллекции изображений нужно иметь инструмент, позволяющий находить и удалять дубликаты. В свое время я пытался сделать такой инструмент.

Но подход, который я использовал требует значительной производительности и на больших коллекциях маленькая утилита разрастается достаточно большую программу со свое базой данных с интерфейсом и всеми прелестями программного проекта.

Более эффективно воспользоваться существующими инструментами, например мощной программой управления фотоколлекцией DigiKam.

Но штука в том, что DigiKam имеет очень мощный инструмент поиска дубликатов, не имеет возможности работы с дубликатами, кроме как мышкой и клавиатурой.

Я провел небольшое расследование и обнаружил, что результаты поиска дубликатов сохраняются в базе данных, которая обычно располагается в $HOME/Pictures/digikam4.db

Как DigiKam сохраняет результаты поиска я покажу на следующем примере.

Есть папка с изображениями.
В программе digikam запускаем поиск одинаковых изображений.

Результаты поиска сохраняются в таблице searches. Эта таблица содержит строки с результатами поиска.


Каждая строка в поле query хранит xml список содержащий id одинаковых изображений. На приведенном листинге я отформатировал xml, чтобы удобней его было читать.


 
  
   3
   2 
   1
  
 


Имена файлов изображений хранятся в таблице images и доступны по id


Путь доступен по полю (номер альбома) в таблице albums:


Путь к альбомам хранится в таблице albumroot:


Ниже пример реализации функции на bash получения пути изображения с id = 5
#!/bin/bash 

DBPATH=digikam4.db 

getPicture () 
{ 
  FILENAME=$(sqlite3 $DBPATH "SELECT name FROM images WHERE id=$1") 
  IDALBUM=$(sqlite3 $DBPATH "SELECT album FROM images WHERE id=$1") 
  REALTIVEPATH=$(sqlite3 $DBPATH "SELECT relativePath FROM albums WHERE id=$IDALBUM") 
  IDALBUMROOT=$(sqlite3 $DBPATH "SELECT albumRoot FROM albums WHERE id=$IDALBUM") 
  ROOTPATH=$(sqlite3 $DBPATH "SELECT specificPath FROM albumroots WHERE id=$IDALBUMROOT") 
  echo /home/${ROOTPATH}/${REALTIVEPATH}/${FILENAME} 
} 

FNAME=$(getPicture 5) 
echo $FNAME 

Ну, собственно, вот и венец творений.
Программа на bash, которая удаляет дубликаты изображений.
Программа удаляет дубликат меньшего размера.
Я ее успешно использую совместно с DigiKam 2.8 под Ubuntu.
Перед запуском скрипта нужно выйти из DigiKam, иначе скрипт не может получить доступ к базе, которая лочится.
#!/bin/bash
#-------------------------------------------------------------------
# Удаляет дубликаты картинок на основании поиска дубликатов в 
# программе DigiKam
#
# Проверено с DigiKam v2.8
COPYRUGHT="\n© http://axa-ru.blogspot.com. Licensed under GPLv3."

#-------------------------------------------------------------------
#VERSION=0.1 # initial version
#VERSION=0.11 # Some DeBugs
#VERSION=0.12 # Добавлено приоритет удаления
#VERSION=0.13 # Some changes
VERSION=0.14 # Испрвавление ошибки в delSmallPic()

DEBUG=0
VERBOSE=1
DBPATH=$HOME/Pictures/digikam4.db # Путь до базы даннх DigiKam
EXITERROR=192

SAVEPIC=""
PATTERN=0_WallPapers99

# Color ANSY sequence
BLACK="\033[0;30m"
RED="\033[0;31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
BLUE="\033[0;34m"
MAGENTA="\033[0;35m"
CYAN="\033[0;36m"
WHITE="\033[0;37m"
GRAY1="\033[38;5;252m"
GRAY2="\033[38;5;245m"
GRAY3="\033[38;5;238m"
NOCOLOR="\033[0;38m"

#-------------------------------------------------------------------
#  Возвращает по id изображения его полный путь
#  пример использования:
#     FNAME=$(getPicture 1653)
#  возвращает путь к картинке №1653

getPicture ()
{
  FILENAME=$(sqlite3 $DBPATH "SELECT name FROM images WHERE id=$1")
  IDALBUM=$(sqlite3 $DBPATH "SELECT album FROM images WHERE id=$1")
  REALTIVEPATH=$(sqlite3 $DBPATH "SELECT relativePath FROM albums WHERE id=$IDALBUM")
  IDALBUMROOT=$(sqlite3 $DBPATH "SELECT albumRoot FROM albums WHERE id=$IDALBUM")
  local ALBUM_TYPE=$(sqlite3 $DBPATH "SELECT type FROM albumroots WHERE id=$IDALBUMROOT")
  case $ALBUM_TYPE in
    1) ROOTPATH=/home$(sqlite3 $DBPATH "SELECT specificPath FROM albumroots WHERE id=$IDALBUMROOT");;
    2) echo "External media not supported yet. Exiting"; exit $EXITERROR;;
    3) ROOTPATH=$(sqlite3 $DBPATH "SELECT identifier FROM albumroots WHERE id=$IDALBUMROOT" | sed 's/networkshareid:?mountpath=//g' | sed 's/%2F/\//g');;
  esac  

  echo ${ROOTPATH}/${REALTIVEPATH}/${FILENAME}
}

#-------------------------------------------------------------------
#  Удаляет меньшую картинку из двух
#  
delSmallPic()
{
  ((DEBUG)) && echo "    ***** $FUNCNAME"

  if [ "$SAVEPIC" == "" ]; then 
    #((DEBUG)) && echo "    $LINENO: Init SAVEPIC"
    SAVEPIC="$1";
  else
    local W0=$(identify -format '%w' "$SAVEPIC" 2> /dev/null)
    local H0=$(identify -format '%h' "$SAVEPIC" 2> /dev/null)
    local W1=$(identify -format '%w' "$1" 2> /dev/null)
    local H1=$(identify -format '%h' "$1" 2> /dev/null)

    ((DEBUG)) && echo "    $LINENO: PIC1=$SAVEPIC"
    ((DEBUG)) && echo "    $LINENO: PIC2=$1"
    ((DEBUG)) && echo "    $LINENO: $W0 -eq $W1 -a $H0 -eq $H1"

    # Если картинки одинаковы то удаляет ту, в пути (имени)
    # которой есть $PATTERN
    if [ $W0 -eq $W1 -a $H0 -eq $H1 ]; then
      ((DEBUG)) && echo "    $LINENO: PIC1 == PIC2"
      if [[ "$SAVEPIC" =~ .*$PATTERN.* ]]; then
        echo "Delete $SAVEPIC"
        ((DEBUG)) && printf "    %s: " $LINENO
        ! ((DEBUG)) && rm "$SAVEPIC"
        SAVEPIC="$1"
      else
        ((DEBUG)) && printf "    %s: " $LINENO
        echo "Delete $1"
        ! ((DEBUG)) && rm "$1"
      fi
    else 
      if [ $W0 -le $W1 -o $H0 -le $H1 ]; then
        ((DEBUG)) && echo "    $LINENO: PIC1 <= PIC2"
        echo "Delete $SAVEPIC"
        ((DEBUG)) && printf "    %s: " $LINENO
        ! ((DEBUG)) && rm "$SAVEPIC"
        SAVEPIC="$1"
      else
        ((DEBUG)) && echo "    $LINENO: PIC1 > PIC2"
        ((DEBUG)) && printf "    %s: " $LINENO
        echo "Delete $1"
        ! ((DEBUG)) && rm "$1"
      fi    
    fi
  fi
}

#-------------------------------------------------------------------
#  Удаляет дубликаты картинок из списка
#  В качестве параметра получает список id картинок с разделителями пробелами
delDupPic ()
{
  while (( "$#" )); do
    local PAR=$1
    PICURL=$(getPicture "$PAR")
    if [ ! -f $PICURL ]; then
      echo -e "${RED}File $PICURL das not exists.${NOCOLOR}"
      # echo -e "${RED}Use digiKam!!!${NOCOLOR}"
      # exit $EXITERROR
    fi
    ((DEBUG)) && echo "  $LINENO: PAR=$PAR, PICURL=$PICURL"
    delSmallPic $PICURL
    shift
  done
}

#-------------------------------------------------------------------
#  main code
#

  while getopts "Dd:hVv" SWITCH ; do
    case $SWITCH in
      D) DEBUG=1;;
      d) if [[ $OPTARG == "" ]]; then 
           printf "$SCRIPT:$LINENO: must be argument\n"; 
           exit $ERROR; 
         else 
           PATTERN=$OPTARG; 
         fi;;
      h) echo -e "usage: 
  ${CYAN}$0 [-OPTION]${NOCOLOR}

    OPTION is
    ${CYAN}D${NOCOLOR}       - Debug On
    ${CYAN}d [PAT]${NOCOLOR} - Delete first pic by PATtern
                Example: 
                 deldup.sh -d 00_Picture 
                will delete any picture
                 /mnt/nas3d0/Pictures/Wallpaper/00_Pictures/Pictures_0123.jpg 
    ${CYAN}h${NOCOLOR}       - This help
    ${CYAN}v${NOCOLOR}       - Verbose output, No output by default"
        exit 0
        ;;
      V) echo -e "${CYAN}$0 Version $VERSION\n${COPYRUGHT}${NOCOLOR}"; exit 0;;
      v) VERBOSE=1;;
      *) printf "$SCRIPT:$LINENO: script error: unhandled argument\n"; exit $ERROR;;
    esac
  done


((DEBUG)) && echo "$LINENO: TOTAL=$TOTAL"

# Type=7 - записи после операции поиска дубликатов
X=$(sqlite3 $DBPATH "SELECT id FROM searches where type=7 LIMIT 1")
TOTAL=$(sqlite3 $DBPATH "SELECT COUNT (*) FROM searches WHERE type=7")
echo "$TOTAL Duplicate Images Will be Delete "
((LAST=TOTAL+X))
((DEBUG)) && echo "$LINENO: X=$X, LAST=$LAST, TOTAL=$TOTAL"

while [ $X -lt $LAST ]
do
  SAVEPIC=""
  # Получаем список записей с дублированными картинками 
  # Ниже показан отформатированный пример. 
  # 
  # 
  #   
  #     
  #       5033
  #       201
  #       84132
  #     
  #   
  # 
  LISTEQPIC=$(sqlite3 $DBPATH "SELECT query FROM searches WHERE id=$X" | sed 's/<\/listitem>/,/g' | sed 's///g' | sed 's/.*oneof\">//' | sed 's/,<\/.*//' | sed 's/,/ /g' )
  ((DEBUG)) && echo "$LINENO: X=$X, LISTEQPIC=$LISTEQPIC"
  delDupPic $LISTEQPIC
  ((X++))
done

По хорошему этот скрипт можно оформить в виде плагина в DigiKam и запускать оттуда. Будет функциональней и удобней. Но мне лень ковырять сам DigiKam. Если кто сделает такое добро, то отпишите.


Полезные ссылки:

пятница, 30 сентября 2011 г.

Ubuntu Wallpaper Changer (v.0.4.395x)


В предыдущей заметке я рассказал, что на dropbox закинуто почти 50 000 картинок с разрешением от 1920х1080 и выше. Сделал я это для того, чтобы на моем ноуте автоматически менялись обои и у меня не было желания лазить по сайтам, вводить какие то логины с паролями и прочую лабуду, чтобы скачать пару картинок. на заставку

Что же я с этим добром сделал?
А вот что:

Понравилась программа?
Поддержи:


  • Программа выбирает случайную картинку из категории указанной в аргументах командной строки и устанавливает ее в качестве wallpaper.

  • Кроме того программа может подхватывать "Охуенный блять совет" и делать из него картинку.



  • Программа имеет возможность работы совместно с популярным системным монитором conky и может создавать подложку чтобы выводимые сообщения conky не сливались с фоном.


Установка и удаление

Для установки в Ubuntu кликните на ссылке: chbg-03_4.396.105_all.deb и выберите "откырыть с помощью Ubuntu Software Center"
Или выполните в терминале следующие команды: $ cd /tmp $ wget http://AxaRu.opendrive.com/files/86055110_VKAsW_e1b2/chbg-03_4.396.105_all.deb -O chbg-03_4.396.105_all.deb $ sudo apt-get install imagemagick curl $ sudo dpkg -i chbg-03_4.396.105_all.deb
Затем откройте в nautilus папку ~/.local/share/applications и перетащите файл change_bg.desktop на панель unity launcher.


Удалить программу можно опять же через Ubuntu Software Center или из терминала, дав команду: $ sudo dpkg -r chbg-03

Как это работает

Все картинки размещены на dropbox и доступны для скачивания без всяких ограничений. Это значит что, если вы установите эту программу к себе на компьютер, то она будет обновлять картинки и на вашем десктопе.
Во время установки в систему будет скопирована программа /usr/bin/chbg-03, в каталог /usr/share/fonts/truetype/other будут проинсталлированы дополнительные шрифты и в /etc/crontab будет добавлена команда запуска.
# Смена wallpaper каждые 5 минут
1-59/5 * * * * user env DISPLAY=:0 /usr/bin/chbg-03 -r -b -c 220,600

Ключи командной строки:
$ chbg-03 -h usage: chbg-03 [options] -h - this help -a - About -b - no action on battery -c W,H - WxH area from Left-Upper corner a murky glass under conky -d - delete current picture from playlist (reserved) -f RUS|ENG - facking bitch advise russian/english -i - no invective (under 16) -j - random FBA in selected theme -t [Theme1[,Theme2]...] - select random image from Theme is: Abstract Animal Anime Art Avia Car Comp Cosmos Fba Fiction Flowers Game Girl Holiday Kids Lingerie Map Mechanic Men Military Movie Music Nature Nude Ship Sport Texture Urban -o - store current picture to playlist (reserved) -p - select playlist (reserved) -r - resize to current display geometry -s ON|OFF|TOGGLE - set key stop execute to on/off or toggle -u - update unity change_bg.desktop file -w - disable wallet info -v - version On-line collection contains about 100,000 wallpaper with resolution over 1920x1080

Совместимость и отвественность

Да, чуть не забыл: все это работает под Ubuntu 14.04. Под другими системами тоже все должно работать.
Стандартные, но все таки важные замечания: вы устанавливаете эту программу на свой страх и риск.

Копирайты и копилефты

Вы можете скачивать, устанавливать, удалять, модифицировать эту программу без всяких ограничений. Единственная просьба: не удаляйте мое имя из исходников. Это тешит мое самолюбие. 8-).
Исходный текст доступен по этой ссылке: chbg-03-4.396.sh

Последние изменения

26/12/2011 v 0.4.31 - Улучшил отображение FBA (fucking bitch advice). В качестве цвета надписи берется основной цвет картинки, который "подсвечивается".
03/01/2012 v 0.4.33 - Добавлена функция создания подложки под conky, чтобы выводимые сообщения не сливались с фоном.
07/02/2012 v 0.4.341.44 - Добавлена поддержка Sony Vaio VGN-NR385E
13/02/2012 v 0.4.38.79 Дизастер!!!
Видать тулза пользуется некоторой популярностью и мы заюзали трафик у Дропбокса. Эти говнюки нам его порезали.
В связи с чем я в некоторых раздумьях, что делать? В общем нужно на каком нибудь бесплатном сервисе с широким трафиком организовать около 100 gb.
. Возможно это http://minus.com. Изучаю API. А пока я сделал релиз, который в рамках этого сервиса уменьшит на него нагрузку.
03/03/2012 v 0.4.382.73 Устранен мелкий баг взаимодействия с conky

08/11/2012 - сделал тестовую сборку с индикатором под Gnome 3

Как будет время зарелизю
30/03/2014 v 0.4.393.85. Сделаны изменения для совместимости с Ubuntu 14.04. Устранены баги.

Для развития программы важна обратная связь

Пишите в коментариях или на почту о том нужно ли это вам, что еще вы хотели бы видеть в этой программе, информацию о замеченных багах и пожелания.


Планы по развитию

  1. Показ картинок расположенных на локальном диске.
    Реализовано, начиная с версии 0.4.38
  2. Обои на каждый рабочий стол.
  3. "Проигрывание" обоев из плейлиста.
  4. Добавление в плейлист текущей установленной картинки.
  5. Поменять расположение конфига с /tmp на ${HOME}/.config/bgch
    Реализовано. Конфиг и связанные файлы распологаются в ${HOME}/.chbg-03/
  6. Разработать новую формулу вычисления размера шрифта.
  7. Автоматически добавлять иконку на unity.launcher при установке программы.
  8. Сделать возможность приостанавливать\запускать скрипт.
    Реализовано. Ключ -s разрешает/ запрещает смену обоев.


Полезные ссылки:

понедельник, 26 сентября 2011 г.

Почти 50 000 обоев с разрешением от 1920х1080

Как скачать написано здесь: http://dl.dropbox.com/u/42776387/WallPapers/HowToWallpaper.txt

Ссылки на скачивание по категориям : http://dl.dropbox.com/u/42776387/WallPapers/content.txt


08/12/2011. Количество картинок достигло 49000. Объем составляет 50 Gb