Переглянути джерело

Handle attachments

tags/v0.1.1
aeris 1 рік тому
джерело
коміт
b2a01cbc91

+ 0
- 1
README.md Переглянути файл

@@ -21,5 +21,4 @@ If needed, a SystemD unit example is available [here](https://git.imirhil.fr/aer
21 21
 
22 22
 # Todo
23 23
 
24
- * Handling multimedia resources
25 24
  * Publishing on [RubyGems](https://rubygems.org/)

+ 0
- 3
bin/crosspost Переглянути файл

@@ -1,3 +0,0 @@
1
-#!/usr/bin/env ruby
2
-require 'cross-post'
3
-CrossPost.post ARGV.first

+ 1
- 1
bin/twitter-register Переглянути файл

@@ -18,7 +18,7 @@ url           = request_token.authorize_url
18 18
 puts url
19 19
 Launchy.open url
20 20
 
21
-print 'PIN ? '
21
+print 'PIN ? '
22 22
 pin = gets.chomp
23 23
 
24 24
 access_token = request_token.get_access_token oauth_verifier: pin

+ 6
- 8
lib/cross-post.rb Переглянути файл

@@ -1,6 +1,12 @@
1 1
 require 'cross-post/config'
2 2
 require 'cross-post/mastodon'
3 3
 require 'cross-post/twitter'
4
+require 'open-uri'
5
+
6
+# Force OpenURI#open to return a TempFile and not a StringIO
7
+OpenURI::Buffer.send :remove_const, 'StringMax'
8
+OpenURI::Buffer.const_set 'StringMax', 0
9
+
4 10
 
5 11
 class CrossPost
6 12
 	def initialize
@@ -9,18 +15,10 @@ class CrossPost
9 15
 		@twitter  = Twitter.new @config
10 16
 	end
11 17
 
12
-	def post(text)
13
-		@mastodon.post text
14
-	end
15
-
16 18
 	def feed
17 19
 		@mastodon.feed @twitter
18 20
 	end
19 21
 
20
-	def self.post(text)
21
-		self.new.post text
22
-	end
23
-
24 22
 	def self.feed
25 23
 		self.new.feed
26 24
 	end

+ 3
- 3
lib/cross-post/config.rb Переглянути файл

@@ -3,8 +3,8 @@ require 'yaml'
3 3
 class CrossPost
4 4
 	class Config
5 5
 		def initialize
6
-			@file   = ENV.fetch 'CROSS_POST_CONFIG', File.join(Dir.home, '.cross-post.yml')
7
-			@config = YAML.load_file @file
6
+			@file = ENV.fetch 'CROSS_POST_CONFIG', File.join(Dir.home, '.cross-post.yml')
7
+			File.open(@file) { |f| @config = YAML.safe_load f }
8 8
 		end
9 9
 
10 10
 		def [](key)
@@ -18,7 +18,7 @@ class CrossPost
18 18
 
19 19
 		def []=(key, value)
20 20
 			*key, last = key.split(/\./)
21
-			current = @config
21
+			current    = @config
22 22
 			key.each do |k|
23 23
 				next_ = current[k]
24 24
 				case next_

+ 16
- 17
lib/cross-post/mastodon.rb Переглянути файл

@@ -1,21 +1,15 @@
1 1
 require 'mastodon'
2 2
 require 'sanitize'
3
-require 'awesome_print'
4 3
 
5 4
 class CrossPost
6 5
 	class Mastodon
7 6
 		def initialize(config)
8
-			url = config['mastodon.url']
9
-			token = config['mastodon.token']
10
-			user = config['mastodon.user']
7
+			url       = config['mastodon.url']
8
+			token     = config['mastodon.token']
9
+			user      = config['mastodon.user']
11 10
 			@user_url = URI.join(url, "/@#{user}").to_s
12
-			@client = ::Mastodon::REST::Client.new base_url: url, bearer_token: token
13
-			@stream = ::Mastodon::Streaming::Client.new base_url: url, bearer_token: token
14
-		end
15
-
16
-		def post(text)
17
-			post = @client.create_status text
18
-			ap post
11
+			@client   = ::Mastodon::REST::Client.new base_url: url, bearer_token: token
12
+			@stream   = ::Mastodon::Streaming::Client.new base_url: url, bearer_token: token
19 13
 		end
20 14
 
21 15
 		def feed(twitter)
@@ -23,17 +17,22 @@ class CrossPost
23 17
 				begin
24 18
 					case object
25 19
 					when ::Mastodon::Status
26
-						next if object.account.url != @user_url
27
-						next if object.visibility != 'public'
28
-						next if object.in_reply_to_id
29
-
30
-						ap object
20
+						next if reject? object
31 21
 						twitter.post object
32 22
 					end
33 23
 				rescue => e
34
-					$stderr.puts e
24
+					#$stderr.puts e
25
+					raise
35 26
 				end
36 27
 			end
37 28
 		end
29
+
30
+		private
31
+
32
+		def reject?(status)
33
+			status.account.url != @user_url or
34
+					status.visibility != 'public' or
35
+					status.in_reply_to_id
36
+		end
38 37
 	end
39 38
 end

+ 17
- 1
lib/cross-post/twitter.rb Переглянути файл

@@ -4,7 +4,7 @@ require 'twitter-text'
4 4
 class CrossPost
5 5
 	class Twitter
6 6
 		def initialize(config)
7
-			config = {
7
+			config  = {
8 8
 					consumer_key:        config['twitter.consumer.key'],
9 9
 					consumer_secret:     config['twitter.consumer.secret'],
10 10
 					access_token:        config['twitter.access.token'],
@@ -18,6 +18,22 @@ class CrossPost
18 18
 			content = Sanitize.clean status.content
19 19
 			last    = nil
20 20
 			parts   = split content
21
+
22
+			attachments = status.media_attachments
23
+			media       = attachments.collect do |f|
24
+				f = open f.url
25
+				begin
26
+					@client.upload f
27
+				ensure
28
+					f.close
29
+					f.unlink
30
+				end
31
+			end
32
+
33
+			unless media.empty?
34
+				first, *parts = parts
35
+				last          = @client.update first, media_ids: media.join(',')
36
+			end
21 37
 			parts.each { |p| last = @client.update p, in_reply_to_status: last }
22 38
 		end
23 39
 

+ 1
- 1
lib/cross-post/version.rb Переглянути файл

@@ -1,3 +1,3 @@
1 1
 class CrossPost
2
-	VERSION = '0.1.0'.freeze
2
+	VERSION = '0.1.1'.freeze
3 3
 end

Завантаження…
Відмінити
Зберегти