#!/usr/bin/env ruby # frozen_string_literal: true $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib') require 'yaml' require 'English' help = <<~HELP Dropcaster is a podcast feed generator for the command line. Author: Nicolas E. Rabenau nerab@gmx.at Homepage: http://nerab.github.io/dropcaster/ Basic Usage: dropcaster Prints a podcast feed document for the mp3 files in the current directory. dropcaster [FILE]... Prints a podcast feed document for FILES dropcaster [DIR]... Prints a podcast feed document for the mp3 files in DIR Options: HELP def usage "Run '#{File.basename(__FILE__)} --help' for further help." end require 'optparse' require 'dropcaster' require 'dropcaster/log_formatter' options = {} options[:auto_detect_channel_file] = true logger = Logger.new($stderr).tap do |l| l.level = Logger::WARN l.formatter = Dropcaster::LogFormatter.new end # rubocop:disable Metrics/BlockLength OptionParser.new do |opts| opts.banner = help opts.on('--verbose', 'Verbose mode - displays additional diagnostic information') do logger.level = Logger::INFO end opts.on('--trace', 'Verbose mode - displays additional diagnostic information') do logger.level = Logger::DEBUG end opts.on('--channel FILE', 'Read the channel definition from FILE instead of channel.yml in the current directory.') do |file| logger.info "Reading channel definition from #{file}" begin options = YAML.load_file(file).merge(options) options[:auto_detect_channel_file] = false rescue StandardError logger.error "Could not load channel definition. #{$ERROR_INFO.message}" logger.info $ERROR_INFO.backtrace exit(1) end end opts.on('--title STRING', "Use STRING as the channel's title. Overrides settings read from channel definition file.") do |title| logger.info "Setting channel title to '#{title}' via command line" options[:title] = title end opts.on('--subtitle STRING', "Use STRING as the channel's subtitle. Overrides settings read from channel definition file.") do |subtitle| logger.info "Setting channel subtitle to '#{subtitle}' via command line" options[:subtitle] = subtitle end opts.on('--url URL', "Use URL as the channel's url. Overrides settings read from channel definition file.") do |url| logger.info "Setting channel URL to '#{url}' via command line" options[:url] = url end opts.on('--description STRING', "Use STRING as the channel's description. Overrides settings read from channel definition file.") do |description| logger.info "Setting channel description to '#{description}' via command line" options[:description] = description end opts.on('--enclosures URL', "Use URL as the base URL for the channel's enclosures. Overrides settings read from channel definition file.") do |enclosures_url| logger.info "Setting enclosures base URL to '#{enclosures_url}' via command line" options[:enclosures_url] = enclosures_url end opts.on('--image URL', "Use URL as the channel's image URL. Overrides settings read from channel definition file.") do |image_url| logger.info "Setting image URL to '#{image_url}' via command line" options[:image_url] = image_url end opts.on('--channel-template FILE', 'Use FILE as template for generating the channel feed. Overrides the default that comes with Dropcaster.') do |file| logger.info "Using'#{file}' as channel template file" options[:channel_template] = file end opts.on('--version', 'Display current version') do puts "#{File.basename(__FILE__)} " + Dropcaster::VERSION exit 0 end end.parse! # rubocop:enable Metrics/BlockLength sources = ARGV.blank? ? '.' : ARGV if options[:auto_detect_channel_file] # There was no channel file specified, so we try to load channel.yml from sources dir channel_file = Dropcaster::ChannelFileLocator.locate(sources) if File.exist?(channel_file) logger.info "Auto-detected channel file at #{channel_file}" options_from_yaml = YAML.load_file(channel_file) options = options_from_yaml.merge(options) else logger.error "No channel file found at #{channel_file})" logger.info usage exit(1) # No way to continue without a channel definition end end logger.info "Generating the channel with these options: #{options.inspect}" begin puts Dropcaster::Channel.new(sources, options).to_rss rescue StandardError logger.error $ERROR_INFO.message $ERROR_INFO.backtrace.each do |line| logger.debug(line) end logger.info usage exit(1) end