Guest User

Untitled

a guest
Sep 25th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2.  
  3. # youtube-rss-dl
  4. # Customize CHANNELS and DESTINATION, then add to cron.
  5.  
  6. require 'logger'
  7. require 'json'
  8. require 'open-uri'
  9. require 'simple-rss'
  10. require 'youtube-dl.rb'
  11.  
  12. PROGNAME = '.youtube-rss-dl'
  13. VERSION = '1.0.2'
  14.  
  15. SELFDIR = File.expand_path(File.dirname(__FILE__))
  16.  
  17. RSS_BASE_URL = 'https://www.youtube.com/feeds/videos.xml?channel_id='
  18. CHANNELS = {
  19. 'ADVChina' => 'UCwNPa8fSXzzAZuT9859GVhg',
  20. 'Brian Lunduke' => 'UCkK9UDm_ZNrq_rIXCz3xCGA',
  21. 'Lazy Game Reviews' => 'UCLx053rWZxCiYWsBETgdKrQ',
  22. 'Linus Tech Tips' => 'UCXuqSBlHAE6Xw-yeJA0Tunw',
  23. 'Marques Brownlee' => 'UCBJycsmduvYEL83R_U4JriQ',
  24. 'Primitave Technology' => 'UCAL3JXZSzSm8AlZyD3nQdBA'
  25.  
  26. }
  27. DESTINATION = SELFDIR
  28. YOUTUBEDL_OPTIONS = {
  29. force_ipv4: true,
  30. format: 'bestvideo[ext=mp4][width<=1920][height<=1080]+bestaudio[ext=m4a]',
  31. add_metadata: true,
  32. xattrs: true,
  33. embed_thumbnail: true,
  34. output: "#{DESTINATION}/%(uploader)s - %(upload_date)s - %(title)s.%(ext)s"
  35. }
  36.  
  37. # load/create log file
  38. logger = Logger.new(File.join(SELFDIR, PROGNAME + '.log'))
  39. logger.level = Logger::WARN
  40.  
  41. # load/create database json
  42. json = File.join(SELFDIR, PROGNAME + '.json')
  43. File.write(json, JSON.generate({})) unless File.file?(json)
  44. database = JSON.parse(File.read(json))
  45.  
  46. # parse each channel
  47. CHANNELS.each do |channel_name, channel_id|
  48. # check hash key
  49. database[channel_name] ||= []
  50.  
  51. puts "Checking: #{channel_name}"
  52.  
  53. # get the feed
  54. begin
  55. rss = SimpleRSS.parse open(RSS_BASE_URL + channel_id)
  56. rescue => e
  57. logger.error('RSS') {
  58. "'#{channel_name}':#{channel_id} - #{e}"
  59. }
  60. raise e
  61. end
  62.  
  63. # parse each rss item
  64. rss.items.each do |video|
  65. next if database[channel_name].include?(video.id)
  66.  
  67. puts " Downloading: #{video.title}"
  68.  
  69. # download video
  70. begin
  71. ### ### ### ### Comment next line to update JSON without downloading
  72. YoutubeDL.download video.link, YOUTUBEDL_OPTIONS
  73. logger.info('YoutubeDL') {
  74. "'#{channel_name}' '#{video.title}' OK"
  75. }
  76. rescue => e
  77. logger.error('YoutubeDL') {
  78. "'#{channel_name}':#{channel_id} #{video.id}:#{video.link} - #{e}"
  79. }
  80. raise e
  81. end
  82.  
  83. # add video id to json
  84. database[channel_name] << video.id
  85. File.write(json, JSON.pretty_generate(database))
  86. end
  87. end
Add Comment
Please, Sign In to add comment