appydave-tools 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b6d7348b11097175604d3e0dfa967ad9667a36955b825f3ada9042229d35b86
4
- data.tar.gz: 91997ead7011056d971b85e7680ee8a099dee006b944210e0766db23d2a40986
3
+ metadata.gz: b2f8626d0968a1fb7485288c9e2faec7dfab9bc1d389f7834f76748116794ad4
4
+ data.tar.gz: f750a6e6132df67ebafefce2f94435a7801efc2ce374f94448d8c8b4d51c6255
5
5
  SHA512:
6
- metadata.gz: 8c454d6b2b206b188cff7529094e9cf5b1895933083e7d712e43d55289e3d93be06b0307bb9dd66f13b4910e625e8108b88e58660df15eeb96abaa28f4e439a6
7
- data.tar.gz: 1d1c25c9cf722bea8db372b6edca5d2fa3da909d097b0401e7f12e5d66a2dbb6dc15fe001f0b42a8e484ca4866f7755cd86d1f090608960bc4b980aacd34992b
6
+ metadata.gz: 0ec7c54c22a51070b33f66fd6fad9c60977f1e75c55fdc31e858545d1a79d5d74418a054d7fa538e99c2297831b41a3c20d6465ec4a311f806b02781a1a5925d
7
+ data.tar.gz: edaa750eed5eaf3ec55fca13fbeae3c703c9cf6845730bf6c00b3dafbe30f69b53891997041f5766a2ce837c4fa039303161df7035711d1f3c1dba66ca802ab3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.9.5](https://github.com/klueless-io/appydave-tools/compare/v0.9.4...v0.9.5) (2024-06-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * implement update video command ([c46473d](https://github.com/klueless-io/appydave-tools/commit/c46473dc550e34c041418adfd52444014e094917))
7
+
8
+ ## [0.9.4](https://github.com/klueless-io/appydave-tools/compare/v0.9.3...v0.9.4) (2024-06-12)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * move youtube management data to activemodel ([12d3351](https://github.com/klueless-io/appydave-tools/commit/12d3351b2243c436d0f59e2f2822d9d82cc6ebd6))
14
+
1
15
  ## [0.9.3](https://github.com/klueless-io/appydave-tools/compare/v0.9.2...v0.9.3) (2024-06-12)
2
16
 
3
17
 
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
5
+
6
+ require 'appydave/tools'
7
+
8
+ # Process command line arguments for Prompt operations
9
+ class PromptToolsCLI
10
+ def initialize
11
+ @commands = {
12
+ 'completion' => Appydave::Tools::CliActions::PromptCompletionAction.new
13
+ }
14
+ end
15
+
16
+ def run
17
+ command, *args = ARGV
18
+ if @commands.key?(command)
19
+ @commands[command].action(args)
20
+ else
21
+ puts "Unknown command: #{command}"
22
+ print_help
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def print_help
29
+ puts 'Usage: prompt_tools.rb [command] [options]'
30
+ puts 'Commands:'
31
+ puts ' completion Run a completion prompt against the model'
32
+ puts "Run 'prompt.rb [command] --help' for more information on a command."
33
+ end
34
+ end
35
+
36
+ PromptToolsCLI.new.run
@@ -11,15 +11,15 @@ class YouTubeVideoManagerCLI
11
11
 
12
12
  def initialize
13
13
  @commands = {
14
- 'get' => method(:fetch_video_details)
15
- # Additional commands can be added here
14
+ 'get' => Appydave::Tools::CliActions::GetVideoAction.new,
15
+ 'update' => Appydave::Tools::CliActions::UpdateVideoAction.new
16
16
  }
17
17
  end
18
18
 
19
19
  def run
20
20
  command, *args = ARGV
21
21
  if @commands.key?(command)
22
- @commands[command].call(args)
22
+ @commands[command].action(args)
23
23
  else
24
24
  puts "Unknown command: #{command}"
25
25
  print_help
@@ -28,31 +28,32 @@ class YouTubeVideoManagerCLI
28
28
 
29
29
  private
30
30
 
31
- def fetch_video_details(args)
32
- options = parse_options(args, 'get')
33
- manager = Appydave::Tools::YouTubeManager::GetVideo.new
34
- manager.get(options[:video_id])
31
+ def update_video_details(args)
32
+ options = update_video_options(args)
35
33
 
36
- if manager.video?
37
- # json = JSON.pretty_generate(details)
38
- # puts json
34
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
35
+ get_video.get(options[:video_id])
39
36
 
40
- # report = Appydave::Tools::YouTubeManager::Reports::VideoDetailsReport.new
41
- # report.print(manager.data)
37
+ update_video = Appydave::Tools::YouTubeManager::UpdateVideo.new(get_video.data)
42
38
 
43
- report = Appydave::Tools::YouTubeManager::Reports::VideoContentReport.new
44
- report.print(manager.data)
45
- else
46
- log.error "Video not found! Maybe it's private or deleted. ID: #{options[:video_id]}"
47
- end
39
+ update_video.title(options[:title]) if options[:title]
40
+ update_video.description(options[:description]) if options[:description]
41
+ update_video.tags(options[:tags]) if options[:tags]
42
+ update_video.category_id(options[:category_id]) if options[:category_id]
43
+
44
+ update_video.save
48
45
  end
49
46
 
50
- def parse_options(args, command)
47
+ def update_video_options(args)
51
48
  options = { video_id: nil }
52
49
  OptionParser.new do |opts|
53
- opts.banner = "Usage: youtube_video_manager.rb #{command} [options]"
50
+ opts.banner = 'Usage: youtube_video_manager.rb update [options]'
54
51
 
55
52
  opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
53
+ opts.on('-t', '--title TITLE', 'Video Title') { |t| options[:title] = t }
54
+ opts.on('-d', '--description DESCRIPTION', 'Video Description') { |d| options[:description] = d }
55
+ opts.on('-g', '--tags TAGS', 'Video Tags (comma-separated)') { |g| options[:tags] = g.split(',') }
56
+ opts.on('-c', '--category-id CATEGORY_ID', 'Video Category ID') { |c| options[:category_id] = c }
56
57
 
57
58
  opts.on_tail('-h', '--help', 'Show this message') do
58
59
  puts opts
@@ -71,8 +72,8 @@ class YouTubeVideoManagerCLI
71
72
  def print_help
72
73
  puts 'Usage: youtube_video_manager.rb [command] [options]'
73
74
  puts 'Commands:'
74
- puts ' get Get details for a YouTube video'
75
- # Additional commands can be listed here
75
+ puts ' get Get details for a YouTube video'
76
+ puts ' update Update details for a YouTube video'
76
77
  puts "Run 'youtube_video_manager.rb [command] --help' for more information on a command."
77
78
  end
78
79
  end
@@ -0,0 +1,5 @@
1
+ # CLI Actions
2
+
3
+ CLI Actions
4
+
5
+ [ChatGPT](https://chatgpt.com/c/16d34069-1834-4dde-acc6-8e855c725cd9)
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module CliActions
6
+ # Base class for CLI actions
7
+ class BaseAction
8
+ def action(args)
9
+ options = parse_options(args)
10
+ execute(options)
11
+ end
12
+
13
+ protected
14
+
15
+ def parse_options(args)
16
+ options = {}
17
+ OptionParser.new do |opts|
18
+ opts.banner = "Usage: #{command_usage}"
19
+
20
+ define_options(opts, options)
21
+
22
+ opts.on_tail('-h', '--help', 'Show this message') do
23
+ puts opts
24
+ exit
25
+ end
26
+ end.parse!(args)
27
+
28
+ validate_options(options)
29
+ options
30
+ end
31
+
32
+ def command_usage
33
+ "#{self.class.name.split('::').last.downcase} [options]"
34
+ end
35
+
36
+ def define_options(opts, options)
37
+ # To be implemented by subclasses
38
+ end
39
+
40
+ def validate_options(options)
41
+ # To be implemented by subclasses
42
+ end
43
+
44
+ def execute(options)
45
+ # To be implemented by subclasses
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module CliActions
6
+ # CLI Action to get a YouTube video details
7
+ class GetVideoAction < BaseAction
8
+ protected
9
+
10
+ def define_options(opts, options)
11
+ opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
12
+ end
13
+
14
+ def validate_options(options)
15
+ return if options[:video_id]
16
+
17
+ puts 'Missing required options: --video-id. Use -h for help.'
18
+ exit
19
+ end
20
+
21
+ def execute(options)
22
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
23
+ get_video.get(options[:video_id])
24
+
25
+ if get_video.video?
26
+ # json = JSON.pretty_generate(details)
27
+ # puts json
28
+
29
+ report = Appydave::Tools::YouTubeManager::Reports::VideoDetailsReport.new
30
+ report.print(get_video.data)
31
+
32
+ # report = Appydave::Tools::YouTubeManager::Reports::VideoContentReport.new
33
+ # report.print(manager.data)
34
+ else
35
+ puts "Video not found! Maybe it's private or deleted. ID: #{options[:video_id]}"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openai'
4
+
5
+ module Appydave
6
+ module Tools
7
+ module CliActions
8
+ # Action to run a completion prompt against the model
9
+ class PromptCompletionAction < BaseAction
10
+ DEFAULT_MODEL = 'gpt-4o'
11
+ DEFAULT_PLATFORM = 'openai'
12
+
13
+ protected
14
+
15
+ def define_options(opts, options)
16
+ opts.on('-p', '--prompt PROMPT', 'The prompt text') { |v| options[:prompt] = v }
17
+ opts.on('-f', '--file FILE', 'The prompt file') { |v| options[:file] = v }
18
+ opts.on('-o', '--output FILE', 'Output file') { |v| options[:output] = v }
19
+ opts.on('-c', '--clipboard', 'Copy result to clipboard') { |v| options[:clipboard] = v }
20
+ opts.on('-m', '--model MODEL', "Model to use (default: #{DEFAULT_MODEL})") { |v| options[:model] = v }
21
+ opts.on('-k', '--key-value PAIR', 'Key-value pairs for interpolation (format: key1=value1,key2=value2)') { |v| options[:key_value] = v }
22
+ end
23
+
24
+ def validate_options(options)
25
+ unless options[:prompt] || options[:file]
26
+ puts 'Missing required options: --prompt or --file. Use -h for help.'
27
+ exit
28
+ end
29
+
30
+ if options[:key_value]
31
+ key_value_pairs = options[:key_value].split(',').to_h { |pair| pair.split('=') }
32
+ options[:key_value] = key_value_pairs
33
+ else
34
+ options[:key_value] = {}
35
+ end
36
+ end
37
+
38
+ def execute(options)
39
+ prompt_text = options[:prompt] || File.read(options[:file])
40
+ model = options[:model] || DEFAULT_MODEL
41
+ key_value_pairs = options[:key_value] || {}
42
+
43
+ # Interpolate key-value pairs into the prompt
44
+ key_value_pairs.each do |key, value|
45
+ prompt_text.gsub!("{#{key}}", value)
46
+ end
47
+
48
+ puts "Prompt: #{prompt_text}"
49
+ puts "Model: #{model}"
50
+ puts "Key-Value Pairs: #{key_value_pairs}"
51
+
52
+ # USE Library class to run this type of code
53
+ # client = OpenAI::Client.new(api_key: ENV['OPENAI_API_KEY'])
54
+ # response = client.completions(
55
+ # engine: model,
56
+ # parameters: {
57
+ # prompt: prompt_text,
58
+ # max_tokens: 100
59
+ # }
60
+ # )
61
+
62
+ # result = response['choices'].first['text'].strip
63
+
64
+ # if options[:output]
65
+ # File.write(options[:output], result)
66
+ # puts "Output written to #{options[:output]}"
67
+ # end
68
+
69
+ # if options[:clipboard]
70
+ # Clipboard.copy(result)
71
+ # puts 'Output copied to clipboard'
72
+ # end
73
+
74
+ puts 'Result:'
75
+ # puts result unless options[:output]
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module CliActions
6
+ # Action to update a YouTube video metadata (title, description, tags, category)
7
+ class UpdateVideoAction < BaseAction
8
+ protected
9
+
10
+ def define_options(opts, options)
11
+ opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
12
+ opts.on('-t', '--title TITLE', 'Video Title') { |t| options[:title] = t }
13
+ opts.on('-d', '--description DESCRIPTION', 'Video Description') { |d| options[:description] = d }
14
+ opts.on('-g', '--tags TAGS', 'Video Tags (comma-separated)') { |g| options[:tags] = g.split(',') }
15
+ opts.on('-c', '--category-id CATEGORY_ID', 'Video Category ID') { |c| options[:category_id] = c }
16
+ end
17
+
18
+ def validate_options(options)
19
+ return if options[:video_id]
20
+
21
+ puts 'Missing required options: --video-id. Use -h for help.'
22
+ exit
23
+ end
24
+
25
+ def execute(options)
26
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
27
+ get_video.get(options[:video_id])
28
+
29
+ if get_video.video?
30
+ update_video = Appydave::Tools::YouTubeManager::UpdateVideo.new(get_video.data)
31
+
32
+ update_video.title(options[:title]) if options[:title]
33
+ update_video.description(options[:description]) if options[:description]
34
+ update_video.tags(options[:tags]) if options[:tags]
35
+ update_video.category_id(options[:category_id]) if options[:category_id]
36
+
37
+ update_video.save
38
+ puts "Video updated successfully. ID: #{options[:video_id]}"
39
+ else
40
+ puts "Video not found! Maybe it's private or deleted. ID: #{options[:video_id]}"
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -23,3 +23,5 @@ module Appydave
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ ActiveModel::Type.register(:array, Appydave::Tools::Types::ArrayType)
@@ -23,3 +23,5 @@ module Appydave
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ ActiveModel::Type.register(:hash, Appydave::Tools::Types::HashType)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.9.4'
5
+ VERSION = '0.10.0'
6
6
  end
7
7
  end
@@ -1,3 +1,5 @@
1
1
  # Youtube Manager
2
2
 
3
- Service classes for interacting with the YouTube API.
3
+ Service classes for interacting with the YouTube API.
4
+
5
+ [ChatGPT - Update video](https://chatgpt.com/c/41b75159-95c5-4183-92f3-e1be5e52a1e8)
@@ -12,7 +12,9 @@ module Appydave
12
12
  SCOPE = [
13
13
  'https://www.googleapis.com/auth/youtube.readonly',
14
14
  'https://www.googleapis.com/auth/youtube',
15
- 'https://www.googleapis.com/auth/youtube.force-ssl'
15
+ 'https://www.googleapis.com/auth/youtube.force-ssl',
16
+ 'https://www.googleapis.com/auth/youtubepartner',
17
+ 'https://www.googleapis.com/auth/youtubepartner-channel-audit'
16
18
  ].freeze
17
19
 
18
20
  def self.authorize
@@ -5,6 +5,8 @@ module Appydave
5
5
  module YouTubeManager
6
6
  # Manage YouTube video details
7
7
  class GetVideo < YouTubeBase
8
+ include KLog::Logging
9
+
8
10
  attr_reader :video_id
9
11
  attr_reader :data
10
12
 
@@ -26,6 +28,8 @@ module Appydave
26
28
  private
27
29
 
28
30
  def build_data(video)
31
+ category_title = get_category_title(video.snippet.category_id)
32
+
29
33
  data = {
30
34
  id: video.id,
31
35
  title: video.snippet.title,
@@ -33,6 +37,13 @@ module Appydave
33
37
  published_at: video.snippet.published_at,
34
38
  channel_id: video.snippet.channel_id,
35
39
  channel_title: video.snippet.channel_title,
40
+ category_id: video.snippet.category_id,
41
+ tags: video.snippet.tags,
42
+ thumbnails: video.snippet.thumbnails.to_h,
43
+ default_audio_language: video.snippet.default_audio_language,
44
+ default_language: video.snippet.default_language,
45
+ live_broadcast_content: video.snippet.live_broadcast_content,
46
+ category_title: category_title,
36
47
  view_count: video.statistics.view_count,
37
48
  like_count: video.statistics.like_count,
38
49
  dislike_count: video.statistics.dislike_count,
@@ -42,30 +53,35 @@ module Appydave
42
53
  license: video.status.license,
43
54
  recording_location: video.recording_details&.location,
44
55
  recording_date: video.recording_details&.recording_date,
45
- tags: video.snippet.tags,
46
- thumbnails: video.snippet.thumbnails.to_h,
47
56
  duration: video.content_details.duration,
48
57
  definition: video.content_details.definition,
49
58
  caption: video.content_details.caption,
50
59
  licensed_content: video.content_details.licensed_content
51
60
  }
61
+ get_captions(video.id) # Fetch captions and associate them
52
62
  # HAVE NOT FIGURED OUT THE PERMISSION ISSUE WITH THIS YET
53
63
  # captions: get_captions(video.id) # Fetch captions and associate them
54
64
  @data = Appydave::Tools::YouTubeManager::Models::YouTubeDetails.new(data)
55
65
  end
56
66
 
67
+ def get_category_title(category_id)
68
+ response = @service.list_video_categories('snippet', id: category_id)
69
+ category = response.items.first
70
+ category&.snippet&.title
71
+ end
72
+
57
73
  def get_captions(video_id)
58
- captions_response = @service.list_captions('snippet', video_id)
74
+ captions_response = @service.list_captions('id,snippet', video_id)
59
75
  captions_response.items.map do |caption|
60
- puts "Caption ID: #{caption.id}"
61
- puts "Language: #{caption.snippet.language}"
62
- puts "Status: #{caption.snippet.status}"
63
- puts "Track Kind: #{caption.snippet.track_kind}"
64
- puts "Name: #{caption.snippet.name}"
65
- puts "Is Auto-Synced: #{caption.snippet.is_auto_synced}"
66
- puts "Is CC: #{caption.snippet.is_cc}"
67
- puts "Is Draft: #{caption.snippet.is_draft}"
68
- puts "Last Updated: #{caption.snippet.last_updated}"
76
+ # puts "Caption ID: #{caption.id}"
77
+ # puts "Language: #{caption.snippet.language}"
78
+ # puts "Status: #{caption.snippet.status}"
79
+ # puts "Track Kind: #{caption.snippet.track_kind}"
80
+ # puts "Name: #{caption.snippet.name}"
81
+ # puts "Is Auto-Synced: #{caption.snippet.is_auto_synced}"
82
+ # puts "Is CC: #{caption.snippet.is_cc}"
83
+ # puts "Is Draft: #{caption.snippet.is_draft}"
84
+ # puts "Last Updated: #{caption.snippet.last_updated}"
69
85
 
70
86
  next unless caption.snippet.status == 'serving'
71
87
 
@@ -83,6 +99,7 @@ module Appydave
83
99
  def download_caption(caption)
84
100
  content = ''
85
101
  formats = %w[srv1 vtt srt ttml] # Try multiple formats to find a compatible one
102
+ success = false
86
103
  formats.each do |format|
87
104
  break if content.present?
88
105
 
@@ -90,14 +107,18 @@ module Appydave
90
107
  @service.download_caption(caption.id, tfmt: format) do |result, error|
91
108
  if error.nil?
92
109
  content = result
93
- else
94
- puts "An error occurred while downloading caption #{caption.id} with format #{format}: #{error.message}"
110
+ success = true
111
+ # else
112
+ # log.info "An error occurred while downloading caption #{caption.id} with format #{format}: #{error.message}"
95
113
  end
96
114
  end
97
115
  rescue Google::Apis::ClientError => e
98
- puts "An error occurred while downloading caption #{caption.id} with format #{format}: #{e.message}"
116
+ log.error "An error occurred while downloading caption #{caption.id} with format #{format}: #{e.message}"
99
117
  end
100
118
  end
119
+
120
+ log.error 'Error occurred while downloading captions, make sure you have the correct permissions.' unless success
121
+
101
122
  content
102
123
  end
103
124
  end
@@ -12,11 +12,21 @@ module Appydave
12
12
  include ActiveModel::Attributes
13
13
 
14
14
  attribute :id, :string
15
- attribute :title, :string
16
- attribute :description, :string
17
- attribute :published_at, :datetime
18
- attribute :channel_id, :string
19
- attribute :channel_title, :string
15
+ attribute :title, :string # snippet
16
+ attribute :description, :string # snippet
17
+ attribute :published_at, :datetime # snippet
18
+ attribute :channel_id, :string # snippet
19
+ attribute :channel_title, :string # snippet
20
+ attribute :category_id, :string # snippet
21
+
22
+ attribute :default_audio_language # snippet
23
+ attribute :default_language # snippet
24
+ attribute :live_broadcast_content # snippet
25
+
26
+ attribute :tags, array: true # snippet
27
+ attribute :thumbnails, :hash # snippet
28
+
29
+ attribute :category_title, :string
20
30
  attribute :view_count, :integer
21
31
  attribute :like_count, :integer
22
32
  attribute :dislike_count, :integer
@@ -26,18 +36,58 @@ module Appydave
26
36
  attribute :license, :string
27
37
  attribute :recording_location, :string
28
38
  attribute :recording_date, :datetime
29
- attribute :tags, array: true
30
- attribute :thumbnails, :hash
31
39
  attribute :duration, :string
32
40
  attribute :definition, :string
33
41
  attribute :caption, :boolean
34
42
  attribute :licensed_content, :boolean
35
- # attribute :captions, :array, default: []
43
+ attribute :captions, :array # , default: []
44
+
45
+ def initialize(attributes = {})
46
+ super
47
+ self.captions = attributes[:captions].map { |caption| Captions.new(caption) } if attributes[:captions]
48
+ end
49
+
50
+ def map_video_snippet
51
+ {
52
+ title: title,
53
+ description: description,
54
+ category_id: category_id,
55
+ tags: tags || [],
56
+ thumbnails: thumbnails
57
+ }
58
+ end
36
59
 
37
- # def initialize(attributes = {})
38
- # super
39
- # self.captions = attributes[:captions].map { |caption| Captions.new(caption) } if attributes[:captions]
40
- # end
60
+ def to_h
61
+ {
62
+ id: id,
63
+ title: title,
64
+ description: description,
65
+ published_at: published_at,
66
+ channel_id: channel_id,
67
+ channel_title: channel_title,
68
+ category_id: category_id,
69
+ category_title: category_title,
70
+ default_audio_language: default_audio_language,
71
+ default_language: default_language,
72
+ live_broadcast_content: live_broadcast_content,
73
+ tags: tags,
74
+ thumbnails: thumbnails,
75
+ view_count: view_count,
76
+ like_count: like_count,
77
+ dislike_count: dislike_count,
78
+ comment_count: comment_count,
79
+ privacy_status: privacy_status,
80
+ embeddable: embeddable,
81
+ license: license,
82
+ recording_location: recording_location,
83
+ recording_date: recording_date,
84
+ duration: duration,
85
+ definition: definition,
86
+ caption: caption,
87
+ licensed_content: licensed_content
88
+ }
89
+ # captions: captions.map(&:to_h)
90
+ end
41
91
  end
42
92
  end
43
93
  end
@@ -12,22 +12,27 @@ module Appydave
12
12
  # log.heading 'Video Details Report'
13
13
  # log.subheading 'Video Details Report'
14
14
  log.section_heading 'Video Details Report'
15
- log.kv 'ID', data[:id]
16
- log.kv 'Title', data[:title]
17
- log.kv 'Published At', data[:published_at]
18
- log.kv 'View Count', data[:view_count]
19
- log.kv 'Like Count', data[:like_count]
20
- log.kv 'Dislike Count', data[:dislike_count]
21
- log.kv 'Comment Count', data[:comment_count]
22
- log.kv 'Privacy Status', data[:privacy_status]
23
- log.kv 'Channel ID', data[:channel_id]
24
- log.kv 'Channel Title', data[:channel_title]
25
- log.kv 'Embeddable', data[:embeddable]
26
- log.kv 'License', data[:license]
27
- log.kv 'Recording Location', data[:recording_location]
28
- log.kv 'Recording Date', data[:recording_date]
29
- log.kv 'Tags', data[:tags]&.join(', ')
30
- log.kv 'Description', data[:description][0..100]
15
+ log.kv 'ID', data.id
16
+ log.kv 'Title', data.title
17
+ log.kv 'Description', data.description[0..100]
18
+ log.kv 'Published At', data.published_at
19
+ log.kv 'View Count', data.view_count
20
+ log.kv 'Like Count', data.like_count
21
+ log.kv 'Dislike Count', data.dislike_count
22
+ log.kv 'Comment Count', data.comment_count
23
+ log.kv 'Privacy Status', data.privacy_status
24
+ log.kv 'Channel ID', data.channel_id
25
+ log.kv 'Channel Title', data.channel_title
26
+ log.kv 'Category ID', data.category_id
27
+ log.kv 'Category Title', data.category_title
28
+ log.kv 'Default Audio Language', data.default_audio_language
29
+ log.kv 'Default Language', data.default_language
30
+ log.kv 'Live Broadcast Content', data.live_broadcast_content
31
+ log.kv 'Embeddable', data.embeddable
32
+ log.kv 'License', data.license
33
+ log.kv 'Recording Location', data.recording_location
34
+ log.kv 'Recording Date', data.recording_date
35
+ log.kv 'Tags', data.tags&.join(', ')
31
36
  end
32
37
  end
33
38
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module YouTubeManager
6
+ # Update YouTube video details
7
+ class UpdateVideo < YouTubeBase
8
+ attr_reader :video_details
9
+ attr_reader :snippet
10
+
11
+ def initialize(video_details)
12
+ super()
13
+ @video_details = video_details
14
+ end
15
+
16
+ def title(title)
17
+ video_details.title = title
18
+
19
+ self
20
+ end
21
+
22
+ def description(description)
23
+ video_details.description = description
24
+
25
+ self
26
+ end
27
+
28
+ def tags(tags)
29
+ video_details.tags = tags
30
+
31
+ self
32
+ end
33
+
34
+ def category_id(category_id)
35
+ video_details.category_id = category_id
36
+
37
+ self
38
+ end
39
+
40
+ def save
41
+ snippet = video_details.map_video_snippet
42
+
43
+ video = Google::Apis::YoutubeV3::Video.new(
44
+ id: video_details.id,
45
+ snippet: snippet
46
+ )
47
+
48
+ @service.update_video('snippet', video)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -22,8 +22,12 @@ require 'appydave/tools/types/indifferent_access_hash'
22
22
  require 'appydave/tools/types/hash_type'
23
23
  require 'appydave/tools/types/array_type'
24
24
 
25
- ActiveModel::Type.register(:array, Appydave::Tools::Types::ArrayType)
26
- ActiveModel::Type.register(:hash, Appydave::Tools::Types::HashType)
25
+ require 'appydave/tools/cli_actions/base_action'
26
+
27
+ # May want to move this into the tools location
28
+ require 'appydave/tools/cli_actions/prompt_completion_action'
29
+ require 'appydave/tools/cli_actions/get_video_action'
30
+ require 'appydave/tools/cli_actions/update_video_action'
27
31
 
28
32
  require 'appydave/tools/gpt_context/file_collector'
29
33
 
@@ -50,6 +54,7 @@ require 'appydave/tools/youtube_manager/models/captions'
50
54
  require 'appydave/tools/youtube_manager/youtube_base'
51
55
  require 'appydave/tools/youtube_manager/authorization'
52
56
  require 'appydave/tools/youtube_manager/get_video'
57
+ require 'appydave/tools/youtube_manager/update_video'
53
58
  require 'appydave/tools/youtube_manager/reports/video_details_report'
54
59
  require 'appydave/tools/youtube_manager/reports/video_content_report'
55
60
 
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appydave-tools",
9
- "version": "0.9.4",
9
+ "version": "0.10.0",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.3",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
4
4
  "description": "AppyDave YouTube Automation Tools",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appydave-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-12 00:00:00.000000000 Z
11
+ date: 2024-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -160,6 +160,7 @@ files:
160
160
  - bin/configuration.rb
161
161
  - bin/console
162
162
  - bin/gpt_context.rb
163
+ - bin/prompt_tools.rb
163
164
  - bin/setup
164
165
  - bin/subtitle_master.rb
165
166
  - bin/youtube_automation.rb
@@ -171,6 +172,11 @@ files:
171
172
  - lib/appydave/tools/bank_reconciliation/clean/mapper.rb
172
173
  - lib/appydave/tools/bank_reconciliation/clean/read_transactions.rb
173
174
  - lib/appydave/tools/bank_reconciliation/models/transaction.rb
175
+ - lib/appydave/tools/cli_actions/_doc.md
176
+ - lib/appydave/tools/cli_actions/base_action.rb
177
+ - lib/appydave/tools/cli_actions/get_video_action.rb
178
+ - lib/appydave/tools/cli_actions/prompt_completion_action.rb
179
+ - lib/appydave/tools/cli_actions/update_video_action.rb
174
180
  - lib/appydave/tools/configuration/_doc.md
175
181
  - lib/appydave/tools/configuration/config.rb
176
182
  - lib/appydave/tools/configuration/configurable.rb
@@ -200,6 +206,7 @@ files:
200
206
  - lib/appydave/tools/youtube_manager/models/youtube_details.rb
201
207
  - lib/appydave/tools/youtube_manager/reports/video_content_report.rb
202
208
  - lib/appydave/tools/youtube_manager/reports/video_details_report.rb
209
+ - lib/appydave/tools/youtube_manager/update_video.rb
203
210
  - lib/appydave/tools/youtube_manager/youtube_base.rb
204
211
  - package-lock.json
205
212
  - package.json