podcast-to-youtube 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 115e31e02b8cb4d5227184c68ae3ff382a87f504
4
- data.tar.gz: 68258b13e753a549584ecab9f3a543d09ce8ce1e
3
+ metadata.gz: 57b82537f13f35c6432a322663f7360e910f9157
4
+ data.tar.gz: 082524dcc9f62e39f7ff2ff2d1c9cd97ffca0e9e
5
5
  SHA512:
6
- metadata.gz: f90c3477a7415663adb7789ac8dd4b020944d123887be3fc42b7313b3361a8d67ce4f14e6451afa8c09c5a54ade0f0ed9037195fac746d326b070f7d4b3b44d8
7
- data.tar.gz: b95b9e63d81b0247c34201bb41fc220a88229b33d31479524dfae82b7d5329d35531757d305a2d41457c6b28aaf6c50a3bf1a191429b0f2bf30409418d0f19a1
6
+ metadata.gz: 29c53c0dd2944e10e94c9fea6b3031fa7e90bd6e4545fd43a05256a07707e04438c4fc7070f37bafeb76f873cacda22bf5ee47655176bd6eacf7b7a63075c0f2
7
+ data.tar.gz: efb9857a5df38a23b5f7ea228909731a12bbe9af4885ec0bce6328f1f1dc92cfb4a5d7bd9e7358b8f95668851954f9c89cb67f0071f63853ab40136febfb3c71
@@ -9,34 +9,36 @@ require 'optparse'
9
9
  options = {}
10
10
 
11
11
  opt_parser = OptionParser.new do |opt|
12
- opt.banner = "Usage: podcast-to-youtube COMMAND [OPTIONS]"
13
- opt.separator ""
14
- opt.separator "Commands"
15
- opt.separator " upload: upload an existing podcast feed to youtube"
16
- opt.separator ""
17
- opt.separator "Options"
18
-
19
- opt.on("-f","--feedurl URL","podcast feed url") do |feedurl|
20
- options[:feedurl] = feedurl
21
- end
22
-
23
- opt.on("-s","--clientsecretfile SECRET","path to the client_secret.json") do |clientsecretfile|
24
- options[:clientsecretfile] = clientsecretfile
25
- end
26
-
27
- opt.on("-c","--videocategoryid ID","youtube video category id for the uploaded vides") do |videocategoryid|
28
- options[:videocategoryid] = videocategoryid
29
- end
30
-
31
- opt.on("-h","--help","print this help") do
32
- puts opt_parser
33
- end
12
+ opt.banner = "Usage: podcast-to-youtube COMMAND [OPTIONS]"
13
+ opt.separator ""
14
+ opt.separator "Commands"
15
+ opt.separator " upload: upload an existing podcast feed to youtube"
16
+ opt.separator ""
17
+ opt.separator "Options"
18
+
19
+ opt.on("-f","--feedurl URL","podcast feed url") do |feedurl|
20
+ options[:feedurl] = feedurl
21
+ end
22
+
23
+ opt.on("-s","--clientsecretfile SECRET","path to the client_secret.json") do |clientsecretfile|
24
+ options[:clientsecretfile] = clientsecretfile
25
+ end
26
+
27
+ opt.on("-c","--videocategoryid ID","youtube video category id for the uploaded vides") do |videocategoryid|
28
+ options[:videocategoryid] = videocategoryid
29
+ end
30
+
31
+ opt.on("-h","--help","print this help") do
32
+ puts opt_parser
33
+ end
34
34
  end
35
35
 
36
36
  opt_parser.parse!
37
37
 
38
38
  if ARGV[0] == "upload"
39
- PodcastUploader.upload(options[:feedurl], options[:clientsecretfile], options[:videocategoryid])
39
+ uploader = PodcastUploader.new
40
+ uploader.authenticate_youtube(options[:clientsecretfile])
41
+ uploader.upload(options[:feedurl], options[:videocategoryid])
40
42
  else
41
- puts opt_parser
43
+ puts opt_parser
42
44
  end
@@ -7,28 +7,32 @@ require 'rubygems'
7
7
  require 'json'
8
8
 
9
9
  class PodcastUploader
10
- def self.upload(podcast_feed_url, client_secret_file_path = 'client_secret.json', video_category_id = '28')
11
-
12
- if File.file?(client_secret_file_path)
13
- client_secret = JSON.parse(File.read(client_secret_file_path))
14
- else
15
- raise "Please provide client_secret.json. This is required for the Youtube API authentication. More information can be found in the Readme."
16
- end
17
10
 
18
- puts "parsing feed"
19
- feed = Feedjira::Feed.fetch_and_parse podcast_feed_url
11
+ @client_secret
12
+ @client_secret_file_path
13
+ @account
14
+
15
+ def authenticate_youtube(client_secret_file_path = 'client_secret.json')
16
+ load_configuration client_secret_file_path
20
17
 
21
18
  puts "connecting to youtube account"
22
19
  Yt.configure do |config|
23
- config.client_id = client_secret['installed']['client_id']
24
- config.client_secret = client_secret['installed']['client_secret']
20
+ config.client_id = @client_secret['installed']['client_id']
21
+ config.client_secret = @client_secret['installed']['client_secret']
22
+ end
23
+ # check for refresh token in config file
24
+ if !@client_secret['installed']['refresh_token'].nil?
25
+ puts "using refresh token"
26
+ authenticate_youtube_by_refresh_token
27
+ else
28
+ # otherwise authenticate with oauth2
29
+ authenticate_youtube_by_access_token
30
+ save_configuration
25
31
  end
26
- redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' # special redirect uri to make the user copy the auth_code to the application
27
- puts "open this url in a browser"
28
- puts Yt::Account.new(scopes: ['youtube'], redirect_uri: redirect_uri).authentication_url
29
- puts "paste the authentication code here and press enter"
30
- auth_code = gets.chomp
31
- account = Yt::Account.new authorization_code: auth_code, redirect_uri: redirect_uri
32
+ end
33
+
34
+ def upload(podcast_feed_url, video_category_id, privacy = :private)
35
+ feed = parse_feed podcast_feed_url
32
36
 
33
37
  feed.entries.reverse_each do |entry|
34
38
 
@@ -56,17 +60,17 @@ class PodcastUploader
56
60
 
57
61
  if(convertCMD_status)
58
62
  # upload to youtube
59
- video_description = "#{entry.itunes_summary}\n\nMehr Infos und Links zur Episode: #{entry.url}\nVeröffentlicht: #{entry.published}\nEpisode herunterladen (Audio): #{entry.url}\n\nPodcast Webseite: #{feed.url}\nPodcast Abonnieren: #{feed.url}\nPodcast Author: #{feed.itunes_author}"
63
+ video_description = generate_video_description(entry, feed)
60
64
  video_title = "#{feed.title} - #{entry.title}"
61
- if account.videos.any? {|video| video.title == video_title }
65
+ if @account.videos.any? {|video| video.title == video_title }
62
66
  puts "do not upload video, as it is already online"
63
67
  else
64
68
  puts "uploading videofile to Youtube"
65
69
  # refresh authentication if expired
66
- if account.authentication.expired?
67
- account = Yt::Account.new refresh_token: account.authentication.refresh_token
70
+ if @account.authentication.expired?
71
+ authenticate_youtube_by_refresh_token
68
72
  end
69
- account.upload_video videofile, privacy_status: :private, title: video_title, description: video_description, category_id: video_category_id, tags: %w(podcast)
73
+ @account.upload_video videofile, privacy_status: privacy, title: video_title, description: video_description, category_id: video_category_id, tags: %w(podcast)
70
74
  end
71
75
  else
72
76
  raise "generating videofile #{videofile} failed"
@@ -75,6 +79,60 @@ class PodcastUploader
75
79
  raise "downloading audiofile or coverart failed"
76
80
  end
77
81
  end
78
-
79
82
  end
83
+
84
+ private
85
+
86
+ def authenticate_youtube_by_refresh_token
87
+ puts "reauthenticate youtube with refresh token"
88
+ begin
89
+ @account = Yt::Account.new refresh_token: @client_secret['installed']['refresh_token']
90
+ rescue
91
+ puts "authentication with refresh token failed"
92
+ authenticate_youtube_by_access_token
93
+ end
94
+ save_configuration
95
+ end
96
+
97
+ def authenticate_youtube_by_access_token
98
+ puts "authenticate youtube by access token"
99
+ redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' # special redirect uri to make the user copy the auth_code to the application
100
+ puts "open this url in a browser"
101
+ puts Yt::Account.new(scopes: ['youtube'], redirect_uri: redirect_uri).authentication_url
102
+ puts "paste the authentication code here and press enter"
103
+ auth_code = STDIN.gets.chomp
104
+ @account = Yt::Account.new authorization_code: auth_code, redirect_uri: redirect_uri
105
+ end
106
+
107
+ def parse_feed(podcast_feed_url)
108
+ puts "parsing feed"
109
+ return Feedjira::Feed.fetch_and_parse podcast_feed_url
110
+ end
111
+
112
+ def load_configuration(file_path)
113
+ puts "loading configuration"
114
+ if File.file?(file_path)
115
+ @client_secret = JSON.parse(File.read(file_path))
116
+ @client_secret_file_path = file_path
117
+ else
118
+ raise "Could not find config file at #{file_path}. This is required for the Youtube API authentication. More information can be found in the Readme."
119
+ end
120
+ end
121
+
122
+ def save_configuration
123
+ puts "saving current configuration"
124
+ @client_secret['installed']['refresh_token'] = @account.authentication.refresh_token
125
+ File.write(@client_secret_file_path, @client_secret.to_json)
126
+ end
127
+
128
+ def generate_video_description(entry, feed)
129
+ video_description = "#{entry.itunes_summary}\n\n"
130
+ video_description += "Mehr Infos und Links zur Episode: #{entry.url}\n"
131
+ video_description += "Veröffentlicht: #{entry.published}\n"
132
+ video_description += "Episode herunterladen (Audio): #{entry.url}\n\n"
133
+ video_description += "Podcast Webseite: #{feed.url}\n"
134
+ video_description += "Podcast Abonnieren: #{feed.url}\n"
135
+ video_description += "Podcast Author: #{feed.itunes_author}"
136
+ return video_description
137
+ end
80
138
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: podcast-to-youtube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Trauth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-09 00:00:00.000000000 Z
11
+ date: 2015-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: feedjira
@@ -75,9 +75,9 @@ require_paths:
75
75
  - lib
76
76
  required_ruby_version: !ruby/object:Gem::Requirement
77
77
  requirements:
78
- - - "~>"
78
+ - - ">="
79
79
  - !ruby/object:Gem::Version
80
- version: '2.0'
80
+ version: 1.9.3
81
81
  required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  requirements:
83
83
  - - ">="