lib/feedlrop/feedlrop.rb in feedlrop-0.1.23 vs lib/feedlrop/feedlrop.rb in feedlrop-0.1.24

- old
+ new

@@ -1,77 +1,183 @@ -# -*- coding: utf-8 -*- -require 'arxutils' -require 'arxutils/store' +# frozen_string_literal: true + +require 'arxutils_sqlite3' require 'csv' require 'pp' require 'feedlr' require 'awesome_print' +require 'fileutils' +require 'ykxutils' module Feedlrop + # Feedlr操作クラス class Feedlrop - - def initialize( token , kind, hs ) + attr_reader :categories, :profile + + # 初期化 + def initialize(token, hash) + # OAuthアクセストークン @oauth_access_token = token - @dbmgr = Arxutils::Store.init(kind , hs ){ | register_time | - Dbutil::DbMgr.new( register_time ) - } - - @client = Feedlr::Client.new(sandbox: false , oauth_access_token: @oauth_access_token) + + db_dir = hash['db_dir'] + config_dir = hash['config_dir'] + env = hash['env'] + dbconfig = hash['dbconfig'] + @output_dir = hash['output_dir'] + @pstore_dir = hash['pstore_dir'] + + dbconfig_path = Arxutils_Sqlite3::Util.make_dbconfig_path(config_dir, dbconfig) + log_path = Arxutils_Sqlite3::Util.make_log_path(db_dir, dbconfig) + dbconnect = Arxutils_Sqlite3::Dbutil::Dbconnect.new( + dbconfig_path, + env, + log_path + ) + register_time = dbconnect.connect + # register_time = Arxutils::Dbutil::Dbconnect.init( hs["db_dir"], hs["migrate_dir"] , hs["config_dir"], hs["dbconfig"] , hs["env"] , hs["log_fname"] , opts ) + # 保存用DBマネージャ + # @dbmgr = ::Feedlrop::Dbutil::FeedlropMgr.new(register_time) + @dbmgr = Dbutil::FeedlropMgr.new(register_time) + # Feedlrクライアント + @client = Feedlr::Client.new(sandbox: false, oauth_access_token: @oauth_access_token) + # ユーザプロファイル @profile = @client.user_profile + # カテゴリ @categories = @client.user_categories + + @pstorex = Ykxutils::Pstorex.new(@pstore_dir) + @pstore_key = ::Feedlrop::PSTORE_KEY + @pstore_default_value = [] + load_pstore end - def get_output_file( ext ) + # psotreからの取得 + def pstore_fetch(key, default_value) + @pstorex.fetch(key, default_value) + end + + # pstore更新 + def pstore_store(key, value) + @pstorex.store(key, value) + end + + # DBへ登録 + def dbmgr_add(category_id, url, count) + @dbmgr.add(category_id, url, count) + end + + # 出力ファイル取得 + def get_output_file(parent_dir, ext) n = Time.now - fname = %Q!#{n.year}-#{n.month}-#{n.day}-#{n.hour}-#{n.min}-#{n.sec}.#{ext}! - File.open( fname , "w") + fname = %(#{n.year}-#{n.month}-#{n.day}-#{n.hour}-#{n.min}-#{n.sec}.#{ext}) + FileUtils.mkdir_p(parent_dir) + outfname = File.join(parent_dir, fname) + File.open(outfname, 'w') end - def get_all_unread_count - @categories.each do | x | + # 各フィードの未読数を全て取得 + def all_unread_count + @categories.each do |x| + if x.instance_of?(Array) + _err, error_code = x + next + end f = true - if x.class != String - category_id = x.id.split('/')[-1] - else + if x.instance_of?(String) f = false + else + category_id = x.id.split('/')[-1] end next unless f - en = @client.user_unread_counts( {:streamId => x.id } ) + en = @client.user_unread_counts({ streamId: x.id }) + next if en.nil? en.unreadcounts.each do |y| - if y.id =~ /^feed\/(.+)/ - url = $1 - csv_add( category_id , url , y[:count] ) - @dbmgr.add( category_id , url , y[:count] ) - end + next unless y.id =~ %r{^feed/(.+)} + + url = ::Regexp.last_match(1) + csv_add(category_id, url, y[:count]) + @dbmgr.add(category_id, url, y[:count]) end end end + # ユーザプロファイルをコンソールへ出力 def print_user_profile pp @profile end + # ユーザサブスクリプションをコンソールへ出力 def print_subscription - option = {:plain => true } - puts @client.user_subscriptions.size - @client.user_subscriptions.map{|m| puts m.id} - puts "===============" - @client.user_subscriptions.map{|m| ap m , option } + option = { plain: true } + # puts @client.user_subscriptions.size + @client.user_subscriptions.map { |m| puts m.id } + # puts '===============' end - - def csv_open - @csv = CSV.new(get_output_file("csv") , { - :headers => %w!category_id id count!, - :write_headers => true - } ) + + # 指定ディレクトリに出力準備(CVS形式) + def csv_open(parent_dir) + csv_file = get_output_file(parent_dir, 'csv') + @csv = CSV.new(csv_file, + headers: %w[category_id id count], + write_headers: true) end - def csv_add(category_id , id , count) - @csv << [category_id , id , count ] + # 出力先にカテゴリID、フィードID、未読数を出力 + def csv_add(category_id, id, count) + @csv << [category_id, id, count] end + # 出力先クローズ def csv_close @csv.close + end + + def load_pstore + value = pstore_fetch(@pstore_key, @pstore_default_value) + + if value == @pstore_default_value + new_value = { + key => { + profile: @profile, + categories: @categories + } + } + pstore_store(@pstore_key, new_value) + end + end + + def check_backup + value2 = pstore_fetch(@pstore_key, @pstore_default_value) + return if value2 == @pstore_default_value + + top = value2[@pstore_key] + profile = top[:profile] + categories = top[:categories] + # p "profile=#{profile}" + # p "categories.size=#{categories.size}" + # categories.map{ |x| puts x.label } + end + + def csv_to_db + ary = Pathname.new(@output_dir).children.sort_by(&:ctime) + latest_file = ary.last + f = latest_file.open + csv = CSV.new(f, + headers: true, + write_headers: true) + csv.each do |row| + category_id = row['category_id'] + id = row['id'] + count = row['count'] + if !category_id.nil? && !id.nil? && !count.nil? + dbmgr_add(category_id, id, count) + else + p category_id + p id + p count + p '==' + end + end end end end