[问题]寻找在Linux下自动更换国家地理壁纸的脚本,并[转贴]獻上一個下載NGPOD的腳本

由本社区发起的开源项目
回复
头像
oo-BOON-too
帖子: 118
注册时间: 2008-09-18 18:21

[问题]寻找在Linux下自动更换国家地理壁纸的脚本,并[转贴]獻上一個下載NGPOD的腳本

#1

帖子 oo-BOON-too » 2008-09-29 17:55

以前见过一个在Linux下自动更换壁纸的脚本,来源是国家地理,现在却找不到了,请大家看看下面这个能用吗?
:em06

来自[蓝森林]

獻上一個下載national geographic Photo Of the Day的腳本,並請指正


代碼:
-->#!/bin/bash

#NGPOD:national geographic Photo Of the Day

#the earliest ngpod is the March 13, 2001
declare BYEAR=01 BMONTH=03 BDAY=13

#current year,month,day
declare CYEAR CMONTH CDAY

#download year,month,day
declare DYEAR DMONTH DDAY

TRUE=1
FALSE=0

LOGFILE=.ngpod.log

declare -i GOON=0
declare NEXTLINK
###############################################
#function difinition area

#get the begin day
getbeginday()
{
local JUDGE IFS lastYEAR lastMONTH lastDAY lastSTATUS

if [ -f $LOGFILE ] ;then
tail -1 $LOGFILE >.getbeginday.tmp #get the last log
else
echo "Seem that you the first time to download ngpod "
echo "Will start with the day 2001:03:13"
echo "It may take a long time to download"
echo "You may want to change begin day "
read -p "begin with 2001:03:13?(y/n):" JUDGE

if [ $JUDGE = "y" ]; then
DYEAR=$BYEAR
DMONTH=$BMONTH
DDAY=$BDAY
return $TRUE # use begin day 20010313
else
echo "you can change begin day "
echo "edit ngpod.sh:line 6"
echo "ngpod will exit now"
exit
fi
fi

IFS=" "
read lastYEAR lastMONTH lastDAY lastSTATUS <.getbeginday.tmp
rm -f .getbeginday.tmp
DYEAR=$lastYEAR
DMONTH=$lastMONTH
DDAY=$lastDAY

if [ $lastSTATUS = "OK" ];then
GOON=1;
fi
#echo "day is $DDAY"


return $TRUE
}





#get current year,month,day
gettoday()
{
local currentWEEK currentMONTH currentDAY currentTIME currentUTC currentYEAR
local IFS

IFS=" " #set spacekey as the split char
#echo "get today"

date -u >.gettoday.tmp
read currentWEEK currentMONTH currentDAY currentTIME currentUTC currentYEAR <.gettoday.tmp
IFS=$localIFS
rm -f .gettoday.tmp


CYEAR=`expr ${currentYEAR} - 2000 `
CYEAR="0${CYEAR}"
CDAY=$currentDAY
if [ `expr $CDAY` -le 9 ] ;then
CDAY=0$CDAY
fi

case $currentMONTH in
Jan) CMONTH=01 ;;
Feb) CMONTH=02 ;;
Mar) CMONTH=03 ;;
Apr) CMONTH=04 ;;
May) CMONTH=05 ;;
Jun) CMONTH=06 ;;
Jul) CMONTH=07 ;;
Aug) CMONTH=08 ;;
Sep) CMONTH=09 ;;
Oct) CMONTH=10 ;;
Nov) CMONTH=11 ;;
Dec) CMONTH=12 ;;

?) return $FALSE;;
esac

echo "current is $CYEAR $CMONTH $CDAY "

return $TRUE
}


getnextday()
{
#echo "next is $NEXTLINK"
DYEAR=` echo $NEXTLINK |sed -n -e 's/.*year=\(..\).*/\1/p' `
DMONTH=` echo $NEXTLINK |sed -n -e 's/.*month=\(..\).*/\1/p' `
DDAY=` echo $NEXTLINK |sed -n -e 's/.*day=\(..\).*/\1/p' `

#echo "next is $DYEAR $DMONTH $DDAY"
return $TRUE;
}


#if is today
ifistoday()
{

if [ $CYEAR = $DYEAR ];then
if [ $CMONTH = $DMONTH ];then
if [ $CDAY = $DDAY ] ;then
exit
fi
fi
fi
return $TRUE

}

sedget_title()
{
sed -n -e 's/.*<title>\(.*\)<\/title>.*/\1/p' $1
}
sedget_titledate()
{
sed -n -e '/pod_title\.gif/{N;N;N;N;s/.*<span class="titlesmain">\(.*\)<\/span>.*/\1/p}' $1 \
| sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
}
sedget_where()
{
sed -n -e '/text_where\.gif/{N;N;N;N;N;N;s/.*<span class="titlesbody">\(.*\)<\/span>.*/\1/p}' $1 \
| sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
}
sedget_when()
{
sed -n -e '/text_when\.gif/{N;N;N;N;N;N;s/.*<span class="titlesbody">\(.*\)<\/span>.*/\1/p}' $1 \
| sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
}
sedget_who()
{
sed -n -e '/text_photographer\.gif/{N;N;N;N;N;N;s/.*<span class="titlesbody">\(.*\)<\/span>.*/\1/p}' $1 \
| sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
}
sedget_intro()
{
sed -n -e '/<td width="5" valign=/{N;N;N;N;N;N;N;N;N;p}' $1 \
| sed -e '/<td width="5" valign=/,/<span class="titlesbody">/s/<[^>]*>//gp' \
| sed -e '/<\/span>/,/.$/s/<[^>]*>//gp' \
| sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
}
sedget_related()
{
sed -n -e '/text_related\.gif/{N;N;N;N;s/.*<span class="titlesbody">\(.*\)<\/span>.*/\1/p}' $1 \
| sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
}

sedget_nextlink()
{
sed -n -e 's/.*<a href="\(.*\)">.*newnext\.gif.*/\1/p' $1
}
sedget_jpg400()
{
sed -n -e 's/.*\/\(pod\/pictures\/normal\/.*jpg\).*/\1/p' $1
}
sedget_jpg1024()
{
sed -n -e 's/.*\/\(pod\/pictures\/lg_wallpaper\/.*jpg\).*/\1/p' $1
}

create_introhead()
{
local INTROFILE YEAR MONTH
local -i DAY COUNT TMP
if [ $# -ne 3 ];then
return $FALSE
fi

INTROFILE=$1
if [ ! -f $INTROFILE ];then
touch $INTROFILE;
else
return $FALSE
fi
echo "<meta http-equiv=Content-Type content=\"text/html; charset=utf8\">" > $INTROFILE;
echo "<!-- htm file create and translate by eagleisyou@sohu.com -->" >>$INTROFILE
YEAR=20$2
case $3 in
01) MONTH=January; DAY=31 ;;
02) MONTH=February;
if [ $YEAR == "04" ];then
DAY=29
else
DAY=28
fi
;;
03) MONTH=March ;DAY=31 ;;
04) MONTH=April ;DAY=30 ;;
05) MONTH=Jay ;DAY=31 ;;
06) MONTH=June ;DAY=30 ;;
07) MONTH=July ;DAY=31 ;;
08) MONTH=August ;DAY=31 ;;
09) MONTH=September ;DAY=30 ;;
10) MONTH=October ;DAY=31 ;;
11) MONTH=November ;DAY=30 ;;
12) MONTH=December ;DAY=31 ;;

?) return $FALSE ;;
esac
echo "<body bgcolor=\"grey\">" >>$INTROFILE
echo "<table><center><h1>" >>$INTROFILE
echo "<a target=\"_blank\" href=\"http://lava.nationalgeographic.com/pod/index.html\">" >>$INTROFILE
echo "National Geographic Photo of the Day</a></h1><br>" >>$INTROFILE
echo "<h2>${YEAR} , ${MONTH}</h2></center></table>" >>$INTROFILE

echo "<table width=\"90%\" border=1>" >>$INTROFILE
COUNT=1
TMP=0
while [ $COUNT -le $DAY ]
do
TMP=`expr $COUNT % 5`;
if [ $TMP -eq 1 ];then
echo "<tr>" >>$INTROFILE
fi

if [ $COUNT -le 9 ];then
echo "<td width=\"20%\"><a href=\"#day0$COUNT\">day 0$COUNT</a></td>" >>$INTROFILE
else
echo "<td width=\"20%\"><a href=\"#day$COUNT\">day $COUNT</a></td>" >>$INTROFILE
fi
TMP=`expr $COUNT % 5`
if [ $TMP -eq 0 ];then
echo "</tr>" >>$INTROFILE
fi
COUNT=`expr $COUNT + 1`
done
echo "</table><br><br>" >>$INTROFILE

return $TRUE
}

update_intro()
{
local INTROFILE DAY JPG1024 JPG400
local TITLE TITLEDATE WHERE WHEN WHO INTRO RELATED

if [ $# -ne 5 ];then
return false
fi

INTROFILE=$1;
DAY=$3
JPG1024=$4
JPG400=$5

TITLE=`sedget_title $2`
#for some page,title may be empty
TITLE=${TITLE:-"National Geographic Photo of the Day:"}

TITLEDATE=`sedget_titledate $2`
WHERE=`sedget_where $2`
WHEN=`sedget_when $2`
WHO=`sedget_who $2`
INTRO=`sedget_intro $2`
RELATED=`sedget_related $2`

echo "<br><a name=\"day${DAY}\"></a><br>" >> $INTROFILE
echo "<table border=\"0\" width=\"90%\">" >>$INTROFILE
echo " <table border=\"0\" width=\"100%\" bgcolor=\"\#666666\"><tr>" >>$INTROFILE
echo " <td width=\"45%\" align=\"right\" >${TITLE}</td>" >>$INTROFILE
echo " <td align=\"center\">${TITLEDATE}</td>" >>$INTROFILE
echo " </tr></table>" >>$INTROFILE
echo " <table border=\"0\" width=\"100%\">" >>$INTROFILE
echo " <tr><td align=\"right\" width=\"40%\">" >>$INTROFILE
echo " <table border=\"0\" width=\"100%\">" >>$INTROFILE
echo " <tr><td width=\"5\" >Where:</td><td>${WHERE}</td></tr>" >>$INTROFILE
echo " <tr><td width=\"5\" >When:</td><td>${WHEN}</td></tr>" >>$INTROFILE
echo " <tr><td width=\"5\" >Photographer:</td><td>${WHO}</td></tr>" >>$INTROFILE
echo " <tr><td width=\"5\" >Related link:</td><td >${RELATED}</td></tr>" >>$INTROFILE
echo " <tr><td valign=\"middle\"><br><br><a target=\"_blank\" href=\"${JPG1024}\">View 1024x768 Photo</a></td></tr>" >>$INTROFILE
echo " </table></td>" >>$INTROFILE
echo " <td align=\"center\" width=\"400\"><img src=\"${JPG400}\" border=\"0\"></td>" >>$INTROFILE
echo " </tr>" >>$INTROFILE
echo " </table>" >>$INTROFILE
echo " <tr><td><br><br>${INTRO}<br><br><br></td></tr>" >>$INTROFILE
echo "</table>" >>$INTROFILE

return $TRUE;
}

#download ngpod
downloadngpod(){
local YEAR MONTH DAY
local DIR JPG1024 JPG400 INTROFILE
local HTMLINK1 HTMLINK2 JPGLINK1024 JPGLINK400 EXLINK
local TMPFILE1 TMPFILE2

EXLINK="http://lava.nationalgeographic.com/"
TMPFILE1=.ngpod.tmp
TMPFILE2=.ngpod.tmp.utf8
if [ $# -ne 3 ];then
return false
fi

YEAR=$DYEAR
MONTH=$DMONTH
DAY=$DDAY

DIR="ngpod/20${YEAR}/${MONTH}"
mkdir -p "${DIR}_1024x768"
mkdir -p "${DIR}_400x300"
JPG1024="${MONTH}_1024x768/ngpod20${YEAR}${MONTH}${DAY}_1024x768.jpg"
JPG400="${MONTH}_400x300/ngpod20${YEAR}${MONTH}${DAY}_400x300.jpg"
INTROFILE="ngpod/20${YEAR}/ngpod20${YEAR}${MONTH}intro.htm"
if [ ! -f ${INTROFILE} ];then
create_introhead ${INTROFILE} ${YEAR} ${MONTH};
fi

touch ${LOGFILE}
echo "++++++++++++++++++++++++++++++++++++now getting $YEAR $MONTH $DAY ngpod"

HTMLINK1="${EXLINK}cgi-bin/pod/PhotoOfTheDay.cgi?month=${MONTH}&day=${DAY}&year=${YEAR}"
HTMLINK2="${EXLINK}cgi-bin/pod/wallpaper.cgi?month=${MONTH}&day=${DAY}&year=${YEAR}"

` curl -o ${TMPFILE1} "$HTMLINK1" 2>/dev/null `
if [ ! -f ${TMPFILE1} ];then
return $FALSE;
fi
#update introduce file
dos2unix ${TMPFILE1} 2>/dev/null
iconv -f "iso8859-1" -t "utf8" -o ${TMPFILE2} ${TMPFILE1} 2>/dev/null

NEXTLINK=`sedget_nextlink $TMPFILE2`
if [ $GOON -eq 1 ];then
GOON=0
return $TURE
else
echo -n " $YEAR $MONTH $DAY " >>${LOGFILE}
update_intro ${INTROFILE} ${TMPFILE2} ${DAY} ${JPG1024} ${JPG400}
fi

JPG1024="ngpod/20${YEAR}/${JPG1024}"
JPG400="ngpod/20${YEAR}/${JPG400}"

JPGLINK400=`sedget_jpg400 ${TMPFILE2}`
JPGLINK400="${EXLINK}${JPGLINK400}"
if [ ! -f ${JPG400} ];then
` curl -o ${JPG400} ${JPGLINK400} 2>/dev/null`
fi
rm -f ${TMPFILE1} ${TMPFILE2}

#get 1024x768 jpeg file link
`curl -o $TMPFILE1 ${HTMLINK2} 2>/dev/null`
dos2unix $TMPFILE1 2>/dev/null
iconv -f "iso8859-1" -t "utf8" -o ${TMPFILE2} ${TMPFILE1} 2>/dev/null
JPGLINK1024=`sedget_jpg1024 $TMPFILE2`
JPGLINK1024="${EXLINK}${JPGLINK1024}"

if [ ! -f ${JPG1024} ];then
`curl -o ${JPG1024} ${JPGLINK1024} 2>/dev/null`
fi
if [ -f ${JPG1024} ];then
echo " OK" >> ${LOGFILE}
echo "------------------------------------ get $YEAR $MONTH $DAY ngpod OK"
else
echo "???????????????????????????????????? get $YEAR $MONTH $DAY ngpod fail"
fi


#remove tmp file
rm -f ${TMPFILE1} ${TMPFILE2}


return $TRUE
}

##########################################
# function run from here
#get the first download day
getbeginday
#get today,change
gettoday

while [ $TRUE ]
do
downloadngpod $DYEAR $DMONTH $DDAY;
ifistoday
getnextday
done
-->

2005 03 30 debug OK

請教大家,怎麼讓 read從管道裡讀輸入?
現在我的程序是先生成臨時文件,在讓read從臨時文件裡讀

enjoy

頂上去,
ps:我這個程序只下載1024x768的和400x300的圖片

引用:
-->
作者: downcloud

請教大家,怎麼讓 read從管道裡讀輸入?
現在我的程序是先生成臨時文件,在讓read從臨時文件裡讀
-->
read只能從標準輸入或是文件描述符中得到輸入,管道不行。這個在man裡有描述了,我簡略看了一下兄弟的腳本,很不錯:)
下面這句:
tail -1 $LOGFILE
改成
mytmp=$(tail -1 $LOGFILE)

可以嗎?就不必用臨時文件了 :rolleyes:

這個腳本還是有些問題的,最嚴重的是生成的htm在ie裡不是想要的效果(好像不能算bug^_^)
中午我把下載完的圖片給同事看才發現,還有其它的小問題,不一一說了

過兩天改完再發一版本上來

我正想要一個下載國家地理POD的腳本,但現在Windows下,進入Linux後一定去研究一下。

引用:
-->
作者: kiron

read只能從標準輸入或是文件描述符中得到輸入,管道不行。這個在man裡有描述了,我簡略看了一下兄弟的腳本,很不錯:)
下面這句:
tail -1 $LOGFILE
改成
mytmp=$(tail -1 $LOGFILE)

可以嗎?就不必用臨時文件了 :rolleyes:
-->

under zsh, this can be done.
代碼:
-->echo "abc" | read a
echo $a
abc-->
under bash, you do something like
代碼:
-->read a < <(echo "abc")
echo $a
abc-->
上次由 oo-BOON-too 在 2008-10-09 17:46,总共编辑 1 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 寻找在Linux下自动更换国家地理壁纸的脚本,并[转贴]獻上一個下載NGPOD的腳本

#2

帖子 eexpress » 2008-09-29 18:03

大于30行的,别脚本了。
● 鸣学
头像
速腾1994
论坛版主
帖子: 17379
注册时间: 2008-11-01 20:43
系统: Arch+gnome

Re: [问题]寻找在Linux下自动更换国家地理壁纸的脚本,并[转贴]獻上一個下載NGPOD的腳本

#3

帖子 速腾1994 » 2013-05-05 17:18

代码: 全选

#!/bin/bash
#Description: 
# download national geographic photo of the day and set it as background

# wait for network connection to be established
[[ -n $1 ]] && sleep $1

resolution=$(xrandr |grep -o 'current [^,]*'|tr -d " "|sed 's:current::')

rss=`wget -q -O -
http://feeds.nationalgeographic.com/ng/photography/photo-of-the-day/`

img_url=$(echo $rss|grep -o "http://[^\"]*exposure[^\"]*"|head -1)

img_url=$(echo $img_url|sed "s:360x270:$resolution:")

img=/tmp/pod.jpg

wget -q -O $img $img_url

feh --bg-scale $img
回复