現在沒人在用光碟了啦 {% fa_inline compact-disc %}!!
Live ABC 互動英語
LiveABC 互動英語出了好多英語學習雜誌,像是 CNN 互動英語、Biz 互動英語等等, 應該是最多量的一家了吧。買雜誌的話,通常會分有附互動光碟版以及課文朗讀版, 不管哪一種都是有附 CD 光碟的。
要是真的只有雜誌的話,那要聽裡面原文發音的人等等怎麼辦呢?
只好準時收聽廣播了
通常音檔都會放在網路上讓人下載啦,只是會需要登入會員才行。
Biz
會員登入後,會有列出音檔的下載網址。 {% blockquote %} 但其實知道網址的話,光下載是不需要登入的。 {% endblockquote %}
所以只要知道下載網址的規則就好了XD。
以 Biz 互動英語2017年4月份為例,音檔是被包成三個 zip 檔案這樣放的。
$ wget http://www.liveabc.com/declaim/biz/10604/Normal/biz10604n_01_13.zip
$ wget http://www.liveabc.com/declaim/biz/10604/Normal/biz10604n_14_26.zip
$ wget http://www.liveabc.com/declaim/biz/10604/Normal/biz10604n_27_30.zip
規則看起來就是:
biz就是 Biz 互動英語10604就是民國壹零陸年的肆月份01_13.zip就是包含了01到13個音檔
上面最有趣的部份就是 01_13.zip 這個了,因為每次數字其實不太一定,
但又不想要登入去拿到明確的下載網址,該怎麼辦呢?
那就都試試看就好了,反正一個月只需要掃一次而已!
而且已知 aa_bb.zip,bb 一定大於 aa,
就寫了一個自己抓出下載網址工具了。
def biz(year=105, month=9):
if month == 0:
year -= 1
month = 12
begin = 1
end = begin
hostname = 'http://www.liveabc.com'
while True:
url = '{h}/declaim/biz/{y}{m:02}/Normal/biz{y}{m:02}n_{b:02}_{e:02}.zip'.format(h=hostname, y=year, m=month, b=begin, e=end)
r = requests.get(url)
if r.status_code == 200:
yield url
begin = end + 1
end = end + 1
if end > 36:
break
當然相同的規則也可以套用到其他本雜誌,所以比較完整的版本在這裡。
Ivy League 常春藤英語
常春藤 英語也是出了好幾本英文雜誌,像是**解析英語**這本,
個人認為是相當好的英語學習雜誌。前面說了,通常音檔都會放在網路上讓人下載,
而 常春藤 這邊是不用登入就可以聽的。
Ivy Analytical English
所以剛剛出現過的這句,在這邊依然適用喔。 {% blockquote %} 但其實知道網址的話,光下載是不需要登入的。 {% endblockquote %}
例如底下是2017年5月12日的音檔網址,可以直接下載。
http://broadcast.ivy.com.tw/broadcast/BoardData/Ivy/mp3/6351_2.mp3
規則是:
6351就是音檔的流水號,數字會遞增,但不一定只差1喔6351_2就是_2的有包含解說的音檔
那麼要怎麼知道雜誌上今天對應的音檔呢? 常春藤 通常周一到周六都會有音檔,而且是漸增的,所以可以把數字做排序的 list, 接著只要知道一個定位點,再根據跟這個定位點的集數 offset 回去找 list 中的數字就可以了。
{% mermaid %} graph LR A02 —>|差1天| A03 A02 —>|差2天| A11 A02 —>|差3天| A12 A01 -.-> A02 A02 -.-> A03 A03 -.-> A11 A11 -.-> A12 {% endmermaid %}
大概是像這樣:(我 {% fa_inline heart %} lambda)
today = date.today()
# anchor: please select a Monday as an anchor
anchor = date(2014, 12, 1)
origin = 4805
delta = today - anchor
offset = delta.days - (delta.days // 7)
for a in sys.argv:
try:
offset += int(a)
except:
pass
hostname = 'http://broadcast.ivy.com.tw'
r = requests.get(hostname + '/broadcast/BoardData/Ivy/mp3/')
root = parse(StringIO(r.text)).getroot()
mp3s = filter(lambda t: match(".*_2.mp3", t.get('href')), root.findall(".//a[@href]"))
mp3s = list(map(lambda t: (int(t.text[:-2]), hostname + t.get('href')), mp3s))
mp3s = filter(lambda m: m[0] > origin - 1, mp3s)
mp3s = sorted(mp3s, key=lambda m: m[0])
if len(mp3s) < offset + 1:
sys.exit("not found in the page")
else:
print(mp3s[offset][1])