LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 876|回复: 1

贡献三个脚本,下载nationalgeographic的图片

[复制链接]
发表于 2008-4-5 23:53:33 | 显示全部楼层 |阅读模式
我的blog,
http://eagleisyou.spaces.live.com/default.aspx
三个bash脚本,现在总共可以下载到五千张图片,全是来自nationalgeographic网站。

使用方法:把三个脚本放在同一个目录下,运行pod.sh ;运行callphotos.sh ;不要直接运行photos.sh
解释:
1 pod.sh就是原来的ngpod.sh修改版,专门下载nationalgeographic.com/photography/photo-of-the-day这个栏目的图片,大约有2500张图片。
2 每张photo-of-the-day都有它的related pics;callphotos.sh和photos.sh就负责下载这些。
3 callphotos.sh是对为了加快速度,同时调用多个photos.sh脚本;photos.sh是下载ng网站其它栏目的图片,大约也有2500张图片。
4 现在可“断点续传”,当脚本运行到一半时你可以用ctrl+D中断,注意不要手动删除隐藏的临时文件,下次再运行脚本会自动接到上次中断的地方。
5 pod.sh可自动下载最新的图片,不再需要修改脚本来改变开始/结束时间。
6 运行时间,在我的网络状态,晚上睡觉前运行,早上起来脚本就成功结束了。
7 生成的介绍html有些还是有错误,still need to be done.
  1. #!/bin/bash
  2. #####################################
  3. #pod.sh
  4. #update 2008/4/5,
  5. # to get last version,visit http://eagleisyou.spaces.live.com
  6. # the script will download photos of NGPOD
  7. #NGPOD: "National Geographic Photo Of the Day"
  8. #http://photography.nationalgeographic.com/photography/photo-of-the-day
  9. ######################################
  10. #the earliest ngpod is the  April 21, 2001
  11. #declare  BYEAR=1 BMONTH=4 BDAY=21
  12. declare  BYEAR=1 BMONTH=4 BDAY=21
  13. #the script will auto use today as the end day
  14. declare  EYEAR EMONTH EDAY
  15. #or you can manual set EYAER variables
  16. #declare  EYEAR=8 EMONTH=3 EDAY=29
  17. ###############################################################
  18. #download year,month,day
  19. declare  DYEAR DMONTH DDAY
  20. declare JPGNAME
  21. TMP1=.tmpngpod1
  22. TMP2=.tmpngpod2
  23. TMP3=.tmpngpod3
  24. TMP4=.tmpngpod4
  25. TMP5=.tmpngpod5
  26. TMPJPG=.tmpngpodjpg
  27. TMPINTRO=.tmpngpodintro
  28. EXLINK="http://photography.nationalgeographic.com"
  29. declare JUDGE
  30. ###############################################
  31. #function difinition area
  32. getendday()
  33. {
  34.         if [ ! -z "$EYEAR" ];then
  35.                 return
  36.         fi
  37.         EYEAR=`date | awk '{print $6}' `
  38.         EMONTH=`date | awk '{print $2}' `
  39.         EDAY=`date | awk '{print $3}' `
  40.         EYEAR=`expr $EYEAR - 2000 `
  41.         if [ "$EMONTH" == "Jan" ];then
  42.                 EMONTH=1
  43.         elif [ "$EMONTH" == "Feb" ];then
  44.                 EMONTH=2
  45.         elif [ "$EMONTH" == "Mar" ];then
  46.                 EMONTH=3
  47.         elif [ "$EMONTH" == "Apr" ];then
  48.                 EMONTH=4
  49.         elif [ "$EMONTH" == "May" ];then
  50.                 EMONTH=5
  51.         elif [ "$EMONTH" == "Jun" ];then
  52.                 EMONTH=6
  53.         elif [ "$EMONTH" == "Jul" ];then
  54.                 EMONTH=7
  55.         elif [ "$EMONTH" == "Aug" ];then
  56.                 EMONTH=8
  57.         elif [ "$EMONTH" == "Sep" ];then
  58.                 EMONTH=9
  59.         elif [ "$EMONTH" == "Oct" ];then
  60.                 EMONTH=10
  61.         elif [ "$EMONTH" == "Nov" ];then
  62.                 EMONTH=11
  63.         elif [ "$EMONTH" == "Dec" ];then
  64.                 EMONTH=12
  65.         fi
  66. }
  67. getday()
  68. {
  69.         if [ $BYEAR -gt $EYEAR ];then
  70.                 BYEAR=0
  71.                 return
  72.         elif [ $BYEAR -eq $EYEAR ];then
  73.                 if [ $BMONTH -gt $EMONTH ];then
  74.                         BYEAR=0
  75.                         return
  76.                 elif [ $BMONTH -eq $EMONTH ];then
  77.                         if [ $BDAY -gt $EDAY ];then
  78.                                 BYEAR=0
  79.                                 return
  80.                         fi
  81.                 fi
  82.         fi
  83.         if [ $BMONTH -eq 2 ];then
  84.                 if [ $BDAY -eq 30 ];then
  85.                         BDAY=1;
  86.                         BMONTH=3;
  87.                 fi
  88.                 if [ $BDAY -eq 29 ];then
  89.                         if [ $BYEAR -ne 4 ];then #not 2004.2.29
  90.                                 if [ $BYEAR -ne 8 ];then # not 2008.2.29
  91.                                         if [ $BYEAR -ne 12 ];then #not 2008.2.29
  92.                                                 BDAY=1;
  93.                                                 BMONTH=3;
  94.                                         fi
  95.                                 fi
  96.                         fi
  97.                 fi
  98.                
  99.         fi
  100.         if [ $BDAY -eq 32 ];then
  101.                 BMONTH=`expr $BMONTH + 1 ` ;
  102.                 BDAY=1;
  103.         fi
  104.         if [ $BDAY -eq 31 ];then
  105.                 case  $BMONTH in
  106.                         4)
  107.                         BMONTH=5;
  108.                         BDAY=1;
  109.                         ;;
  110.                         6)
  111.                         BMONTH=7;
  112.                         BDAY=1;
  113.                         ;;
  114.                         9)
  115.                         BMONTH=10;
  116.                         BDAY=1;
  117.                         ;;
  118.                         11)
  119.                         BMONTH=12;
  120.                         BDAY=1;
  121.                         ;;
  122.                 esac
  123.         fi
  124.         if [ $BMONTH -eq 13 ];then
  125.                 BMONTH=1;
  126.                 BYEAR=`expr $BYEAR + 1 `
  127.         fi
  128.                 if [ $BYEAR -lt 10 ];then
  129.                 DYEAR="0$BYEAR";
  130.         else
  131.                 DYEAR=$BYEAR;
  132.         fi
  133.         if [ $BMONTH -lt 10 ];then
  134.                 DMONTH=0$BMONTH;
  135.         else
  136.                 DMONTH=$BMONTH;
  137.         fi
  138.        
  139.         if [ $BDAY -lt 10 ];then
  140.                 DDAY=0$BDAY;
  141.         else
  142.                 DDAY=$BDAY;
  143.         fi
  144.        
  145. }
  146. call_iconv()
  147. {
  148.         iconv -f iso8859-1 -t utf8 -o $1.utf8 $1
  149.         rm -f $1
  150.         mv $1.utf8 $1
  151. }
  152. getfile()
  153. {
  154.         local TEST
  155.         #download $1 htmllink,save as file $1
  156.        
  157.         wget -O "$1" "$2" 2>/dev/null
  158.         #wget -O "$1" "$2"
  159.        
  160.         TEST=`echo "$2" |sed -n -e 's/\.jpg//p' `
  161.         #not jpg,need to iconv
  162.         if [ -z "$TEST" ];then
  163.                 call_iconv $1
  164.         fi
  165. }
  166. check_jpg()
  167. {
  168.         local TEST
  169.         local SIZE
  170.         if [ ! -f $1 ];then
  171.                 #file not exist,do not need to check
  172.                 return
  173.         fi
  174.         # if a jpeg filesize is less than 6KByte,
  175.         # delete it
  176.         SIZE=`wc -c $1 | awk '{print $1}'`
  177.         if [  $SIZE -lt 6000 ];then
  178.                 rm -f $1
  179.                 return
  180.         fi
  181.         TEST=`file $1 `
  182.     # if the jpg is not cracked,TEST will be zero
  183.         TEST=`echo "$TEST" |sed -n -e 's/JPEG//p' `
  184.         if [ -z "$TEST" ];then
  185.                         rm -f $1
  186.         fi
  187. }
  188. s_alpha()
  189. {       
  190.         # read first alpha of jpgname
  191.         #sed -n -e 's/.*\/\([a-zA-Z]\).*jpg/\1/p'  $1
  192.         sed -n -e 's/\(^.\).*jpg/\1/p'  $1
  193. }
  194. s_relateddir()
  195. {       
  196.         # get relateddir
  197.         sed -n -e 's/.*\/\([a-zA-Z]*\/[a-zA-Z]*\)\/.*html/\1/p'  $1
  198. }
  199. s_relatedlink()
  200. {
  201.         sed -n -e '/<h3>/{N;N;s/.*<a href="\(.*html\).*>\(.*\)<\/a>.*/\1 \2/p}' $1
  202. }
  203. s_walllink()
  204. {
  205.         sed -n -e 's/.*class="wallpaper" href="\(.*html\)">.*/\1/p' $1
  206. }
  207. s_walllink2()
  208. {
  209.         sed -n -e 's/.*class="enlarge" href="\(.*html\)">.*/\1/p' $1
  210. }
  211. sg_jpgname()
  212. {
  213.         JPGNAME=`sed -n -e 's/.*<a href="\(.*jpg\)">.*1280 x 1024 pixels.*/\1/p'  $1`
  214.        
  215.         if [ -z ${JPGNAME} ] ;then
  216.                 JPGNAME=`sed -n -e 's/.*<a href="\(.*jpg\)">.*1024 x 768 pixels.*/\1/p' $1`
  217.         fi
  218.         # only has 800x600 jpg
  219.         if [ -z ${JPGNAME} ] ;then
  220.                 JPGNAME=`sed -n -e 's/.*src="\(.*sw\.jpg\)".*/\1/p'  $1`
  221.         fi
  222.         if [ -z ${JPGNAME} ] ;then
  223.                 JPGNAME=`sed -n -e 's/.*src="\(.*800.*jpg\)".*/\1/p'  $1`
  224.         fi
  225. }
  226. s_title()
  227. {
  228. #        sed -n -e 's/.*<td><h1>\(.*\)<\/h1><\/td>.*/\1/p' $1
  229.         sed -n -e '/<div class="summary"/{N;N;N;s/.*<h3>\(.*\)<\/h3>.*/\1/p}' $1
  230. }
  231. s_date()
  232. {
  233.         sed -n -e 's/.*<div class="date">\(.*\)<\/div>.*/\1/p' $1
  234. }
  235. s_who()
  236. {
  237.         #sed -n -e 's/.*<div class="credit">\(.*\)<\/div>.*/\1/p'  $1
  238.         sed -n -e 's/.*<p class="credit">\(.*\)<\/p>.*/\1/p'  $1
  239. }
  240. s_intro()
  241. {
  242.         sed -n -e '/<div class="description"/{N;N;N;N;N;N;N;N;s/.*<div class="description">\(.*\)<\/div>.*/\1/p}' $1 \
  243.         | sed -e 's/<a.*\/a>//p'
  244. }
  245. create_introhead()
  246. {
  247.         local INTROFILE YEAR MONTH
  248.         local -i DAY COUNT TMP
  249.         if [ $# -ne 3 ];then
  250.                 return
  251.         fi
  252.        
  253.         INTROFILE=$1
  254.         if [ ! -f $INTROFILE ];then
  255.                 touch $INTROFILE;
  256.         else
  257.                 return
  258.         fi
  259.         echo "<html><head>" >>$INTROFILE;
  260.         echo "<meta http-equiv=Content-Type content="text/html; charset=utf8">" >> $INTROFILE;
  261.         echo "<title>National Geographic Photo of the Day</title></head>" >>$INTROFILE
  262.         case $3 in
  263.                 01) MONTH=January; DAY=31 ;;
  264.                 02) MONTH=February;
  265.                         if [ "$2" == "04" ];then
  266.                                 DAY=29
  267.                         elif [ "$2" == "08" ];then
  268.                                 DAY=29
  269.                         elif [ "$2" == "12" ];then
  270.                                 DAY=29
  271.                         else
  272.                                 DAY=28
  273.                         fi
  274.                    ;;
  275.                 03) MONTH=March        ;DAY=31 ;;
  276.                 04) MONTH=April        ;DAY=30 ;;
  277.                 05) MONTH=May        ;DAY=31 ;;
  278.                 06) MONTH=June        ;DAY=30 ;;
  279.                 07) MONTH=July        ;DAY=31 ;;
  280.                 08) MONTH=August        ;DAY=31 ;;
  281.                 09) MONTH=September        ;DAY=30 ;;
  282.                 10) MONTH=October        ;DAY=31 ;;
  283.                 11) MONTH=November        ;DAY=30 ;;
  284.                 12) MONTH=December        ;DAY=31 ;;
  285.                
  286.                 ?) return  ;;
  287.         esac
  288.        
  289.         YEAR=20$2
  290.         echo "<body bgcolor="gray">" >>$INTROFILE
  291.         echo "<table border="0" width="90%">" >>$INTROFILE
  292.         echo "  <tr><td align="center">" >>$INTROFILE
  293.         echo "      <h1><a target="_blank" href="http://photography.nationalgeographic.com/photography/photo-of-the-day"> National Geographic Photo of the Day</a></h1>" >>$INTROFILE
  294.         echo "  </td></tr>" >>$INTROFILE
  295.         echo "  <tr><td align="center">" >>$INTROFILE
  296.         echo "      <h2>${YEAR} , ${MONTH}</h2>" >>$INTROFILE
  297.         echo "  </td></tr>" >>$INTROFILE
  298.     echo "</table>" >>$INTROFILE
  299.        
  300.         echo "<table width="90%" border=1>" >>$INTROFILE
  301.         COUNT=1
  302.         TMP=0
  303.         while [ $COUNT -le $DAY ]
  304.         do
  305.                 TMP=`expr $COUNT % 5`;
  306.                 if [ $TMP -eq 1 ];then
  307.                         echo "<tr>" >>$INTROFILE
  308.                 fi
  309.                
  310.                 if [ $COUNT -le 9 ];then
  311.                         echo "<td width="20%"><a href="#day0$COUNT">day 0$COUNT</a></td>" >>$INTROFILE
  312.                 else
  313.                         echo "<td width="20%"><a href="#day$COUNT">day $COUNT</a></td>" >>$INTROFILE
  314.                 fi
  315.                 TMP=`expr $COUNT % 5`
  316.                 if [ $TMP -eq 0 ];then
  317.                         echo "</tr>" >>$INTROFILE
  318.                 fi
  319.                 COUNT=`expr $COUNT + 1`
  320.         done
  321.         if [ $DAY -eq 28 ];then
  322.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  323.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  324.                         echo "</tr>" >>$INTROFILE
  325.         elif [ $DAY -eq 29 ];then
  326.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  327.                         echo "</tr>" >>$INTROFILE
  328.         elif [ $DAY -eq 31 ];then
  329.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  330.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  331.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  332.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  333.                         echo "</tr>" >>$INTROFILE
  334.         fi
  335.        
  336.        
  337.         echo "</table><br><br>" >>$INTROFILE
  338.         return
  339. }
  340. create_introtail()
  341. {        local INTROFILE YEAR MONTH DAY
  342.         if [ $# -ne 4 ];then
  343.                 return
  344.         fi
  345.        
  346.         INTROFILE=$1
  347.         YEAR=$2
  348.         MONTH=$3
  349.         DAY=$4
  350.         #if is a month end,create_tail
  351.         if [ "$DAY" == "28" ] &&  [ "$MONTH" == "02" ] ;then
  352.                 if [ ! "$YEAR" == "04" ];then
  353.                         if [ ! "$YEAR" == "08" ];then
  354.                                 if [ ! "$YEAR" == "12" ];then
  355.                                         echo "</body></html>" >>$INTROFILE
  356.                                 fi
  357.                         fi
  358.                 fi
  359.                 return
  360.         fi
  361.         if [ "$DAY" ==  "29" ] && [ "$MONTH" == "02" ] ;then
  362.                         echo "</body></html>" >>$INTROFILE
  363.                 return
  364.         fi
  365.        
  366.         if [ "$DAY" == "30" ]  ;then
  367.                 if [ "$MONTH" == "04" ] || [ "$MONTH" == "06" ] || [ "$MONTH" == "09" ] || [ "$MONTH" == "11" ] ;then
  368.                         echo "</body></html>" >>$INTROFILE
  369.                 fi
  370.                 return
  371.         fi
  372.        
  373.         if [ "$DAY" == "31" ] ;then
  374.                 echo "</body></html>" >>$INTROFILE
  375.         fi
  376. }
  377. update_intro()
  378. {
  379.         local INTROFILE DAY JPGLOCAL  HTMLINK
  380.         local TITLE DATE  WHO INTRO
  381.         local JPGLOCAL
  382.         INTROFILE=$1;
  383.         DAY=$3
  384.         JPGLOCAL=$4
  385.         HTMLINK=$5
  386.        
  387.         TITLE=`s_title $2`
  388.         #for some page,title may be empty
  389.         TITLE=${TITLE:-"National Geographic Photo of the Day:"}
  390.          
  391.         DATE=`s_date $2`
  392.         WHO=`s_who $2`
  393.         INTRO=`s_intro $2`
  394.         #echo "INTRO is +++   $INTRO"
  395.        
  396.         s_relatedlink $2 > $TMP4
  397.         echo "<br><a name="day${DAY}"></a><br>" >> $INTROFILE
  398.         echo "<table border="0" width="90%">" >>$INTROFILE
  399.         echo "        <table border="0"  width="100%" bgcolor="\#666666"><tr>" >>$INTROFILE
  400.         echo "                <td width="45%" align="left" >${TITLE}</td>" >>$INTROFILE
  401.         echo "                <td align="center"><a href="${HTMLINK}">${DATE}</a></td>" >>$INTROFILE
  402.         echo "        </tr></table>" >>$INTROFILE
  403.         echo "         <table border="0"  width="100%">" >>$INTROFILE
  404.         echo "                 <tr><td align="right" width="50%">" >>$INTROFILE
  405.         echo "                        <table border="0" width="100%">" >>$INTROFILE
  406.         echo "                                 <tr><td><br>${INTRO}<br></td></tr>" >>$INTROFILE
  407.         echo "                                 <tr><td>${WHO}<br><hr></td></tr>" >>$INTROFILE
  408.         echo "                         </table></td>" >>$INTROFILE
  409.         echo "                         <td align="center" width="500"><a target="_blank" href="../../${JPGLOCAL}"><img src="../../${JPGLOCAL}" width=480 align=right></a></td>" >>$INTROFILE
  410.         echo "                 </tr>" >>$INTROFILE
  411.         echo "         </table>" >>$INTROFILE
  412.        
  413.                
  414.         echo "</table>" >>$INTROFILE
  415.        
  416.         return        
  417. }
  418. #download ngpod
  419. downloadngpod()
  420. {
  421.         local YEAR MONTH DAY
  422.         local DIR JPGLOCAL  INTROFILE
  423.         local HTMLINK1 HTMLLINK2
  424.         local JPGTYPE JPGALPHA JPGBASENAME JPGREMOTE        
  425.         local DAY10 DAY1
  426.        
  427.         YEAR=$DYEAR
  428.         MONTH=$DMONTH
  429.         DAY=$DDAY
  430.         DIR="photography/pod"
  431.         if [ ! -d $DIR ];then
  432.                 mkdir -p $DIR;
  433.         fi
  434.     INTROFILE="${DIR}/pod20${YEAR}${MONTH}.htm"
  435.        
  436.     if [ ! -f ${INTROFILE} ];then
  437.                 create_introhead ${INTROFILE}  ${YEAR}  ${MONTH};
  438.         else
  439.                 if [ !  -z `sed -n -e 's/<\/html>//p' ${INTROFILE} ` ];then
  440.                         #the intro file has end.skip to next month
  441.                         echo "file end,skipped 20${YEAR}/${MONTH} month "
  442.                         BMONTH=`expr $BMONTH + 1`
  443.                         BDAY=0
  444.                         return
  445.                 else
  446.                         # get last <a name="day${DAY10}${DAY1}"><\/a>
  447.                         DAY10=`sed -n  '/<a name/h;${g;s/.*"day\([0-9]\)[0-9]".*/\1/p}' ${INTROFILE}`
  448.                         DAY1=`sed -n  '/<a name/h;${g;s/.*"day[0-9]\([0-9]\)".*/\1/p}' ${INTROFILE}`
  449.                         if [ ! -z "$DAY10" ];then
  450.                                 DAY10=`expr $DAY10 \* 10 `
  451.                                 DAY10=`expr $DAY10 + $DAY1 `
  452.                                 #the day has created before
  453.                                 if [ !  $DAY10 -lt $BDAY ];then
  454.                                         BDAY=$DAY10
  455.                                         echo "exist,last is 20${YEAR}/${MONTH}/${BDAY} ngpod "
  456.                                         return
  457.                                 fi
  458.                         fi
  459.                 fi
  460.         fi
  461.         HTMLINK1="${EXLINK}/cgi-bin/pod/PhotoOfTheDay.cgi?month=${MONTH}&day=${DAY}&year=${YEAR}"
  462.         getfile  ${TMP1} ${HTMLINK1}
  463.        
  464.         if [ ! -f ${TMP1} ];then
  465.                 echo "get htm fail get 20${YEAR}/${MONTH}/${DAY} ngpod "
  466.                 return
  467.         elif [ ! -s ${TMP1} ];then
  468.                 echo "zero file;fail get 20${YEAR}/${MONTH}/${DAY} ngpod"
  469.                 return
  470.         fi
  471.         # get wallpaper html description
  472.         HTMLLINK2=`s_walllink ${TMP1}`
  473.         # save as tmpfile 2
  474.         getfile ${TMP2} ${EXLINK}${HTMLLINK2}
  475.         #get $JPGNAME
  476.         sg_jpgname ${TMP2}
  477.         #some do not has wallpaper,for example
  478.         #http://photography.nationalgeographic.com/cgi-bin/pod/PhotoOfTheDay.cgi?month=07&day=11&year=01
  479.         if [ -z $JPGNAME ];then
  480.                 echo "       find 800x600 instead"
  481.                 #wallpaper link could not get jpg
  482.                 rm -f ${TMP2}
  483.                 # get jpgname from enlarge
  484.                 # get wallpaper html description
  485.                 HTMLLINK2=`s_walllink2 ${TMP1}`
  486.                 # save as tmpfile 2
  487.                 getfile ${TMP2} ${EXLINK}${HTMLLINK2}
  488.                 #get $JPGNAME
  489.                 sg_jpgname ${TMP2}
  490.         fi
  491.         # some ngpod is losing
  492.         if [  -z $JPGNAME ];then
  493.                 echo "could not find jpg; fail get 20${YEAR}/${MONTH}/${DAY}"
  494.                 return
  495.         fi
  496.         JPGBASENAME=`basename ${JPGNAME}`       
  497.         JPGALPHA=`echo ${JPGBASENAME}  | s_alpha `
  498.         DIR="image/${JPGALPHA}"
  499.         if [ ! -d $DIR ];then
  500.                 mkdir -p $DIR;
  501.         fi
  502.         JPGLOCAL="${DIR}/${JPGBASENAME}"
  503.        
  504.         JPGREMOTE="${EXLINK}${JPGNAME}"
  505.        
  506.         check_jpg $JPGLOCAL
  507.         if [ ! -f ${JPGLOCAL} ];then
  508.                         rm -f ${TMPJPG}
  509.                         getfile ${TMPJPG} ${JPGREMOTE}
  510.                         check_jpg ${TMPJPG}
  511.                         if [  -f ${TMPJPG} ];then
  512.                                 mv -f ${TMPJPG} ${JPGLOCAL}
  513.                         fi
  514.         fi
  515.        
  516.         #echo "updateintro get $YEAR $MONTH $DAY "
  517.         rm -f $TMPINTRO
  518.         update_intro ${TMPINTRO} ${TMP1} ${DAY} ${JPGLOCAL}  ${HTMLINK1}
  519.         create_introtail ${TMPINTRO} $YEAR $MONTH $DAY
  520.        
  521.         cat $TMPINTRO >> $INTROFILE
  522.         echo  "OK get 20${YEAR}/${MONTH}/${DAY} ngpod"
  523.        
  524.         return
  525. }
  526. ########################################
  527. # all begin
  528. # if $EYEAR not set,auto set variables
  529. getendday
  530. echo "This shell need wget,sed,iconv in your \$PATH variable"
  531. echo "ngpod is national geographic photo of the day"
  532. echo "This shell will download ngpod pictures and related "
  533. echo " from ${BYEAR}/${BMONTH}/${BDAY} to ${EYEAR}/${EMONTH}/${EDAY}"
  534. echo "To change begin/end day, edit this shell"
  535. read -p "Now begin download(Y/N):" JUDGE
  536. if [ ! $JUDGE = "y" ];then
  537.         if [ ! $JUDGE = "Y" ];then
  538.                 echo "This shell will exit now"
  539.                 exit
  540.         fi
  541. fi
  542. echo -n "run begin at:"
  543. date
  544. ##########################################
  545. # function run from here
  546. getday
  547. while [  0 -lt $BYEAR ]
  548. do
  549.         downloadngpod         $DYEAR $DMONTH $DDAY;
  550.         # to next day
  551.         BDAY=`expr $BDAY + 1`;
  552.         getday
  553. done
  554. echo -n "end at:"
  555. date
  556. rm -f ${TMP1}
  557. rm -f ${TMP2}
  558. rm -f ${TMP3}
  559. rm -f ${TMP4}
  560. rm -f ${TMP5}
  561. rm -f ${TMPJPG}
  562. rm -f ${TMPINTRO}
  563. # end of pod.sh
  564. ####################
复制代码
  1. #!/bin/bash
  2. #callphotos.sh
  3. #update 2008/4/5,
  4. # to get last version,visit http://eagleisyou.spaces.live.com
  5. declare TOPTOTAL TOPLINK MAXPROID
  6. declare LOGFILE=.calllog
  7. #you can call photos.sh `expr $MAXPROID + 1` processes at a time
  8. MAXPROID=9
  9. #########################
  10. # function definition area begin
  11. init_data()
  12. {
  13.         #initial links
  14.         TOPLINK[0]="http://www3.nationalgeographic.com/places/directory.html"
  15.         TOPLINK[1]="http://science.nationalgeographic.com/science/atoz.html"
  16.         TOPLINK[2]="http://animals.nationalgeographic.com/animals/a-to-z"
  17.         TOPLINK[3]="http://photography.nationalgeographic.com/photography/photographers"
  18.         TOPLINK[4]="http://photography.nationalgeographic.com/photography/photogalleries/adventure-exploration"
  19.         TOPLINK[5]="http://photography.nationalgeographic.com/photography/photogalleries/animals"
  20.         TOPLINK[6]="http://photography.nationalgeographic.com/photography/photogalleries/nature-weather"
  21.         TOPLINK[7]="http://photography.nationalgeographic.com/photography/photogalleries/people-culture"
  22.         TOPLINK[8]="http://photography.nationalgeographic.com/photography/photogalleries/science-space"
  23.         TOPLINK[9]="http://photography.nationalgeographic.com/photography/photogalleries/travel"
  24.         TOPLINK[10]="http://photography.nationalgeographic.com/photography/photogalleries/underwater"
  25.         TOPLINK[11]="http://photography.nationalgeographic.com/photography/article/patterns-nature-galleries.html"
  26.         TOPLINK[12]="http://photography.nationalgeographic.com/photography/wallpapers/people-culture"
  27.         TOPLINK[13]="http://photography.nationalgeographic.com/photography/wallpapers/travel"
  28.         TOPLINK[14]="http://photography.nationalgeographic.com/photography/wallpapers/underwater"
  29.         TOPLINK[15]="http://photography.nationalgeographic.com/photography/article/patterns-nature-wallpapers.html"
  30.         TOPLINK[16]="http://photography.nationalgeographic.com/photography/wallpapers/science-space"
  31.         TOPLINK[17]="http://photography.nationalgeographic.com/photography/wallpapers/nature-weather"
  32.         TOPLINK[18]="http://photography.nationalgeographic.com/photography/wallpapers/animals"
  33.         TOPLINK[19]="http://photography.nationalgeographic.com/photography/wallpapers/adventure-exploration"
  34.        
  35.         TOPTOTAL=${#TOPLINK[@]}
  36. }
  37. send_last()
  38. {
  39.         local LAST LASTNAME PROCOUNT COUNT
  40.         local LASTNUM
  41.         LASTNUM=`ls .process* 2>/dev/null`
  42.         if [ -z "$LASTNUM" ];then
  43.                 return
  44.         fi
  45.         # to check if need to run from last interrupt
  46.         # use RELLINK,RELNAME as temp viraible
  47.         for LASTNAME in .process* ;do
  48.                         exec 3<&0 0<$LASTNAME
  49.                         # keep last run status,$COUNT to keep useless variable
  50.                         read PROCOUNT COUNT
  51.                         exec 0<&3
  52.                        
  53.                         if [ -z "$PROCOUNT" ];then
  54.                                 rm -f $LASTNAME
  55.                                 continue
  56.                         fi
  57.                         # last run process number
  58.                         COUNT=`echo $LASTNAME | sed -n -e 's/\.process\([0-9]*\)/\1/p' `
  59.                        
  60.                         if [ $MAXPROID -lt $COUNT ];then
  61.                                 MAXPROID=$COUNT
  62.                         fi
  63.                         echo "re-run last interrput link, use process $COUNT "
  64.                         ./photos.sh ".process$COUNT" "$PROCOUNT"  "${TOPLINK[$PROCOUNT]}" $LOGFILE &
  65.                        
  66.                         # remove ${TOPLINK[$PROCOUNT]}
  67.                                 TOPLINK[$PROCOUNT]=""
  68.                                        
  69.         done
  70.         # remenber last-run finish links
  71.         if [ -f $LOGFILE ];then
  72.                         exec 3<&0 0<$LOGFILE
  73.                         # keep last run status,$COUNT to keep useless variable
  74.                         read PROCOUNT
  75.                         while [ ! -z "$PROCOUNT" ] ;do
  76.                                 #no need to do these link again
  77.                                 if [ $PROCOUNT -lt $TOPTOTAL ];then
  78.                                         TOPLINK[$PROCOUNT]=""
  79.                                 fi
  80.                                 read PROCOUNT
  81.                         done
  82.                         exec 0<&3
  83.         fi
  84. }
  85. send_parallel()
  86. {
  87.         local COUNT=0
  88.         local PROCOUNT=0
  89.         local LAST LASTNAME
  90.         local LASTNUM=0
  91.         local SLEEP=0
  92.        
  93.         send_last
  94.         PROCOUNT=0
  95.         COUNT=0
  96.         while [ true ];do
  97.                 if [ ! -f .process$COUNT ];then
  98.                         if [ -z "${TOPLINK[$PROCOUNT]}" ];then
  99.                                 PROCOUNT=`expr $PROCOUNT + 1`
  100.                                 if [ $PROCOUNT -eq $TOPTOTAL ];then
  101.                                         # send process end
  102.                                         return
  103.                                 fi
  104.                                 continue
  105.                         fi
  106.                         echo "$PROCOUNT link, use process $COUNT "
  107.                         ./photos.sh ".process$COUNT" "$PROCOUNT"  "${TOPLINK[$PROCOUNT]}"  $LOGFILE  &
  108.                         PROCOUNT=`expr $PROCOUNT + 1`
  109.                 fi
  110.                
  111.                 if [ $PROCOUNT -eq $TOPTOTAL ];then
  112.                         # send process end
  113.                         return
  114.                 fi
  115.                 if [ $COUNT -eq $MAXPROID ];then
  116.                         COUNT=0
  117.                        
  118.                         if [ "$SLEEP" -eq 0 ];then
  119.                                 echo "no more process free,sleep:"
  120.                                 sleep 60
  121.                         else
  122.                                 echo -n "$SLEEP:"
  123.                                 sleep 60
  124.                         fi
  125.                         SLEEP=`expr $SLEEP + 1`
  126.                         if [ 20 -eq $SLEEP ];then
  127.                                 echo  "$SLEEP:"
  128.                                 SLEEP=0
  129.                         fi
  130.                         continue
  131.                 fi
  132.                 COUNT=`expr $COUNT + 1`
  133.         done
  134. }
  135. wait_parallel()
  136. {
  137.         local COUNT=0
  138.         local SLEEP=0
  139.         while [ $COUNT -lt $MAXPROID ];do
  140.                 if [ -f .process$COUNT ];then
  141.                         if [ "$SLEEP" -eq 0 ];then
  142.                                 echo -n "process $COUNT still run,sleep:"
  143.                                 sleep 60
  144.                         else
  145.                                 echo -n "$SLEEP:"
  146.                                 sleep 60
  147.                         fi
  148.                         SLEEP=`expr $SLEEP + 1`
  149.                         if [ 20 -eq $SLEEP ];then
  150.                                 echo  "$SLEEP:"
  151.                                 SLEEP=0
  152.                         fi
  153.                         continue;
  154.                 fi
  155.                 COUNT=`expr $COUNT + 1`
  156.         done
  157. }
  158. if [ ! -x ./photos.sh ];then
  159.         exit
  160. fi
  161. # the script run begin
  162. init_data
  163. # show begin time
  164. echo -n "Begin at:"
  165. date
  166. # exist means last interrupt,no keep to create_links
  167. send_parallel
  168. sleep 10
  169. #wait the script to end
  170. wait_parallel
  171. #all finish,no need to keep this logfile
  172. rm -f $LOGFILE
  173. #show end time
  174. echo -n "end at:"
  175. date
  176. # end of callphotos.sh
  177. ####################
复制代码
  1. #!/bin/bash
  2. #photos.sh
  3. #update 2008/4/5,
  4. # to get last version,visit http://eagleisyou.spaces.live.com
  5. TMP1=.tmp1pro
  6. TMP2=.tmp2pro
  7. TMP3=.tmp3pro
  8. TMP4=.tmp4pro
  9. TMP5=.tmp5pro
  10. TMP6=.tmp6pro
  11. TMPJPG=.tmp7pro
  12. declare INTRO1 INTRO2 FLINK1 JPGNAME bLINK DIRLEVEL
  13. declare PROCESSNUM INTIMFILE
  14. declare CURRENTLINK
  15. ###############################################
  16. #function difinition area
  17. s_toplink()
  18. {
  19. #sed -n -e 's/.*<a href="\(.*html\).*>\(.*\)<\/a>.*/\1 \2/p' $1
  20. sed -n -e 's/.*<a href="\(.*html\)">\([^<]*\)<\/a>.*/\1 \2/p' $1
  21. }
  22. s_linkpre()
  23. {
  24. sed -n -e 's/\(http.*com\)\/.*/\1/p' $1
  25. }
  26. get_dirlevel()
  27. {
  28.         # get the number of '/' in dirname
  29.         DIRLEVEL=`echo  -n "$1" | sed   's/[^/]*[^/]//g'  | wc -c`
  30.         DIRLEVEL=`expr $DIRLEVEL + 1`
  31. }
  32. getfile()
  33. {
  34.         local TEST
  35.         #download $1 htmllink,save as file $1
  36.         wget -T 30 -O "$1" "$2" 2>/dev/null
  37.         #wget -O "$1" "$2"
  38.        
  39.         TEST=`echo "$2" |sed -n -e 's/\.jpg//p' `
  40.         #not jpg,need to iconv
  41.         if [ -z "$TEST" ];then
  42.                 iconv -f "iso8859-1" -t "utf8" -o "$1.utf8" "$1"
  43.                 rm -f $1
  44.                 mv "$1.utf8" "$1"
  45.         fi
  46. }
  47. #related link for the related
  48. sr_next()
  49. {
  50.         sed -n -e 's/.*<a href="\(.*html\)">NEXT<\/a>.*/\1/p' $1
  51. }
  52. srel_picfile()
  53. {
  54.         FLINK1=`sed -n -e 's/.*<a href="\(.*\/wallpaper\/.*html\)">.*/\1/p' $1`
  55.         #some just has enlarge
  56.         if [ -z "$FLINK1" ];then
  57.                 #echo "zero picfile"
  58.                 FLINK1=`sed -n -e 's/.*<a href="\(.*\/enlarge\/.*html\)">.*/\1/p' $1`
  59.         fi
  60.         if [ -z "$FLINK1" ];then
  61.                 FLINK1=`sed -n -e 's/.*<a href="\(.*html\)"><img src=".*enlarge_icon.*/\1/p' $1`
  62.                 #echo "icon $FLINK1"
  63.         fi
  64. }
  65. srel_who()
  66. {
  67.         INTRO2=`sed -n -e 's/<div class="photocredit">\(.*\)<\/div>/\1/p' $1`
  68.         if [ -z "$INTRO2" ];then
  69.                 INTRO2=`sed -n -e 's/<div class="credit">\(.*\)<\/div>/\1/p' $1`
  70.         fi
  71. }
  72. srel_intro()
  73. {
  74.         INTRO1=`sed -n -e '/<div class="caption"/{N;N;N;N;N;N;N;N;N;N;N;N; s/.*<div class="caption"[^<]*>\(.*\)<\/div>.*<div.*/\1/p}'   $1`
  75.         if [ -z "$INTRO1" ];then
  76.                 INTRO1=`sed -n -e '/<div class="photogallerytext"/{N;N;N;N;N;N;N;N;N;N;N;N; s/.*<div class="photogallerytext"[^<]*>\(.*\)<\/div>.*<div.*/\1/p}'   $1`
  77.         fi
  78.         if [ -z "$INTRO1" ];then
  79.                 INTRO1=`sed -n -e '/<div class="photocaption"/{N;N;N;N;N;N;N;N;N;N;N;N; s/.*<div class="photocaption"[^<]*>\(.*\)<\/div>.*<div.*/\1/p}'   $1`
  80.         fi
  81.         if [ -z "$INTRO1" ];then
  82.                 INTRO1=` sed -n -e 's/.*<div class="wmDarkGreyBodyText"[^<]*>\(.*\)<\/div>/\1/p' $1`
  83.         fi
  84. }
  85. srel_jpgname()
  86. {
  87.         JPGNAME=`sed -n -e 's/.*<a href="\(.*jpg\)">.*1280 x 1024 pixels.*/\1/p'  $1`
  88.        
  89.         if [ -z "${JPGNAME}" ] ;then
  90.                 JPGNAME=`sed -n -e 's/.*<a href="\(.*jpg\)">.*1024 x 768 pixels.*/\1/p' $1`
  91.         fi
  92.         # only has 800x600 jpg
  93.         if [ -z "${JPGNAME}" ] ;then
  94.                 JPGNAME=`sed -n -e 's/.*src="\(.*sw\.jpg\)".*/\1/p'  $1`
  95.         fi
  96.         if [ -z "${JPGNAME}" ] ;then
  97.                 JPGNAME=`sed -n -e 's/.*src="\(.*800.*jpg\)".*/\1/p'  $1`
  98.         fi
  99.         if [ -z "${JPGNAME}" ] ;then
  100.                 JPGNAME=`sed -n -e 's/.*src="\(.*photo_lg.*jpg\)".*/\1/p'  $1`
  101.         fi
  102.         if [ -z "${JPGNAME}" ] ;then
  103.                 JPGNAME=`sed -n -e 's/.*src="\(.*ga\.jpg\)".*/\1/p'  $1`
  104.         fi
  105. }
  106. s_alpha()
  107. {       
  108.         # read first alpha of jpgname
  109.         #sed -n -e 's/.*\/\([a-zA-Z]\).*jpg/\1/p'  $1
  110.         sed -n -e 's/\(^.\).*jpg/\1/p'  $1
  111. }
  112. s_relateddir1()
  113. {       
  114.         # get relateddir
  115.         sed -n -e 's/.*com\/\(.*\)\/.*\.html/\1/p' $1
  116. }
  117. s_relateddir2()
  118. {       
  119.         # get relateddir
  120.         sed -n -e 's/\/\(.*\)\/.*\.html/\1/p' $1
  121. }
  122. s_relatedlink()
  123. {
  124.         sed -n -e '/<h3>/{N;N;N;N;N;N;s/.*<a href="\(.*html\).*>\(.*\)<\/a>.*/\1 \2/p}' $1
  125. }
  126. s_relatedlink2()
  127. {
  128.         sed -n -e '/<div class="WhatsHotTitle/{s/.*<a href="\(.*html\).*>\(.*\)<\/a>.*/\1 \2/p}' $1
  129. }
  130. s_reltype()
  131. {       
  132.         sed -n -e 's/\([a-zA-Z]*\)\/.*/\1/p'  $1
  133. }
  134. check_jpg()
  135. {
  136.         local TEST
  137.         local SIZE
  138.         if [ ! -f $1 ];then
  139.                 #file not exist,do not need to check
  140.                 return
  141.         fi
  142.         # if a jpeg filesize is less than 6KByte,
  143.         # delete it
  144.         SIZE=`wc -c $1 | awk '{print $1}'`
  145.         if [  $SIZE -lt 6000 ];then
  146.                 rm -f $1
  147.                 return
  148.         fi
  149.         TEST=`file $1 `
  150.     # if the jpg is not cracked,TEST will be zero
  151.         TEST=`echo "$TEST" |sed -n -e 's/JPEG//p' `
  152.         if [ -z "$TEST" ];then
  153.                         rm -f $1
  154.         fi
  155. }
  156. judge_type()
  157. {
  158.         bLINK=0
  159.         if [ -z $1 ];then
  160.                 return
  161.         fi
  162.         if [ "animals" == "$1" ];then
  163.                 bLINK=1
  164.         elif [ "photography" == "$1" ];then
  165.                 bLINK=2
  166.         elif [ "science" == "$1" ];then
  167.                 bLINK=3
  168.         elif [ "places" == "$1" ];then
  169.                 bLINK=4
  170.         elif [ "history" == "$1" ];then
  171.                 bLINK=5
  172.         fi
  173. }
  174. create_head()
  175. {
  176.         local FNAME TITLE LINK
  177.         FNAME=$1
  178.         TITLE=$2
  179.         LINK=$3
  180.                 echo "<html><head>" >> ${FNAME}
  181.                 #echo "<meta http-equiv=Content-Type content="text/html; charset=iso8859-1">" >>  ${FNAME}
  182.                 echo "<meta http-equiv=Content-Type content="text/html; charset=utf8">" >>  ${FNAME}
  183.                 echo "<title>${TIILE}</title></head>" >> ${FNAME}
  184.                
  185.                 echo "<body bgcolor="gray">" >>$FNAME
  186.                 echo "<table border="0" width="90%">" >>$FNAME
  187.                 echo "<tr><td align="center">" >>$FNAME
  188.                 echo "<h1><a target="_blank" href="${LINK}">${TITLE}</a></h1>" >>$FNAME
  189.                 echo "</td></tr>" >>$FNAME
  190.                     echo "</table>" >>$FNAME
  191. }
  192. create_single()
  193. {
  194.         local FNAME LINKPRE NUM REALNAME
  195.         local HTMLINK HTMNAME
  196.         local JPGLOCAL JPGALPHA JPGBASENAME JPGREMOTE
  197.         local COLOR
  198.         local DIR
  199.         FNAME="$1"
  200.         LINKPRE="$2"
  201.         NUM="$3"
  202.         REALNAME="$4"
  203.         HTMLINK="$5"
  204.        
  205.         HTMNAME=$6
  206.        
  207.         if [ -z "$7" ];then
  208.                 color=888888
  209.         else
  210.                 color=FF0000
  211.         fi       
  212.                 #save to $INTRO1 $INTRO2
  213.                 srel_intro ${TMP1}
  214.                 srel_who ${TMP1}
  215.                 #now link is point to wallpaper
  216.                 srel_picfile ${TMP1}
  217.                 # $FLINK1 may be null; that means no wallpaper pic,only small pic
  218.                 if [ ! -z "${FLINK1}" ];then
  219.                         rm -f        ${TMP1}
  220.                         getfile  ${TMP1} ${LINKPRE}${FLINK1}
  221.                         if [ -z "$INTRO1" ];then
  222.                                 #save to $INTRO1 $INTRO2
  223.                                 srel_intro ${TMP1}
  224.                                 srel_who ${TMP1}
  225.                         fi
  226.                        
  227.                         # try to get wallpaper
  228.                         # use FLINK1 to store temp result
  229.                         FLINK1=`echo "$FLINK1" | sed -n -e 's/wallpaper//p'`
  230.                         if [ -z "$FLINK1" ];then
  231.                                 FLINK1=`sed -n -e 's/.*<a href="\(.*\/wallpaper\/.*html\)">.*/\1/p' ${TMP1}`
  232.                                 if [ ! -z "${FLINK1}" ];then
  233.                                         rm -f        ${TMP1}
  234.                                         getfile  ${TMP1} ${LINKPRE}${FLINK1}
  235.                                 fi       
  236.                         fi
  237.        
  238.                 fi
  239.                 # save to $JPGNAME
  240.                 srel_jpgname ${TMP1}
  241.                
  242.                 # there make be no pic,only reference link
  243.                 # for examples,http://photography.nationalgeographic.com/photography/photographers/photography-timeline.html
  244.                 if [ -z "${JPGNAME}"  ];then
  245.                         echo "<hr><br>" >> $FNAME
  246.                         if [ ! -z "${INTRO1}" ];then
  247.                                 echo "<table border="0" width="100%">" >>$FNAME
  248.                                 echo "                 <tr><td align="right" width="50%">" >>$FNAME
  249.                                 echo "                                 <tr><td>${INTRO1}<br></td></tr>" >>$FNAME
  250.                                 echo "                                 <tr><td>${INTRO2}</td></tr>" >>$FNAME
  251.                                 echo "                 </tr>" >>$FNAME
  252.                                 echo "</table>" >>$FNAME
  253.                         fi       
  254.                        
  255.                         return
  256.                 fi
  257.                 if [ ! -z "${JPGNAME}" ];then
  258.                         JPGBASENAME=`basename "${JPGNAME}"`       
  259.                         JPGALPHA=`echo ${JPGBASENAME}  | s_alpha `
  260.                         DIR="image/${JPGALPHA}"
  261.                         if [ ! -d $DIR ];then
  262.                                 mkdir -p $DIR;
  263.                         fi
  264.                 JPGLOCAL="${DIR}/${JPGBASENAME}"
  265.        
  266.                 JPGREMOTE="${LINKPRE}${JPGNAME}"
  267.                 check_jpg $JPGLOCAL
  268.                 if [ ! -f ${JPGLOCAL} ];then
  269.                         rm -f ${TMPJPG}
  270.                         getfile ${TMPJPG} ${JPGREMOTE}
  271.                         check_jpg ${TMPJPG}
  272.                         if [  -f ${TMPJPG} ];then
  273.                                 mv -f ${TMPJPG} ${JPGLOCAL}
  274.                         fi
  275.                 fi
  276.                        
  277.                 echo "        <table border="0"  width="100%" bgcolor="\#${COLOR}"><tr>" >>$FNAME
  278.                 echo "                <td align="center"><a href="${HTMLINK}">${HTMNAME}</a></td>" >>$FNAME
  279.                 echo "        </tr></table>" >>$FNAME
  280.                 echo "<table border="0" width="100%">" >>$FNAME
  281.                 echo "                 <tr><td align="right" width="50%">" >>$FNAME
  282.                 echo "                        <table border="0" width="100%">" >>$FNAME
  283.                 echo "                                 <tr><td><br>${INTRO1}<br></td></tr>" >>$FNAME
  284.                 if [ ! -z "${INTRO2}" ];then
  285.                         echo "                                 <tr><td><hr>${INTRO2}</td></tr>" >>$FNAME
  286.                 fi       
  287.                 echo "                         </table></td>" >>$FNAME
  288.                 # dirlevel must be 2 or 3
  289.                 if [ 2 -eq $DIRLEVEL ];then
  290.                         echo "                         <td align="center" width="500"><a target="_blank" href="../../${JPGLOCAL}"><img src="../../${JPGLOCAL}" width=480 align=right></a></td>" >>$FNAME
  291.                 else
  292.                         echo "                         <td align="center" width="500"><a target="_blank" href="../../../${JPGLOCAL}"><img src="../../../${JPGLOCAL}" width=480 align=right></a></td>" >>$FNAME
  293.                 fi
  294.                 echo "                 </tr>" >>$FNAME
  295.                 echo "</table>" >>$FNAME
  296.        
  297.                 fi # end of if [ ! -z ${JPGNAME} ]
  298. }
  299. get_relrel()
  300. {
  301.         local FNAME  NUM LPRE TYPE TEST
  302.         local RELNAME RELLINK RELDIR  RELLOCAL
  303.         local ARRAYLINK ARRAYDIR ARRAYNAME TOTAL
  304.         local COUNT
  305.         FNAME=$1
  306.         NUM=$2
  307.         TOTAL=0
  308.        
  309.                         s_relatedlink $TMP3 > $TMP5
  310.                         if [ ! -s $TMP5 ];then
  311.                                 s_relatedlink2 $TMP3 >$TMP5
  312.                         fi
  313.                         echo "<br><hr>" >>$FNAME
  314.                         exec 4<&0 0< "$TMP5"
  315.                         while read RELLINK RELNAME ;do
  316.                                 TEST=`echo $RELLINK | sed -n -e 's/index\.html//p'`
  317.                                 if [ ! -z "$TEST" ];then
  318.                                         continue
  319.                                 fi
  320.                                 TEST=`echo $RELLINK |sed -n -e 's/screensaver//p' `
  321.                                 if [ ! -z "$TEST" ];then
  322.                                         continue
  323.                                 fi
  324.                                 TEST=`echo $RELLINK |sed -n -e 's/photo-of-the-day//p' `
  325.                                 if [ ! -z "$TEST" ];then
  326.                                         continue
  327.                                 fi
  328.                                 RELDIR=`echo $RELLINK | s_relateddir1`
  329.                                 if [ -z "$RELDIR" ];then
  330.                                         RELDIR=`echo $RELLINK | s_relateddir2`
  331.                                 fi
  332.                                 TYPE=`echo ${RELDIR} | s_reltype `
  333.                                 judge_type $TYPE
  334.                                 if [ 0 -eq $bLINK ];then
  335.                                         continue
  336.                                 fi
  337.                                
  338.                                 RELLOCAL=`basename $RELLINK`
  339.                                
  340.                                 LPRE=`echo $RELLINK | s_linkpre `
  341.                                 if [ -z "$LINKPRE" ];then
  342.                                         if [ $bLINK == 1 ];then
  343.                                                 RELLINK="http://animals.nationalgeographic.com${RELLINK}"
  344.                                         elif [ $bLINK == 2 ];then
  345.                                                 RELLINK="http://photography.nationalgeographic.com${RELLINK}"
  346.                                         elif [ $bLINK == 3 ];then
  347.                                                 RELLINK="http://science.nationalgeographic.com${RELLINK}"
  348.                                         else
  349.                                                 RELLINK="http://www3.nationalgeographic.com${RELLINK}"
  350.                                                 fi
  351.                                 fi
  352.                                 # dirlevel must be 2 or 3
  353.                                 if [ 2 -eq $DIRLEVEL ];then
  354.                                         echo "<br><a href="../../${RELDIR}/${RELLOCAL}">${RELNAME}</a>" >>$FNAME
  355.                                 else
  356.                                         echo "<br><a href="../../../${RELDIR}/${RELLOCAL}">${RELNAME}</a>" >>$FNAME
  357.                                 fi
  358.                                 ARRAYLINK[TOTAL]=${RELLINK}
  359.                                 ARRAYDIR[TOTAL]=${RELDIR}
  360.                                 ARRAYNAME[TOTAL]="${RELNAME}"  # may has space
  361.                                 TOTAL=`expr $TOTAL + 1`
  362.                         done
  363.                           exec 0<&4
  364.                
  365.                         rm -f $TMP5
  366.                         #create html file end
  367.                         echo "<br></body></html>" >>$FNAME
  368.                         # use $COUNT to store temp result
  369.                         COUNT=`sed -n -e 's/<\/html>//p' ${3} `
  370.                         if [ !  -z "$COUNT"  ];then
  371.                                 # file exist and finish
  372.                                 return
  373.                         fi
  374.                         # create file
  375.                         cat $FNAME > $3
  376.                         COUNT=0
  377.                         if [  0 -lt $NUM ];then
  378.                                 while [ $COUNT -lt $TOTAL ] ;do
  379.                                         update_rel  "${ARRAYLINK[$COUNT]}" "${ARRAYDIR[$COUNT]}"  "${ARRAYNAME[$COUNT]}" $NUM
  380.                                         COUNT=`expr $COUNT + 1`
  381.                                 done
  382.                         fi
  383. }
  384. update_rel()
  385. {
  386.         local FNAME NAME REALNAME
  387.         local DIR LINK LINKPRE LPRE
  388.         local TEST T T1 T2 DIR2
  389.         local NUM  TYPE TITLE
  390.         local CLUSTER HTMNAME
  391.         local CTYPE CUR C1 C2
  392.         if [  $# -ne  4 ];then
  393.                 return
  394.         fi
  395.         NUM=$4
  396.         if [ $NUM -lt 1 ];then
  397.                 return
  398.         fi
  399.        
  400.         if [ -z $2 ];then
  401.                 return
  402.         fi
  403.        
  404.         if [ 9 -lt $NUM ];then
  405.                 NUM=9
  406.         fi
  407.         NAME=`basename $1`
  408.         DIR=$2
  409.         TITLE=$3
  410.         get_dirlevel $DIR
  411.         if [ ! -d "${DIR}" ];then
  412.                 mkdir -p ${DIR}
  413.         fi
  414.         FNAME="${DIR}/${NAME}"
  415.        
  416.         NUM=`expr $NUM - 1 `
  417.         LINKPRE=`echo $1 | s_linkpre `
  418.         if [ -z "$LINKPRE" ];then
  419.                 judge_type `echo ${DIR} | s_reltype `
  420.                 if [ $bLINK == 1 ];then
  421.                         LINKPRE="http://animals.nationalgeographic.com"
  422.                 elif [ $bLINK == 2 ];then
  423.                         LINKPRE="http://photography.nationalgeographic.com"
  424.                 elif [ $bLINK == 3 ];then
  425.                         LINKPRE="http://science.nationalgeographic.com"
  426.                 else
  427.                         LINKPRE="http://www3.nationalgeographic.com"
  428.                         fi
  429.                 LINK=${LINKPRE}${1}
  430.         else
  431.                 LINK=$1
  432.         fi
  433.         if [ -f $FNAME   ];then
  434.                
  435.                 #use REALNAME to store temp resule
  436.                 REALNAME=`sed -n -e 's/<\/html>//p' $FNAME`
  437.                 if [ ! -z "$REALNAME" ];then
  438.                         # last-run finish parsing $FNAME,
  439.                         # so return
  440.                         return
  441.                 fi
  442.                 # $FNAME should be empty
  443.                 # means last-run is interrupt
  444.                 # continue to parse
  445.         else
  446.                 touch $FNAME
  447.         fi
  448.        
  449.         CLUSTER=`echo "$LINK" | sed -n -e 's/.*\/\([^.]*\)\.html/\1/p' `
  450.         C1=0
  451.         CTYPE=`echo "$DIR" | sed -n -e 's/.*\/\([^/]*\)/\1/p' `
  452.        
  453.         REALNAME=$FNAME
  454.         #first write it to tmp introfile
  455.         FNAME=$TMP6
  456.         rm -f $TMP6
  457.         getfile  ${TMP1} ${LINK}
  458.                
  459.         #save tmp1 to tmp3,for get_relrel() use
  460.         cp -f ${TMP1} ${TMP3}
  461.                
  462.         HTMNAME=`echo $LINK | sed -n -e 's/.*\/\([^.]*\)\.html/\1/p' `
  463.         create_head ${FNAME} ${HTMNAME} ${LINK}
  464.        
  465.         TEST=`sed  -n -e 's/<a href="\([^>]*\.html\)"[^>]*><img[^>]*><\/a>/\1 /gp' $TMP1 `
  466.        
  467.                
  468.         T=0
  469.         while [ ! -z "TEST" ];do
  470.                 T1=`echo $TEST | sed -n -e 's/\([^ ]*\) \(.*\)/\1/p' `
  471.                 T2=`echo $TEST | sed -n -e 's/\([^ ]*\) \(.*\)/\2/p' `
  472.                 TEST=$T2
  473.                 if [ -z "$T1" ];then
  474.                         break
  475.                 fi
  476.                 DIR2=`echo $T1 | sed -n -e 's/.*\/\([^/]*\)\/[^.]*\.html/\1/p' `
  477.                 HTMNAME=`echo $T1 | sed -n -e 's/.*\/\([^.]*\)\.html/\1/p' `
  478.                 #save related htm of current pic
  479.                 if [ "$DIR2" == "$CTYPE" ];then
  480.                         T1=`basename $T1`
  481.                         CUR[$C1]="${LINKPRE}/${DIR}/${T1}"
  482.                         C1=`expr $C1 + 1`
  483.                 fi
  484.                 #get related pic of current html
  485.                 if [ "$DIR2" == "$CLUSTER" ];then
  486.                         T=`expr $T + 1`
  487.                         if [ 1 -eq $T ];then
  488.                                 #ingore the first piclink,cause it direct same with current html
  489.                                 # for example, http://photography.nationalgeographic.com/photography/photos/digital-photography-tips.html
  490.                                 #get pic of current html ,cuase the first piclink mayby empty
  491.                                 create_single ${FNAME} ${LINKPRE} ${NUM} ${REALNAME} ${LINK} ${HTMNAME}
  492.                                 continue
  493.                         fi
  494.                         # related pic link may appear in current html but empty
  495.                         # for example, http://animals.nationalgeographic.com/animals/photos/monkeys.html
  496.                         # has 11 pic link,but link0 link1 could not get from website
  497.                        
  498.                         LPRE=`echo $T1 | s_linkpre `
  499.                         if [ -z "$LPRE" ];then
  500.                                 getfile  ${TMP1} ${LINKPRE}${T1}
  501.                                 create_single "${FNAME}" "${LINKPRE}" "${NUM}" "${HTMNAME}" "${LINKPRE}${T1}" ${HTMNAME}
  502.                         else
  503.                                 getfile  ${TMP1} $T1
  504.                                 create_single "${FNAME}" "${LINKPRE}" "${NUM}" "${REALNAME}" "${T1}" "${HTMNAME}"
  505.                         fi
  506.                 fi
  507.         done
  508.         if [ 0 -eq "$T" ];then
  509.                 cp -f ${TMP3} ${TMP1}
  510.                 #get pic of current html
  511.                 HTMNAME=`echo $LINK | sed -n -e 's/.*\/\([^.]*\)\.html/\1/p' `
  512.                 create_single ${FNAME} ${LINKPRE} ${NUM} ${REALNAME} ${LINK} ${HTMNAME}
  513.         fi
  514.        
  515.         C2=0       
  516.         while [ "$C2" -lt "$C1" ];do
  517.                 HTMNAME=`echo ${CUR[$C2]} | sed -n -e 's/.*\/\([^.]*\)\.html/\1/p' `
  518.                 getfile  ${TMP1} "${CUR[$C2]}"
  519.                 create_single "${FNAME}" "${LINKPRE}" "${NUM}" "${REALNAME}" "${CUR[$C2]}" "${HTMNAME}" 1
  520.                 C2=`expr $C2 + 1`
  521.         done
  522.         # get related links of current html
  523.         get_relrel $FNAME   $NUM $REALNAME
  524.                        
  525. }
  526. parse_toplink()
  527. {
  528.         local LPRE RELLINK RELNAME RELDIR EXLINK
  529.         local TEST
  530.         local COUNT=0 TMPCOUNT=0
  531.         local LINKS NAMES DIRS
  532.         local LINKSTOTAL=0
  533.         getfile $TMP1 "$1"
  534.         s_toplink $TMP1 >"$TMP5"
  535.        
  536.         EXLINK=`echo $1 |s_linkpre  `
  537.         exec 3<&0 0<$TMP5
  538.         while read RELLINK RELNAME; do
  539.                 TEST=`echo $RELLINK | sed -n -e 's/index\.html//p'`
  540.                 if [ ! -z "$TEST" ];then
  541.                         continue
  542.                 fi
  543.                 TEST=`echo $RELLINK |sed -n -e 's/screensaver//p' `
  544.                 if [ ! -z "$TEST" ];then
  545.                         continue
  546.                 fi
  547.                 TEST=`echo $RELLINK |sed -n -e 's/photo-of-the-day//p' `
  548.                 if [ ! -z "$TEST" ];then
  549.                         continue
  550.                 fi
  551.                 RELDIR=`echo $RELLINK | s_relateddir1`
  552.                 if [ -z "$RELDIR" ];then
  553.                         RELDIR=`echo $RELLINK | s_relateddir2`
  554.                 fi
  555.                 TYPE=`echo ${RELDIR} | s_reltype `
  556.                 judge_type $TYPE
  557.                 if [ 0 -eq $bLINK ];then
  558.                         continue
  559.                 fi
  560.                 LPRE=`echo $RELLINK | s_linkpre `
  561.                 if [ -z "$LPRE" ];then
  562.                         RELLINK=${EXLINK}${RELLINK}
  563.                 fi
  564.                 LINKS[$LINKSTOTAL]=$RELLINK
  565.                 DIRS[$LINKSTOTAL]=$RELDIR
  566.                 NAMES[$LINKSTOTAL]=$RELNAME
  567.                 LINKSTOTAL=`expr $LINKSTOTAL + 1`
  568.         done
  569.         exec 0<&3
  570.         exec 3<&0 0<$INTIMFILE
  571.         read TMPCOUNT COUNT
  572.         exec 0<&3
  573.         if [ -z "$COUNT" ];then
  574.                 COUNT=0
  575.         fi
  576.        
  577.         while [ $COUNT -lt $LINKSTOTAL ];do
  578.                 echo "$PROCESSNUM $COUNT" >$INTIMFILE
  579.                 update_rel  "${LINKS[$COUNT]}" "${DIRS[$COUNT]}"  "${NAMES[$COUNT]}" 6
  580.                 COUNT=`expr $COUNT + 1`
  581.         done
  582. }
  583. ##################################################
  584. # the script run from here
  585. if [  $# -ne  4 ];then
  586.         echo "this shell should be call by ngpod.sh"
  587.         echo "do not directly run this shell"
  588.         exit
  589. fi
  590. INTIMFILE=$1
  591. touch $INTIMFILE
  592. PROCESSNUM=$2
  593. #for each process,the tmp files should be differ
  594. TMP1=${TMP1}$2
  595. TMP2=${TMP2}$2
  596. TMP3=${TMP3}$2
  597. TMP4=${TMP4}$2
  598. TMP5=${TMP5}$2
  599. TMP6=${TMP6}$2
  600. TMPJPG=${TMPJPG}$2
  601. parse_toplink "$3"
  602. # need to delete tmpfiles
  603. rm -f $TMP1 $TMP2 $TMP3 $TMP4 $TMP5
  604. rm -f $TMP6 $TMPJPG
  605. # so callphotos.sh can know these script finish
  606. rm -f $INTIMFILE
  607. # write to logfile,to let callphotos.sh know it finish  
  608. echo $PROCESSNUM >> $4
  609. # end of photos.sh
  610. ####################
复制代码
发表于 2008-4-6 13:27:24 | 显示全部楼层
感谢分享。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表