appydave-tools 0.9.3 → 0.9.5

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
  SHA256:
3
- metadata.gz: 7d25de201fe246c80fe143f7414bfa76a4c8dc35a4d4ba26086ad4597b699a26
4
- data.tar.gz: 9785e23d8743eb724082ceb7d9b699df06ca88e9ebc81401dc00f0af457527d3
3
+ metadata.gz: ed51cab9a76cb09289bbcfa80eb759c3f5d70f656043d25bce0b106f74757aef
4
+ data.tar.gz: c498125bae1ee080aebe7fd88c0d7c4ceabcb477c0cbd59d8d741c880010bfe6
5
5
  SHA512:
6
- metadata.gz: 83964602096a76ca0dde6ad5362e5e521ac2fae2c2041f1cb1a989b11ac351892e9a47cc1b4d00afb3ed08d76b108a3192b04437a675c6bcf1d75ad19c423de0
7
- data.tar.gz: a902575b0e19003e6326b2605ee3a31636a0d70b399b7180a3464c532e5b3ca603bed1cded2b1999b4406905b584cae3cc40eff0946d1bdf44395223527a67a2
6
+ metadata.gz: 1520df315b862ca20f306e4e0e0f6ec06b05372858252f3f143e9ba0a7f10fdea18aacc368dd887ad308cdd559ee8664c4b1ad0922d70c89800dfb21124d2a27
7
+ data.tar.gz: 2b1e3fb4877bb919b3786e56042d2fde5850d85f8e78d7fa6cf2226dc08edc2bd61dac81e73c4de14e181bc784675d981e59277bbabdd31e34c937e2aef6336b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [0.9.4](https://github.com/klueless-io/appydave-tools/compare/v0.9.3...v0.9.4) (2024-06-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * move youtube management data to activemodel ([12d3351](https://github.com/klueless-io/appydave-tools/commit/12d3351b2243c436d0f59e2f2822d9d82cc6ebd6))
7
+
8
+ ## [0.9.3](https://github.com/klueless-io/appydave-tools/compare/v0.9.2...v0.9.3) (2024-06-12)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * preperation fo the youtube automation tool ([42c1e1d](https://github.com/klueless-io/appydave-tools/commit/42c1e1d3a4ea53491b72140bbf35850e41ce0f1c))
14
+ * update rubocop version number ([b64739d](https://github.com/klueless-io/appydave-tools/commit/b64739d46a5b3ea6177c2f7512c720b6ed4e6257))
15
+
1
16
  ## [0.9.2](https://github.com/klueless-io/appydave-tools/compare/v0.9.1...v0.9.2) (2024-06-11)
2
17
 
3
18
 
@@ -7,10 +7,12 @@ require 'appydave/tools'
7
7
 
8
8
  # Process command line arguments for YouTubeVideoManager operations
9
9
  class YouTubeVideoManagerCLI
10
+ include KLog::Logging
11
+
10
12
  def initialize
11
13
  @commands = {
12
- 'get' => method(:fetch_video_details)
13
- # Additional commands can be added here
14
+ 'get' => method(:fetch_video_details),
15
+ 'update' => method(:update_video_details)
14
16
  }
15
17
  end
16
18
 
@@ -28,16 +30,37 @@ class YouTubeVideoManagerCLI
28
30
 
29
31
  def fetch_video_details(args)
30
32
  options = parse_options(args, 'get')
31
- manager = Appydave::Tools::YouTubeManager::GetVideo.new
32
- manager.get(options[:video_id])
33
- # json = JSON.pretty_generate(details)
34
- # puts json
33
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
34
+ get_video.get(options[:video_id])
35
+
36
+ if get_video.video?
37
+ # json = JSON.pretty_generate(details)
38
+ # puts json
35
39
 
36
- # report = Appydave::Tools::YouTubeManager::Reports::VideoDetailsReport.new
37
- # report.print(manager.data)
40
+ report = Appydave::Tools::YouTubeManager::Reports::VideoDetailsReport.new
41
+ report.print(get_video.data)
38
42
 
39
- report = Appydave::Tools::YouTubeManager::Reports::VideoContentReport.new
40
- report.print(manager.data)
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
48
+ end
49
+
50
+ def update_video_details(args)
51
+ options = parse_update_options(args)
52
+
53
+ get_video = Appydave::Tools::YouTubeManager::GetVideo.new
54
+ get_video.get(options[:video_id])
55
+
56
+ update_video = Appydave::Tools::YouTubeManager::UpdateVideo.new(get_video.data)
57
+
58
+ update_video.title(options[:title]) if options[:title]
59
+ update_video.description(options[:description]) if options[:description]
60
+ update_video.tags(options[:tags]) if options[:tags]
61
+ update_video.category_id(options[:category_id]) if options[:category_id]
62
+
63
+ update_video.save
41
64
  end
42
65
 
43
66
  def parse_options(args, command)
@@ -61,11 +84,36 @@ class YouTubeVideoManagerCLI
61
84
  options
62
85
  end
63
86
 
87
+ def parse_update_options(args)
88
+ options = { video_id: nil }
89
+ OptionParser.new do |opts|
90
+ opts.banner = 'Usage: youtube_video_manager.rb update [options]'
91
+
92
+ opts.on('-v', '--video-id ID', 'YouTube Video ID') { |v| options[:video_id] = v }
93
+ opts.on('-t', '--title TITLE', 'Video Title') { |t| options[:title] = t }
94
+ opts.on('-d', '--description DESCRIPTION', 'Video Description') { |d| options[:description] = d }
95
+ opts.on('-g', '--tags TAGS', 'Video Tags (comma-separated)') { |g| options[:tags] = g.split(',') }
96
+ opts.on('-c', '--category-id CATEGORY_ID', 'Video Category ID') { |c| options[:category_id] = c }
97
+
98
+ opts.on_tail('-h', '--help', 'Show this message') do
99
+ puts opts
100
+ exit
101
+ end
102
+ end.parse!(args)
103
+
104
+ unless options[:video_id]
105
+ puts 'Missing required options. Use -h for help.'
106
+ exit
107
+ end
108
+
109
+ options
110
+ end
111
+
64
112
  def print_help
65
113
  puts 'Usage: youtube_video_manager.rb [command] [options]'
66
114
  puts 'Commands:'
67
- puts ' get Get details for a YouTube video'
68
- # Additional commands can be listed here
115
+ puts ' get Get details for a YouTube video'
116
+ puts ' update Update details for a YouTube video'
69
117
  puts "Run 'youtube_video_manager.rb [command] --help' for more information on a command."
70
118
  end
71
119
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Types
6
+ # Used by the ActiveModel attributes API to cast values to arrays
7
+ class ArrayType < ActiveModel::Type::Value
8
+ def cast(value)
9
+ case value
10
+ when String
11
+ value.split(',')
12
+ when Array
13
+ value
14
+ else
15
+ raise ArgumentError, "Cannot cast #{value.class} to Array"
16
+ end
17
+ end
18
+
19
+ def serialize(value)
20
+ value.join(',')
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Types
6
+ # Used by the ActiveModel attributes API to cast values to hashes
7
+ class HashType < ActiveModel::Type::Value
8
+ def cast(value)
9
+ case value
10
+ when String
11
+ JSON.parse(value)
12
+ when Hash
13
+ value
14
+ else
15
+ raise ArgumentError, "Cannot cast #{value.class} to Hash"
16
+ end
17
+ end
18
+
19
+ def serialize(value)
20
+ value.to_json
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appydave
4
+ module Tools
5
+ module Types
6
+ # Hash with indifferent access
7
+ class IndifferentAccessHash < Hash
8
+ def initialize(initial_hash = {})
9
+ super()
10
+ update(initial_hash)
11
+ end
12
+
13
+ def [](key)
14
+ super(convert_key(key))
15
+ end
16
+
17
+ def []=(key, value)
18
+ super(convert_key(key), value)
19
+ end
20
+
21
+ def fetch(key, *args)
22
+ super(convert_key(key), *args)
23
+ end
24
+
25
+ def delete(key)
26
+ super(convert_key(key))
27
+ end
28
+
29
+ private
30
+
31
+ def convert_key(key)
32
+ key.is_a?(Symbol) ? key.to_s : key
33
+ end
34
+
35
+ def update(initial_hash)
36
+ initial_hash.each do |key, value|
37
+ self[convert_key(key)] = value
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Appydave
4
4
  module Tools
5
- VERSION = '0.9.3'
5
+ VERSION = '0.9.5'
6
6
  end
7
7
  end
@@ -11,7 +11,10 @@ module Appydave
11
11
 
12
12
  SCOPE = [
13
13
  'https://www.googleapis.com/auth/youtube.readonly',
14
- 'https://www.googleapis.com/auth/youtube'
14
+ 'https://www.googleapis.com/auth/youtube',
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'
15
18
  ].freeze
16
19
 
17
20
  def self.authorize
@@ -22,11 +25,11 @@ module Appydave
22
25
  authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
23
26
  user_id = 'default'
24
27
  credentials = authorizer.get_credentials(user_id)
25
- credentials = wait_for_authorization(authorizer) if credentials.nil?
28
+ credentials = wait_for_authorization(authorizer, user_id) if credentials.nil?
26
29
  credentials
27
30
  end
28
31
 
29
- def self.wait_for_authorization(authorizer)
32
+ def self.wait_for_authorization(authorizer, user_id)
30
33
  url = authorizer.get_authorization_url(base_url: REDIRECT_URI)
31
34
  puts 'Open the following URL in your browser and authorize the application:'
32
35
  puts url
@@ -7,12 +7,26 @@ module Appydave
7
7
  class GetVideo < YouTubeBase
8
8
  attr_reader :video_id
9
9
  attr_reader :data
10
- attr_reader :video
11
10
 
12
11
  def get(video_id)
12
+ @data = nil
13
13
  @video_id = video_id
14
14
  response = @service.list_videos('snippet,contentDetails,status,statistics', id: video_id)
15
- @video = response.items.first
15
+ video = response.items.first
16
+
17
+ return unless video
18
+
19
+ build_data(video)
20
+ end
21
+
22
+ def video?
23
+ !data.nil?
24
+ end
25
+
26
+ private
27
+
28
+ def build_data(video)
29
+ category_title = get_category_title(video.snippet.category_id)
16
30
 
17
31
  data = {
18
32
  id: video.id,
@@ -21,6 +35,13 @@ module Appydave
21
35
  published_at: video.snippet.published_at,
22
36
  channel_id: video.snippet.channel_id,
23
37
  channel_title: video.snippet.channel_title,
38
+ category_id: video.snippet.category_id,
39
+ tags: video.snippet.tags,
40
+ thumbnails: video.snippet.thumbnails.to_h,
41
+ default_audio_language: video.snippet.default_audio_language,
42
+ default_language: video.snippet.default_language,
43
+ live_broadcast_content: video.snippet.live_broadcast_content,
44
+ category_title: category_title,
24
45
  view_count: video.statistics.view_count,
25
46
  like_count: video.statistics.like_count,
26
47
  dislike_count: video.statistics.dislike_count,
@@ -30,15 +51,73 @@ module Appydave
30
51
  license: video.status.license,
31
52
  recording_location: video.recording_details&.location,
32
53
  recording_date: video.recording_details&.recording_date,
33
- tags: video.snippet.tags,
34
- thumbnails: video.snippet.thumbnails.to_h,
35
54
  duration: video.content_details.duration,
36
55
  definition: video.content_details.definition,
37
56
  caption: video.content_details.caption,
38
57
  licensed_content: video.content_details.licensed_content
39
58
  }
59
+ get_captions(video.id) # Fetch captions and associate them
60
+ # HAVE NOT FIGURED OUT THE PERMISSION ISSUE WITH THIS YET
61
+ # captions: get_captions(video.id) # Fetch captions and associate them
62
+ @data = Appydave::Tools::YouTubeManager::Models::YouTubeDetails.new(data)
63
+ end
64
+
65
+ def get_category_title(category_id)
66
+ response = @service.list_video_categories('snippet', id: category_id)
67
+ category = response.items.first
68
+ category&.snippet&.title
69
+ end
70
+
71
+ def get_captions(video_id)
72
+ captions_response = @service.list_captions('id,snippet', video_id)
73
+ captions_response.items.map do |caption|
74
+ # puts "Caption ID: #{caption.id}"
75
+ # puts "Language: #{caption.snippet.language}"
76
+ # puts "Status: #{caption.snippet.status}"
77
+ # puts "Track Kind: #{caption.snippet.track_kind}"
78
+ # puts "Name: #{caption.snippet.name}"
79
+ # puts "Is Auto-Synced: #{caption.snippet.is_auto_synced}"
80
+ # puts "Is CC: #{caption.snippet.is_cc}"
81
+ # puts "Is Draft: #{caption.snippet.is_draft}"
82
+ # puts "Last Updated: #{caption.snippet.last_updated}"
83
+
84
+ next unless caption.snippet.status == 'serving'
85
+
86
+ caption_data = {
87
+ caption_id: caption.id,
88
+ language: caption.snippet.language,
89
+ name: caption.snippet.name,
90
+ status: caption.snippet.status,
91
+ content: download_caption(caption)
92
+ }
93
+ caption_data
94
+ end.compact
95
+ end
96
+
97
+ def download_caption(caption)
98
+ content = ''
99
+ formats = %w[srv1 vtt srt ttml] # Try multiple formats to find a compatible one
100
+ success = false
101
+ formats.each do |format|
102
+ break if content.present?
103
+
104
+ begin
105
+ @service.download_caption(caption.id, tfmt: format) do |result, error|
106
+ if error.nil?
107
+ content = result
108
+ success = true
109
+ # else
110
+ # log.info "An error occurred while downloading caption #{caption.id} with format #{format}: #{error.message}"
111
+ end
112
+ end
113
+ rescue Google::Apis::ClientError => e
114
+ log.error "An error occurred while downloading caption #{caption.id} with format #{format}: #{e.message}"
115
+ end
116
+ end
117
+
118
+ log.error 'Error occurred while downloading captions, make sure you have the correct permissions.' unless success
40
119
 
41
- @data = Appydave::Tools::IndifferentAccessHash.new(data)
120
+ content
42
121
  end
43
122
  end
44
123
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_model'
4
+
5
+ module Appydave
6
+ module Tools
7
+ module YouTubeManager
8
+ module Models
9
+ # Model to store YouTube video captions (subtitles)
10
+ class Captions
11
+ include ActiveModel::Model
12
+ include ActiveModel::Attributes
13
+
14
+ attribute :caption_id, :string
15
+ attribute :language, :string
16
+ attribute :name, :string
17
+ attribute :status, :string
18
+ attribute :content, :string
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_model'
4
+
5
+ module Appydave
6
+ module Tools
7
+ module YouTubeManager
8
+ module Models
9
+ # Model to store YouTube video details
10
+ class YouTubeDetails
11
+ include ActiveModel::Model
12
+ include ActiveModel::Attributes
13
+
14
+ attribute :id, :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
30
+ attribute :view_count, :integer
31
+ attribute :like_count, :integer
32
+ attribute :dislike_count, :integer
33
+ attribute :comment_count, :integer
34
+ attribute :privacy_status, :string
35
+ attribute :embeddable, :boolean
36
+ attribute :license, :string
37
+ attribute :recording_location, :string
38
+ attribute :recording_date, :datetime
39
+ attribute :duration, :string
40
+ attribute :definition, :string
41
+ attribute :caption, :boolean
42
+ attribute :licensed_content, :boolean
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
59
+
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
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -10,14 +10,14 @@ module Appydave
10
10
 
11
11
  def print(data)
12
12
  # log.heading 'Video Details Report'
13
- log.subheading data[:title]
14
- log.kv 'Published At', data[:published_at]
15
- log.kv 'View Count', data[:view_count]
16
- log.kv 'Like Count', data[:like_count]
17
- log.kv 'Dislike Count', data[:dislike_count]
18
- log.kv 'Tags', data[:tags]&.join(', ')
13
+ log.subheading data.title
14
+ log.kv 'Published At', data.published_at
15
+ log.kv 'View Count', data.view_count
16
+ log.kv 'Like Count', data.like_count
17
+ log.kv 'Dislike Count', data.dislike_count
18
+ log.kv 'Tags', data.tags.join(', ')
19
19
  log.line
20
- puts data[:description]
20
+ puts data.description
21
21
  log.line
22
22
  end
23
23
  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
@@ -8,6 +8,7 @@ require 'open3'
8
8
  require 'openai'
9
9
  require 'optparse'
10
10
  require 'k_log'
11
+ require 'active_model'
11
12
 
12
13
  require 'google/apis/youtube_v3'
13
14
  require 'googleauth'
@@ -17,7 +18,12 @@ require 'webrick'
17
18
  require 'pry'
18
19
 
19
20
  require 'appydave/tools/version'
20
- require 'appydave/tools/indifferent_access_hash'
21
+ require 'appydave/tools/types/indifferent_access_hash'
22
+ require 'appydave/tools/types/hash_type'
23
+ require 'appydave/tools/types/array_type'
24
+
25
+ ActiveModel::Type.register(:array, Appydave::Tools::Types::ArrayType)
26
+ ActiveModel::Type.register(:hash, Appydave::Tools::Types::HashType)
21
27
 
22
28
  require 'appydave/tools/gpt_context/file_collector'
23
29
 
@@ -38,9 +44,13 @@ require 'appydave/tools/bank_reconciliation/models/transaction'
38
44
  require 'appydave/tools/subtitle_master/clean'
39
45
 
40
46
  require 'appydave/tools/youtube_automation/gpt_agent'
47
+
48
+ require 'appydave/tools/youtube_manager/models/youtube_details'
49
+ require 'appydave/tools/youtube_manager/models/captions'
41
50
  require 'appydave/tools/youtube_manager/youtube_base'
42
51
  require 'appydave/tools/youtube_manager/authorization'
43
52
  require 'appydave/tools/youtube_manager/get_video'
53
+ require 'appydave/tools/youtube_manager/update_video'
44
54
  require 'appydave/tools/youtube_manager/reports/video_details_report'
45
55
  require 'appydave/tools/youtube_manager/reports/video_content_report'
46
56
 
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appydave-tools",
3
- "version": "0.9.3",
3
+ "version": "0.9.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appydave-tools",
9
- "version": "0.9.3",
9
+ "version": "0.9.5",
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.3",
3
+ "version": "0.9.5",
4
4
  "description": "AppyDave YouTube Automation Tools",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appydave-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.5
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
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '7'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: clipboard
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -169,19 +183,24 @@ files:
169
183
  - lib/appydave/tools/configuration/openai.rb
170
184
  - lib/appydave/tools/gpt_context/_doc.md
171
185
  - lib/appydave/tools/gpt_context/file_collector.rb
172
- - lib/appydave/tools/indifferent_access_hash.rb
173
186
  - lib/appydave/tools/name_manager/_doc.md
174
187
  - lib/appydave/tools/name_manager/project_name.rb
175
188
  - lib/appydave/tools/subtitle_master/_doc.md
176
189
  - lib/appydave/tools/subtitle_master/clean.rb
190
+ - lib/appydave/tools/types/array_type.rb
191
+ - lib/appydave/tools/types/hash_type.rb
192
+ - lib/appydave/tools/types/indifferent_access_hash.rb
177
193
  - lib/appydave/tools/version.rb
178
194
  - lib/appydave/tools/youtube_automation/_doc.md
179
195
  - lib/appydave/tools/youtube_automation/gpt_agent.rb
180
196
  - lib/appydave/tools/youtube_manager/_doc.md
181
197
  - lib/appydave/tools/youtube_manager/authorization.rb
182
198
  - lib/appydave/tools/youtube_manager/get_video.rb
199
+ - lib/appydave/tools/youtube_manager/models/captions.rb
200
+ - lib/appydave/tools/youtube_manager/models/youtube_details.rb
183
201
  - lib/appydave/tools/youtube_manager/reports/video_content_report.rb
184
202
  - lib/appydave/tools/youtube_manager/reports/video_details_report.rb
203
+ - lib/appydave/tools/youtube_manager/update_video.rb
185
204
  - lib/appydave/tools/youtube_manager/youtube_base.rb
186
205
  - package-lock.json
187
206
  - package.json
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appydave
4
- module Tools
5
- # Hash with indifferent access
6
- class IndifferentAccessHash < Hash
7
- def initialize(initial_hash = {})
8
- super()
9
- update(initial_hash)
10
- end
11
-
12
- def [](key)
13
- super(convert_key(key))
14
- end
15
-
16
- def []=(key, value)
17
- super(convert_key(key), value)
18
- end
19
-
20
- def fetch(key, *args)
21
- super(convert_key(key), *args)
22
- end
23
-
24
- def delete(key)
25
- super(convert_key(key))
26
- end
27
-
28
- private
29
-
30
- def convert_key(key)
31
- key.is_a?(Symbol) ? key.to_s : key
32
- end
33
-
34
- def update(initial_hash)
35
- initial_hash.each do |key, value|
36
- self[convert_key(key)] = value
37
- end
38
- end
39
- end
40
- end
41
- end