Cara memuat turun siri kegemaran anda secara automatik

Dalam catatan lain, kami membincangkannya Pemuat turun Episod Torrent (TED), program yang sangat baik yang ditulis dalam Java yang membolehkan kami menambahkan siri kegemaran kami dan memuat turunnya secara automatik ketika bab-bab baru keluar.

Kaedah yang dijelaskan dalam catatan ini adalah alternatif kepada TED, yang mungkin banyak di antara anda yang mungkin berminat..

Catatan: Sebelum kita memulakan, nampaknya bijaksana untuk mengatakan bahawa ada kaedah lain untuk mencapai hasil yang sama. Salah satu cara untuk melakukannya adalah dengan menggunakan TED, tetapi ada juga beberapa klien torrent yang hadir dengan sokongan RSS (yang menjadikan semuanya lebih mudah). Juga, ada skrip lain (serupa dengan yang ditunjukkan di bawah) yang melakukan perkara yang sama (dan lebih baik lagi) ... Saya memikirkan, misalnya, FlexRSS.

Kaedahnya terdiri daripada membuat tugas berjadual yang menjalankan skrip python setiap kali. Skrip ini memuat turun torrent melalui RSS. Banyak laman web muat turun torrent membenarkan pilihan ini, yang paling popular ezRSS. Kelebihan menggunakan RSS untuk memuat turun torrents adalah membolehkan anda "melanggan" dan memuat turun torrents dari siri kegemaran anda ketika bab-bab baru muncul. Sama seperti semasa anda melanggan blog atau suapan berita.

Langkah-langkah untuk diikuti

1.- Pasang pakej python-beautifulsoup.

sudo apt-get pasang python-beautifulsoup

2.- Buka penyunting teks kegemaran anda. Salin kod berikut ke dalamnya dan simpan fail dengan nama berikut: ~ / bin / tormon.py

#! / usr / bin / env python

import urllib2, urlparse
dari urllib2 import HTTPError, URLError
dari BeautifulSoup import BeautifulSoup
mengimport anda
import opt ​​parse

__penggunaan __ = ""
tormon.py -O ~ / test / tormon -u "http: //rss.feed"
'' '

kelas Utama (objek):
    '' '
    tormon memeriksa suapan rss untuk torrent baru. Apabila menemui .torrent baru, ke
    memuat turunnya ke direktori output yang ditentukan, di mana (mungkin) pemantauan
    program torrent akan memuat turun fail yang sesuai.    
    '' '
    def parse_options (diri):
        use = 'use:% prog [options]' + __ penggunaan__
        parser = optparse.OptionParser (penggunaan = penggunaan)
        parser.add_option (
            '-O', '--output_dir', dest = 'output_dir',
            help = 'direktori di mana torrent baru disimpan',
            metavar = 'DIR')
        parser.add_option (
            '-f', '--filetype', dest = 'filetype',
            tindakan = 'tambah',
            lalai = [],
            help = 'jenis fail yang boleh diterima',
            metavar = 'JENIS')
        parser.add_option (
            '-d', '--downloaded_torrents', dest = 'download_torrents',
            lalai = os.path.expanduser ('~ / .downloaded_torrents'),
            help = 'log torrents yang sudah dimuat turun',
            metavar = 'FILE')
        parser.add_option (
            '-e', '--error_log', dest = 'error_log',
            help = 'log torrents tormon gagal dimuat turun',
            metavar = 'FILE')
        parser.add_option (
            '-b', '--batch', dest = 'batch',
            help = 'fail yang mengandungi senarai url suapan rss',
            metavar = 'FILE')
        parser.add_option (
            '-u', '--url', dest = 'url',
            tindakan = 'tambah',
            lalai = [],
            help = 'url feed rss',
            metavar = 'URL')
        parser.add_option (
            '-m', '- mark_all_downloaded', dest = 'mark_all_downloaded',
            tindakan = 'store_true',
            lalai = Salah,
            help = "tandakan semua torrents seperti yang telah dimuat turun")
        parser.add_option (
            '-M', '- match_by_filename', dest = 'match_by_filename',
            tindakan = 'store_true',
            lalai = Salah,
            help = "mengenali fail yang dimuat turun dengan nama fail, bukan URL. Memadankan dengan URL adalah lalai.")        
        (self.opt, args) = parser.parse_args ()
        jika diri.opt.batch:
            untuk baris dalam keadaan terbuka (self.opt.batch, 'r'):
                line = line.strip ()
                jika garis dan bukan garis.startswith ('#'):
                    self.opt.url.append (baris)
        jika bukan diri.opt.output_dir:
            self.opt.output_dir = os.path.expanduser ('~ / Desktop')
        jika bukan diri.opt.filetype:
            self.opt.filetype = ['. torrent'] jika tidak self.opt.error_log:
            self.opt.error_log = self.opt.downloaded_torrents + '. kesalahan'
        cuba:
            os.makedirs (self.opt.output_dir)
        kecuali OSError:
            jika tidak os.path.exists (self.opt.output_dir):
                cetak ('tormon gagal membuat direktori% s'% self.opt.output_dir)
                jalan keluar (1)
    def load_list_of_already_downloaded_torrents (diri):
        cuba:
            self.downloaded = open (self.opt.downloaded_torrents, 'r'). baca (). split ()
        kecuali IOError:
            self.downloaded = [] cuba:
            self.errors = open (self.opt.error_log, 'r'). baca (). split ()
        kecuali IOError:
            self.errors = [] def update_downloaded (self, url):
        self.downloaded.append (url)
        cuba:
            self.errors.remove (url)
        kecuali ValueError:
            lulus        
    def download_torrent (diri, url):
        cuba:
            stoking = urllib2.urlopen (url)
        kecuali (HTTPError, URLError):
            # cetak ('tormon gagal memuat turun% s'% url)
            jika url tidak dalam diri. kesalahan:
                self.errors.append (url)
        lain:
            nama fail = self.url2filename (url)
            target_file = os.path.join (self.opt.output_dir, nama fail)
            cetak ('Memuat turun% s'% target_file)
            kandungan = sock.read ()
            sock. tutup ()
            fh = terbuka (target_file, 'w')
            fh.write (kandungan)
            tutup ()
            self.update_downloaded (url)
    def url2filename (diri, url):
        kembali os.path.basename (urlparse.urlparse (url) [2])
    def has_been_downloaded (diri, url):
        jika diri.opt.match_by_filename:
            nama fail = self.url2filename (url)
            kembali (nama fail dalam [self.url2filename (link) untuk pautan dalam self.downloaded])
        lain:
            kembali (url dalam muat turun sendiri)
    def parse_rss_feed (diri):
        untuk url dalam diri.opt.url:
            cetak ('RSS feed:% s'% url)
            cuba:
                stoking = urllib2.urlopen (url)
            kecuali (HTTPError, URLError):
                cetak ('tormon gagal memuat turun% s'% url)
            lain:
                kandungan = sock.read ()
                sock. tutup ()
                sup = BeautifulSoup (kandungan)
                pautan = ([link.nextSibling untuk pautan dalam sup.findAll ('link')] +
                       [link ['href'] untuk pautan dalam sup.findAll ('a')] +
                       [pautan ['url'] untuk pautan dalam sup.findAll ('media: content')])
                untuk pautan dalam pautan:
                    jika (ada ([link.lower (). endswith (berakhir)
                             kerana berakhir dengan self.opt.filetype])
                        dan tidak diri.has_been_downloaded (pautan)):
                        jika self.opt.mark_all_download:
                            cetak (Menandai pautan% s sebagai dimuat turun)
                            self.update_downloaded (pautan)
                        lain:
                            self.download_torrent (pautan)
    def save_list_of_already_downloaded_torrents (diri):
        fh = terbuka (self.opt.downloaded_torrents, 'w')
        fh.write ('n'.join (self.downloaded))
        tutup ()
        fh = terbuka (self.opt.error_log, 'w')
        fh.write ('n'.join (self.errors))
        tutup ()
    def __init __ (diri):
        self.parse_options ()        
        self.load_list_of_already_downloaded_torrents ()
        cuba:
            self.parse_rss_feed ()
        kecuali KeyboardInterrupt:
            lulus
        akhirnya:
            self.save_list_of_already_downloaded_torrents ()
jika __nama __ == '__ main__':
    Utama ()

3.- Beri kebenaran pelaksanaan.

chmod + x ~ / bin / tormon.py

4.- Periksa bahawa semuanya berfungsi dengan baik.

tormon.py -O ~ / torrents / -u "http: //rss.feed"

Di mana mengatakan ~ / torrents /, anda harus menggantinya dengan jalan di mana anda mahu menyimpan torrents yang dimuat turun. Perlu diingat bahawa akan ada banyak fail torrent.

Di mana tertera "http: //rss.feed", anda harus menggantinya dengan URL suapan RSS siri kegemaran anda. Bagaimana untuk mendapatkannya? Sekiranya anda mahu menggunakan ezRSS, Saya pergi ke halaman utama dan menulis nama siri ini. Senarai besar akan muncul dengan hasilnya. Sekiranya anda ingin memperhalusi carian anda (tarikh penapisan, kualiti atau orang yang merobek video), anda boleh melakukannya dengan membimbing anda dengan contoh-contoh yang diterbitkan dengan jelas di halaman tersebut. Sebaik sahaja anda mendapat hasil yang anda cari, klik kanan pada pautan yang tertera Suapan RSS berasaskan carian yang muncul di sebelah ciri butang oren dari suapan RSS. Salin pautan itu dan tampalkan menggantikannya http://rss.feed contohnya.

Beberapa data tambahan yang perlu diingat:

  • Sekiranya parameter -O dihilangkan, fail .torrent akan dimuat turun ke Desktop.
  • Sekiranya anda menjalankan perintah yang sama segera, ia tidak boleh memuat turun torrent baru, melainkan torrent baru telah ditambahkan ke RSS feed.
  • Perintah ini membuat folder di mana torrents akan disimpan jika tidak ada.
  • Senarai URL torrents yang berjaya dimuat akan disimpan dalam ~ / .downloaded_torrents.
  • Untuk memantau lebih dari 1 suapan RSS, anda boleh menggunakan parameter -u. Contoh: tormon.py -u "http: //rss.feed1" -u "http: //rss.feed2"

5.- Sekiranya semuanya berfungsi dengan baik, anda boleh menambahkan skrip sebagai tugas berjadual crontab.

crontab -e

Perintah ini akan membuka penyunting teks.

Tampal kod berikut sehingga berada di awal fail:

PATH = / sbin: / bin: / usr / sbin: / usr / bin: / rumah / PENGGUNA / tong
MAILTO = PENGGUNA

Ubah PENGGUNA dengan nama pengguna anda.

Tampal kod berikut di tempat di bawah PATH =…

* / 15 * * * * tormon.py -u "http: //rss.feed"

Ini akan menjalankan skrip setiap 15 minit. Pasti, anda boleh mengubahnya sesuai dengan keperluan anda. Dalam siri televisyen, sebaiknya menjalankannya seminggu sekali. Jangan lupa untuk membaca catatan kami sebelumnya di mana kami menerangkan langkah demi langkah cara menambah tugas ke crontab.

Dijalankan setiap hari Ahad jam 10 pagi:

00 10 * * 0 tormon.py -u "http: //rss.feed"
Catatan: jangan lupa ganti parameter yang dilewatkan storm.py dengan yang sesuai dengan keperluan anda. Minimum, dalam perintah di atas, anda harus mengganti URL feed RSS.

Untuk menyelesaikannya, pastikan terdapat garis kosong di hujung fail crontab. Saya tidak tahu mengapa tetapi ia adalah keperluan crontab agar semuanya berfungsi dengan baik.

Simpan fail dan keluar dari editor teks.

Nota: sekiranya anda memasang ejen pemindahan e-mel, seperti exim4, baris MAILTO = USER akan memberitahu crontab untuk menghantar hasil pelaksanaan tormon.py kepada anda melalui e-mel.