Advertisement
Guest User

Ruby Podcatcher

a guest
Apr 21st, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.77 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. #
  3. # catchernew.rb
  4. # 2018-04-18
  5. #
  6.  
  7. require 'yaml'
  8. require 'fileutils'
  9. require 'feedjira'
  10. require 'down'
  11.  
  12. class Log
  13.   include YAML
  14.   include FileUtils
  15.  
  16.   attr_accessor :log_ary
  17.   attr_reader :logyaml
  18.  
  19.   def initialize(logyaml)
  20.     @logyaml = logyaml
  21.   end
  22.  
  23.   def checklog
  24.     samplelog_ary = ["first.mp3", "another.mp3", "random.mp3"]
  25.     unless File.exist?(logyaml)
  26.       puts "creating log file"
  27.       File.open(logyaml, "w+").write(samplelog_ary.to_yaml)
  28.       abort("you will need to run the application again")
  29.     else
  30.       puts "log exists"
  31.     end
  32.   end
  33.  
  34.   def getlog
  35.    puts "opening log"
  36.    @log_ary = YAML.load_file(logyaml)
  37.   end
  38.  
  39.   def writelog
  40.     puts "writing log"
  41.     p log_ary
  42.     File.open(logyaml, "r+").write(log_ary.to_yaml)
  43.   end
  44. end
  45.  
  46. class Feed
  47.   include Down
  48.   include Feedjira
  49.   include YAML
  50.   include FileUtils
  51.  
  52.   attr_accessor :log_ary
  53.   attr_reader :feedyaml, :feed, :link, :title, :feedtitle, :feed_hsh, :feed_ary
  54.  
  55.   def initialize(feedyaml)
  56.     @feedyaml = feedyaml
  57.   end
  58.  
  59.   def checkfeed
  60.     samplefeed_hsh = {"global"=>"some global setting", "save folder"=>"some preference",
  61.           "feeds" => {"feed01"=>{"title"=>"title of feed", "rss"=>"http://www.somefeed.com/rss",
  62.           "many"=>5, "remark"=>"so so"}, "feed02"=>{"feed02"=>"title of feed2", "rss"=>"https://www.anotherfeed.com/feed.xml",
  63.           "many"=> 3, "remark"=>"bad"}}}
  64.     unless File.exist?(feedyaml)
  65.       puts "creating feed file"
  66.       File.open(feedyaml, "w+").write(samplefeed_hsh.to_yaml)
  67.       abort("please configure news feeds in feed.yml and then run app")
  68.     else
  69.       puts "feed exists"
  70.     end
  71.   end
  72.  
  73.   def getfeed
  74.     @feed_ary = []
  75.     puts "getting feeds"
  76.     @feed_hsh = YAML.load_file(feedyaml)
  77.     feed_hsh["feeds"].each do |key,value|
  78.       feed_ary.push(value["rss"])
  79.     end
  80.     feed_ary
  81.   end
  82.  
  83.   def parse(uri)
  84.     puts "parsing #{uri}"  
  85.     feedparse = Feedjira::Feed.fetch_and_parse(uri)
  86.     @feedtitle = feedparse.title
  87.     @feed = feedparse.entries.first
  88.     @title = feedparse.entries.first.title
  89.     case
  90.     when (feedparse.entries.first).respond_to?(:guid)
  91.       @link = feedparse.entries.first.guid
  92.     when (feedparse.entries.first).respond_to?(:enclosure_url)
  93.       @link = feedparse.entries.first.enclosure_url
  94.     when (feedparse.entries.first).respond_to?(:image)
  95.       @link = feedparse.entries.first.image
  96.     else
  97.       puts "no link"
  98.     end
  99.   end
  100.  
  101.   def getdown
  102.     feed_ary.each do |feed|
  103.       parse(feed)
  104.       puts "trying #{feedtitle}"
  105.       puts "save folder #{feed_hsh["save folder"]}"
  106.       unless Dir.exist?("#{feed_hsh["save folder"]}/#{feedtitle.downcase.delete(" ")}")
  107.         puts "making #{feedtitle.downcase.delete(" ")} folder"
  108.         FileUtils.mkdir("#{feed_hsh["save folder"]}/#{feedtitle.downcase.delete(" ")}")
  109.       else puts "folder exists"
  110.       end
  111.       unless log_ary.include?("#{title.downcase.delete(" ")}.mp3")
  112.         puts "downloading #{title.downcase.delete(" ")}.mp3"
  113.         tempfile = Down.open(link, rewindable: false)
  114.         IO.copy_stream(tempfile, "#{feed_hsh["save folder"]}/#{feedtitle.downcase.delete(" ")}/#{title.downcase.delete(" ")}.mp3")
  115.         tempfile.close
  116.         log_ary.push("#{title.downcase.delete(" ")}.mp3")
  117.       else puts "file exists in log"
  118.       end
  119.     rescue Faraday::TimeoutError, Faraday::ConnectionFailed,
  120.           Down::TimeoutError, Down::TooManyRedirects, Down::ConnectionError
  121.       next
  122.     end
  123.   end
  124. end
  125.  
  126.  
  127.  
  128. log = Log.new("/home/derrick/code/ruby/Catcherrb/log.yml")
  129. feed = Feed.new("/home/derrick/code/ruby/Catcherrb/feeds.yml")
  130.  
  131. log.checklog
  132.  
  133. feed.checkfeed
  134.  
  135. feed.getfeed
  136.  
  137. feed.log_ary = log.getlog
  138.  
  139. feed.getdown
  140.  
  141. log.log_ary = feed.log_ary
  142.  
  143. log.writelog
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement