#!/bin/bash
tmp_links_file="/tmp/links.tmp"
tmp_file_download="/tmp/download.tmp"

nano "$tmp_links_file"
read -p "Enter output directory: " outdir

# manually created arrays for file types and extensions
## notes: from twitter downloader mp4 files show as ISO?
types_arr=('MPEG' 'ISO' 'JPEG' 'PNG' 'GIF' 'WebM' 'RIFF')
exts_arr=('mp4' 'mp4' 'jpg' 'png' 'gif' 'webm' 'webp')

# create the out dir if not extant
if [ ! -d "$outdir" ]; then
  echo "Output directory does not exist: $outdir Creating"
  mkdir "$outdir"
fi

# read the input file and loop through it
cat "$tmp_links_file" | \
	while read line; do
    # get default basename of downloaded file
    file_basename=$(basename "$line")

    echo "Downloading $line" # to $outdir/$file_basename"

    # download the file to a tmp
		curl -s -o "$tmp_file_download" "$line"

    # get the file type
    type=$(file "$tmp_file_download" | awk '{print $2}')

    # md5 hash the file for a deterministic file name
    namehash=$(md5sum "$tmp_file_download" | awk '{print $1}')

    # map the file type to the corresponding extension
    count=0
    # loop through types for patch with file type
    for item in "${types_arr[@]}"; do
      if [[ " ${types_arr[@]} " =~ " ${type} " ]]; then
        # if type matches
        if [[ "$item" == "$type" ]]; then
          # rename the downloaded file
          new_name="$outdir/$namehash.$(echo ${exts_arr[$count]})"
          echo -e "\tto $new_name"
          mv "$tmp_file_download" "$new_name"
          if [ $? -ne 0 ]; then
            echo -e "\nFailed to rename $tmp_file_download to $new_name\n\turl\n\t$line\n\ttype $type\n\tbase name: $file_basename\n"
          fi
        fi
      else
        echo -e "\n$file_basename not a supported format: $type $(file $tmp_file_download)!\n\turl: $line\n\ttype: $type\n\tbase name: $file_basename\n\tfile: $(file $tmp_file_download)\n"
        rm -f "$tmp_file_download"
      fi

      # increment the count regardless
      count=$((count + 1))
    done
  done

  # cleanup
  rm -f "$tmp_links_file" >/dev/null 2>&1 # suppress errors or output
  rm -f "$tmp_file_download" >/dev/null 2>&1 # suppress errors or output