PageRenderTime 66ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/tasks/bili_ranking_image.rb

http://bilibiliranking.googlecode.com/
Ruby | 207 lines | 193 code | 4 blank | 10 comment | 7 complexity | 84f034e4a982ef397791e5ae9eea6dba MD5 | raw file
  1. class BiliRankingImage
  2. require 'RMagick'
  3. include Magick
  4. require 'jcode'
  5. attr_accessor :path
  6. alias :pa :path
  7. alias :pa= :path=
  8. FONT_EXE = "#{RAILS_ROOT}/public/acfun_list_font_pic.exe"
  9. TMP_FILE = 'tmp.png'
  10. @@iconv ||= Iconv.new 'GB18030', 'UTF-8//IGNORE'
  11. FONT_FZZHY_GBK = @@iconv.iconv "????_GBK"
  12. FONT_FZKTJ = @@iconv.iconv "??????"
  13. FONT_HYZHJ = @@iconv.iconv "?????"
  14. FONT_HYZJTJ = @@iconv.iconv "??????"
  15. FONT_KT = @@iconv.iconv "??"
  16. FONT_FZZYJ = @@iconv.iconv "??????"
  17. CHENG = @@iconv.iconv "×"
  18. def self.new pa
  19. brl = super()
  20. brl.path = pa
  21. brl
  22. end
  23. def make_ranking_img1 weekly_result
  24. d = weekly_result
  25. last_rank = d.last_score_rank
  26. work = Work.find_by_wid d.wid
  27. @draw = Draw.new
  28. img = d.is_changqi? ? ImageList.new(public_pa + 'model_c.png') : ImageList.new(public_pa + 'model.png')
  29. d_name = @@iconv.iconv(d.name)
  30. case d_name.size
  31. when 0..44 then j_title_size = 18
  32. when 45..50 then j_title_size = 17
  33. when 51..55 then j_title_size = 16
  34. when 56..60 then j_title_size = 15
  35. when 61..65 then j_title_size = 14
  36. else
  37. j_title_size = 13
  38. end
  39. #??
  40. draw_font d_name, FONT_FZZHY_GBK, j_title_size, "FF111111", 18, 306
  41. #ID,PAD,DATE
  42. draw_font "av#{d.wid}", FONT_FZZYJ, 25, "FF333333", 25, 344
  43. if d.is_space_fix
  44. draw_font @@iconv.iconv("#{d.wtype}/#{Work.find_by_wid(d.wid).show_space_info(true)}"), FONT_FZZHY_GBK, 17, "FF444444", 138, 346
  45. elsif d.wtype.jlength > 6 && d.wtype.size > 10
  46. draw_font @@iconv.iconv(d.wtype), FONT_FZZHY_GBK, 17, "FF222222", 138, 346
  47. else
  48. draw_font @@iconv.iconv(d.wtype), FONT_FZZHY_GBK, 20, "FF222222", 148, 346
  49. end
  50. @draw.gravity NorthGravity
  51. draw_font work.cdate.strftime("%Y-%m-%d %H:%M"), FONT_FZZHY_GBK, 16, "FF222222", 90, 339
  52. draw_font @@iconv.iconv(d.author), FONT_FZZHY_GBK, 16, "FFCC0000", 90, 356 unless d.author.blank?
  53. #??
  54. @draw.gravity NorthEastGravity
  55. score_color = d.is_space_fix ? "FF333300" : "FFCC0000"
  56. draw_font Result.point_str(d.score), FONT_HYZHJ, 22, score_color, 30, 267
  57. #???
  58. revised_clicks = Result.get_click_revised(d.part)
  59. fixed_clicks = d.clicks * revised_clicks
  60. if revised_clicks.to_s.length > 3
  61. draw_font Result.point_str(d.clicks), FONT_FZZHY_GBK, 20, "FF3636CD", 44, 123
  62. else
  63. draw_font Result.point_str(d.clicks), FONT_FZZHY_GBK, 20, "FF3636CD", 35, 123
  64. end
  65. #???
  66. revised_comments = Result.get_comment_revised(fixed_clicks, d.comments)
  67. if revised_comments.to_s.length > 2
  68. draw_font Result.point_str(d.comments), FONT_FZZHY_GBK, 20, "FF3636CD", 58, 168
  69. else
  70. draw_font Result.point_str(d.comments), FONT_FZZHY_GBK, 20, "FF3636CD", 38, 168
  71. end
  72. #???
  73. draw_font Result.point_str(d.stows), FONT_FZZHY_GBK, 20, "FF3636CD", 44, 213
  74. #??
  75. draw_font "#{CHENG}#{revised_clicks}", FONT_FZZHY_GBK, 15, "FF472347", 2, 127
  76. draw_font "#{CHENG}#{revised_comments}", FONT_FZZHY_GBK, 15, "FF472347", 2, 172
  77. if d.stows.to_i > 500
  78. @draw.composite 18, 208, 28, 27, ImageList.new('stow_star.png')
  79. else
  80. draw_font "#{CHENG}#{Result::E_S}", FONT_FZZHY_GBK, 15, "FF472347", 2, 217
  81. end
  82. #??
  83. @draw.gravity NorthGravity
  84. draw_font d.score_rank, FONT_HYZJTJ, 60, "FFCC0000", 195, 12
  85. #???
  86. draw_font d.clicks_rank, FONT_HYZJTJ, 20, "FFCC0000", 202, 105
  87. draw_font d.comments_rank, FONT_HYZJTJ, 20, "FFCC0000", 202, 150
  88. draw_font d.stows_rank, FONT_HYZJTJ, 20, "FFCC0000", 202, 195
  89. draw_font d.part, FONT_HYZJTJ, 22, "FFCC0000", 212, 238
  90. #????
  91. if last_rank.nil?
  92. rank_str = @@iconv.iconv "?????"
  93. draw_font rank_str, FONT_FZZHY_GBK, 18, "FF0B4B77", 200, 78
  94. elsif last_rank.zero?
  95. draw_font "NEW", FONT_HYZJTJ, 20, "FFFF6600", 196, 78
  96. elsif last_rank == -1
  97. rank_str = @@iconv.iconv "???(??)"
  98. draw_font rank_str, FONT_FZZHY_GBK, 18, "FF0B4B77", 200, 78
  99. elsif last_rank > d.score_rank
  100. @draw.composite 235, 76, 16, 22, ImageList.new(public_pa+"model_up.png")
  101. rank_str = @@iconv.iconv "??#{last_rank > 999 ? ':' : '?'}#{last_rank}"
  102. draw_font rank_str, FONT_FZZHY_GBK, 18, "FF0B4B77", 188, 78
  103. elsif last_rank < d.score_rank
  104. @draw.composite 235, 76, 16, 22, ImageList.new(public_pa+"model_down.png")
  105. rank_str = @@iconv.iconv "??#{last_rank > 999 ? ':' : '?'}#{last_rank}"
  106. draw_font rank_str, FONT_FZZHY_GBK, 18, "FF0B4B77", 188, 78
  107. else
  108. @draw.composite 235, 80, 25, 14, ImageList.new(public_pa+"model_equal.png")
  109. rank_str = @@iconv.iconv "???#{last_rank}"
  110. draw_font rank_str, FONT_FZZHY_GBK, 18, "FF0B4B77", 188, 78
  111. end
  112. @draw.draw img
  113. img_path = pa + "2_list1\\top#{d.score_rank}.png"
  114. img.write img_path
  115. end
  116. def make_ranking_img2 weekly_results
  117. img = nil
  118. img_index = 0
  119. weekly_results.each_with_index do |d, i|
  120. last_rank = d.last_score_rank
  121. e_i = i % 3
  122. work = Work.find_by_wid d.wid
  123. d_name = @@iconv.iconv(d.name).gsub(/\"/,'\\"')
  124. img = ImageList.new(pa + '3_list2\\_model.png') if e_i.zero?
  125. @draw = Draw.new
  126. case d_name.size
  127. when 0..38 then j_title_size = 22
  128. when 39..41 then j_title_size = 21
  129. when 42..44 then j_title_size = 20
  130. when 45..47 then j_title_size = 19
  131. when 48..50 then j_title_size = 18
  132. when 51..53 then j_title_size = 17
  133. when 54..56 then j_title_size = 16
  134. when 57..59 then j_title_size = 15
  135. when 60..62 then j_title_size = 14
  136. else j_title_size = 13
  137. end
  138. #??
  139. pic_path = work.pic_path
  140. pic_data = open(pic_path){|f| f.read} rescue nil
  141. if pic_data
  142. File.open('fengmian', 'wb'){|f| f.write(pic_data)}
  143. @draw.composite 7, 34+120*e_i, 120, 90, ImageList.new('fengmian')
  144. else
  145. @draw.composite 7, 34+120*e_i, 120, 90, ImageList.new('nofengmian.png')
  146. end
  147. #??
  148. draw_font d_name, FONT_FZZHY_GBK, j_title_size, "FF222222", 18, 8+120*e_i
  149. #??
  150. @draw.gravity NorthGravity
  151. draw_font d.score_rank, FONT_FZKTJ, 70, "FFFF3300", -81, 22+120*e_i
  152. #ID,PAD,DATE
  153. draw_font "av#{d.wid}", FONT_HYZHJ, 18, "FFFFFFFF", -82, 107+120*e_i
  154. draw_font d.part, FONT_HYZHJ, 22, "FFCC0000", 235, 46+120*e_i
  155. draw_font work.cdate.strftime("%Y-%m-%d %H:%M"), FONT_FZZHY_GBK, 17, "FFFFFFFF", 135, 107+120*e_i
  156. #??
  157. @draw.gravity NorthEastGravity
  158. score_color = d.is_space_fix ? "FF333300" : "FFFF3300"
  159. draw_font Result.point_str(d.score), FONT_HYZHJ, 25, score_color, 48, 77+120*e_i
  160. #??
  161. draw_font Result.point_str(d.clicks), FONT_HYZHJ, 18, "FFCC0000", 175, 38+120*e_i
  162. draw_font Result.point_str(d.comments), FONT_HYZHJ, 18, "FFCC0000", 193, 60+120*e_i
  163. draw_font Result.point_str(d.stows), FONT_HYZHJ, 18, "FFCC0000", 202, 83+120*e_i
  164. #???
  165. @draw.gravity NorthGravity
  166. draw_font d.clicks_rank, FONT_HYZHJ, 18, "FF663366", 130, 38+120*e_i
  167. draw_font d.comments_rank, FONT_HYZHJ, 18, "FF663366", 130, 60+120*e_i
  168. draw_font d.stows_rank, FONT_HYZHJ, 18, "FF663366", 74, 83+120*e_i
  169. #??
  170. @draw.gravity NorthWestGravity
  171. draw_font "#{CHENG}#{Result.get_click_revised d.part}", FONT_FZZHY_GBK, 15, "FF0033FF", 327, 38+120*e_i
  172. draw_font "#{CHENG}#{Result.get_comment_revised(d.clicks*Result.get_click_revised(d.part), d.comments)}", FONT_FZZHY_GBK, 15, "FF0033FF", 310, 60+120*e_i
  173. #????
  174. @draw.gravity NorthGravity
  175. if last_rank.nil?
  176. rank_str = "LAST:??"
  177. elsif last_rank.zero?
  178. rank_str = "NEW"
  179. elsif last_rank == -1
  180. rank_str = @@iconv.iconv "LAST:??"
  181. elsif last_rank > d.score_rank
  182. rank_str = @@iconv.iconv "LAST:#{last_rank}?"
  183. elsif last_rank < d.score_rank
  184. rank_str = @@iconv.iconv "LAST:#{last_rank}?"
  185. else
  186. rank_str = @@iconv.iconv "LAST: #{last_rank}?"
  187. end
  188. draw_font rank_str, FONT_KT, 17, "FFFFFFFF", 19, 107+120*e_i
  189. @draw.draw img
  190. img.write %[#{pa}3_list2\\#{'0' * (3-(img_index += 1).to_s.size)}#{img_index}.png] if e_i == 2
  191. end
  192. end
  193. private
  194. def draw_font str, font, font_size, color, x, y
  195. system %[#{FONT_EXE} "#{str}" #{color} #{font_size} #{font}"]
  196. @draw.composite x, y, 0, 0, ImageList.new(TMP_FILE)
  197. end
  198. def public_pa; %[#{pa}..\\public\\]; end
  199. def list1_pa; %[#{pa}2_list1\\]; end
  200. def list2_pa; %[#{pa}3_list2\\]; end
  201. end