Guest User

4cdl (4chan image downloader)

a guest
May 24th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 20.00 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # Author:       Twily             2015
  4. # Description:  4chan image downloader
  5. # Requires:     imagemagick, ffmpeg, wget, sed, perl, libnotify, thunar, sxiv
  6. # Usage:        $ sh ./4cdl <url-to-thread>
  7. #               (URL Format: http(s)://../thread/<id>/<subject>)
  8. #
  9. # Features:   * Image download w/ Auto-update until 404
  10. #             * Stores the thread alongside; archiving
  11. #             * Generates thumbnails locally
  12. #             * Creates a catalog file for each of the boards
  13. #             * Creates an index homepage file; hosting
  14. #
  15. # Converting pre-existing threads to use thumbnails: http://pastebin.com/2RVWt8Qm
  16. #
  17.  
  18. P=/home/guest/4cdl-images               # Download Path
  19. PW=5532                                 # Index access code
  20.  
  21. C=true                                  # Clear output
  22. L=true                                  # Loop until 404
  23. E=true                                  # Exit on finish
  24.  
  25. V=18                                    # Threads per page in catalog
  26.  
  27. W=(10 15 20 30 60 90 120 180 240 300)
  28.  
  29. # function prepare          Prepare directories, files and variables
  30. # function thread           Archives the thread as an html page
  31. # function download         Downloads all images from the thread
  32. # function progress         Progressbar for image downloads
  33. # function thumbnail        Generates thumbnails for images
  34. # function clean            Print links and cleanup files
  35. # function cleanse          Cleanse the url from bad characters
  36. # function catalog          Generates a catalog for the current board
  37. # function index            Generates an index file for board listing
  38. # function loop             Loops the downloader until thread 404
  39. # function input            Choose action to do once download has completed
  40. # function main             Script begin
  41. # (See bottom for manual catalog/index rebuilding)
  42.  
  43. #
  44. # Color Scheme
  45. #
  46. #   17181A - Background     8C88FC - Link Normal                 A2E059 - Quote
  47. #   27282B - Content BG     EA75BC - Link Active                 D54A56 - Trip
  48. #   CECFD1 - Foreground     606163 - Link Dead, Active Border    F4AA5C - Subject
  49. #  
  50.  
  51.  
  52. function prepare {
  53.     # Generate folder name from url
  54.     S=${H%/*}        && T=${S##*/}      # T = Thread ID
  55.     S=${H%%/thread*} && B=${S##*/}      # B = Board Tag
  56.     N=$B"/"$T"-"${H##*/}
  57.  
  58.     # Temporary files
  59.     F1="4c.index.$T.tmp"
  60.     F2="4c.list.$T.tmp"
  61.     F3="4c.name.$T.tmp"
  62.  
  63.     # Thread html files
  64.     F4=$T"-"${H##*/}".html"
  65.     F5=$B"-catalog.html"
  66.     F6="index.html"
  67.  
  68.     # Download page/thread
  69.     wget "$H" -O $P/$F1
  70.     if [[ "$?" -ne "0" ]]; then X=true
  71.     else
  72.         # Make directory
  73.         if [ ! -d "$P/$N" ]; then mkdir -p $P/$N; fi
  74.     fi
  75.  
  76.     # Add lines to index file
  77.     sed -i 's/></>\n</g' $P/$F1
  78.     sed -i 's/> </>\n</g' $P/$F1
  79.  
  80.     # Extract links and names to list
  81.     grep "fileThumb" < $P/$F1 > $P/$F2
  82.     grep "fileText" < $P/$F1 > $P/$F3
  83.  
  84.     # Remove all html code from the links/names
  85.     sed -i 's/<a .*href="\/\///g' $P/$F2
  86.     sed -i 's/" .*//g' $P/$F2
  87.     sed -i 's/.*<span class="fileThumb">.*/DELETED/g' $P/$F2
  88.  
  89.     sed -i 's/<div.*title="//g' $P/$F3
  90.     sed -i 's/" href=".*//g' $P/$F3
  91.    
  92.     sed -i 's/<div.*_blank">//g' $P/$F3
  93.     sed -i 's/<\/a>.*//g' $P/$F3
  94.     sed -i 's/">.*//g' $P/$F3
  95.  
  96.     if ! $X; then thread; fi
  97. }
  98.  
  99. function thread {
  100.     # Create thread html page
  101.     echo -ne "\033[1;33mBuilding thread...."
  102.     cp $P/$F1 $P/$N/$F4
  103.  
  104.     a=0 && b=0 && e=0
  105.     c=true && d=true
  106.  
  107.     # Find lines to remove
  108.     while read p; do
  109.         if $c; then
  110.             let a=$a+1
  111.             case "$p" in *form\ name=\"delform\"*) c=false ;;
  112.             esac
  113.         fi
  114.         if $d; then
  115.             let b=$b+1
  116.             case "$p" in *navLinks\ navLinksBot*)  d=false && let b=$b-1 ;;
  117.             esac
  118.         fi
  119.  
  120.         let e=$e+1
  121.     done < $P/$N/$F4
  122.  
  123.     # Trim html code
  124.     sed -i $b','$e'd' $P/$N/$F4
  125.     sed -i '3,'$a'd' $P/$N/$F4
  126.  
  127.     sed -i '/<input type="checkbox"/d' $P/$N/$F4
  128.     sed -i '/<div class="sideArrows"/d' $P/$N/$F4
  129.  
  130.     perl -0777 -i -pe 's/<div class="postInfoM.*?<\/div>//smg' $P/$N/$F4
  131.  
  132.     sed -i '/class="mFileInfo mobile"/d' $P/$N/$F4
  133.  
  134.     sed -i "s/javascript:quote('/#p/g" $P/$N/$F4
  135.     sed -i "s/');\" title=\"Reply/\" title=\"Link/g" $P/$N/$F4
  136.     sed -i 's/href="#p/href="#pc/g' $P/$N/$F4
  137.     sed -i 's/<!DOCTYPE html>//' $P/$N/$F4
  138.     sed -i 's/<html>//' $P/$N/$F4
  139.  
  140.     # Apply CSS style to html file
  141.     echo -e "<!DOCTYPE html>\n<html>\n" \
  142.             "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\n" \
  143.             "<title>$F4</title>\n" \
  144.             "<style type=\"text/css\">\n" \
  145.             "html,body                  { background: #17181A; color: #CECFD1; font-size: 10pt; }\n" \
  146.             "a:link, a:visited          { color: #8C86FC; text-decoration: none; }\n" \
  147.             "a:hover, a:active          { color: #EA75BC; text-decoration: underline; }\n" \
  148.             "pre                        { background: #111113; padding: 4px; font-size: 10pt; }\n" \
  149.             "img                        { width: auto; height: auto; max-width: 125px; max-height: 125px; }\n" \
  150.             ".op img                    { max-width: 250px; max-height: 250px; }\n" \
  151.             ".replyContainer            { display: table; background: #27282B; border: 2px solid #27282B; padding: 12px; margin: 4px; }\n" \
  152.             ".opContainer               { display: block; padding: 12px; }\n" \
  153.             ":target:not(.opContainer)  { border: 2px solid #606163; }\n" \
  154.             ".postMessage, .file        { display: block; }\n" \
  155.             ".fileThumb                 { float: left; margin: 3px 20px; 5px; }\n" \
  156.             ".postNum                   { margin-right: 4px; }\n" \
  157.             ".quote                     { color: #A2E059; }\n" \
  158.             ".deadlink                  { color: #606163; text-decoration: line-through; }\n" \
  159.             ".postertrip                { color: #D54A56; }\n" \
  160.             ".subject                   { color: #F4AA5C; font-weight: bold; }\n" \
  161.             ".name                      { font-weight: bold; }\n" \
  162.             "</style>" | cat - $P/$N/$F4 > $P/$N/$F4"_tmp" && mv $P/$N/$F4"_tmp" $P/$N/$F4
  163.  
  164.     sed -i "s/class=\"quotelink\">&gt;&gt;$T<\/a>/class=\"quotelink\">\&gt;\&gt;$T (OP)<\/a>/g" $P/$N/$F4
  165.  
  166.     # Find post IDs and quotelinks
  167.     e=1 && t=false
  168.     declare -A arr
  169.  
  170.     while read p; do
  171.         if $t; then
  172.             o=$(echo $p | sed -e 's/.*<a href="#pc\(.*\)" title=".*/\1/');
  173.             arr[$o]="$(( $e + 2 )) "
  174.  
  175.             t=false
  176.         fi
  177.  
  178.         case "$p" in
  179.             \<span\ class=\"postNum\ desktop\"\>)
  180.                 t=true
  181.                 ;;
  182.             *\"\ class=\"quotelink\"\>*)
  183.                 q=$(echo $p | sed -e 's/.*<a href="#pc\(.*\)" class=".*/\1/')
  184.                 [[ "${arr[$q]}" =~ "$o" ]] || arr[$q]+="$o "
  185.                 ;;
  186.         esac
  187.  
  188.         let e=$e+1
  189.     done < $P/$N/$F4
  190.  
  191.     # Add replylinks (from quotelinks)
  192.     for i in "${!arr[@]}"; do
  193.         #echo "$i < ${arr[$i]}"          # print array (optional)
  194.  
  195.         IFS=' ' read -a arr2 <<< "${arr[$i]}"
  196.  
  197.         for (( j=${#arr2[@]}-1; j>=1; j-- )); do
  198.             perl -i -ne 'print; print " <a href=\"#pc'${arr2[$j]}'\">&gt;&gt;'${arr2[$j]}'</a>" if $. == '${arr2[0]} $P/$N/$F4
  199.         done
  200.     done
  201.  
  202.     echo -e "[\033[1;37mDONE\033[1;33m]\033[0m"
  203. }
  204.  
  205. I=0 && M=0
  206. function download {
  207.     # Loop trough list and download all images
  208.     i=1 && op=true
  209.     t=$(wc -l < $P/$F2)
  210.  
  211.     if $C; then echo -en "\ec"; fi
  212.     while read p <&3; do
  213.         a=${p##*/}
  214.         a=${a%%.*}
  215.         b=$(sed -n $i"p" $P/$F3)
  216.         b=${b//&#039;/\'}
  217.  
  218.         progress $t
  219.  
  220.         if [[ ! -f $P/$N/"$a-$b" ]]; then
  221.             # Image Download
  222.             if [[ "$p" != "DELETED" ]]; then
  223.                 wget $p -O $P/$N/"$a-$b"
  224.  
  225.                 if $op; then    thumbnail "$P/$N" "$a-$b" 250x250 \#17181A
  226.                 else            thumbnail "$P/$N" "$a-$b" 125x125 \#27282B
  227.                 fi
  228.             else
  229.                 let i=$i-1
  230.                 let t=$t-1
  231.             fi
  232.         else
  233.             # Skip if image exists
  234.             echo -e "\033[0;37m'$P/$N/$a-$b'\033[0m\n\033[1;37m...\033[1;33m[\033[1;37mSKIPPED\033[1;33m]\033[0m"
  235.  
  236.             tA="${b%.*}"     # filename
  237.             if [[ ! -f $P/$N/"thumbs/$a-$tA"_s.jpg ]]; then
  238.                 if $op; then    thumbnail "$P/$N" "$a-$b" 250x250 \#17181A
  239.                 else            thumbnail "$P/$N" "$a-$b" 125x125 \#27282B
  240.                 fi
  241.             fi
  242.         fi
  243.         op=false
  244.         cleanse $b && b=$s
  245.  
  246.         tE="${b##*.}"    # extention
  247.         tA="${b%.*}"     # filename
  248.  
  249.         # Update images in html file
  250.         sed -i "s/href=\".*"$a".*\"/href=\"\.\/$a-$b\"/g" $P/$N/$F4
  251.         sed -i "s/src=\".*"$a"s.*\"/src=\"\.\/thumbs\/$a-$tA\_s.jpg\" width=\"125px\" height=\"125px\"/g" $P/$N/$F4
  252.  
  253.         let i=$i+1
  254.         if $C; then echo -en "\ec"; fi
  255.     done 3< $P/$F2
  256.  
  257.     if [ "$I" -lt "$i" ]; then let I=$i-1; fi
  258.  
  259.     if [ "$(md5sum $P/$N/$F4)" != "$M" ]; then R=0; fi
  260.     M=$(md5sum $P/$N/$F4)
  261.  
  262.     # Remove failed images to attempt redownload next time
  263.     find $P/$N -size 0 -exec rm -f {} +
  264. }
  265.  
  266. function progress {
  267.     # Progressbar ($1 = max value)
  268.     echo -ne "\033[1;30mProgress: \033[1;33m[$i / $t]"
  269.     pC=$(( $(tput cols) - 30 ))
  270.     pL=$(( $i * $pC / $1 ))
  271.     pP=$(( $i * 100 / $1 ))
  272.     printf ' %.0s' $(seq 1 $(( 4 - ${#pP} )) )
  273.     echo -ne "$pP%["
  274.     for j in $(seq 1 $pL); do echo -n "="; done
  275.     echo -n ">"
  276.     for k in $(seq $pL $(( $pC - 1 )) ); do echo -n " "; done
  277.     echo -e "]\033[0m\n"
  278. }
  279.  
  280. function thumbnail {
  281.     # Make thumbnail for image downloaded
  282.     tD="$1"
  283.     tF="$2"
  284.     if [ ! -d "$tD/thumbs/" ]; then mkdir -p "$tD/thumbs/"; fi
  285.  
  286.     tE="${tF##*.}"    # extention
  287.     tA="${tF%.*}"     # filename
  288.  
  289.     if [ ! -f "$tD/thumbs/$tA"_s.jpg ]; then
  290.         echo -e "$tD/$tF >> $tD/thumbs/$tA"_s.jpg
  291.  
  292.         case "$tE" in
  293.              "gif") convert "$tD/$tF[0]" -trim +repage -resize $3\> -gravity center -background $4 -extent $3 "$tD/thumbs/$tA"_s.jpg
  294.                     ;;
  295.             "webm") ffmpeg -i "$tD/$tF" -f image2 -vframes 1 -s $3 "$tD/thumbs/$tA"_s.jpg
  296.                     ;;
  297.                  *) convert "$tD/$tF" -trim +repage -resize $3\> -gravity center -background $4 -extent $3 "$tD/thumbs/$tA"_s.jpg
  298.                     ;;
  299.         esac
  300.     fi
  301. }
  302.  
  303. function clean {
  304.     # Notification
  305.     #notify-send "4cdl: All ("$I") images have finished downloading.\nDirectory: \"$P/$N/\""
  306.     echo -e "\033[1;32mAll ("$I") images have finished downloading.\033[0m"
  307.     echo -e "\033[1;30mThread: \033[0m"$H
  308.     echo -e "\033[1;30mDirectory: \033[0m"$P/$N/
  309.     echo -e "\033[1;30mLocal: \033[0mfile://"$P/$N/$F4
  310.     echo -e "\033[1;30mCatalog: \033[0mfile://"$P/$F5
  311.     echo -e "\033[1;30mIndex: \033[0mfile://"$P/$F6" \033[1;30m(Code: "$PW")\n"
  312.  
  313.     catalog
  314.     index
  315.  
  316.     # Remove temporary files
  317.     rm -f $P/$F1
  318.     rm -f $P/$F2
  319.     rm -f $P/$F3
  320. }
  321.  
  322. function cleanse {
  323.     # Clean urls/paths
  324.     s="$@"
  325.  
  326.     s=${s//%/%25}
  327.     s=${s//#/%23}
  328.     s=${s//&/%26}
  329.     s=${s//\?/%3F}
  330. }
  331.  
  332. function catalog {
  333.     # Create catalog of all downloaded threads from current board
  334.     echo -ne "\033[1;33mBuilding catalog..."
  335.     d=($P/$B/*)
  336.     rm -f $P/$F5
  337.  
  338.     # Apply header content
  339.     echo -e "<!DOCTYPE html>\n<html>\n" \
  340.             "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\n" \
  341.             "<title>/"$B"/ - Catalog</title>\n" \
  342.             "<center><h2 id=\"title\">/"$B"/ - Catalog</h2><input type=\"text\" id=\"q\" value=\"\" placeholder=\"Search...\" /></center>\n" \
  343.             "<style type=\"text/css\">\n" \
  344.             "html,body                  { background: #17181A; color: #CECFD1; font-size: 10pt; }\n" \
  345.             "a:link, a:visited          { color: #8C86FC; text-decoration: none; }\n" \
  346.             "a:hover, a:active          { color: #EA75BC; text-decoration: underline; }\n" \
  347.             "img                        { width: auto; height: auto; max-width: 150px; max-height: 150px; }\n" \
  348.             "input,h2                   { margin: 24px 12px; display: inline-block;  }\n" \
  349.             "input                      { position: relative; top: -2px; background: #27282B; color: #CECFD1; border: 0; padding: 4px; border-radius: 1px; }\n" \
  350.             ".thread                    { width: 150px; height: auto; padding: 8px; display: inline-block; text-align: center; vertical-align: top; }\n" \
  351.             ".btn                       { padding: 4px 8px; margin: 1px; cursor: pointer; }\n" \
  352.             "</style>\n" \
  353.             "<script type=\"text/javascript\" language=\"javascript\">\n" \
  354.             "var threads=[" >> $P/$F5
  355.    
  356.     i=${#d[@]}
  357.     a=0 && b=1
  358.     while [ "$i" -gt "0" ]; do
  359.         let i=$i-1
  360.         df=(${d[$i]}/*)
  361.         df=$(sed -r 's/"/\\"/g' <<< $df);
  362.  
  363.         # link/path
  364.         df1=${df[$(( ${#df[@]} - 2 ))]#$P}
  365.         cleanse $df1 && df1=$s
  366.  
  367.         # op image
  368.         df2=${df[0]#$P}
  369.         cleanse $df2 && df2=$s
  370.         tD="${df2%/*}/"
  371.         tF="${df2##*/}"
  372.         tA="${tF%.*}"_s.jpg
  373.  
  374.         # thread name
  375.         df3=${df1##*/}
  376.         df3=${df3#*[0-9][\-]}
  377.         df3=${df3%%.html*}
  378.         df3=$(sed -r 's/-/ /g' <<< $df3)
  379.  
  380.         # Add thread to catalog (latest will appear first)
  381.         echo -e "    [\""$df1"\",\""$tD"thumbs/"$tA"\",\""$df3"\"]," >> $P/$F5
  382.  
  383.         let a=$a+1
  384.     done
  385.  
  386.     # Apply JS, CSS and HTML to file
  387.     echo -e "];\n</script>\n\n" \
  388.             "<center>\n" \
  389.             "<div id=\"threads\"></div>\n" \
  390.             "<br />\n" \
  391.             "<div id=\"nav\"></div>\n" \
  392.             "</center>\n" \
  393.             "\n<script type=\"text/javascript\" languge=\"javascript\">\n" \
  394.             "var $=function(id) { return document.getElementById(id); }\n" \
  395.             "var perpage="$V";\n" \
  396.             "var selected=1;\n" \
  397.             "var i,pages,qA=[];\n\n" \
  398.             "function view(x) {\n" \
  399.             "    selected=x-1;\n" \
  400.             "    pages=Math.ceil(qA.length/perpage);\n" \
  401.             "    var begin=selected*perpage;\n" \
  402.             "    \$('nav').innerHTML=\"\";\n" \
  403.             "    \$('threads').innerHTML=\"\";\n" \
  404.             "    \$('title').innerHTML=\"/"$B"/ - Catalog(\"+x+\")\";\n" \
  405.             "    for(i=1;i<=pages;i++) {\n" \
  406.             "        \$('nav').innerHTML+=\"<input type='button' class='btn' id='btn_\"+i+\"' value='\"+i+\"' onclick='view(\"+i+\");' />\";\n" \
  407.             "        \$('btn_'+i).style.background=\"\#27282B\";\n" \
  408.             "    }\n" \
  409.             "    \$('btn_'+x).style.backgroundColor=\"\#111113\";\n" \
  410.             "    for(var i=begin;i<(begin+perpage);i++) {\n" \
  411.             "        \$('threads').innerHTML+=\"<div class='thread'><a href='.\"+qA[i][0]+\"' target='_self'><img width='150px' height='150px' src='.\"+qA[i][1]+\"' /><br />\"+qA[i][2]+\"</a></div>\";\n" \
  412.             "    }\n" \
  413.             "}\n\n" \
  414.             "function find(q,x) {\n" \
  415.             "    qA=[];\n" \
  416.             "    var c=0;\n" \
  417.             "    for(i=0;i<threads.length;i++) {\n" \
  418.             "        if(threads[i][0].indexOf(q)>-1 || threads[i][1].indexOf(q)>-1 || threads[i][2].indexOf(q)>-1) {\n" \
  419.             "            qA[c]=threads[i].slice();\n" \
  420.             "            c++;\n" \
  421.             "        }\n" \
  422.             "    }\n\n" \
  423.             "    view(x);\n" \
  424.             "}\n\n" \
  425.             "document.body.onload=function()              { find(\$('q').value,selected); };\n" \
  426.             "\$('q').addEventListener('change',function() { find(\$('q').value,1); });\n" \
  427.             "\$('q').addEventListener('keyup',function()  { find(\$('q').value,1); });\n" \
  428.             "</script>\n</html>\n" >> $P/$F5
  429.  
  430.     echo -e "[\033[1;37mDONE\033[1;33m]\033[0m"
  431. }
  432.  
  433. function index {
  434.     # index html page
  435.     if $X; then
  436.         rm -f $P/$F1
  437.         F1="4c.index.tmp"
  438.         wget "https://boards.4chan.org/g/" -O $P/$F1
  439.  
  440.         # Add lines to index file
  441.         sed -i 's/></>\n</g' $P/$F1
  442.         sed -i 's/> </>\n</g' $P/$F1
  443.     fi
  444.     rm -f $P/$F6
  445.  
  446.     echo -ne "\033[1;33mBuilding index....."
  447.  
  448.     echo -e "<!DOCTYPE html>\n<html>\n" \
  449.             "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\" />\n" \
  450.             "<title>4cdl</title>\n\n" \
  451.             "<style type=\"text/css\">\n" \
  452.             "html,body {\n" \
  453.             "    margin: 20px; padding: 0;\n" \
  454.             "    background: #17181A; color: #CECFD1;\n}\n\n" \
  455.             "form { display: inline-block; margin: 6px 4px; }\n" \
  456.             ".input {\n" \
  457.             "     padding: 4px 8px; border: 0;\n" \
  458.             "     background: #27282B; color: #CECFD1;\n}\n" \
  459.             "    .btn { border-radius: 1px; cursor: pointer; }\n" \
  460.             "    .txt { width: 50px; padding: 5px 8px; }\n\n" \
  461.             "#boards { display: none; }\n" \
  462.             "</style>\n" \
  463.             "<script type=\"text/javascript\">\n" \
  464.             "var \$=function(id) { return document.getElementById(id); };\n" \
  465.             "window.onload=function() { \$('code').focus(); }\n\n" \
  466.             "function validate() {\n" \
  467.             "    if(\$('code').value=='"$PW"') { // 18+\n" \
  468.             "        \$('input').style.display='none';\n" \
  469.             "        \$('boards').style.display='block';\n" \
  470.             "        return false;\n    }\n}\n" \
  471.             "</script>\n\n" \
  472.             "<div id='boards'>\n    Select Board:\n    <br /><br />\n" >> $P/$F6
  473.  
  474.     # get directories
  475.     array=($P*/*/)
  476.     for dir in "${array[@]}"; do
  477.         aD1=${dir#$P}
  478.         aD1=$(echo "$aD1" | sed -e 's/\//\\\//g')
  479.         aD2=$(grep "$aD1" < $P/$F1)
  480.         aD3=${aD1//\\}
  481.         aD3=${aD3//\/}
  482.         aD2=$(echo "$aD2" | grep -Po '^.*?\K(?<='$aD1'" title=").*?(?=">'$aD3'</a>)')
  483.  
  484.         echo -e "    <form action='./"$aD3"-catalog.html'><input type='submit' class='input btn' value='/"$aD3"/ - "$aD2"' /></form>" >> $P/$F6
  485.     done
  486.     echo -e "</div>\n\n" \
  487.             "<div id='input'>\n    Enter Code:\n    <br /><br />\n\n" \
  488.             "    <form onsubmit='return validate();'>\n" \
  489.             "        <input type='text' class='input txt' placeholder='XXXX' id='code' autocomplete='off' />\n" \
  490.             "        <input type='submit' class='input btn' value='Submit' />\n" \
  491.             "    </form>\n</div>\n</html>\n" >> $P/$F6
  492.  
  493.     echo -e "[\033[1;37mDONE\033[1;33m]\033[0m"
  494.     rm -f $P/$F1
  495. }
  496.  
  497. function loop {
  498.     if ! $X; then
  499.         echo -ne "\n\033[1;33mUpdating in "
  500.  
  501.         # Wait timer
  502.         i=${W[$R]}
  503.         while [ "$i" -gt "0" ]; do
  504.             echo -ne $i".."
  505.             sleep 1
  506.             let i=$i-1
  507.         done
  508.         echo -e "\033[0m"
  509.  
  510.         if [ "$R" -lt "$(( ${#W[@]} - 1 ))" ]; then let R=$R+1; fi
  511.         main
  512.     else
  513.         echo -e "\n\033[1;31mThread no longer exist [404].\033[0m\n"
  514.         input
  515.     fi
  516. }
  517.  
  518. function input {
  519.     if $E; then exit 0; fi
  520.     R=0
  521.  
  522.     echo -e "\nOptions: "
  523.     echo -e "   1. Continue Download"
  524.     echo -e "   2. Open Directory"
  525.     echo -e "   3. View Pictures"
  526.     echo -e "   4. Quit\n"
  527.  
  528.     read -p "Enter: " -n 1 -r
  529.     echo -e "\n"
  530.     case "$REPLY" in
  531.         1)  main ;;
  532.         2)  thunar $P/$N; input ;;
  533.         3)  sxiv $P/$N/*; input ;;
  534.         4)  exit 0 ;;
  535.         *)  echo "Invalid input..."; input ;;
  536.     esac
  537. }
  538.  
  539. function main {
  540.     prepare
  541.     download
  542.     clean
  543.  
  544.     if $L; then loop; else input; fi
  545. }
  546.  
  547. H="$1"
  548. X=false
  549. R=0
  550.  
  551. if [ "$H" == "catalog" ]; then
  552.     # ** Rebuild catalog w/ $ sh ./4cdl catalog mlp
  553.     B="$2"
  554.     F5=$B"-catalog.html"
  555.     catalog
  556.    
  557.     echo -e "\033[1;30mCatalog: \033[0mfile://"$P/$F5"\n"
  558.     exit 0
  559. fi
  560.  
  561. if [ "$H" == "index" ]; then
  562.     # ** Rebuild index w/ $ sh ./4cdl index
  563.     X=true
  564.     F1="4c.index.tmp"
  565.     F6="index.html"
  566.     index
  567.  
  568.     echo -e "\033[1;30mIndex: \033[0mfile://"$P/$F6" \033[1;30m(Code: "$PW")\n"
  569.     exit 0
  570. fi
  571. main
  572.  
  573. exit 0
Add Comment
Please, Sign In to add comment