URLを外部から開くときにブラウザーを指定して開くようにする

タイトルそのままだけど、URLを外部から開くときにブラウザーを指定できるアプリが最近公開され、これを便利に使っている。

名前を`finicky`という。
http://johnste.github.io/finicky/

アプリをダウンロードして、デフォルトブラウザーとして指定し、このアプリから指定したブラウザを開くようにするもの。ブラウザーのルータのような感じ。

これにより例えば、通知センターにFacebookの通知があったときなど、Facebookを開く時だけSafariではなく特定のアプリを指定して開くことができるようになる。

またこれを利用することで、twitterのリンクをopenだけでtweetbotで開くことができるようにできる。例えばターミナルから以下のコマンドでtweetbotが開くようになる。

```
open https://twitter.com/rebuildfm/status/657457484529991680
```

また同様にalfred経由でもtweetbotが開くようになる

![スクリーンショット 2015-10-26 02.30.59.png](https://qiita-image-store.s3.amazonaws.com/0/1095/b0202eba-303a-2c76-db27-b5cbedeafd76.png)
![スクリーンショット 2015-10-26 02.32.08.png](https://qiita-image-store.s3.amazonaws.com/0/1095/ac38053a-49ad-1fe3-ae44-8fae369c1e36.png)


設定ファイルはHOME直下に`.finicky.js`としてJSで書く事になる。finicky自体はこの設定ファイルをリロードするメニューしか存在しない。指定して開くブラウザはBundleIDがあれば、なんでも行けるようだが、URI Schemeがあればより細かく制御できる。tweetbotのshemeは下記を参考にした。
[http://tapbots.net/tweetbot3/support/url-schemes/](http://tapbots.net/tweetbot3/support/url-schemes/)

個人的には[fluidapp](http://fluidapp.com)で、Facebookやtrelloを作成して組み合わせて使っている。

```
finicky.setDefaultBrowser('com.apple.Safari')

// Open Facebook links in Fluidapp
finicky.onUrl(function(url, opts) {
  if (url.match(/^https?:\/\/www\.facebook\.com/)) {
    return {
      bundleIdentifier: 'com.fluidapp.FluidApp.Facebook'
    }
  }
});

// Open trello links in Fluidapp
finicky.onUrl(function(url, opts) {
  if (url.match(/^https?:\/\/trello\.com/)) {
    return {
      bundleIdentifier: 'com.fluidapp.FluidApp.trello'
    }
  }
});

// Always open links from Mail in Safari
finicky.onUrl(function(url, opts) {
    var sourceApplication = opts && opts.sourceBundleIdentifier
    if (sourceApplication === 'com.apple.mail') {
        return {
            bundleIdentifier: 'com.apple.Safari'
        }
    }
});

// Open Twitter links in client
finicky.onUrl(function(url, opts) {
  var matches = url.match(/^https?:\/\/twitter\.com\/.+\/status\/([0-9]+)/)
  if (matches && matches[1]) {
    var statusId = matches[1];
    return {
      url: 'tweetbot://twitter/status/' + statusId,
      bundleIdentifier: 'com.tapbots.TweetbotMac'
    }
  }
});

// Open Twitter search in client
finicky.onUrl(function(url, opts) {
  var matches = url.match(/^https?:\/\/twitter.com\/search\?(.*)/)
  if (matches && matches[1]) {
    var queryText = "";
    matches[1].split("&").forEach(function(query) {
      var params=query.split("=");
      if (params[0] == 'q') {
        queryText = params[1];
      }
    });
    return {
      url: 'tweetbot://twitter/search?query=' + queryText,
      bundleIdentifier: 'com.tapbots.TweetbotMac'
    }
  }
});

// Open Twitter mentions
finicky.onUrl(function(url, opts) {
  if (url.match(/^https?:\/\/twitter.com\/mentions/)) {
    return {
      url: 'tweetbot://twitter/mentions',
      bundleIdentifier: 'com.tapbots.TweetbotMac'
    }
  }
});

// Open Twitter message
finicky.onUrl(function(url, opts) {
  if (url.match(/^https?:\/\/twitter.com\/messages/)) {
    return {
      url: 'tweetbot://twitter/direct_messages',
      bundleIdentifier: 'com.tapbots.TweetbotMac'
    }
  }
});

// Open Twitter retweets
finicky.onUrl(function(url, opts) {
  if (url.match(/^https?:\/\/twitter.com\/retweets/)) {
    return {
      url: 'tweetbot://twitter/retweets',
      bundleIdentifier: 'com.tapbots.TweetbotMac'
    }
  }
});

// Open Twitter user in client
finicky.onUrl(function(url, opts) {
  var matches = url.match(/^https?:\/\/twitter.com\/([0-9a-zA-Z_]+)/)
  if (matches && matches[1]) {
    var screenname = matches[1]
    if (sourceApplication != 'com.apple.mail') {
      return {
        url: 'tweetbot://twitter/user_profile/' + screenname,
        bundleIdentifier: 'com.tapbots.TweetbotMac'
      }
    }
  }
});
```