Initial commit: local_machine docs and scripts
This commit is contained in:
190
docs/disk_cleanup/scripts/compress-screenrecordings.sh
Executable file
190
docs/disk_cleanup/scripts/compress-screenrecordings.sh
Executable file
@@ -0,0 +1,190 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для сжатия видео ScreenRecordings без потери качества
|
||||
# Использует H.265 (HEVC) кодек с CRF 18 (визуально без потерь)
|
||||
|
||||
SCREENRECORDINGS_DIR="$HOME/Library/ScreenRecordings"
|
||||
BACKUP_DIR="$SCREENRECORDINGS_DIR/originals"
|
||||
TEMP_DIR="$SCREENRECORDINGS_DIR/compressed"
|
||||
|
||||
# Цвета для вывода
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "=========================================="
|
||||
echo " Сжатие ScreenRecordings без потери качества"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Проверка наличия ffmpeg
|
||||
if ! command -v ffmpeg &> /dev/null; then
|
||||
echo -e "${RED}Ошибка: ffmpeg не установлен${NC}"
|
||||
echo "Установите ffmpeg: brew install ffmpeg"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка существования директории
|
||||
if [ ! -d "$SCREENRECORDINGS_DIR" ]; then
|
||||
echo -e "${RED}Ошибка: директория $SCREENRECORDINGS_DIR не найдена${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Создание директорий для бэкапа и временных файлов
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
mkdir -p "$TEMP_DIR"
|
||||
|
||||
# Подсчет видео файлов
|
||||
VIDEO_FILES=$(find "$SCREENRECORDINGS_DIR" -maxdepth 1 -type f \( -iname "*.mov" -o -iname "*.mp4" -o -iname "*.m4v" \) ! -name ".*" | wc -l | tr -d ' ')
|
||||
|
||||
if [ "$VIDEO_FILES" -eq 0 ]; then
|
||||
echo -e "${YELLOW}Видео файлы не найдены в $SCREENRECORDINGS_DIR${NC}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}Найдено видео файлов: $VIDEO_FILES${NC}"
|
||||
echo ""
|
||||
|
||||
# Подсчет общего размера
|
||||
TOTAL_SIZE=$(du -sh "$SCREENRECORDINGS_DIR" 2>/dev/null | cut -f1)
|
||||
echo -e "Текущий размер: ${YELLOW}$TOTAL_SIZE${NC}"
|
||||
echo ""
|
||||
|
||||
# Подтверждение
|
||||
read -p "Продолжить сжатие? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Отменено"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Начало сжатия..."
|
||||
echo ""
|
||||
|
||||
# Счетчики
|
||||
PROCESSED=0
|
||||
SKIPPED=0
|
||||
ERRORS=0
|
||||
|
||||
# Создание массива видео файлов
|
||||
mapfile -t video_files < <(find "$SCREENRECORDINGS_DIR" -maxdepth 1 -type f \( -iname "*.mov" -o -iname "*.mp4" -o -iname "*.m4v" \) ! -name ".*" | sort)
|
||||
|
||||
# Обработка каждого видео файла
|
||||
for video_file in "${video_files[@]}"; do
|
||||
filename=$(basename "$video_file")
|
||||
name_without_ext="${filename%.*}"
|
||||
ext="${filename##*.}"
|
||||
|
||||
# Пропускаем уже обработанные файлы
|
||||
if [[ "$filename" == *"_compressed"* ]] || [ -f "$BACKUP_DIR/$filename" ]; then
|
||||
echo -e "${YELLOW}Пропуск: $filename (уже обработан)${NC}"
|
||||
((SKIPPED++))
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "----------------------------------------"
|
||||
echo -e "${GREEN}Обработка: $filename${NC}"
|
||||
|
||||
# Размер оригинального файла
|
||||
original_size=$(stat -f%z "$video_file" 2>/dev/null || stat -c%s "$video_file" 2>/dev/null)
|
||||
original_size_mb=$(echo "scale=2; $original_size / 1024 / 1024" | bc)
|
||||
echo " Размер оригинала: ${original_size_mb} MB"
|
||||
|
||||
# Временный файл для сжатого видео
|
||||
compressed_file="$TEMP_DIR/${name_without_ext}_compressed.${ext}"
|
||||
|
||||
# Сжатие с H.265 (HEVC) кодеком
|
||||
# CRF 18 = визуально без потерь качества (чем меньше, тем лучше качество, но больше размер)
|
||||
# preset slow = лучшее сжатие, но медленнее
|
||||
# pix_fmt yuv420p = совместимость с большинством плееров
|
||||
|
||||
echo " Сжатие с H.265 (HEVC) кодеком (CRF 18, визуально без потерь)..."
|
||||
|
||||
# Запуск ffmpeg с подавлением вывода (кроме ошибок)
|
||||
if ! ffmpeg -i "$video_file" \
|
||||
-c:v libx265 \
|
||||
-crf 18 \
|
||||
-preset slow \
|
||||
-c:a copy \
|
||||
-pix_fmt yuv420p \
|
||||
-movflags +faststart \
|
||||
-y \
|
||||
"$compressed_file" > /dev/null 2>&1; then
|
||||
|
||||
echo -e " ${RED}Ошибка при сжатии: $filename${NC}"
|
||||
rm -f "$compressed_file"
|
||||
((ERRORS++))
|
||||
continue
|
||||
fi
|
||||
|
||||
# Проверка, что сжатый файл создан
|
||||
if [ ! -f "$compressed_file" ]; then
|
||||
echo -e " ${RED}Ошибка: сжатый файл не создан${NC}"
|
||||
((ERRORS++))
|
||||
continue
|
||||
fi
|
||||
|
||||
# Размер сжатого файла
|
||||
compressed_size=$(stat -f%z "$compressed_file" 2>/dev/null || stat -c%s "$compressed_file" 2>/dev/null)
|
||||
compressed_size_mb=$(echo "scale=2; $compressed_size / 1024 / 1024" | bc)
|
||||
|
||||
# Процент сжатия
|
||||
if [ "$original_size" -gt 0 ]; then
|
||||
compression_ratio=$(echo "scale=1; (1 - $compressed_size / $original_size) * 100" | bc)
|
||||
echo " Размер сжатого: ${compressed_size_mb} MB"
|
||||
echo -e " ${GREEN}Сжатие: ${compression_ratio}%${NC}"
|
||||
fi
|
||||
|
||||
# Проверка, что сжатый файл меньше оригинала
|
||||
if [ "$compressed_size" -lt "$original_size" ]; then
|
||||
# Бэкап оригинала
|
||||
echo " Создание бэкапа оригинала..."
|
||||
cp "$video_file" "$BACKUP_DIR/$filename"
|
||||
|
||||
# Замена оригинала сжатой версией
|
||||
echo " Замена оригинала сжатой версией..."
|
||||
mv "$compressed_file" "$video_file"
|
||||
|
||||
echo -e " ${GREEN}✓ Готово: $filename${NC}"
|
||||
((PROCESSED++))
|
||||
else
|
||||
echo -e " ${YELLOW}Сжатый файл больше оригинала, оставляем оригинал${NC}"
|
||||
rm -f "$compressed_file"
|
||||
((SKIPPED++))
|
||||
fi
|
||||
|
||||
echo ""
|
||||
done
|
||||
|
||||
# Очистка временной директории
|
||||
rm -rf "$TEMP_DIR"
|
||||
|
||||
echo "=========================================="
|
||||
echo " Результаты"
|
||||
echo "=========================================="
|
||||
echo -e "${GREEN}Обработано: $PROCESSED${NC}"
|
||||
echo -e "${YELLOW}Пропущено: $SKIPPED${NC}"
|
||||
if [ "$ERRORS" -gt 0 ]; then
|
||||
echo -e "${RED}Ошибок: $ERRORS${NC}"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Финальный размер
|
||||
FINAL_SIZE=$(du -sh "$SCREENRECORDINGS_DIR" 2>/dev/null | cut -f1)
|
||||
echo -e "Финальный размер: ${GREEN}$FINAL_SIZE${NC}"
|
||||
echo ""
|
||||
|
||||
# Информация о бэкапах
|
||||
if [ -d "$BACKUP_DIR" ] && [ "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
|
||||
BACKUP_SIZE=$(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1)
|
||||
echo -e "Бэкапы оригиналов сохранены в: ${YELLOW}$BACKUP_DIR${NC} (${BACKUP_SIZE})"
|
||||
echo ""
|
||||
echo "⚠️ После проверки сжатых видео, вы можете удалить бэкапы:"
|
||||
echo " rm -rf $BACKUP_DIR"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}Готово!${NC}"
|
||||
|
||||
Reference in New Issue
Block a user