Ακίνδυνη Λογική

Κατά βούληση αποστολή συνδέσμων στο DownThemAll μέσω Jetpack script

Posted in Uncategorized by akindynos on 17 Αύγουστος, 2009

Τα δύο άρθρα του Stazybo Horn με οδηγίες για τη συλλογή συνδέσμων από πλήθος άρθρων ή/και σχολίων ενός μπλογκ (και πού να τα προλάβεις όλ’ αυτά; και τ’ άλλα;), αν και δεν απευθύνονται στον αρχάριο χρήστη, νομίζω πως μου επιτρέπουν μια βελτιωτική προσθήκη που μάλλον θα ξαφνιάσει ευχάριστα αρκετούς προχωρημένους χρήστες.

(αίσχος εισαγωγή, σαν διαφημιστικό tupperware)

Λοιπόν, ας μιλήσουμε σαν πραγματικοί άντρες και σαν πραγματικές γυναίκες, με τα πληκτρολόγια.

Αφού θα χρησιμοποιήσω τον μπράουζερ για τη συγκέντρωση των σελίδων που περιέχουν τους συνδέσμους, είτε σε html είτε σε xml documents, γιατί να μην παραμείνω στο ίδιο περιβάλλον για το ξάκρισμα και το κατέβασμα;

Εφόσον ο μπράουζερ είναι ο Firefox και χρησιμοποιώ μια επέκταση σαν το DownThemAll για download manager, το μόνο που λείπει είναι ένα scripting shell εντός του μπράουζερ.

Στην περιγραφή του το Jetpack ορίζεται ως

an API for allowing you to write Firefox add-ons using the web technologies you already know.

Στην πραγματικότητα Όπως το βλέπω εγώ, το Jetpack είναι ένα κέλυφος, σε πρώιμο στάδιο, που επιτρέπει στον προγραμματιστή να τρέχει δέσμες ενεργειών (script ντε) με πρόσβαση στο μεγαλύτερο μέρος του λειτουργιών του Firefox.

Δηλαδή δεν πρόκειται για το Greasemonkey με άλλο όνομα, αν και μπορεί να ειδωθεί έτσι, εφόσον το μόνο που ενδιαφέρει είναι η αλληλεπίδραση με το περιεχόμενο μιας ιστοσελίδας.

Είναι τόσο πολλά και ενδιαφέροντα τα επιπέον που μπορεί να κάνει, ώστε κάθε φορά που συναντώ ακόμα ένα jetpack script που κάτι κάνει στο HTML DOM ξεφυσάω με συγκρατημένη απελπισία.

Αρκετά όμως με το τι δεν είναι το Jetpack, επιστροφή στο πρόβλημά μας.

Με τον ένα ή τον άλλο τρόπο έχω μπροστά στα μάτια μου μια σελίδα σεβαστού μεγέθους με αναρίθμητους συνδέσμους. Για κάποιο λόγο τα φίλτρα του DownThemAll (δηλαδή regular expression match στο url) δεν είναι κατάλληλα. Ίσως επειδή τα url είναι της μορφής http://host/1.zip http://host/2.zip κλπ. και εγώ θέλω να κατεβάσω μόνο όσα ο τίτλος του post περιέχει το string «original soundtrack» ή να μην κατεβάσω όσα ο τίτλος του ποστ περιέχει το string «Britney Spears» ή (memo to self, να το δείξω σε επόμενο άρθρο) μόνο εκείνους τους συνδέσμους που δεν έχω ήδη επισκεφθεί.

Εκτός από το τελευταίο, τα υπόλοιπα σενάρια καλύπτοναι από τον xpath evaluator. Σε μεγάλα παιδιά απευθύνομαι, νομίζω δεν χρειάζεται να γίνω πιο αναλυτικός. Αλλά αν χρειάζεται, τα σχόλια γι’ αυτό υπάρχουν.

Είμαστε λοιπόν στην ευχάριστη θέση να κρατάμε στα χέρια μας έναν πίνακα με τα url που θέλουμε στείλουμε στο DownThemAll. Πως το κάνουμε προγραμματιστικά;

Απλό, ρίχνουμε μια (οκ, παραπάνω) ματιά στον κώδικα του DownThemAll. Σύμμαχοί μας το Chrome List και ο DOM Inspector. Με το πρώτο μπορούμε να δούμε εύκολα τον πηγαίο κώδικα (source code μωρέ) των περισσότερων αρχείων μιας επέκτασης, χωρίς να ψάχνουμε στο φάκελο των επεκτάσεων και στα νύχια μας ποιο μπορεί να είναι το guid της επέκτασης που μας ενδιαφέρει. Φυσικά οι πραγματικοί άντρες και οι πραγματικές γυναίκες δεν έχουν πρόβλημα να απομνημονεύσουν ένα guid, σε δυαδική μορφή. Με τον DOM Inspector μπορούμε να δούμε ποια global objects εκθέτει η επέκταση στο chrome window.

Και επιτέλους η ώρα του κώδικα.

Στην πρώτη γραμμή εισάγουμε το module Utils, δάνειο του Ubiquity στο Jetpack. Με αυτό αποκτούμε πρόσβαση στο chrome window και έτσι στα global objects του DownThemAll. Τα υπόλοιπα νομίζω δεν θέλουν εξήγηση. Βάζουμε τις γραμμές let url = και urls.push σε ένα loop και αυτό ήταν. Η πρωτη παράμετρος στη saveLinkArray ελέγχει αν θα εμφανιστεί το UI του DownThemAll. Με true δεν εμφανίζεται, με false εμφανίζεται. Σημειώστε πως σε κάθε περίπτωση τα φίλτρα του DownThemAll Θα εφαρμοστούν. Αν το αγνοείσετε, ανάλογα με το τι φίλτρα χρησιμοποιείτε, μπορεί να επιστρέψετε και να γκρινιάζετε ότι δεν δουλεύει και άλλα τέτοια δυσφημιστικά.

Components.utils.import("resource://jetpack/ubiquity-modules/utils.js");

jetpack.statusBar.append({
  html: "<span style='font-size:13.5px;'>dTa</span>",
  width: 22,
  onReady: function(widget){
    $(widget).click(function(){
      var browserWindow = Utils.currentChromeWindow;
      var dtaaddingfunctions = browserWindow.DTA_AddingFunctions;
      var dtaurl = browserWindow.DTA_URL ;

      var urls = [], images = [];

      let url = dtaaddingfunctions.ios.newURI("http://www.example.com/", null, null);
      urls.push({
                 'url': new dtaurl(url),
                 'referrer': '',
                 'description': '',
                 'ultDescription': ''
               });

      try{
        dtaaddingfunctions.saveLinkArray(true, urls, images);
      }
      catch(ex){
        console.log(ex);
      }
    });
  }
});

Αυτό ήταν, δεν έχει άλλο.

Tagged with: , ,