framework_gem 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/EXECUTION_ENGINE.md +282 -0
- data/lib/Gemfile +12 -0
- data/lib/README.md +138 -0
- data/lib/User_Lib/helpers/helpers.rb +13 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_black_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_color_rois.rb +9 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_image_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_text_rois.rb +48 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_1080/apple_tv_1080_video_rois.rb +11 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_black_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_color_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_image_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_rois.rb +23 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_text_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_720/apple_tv_720_video_rois.rb +11 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_black_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_color_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_image_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_rois.rb +23 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_text_rois.rb +7 -0
- data/lib/User_Lib/rois/apple_tv/apple_tv_video_rois.rb +7 -0
- data/lib/User_Lib/rois/black_rois.rb +33 -0
- data/lib/User_Lib/rois/color_rois.rb +38 -0
- data/lib/User_Lib/rois/dta/dta_1080/dta_1080_black_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_1080/dta_1080_color_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_1080/dta_1080_image_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_1080/dta_1080_rois.rb +26 -0
- data/lib/User_Lib/rois/dta/dta_1080/dta_1080_text_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_1080/dta_1080_video_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_720/dta_720_black_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_720/dta_720_color_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_720/dta_720_image_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_720/dta_720_rois.rb +26 -0
- data/lib/User_Lib/rois/dta/dta_720/dta_720_text_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_720/dta_720_video_rois.rb +8 -0
- data/lib/User_Lib/rois/dta/dta_black_rois.rb +9 -0
- data/lib/User_Lib/rois/dta/dta_color_rois.rb +9 -0
- data/lib/User_Lib/rois/dta/dta_image_rois.rb +9 -0
- data/lib/User_Lib/rois/dta/dta_rois.rb +26 -0
- data/lib/User_Lib/rois/dta/dta_text_rois.rb +9 -0
- data/lib/User_Lib/rois/dta/dta_video_rois.rb +9 -0
- data/lib/User_Lib/rois/image_rois.rb +38 -0
- data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_image_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_rois.rb +26 -0
- data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_1080/mdn_1080_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_image_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_rois.rb +26 -0
- data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_720/mdn_720_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mdn/mdn_black_rois.rb +9 -0
- data/lib/User_Lib/rois/mdn/mdn_color_rois.rb +9 -0
- data/lib/User_Lib/rois/mdn/mdn_image_rois.rb +9 -0
- data/lib/User_Lib/rois/mdn/mdn_rois.rb +26 -0
- data/lib/User_Lib/rois/mdn/mdn_text_rois.rb +13 -0
- data/lib/User_Lib/rois/mdn/mdn_video_rois.rb +9 -0
- data/lib/User_Lib/rois/mobile/android/android_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_image_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_image_rois.rb +43 -0
- data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_phone/android_phone_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_image_rois.rb +54 -0
- data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_tablet/android_tablet_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/android/android_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_image_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_image_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_phone/ios_phone_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_color_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_image_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_tablet/ios_tablet_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/ios/ios_video_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/mobile_black_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/mobile_color_rois.rb +12 -0
- data/lib/User_Lib/rois/mobile/mobile_image_rois.rb +38 -0
- data/lib/User_Lib/rois/mobile/mobile_rois.rb +22 -0
- data/lib/User_Lib/rois/mobile/mobile_text_rois.rb +8 -0
- data/lib/User_Lib/rois/mobile/mobile_video_rois.rb +8 -0
- data/lib/User_Lib/rois/passport/passport_1080/passport_1080_black_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_1080/passport_1080_color_rois.rb +9 -0
- data/lib/User_Lib/rois/passport/passport_1080/passport_1080_image_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_1080/passport_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/passport/passport_1080/passport_1080_text_rois.rb +8 -0
- data/lib/User_Lib/rois/passport/passport_1080/passport_1080_video_rois.rb +8 -0
- data/lib/User_Lib/rois/passport/passport_720/passport_720_black_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_720/passport_720_color_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_720/passport_720_image_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_720/passport_720_rois.rb +23 -0
- data/lib/User_Lib/rois/passport/passport_720/passport_720_text_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_720/passport_720_video_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_black_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_color_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_image_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_rois.rb +23 -0
- data/lib/User_Lib/rois/passport/passport_text_rois.rb +7 -0
- data/lib/User_Lib/rois/passport/passport_video_rois.rb +7 -0
- data/lib/User_Lib/rois/rois.rb +22 -0
- data/lib/User_Lib/rois/roku/roku_720/roku_720_black_rois.rb +37 -0
- data/lib/User_Lib/rois/roku/roku_720/roku_720_color_rois.rb +336 -0
- data/lib/User_Lib/rois/roku/roku_720/roku_720_image_rois.rb +235 -0
- data/lib/User_Lib/rois/roku/roku_720/roku_720_rois.rb +23 -0
- data/lib/User_Lib/rois/roku/roku_720/roku_720_text_rois.rb +1523 -0
- data/lib/User_Lib/rois/roku/roku_720/roku_720_video_rois.rb +32 -0
- data/lib/User_Lib/rois/roku/roku_black_rois.rb +14 -0
- data/lib/User_Lib/rois/roku/roku_color_rois.rb +9 -0
- data/lib/User_Lib/rois/roku/roku_image_rois.rb +13 -0
- data/lib/User_Lib/rois/roku/roku_rois.rb +23 -0
- data/lib/User_Lib/rois/roku/roku_text_rois.rb +9 -0
- data/lib/User_Lib/rois/roku/roku_video_rois.rb +9 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_black_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_color_rois.rb +11 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_image_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_text_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_1080/roku_tv_1080_video_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_black_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_color_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_image_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_rois.rb +23 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_text_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_720/roku_tv_720_video_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_black_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_color_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_image_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_rois.rb +23 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_text_rois.rb +12 -0
- data/lib/User_Lib/rois/roku_tv/roku_tv_video_rois.rb +12 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_black_rois.rb +13 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_color_rois.rb +29 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_image_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_text_rois.rb +92 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_1080/samsung_tv_1080_video_rois.rb +11 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_black_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_color_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_image_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_rois.rb +23 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_text_rois.rb +12 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_720/samsung_tv_720_video_rois.rb +11 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_black_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_color_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_image_rois.rb +9 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_rois.rb +23 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_text_rois.rb +12 -0
- data/lib/User_Lib/rois/samsung_tv/samsung_tv_video_rois.rb +9 -0
- data/lib/User_Lib/rois/sara/sara_1080/sara_1080_black_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_1080/sara_1080_color_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_1080/sara_1080_image_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_1080/sara_1080_rois.rb +26 -0
- data/lib/User_Lib/rois/sara/sara_1080/sara_1080_text_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_1080/sara_1080_video_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_720/sara_720_black_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_720/sara_720_color_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_720/sara_720_image_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_720/sara_720_rois.rb +26 -0
- data/lib/User_Lib/rois/sara/sara_720/sara_720_text_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_720/sara_720_video_rois.rb +8 -0
- data/lib/User_Lib/rois/sara/sara_black_rois.rb +9 -0
- data/lib/User_Lib/rois/sara/sara_color_rois.rb +9 -0
- data/lib/User_Lib/rois/sara/sara_image_rois.rb +9 -0
- data/lib/User_Lib/rois/sara/sara_rois.rb +26 -0
- data/lib/User_Lib/rois/sara/sara_text_rois.rb +9 -0
- data/lib/User_Lib/rois/sara/sara_video_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_black_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_color_rois.rb +17 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_image_rois.rb +19 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_text_rois.rb +47 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_1080/iguide_1080_video_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_black_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_color_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_image_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_text_rois.rb +17 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_720/iguide_720_video_rois.rb +11 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_black_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_color_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_image_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_text_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/iguide/iguide_video_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_image_rois.rb +12 -0
- data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_text_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_1080/odn_1080_video_rois.rb +11 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_black_rois.rb +46 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_color_rois.rb +142 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_image_rois.rb +103 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_black_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_color_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_image_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_text_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_moto/odn_720_moto_video_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_black_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_color_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_image_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_text_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_sa/odn_720_sa_video_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_black_rois.rb +6 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_color_rois.rb +77 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_image_rois.rb +67 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_text_rois.rb +159 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_samsung/odn_720_samsung_video_rois.rb +17 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_text_rois.rb +221 -0
- data/lib/User_Lib/rois/stb/odn/odn_720/odn_720_video_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/odn/odn_black_rois.rb +10 -0
- data/lib/User_Lib/rois/stb/odn/odn_color_rois.rb +10 -0
- data/lib/User_Lib/rois/stb/odn/odn_image_rois.rb +58 -0
- data/lib/User_Lib/rois/stb/odn/odn_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/odn/odn_text_rois.rb +70 -0
- data/lib/User_Lib/rois/stb/odn/odn_video_rois.rb +19 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_black_rois.rb +16 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_color_rois.rb +373 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_black_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_color_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_image_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_text_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis_video_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_image_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_text_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris_video_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_image_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_text_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax_video_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_image_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_text_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch_video_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_image_rois.rb +1592 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_black_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_color_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_image_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_text_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace_video_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_text_rois.rb +2489 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_1080/spectrum_1080_video_rois.rb +64 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_black_rois.rb +7 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_color_rois.rb +63 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_image_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_text_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris_video_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_image_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_text_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax_video_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_black_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_color_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_image_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_rois.rb +26 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_text_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch_video_rois.rb +8 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_image_rois.rb +117 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_text_rois.rb +84 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_720/spectrum_720_video_rois.rb +35 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_black_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_color_rois.rb +17 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_image_rois.rb +49 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_text_rois.rb +51 -0
- data/lib/User_Lib/rois/stb/spectrum/spectrum_video_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/stb_black_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/stb_color_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/stb_image_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/stb_rois.rb +23 -0
- data/lib/User_Lib/rois/stb/stb_text_rois.rb +9 -0
- data/lib/User_Lib/rois/stb/stb_video_rois.rb +9 -0
- data/lib/User_Lib/rois/template.txt +23 -0
- data/lib/User_Lib/rois/text_rois.rb +36 -0
- data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_black_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_color_rois.rb +9 -0
- data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_image_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_rois.rb +23 -0
- data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_text_rois.rb +9 -0
- data/lib/User_Lib/rois/tivo/tivo_1080/tivo_1080_video_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_black_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_color_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_image_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_rois.rb +23 -0
- data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_text_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_720/tivo_720_video_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_black_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_color_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_image_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_rois.rb +23 -0
- data/lib/User_Lib/rois/tivo/tivo_text_rois.rb +7 -0
- data/lib/User_Lib/rois/tivo/tivo_video_rois.rb +7 -0
- data/lib/User_Lib/rois/video_rois.rb +33 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_dvr.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_guide.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_library.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_live_tv.rb +17 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_login.rb +24 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_main_menu.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_mini_guide.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_movies.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_on_demand.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_parental_controls.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_product_page.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_screen.rb +23 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_search.rb +31 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_settings.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_tv_shows.rb +25 -0
- data/lib/User_Lib/screen/apple_tv/apple_tv_video_store.rb +25 -0
- data/lib/User_Lib/screen/dta/dta_dvr.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_guide.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_library.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_live_tv.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_log_in.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_main_menu.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_mini_guide.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_movies.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_on_demand.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_parental_controls.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_product_page.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_screen.rb +24 -0
- data/lib/User_Lib/screen/dta/dta_search.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_settings.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_tv_shows.rb +26 -0
- data/lib/User_Lib/screen/dta/dta_video_store.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_dvr.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_guide.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_library.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_live_tv.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_log_in.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_main_menu.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_mini_guide.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_movies.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_on_demand.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_parental_controls.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_product_page.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_screen.rb +24 -0
- data/lib/User_Lib/screen/mdn/mdn_search.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_settings.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_tv_shows.rb +26 -0
- data/lib/User_Lib/screen/mdn/mdn_video_store.rb +26 -0
- data/lib/User_Lib/screen/mobile/android/android_devices.rb +35 -0
- data/lib/User_Lib/screen/mobile/android/android_dvr.rb +337 -0
- data/lib/User_Lib/screen/mobile/android/android_favorites.rb +164 -0
- data/lib/User_Lib/screen/mobile/android/android_guide.rb +256 -0
- data/lib/User_Lib/screen/mobile/android/android_live_tv.rb +372 -0
- data/lib/User_Lib/screen/mobile/android/android_login.rb +111 -0
- data/lib/User_Lib/screen/mobile/android/android_main_menu.rb +53 -0
- data/lib/User_Lib/screen/mobile/android/android_on_demand.rb +402 -0
- data/lib/User_Lib/screen/mobile/android/android_parental_controls.rb +73 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_dvr.rb +31 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_guide.rb +39 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_live_tv.rb +104 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_main_menu.rb +27 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_on_demand.rb +35 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_product_page.rb +7 -0
- data/lib/User_Lib/screen/mobile/android/android_phone/android_phone_search.rb +26 -0
- data/lib/User_Lib/screen/mobile/android/android_privacy_legal.rb +54 -0
- data/lib/User_Lib/screen/mobile/android/android_product_page.rb +484 -0
- data/lib/User_Lib/screen/mobile/android/android_screen.rb +56 -0
- data/lib/User_Lib/screen/mobile/android/android_search.rb +39 -0
- data/lib/User_Lib/screen/mobile/android/android_settings.rb +90 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_dvr.rb +58 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_guide.rb +24 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_live_tv.rb +24 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_main_menu.rb +19 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_on_demand.rb +16 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_product_page.rb +45 -0
- data/lib/User_Lib/screen/mobile/android/android_tablet/android_tablet_search.rb +14 -0
- data/lib/User_Lib/screen/mobile/devices_mobile.rb +53 -0
- data/lib/User_Lib/screen/mobile/dvr_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/favorites_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/guide_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/ios/ios_devices.rb +43 -0
- data/lib/User_Lib/screen/mobile/ios/ios_dvr.rb +231 -0
- data/lib/User_Lib/screen/mobile/ios/ios_favorites.rb +79 -0
- data/lib/User_Lib/screen/mobile/ios/ios_guide.rb +53 -0
- data/lib/User_Lib/screen/mobile/ios/ios_live_tv.rb +413 -0
- data/lib/User_Lib/screen/mobile/ios/ios_login.rb +76 -0
- data/lib/User_Lib/screen/mobile/ios/ios_main_menu.rb +38 -0
- data/lib/User_Lib/screen/mobile/ios/ios_on_demand.rb +371 -0
- data/lib/User_Lib/screen/mobile/ios/ios_parental_controls.rb +104 -0
- data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_dvr.rb +14 -0
- data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_live_tv.rb +36 -0
- data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_main_menu.rb +7 -0
- data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_on_demand.rb +7 -0
- data/lib/User_Lib/screen/mobile/ios/ios_phone/ios_phone_search.rb +13 -0
- data/lib/User_Lib/screen/mobile/ios/ios_privacy_legal.rb +56 -0
- data/lib/User_Lib/screen/mobile/ios/ios_product_page.rb +441 -0
- data/lib/User_Lib/screen/mobile/ios/ios_screen.rb +60 -0
- data/lib/User_Lib/screen/mobile/ios/ios_search.rb +145 -0
- data/lib/User_Lib/screen/mobile/ios/ios_settings.rb +34 -0
- data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_live_tv.rb +34 -0
- data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_main_menu.rb +7 -0
- data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_on_demand.rb +7 -0
- data/lib/User_Lib/screen/mobile/ios/ios_tablet/ios_tablet_search.rb +13 -0
- data/lib/User_Lib/screen/mobile/live_tv_mobile.rb +73 -0
- data/lib/User_Lib/screen/mobile/login_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/main_menu_mobile.rb +83 -0
- data/lib/User_Lib/screen/mobile/mobile_screen.rb +232 -0
- data/lib/User_Lib/screen/mobile/on_demand_mobile.rb +70 -0
- data/lib/User_Lib/screen/mobile/parental_controls_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/privacy_legal_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/product_page_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/search_mobile.rb +5 -0
- data/lib/User_Lib/screen/mobile/settings_mobile.rb +33 -0
- data/lib/User_Lib/screen/passport/passport_dvr.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_guide.rb +37 -0
- data/lib/User_Lib/screen/passport/passport_library.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_live_tv.rb +17 -0
- data/lib/User_Lib/screen/passport/passport_main_menu.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_mini_guide.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_movies.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_on_demand.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_parental_controls.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_product_page.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_screen.rb +23 -0
- data/lib/User_Lib/screen/passport/passport_search.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_settings.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_tv_shows.rb +25 -0
- data/lib/User_Lib/screen/passport/passport_video_store.rb +25 -0
- data/lib/User_Lib/screen/roku/brs/roku_guide_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_home_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_live_tv_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_login_brs.rb +103 -0
- data/lib/User_Lib/screen/roku/brs/roku_main_menu_brs.rb +46 -0
- data/lib/User_Lib/screen/roku/brs/roku_on_demand_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_product_page_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_screen_brs.rb +9 -0
- data/lib/User_Lib/screen/roku/brs/roku_search_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_settings_brs.rb +42 -0
- data/lib/User_Lib/screen/roku/brs/roku_watch_later_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/brs/roku_welcome_brs.rb +12 -0
- data/lib/User_Lib/screen/roku/roku_dvr.rb +7 -0
- data/lib/User_Lib/screen/roku/roku_guide.rb +590 -0
- data/lib/User_Lib/screen/roku/roku_home.rb +346 -0
- data/lib/User_Lib/screen/roku/roku_library.rb +26 -0
- data/lib/User_Lib/screen/roku/roku_live_tv.rb +210 -0
- data/lib/User_Lib/screen/roku/roku_login.rb +795 -0
- data/lib/User_Lib/screen/roku/roku_main_menu.rb +425 -0
- data/lib/User_Lib/screen/roku/roku_mini_guide.rb +7 -0
- data/lib/User_Lib/screen/roku/roku_on_demand.rb +479 -0
- data/lib/User_Lib/screen/roku/roku_product_page.rb +483 -0
- data/lib/User_Lib/screen/roku/roku_screen.rb +85 -0
- data/lib/User_Lib/screen/roku/roku_search.rb +229 -0
- data/lib/User_Lib/screen/roku/roku_settings.rb +304 -0
- data/lib/User_Lib/screen/roku/roku_watch_later.rb +51 -0
- data/lib/User_Lib/screen/roku/roku_welcome.rb +10 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_dvr.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_guide.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_home.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_library.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_live_tv.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_login.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_main_menu.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_mini_guide.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_on_demand.rb +26 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_product_page.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_screen.rb +7 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_search.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_settings.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_watch_later.rb +14 -0
- data/lib/User_Lib/screen/roku_tv/roku_tv_welcome.rb +14 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_dvr.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_guide.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_library.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_live_tv.rb +21 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_login.rb +13 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_main_menu.rb +64 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_mini_guide.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_movies.rb +140 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_on_demand.rb +76 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_parental_controls.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_product_page.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_screen.rb +74 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_search.rb +29 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_settings.rb +189 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_tv_shows.rb +24 -0
- data/lib/User_Lib/screen/samsung_tv/samsung_tv_video_store.rb +24 -0
- data/lib/User_Lib/screen/sara/sara_dvr.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_guide.rb +43 -0
- data/lib/User_Lib/screen/sara/sara_library.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_live_tv.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_log_in.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_main_menu.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_mini_guide.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_movies.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_on_demand.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_parental_controls.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_product_page.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_screen.rb +24 -0
- data/lib/User_Lib/screen/sara/sara_search.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_settings.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_tv_shows.rb +26 -0
- data/lib/User_Lib/screen/sara/sara_video_store.rb +26 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_devices.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_dvr.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_favorites.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_guide.rb +39 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_home.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_library.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_live_tv.rb +59 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_login.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_main_menu.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_mini_guide.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_movies.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_on_demand.rb +531 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_parental_controls.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_privacy_legal.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_product_page.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_quick_menu.rb +7 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_screen.rb +21 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_search.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_settings.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_tv_shows.rb +10 -0
- data/lib/User_Lib/screen/stb/iguide/iguide_video_store.rb +10 -0
- data/lib/User_Lib/screen/stb/login_stb.rb +5 -0
- data/lib/User_Lib/screen/stb/odn/odn_dvr.rb +59 -0
- data/lib/User_Lib/screen/stb/odn/odn_favorites.rb +8 -0
- data/lib/User_Lib/screen/stb/odn/odn_guide.rb +177 -0
- data/lib/User_Lib/screen/stb/odn/odn_live_tv.rb +115 -0
- data/lib/User_Lib/screen/stb/odn/odn_login.rb +8 -0
- data/lib/User_Lib/screen/stb/odn/odn_main_menu.rb +175 -0
- data/lib/User_Lib/screen/stb/odn/odn_on_demand.rb +1170 -0
- data/lib/User_Lib/screen/stb/odn/odn_on_demand_kids.rb +23 -0
- data/lib/User_Lib/screen/stb/odn/odn_on_demand_left_menu.rb +180 -0
- data/lib/User_Lib/screen/stb/odn/odn_parental_controls.rb +9 -0
- data/lib/User_Lib/screen/stb/odn/odn_product_page.rb +8 -0
- data/lib/User_Lib/screen/stb/odn/odn_screen.rb +111 -0
- data/lib/User_Lib/screen/stb/odn/odn_search.rb +167 -0
- data/lib/User_Lib/screen/stb/odn/odn_settings.rb +142 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_diagnostics.rb +27 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/screen_spectrum_docsis.rb +12 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_guide.rb +10 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_main_menu.rb +10 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_settings.rb +10 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_dvr.rb +1781 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_guide.rb +841 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_library.rb +384 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_live_tv.rb +259 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_main_menu.rb +223 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_mini_guide.rb +404 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_movies.rb +420 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_netflix.rb +37 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_on_demand.rb +2137 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_parental_controls.rb +528 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_pay_per_view.rb +26 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_product_page.rb +58 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_screen.rb +48 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_search.rb +92 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_settings.rb +1657 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_tv_shows.rb +1532 -0
- data/lib/User_Lib/screen/stb/spectrum/spectrum_video_store.rb +1598 -0
- data/lib/User_Lib/screen/stb/stb_screen.rb +7 -0
- data/lib/User_Lib/screen/tivo/tivo_dvr.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_guide.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_library.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_live_tv.rb +17 -0
- data/lib/User_Lib/screen/tivo/tivo_login.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_main_menu.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_mini_guide.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_movies.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_on_demand.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_parental_controls.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_product_page.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_screen.rb +20 -0
- data/lib/User_Lib/screen/tivo/tivo_search.rb +31 -0
- data/lib/User_Lib/screen/tivo/tivo_settings.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_tv_shows.rb +25 -0
- data/lib/User_Lib/screen/tivo/tivo_video_store.rb +25 -0
- data/lib/config/ConfigParams.xml +96 -0
- data/lib/config/ImageROI.xml +45 -0
- data/lib/config/ROI.xml +150 -0
- data/lib/config/Userlog4j.xml +62 -0
- data/lib/config/schema-docs/mode.xsd +12 -0
- data/lib/config/schema-docs/processTestJobs.xsd +63 -0
- data/lib/config/schema-docs/rackip.xsd +24 -0
- data/lib/copy_ref_images.rb +199 -0
- data/lib/copy_repo.rb +136 -0
- data/lib/diagnostics/conductor/conductor_checkup.tmc +24 -0
- data/lib/diagnostics/db/mad_db_check.tmc +56 -0
- data/lib/diagnostics/db/mas_db_checkup.tmc +24 -0
- data/lib/diagnostics/db/mas_db_checkup_gem.tmc +20 -0
- data/lib/diagnostics/db/mas_db_checkup_jar.tmc +50 -0
- data/lib/diagnostics/iguide/iguide_nvram_reset.tmc +23 -0
- data/lib/diagnostics/iguide/iguide_prepare_stb.tmc +33 -0
- data/lib/diagnostics/iguide/iguide_prepare_stb_and_health_check.tmc +63 -0
- data/lib/diagnostics/iguide/iguide_stb_health_check.tmc +54 -0
- data/lib/diagnostics/prepare_stb.tmc +30 -0
- data/lib/diagnostics/prepare_stb_and_health_check.tmc +56 -0
- data/lib/diagnostics/script_options/options_checkup.tmc +145 -0
- data/lib/diagnostics/server_components_check.tmc +62 -0
- data/lib/diagnostics/ssh/dncs_checkup.tmc +24 -0
- data/lib/diagnostics/ssh/mas_checkup.tmc +24 -0
- data/lib/diagnostics/stb_health_check.tmc +46 -0
- data/lib/diagnostics/stb_ip_check.tmc +120 -0
- data/lib/diagnostics/webservices/mas_rest_services_checkup.tmc +24 -0
- data/lib/diagnostics/webservices/mas_soap_services_checkup.tmc +24 -0
- data/lib/dsllib/common/dncs/dncs_utils.rb +449 -0
- data/lib/dsllib/common/mas_db/mas_conductor.rb +1328 -0
- data/lib/dsllib/common/mas_db/mas_db.rb +154 -0
- data/lib/dsllib/common/mas_db/mas_publish.rb +2349 -0
- data/lib/dsllib/common/mas_db/mas_rest_services.rb +75 -0
- data/lib/dsllib/common/mas_db/mas_soap_services.rb +540 -0
- data/lib/dsllib/common/mas_db/mas_utils.rb +422 -0
- data/lib/dsllib/common/remote_diagnostics/mdn_remote_diagnostics.rb +1335 -0
- data/lib/dsllib/common/remote_diagnostics/odn_web_server.rb +269 -0
- data/lib/dsllib/common/utils/excel_export.rb +273 -0
- data/lib/dsllib/common/utils/excel_module.rb +890 -0
- data/lib/dsllib/common/utils/server_components_utils.rb +130 -0
- data/lib/dsllib/common/utils/stb_health_check_utils.rb +92 -0
- data/lib/dsllib/common/utils/sword_utils.rb +393 -0
- data/lib/dsllib/common/utils/tmc_utils.rb +2944 -0
- data/lib/dsllib/common/utils/virtual_keyboard_navigator.rb +208 -0
- data/lib/dsllib/common/utils/virtual_keyboard_vp_navigator.rb +195 -0
- data/lib/dsllib/performance/DTA/roi.rb +214 -0
- data/lib/dsllib/performance/DTA/utils.rb +96 -0
- data/lib/dsllib/performance/iguide_concurrent_test/ROI.rb +236 -0
- data/lib/dsllib/performance/iguide_concurrent_test/utils.rb +533 -0
- data/lib/dsllib/performance/measure_tune.rb +438 -0
- data/lib/dsllib/performance/perf_lib.rb +660 -0
- data/lib/end_iteration.rb +4 -0
- data/lib/lib/data_services/channel.rb +39 -0
- data/lib/lib/data_services/data_services.rb +14 -0
- data/lib/lib/data_services/guide.rb +104 -0
- data/lib/lib/data_services/lineup.rb +114 -0
- data/lib/lib/data_services/program.rb +48 -0
- data/lib/lib/data_services/schedule.rb +18 -0
- data/lib/lib/data_services/splunk_connector.rb +135 -0
- data/lib/lib/data_services/splunk_data_reader.rb +77 -0
- data/lib/lib/element/element.rb +79 -0
- data/lib/lib/extensions/array_extensions.rb +32 -0
- data/lib/lib/extensions/datetime_extensions.rb +8 -0
- data/lib/lib/extensions/extensions.rb +51 -0
- data/lib/lib/extensions/file_extensions.rb +32 -0
- data/lib/lib/extensions/float_extensions.rb +32 -0
- data/lib/lib/extensions/integer_extensions.rb +39 -0
- data/lib/lib/extensions/nethttp_extensions.rb +11 -0
- data/lib/lib/extensions/object_extensions.rb +7 -0
- data/lib/lib/extensions/string_extensions.rb +35 -0
- data/lib/lib/helpers/tmc_helpers/csv_helper/csv_helper.rb +85 -0
- data/lib/lib/helpers/tmc_helpers/email_helper/email_helper.rb +71 -0
- data/lib/lib/helpers/tmc_helpers/http_helper/http_helper.rb +133 -0
- data/lib/lib/helpers/tmc_helpers/roi_helper/roi_helper.rb +17 -0
- data/lib/lib/helpers/tmc_helpers/snmp_helper/snmp_helper.rb +71 -0
- data/lib/lib/helpers/tmc_helpers/ssh_helper/ssh_helper.rb +337 -0
- data/lib/lib/helpers/tmc_helpers/tmc_helpers.rb +1260 -0
- data/lib/lib/keyboard/apple_tv/apple_tv_password_keyboard.rb +102 -0
- data/lib/lib/keyboard/apple_tv/apple_tv_search_keyboard.rb +103 -0
- data/lib/lib/keyboard/apple_tv/apple_tv_username_keyboard.rb +105 -0
- data/lib/lib/keyboard/keyboard.rb +504 -0
- data/lib/lib/keyboard/keyboard_layout.rb +51 -0
- data/lib/lib/keyboard/roku/roku_reset_pin_keyboard.rb +12 -0
- data/lib/lib/keyboard/roku/roku_rsg_search_keyboard.rb +67 -0
- data/lib/lib/keyboard/roku/roku_rsg_signin_keyboard.rb +106 -0
- data/lib/lib/keyboard/roku/roku_search_keyboard.rb +10 -0
- data/lib/lib/keyboard/roku/roku_signin_keyboard.rb +42 -0
- data/lib/lib/keyboard/samsung_tv/samsung_tv_search_keyboard.rb +50 -0
- data/lib/lib/keyboard/samsung_tv/samsung_tv_signin_keyboard.rb +52 -0
- data/lib/lib/keyboard/stb/odn/odn_on_demand_search_keyboard.rb +10 -0
- data/lib/lib/keyboard/stb/odn/odn_search_keyboard.rb +10 -0
- data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_email_keyboard.rb +50 -0
- data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_keyboard.rb +43 -0
- data/lib/lib/keyboard/stb/spectrum/spectrum_netflix_name_keyboard.rb +16 -0
- data/lib/lib/keyboard/stb/spectrum/spectrum_search_keyboard.rb +32 -0
- data/lib/lib/keyboard/tivo/tivo_password_keyboard.rb +0 -0
- data/lib/lib/keyboard/tivo/tivo_search_keyboard.rb +0 -0
- data/lib/lib/keyboard/tivo/tivo_username_keyboard.rb +0 -0
- data/lib/lib/keys/apple_tv/apple_tv_keys.rb +26 -0
- data/lib/lib/keys/base_keys.rb +14 -0
- data/lib/lib/keys/dta/dta_keys.rb +60 -0
- data/lib/lib/keys/mdn/mdn_keys.rb +60 -0
- data/lib/lib/keys/passport/passport_keys.rb +59 -0
- data/lib/lib/keys/roku/roku_keys.rb +31 -0
- data/lib/lib/keys/roku_tv/roku_tv_keys.rb +32 -0
- data/lib/lib/keys/samsung_tv/samsung_tv_keys.rb +58 -0
- data/lib/lib/keys/sara/sara_keys.rb +60 -0
- data/lib/lib/keys/stb/iguide/iguide_keys.rb +56 -0
- data/lib/lib/keys/stb/odn/odn_keys.rb +63 -0
- data/lib/lib/keys/stb/spectrum/spectrum_keys.rb +59 -0
- data/lib/lib/keys/stb/stb_keys.rb +13 -0
- data/lib/lib/keys/tivo/tivo_keys.rb +26 -0
- data/lib/lib/logger/multi_io.rb +14 -0
- data/lib/lib/logger/tmc_dut_logger.rb +251 -0
- data/lib/lib/logger/tmc_logger.rb +30 -0
- data/lib/lib/mixins/assignable.rb +19 -0
- data/lib/lib/mixins/can_have_special_methods.rb +50 -0
- data/lib/lib/mixins/enumish.rb +16 -0
- data/lib/lib/new_platform.rb +302 -0
- data/lib/lib/new_sub_platform.rb +90 -0
- data/lib/lib/platform/apple_tv/apple_tv.rb +33 -0
- data/lib/lib/platform/apple_tv/apple_tv_1080/apple_tv_1080.rb +54 -0
- data/lib/lib/platform/apple_tv/apple_tv_720/apple_tv_720.rb +14 -0
- data/lib/lib/platform/dta/dta.rb +35 -0
- data/lib/lib/platform/dta/dta_1080/dta_1080.rb +15 -0
- data/lib/lib/platform/dta/dta_720/dta_720.rb +15 -0
- data/lib/lib/platform/mdn/mdn.rb +35 -0
- data/lib/lib/platform/mdn/mdn_1080/mdn_1080.rb +15 -0
- data/lib/lib/platform/mdn/mdn_720/mdn_720.rb +15 -0
- data/lib/lib/platform/mobile/android/android.rb +23 -0
- data/lib/lib/platform/mobile/android/android_phone/android_phone.rb +23 -0
- data/lib/lib/platform/mobile/android/android_tablet/android_tablet.rb +23 -0
- data/lib/lib/platform/mobile/ios/ios.rb +23 -0
- data/lib/lib/platform/mobile/ios/ios_phone/ios_phone.rb +23 -0
- data/lib/lib/platform/mobile/ios/ios_tablet/ios_tablet.rb +23 -0
- data/lib/lib/platform/mobile/mobile.rb +102 -0
- data/lib/lib/platform/passport/passport.rb +41 -0
- data/lib/lib/platform/passport/passport1080/passport_1080.rb +15 -0
- data/lib/lib/platform/passport/passport_720/passport_720.rb +14 -0
- data/lib/lib/platform/platform.rb +884 -0
- data/lib/lib/platform/roku/roku.rb +96 -0
- data/lib/lib/platform/roku/roku_720/roku_720.rb +16 -0
- data/lib/lib/platform/roku_tv/roku_tv.rb +33 -0
- data/lib/lib/platform/roku_tv/roku_tv_1080/roku_tv_1080.rb +14 -0
- data/lib/lib/platform/roku_tv/roku_tv_720/roku_tv_720.rb +14 -0
- data/lib/lib/platform/samsung_tv/samsung_tv.rb +31 -0
- data/lib/lib/platform/samsung_tv/samsung_tv_1080/samsung_tv_1080.rb +14 -0
- data/lib/lib/platform/samsung_tv/samsung_tv_720/samsung_tv_720.rb +14 -0
- data/lib/lib/platform/sara/sara.rb +42 -0
- data/lib/lib/platform/sara/sara_1080/sara_1080.rb +15 -0
- data/lib/lib/platform/sara/sara_720/sara_720.rb +15 -0
- data/lib/lib/platform/stb/iguide/iguide.rb +18 -0
- data/lib/lib/platform/stb/iguide/iguide_1080/iguide_1080.rb +14 -0
- data/lib/lib/platform/stb/iguide/iguide_720/iguide_720.rb +14 -0
- data/lib/lib/platform/stb/odn/odn.rb +480 -0
- data/lib/lib/platform/stb/odn/odn_1080/odn_1080.rb +14 -0
- data/lib/lib/platform/stb/odn/odn_720/odn_720.rb +14 -0
- data/lib/lib/platform/stb/odn/odn_720/odn_720_moto/odn_720_moto.rb +14 -0
- data/lib/lib/platform/stb/odn/odn_720/odn_720_sa/odn_720_sa.rb +14 -0
- data/lib/lib/platform/stb/odn/odn_720/odn_720_samsung/odn_720_samsung.rb +14 -0
- data/lib/lib/platform/stb/spectrum/spectrum.rb +48 -0
- data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080.rb +14 -0
- data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis/spectrum_1080_docsis.rb +16 -0
- data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_arris/spectrum_1080_docsis_arris.rb +15 -0
- data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_humax/spectrum_1080_docsis_humax.rb +15 -0
- data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_docsis_tch/spectrum_1080_docsis_tch.rb +15 -0
- data/lib/lib/platform/stb/spectrum/spectrum_1080/spectrum_1080_pace/spectrum_1080_pace.rb +14 -0
- data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720.rb +14 -0
- data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_arris/spectrum_720_docsis_arris.rb +15 -0
- data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_humax/spectrum_720_docsis_humax.rb +15 -0
- data/lib/lib/platform/stb/spectrum/spectrum_720/spectrum_720_docsis_tch/spectrum_720_docsis_tch.rb +15 -0
- data/lib/lib/platform/stb/stb.rb +93 -0
- data/lib/lib/platform/template.txt +16 -0
- data/lib/lib/platform/tivo/tivo.rb +28 -0
- data/lib/lib/platform/tivo/tivo_1080/tivo_1080.rb +15 -0
- data/lib/lib/platform/tivo/tivo_720/tivo_720.rb +14 -0
- data/lib/lib/platform/web/web.rb +51 -0
- data/lib/lib/platform_libs/roku/roku_controller.rb +254 -0
- data/lib/lib/prereqs/prereqs.rb +17 -0
- data/lib/lib/prereqs/prereqs_for_dut.rb +14 -0
- data/lib/lib/prereqs/prereqs_for_test.rb +14 -0
- data/lib/lib/remotes/remotes.rb +8 -0
- data/lib/lib/remotes/stb/spectrum/spectrum_remotes.rb +22 -0
- data/lib/lib/roi/black/black_roi.rb +125 -0
- data/lib/lib/roi/color/color_roi.rb +138 -0
- data/lib/lib/roi/image/image_roi.rb +187 -0
- data/lib/lib/roi/roi.rb +1064 -0
- data/lib/lib/roi/template_roi.txt +9 -0
- data/lib/lib/roi/text/text_roi.rb +187 -0
- data/lib/lib/roi/video/video_roi.rb +98 -0
- data/lib/lib/screen/screen.rb +183 -0
- data/lib/lib/screen/template.txt +7 -0
- data/lib/lib/screen/template_screen.txt +10 -0
- data/lib/lib/screens/apple_tv/apple_tv_screens.rb +44 -0
- data/lib/lib/screens/dta/dta_screens.rb +49 -0
- data/lib/lib/screens/mdn/mdn_screens.rb +49 -0
- data/lib/lib/screens/mobile/android/android_phone/android_phone_screens.rb +28 -0
- data/lib/lib/screens/mobile/android/android_screens.rb +40 -0
- data/lib/lib/screens/mobile/android/android_tablet/android_tablet_screens.rb +29 -0
- data/lib/lib/screens/mobile/ios/ios_phone/ios_phone_screens.rb +22 -0
- data/lib/lib/screens/mobile/ios/ios_screens.rb +39 -0
- data/lib/lib/screens/mobile/ios/ios_tablet/ios_tablet_screens.rb +20 -0
- data/lib/lib/screens/mobile/mobile_screens.rb +18 -0
- data/lib/lib/screens/passport/passport_screens.rb +42 -0
- data/lib/lib/screens/roku/roku_screens.rb +72 -0
- data/lib/lib/screens/roku_tv/roku_tv_screens.rb +43 -0
- data/lib/lib/screens/samsung_tv/samsung_tv_screens.rb +44 -0
- data/lib/lib/screens/sara/sara_screens.rb +49 -0
- data/lib/lib/screens/screens.rb +23 -0
- data/lib/lib/screens/stb/iguide/iguide_1080/iguide_1080_screens.rb +56 -0
- data/lib/lib/screens/stb/iguide/iguide_720/iguide_720_screens.rb +56 -0
- data/lib/lib/screens/stb/iguide/iguide_screens.rb +54 -0
- data/lib/lib/screens/stb/odn/odn_screens.rb +40 -0
- data/lib/lib/screens/stb/spectrum/spectrum_docsis/spectrum_1080_docsis_screens.rb +18 -0
- data/lib/lib/screens/stb/spectrum/spectrum_screens.rb +48 -0
- data/lib/lib/screens/stb/stb_screens.rb +13 -0
- data/lib/lib/screens/template.txt +52 -0
- data/lib/lib/screens/tivo/tivo_screens.rb +44 -0
- data/lib/lib/selenium/appium/appium.rb +388 -0
- data/lib/lib/selenium/selenium.rb +466 -0
- data/lib/lib/selenium/webdriver/webdriver.rb +254 -0
- data/lib/lib/test_case/boilerplate/functional.rb +7 -0
- data/lib/lib/test_case/boilerplate/performance.rb +7 -0
- data/lib/lib/test_case/ci_test.rb +47 -0
- data/lib/lib/test_case/functional_test_case.rb +27 -0
- data/lib/lib/test_case/make_boilerplate.rb +32 -0
- data/lib/lib/test_case/monitoring/apple_monitor.rb +104 -0
- data/lib/lib/test_case/monitoring/base_monitor.rb +140 -0
- data/lib/lib/test_case/monitoring/dta_monitor.rb +53 -0
- data/lib/lib/test_case/monitoring/iguide_monitor.rb +72 -0
- data/lib/lib/test_case/monitoring/mdn_monitor.rb +28 -0
- data/lib/lib/test_case/monitoring/monitoring_test.rb +111 -0
- data/lib/lib/test_case/monitoring/odn_monitor.rb +137 -0
- data/lib/lib/test_case/monitoring/passport_monitor.rb +50 -0
- data/lib/lib/test_case/monitoring/report_monitor.rb +178 -0
- data/lib/lib/test_case/monitoring/roku_monitor.rb +102 -0
- data/lib/lib/test_case/monitoring/sara_monitor.rb +33 -0
- data/lib/lib/test_case/monitoring/spec_monitor.rb +154 -0
- data/lib/lib/test_case/performance_test_case.rb +29 -0
- data/lib/lib/test_case/test_case.rb +1055 -0
- data/lib/lib/test_case/test_error.rb +29 -0
- data/lib/lib/test_case/test_exception.rb +9 -0
- data/lib/lib/test_case/test_status.rb +39 -0
- data/lib/lib/test_case/test_step.rb +156 -0
- data/lib/lib/test_case/test_trace.rb +80 -0
- data/lib/lib/test_data.rb +222 -0
- data/lib/lib/test_wrapper.rb +146 -0
- data/lib/misc/get_latest_android.sh +14 -0
- data/lib/misc/get_latest_ios.sh +14 -0
- data/lib/package-lock.json +3 -0
- data/lib/run_test.rb +4 -0
- data/lib/script_validator.rb +48 -0
- data/lib/syntax_eval.rb +151 -0
- data/lib/tools/convert_old_scripts.rb +100 -0
- data/lib/tools/find_duplicate_rois.rb +27 -0
- data/lib/tools/roku/inspector.rb +130 -0
- data/lib/tools/syntax_checker.rb +83 -0
- data/lib/upload_ref_images.rb +255 -0
- metadata +912 -0
@@ -0,0 +1,2944 @@
|
|
1
|
+
#Test automation script version# TA-5.5.mdn released time stamp: 12-03-12 14:40:20
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'net/telnet'
|
5
|
+
require 'nokogiri'
|
6
|
+
require 'timeout'
|
7
|
+
require 'yaml'
|
8
|
+
require './dsllib/common/dncs/dncs_utils'
|
9
|
+
require './dsllib/common/mas_db/mas_utils'
|
10
|
+
require './dsllib/common/utils/stb_health_check_utils'
|
11
|
+
require './dsllib/common/utils/sword_utils'
|
12
|
+
require './dsllib/common/mas_db/mas_db'
|
13
|
+
require './dsllib/common/mas_db/mas_conductor'
|
14
|
+
require './dsllib/common/remote_diagnostics/mdn_remote_diagnostics'
|
15
|
+
require './dsllib/common/remote_diagnostics/odn_web_server'
|
16
|
+
require './lib/selenium/appium/appium'
|
17
|
+
require './lib/extensions/extensions'
|
18
|
+
|
19
|
+
module LegacyLogging
|
20
|
+
# Public: DEPRECATED
|
21
|
+
def loginfo m, c=false, l=false, _="OCR", i=nil
|
22
|
+
p = '*WARNING* The `loginfo\' method is deprecated. '
|
23
|
+
logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Public: DEPRECATED
|
27
|
+
def loginfo2 m, c=false, l=false, _="OCR", i=nil
|
28
|
+
p = '*WARNING* The `loginfo2\' method is deprecated. '
|
29
|
+
logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Public: DEPRECATED
|
33
|
+
def loginfo3 m, c=true, l=true, _="OCR", i=nil
|
34
|
+
p = '*WARNING* The `loginfo3\' method is deprecated. '
|
35
|
+
# Update screen capture flag according to global flag
|
36
|
+
logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Public: DEPRECATED
|
40
|
+
def loginfo4 m, c=true, l=false, _="OCR", i=nil
|
41
|
+
p = '*WARNING* The `loginfo4\' method is deprecated. '
|
42
|
+
# Update screen capture flag according to global flag
|
43
|
+
logger.info(p + m, screenshot: c, use_last_image: l, screen_image: i)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Public: DEPRECATED
|
47
|
+
def logdebug m, c=false, l=false
|
48
|
+
p = '*WARNING* The `logdebug\' method is deprecated. '
|
49
|
+
# Update screen capture flag according to global flag
|
50
|
+
logger.info(p + m, screenshot: c, use_last_image: l)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module TmcUtils
|
55
|
+
include SwordUtils
|
56
|
+
|
57
|
+
# below file no longer exists. what was the purpose of requiring it here?
|
58
|
+
# require_lib_file 'test_cases/libraries/mobile/common/common'
|
59
|
+
def append_to_file (filename, text)
|
60
|
+
File.open(filename, 'a') do |f|
|
61
|
+
f.puts text
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def read_from_file (filename)
|
66
|
+
text_read=""
|
67
|
+
File.open(filename, "r") do |f|
|
68
|
+
f.each_line do |line|
|
69
|
+
text_read+= line
|
70
|
+
end
|
71
|
+
end
|
72
|
+
return text_read
|
73
|
+
end
|
74
|
+
|
75
|
+
def write_to_file (filename, text)
|
76
|
+
File.open(filename, 'w') do|f|
|
77
|
+
f.write(text)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Override exec_mas_cmd to use script option values over TMC configured values
|
82
|
+
def exec_mas_cmd(command, immediately: false)
|
83
|
+
mas_ip = test_data[:mas_server_ip]
|
84
|
+
mas_prompt = test_data[:mas_server_prompt]
|
85
|
+
mas_username = test_data[:mas_username]
|
86
|
+
mas_password = test_data[:mas_password]
|
87
|
+
retry_count = 3
|
88
|
+
begin
|
89
|
+
# Random sleep to avoid connection failure
|
90
|
+
unless immediately
|
91
|
+
sleep_time = rand(60)
|
92
|
+
logger.debug("Random sleep for MAS command : [#{sleep_time}] seconds")
|
93
|
+
sleep sleep_time.sec
|
94
|
+
end
|
95
|
+
if @ssh_to_mas.nil?
|
96
|
+
@ssh_to_mas = ssh_to(mas_ip, mas_username, password: mas_password)
|
97
|
+
end
|
98
|
+
@ssh_to_mas.send_command(command, timeout: 10.sec)#, prompt: mas_prompt, expect: nil)
|
99
|
+
rescue StandardError => e
|
100
|
+
retry_count = retry_count - 1
|
101
|
+
retry if retry_count > 0
|
102
|
+
raise e
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Override exec_dncs_cmd to use script option values over TMC configured values
|
107
|
+
def exec_dncs_cmd(command, immediately: false)
|
108
|
+
dncs_ip = test_data[:dncs_server_ip]
|
109
|
+
dncs_prompt = test_data[:dncs_server_prompt]
|
110
|
+
dncs_username = test_data[:dncs_username]
|
111
|
+
dncs_password = test_data[:dncs_password]
|
112
|
+
retry_count = 3
|
113
|
+
begin
|
114
|
+
# Random sleep to avoid connection failure
|
115
|
+
unless immediately
|
116
|
+
sleep_time = rand(60)
|
117
|
+
logger.debug("Random sleep for DNCS command : [#{sleep_time}] seconds")
|
118
|
+
sleep sleep_time.sec
|
119
|
+
end
|
120
|
+
if @ssh_to_dncs.nil?
|
121
|
+
@ssh_to_dncs = ssh_to(dncs_ip, dncs_username, password: dncs_password)
|
122
|
+
end
|
123
|
+
full_cmd = ". ./.profile > /dev/null 2>&1 && #{command}"
|
124
|
+
@ssh_to_dncs.send_command(full_cmd, timeout: 10.sec)#, prompt: dncs_prompt, expect: nil)
|
125
|
+
rescue StandardError => e
|
126
|
+
retry_count = retry_count - 1
|
127
|
+
retry if retry_count > 0
|
128
|
+
raise e
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Override reboot_stb_from_mas to use script option values over TMC configured values
|
133
|
+
def reboot_stb_from_mas(delay = 0)
|
134
|
+
mas_reboot_stb_with_delay(delay)
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
# Use this to convert epoch time back to seconds since the epoch
|
139
|
+
# * *Returns* :
|
140
|
+
# - seconds since the specifed epoch as a float
|
141
|
+
def from_epoch_time(epoch_time)
|
142
|
+
epoch_time.to_f / 1000
|
143
|
+
end
|
144
|
+
|
145
|
+
# Use it to verify vendor of the stb
|
146
|
+
# * *Args* :
|
147
|
+
# - +vendor+ -> Vendor to be verified ('cisco', 'samsung', 'motorola', 'pace', 'pioneer')
|
148
|
+
# * *Returns* :
|
149
|
+
# - true if stb is of given vendor else false
|
150
|
+
def stb_vendor? vendor
|
151
|
+
stb_model = fetch_stb_model
|
152
|
+
if vendor.casecmp('cisco') == 0
|
153
|
+
return true if stb_model.start_with?('SA') || stb_model == "Spectrum101_C"
|
154
|
+
elsif vendor.casecmp('samsung') == 0
|
155
|
+
return true if stb_model.start_with?('SMTH')
|
156
|
+
elsif vendor.casecmp('motorola') == 0
|
157
|
+
return true if stb_model.start_with?('DCX')
|
158
|
+
elsif vendor.casecmp('pace') == 0
|
159
|
+
return true if stb_model.start_with?('P')
|
160
|
+
elsif vendor.casecmp('pioneer') == 0
|
161
|
+
return true if stb_model.start_with?('V')
|
162
|
+
else
|
163
|
+
loginfo2 "Vendor not recognized [#{vendor}]"
|
164
|
+
end
|
165
|
+
|
166
|
+
return false
|
167
|
+
end
|
168
|
+
|
169
|
+
# Use it to check whether stb is capable of ODN, MDN, DVR, etc or not
|
170
|
+
# * *Args* :
|
171
|
+
# - +args+ -> check options list (comma separated)
|
172
|
+
# * *Returns* :
|
173
|
+
# - true if stb is capable for options else false
|
174
|
+
def stb_capable_of? (*args)
|
175
|
+
#return !$rti_flag if(args[0]=="ODN")
|
176
|
+
return stb_model_capable_of?(fetch_stb_model, *args)
|
177
|
+
end
|
178
|
+
|
179
|
+
# Use it to check whether given stb is capable of ODN, MDN, DVR, etc or not
|
180
|
+
# * *Args* :
|
181
|
+
# - +model+ -> model name of STB
|
182
|
+
# - +args+ -> check options list (comma separated)
|
183
|
+
# * *Returns* :
|
184
|
+
# - true if stb is capable for options else false
|
185
|
+
def stb_model_capable_of? (stbmodel, *args)
|
186
|
+
result = true
|
187
|
+
#TODO: put these options in the test data? restore STB registry? etc.
|
188
|
+
return false
|
189
|
+
args.each{|option|
|
190
|
+
if (option.casecmp('ODN') == 0 && !StbRegistry.odn?(stbmodel))
|
191
|
+
result = false
|
192
|
+
#logdebug "ODN : false"
|
193
|
+
elsif (option.casecmp('MDN') == 0 && !StbRegistry.mdn?(stbmodel))
|
194
|
+
result = false
|
195
|
+
#logdebug "MDN : false"
|
196
|
+
elsif (option.casecmp('DVR') == 0 && !StbRegistry.dvr_capable?(stbmodel))
|
197
|
+
result = false
|
198
|
+
#logdebug "DVR : false"
|
199
|
+
elsif (option.casecmp('NONDVR') == 0 && StbRegistry.dvr_capable?(stbmodel))
|
200
|
+
result = false
|
201
|
+
#logdebug "NONDVR : false"
|
202
|
+
elsif (option.casecmp('HD') == 0 && !StbRegistry.hd_capable?(stbmodel))
|
203
|
+
result = false
|
204
|
+
#logdebug "HD : false"
|
205
|
+
elsif (option.casecmp('SD') == 0 && StbRegistry.hd_capable?(stbmodel))
|
206
|
+
result = false
|
207
|
+
#logdebug "SD : false"
|
208
|
+
elsif (option.casecmp('LOWMEMORY') == 0 && !StbRegistry.low_memory_box?(stbmodel))
|
209
|
+
result = false
|
210
|
+
#logdebug "Low memory : false"
|
211
|
+
elsif (option.casecmp('ADSG') == 0 && !StbRegistry.adsg_capable?(stbmodel))
|
212
|
+
result = false
|
213
|
+
#logdebug "ADSG : false"
|
214
|
+
elsif (option.casecmp('ANALOG') == 0 && !StbRegistry.analog_channels_supported?(stbmodel))
|
215
|
+
result = false
|
216
|
+
#logdebug "Analog channel supported : false"
|
217
|
+
elsif (option.casecmp('HDMI') == 0 && !StbRegistry.hdmi_supported?(stbmodel))
|
218
|
+
result = false
|
219
|
+
#logdebug "HDMI port : false"
|
220
|
+
elsif (option.casecmp('NONHDMI') == 0 && StbRegistry.hdmi_supported?(stbmodel))
|
221
|
+
result = false
|
222
|
+
#logdebug "Does not have HDMI port : false"
|
223
|
+
elsif (option.casecmp('TUNERCOUNT1') == 0 && StbRegistry.tuner_count(stbmodel) != 1)
|
224
|
+
result = false
|
225
|
+
#logdebug "TUNERCOUNT 1 : false"
|
226
|
+
elsif (option.casecmp('TUNERCOUNT2') == 0 && StbRegistry.tuner_count(stbmodel) != 2)
|
227
|
+
result = false
|
228
|
+
#logdebug "TUNERCOUNT 2 : false"
|
229
|
+
elsif (option.casecmp('PIP') == 0 && !StbRegistry.pip_capable?(stbmodel))
|
230
|
+
result = false
|
231
|
+
#logdebug "PIP capable : false"
|
232
|
+
elsif (option.casecmp('MOCA') == 0 && !StbRegistry.moca_capable?(stbmodel))
|
233
|
+
result = false
|
234
|
+
#logdebug "MOCA capable : false"
|
235
|
+
end
|
236
|
+
}
|
237
|
+
|
238
|
+
return result
|
239
|
+
end
|
240
|
+
|
241
|
+
# Use it to reset packages on current STB
|
242
|
+
# * *Returns* :
|
243
|
+
# - true if successfully reset packages else false
|
244
|
+
def _reset_packages_for_stb
|
245
|
+
loginfo "Resetting packages on STB ..."
|
246
|
+
begin
|
247
|
+
# Get default package list from config file
|
248
|
+
required_packages = StbRegistry.required_packages fetch_stb_model
|
249
|
+
not_required_packages = StbRegistry.not_required_packages fetch_stb_model
|
250
|
+
# Reset packages
|
251
|
+
(return false unless add_pkg_on_dncs(required_packages,false)) unless required_packages.empty?
|
252
|
+
(return false unless remove_pkg_from_dncs(not_required_packages,false)) unless not_required_packages.empty?
|
253
|
+
rescue StandardError => e
|
254
|
+
loginfo2 "Exception raised while adding/removing packages",false
|
255
|
+
loginfo2 "Error msg : #{e.message}",false
|
256
|
+
logdebug e.backtrace.join("\n")
|
257
|
+
return false
|
258
|
+
end
|
259
|
+
|
260
|
+
loginfo2 "Successfully reset packages",false
|
261
|
+
return true
|
262
|
+
end
|
263
|
+
|
264
|
+
# Use it to reset packages on current STB
|
265
|
+
# * *Returns* :
|
266
|
+
# - true if successfully reset packages else false
|
267
|
+
def _reset_credit_limit_for_stb
|
268
|
+
loginfo "Resetting credit limit to 65000 ..."
|
269
|
+
begin
|
270
|
+
return false unless set_credit_limit_for_stb_from_dncs(65000,false)
|
271
|
+
rescue StandardError => e
|
272
|
+
loginfo2 "Exception raised while setting credit limit to - 65000",false
|
273
|
+
loginfo2 "Error msg : #{e.message}",false
|
274
|
+
logdebug e.backtrace.join("\n")
|
275
|
+
return false
|
276
|
+
end
|
277
|
+
|
278
|
+
loginfo2 "Successfully reset credit limit",false
|
279
|
+
return true
|
280
|
+
end
|
281
|
+
|
282
|
+
# Private method
|
283
|
+
# Use it to reset pin to 0000 (either PC pin or purchase pin)
|
284
|
+
def _reset_pin_to_4_zeros
|
285
|
+
# Verify that PIN entry has come up.
|
286
|
+
unless settings_screen_pin_entry_banner_appears?
|
287
|
+
loginfo2 'Pin entry screen does not appear',true
|
288
|
+
return false
|
289
|
+
end
|
290
|
+
|
291
|
+
pin = '0000'
|
292
|
+
pin_numbers = pin.chars.to_a
|
293
|
+
return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
|
294
|
+
|
295
|
+
if settings_screen_pin_entry_banner_title_message 'Incorrect'
|
296
|
+
loginfo2 "Incorrect pin: #{pin}",true,true
|
297
|
+
|
298
|
+
pin = '1234'
|
299
|
+
pin_numbers = pin.chars.to_a
|
300
|
+
return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
|
301
|
+
|
302
|
+
if settings_screen_pin_entry_banner_title_message 'Incorrect'
|
303
|
+
loginfo2 "Invalid pin [0000] or [1234]"
|
304
|
+
return false
|
305
|
+
end
|
306
|
+
else
|
307
|
+
loginfo2 "Pin [0000] verified no need to change"
|
308
|
+
return true
|
309
|
+
end
|
310
|
+
|
311
|
+
# Verify message for new pin entry screen
|
312
|
+
unless settings_screen_pin_entry_banner_title_message 'Enter'
|
313
|
+
loginfo2 "Failed to verify pin entry banner message - Enter your new PIN", true
|
314
|
+
return false
|
315
|
+
end
|
316
|
+
|
317
|
+
# Enter new pin
|
318
|
+
loginfo2 "New pin : 0000"
|
319
|
+
new_pin = '0000'
|
320
|
+
pin_numbers = new_pin.chars.to_a
|
321
|
+
return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
|
322
|
+
|
323
|
+
# Verify re-enter pin screen
|
324
|
+
unless (settings_screen_pin_entry_banner_title_message 'Re-Enter')
|
325
|
+
loginfo2 "Failed to verify pin entry banner message - Re-Enter your new PIN", true
|
326
|
+
return false
|
327
|
+
end
|
328
|
+
|
329
|
+
# Re-enter new pin
|
330
|
+
return false unless _settings_screen_enter_pin_and_verify_asterisks(pin_numbers)
|
331
|
+
return true
|
332
|
+
end
|
333
|
+
|
334
|
+
# Private method
|
335
|
+
# Use it to reset PC pin
|
336
|
+
# Assumption !! - OLD pin will be either 0000 or 1234
|
337
|
+
def _reset_pc_pin
|
338
|
+
# try to set to 0000 from 1234
|
339
|
+
reset_pin_from_mas = false
|
340
|
+
begin
|
341
|
+
settings_launch_and_verify
|
342
|
+
return false unless settings_screen_navigate_to_tab('PARENTAL CONTROL')
|
343
|
+
return false unless settings_screen_navigate_vertically_to('Blocking PIN', 10, 5)
|
344
|
+
press_select_sleep
|
345
|
+
|
346
|
+
unless _reset_pin_to_4_zeros
|
347
|
+
tcfail "Failed to reset pin to 0000"
|
348
|
+
end
|
349
|
+
press_exit_sleep # exit to full screen
|
350
|
+
|
351
|
+
loginfo2 "PC pin verified successfully",false
|
352
|
+
return true
|
353
|
+
rescue TestException => e
|
354
|
+
loginfo2 e.message
|
355
|
+
unless reset_pin_from_mas
|
356
|
+
change_parental_control_pin_from_mas('0000')
|
357
|
+
loginfo2 "Sleeping for 2 min ..."
|
358
|
+
sleep 2.min
|
359
|
+
reset_pin_from_mas = true
|
360
|
+
retry
|
361
|
+
end
|
362
|
+
loginfo2 "Failed to reset PC pin",true,false
|
363
|
+
return false
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
# Private method
|
368
|
+
# Use it to reset purchase pin
|
369
|
+
# Assumption !! - OLD pin will be either 0000 or 1234
|
370
|
+
def _reset_purchase_pin
|
371
|
+
# try to set to 0000 from 1234
|
372
|
+
reset_pin_from_mas = false
|
373
|
+
begin
|
374
|
+
settings_launch_and_verify
|
375
|
+
return false unless settings_screen_navigate_to_tab('Purchases')
|
376
|
+
return false unless settings_screen_navigate_vertically_to('Purchase PIN', 10, 5)
|
377
|
+
|
378
|
+
if settings_verify_status?('OFF')
|
379
|
+
press_select_sleep # to navigate to option to enable purchase pin
|
380
|
+
press_select_sleep # to enable purchase pin
|
381
|
+
return false unless settings_verify_status?('ON')
|
382
|
+
end
|
383
|
+
|
384
|
+
press_select_sleep # to select purchase pin option
|
385
|
+
|
386
|
+
return false unless settings_navigate_to_option('Change PIN',10)
|
387
|
+
press_select_sleep
|
388
|
+
|
389
|
+
return false unless _reset_pin_to_4_zeros
|
390
|
+
press_exit_sleep # exit to full screen
|
391
|
+
|
392
|
+
loginfo2 "Purchase pin verified successfully",false
|
393
|
+
return true
|
394
|
+
rescue TestException => e
|
395
|
+
loginfo2 e.message
|
396
|
+
unless reset_pin_from_mas
|
397
|
+
loginfo2 "Resetting pin using mas command ..."
|
398
|
+
change_purchase_pin_from_mas('0000')
|
399
|
+
loginfo2 "Sleeping for 2 min ..."
|
400
|
+
sleep 2.min
|
401
|
+
reset_pin_from_mas = true
|
402
|
+
retry
|
403
|
+
end
|
404
|
+
loginfo2 "Failed to reset purchase pin",true,false
|
405
|
+
return false
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
# Private method
|
410
|
+
# Use it to rest STB state
|
411
|
+
def _reset_stb(ignore_dvr_setup=false)
|
412
|
+
# Reset packages and credit limit for STB
|
413
|
+
_reset_stb_failed "Failed to reset packages" unless _reset_packages_for_stb
|
414
|
+
_reset_stb_failed "Failed to reset credit limit" unless _reset_credit_limit_for_stb
|
415
|
+
|
416
|
+
# Reboot STB to reset it's state
|
417
|
+
loginfo2 "Rebooting stb to reset state ...",false
|
418
|
+
(_reset_stb_failed "Failed to reboot STB using AC power") unless stb_reboot_using_ac_power
|
419
|
+
(_reset_stb_failed "Failed to Reboot STB") unless stb_wait_till_finish_rebooting(true)
|
420
|
+
loginfo2 "Successfully rebooted STB",false
|
421
|
+
|
422
|
+
# check whether STB is having valid ip or not
|
423
|
+
loginfo2 "Verifying valid IP ..."
|
424
|
+
unless has_valid_ip?
|
425
|
+
_reset_stb_failed "STB is not having valid IP, Please check STB MAC"
|
426
|
+
end
|
427
|
+
|
428
|
+
# Change default language to english if it's SPANISH
|
429
|
+
loginfo "Changing default launguage to English if it is Spanish"
|
430
|
+
_reset_stb_failed 'Failed to set language to English.' unless settings_screen_launch_and_reset_language_from_spanish_to_english
|
431
|
+
|
432
|
+
# Reset PC pin
|
433
|
+
loginfo2 "Resetting PC pin to [0000]"
|
434
|
+
_reset_stb_failed "Failed to reset PC pin to 0000" unless _reset_pc_pin
|
435
|
+
loginfo2 "Resetting Purchase pin to [0000]"
|
436
|
+
_reset_stb_failed "Failed to reset purchase pin to 0000" unless _reset_purchase_pin
|
437
|
+
loginfo2 "Enabling IPPV from DNCS ..."
|
438
|
+
_reset_stb_failed "Failed to enable IPPV flag" unless enable_ippv_from_dncs(false)
|
439
|
+
loginfo2 "Sleeping for 2 mins so that STB will get message from MAS and reset PIN ..."
|
440
|
+
sleep 2.min
|
441
|
+
loginfo2 "Successfully reset PC pin to [0000]"
|
442
|
+
loginfo2 "Successfully reset Purchase pin to [0000]"
|
443
|
+
|
444
|
+
# Reset PIP
|
445
|
+
if stb_capable_of?('PIP')
|
446
|
+
loginfo2 "Resetting PIP by powering OFF and ON STB ..."
|
447
|
+
_reset_stb_failed "Unable to power off STB" unless power_off_stb?
|
448
|
+
_reset_stb_failed "Unable to power on STB" unless power_on_stb?
|
449
|
+
loginfo2 "Successfully reset PIP window"
|
450
|
+
end
|
451
|
+
|
452
|
+
# Tuning to home channel
|
453
|
+
loginfo2 "Tuning to home channel : [#{fetch_option(:a_home_channel)}] ..."
|
454
|
+
press_exit_sleep
|
455
|
+
tune_immediately_to fetch_option(:a_home_channel)
|
456
|
+
# Resolved tuning conflict for DVR STBs
|
457
|
+
if stb_capable_of?('DVR') and record_screen_tuning_conflict_banner_appears?
|
458
|
+
if (stb_capable_of?('ODN') or stb_capable_of?('MDN'))
|
459
|
+
press_down_arrow_sleep
|
460
|
+
else
|
461
|
+
_reset_stb_failed "Not a valid STB type : #{fetch_stb_model}"
|
462
|
+
return false
|
463
|
+
end
|
464
|
+
end
|
465
|
+
press_exit_sleep
|
466
|
+
|
467
|
+
# Ignore pc pin error and continue with test case execution
|
468
|
+
loginfo2 "Turning OFF parental control"
|
469
|
+
begin
|
470
|
+
# set pc off
|
471
|
+
settings_launch_and_verify(true)
|
472
|
+
_reset_stb_failed "[Setup] failed to set parental control - OFF" unless settings_screen_set_parental_control_status('OFF')
|
473
|
+
# setting set transparency off (Not available in ODN52)
|
474
|
+
(_reset_stb_failed "[Setup] failed to set transparency - OFF" unless settings_screen_set_transparency('OFF')) if (fetch_option(:transparency_modifiable).casecmp('true') == 0) and stb_capable_of?('ODN')
|
475
|
+
press_exit_sleep
|
476
|
+
loginfo2 "Successfully turned OFF parental control and transparency"
|
477
|
+
rescue TestException => e
|
478
|
+
_reset_stb_failed "Settings error : #{e.message}"
|
479
|
+
press_exit_sleep
|
480
|
+
end
|
481
|
+
|
482
|
+
return if ignore_dvr_setup # return if dvr setup is not required
|
483
|
+
|
484
|
+
# Cleanup recordings for DVR STBs
|
485
|
+
begin
|
486
|
+
dvr_setup
|
487
|
+
rescue StandardError => e
|
488
|
+
_reset_stb_failed "[DVR setup] : #{e.message}"
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
# Private method
|
493
|
+
# Use it to clean up existing scheculed recordings and last two days recorded programs
|
494
|
+
def _stb_clean_up_recordings
|
495
|
+
# Launch show list
|
496
|
+
show_list_launch_and_verify
|
497
|
+
|
498
|
+
# remove all series reocrdings
|
499
|
+
tcfail "Failed to clear series recordings" unless show_list_screen_clear_all_series_recordings
|
500
|
+
|
501
|
+
# remove all scheduled recordings
|
502
|
+
tcfail "Failed to clear Scheduled recordings" unless show_list_screen_clear_all_scheduled_recordings
|
503
|
+
|
504
|
+
# remove all recorded programs
|
505
|
+
tcname = (($user_log.getTestCase).split("/")).last
|
506
|
+
ignore_test_cases = fetch_option(:ignore_last_two_days_recordings_for_scripts).to_s.split(",")
|
507
|
+
if ignore_test_cases.include?(tcname)
|
508
|
+
loginfo2 "Ignored last two days recording for : #{tcname}, Removing inprogress recordings ..."
|
509
|
+
tcfail "Failed to clear in progress recordings" unless show_list_delete_inprogress_recordings
|
510
|
+
else
|
511
|
+
tcfail "Failed to clear last two days recordings " unless show_list_delete_last_two_days_recordings
|
512
|
+
end
|
513
|
+
|
514
|
+
#Exit ot full screen
|
515
|
+
press_exit_sleep
|
516
|
+
end
|
517
|
+
|
518
|
+
# Initial Setup for dvr/recording test scripts
|
519
|
+
# Remove all Series Recording.
|
520
|
+
# Remove all Scheduled Recording.
|
521
|
+
# Remove last two day Recorded contented (including in progress) from show list
|
522
|
+
def dvr_setup
|
523
|
+
# DVR check
|
524
|
+
return unless stb_capable_of? 'DVR'
|
525
|
+
|
526
|
+
loginfo2 "DVR setup [START]",false
|
527
|
+
show_list_launch_and_verify
|
528
|
+
hdd_status_high_water_mark = fetch_option(:hdd_status_high_water_mark).to_s.to_i
|
529
|
+
hdd_status_high_water_mark = 90 if hdd_status_high_water_mark.eql?(0)
|
530
|
+
loginfo2 "Verifying HDD status is less than high water mark : #{hdd_status_high_water_mark}% full ..."
|
531
|
+
hdd_status = _percentage_hdd_full
|
532
|
+
hdd_status = 0 if hdd_status.nil?
|
533
|
+
if hdd_status > hdd_status_high_water_mark
|
534
|
+
hdd_status_low_water_mark = fetch_option(:hdd_status_low_water_mark).to_s.to_i
|
535
|
+
hdd_status_low_water_mark = 60 if hdd_status_low_water_mark.eql?(0)
|
536
|
+
loginfo2 "HDD [#{hdd_status}]% full more than high water mark level : #{hdd_status_high_water_mark}%, Removing recorded program to make it lower than [#{hdd_status_low_water_mark}]%"
|
537
|
+
tcfail "Failed to remove recording from STB to make HDD %{hdd_status_high_water_mark} % full" unless make_hdd_empty(hdd_status_low_water_mark)
|
538
|
+
end
|
539
|
+
loginfo2 "HDD status check successful"
|
540
|
+
_stb_clean_up_recordings
|
541
|
+
loginfo2 "DVR setup [END]",false
|
542
|
+
end
|
543
|
+
|
544
|
+
# Clean up for dvr/recording test scripts
|
545
|
+
# Remove all Series Recording.
|
546
|
+
# Remove all Scheduled Recording.
|
547
|
+
# Remove last two day Recorded contented (including in progress) from show list
|
548
|
+
def dvr_cleanup
|
549
|
+
# DVR check
|
550
|
+
return unless stb_capable_of? 'DVR'
|
551
|
+
|
552
|
+
loginfo2 "DVR cleanup [START]",false
|
553
|
+
_stb_clean_up_recordings
|
554
|
+
loginfo2 "DVR cleanup [END]",false
|
555
|
+
end
|
556
|
+
|
557
|
+
# Initial setup method to reset common STB settings
|
558
|
+
$execution_count = {}
|
559
|
+
|
560
|
+
# Private method to get execution count for active STB
|
561
|
+
def execution_count(count=nil, stb_id=$stb_id)
|
562
|
+
unless $execution_count.has_key?(stb_id.to_s)
|
563
|
+
$execution_count[stb_id.to_s] = 0
|
564
|
+
end
|
565
|
+
|
566
|
+
return $execution_count[stb_id.to_s]
|
567
|
+
end
|
568
|
+
|
569
|
+
# Private method to update execution count for active STB
|
570
|
+
def update_execution_count(count, stb_id=$stb_id)
|
571
|
+
unless $execution_count.has_key?(stb_id.to_s)
|
572
|
+
$execution_count[stb_id.to_s] = 0
|
573
|
+
end
|
574
|
+
|
575
|
+
$execution_count[stb_id.to_s] = count
|
576
|
+
end
|
577
|
+
|
578
|
+
$internal_iteration=2 # max iterations
|
579
|
+
|
580
|
+
def setup(ignore_dvr_setup=false)
|
581
|
+
# increase execution count
|
582
|
+
update_execution_count(execution_count + 1)
|
583
|
+
|
584
|
+
run_mode = fetch_option(:execution_mode).strip.downcase
|
585
|
+
|
586
|
+
# Do not run setup for first execution
|
587
|
+
if run_mode.eql?('advanced')
|
588
|
+
if execution_count == 1
|
589
|
+
loginfo2 "Executing test case using advanced mode ...",false
|
590
|
+
|
591
|
+
# Power on stb if required
|
592
|
+
tcfail "Failed to power ON STB" unless power_on_stb?
|
593
|
+
|
594
|
+
# Tuning to home channel
|
595
|
+
loginfo2 "Tuning to home channel : [#{fetch_option(:a_home_channel)}] ..."
|
596
|
+
press_exit_sleep
|
597
|
+
tune_immediately_to fetch_option(:a_home_channel)
|
598
|
+
|
599
|
+
loginfo2 "STB reset not required for first execution"
|
600
|
+
return
|
601
|
+
end # run setup subset for first run only
|
602
|
+
elsif run_mode.eql?('classic')
|
603
|
+
$internal_iteration = 1 # run test case with setup
|
604
|
+
loginfo2 "Executing test case using classic mode ...",false
|
605
|
+
else
|
606
|
+
$internal_iteration = 1 # run test case without setup
|
607
|
+
loginfo2 "Unknown execution mode, executing test case without setup",false
|
608
|
+
return
|
609
|
+
end
|
610
|
+
|
611
|
+
loginfo2 "Setup [START]"
|
612
|
+
|
613
|
+
begin
|
614
|
+
# Reset STB state
|
615
|
+
_reset_stb(ignore_dvr_setup)
|
616
|
+
|
617
|
+
# verify health check
|
618
|
+
# Home channel
|
619
|
+
tcfail "[STB health check failed] : Home channel" unless _verify_home_channel
|
620
|
+
|
621
|
+
# Screen launch and verify
|
622
|
+
tcfail "[STB health check failed] : Screens launch and verify" unless _verify_screen_launch
|
623
|
+
|
624
|
+
test_data[:stb_ip] = fetch_ip
|
625
|
+
rescue StandardError => e
|
626
|
+
_setup_failed e.message
|
627
|
+
end
|
628
|
+
|
629
|
+
loginfo2 "Setup [END]"
|
630
|
+
end
|
631
|
+
|
632
|
+
# Initial setup method to reset PIP window in second Quadrant
|
633
|
+
# * *Returns* :
|
634
|
+
# - true if PIP window successfully reset else false
|
635
|
+
def pip_setup
|
636
|
+
loginfo2 "PIP setup [START]",false
|
637
|
+
loginfo2 'Ensuring that pip will have video'
|
638
|
+
tune_immediately_to(fetch_option(:a_live_channel_1))
|
639
|
+
unless info_banner_launch_and_verify_channel_number(fetch_option(:a_live_channel_1), 10)
|
640
|
+
loginfo2 "Failed to tune to live channel: #{(fetch_option(:a_live_channel_1))}"
|
641
|
+
return false
|
642
|
+
end
|
643
|
+
unless fullscreen_video_playing?(20)
|
644
|
+
loginfo2 "Failed to verify video on live channel: #{(fetch_option(:a_live_channel_1))}"
|
645
|
+
return false
|
646
|
+
end
|
647
|
+
|
648
|
+
# Sleep for few seconds so that current channel will be last tuned channel
|
649
|
+
sleep 30.sec
|
650
|
+
|
651
|
+
tune_immediately_to(fetch_option(:a_live_channel_2))
|
652
|
+
unless info_banner_launch_and_verify_channel_number(fetch_option(:a_live_channel_2), 10)
|
653
|
+
loginfo2 "Failed to tune to live channel: #{(fetch_option(:a_live_channel_2))}"
|
654
|
+
return false
|
655
|
+
end
|
656
|
+
unless fullscreen_video_playing?(20)
|
657
|
+
loginfo2 "Failed to verify video on live channel: #{(fetch_option(:a_live_channel_2))}"
|
658
|
+
return false
|
659
|
+
end
|
660
|
+
|
661
|
+
press_pip_onoff_sleep
|
662
|
+
unless pip_window_appears?
|
663
|
+
loginfo2 "PIP window does not appeared after pressing PIP ON/OFF"
|
664
|
+
return false
|
665
|
+
end
|
666
|
+
|
667
|
+
unless pip_window_reset_quadrant
|
668
|
+
loginfo2 "Unable to Reset PIP window in second quadrant"
|
669
|
+
return false
|
670
|
+
end
|
671
|
+
|
672
|
+
press_pip_onoff_sleep
|
673
|
+
if pip_window_appears?
|
674
|
+
loginfo2 "PIP window appears after pressing PIP ON/OFF"
|
675
|
+
return false
|
676
|
+
end
|
677
|
+
|
678
|
+
loginfo2 "PIP setup [END]",false
|
679
|
+
return true
|
680
|
+
end
|
681
|
+
|
682
|
+
# Clenup methods for PIP
|
683
|
+
# * *Returns* :
|
684
|
+
# - true if PIP window successfully reset else false
|
685
|
+
def pip_cleanup
|
686
|
+
loginfo2 "PIP cleanup [START]",false
|
687
|
+
# Reset PIP
|
688
|
+
if stb_capable_of?('PIP')
|
689
|
+
loginfo2 "Resetting PIP by powering OFF and ON STB ..."
|
690
|
+
tcfail "Unable to power off STB" unless power_off_stb?
|
691
|
+
tcfail "Unable to power on STB" unless power_on_stb?
|
692
|
+
loginfo2 "Successfully reset PIP window"
|
693
|
+
end
|
694
|
+
loginfo2 "PIP cleanup [END]",false
|
695
|
+
end
|
696
|
+
|
697
|
+
# ADSG setup
|
698
|
+
# 1.) Add DSG package, in not present.
|
699
|
+
# 2.) Reboot STB.
|
700
|
+
# 3.) Verify if STB is up in DSG mode from host diags.
|
701
|
+
# (host_diags_verify_OOB_mode can be used)
|
702
|
+
def adsg_setup
|
703
|
+
begin
|
704
|
+
unless verify_package_on_dncs(['ADSGB'])
|
705
|
+
return false unless add_pkg_on_dncs(['ADSGB'], false)
|
706
|
+
return false unless stb_reboot_using_ac_power
|
707
|
+
return false unless stb_wait_till_finish_rebooting(true)
|
708
|
+
host_diags_launch_and_verify
|
709
|
+
return false unless host_diags_verify_OOB_mode('DSG')
|
710
|
+
else
|
711
|
+
host_diags_launch_and_verify
|
712
|
+
unless host_diags_verify_OOB_mode('DSG')
|
713
|
+
return false unless stb_reboot_using_ac_power
|
714
|
+
return false unless stb_wait_till_finish_rebooting(true) # TODO use reboot stb : line 710-111
|
715
|
+
host_diags_launch_and_verify
|
716
|
+
return false unless host_diags_verify_OOB_mode('DSG')
|
717
|
+
else
|
718
|
+
loginfo2 "STB already in 'ADSG' mode"
|
719
|
+
end
|
720
|
+
end
|
721
|
+
return true
|
722
|
+
rescue StandardError => e
|
723
|
+
loginfo2 e.message
|
724
|
+
return false
|
725
|
+
end
|
726
|
+
end
|
727
|
+
|
728
|
+
# ADSG cleanup
|
729
|
+
# 1.) Remove DSG package, if present.
|
730
|
+
# 2.) Reboot STB.
|
731
|
+
def adsg_cleanup
|
732
|
+
begin
|
733
|
+
if verify_package_on_dncs(['ADSGB'])
|
734
|
+
return false unless remove_pkg_from_dncs(['ADSGB'], false)
|
735
|
+
return false unless stb_reboot_using_ac_power
|
736
|
+
return false unless stb_wait_till_finish_rebooting(true) # TODO use reboot stb : line 710-111
|
737
|
+
host_diags_launch_and_verify
|
738
|
+
return false unless host_diags_verify_OOB_mode('OOB(SCTE55)')
|
739
|
+
else
|
740
|
+
loginfo2 "Package already removed"
|
741
|
+
end
|
742
|
+
return true
|
743
|
+
rescue StandardError => e
|
744
|
+
loginfo2 e.message
|
745
|
+
return false
|
746
|
+
end
|
747
|
+
end
|
748
|
+
|
749
|
+
# Use it to compare two string using string similarity
|
750
|
+
# * *Args* :
|
751
|
+
# - +expected_text+ -> expected text
|
752
|
+
# - +ocr_text+ -> ocr text
|
753
|
+
# - +similarity_level=0.75+ -> similarity level (e.g. 0.75 is 75% similar)
|
754
|
+
# * *Returns* :
|
755
|
+
# - true if string similar else false
|
756
|
+
def string_similar?(expected_text, ocr_text, similarity_level=0.75)
|
757
|
+
# nil or empty check for OCR and expected text
|
758
|
+
if (ocr_text.nil? or ocr_text.empty? or expected_text.nil? or expected_text.empty?)
|
759
|
+
loginfo2 "Empty string : OCR text -> #{ocr_text}, Expected text -> #{expected_text}"
|
760
|
+
return false
|
761
|
+
end
|
762
|
+
|
763
|
+
similarity = (string_similarity expected_text, ocr_text)
|
764
|
+
logdebug "[#{expected_text}] Similarity : #{similarity}"
|
765
|
+
return similarity >= similarity_level
|
766
|
+
end
|
767
|
+
|
768
|
+
# Use it to compare two string using sub-string similarity
|
769
|
+
# * *Args* :
|
770
|
+
# - +expected_text+ -> expected text
|
771
|
+
# - +ocr_text+ -> ocr text
|
772
|
+
# - +similarity_level=0.75+ -> similarity level (e.g. 0.75 is 75% similar)
|
773
|
+
# * *Returns* :
|
774
|
+
# - true if string similar else false
|
775
|
+
def sub_string_similar?(expected_text, ocr_text, similarity_level=0.75)
|
776
|
+
# nil or empty check for OCR and expected text
|
777
|
+
if (ocr_text.nil? or ocr_text.empty? or expected_text.nil? or expected_text.empty?)
|
778
|
+
loginfo2 "Empty string : OCR text -> #{ocr_text}, Expected text -> #{expected_text}}"
|
779
|
+
return false
|
780
|
+
end
|
781
|
+
|
782
|
+
similarity = (substring_similarity expected_text, ocr_text)
|
783
|
+
logdebug "[#{expected_text}] Similarity(SubStr) : #{similarity}"
|
784
|
+
return similarity >= similarity_level
|
785
|
+
end
|
786
|
+
|
787
|
+
# Use it to tune to given channel
|
788
|
+
def tune_immediately_to (channel)
|
789
|
+
key_seq = channel.to_s.chars.to_a
|
790
|
+
key_seq.push('SELECT') unless key_seq.length.eql?(4) # only for less than 4 digits channels
|
791
|
+
_press_key_sequence key_seq
|
792
|
+
|
793
|
+
sleep 3.sec
|
794
|
+
loginfo3 "Numeric tuning to channel : [#{channel}]",true,false,"TUNE_TO_#{channel}"
|
795
|
+
end
|
796
|
+
|
797
|
+
# Use it to verify if screensaver is active
|
798
|
+
def screensaver_active? retries = 5
|
799
|
+
# Brightness calibration will not work for black screen verification so removing it temporary
|
800
|
+
brightness_correction_status = get_stb_brightness_correction_status
|
801
|
+
loginfo2 "Brightness correction status : #{brightness_correction_status}",false
|
802
|
+
# Disable brightness correction
|
803
|
+
set_stb_brightness_correction_status('false')
|
804
|
+
|
805
|
+
roi_name = :screen_saver_roi
|
806
|
+
icon_file_path = golden_roi(:screensaver_twc_logo).referenceImage
|
807
|
+
result = false
|
808
|
+
if (screen_matches_for_icon_roi roi_name, icon_file_path, retries)
|
809
|
+
loginfo2 "Screen saver is displayed", true, false
|
810
|
+
result = true
|
811
|
+
else
|
812
|
+
loginfo2 "Failed to verify screensaver",true,false
|
813
|
+
result = false
|
814
|
+
end
|
815
|
+
|
816
|
+
# Restoring old value
|
817
|
+
set_stb_brightness_correction_status(brightness_correction_status.to_s)
|
818
|
+
|
819
|
+
return result
|
820
|
+
end
|
821
|
+
|
822
|
+
# Use it to verify if screensaver is dismissed.
|
823
|
+
def screensaver_inactive? retries = 5
|
824
|
+
# Brightness calibration will not work for black screen verification so removing it temporary
|
825
|
+
brightness_correction_status = get_stb_brightness_correction_status
|
826
|
+
loginfo2 "Brightness correction status : #{brightness_correction_status}",false
|
827
|
+
# Disable brightness correction
|
828
|
+
set_stb_brightness_correction_status('false')
|
829
|
+
|
830
|
+
roi_name = :screen_saver_inactive_roi
|
831
|
+
icon_file_path = golden_roi(:screensaver_twc_logo).referenceImage
|
832
|
+
result = false
|
833
|
+
if (screen_matches_for_icon_roi roi_name, icon_file_path, retries)
|
834
|
+
loginfo2 "Failed to verify screensaver dismissed",true,false
|
835
|
+
result = false
|
836
|
+
else
|
837
|
+
loginfo2 "Screen saver is dismissed", true, false
|
838
|
+
result = true
|
839
|
+
end
|
840
|
+
|
841
|
+
# Restoring old value
|
842
|
+
set_stb_brightness_correction_status(brightness_correction_status.to_s)
|
843
|
+
|
844
|
+
return result
|
845
|
+
end
|
846
|
+
|
847
|
+
# Use to to get mas db time zone difference in minutes
|
848
|
+
# * *Returns* :
|
849
|
+
# - GMT offset in minutes (integer)
|
850
|
+
def mas_db_time_zone_diff_in_min
|
851
|
+
tzbk = ENV['TZ'] # backup current time zone
|
852
|
+
tz = test_data[:mas_db_time_zone]
|
853
|
+
tz = tzbk if tz.nil? # Use system timezone
|
854
|
+
|
855
|
+
ENV['TZ'] = tz
|
856
|
+
result = (Time.now.gmt_offset / 60)
|
857
|
+
ENV['TZ'] = tzbk # restore backup current time zone
|
858
|
+
|
859
|
+
logdebug "MAS DB time zone difference in min : #{result}",false
|
860
|
+
|
861
|
+
return result
|
862
|
+
end
|
863
|
+
|
864
|
+
# Use to to get mas conductor time zone difference in minutes
|
865
|
+
# * *Returns* :
|
866
|
+
# - GMT offset in minutes (integer)
|
867
|
+
def mas_conductor_time_zone_diff_in_min
|
868
|
+
tz = test_data[:mas_conductor_time_zone]
|
869
|
+
unless tz.nil?
|
870
|
+
db_tz_diff = mas_db_time_zone_diff_in_min
|
871
|
+
|
872
|
+
tzbk = ENV['TZ'] # backup current time zone
|
873
|
+
|
874
|
+
ENV['TZ'] = tz
|
875
|
+
tz_diff = (Time.now.gmt_offset / 60)
|
876
|
+
|
877
|
+
result = (db_tz_diff - tz_diff)
|
878
|
+
ENV['TZ'] = tzbk # restore backup current time zone
|
879
|
+
|
880
|
+
logdebug "MAS Conductor time zone difference in min : #{result}",false
|
881
|
+
|
882
|
+
return result
|
883
|
+
else
|
884
|
+
return 0
|
885
|
+
end
|
886
|
+
end
|
887
|
+
|
888
|
+
# Use it to get current date from MAS
|
889
|
+
# * *Returns* :
|
890
|
+
# - date object that contains hashmap
|
891
|
+
# - e.g { day => 07, month => 06, year => 2011, hour => 05, min => 06, sec => 56 }
|
892
|
+
def mas_current_date
|
893
|
+
time_arr = mas_db_get_curr_date[0]['NOW'].split('/')
|
894
|
+
|
895
|
+
loginfo2 "MASDate : #{time_arr[0].to_i}/#{time_arr[1].to_i}/#{time_arr[2].to_i} #{time_arr[3].to_i}:#{time_arr[4].to_i}:#{time_arr[5].to_i}"
|
896
|
+
|
897
|
+
return Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
898
|
+
end
|
899
|
+
|
900
|
+
# Use it to get week days array
|
901
|
+
# * *Returns* :
|
902
|
+
# - array of weekdays
|
903
|
+
def week_days
|
904
|
+
return ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
|
905
|
+
end
|
906
|
+
|
907
|
+
# Use it to get week day of today
|
908
|
+
# * *Returns* :
|
909
|
+
# - weekday, e.g. "SUN", "MON", "TUE", etc.
|
910
|
+
def mas_current_date_week_day
|
911
|
+
wdays = week_days
|
912
|
+
t = mas_current_date
|
913
|
+
return wdays[t.wday]
|
914
|
+
end
|
915
|
+
|
916
|
+
# Use it to get channels list from mas
|
917
|
+
# * *Returns* :
|
918
|
+
# - Array of channel
|
919
|
+
# - each channel is array [integer, string] (number, name), e.g. [2, dstk]
|
920
|
+
def mas_channels_list
|
921
|
+
result_array = []
|
922
|
+
channel_hash_array = mas_db_get_channels
|
923
|
+
channel_hash_array.each {|channel|
|
924
|
+
result_array.push([channel['DISPLAY_CHANNEL'].to_s.to_i, channel['DISPLAY_NAME'].to_s.downcase])
|
925
|
+
}
|
926
|
+
return result_array
|
927
|
+
end
|
928
|
+
|
929
|
+
# Use it to get genre names from genre codes
|
930
|
+
# * *Args* :
|
931
|
+
# - +genre_codes+ -> codes list (e.g. ":17:18:") (get using db query)
|
932
|
+
# - +valid_genre+ -> valid genre codes array
|
933
|
+
# * *Returns* :
|
934
|
+
# - array of genre names
|
935
|
+
def genre_names_from (genre_codes="", valid_genre = valid_genre_codes)
|
936
|
+
|
937
|
+
names = []
|
938
|
+
genre_codes.split(":").each {|genre|
|
939
|
+
next if genre.empty?
|
940
|
+
index = valid_genre.index {|code| (code[0] == genre.to_i)}
|
941
|
+
names.push(valid_genre[index][1]) unless index.nil?
|
942
|
+
}
|
943
|
+
|
944
|
+
return names
|
945
|
+
end
|
946
|
+
|
947
|
+
# Private function
|
948
|
+
# Use it to get genre codes from genre names
|
949
|
+
# * *Args* :
|
950
|
+
# - +genre_names+ -> comma separated genre names. (e.g, "News, Weather")
|
951
|
+
# - +valid_genre+ -> valid genre codes array
|
952
|
+
# * *Returns* :
|
953
|
+
# - array of genre codes
|
954
|
+
def _genre_codes_from (genre_names="", valid_genre = valid_genre_codes)
|
955
|
+
codes = []
|
956
|
+
genre_names.split(",").each {|genre|
|
957
|
+
next if genre.empty?
|
958
|
+
index = valid_genre.index {|code| (code[1].to_s.casecmp(genre.to_s) == 0)}
|
959
|
+
codes.push(valid_genre[index][0]) unless index.nil?
|
960
|
+
}
|
961
|
+
|
962
|
+
return codes
|
963
|
+
end
|
964
|
+
|
965
|
+
# Use it to valid genre codes with description from MAS DB
|
966
|
+
# * *Returns* :
|
967
|
+
# - array of genre codes, genre desc
|
968
|
+
def valid_genre_codes
|
969
|
+
genre_arr = []
|
970
|
+
mas_db_genre.each {|data_hash|
|
971
|
+
genre_arr.push([data_hash['GENRE_CODE'].to_s.to_i, data_hash['GENRE_CODE_DESC'].to_s])
|
972
|
+
}
|
973
|
+
|
974
|
+
return genre_arr
|
975
|
+
end
|
976
|
+
|
977
|
+
# Private method
|
978
|
+
# Use to convert date and time to 'TO_DATE' format
|
979
|
+
# * *Args* :
|
980
|
+
# - +date_arr+ -> first element will be days (e.g. 0 for today, 1 for tomorrow) and
|
981
|
+
# second element will be time in 24hrs format (e.g 18:00)
|
982
|
+
# * *Returns* :
|
983
|
+
# - 'TO_DATE' format date and time. (e.g TO_DATE('2011-07-20 07:00:00'))
|
984
|
+
def _parse_date date_arr, curr_date = mas_current_date
|
985
|
+
time_zone_diff = mas_db_time_zone_diff_in_min
|
986
|
+
|
987
|
+
if(date_arr.class == Time)
|
988
|
+
new_time = (Time.local(date_arr.year,date_arr.month,date_arr.day,date_arr.hour,date_arr.min,0) - (time_zone_diff * 60)).strftime("%Y-%m-%d %H:%M:00")
|
989
|
+
return "TO_DATE('#{new_time}')"
|
990
|
+
end
|
991
|
+
|
992
|
+
if date_arr.length == 2
|
993
|
+
hour = date_arr[1][0..(date_arr[1].index(':') - 1)]
|
994
|
+
mins = date_arr[1][(date_arr[1].index(':') + 1)..(date_arr[1].length)]
|
995
|
+
new_time = (Time.local(curr_date.year,curr_date.month,curr_date.day,hour,mins,0) + (date_arr[0]*24*3600) - (time_zone_diff * 60)).strftime("%Y-%m-%d %H:%M:00")
|
996
|
+
|
997
|
+
return "TO_DATE('#{new_time}')"
|
998
|
+
elsif date_arr.length == 1
|
999
|
+
mins = curr_date.min > 30 ? 30 : 0
|
1000
|
+
curr_time = (Time.local(curr_date.year,curr_date.month,curr_date.day,curr_date.hour,mins,0) + (date_arr[0]*24*3600) - (time_zone_diff * 60)).strftime("%Y-%m-%d %H:%M:00")
|
1001
|
+
return "TO_DATE('#{curr_time}')"
|
1002
|
+
else
|
1003
|
+
return "''"
|
1004
|
+
end
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
# Private function
|
1008
|
+
# Use it to get advisory flags from MAS db
|
1009
|
+
def _valid_advisory_flags
|
1010
|
+
# Avoid MAS query for static list
|
1011
|
+
# result = []
|
1012
|
+
# mas_db_advisory_flags.each{ |flag_details|
|
1013
|
+
# result.push([flag_details['ADVISORY_FLAG'].to_s.to_i, flag_details['ADVISORY_LONG_DESC'].to_s])
|
1014
|
+
# }
|
1015
|
+
#
|
1016
|
+
# return result
|
1017
|
+
|
1018
|
+
result = [
|
1019
|
+
[0,'No Advisories'],
|
1020
|
+
[1,'Sexual Content'],
|
1021
|
+
[2,'Violence'],
|
1022
|
+
[4,'Explicit Language'],
|
1023
|
+
[8,'Strong Dialog'],
|
1024
|
+
[16,'Fantasy Violence'],
|
1025
|
+
[32,'Adult Situations'],
|
1026
|
+
[64,'Brief Nudity'],
|
1027
|
+
[128,'Graphic Language'],
|
1028
|
+
[256,'Graphic Violence'],
|
1029
|
+
[512,'Language'],
|
1030
|
+
[1024,'Mild Violence'],
|
1031
|
+
[2048,'Nudity'],
|
1032
|
+
[4096,'Rape'],
|
1033
|
+
[8192,'Strong Sexual']] # TODO : database mismatch "Strong Sexual Content"
|
1034
|
+
|
1035
|
+
return result
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
# Private function
|
1039
|
+
# Use it to get advisory flags from advisory code
|
1040
|
+
def _advisory_flags_from_advisory_code advisory_code, flags = _valid_advisory_flags
|
1041
|
+
# return first no advisory if advisory_code is 0
|
1042
|
+
return flags[0][1] if advisory_code.nil? || advisory_code.to_s.to_i == 0
|
1043
|
+
|
1044
|
+
result = []
|
1045
|
+
advisory_code_int = advisory_code
|
1046
|
+
advisory_code = advisory_code.to_s.to_i.to_s(2).reverse # convert to string -> integer -> string base 2
|
1047
|
+
|
1048
|
+
counter = 1
|
1049
|
+
advisory_code.each_char {|flag|
|
1050
|
+
if counter >= flags.length
|
1051
|
+
loginfo2 "advisory_code [#{advisory_code_int}] not available"
|
1052
|
+
next
|
1053
|
+
end
|
1054
|
+
result.push(flags[counter][1]) if flag.casecmp('1') == 0
|
1055
|
+
counter = counter + 1
|
1056
|
+
}
|
1057
|
+
|
1058
|
+
return result.join(',')
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
# Private function
|
1062
|
+
# Use it to get event flags from MAS db
|
1063
|
+
def _valid_event_flags
|
1064
|
+
# TODO fix me : EV_FLAG is not having all flags
|
1065
|
+
# result = []
|
1066
|
+
# mas_db_event_flags.each {|program_type|
|
1067
|
+
# result.push([program_type['EV_FLAG'].to_s.to_i, program_type['EV_FLAG_DESC'].to_s])
|
1068
|
+
# }
|
1069
|
+
|
1070
|
+
result = [
|
1071
|
+
[0, 'RESERVED'],
|
1072
|
+
[1, 'REPEAT'],
|
1073
|
+
[2, 'LETTERBOX'],
|
1074
|
+
[4, 'HDTV'],
|
1075
|
+
[8, 'CLOSED_CAPTIONED'],
|
1076
|
+
[16, 'ENHANCED'],
|
1077
|
+
[32, 'STEREO'],
|
1078
|
+
[64, 'DOLBY'],
|
1079
|
+
[128, 'SAP'],
|
1080
|
+
[256, 'MYSTRO_PAUSABLE'],
|
1081
|
+
[512, 'MYSTRO_REWIND_PRIOR_TO_SESSION_START'],
|
1082
|
+
[1024, 'MYSTRO_PAST_RESERVE'],
|
1083
|
+
[2048, 'MYSTRO_CURRENT_RESERVE'],
|
1084
|
+
[4096, 'MYSTRO_FUTURE_RESERVE']]
|
1085
|
+
|
1086
|
+
return result
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
# Private function
|
1090
|
+
# Use it to get event flags from event code
|
1091
|
+
def _event_flags_from_event_code event_code, flags = _valid_event_flags
|
1092
|
+
# return first no event flag if event_code is 0
|
1093
|
+
return flags[0][1] if event_code.nil? || event_code.to_s.to_i == 0
|
1094
|
+
|
1095
|
+
result = []
|
1096
|
+
event_code_int = event_code
|
1097
|
+
event_code = event_code.to_s.to_i.to_s(2).reverse # convert to string -> integer -> string base 2
|
1098
|
+
|
1099
|
+
counter = 1
|
1100
|
+
event_code.each_char {|flag|
|
1101
|
+
if counter >= flags.length
|
1102
|
+
loginfo2 "event_code [#{event_code_int}] not available"
|
1103
|
+
next
|
1104
|
+
end
|
1105
|
+
result.push(flags[counter][1]) if flag.casecmp('1') == 0
|
1106
|
+
counter = counter + 1
|
1107
|
+
}
|
1108
|
+
|
1109
|
+
return result.join(',')
|
1110
|
+
end
|
1111
|
+
|
1112
|
+
# Use it to find program on particular channel, time and duration
|
1113
|
+
# * *Args* :
|
1114
|
+
# - +params+ -> data hash e.g params = {{:CHANNEL_NUMBER => 85, :CHANNEL_NUMBERS => [80, 85, 45], :START_DATE_TIME => [0, '1:00'] OR ruby_time, :END_DATE_TIME => [0, '2:00'] OR ruby_time}}
|
1115
|
+
# - all return array parameters can be passed as argument
|
1116
|
+
# - GENRE_NAMES are comma separated names(e.g, News, Weather)
|
1117
|
+
# - Valid PROGRAM_TYPE = EP, MV, Miniseries, Paid Programming, SH, SP, Series, Special
|
1118
|
+
# * *Returns* :
|
1119
|
+
# - Array of programs each array will contain CHANNEL_NUMBER, CHANNEL_NAME, PROGRAM_START_TIME, PROGRAM_END_TIME, PROGRAM_SHORT_TITLE, PROGRAM_LONG_TITLE
|
1120
|
+
# PROGRAM_RATING_SHORT, PROGRAM_RATING_LONG, PROGRAM_STAR_RATING, PROGRAM_GENRE_CODES, PROGRAM_SHORT_DESC, PROGRAM_LONG_DESC, PROGRAM_TYPE, PROGRAM_CONTENT_TYPE, PROGRAM_FLAG, EVENT_DETAIL_ID, SERVICE_SCHEDULE_ID, MYSTRO_SERVICE_ID
|
1121
|
+
def find_programs(params={}, curr_date = mas_current_date)
|
1122
|
+
where_clause = ''
|
1123
|
+
where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL = #{params[:CHANNEL_NUMBER]}" if (!params[:CHANNEL_NUMBER].nil? && params[:CHANNEL_NUMBER].to_s.to_i >= 0)
|
1124
|
+
where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL IN (#{params[:CHANNEL_NUMBERS].join(',')})" if (!params[:CHANNEL_NUMBERS].nil? && params[:CHANNEL_NUMBERS].class == Array && !(params[:CHANNEL_NUMBERS].empty?))
|
1125
|
+
where_clause << " AND UPPER(MYSTRO_SERVICE.DISPLAY_NAME) LIKE '%#{params[:CHANNEL_NAME].to_s.upcase}%'" if (!params[:CHANNEL_NAME].nil? && params[:CHANNEL_NAME].strip != '')
|
1126
|
+
where_clause << " AND (SERVICE_SCHEDULE.TMS_ENDAIR_TIME > #{_parse_date(params[:START_DATE_TIME], curr_date)})" if (!params[:START_DATE_TIME].nil? && params[:END_DATE_TIME].nil?)
|
1127
|
+
where_clause << " AND (SERVICE_SCHEDULE.TMS_AIR_DATETIME < #{_parse_date(params[:END_DATE_TIME], curr_date)})" if (!params[:END_DATE_TIME].nil? && params[:START_DATE_TIME].nil?)
|
1128
|
+
where_clause << " AND (SERVICE_SCHEDULE.TMS_ENDAIR_TIME > #{_parse_date(params[:START_DATE_TIME], curr_date)} AND SERVICE_SCHEDULE.TMS_AIR_DATETIME < #{_parse_date(params[:END_DATE_TIME], curr_date)})" if (!params[:END_DATE_TIME].nil? && !params[:START_DATE_TIME].nil?)
|
1129
|
+
where_clause << " AND UPPER(EVENT.EVENT_SHORT_TITLE) LIKE '%#{params[:PROGRAM_SHORT_TITLE].to_s.upcase}%'" if (!params[:PROGRAM_SHORT_TITLE].nil? && params[:PROGRAM_SHORT_TITLE].strip != '')
|
1130
|
+
where_clause << " AND UPPER(EVENT.EVENT_LONG_TITLE) LIKE '%#{params[:PROGRAM_LONG_TITLE].to_s.upcase}%'" if (!params[:PROGRAM_LONG_TITLE].nil? && params[:PROGRAM_LONG_TITLE].strip != '')
|
1131
|
+
where_clause << " AND UPPER(RATING_FLAG.RATING_FLAG_SHORT_DESC) LIKE '%#{params[:PROGRAM_RATING_SHORT].to_s.upcase}%'" if (!params[:PROGRAM_RATING_SHORT].nil? && params[:PROGRAM_RATING_SHORT].strip != '')
|
1132
|
+
where_clause << " AND UPPER(RATING_FLAG.RATING_FLAG_LONG_DESC) LIKE '%#{params[:PROGRAM_RATING_LONG].to_s.upcase}%'" if (!params[:PROGRAM_RATING_LONG].nil? && params[:PROGRAM_RATING_LONG].strip != '')
|
1133
|
+
where_clause << " AND UPPER(STAR_RATING_CODE.STAR_RATING_CODE_DESC) LIKE '%#{params[:PROGRAM_STAR_RATING].to_s.upcase}%'" if (!params[:PROGRAM_STAR_RATING].nil? && params[:PROGRAM_STAR_RATING].strip != '')
|
1134
|
+
where_clause << " AND UPPER(EVENT_DETAIL.EVENT_SHORT_DESCRIPTION) LIKE '%#{params[:PROGRAM_SHORT_DESC].to_s.upcase}%'" if (!params[:PROGRAM_SHORT_DESC].nil? && params[:PROGRAM_SHORT_DESC].strip != '')
|
1135
|
+
where_clause << " AND UPPER(EVENT_DETAIL.EVENT_LONG_DESCRIPTION) LIKE '%#{params[:PROGRAM_LONG_DESC].to_s.upcase}%'" if (!params[:PROGRAM_LONG_DESC].nil? && params[:PROGRAM_LONG_DESC].strip != '')
|
1136
|
+
where_clause << " AND UPPER(EVENT.EVENT_TYPE) LIKE '%#{params[:PROGRAM_TYPE].to_s.upcase}%'" if (!params[:PROGRAM_TYPE].nil? && params[:PROGRAM_TYPE].strip != '')
|
1137
|
+
where_clause << " AND EVENT_DETAIL.ADVISORY_CODE NOT IN ('0')" if (!params[:HAS_CONTENT_TYPES].nil? && params[:HAS_CONTENT_TYPES] == true)
|
1138
|
+
where_clause << " AND (SERVICE_SCHEDULE.TMS_ENDAIR_TIME > #{_parse_date(params[:DATE_TIME], curr_date)} AND SERVICE_SCHEDULE.TMS_AIR_DATETIME <= #{_parse_date(params[:DATE_TIME], curr_date)})" if (!params[:DATE_TIME].nil?)
|
1139
|
+
where_clause << " AND EVENT.EVENT_ID like '#{params[:EVENT_ID]}'" if (!params[:EVENT_ID].nil? && params[:EVENT_ID].strip != '')
|
1140
|
+
# hidden channel check, clock channel check
|
1141
|
+
if (!params[:CHANNEL_HIDDEN].nil? && params[:CHANNEL_HIDDEN] == true)
|
1142
|
+
where_clause << " AND MYSTRO_CHANNEL.CHANNEL_FLAGS >= 32 "
|
1143
|
+
elsif !params[:CHANNEL_NUMBER].nil? && params[:CHANNEL_NUMBER].to_s == fetch_option(:a_clock_channel).to_s
|
1144
|
+
# Do nothing
|
1145
|
+
loginfo2 "Query for clock channel data (hidden channel)"
|
1146
|
+
else
|
1147
|
+
where_clause << " AND MYSTRO_CHANNEL.CHANNEL_FLAGS < 32 "
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
if (!params[:GENRE_NAMES].nil? && !params[:GENRE_NAMES].strip.empty?)
|
1151
|
+
where_clause << " AND ( "
|
1152
|
+
_genre_codes_from(params[:GENRE_NAMES]).each{|code|
|
1153
|
+
where_clause << "EVENT_DETAIL.GENRE_CODE LIKE '%:#{code}:%' OR "
|
1154
|
+
}
|
1155
|
+
where_clause = "#{where_clause[0..(where_clause.length - 4)]} )"
|
1156
|
+
end
|
1157
|
+
|
1158
|
+
if (!params[:PROGRAM_FLAGS].nil? && !params[:PROGRAM_FLAGS].empty?)
|
1159
|
+
valid_flags = _valid_event_flags
|
1160
|
+
result = 0
|
1161
|
+
params[:PROGRAM_FLAGS].each{|flag|
|
1162
|
+
index = valid_flags.index{|v_flag| v_flag[1].delete(' ').downcase.casecmp(flag.delete(' ').downcase) == 0}
|
1163
|
+
result = result + valid_flags[index][0]
|
1164
|
+
}
|
1165
|
+
|
1166
|
+
where_clause << "AND BITAND(SERVICE_SCHEDULE.MYSTRO_EVENT_CODE, #{result}) = #{result}"
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
if (!params[:PROGRAM_CONTENT_TYPES].nil? && params[:PROGRAM_CONTENT_TYPES].empty?)
|
1170
|
+
valid_adflags = _valid_advisory_flags
|
1171
|
+
result = 0
|
1172
|
+
params[:PROGRAM_CONTENT_TYPES].each{|flag|
|
1173
|
+
index = valid_adflags.index{|v_flag| v_flag[1].delete(' ').downcase.casecmp(flag.delete(' ').downcase) == 0}
|
1174
|
+
result = result + valid_adflags[index][0]
|
1175
|
+
}
|
1176
|
+
|
1177
|
+
where_clause << "AND BITAND(EVENT_DETAIL.ADVISORY_CODE, #{result}) = #{result}"
|
1178
|
+
end
|
1179
|
+
|
1180
|
+
loginfo2 "WhereClause : #{where_clause}"
|
1181
|
+
|
1182
|
+
data_arr = mas_db_guide_data where_clause
|
1183
|
+
result_arr = []
|
1184
|
+
return result_arr if data_arr.nil?
|
1185
|
+
|
1186
|
+
# Advisory flags
|
1187
|
+
flags = _valid_advisory_flags
|
1188
|
+
types = _valid_event_flags
|
1189
|
+
|
1190
|
+
data_arr.each {|data_hash|
|
1191
|
+
time_arr = data_hash['PROGRAM_START_TIME'].split('/')
|
1192
|
+
prog_start_time = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1193
|
+
|
1194
|
+
time_arr = data_hash['PROGRAM_END_TIME'].split('/')
|
1195
|
+
prog_end_time = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1196
|
+
|
1197
|
+
content_type = _advisory_flags_from_advisory_code(data_hash['CONTENT_TYPE'], flags)
|
1198
|
+
event_type = _event_flags_from_event_code(data_hash['EVENT_CODE'],types)
|
1199
|
+
|
1200
|
+
result_arr.push([data_hash['CHANNEL_NUMBER'].to_s.to_i, data_hash['CHANNEL_NAME'], prog_start_time, prog_end_time, data_hash['PROGRAM_SHORT_TITLE'], data_hash['PROGRAM_LONG_TITLE'], data_hash['PROGRAM_RATING_SHORT'], data_hash['PROGRAM_RATING_LONG'], data_hash['PROGRAM_STAR_RATING'], data_hash['PROGRAM_GENRE_CODES'], (data_hash['PROGRAM_SHORT_DESC'] || ""), (data_hash['PROGRAM_LONG_DESC'] || ""), data_hash['PROGRAM_TYPE'], content_type, event_type, data_hash['EVENT_DETAIL_ID'], data_hash['SERVICE_SCHEDULE_ID'], data_hash['MYSTRO_SERVICE_ID'], data_hash['EVENT_ID']])
|
1201
|
+
}
|
1202
|
+
return result_arr
|
1203
|
+
end
|
1204
|
+
|
1205
|
+
# Use it to fetch option from YAML file
|
1206
|
+
# * *Args* :
|
1207
|
+
# - +option+ -> option name (e.g. :a_live_channel1)
|
1208
|
+
# * *Returns* :
|
1209
|
+
# - Option value as string
|
1210
|
+
def fetch_option(option, default=:__fetch_option_default)
|
1211
|
+
if default == :__fetch_option_default
|
1212
|
+
result = test_data[option]
|
1213
|
+
raise "Test data missing attribute: :#{option}" if result.nil?
|
1214
|
+
else
|
1215
|
+
result = test_data.fetch(option, default)
|
1216
|
+
end
|
1217
|
+
result
|
1218
|
+
end
|
1219
|
+
|
1220
|
+
# DEPRECATED
|
1221
|
+
def set_option(option, value)
|
1222
|
+
loginfo2 "WARNING: set_option is deprecated",false
|
1223
|
+
option = option.to_sym
|
1224
|
+
old_value = test_data[option]
|
1225
|
+
unless old_value.nil?
|
1226
|
+
loginfo2 "Option[#{option}] : OLD value [#{old_value}] - New value[#{value}]",false
|
1227
|
+
test_data[option] = value
|
1228
|
+
else
|
1229
|
+
loginfo2 "Option missing from test data: #{option}",false
|
1230
|
+
end
|
1231
|
+
end
|
1232
|
+
|
1233
|
+
def fetch_stb
|
1234
|
+
return $stb
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
# Use it to get rack ip
|
1238
|
+
def fetch_rack_ip
|
1239
|
+
return $ip_address
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
# Use it to undo black and white screen using long select + 1 key sequence
|
1243
|
+
def stb_undo_black_n_white
|
1244
|
+
return false unless power_off_stb?
|
1245
|
+
|
1246
|
+
key_seq = [['SEL_LONG', 10000], ['1', 200], ['POWER', 200]]
|
1247
|
+
_press_key_sequence key_seq
|
1248
|
+
|
1249
|
+
sleep 5.sec
|
1250
|
+
|
1251
|
+
return true
|
1252
|
+
end
|
1253
|
+
|
1254
|
+
# Use it to fetch ip address of STB from its MAC address
|
1255
|
+
# * *Args* :
|
1256
|
+
# * *Returns* :
|
1257
|
+
# - IP address or nil if IP unavailable
|
1258
|
+
def fetch_ip
|
1259
|
+
#if test_data[:sword_override_tmc] == "true"
|
1260
|
+
#return test_data[:stb_ip]
|
1261
|
+
#end
|
1262
|
+
return "00:00:00:00" if $rti_flag==false
|
1263
|
+
ip_addr = nil
|
1264
|
+
begin
|
1265
|
+
mac_addr = fetch_stb_mac_address
|
1266
|
+
loginfo2 "Mac address: #{mac_addr}",false
|
1267
|
+
|
1268
|
+
# TODO : mac address check
|
1269
|
+
# if mac_addr.to_s.scan(/(\s*)([0-9A-F]{12})(\s*)/).empty?
|
1270
|
+
# loginfo2 "STB is not having valid MAC address",false
|
1271
|
+
# return nil
|
1272
|
+
# end
|
1273
|
+
if(mac_addr.gsub(':','').length > 12)
|
1274
|
+
loginfo2 "Executing mas command 'mdiags stb unitaddr2ip #{mac_addr}'",false
|
1275
|
+
result = (exec_mas_cmd "mdiags stb unitaddr2ip #{mac_addr}")
|
1276
|
+
else
|
1277
|
+
loginfo2 "Executing mas command 'mdiags stb mac2ip #{mac_addr}'",false
|
1278
|
+
result = (exec_mas_cmd "mdiags stb mac2ip #{mac_addr}")
|
1279
|
+
end
|
1280
|
+
|
1281
|
+
loginfo2 "MAS Command Result : #{result}",false
|
1282
|
+
|
1283
|
+
tcfail 'MAS command result is nil or empty' if result.nil? or result.empty?
|
1284
|
+
|
1285
|
+
ip_add_array = result.to_s.scan(/(\d{1,3})(.)(\d{1,3})(.)(\d{1,3})(.)(\d{1,3})/)
|
1286
|
+
|
1287
|
+
if ip_add_array.empty?
|
1288
|
+
loginfo2 "MAS command result (output) is not having valid IP address",false
|
1289
|
+
else
|
1290
|
+
ip_addr = ip_add_array[0].to_s
|
1291
|
+
loginfo2 "IP address : #{ip_addr}",false
|
1292
|
+
end
|
1293
|
+
rescue => e
|
1294
|
+
loginfo2 "EXEC MAS command error : #{e.message}",false
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
return ip_addr
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
# Use it to fetch screensaver timeout from MAS via selenium
|
1301
|
+
def screen_saver_timeout_in_millis
|
1302
|
+
time_in_min = fetch_screensaver_timeout
|
1303
|
+
loginfo2 "Screen saver timeout is #{time_in_min} minutes"
|
1304
|
+
return time_in_min.to_i.min
|
1305
|
+
end
|
1306
|
+
|
1307
|
+
# Use it to check that box has a valid IP Address.
|
1308
|
+
def has_valid_ip?(stb_ip = fetch_ip,retries=5)
|
1309
|
+
if stb_ip.nil?
|
1310
|
+
loginfo2 'Box has not been assigned any IP Address.',false
|
1311
|
+
return false
|
1312
|
+
else
|
1313
|
+
loginfo2 "IP of the box is #{stb_ip}",false
|
1314
|
+
|
1315
|
+
retries.times do
|
1316
|
+
ping_cmd = "/bin/ping -c 3 #{stb_ip}"
|
1317
|
+
result = exec_mas_cmd ping_cmd
|
1318
|
+
loginfo2 "Ping result : #{result}",false
|
1319
|
+
|
1320
|
+
packets_received = result.scan(/(\d+)(\s+)(received)/)
|
1321
|
+
if packets_received.empty?
|
1322
|
+
loginfo2 "Ping command output is not having packet received count",false
|
1323
|
+
return false
|
1324
|
+
else
|
1325
|
+
return true if (packets_received[0][0].to_s.to_i > 0)
|
1326
|
+
loginfo2 "100 % packet loss, IP[#{stb_ip}] is not reachable",false
|
1327
|
+
# sleep for 10 sec and try again
|
1328
|
+
sleep 10.sec
|
1329
|
+
next
|
1330
|
+
end
|
1331
|
+
end
|
1332
|
+
|
1333
|
+
loginfo2 "Failed to validate STB ip",false
|
1334
|
+
return false
|
1335
|
+
end
|
1336
|
+
end
|
1337
|
+
|
1338
|
+
# Use to verify whether STB is having valid MAC address or not (syntax)
|
1339
|
+
def has_valid_mac?
|
1340
|
+
mac_add = fetch_stb_mac_address.to_s.strip
|
1341
|
+
|
1342
|
+
re1='((?:[0-9A-F][0-9A-F]:){5}(?:[0-9A-F][0-9A-F]))(?![:0-9A-F])' # Mac Address 1
|
1343
|
+
re2='(([0-9A-F][0-9A-F]){5}([0-9A-F][0-9A-F]))(?![0-9A-F])' # Mac Address 2
|
1344
|
+
|
1345
|
+
m1=Regexp.new(re1,Regexp::IGNORECASE);
|
1346
|
+
m2=Regexp.new(re2,Regexp::IGNORECASE);
|
1347
|
+
if m1.match(mac_add) or m2.match(mac_add)
|
1348
|
+
loginfo2 "STB is having valid MAC address (Syntax)",false
|
1349
|
+
return true
|
1350
|
+
else
|
1351
|
+
loginfo2 "STB is not having valid MAC address (Syntax)",false
|
1352
|
+
return false
|
1353
|
+
end
|
1354
|
+
end
|
1355
|
+
|
1356
|
+
# Use it to verify whether STB is having valid MODEL defined or not (settop box config)
|
1357
|
+
# Verify from stb registry
|
1358
|
+
def has_valid_model?
|
1359
|
+
stbmodel = fetch_stb_model.to_s.upcase
|
1360
|
+
|
1361
|
+
if StbRegistry.model_exists?(stbmodel)
|
1362
|
+
loginfo2 "STB model #{stbmodel} exists in STB Registry",false
|
1363
|
+
return true
|
1364
|
+
else
|
1365
|
+
loginfo2 "STB model #{stbmodel} does not exist in STB Registry",false
|
1366
|
+
return false
|
1367
|
+
end
|
1368
|
+
end
|
1369
|
+
|
1370
|
+
# Use it check whether STB is able to response commands from DNCS to check connectivity
|
1371
|
+
# This method will send call to STB and verify whether STB is getting calling message or not
|
1372
|
+
def has_connectivity?
|
1373
|
+
# add caller id package
|
1374
|
+
return false unless add_pkg_on_dncs(fetch_option(:caller_id_package_name))
|
1375
|
+
|
1376
|
+
begin
|
1377
|
+
caller_id_prompt_on
|
1378
|
+
press_exit_sleep
|
1379
|
+
rescue StandardError => e
|
1380
|
+
loginfo2 "Failed to set caller id prompt to ON : #{e.message}"
|
1381
|
+
return false
|
1382
|
+
end
|
1383
|
+
|
1384
|
+
# send call to STB
|
1385
|
+
caller_name = "AAA_#{dut.id.to_s}"
|
1386
|
+
caller_number = "0" << dut.id.to_s(2)
|
1387
|
+
callee_number = "0000"
|
1388
|
+
|
1389
|
+
return false unless send_call_to_stb(caller_name, caller_number, callee_number)
|
1390
|
+
|
1391
|
+
# verify caller id screen
|
1392
|
+
if ocr_text_similar_for_roi(:caller_id_call_log_roi,'Call Log',3,true,false,0.75,true)
|
1393
|
+
result1 = ocr_text_includes_for_roi(:caller_id_caller_name_roi,caller_name,3,true,false,1.0,true)
|
1394
|
+
result2 = ocr_text_includes_for_roi(:caller_id_caller_number_roi,caller_number,3,true,false,1.0,true)
|
1395
|
+
if result1 or result2
|
1396
|
+
press_exit_sleep
|
1397
|
+
return true
|
1398
|
+
end
|
1399
|
+
end
|
1400
|
+
|
1401
|
+
loginfo2 "Failed to verify caller name / caller number : [#{caller_name},#{caller_number}]"
|
1402
|
+
return false
|
1403
|
+
end
|
1404
|
+
|
1405
|
+
# Use it to get all parental rating values
|
1406
|
+
# * *Returns* :
|
1407
|
+
# - array of ratings, each rating is array of short description and long description
|
1408
|
+
# e.g. [['TV-Y','All Children'], ['TV-Y7','Children Age 7 and Above'] .. etc
|
1409
|
+
def valid_parental_ratings
|
1410
|
+
# Avoid MAS Query for static list
|
1411
|
+
# result = []
|
1412
|
+
# mas_db_parental_ratings.each { |rating_hash|
|
1413
|
+
# result.push([rating_hash['RATING_FLAG_SHORT_DESC'].to_s, rating_hash['RATING_FLAG_LONG_DESC'].to_s])
|
1414
|
+
# }
|
1415
|
+
#
|
1416
|
+
# return result
|
1417
|
+
|
1418
|
+
result = [
|
1419
|
+
['NR','No Mystro Rating'],
|
1420
|
+
['TV-Y','All Children'],
|
1421
|
+
['TV-Y7','Children Age 7 and Above'],
|
1422
|
+
['TV-G','General Audience'],
|
1423
|
+
['G','General Audience'],
|
1424
|
+
['TV-PG','Parental Guidence Suggested'],
|
1425
|
+
['PG','Parental Guidence Suggested'],
|
1426
|
+
['PG-13','Parents Strongly Cautioned'],
|
1427
|
+
['TV-14','Parents Strongly Cautioned'],
|
1428
|
+
['TV-MA','Mature Audiences Only'],
|
1429
|
+
['R','Restricted'],
|
1430
|
+
['NC-17','No One Under 17'],
|
1431
|
+
['AO','Adults Only']]
|
1432
|
+
|
1433
|
+
return result
|
1434
|
+
end
|
1435
|
+
|
1436
|
+
# Use to get index of given rating
|
1437
|
+
# * *Args* :
|
1438
|
+
# - +rating+ -> rating string to get index of
|
1439
|
+
# - +flags+ -> valid rating flags
|
1440
|
+
# * *Returns* :
|
1441
|
+
# - index of specified rating flag , nil for invalid rating flag
|
1442
|
+
def parental_rating_index rating, flags = valid_parental_ratings
|
1443
|
+
index = flags.index{|flag| flag[0].casecmp(rating) == 0}
|
1444
|
+
loginfo2 "Invalid rating flag : #{rating}" if index.nil?
|
1445
|
+
return index
|
1446
|
+
end
|
1447
|
+
|
1448
|
+
# Use it to verify the catalog info from web-based Diagnostics page for the STB and MAS.
|
1449
|
+
# * *Returns* :
|
1450
|
+
# - true if atleast one value of catalog info from web-based Diagnostics page for the STB matches with MAS"
|
1451
|
+
def verify_mas_catalogs_with_stb_catalogs?
|
1452
|
+
ip = fetch_ip
|
1453
|
+
if ip.nil?
|
1454
|
+
loginfo2 'STB does not have an IP address'
|
1455
|
+
return false
|
1456
|
+
end
|
1457
|
+
return false unless has_valid_ip?(ip)
|
1458
|
+
web_diag_catalog = []
|
1459
|
+
loginfo2 "Fetching catalogs directory from web diags"
|
1460
|
+
if stb_capable_of? 'MDN'
|
1461
|
+
web_diag_catalog = _fetch_mdn_airtime_catalog_id ip
|
1462
|
+
elsif stb_capable_of? 'ODN'
|
1463
|
+
web_diag_catalog = _fetch_odn_airtime_catalog_id ip
|
1464
|
+
end
|
1465
|
+
if web_diag_catalog.empty?
|
1466
|
+
loginfo2 "Unable to fetch catalog directory from web diagnostics"
|
1467
|
+
return false
|
1468
|
+
end
|
1469
|
+
loginfo2 "Successfully fetched airtime catalogs directory from web diagnostics"
|
1470
|
+
|
1471
|
+
loginfo2 "Fetching catalogs list from MAS"
|
1472
|
+
mas_catalog = []
|
1473
|
+
mas_catalog = _fetch_catalog_info
|
1474
|
+
if mas_catalog.empty?
|
1475
|
+
loginfo2 "Unable to fetch catalog list from MAS"
|
1476
|
+
return false
|
1477
|
+
end
|
1478
|
+
loginfo2 "Successfully fetched airtime catalogs listing from MAS"
|
1479
|
+
|
1480
|
+
web_diag_catalog.each do |catalog|
|
1481
|
+
if mas_catalog.include?(catalog)
|
1482
|
+
loginfo2 "Airtime catalog ID [#{catalog}] matched in MAS cataogs list and Web diags catalogs directory"
|
1483
|
+
return true
|
1484
|
+
end
|
1485
|
+
end
|
1486
|
+
return false
|
1487
|
+
end
|
1488
|
+
|
1489
|
+
# Use it to read value of Instant replay jump value in seconds from MAS
|
1490
|
+
# * *Returns* :
|
1491
|
+
# - value of "Instant replay jump value in seconds"
|
1492
|
+
def mas_instant_replay_jump
|
1493
|
+
result = fetch_dvr_parameters
|
1494
|
+
|
1495
|
+
return '' if result.empty?
|
1496
|
+
loginfo2 "Instant Replay Jump(seconds): [#{result[2]}]"
|
1497
|
+
return result[2]
|
1498
|
+
end
|
1499
|
+
|
1500
|
+
# Use it to read value of Time Shift Buffer length from MAS
|
1501
|
+
# * *Returns* :
|
1502
|
+
# - value of "Time Shift Buffer length"
|
1503
|
+
def mas_tsb_length
|
1504
|
+
result = fetch_dvr_parameters
|
1505
|
+
|
1506
|
+
return '' if result.empty?
|
1507
|
+
loginfo2 "Time Shift Buffer length: [#{result[0]}]"
|
1508
|
+
return result[0]
|
1509
|
+
end
|
1510
|
+
|
1511
|
+
# Use it to read value of Paused session timeout from MAS
|
1512
|
+
# * *Returns* :
|
1513
|
+
# - value of "Paused session timeout" in seconds
|
1514
|
+
def mas_paused_session_timeout
|
1515
|
+
result = fetch_timeout_parameters
|
1516
|
+
|
1517
|
+
return '' if result.empty?
|
1518
|
+
loginfo2 "Paused Session Timeout (seconds) : [#{result[13]}]"
|
1519
|
+
return result[13]
|
1520
|
+
end
|
1521
|
+
|
1522
|
+
# Use it to read value of Menu timeout in seconds from MAS
|
1523
|
+
# * *Returns* :
|
1524
|
+
# - value of "Menu timeout" in seconds
|
1525
|
+
def mas_menu_timeout
|
1526
|
+
result = fetch_timeout_parameters
|
1527
|
+
|
1528
|
+
return '' if result.empty?
|
1529
|
+
loginfo2 "Menu Timeout (seconds) : [#{result[2]}]"
|
1530
|
+
return result[2]
|
1531
|
+
end
|
1532
|
+
|
1533
|
+
# Use it to read value of # of Hours of Inactivity to Enter Low Power State(hours) from MAS
|
1534
|
+
# * *Returns* :
|
1535
|
+
# - value of "# of Hours of Inactivity to Enter Low Power State(hours)"
|
1536
|
+
def mas_hours_of_inactivity_to_enter_low_power
|
1537
|
+
result = fetch_power_save_settings
|
1538
|
+
|
1539
|
+
return '' if result.empty?
|
1540
|
+
loginfo2 "No. of Hours of Inactivity to Enter Low Power State(hours) : [#{result[0]}]"
|
1541
|
+
return result[0]
|
1542
|
+
end
|
1543
|
+
|
1544
|
+
# Use it to clear buffer for currently tuned channel by navigating 2 channels up and then move back to current channel
|
1545
|
+
# * *Returns* :
|
1546
|
+
# - true if successfully else false
|
1547
|
+
def clear_buffer_for_current_channel
|
1548
|
+
# Move up two channels
|
1549
|
+
channel_up_count = 0
|
1550
|
+
video_channels_count = 0
|
1551
|
+
max_count = 50 # to avoid infinite loop
|
1552
|
+
|
1553
|
+
# tune channel up until 2 channels with video found
|
1554
|
+
max_count.times do
|
1555
|
+
press_channel_up_sleep
|
1556
|
+
sleep_for_last_tuned_channel
|
1557
|
+
|
1558
|
+
video_channels_count+=1 if fullscreen_video_playing? # increment video channel count
|
1559
|
+
channel_up_count+=1 # increment channel up count
|
1560
|
+
|
1561
|
+
break if video_channels_count >= 2
|
1562
|
+
end
|
1563
|
+
|
1564
|
+
if video_channels_count < 2
|
1565
|
+
loginfo2 "Failed to get 2 video channels",true,true
|
1566
|
+
return false
|
1567
|
+
end
|
1568
|
+
|
1569
|
+
# tune back to home channel
|
1570
|
+
channel_up_count.times do
|
1571
|
+
sleep_for_last_tuned_channel
|
1572
|
+
press_channel_down_sleep
|
1573
|
+
end
|
1574
|
+
|
1575
|
+
loginfo2 "Successfully cleared buffer for current channel"
|
1576
|
+
return true
|
1577
|
+
end
|
1578
|
+
|
1579
|
+
# Use convert time in seconds to hour:min format
|
1580
|
+
# * *Args* :
|
1581
|
+
# - +seconds+ -> number of seconds
|
1582
|
+
# * *Returns* :
|
1583
|
+
# - time text string in "hour:min" format
|
1584
|
+
def seconds_to_hour_min_text seconds
|
1585
|
+
# convert seconds to integer
|
1586
|
+
seconds = seconds.to_s.to_i
|
1587
|
+
|
1588
|
+
hours = (seconds / (60 * 60)).to_s.to_i
|
1589
|
+
mins = ((seconds - (hours * 60 * 60)) / 60).to_s.to_i
|
1590
|
+
mins = "0#{mins}" if mins < 10 # add prefix '0' for single digit mins
|
1591
|
+
return "#{hours}:#{mins}"
|
1592
|
+
end
|
1593
|
+
|
1594
|
+
# Use it to switch-off the STB power.
|
1595
|
+
def stb_power_off
|
1596
|
+
ac_power_sleep = fetch_option(:stb_ac_power_on_off_wait_in_seconds)
|
1597
|
+
if ac_power_sleep.nil?
|
1598
|
+
loginfo2 "Config parameter [:stb_ac_power_on_off_wait_in_seconds] is not set"
|
1599
|
+
return false
|
1600
|
+
end
|
1601
|
+
ac_power_sleep = ac_power_sleep.to_s.to_i
|
1602
|
+
|
1603
|
+
begin
|
1604
|
+
ac_power(false)
|
1605
|
+
loginfo2 "Sleeping for AC power OFF ...(#{ac_power_sleep} seconds)"
|
1606
|
+
sleep ac_power_sleep.sec
|
1607
|
+
loginfo2 "Successfully AC powered OFF STB"
|
1608
|
+
|
1609
|
+
return true
|
1610
|
+
rescue StandardError => e
|
1611
|
+
logdebug "Exception : #{e.message}"
|
1612
|
+
logdebug e.backtrace.join("\n")
|
1613
|
+
|
1614
|
+
loginfo2 "Failed to powered off STB using AC power"
|
1615
|
+
return false
|
1616
|
+
end
|
1617
|
+
end
|
1618
|
+
|
1619
|
+
# Use it to verify whether STB bootup screen appears or not
|
1620
|
+
def stb_reboot_loading_message_appears?(retries=2)
|
1621
|
+
icon1 = :fullscreen_reboot_message_icon1 # cisco or powertv or samsung
|
1622
|
+
icon2 = :fullscreen_reboot_message_icon2 # mystro
|
1623
|
+
|
1624
|
+
if stb_capable_of?('ODN')
|
1625
|
+
return true if (screen_matches_for_icon_roi(icon1,icon1,retries) or screen_matches_for_icon_roi(icon2,icon2,retries))
|
1626
|
+
else
|
1627
|
+
return true if (screen_matches_for_icon_roi(icon1,icon1,retries) or golden_copy_matches_for_roi(icon2,retries))
|
1628
|
+
end
|
1629
|
+
|
1630
|
+
loginfo2 "Reboot loading message does not appear on the screen",true
|
1631
|
+
return false
|
1632
|
+
end
|
1633
|
+
|
1634
|
+
# Use it to reboot STB using AC power on/off
|
1635
|
+
def stb_reboot_using_ac_power
|
1636
|
+
# ac_power_sleep = fetch_option(:stb_ac_power_on_off_wait_in_seconds)
|
1637
|
+
# if ac_power_sleep.nil?
|
1638
|
+
# loginfo2 "Config parameter [:stb_ac_power_on_off_wait_in_seconds] is not set"
|
1639
|
+
# return false
|
1640
|
+
# end
|
1641
|
+
# ac_power_sleep = ac_power_sleep.to_s.to_i
|
1642
|
+
ac_power_sleep = 3
|
1643
|
+
begin
|
1644
|
+
ac_power(false)
|
1645
|
+
loginfo2 "Sleeping for AC power OFF ...(#{ac_power_sleep} seconds)"
|
1646
|
+
sleep ac_power_sleep.sec
|
1647
|
+
loginfo2 "Successfully AC powered OFF STB"
|
1648
|
+
|
1649
|
+
ac_power(true)
|
1650
|
+
#loginfo2 "Sleeping for AC power ON ...(#{ac_power_sleep} seconds)"
|
1651
|
+
#sleep ac_power_sleep.sec
|
1652
|
+
loginfo2 "Successfully AC powered ON STB"
|
1653
|
+
|
1654
|
+
return true
|
1655
|
+
rescue StandardError => e
|
1656
|
+
logdebug "Exception : #{e.message}"
|
1657
|
+
logdebug e.backtrace.join("\n")
|
1658
|
+
|
1659
|
+
loginfo2 "Failed to reboot STB using AC power"
|
1660
|
+
return false
|
1661
|
+
end
|
1662
|
+
end
|
1663
|
+
|
1664
|
+
# Use it to power on stb within given duration
|
1665
|
+
# * *Args* :
|
1666
|
+
# - +duration+ -> duration in minutes
|
1667
|
+
# * *Returns* :
|
1668
|
+
# - true if successfully else false
|
1669
|
+
def _power_on_stb_within_duration(duration=1)
|
1670
|
+
# Power on STB (within [x] min)
|
1671
|
+
failed_to_power_on_retry_count = (duration * 60) / 10
|
1672
|
+
failed_to_power_on_retry_count.times do
|
1673
|
+
if power_on_stb?
|
1674
|
+
return true
|
1675
|
+
end
|
1676
|
+
sleep 10.sec # wait for few seconds
|
1677
|
+
end
|
1678
|
+
return false
|
1679
|
+
end
|
1680
|
+
|
1681
|
+
# Use it to power on stb and verify loading message/icon
|
1682
|
+
# * *Returns* :
|
1683
|
+
# - true if successfully else false
|
1684
|
+
def _power_on_stb_and_verify_reboot_loading_screen
|
1685
|
+
2.times do
|
1686
|
+
_power_on_stb_within_duration
|
1687
|
+
return true if stb_reboot_loading_message_appears?(1) # only 1 retry
|
1688
|
+
end
|
1689
|
+
return false
|
1690
|
+
end
|
1691
|
+
|
1692
|
+
# Private method
|
1693
|
+
# Use it to reset application screen back to stretched mode
|
1694
|
+
def _stb_p550hd_reset_application_aspect_ratio(retries=3)
|
1695
|
+
retries.times do
|
1696
|
+
press_exit_sleep
|
1697
|
+
press_settings_sleep
|
1698
|
+
sleep 10.sec # wait for STB to load settings screen
|
1699
|
+
# Navigate to aspect ratio
|
1700
|
+
4.times do
|
1701
|
+
press_right_arrow_sleep
|
1702
|
+
end
|
1703
|
+
# Select focused setting (aspect ratio)
|
1704
|
+
press_select_sleep
|
1705
|
+
# Select default setting
|
1706
|
+
press_select_sleep
|
1707
|
+
# Exit to fullscreen
|
1708
|
+
press_exit_sleep
|
1709
|
+
# Verify using info banner
|
1710
|
+
return true if info_banner_launch_and_verify(true,true)
|
1711
|
+
end
|
1712
|
+
|
1713
|
+
loginfo2 "Failed to reset aspect ratio"
|
1714
|
+
return false
|
1715
|
+
end
|
1716
|
+
|
1717
|
+
# Use it to wait till STB finished rebooting
|
1718
|
+
# * *Args* :
|
1719
|
+
# - +apc_reboot+ -> reboot STB again using AC power if failed to reboot
|
1720
|
+
# * *Returns* :
|
1721
|
+
# - true if successfully finished rebooting else false
|
1722
|
+
def stb_wait_till_finish_rebooting(apc_reboot = false)
|
1723
|
+
waiting_time = fetch_option(:stb_reboot_wait_time_in_minutes).to_s.to_i
|
1724
|
+
|
1725
|
+
failed_to_power_on_retry_count = 6
|
1726
|
+
|
1727
|
+
waiting_time.times do
|
1728
|
+
# Power on STB (within 1 min)
|
1729
|
+
unless _power_on_stb_within_duration(1)
|
1730
|
+
if apc_reboot
|
1731
|
+
loginfo2 "Failed to power ON STB, rebooting STB using AC power ..."
|
1732
|
+
return false unless stb_reboot_using_ac_power
|
1733
|
+
return stb_wait_till_finish_rebooting
|
1734
|
+
else
|
1735
|
+
loginfo2 "Failed to power on STB"
|
1736
|
+
return false
|
1737
|
+
end
|
1738
|
+
end
|
1739
|
+
|
1740
|
+
# exit to fullscreen
|
1741
|
+
press_exit_sleep
|
1742
|
+
|
1743
|
+
if _power_on_stb_and_verify_reboot_loading_screen
|
1744
|
+
loginfo2 "STB booting up, Please wait ...", true
|
1745
|
+
sleep 1.min
|
1746
|
+
else
|
1747
|
+
unless power_on_stb? # it may possible that STB will switch to standby mode after reboot
|
1748
|
+
loginfo2 "Failed to power on STB"
|
1749
|
+
return false
|
1750
|
+
end
|
1751
|
+
loginfo2 "STB is ON",true
|
1752
|
+
# Reset Aspect ratio for P550HD
|
1753
|
+
(return false unless _stb_p550hd_reset_application_aspect_ratio) if fetch_stb_model.upcase.eql?('P550HD')
|
1754
|
+
(return false unless stb_undo_black_n_white) if check_models?('SA8010HD')
|
1755
|
+
return true # successfully finished rebooting
|
1756
|
+
end
|
1757
|
+
end
|
1758
|
+
|
1759
|
+
# if STB still loading then reboot the STB again
|
1760
|
+
if apc_reboot
|
1761
|
+
loginfo2 "STB still loading, rebooting again",true
|
1762
|
+
return false unless stb_reboot_using_ac_power
|
1763
|
+
return stb_wait_till_finish_rebooting
|
1764
|
+
else
|
1765
|
+
loginfo2 "STB has not finished loading within [#{waiting_time}] minutes, Please check",true
|
1766
|
+
return false
|
1767
|
+
end
|
1768
|
+
end
|
1769
|
+
|
1770
|
+
# Use it to switch-on the STB power.
|
1771
|
+
# * *Args* :
|
1772
|
+
# - +return_when_up+ -> if true, this method waits till STB properly boots up.
|
1773
|
+
# * *Returns* :
|
1774
|
+
# - true, if STB seems operational, false otherwise.
|
1775
|
+
def stb_power_on(return_when_up = false)
|
1776
|
+
ac_power_sleep = fetch_option(:stb_ac_power_on_off_wait_in_seconds)
|
1777
|
+
if ac_power_sleep.nil?
|
1778
|
+
loginfo2 "Config parameter [:stb_ac_power_on_off_wait_in_seconds] is not set"
|
1779
|
+
return false
|
1780
|
+
end
|
1781
|
+
ac_power_sleep = ac_power_sleep.to_s.to_i
|
1782
|
+
|
1783
|
+
begin
|
1784
|
+
ac_power(true)
|
1785
|
+
loginfo2 "Sleeping for AC power ON ...(#{ac_power_sleep} seconds)"
|
1786
|
+
sleep ac_power_sleep.sec
|
1787
|
+
loginfo2 "Successfully AC powered ON STB"
|
1788
|
+
rescue StandardError => e
|
1789
|
+
logdebug "Exception : #{e.message}"
|
1790
|
+
logdebug e.backtrace.join("\n")
|
1791
|
+
|
1792
|
+
loginfo2 "Failed to powered on STB using AC power"
|
1793
|
+
return false
|
1794
|
+
end
|
1795
|
+
|
1796
|
+
return true unless return_when_up
|
1797
|
+
|
1798
|
+
return stb_wait_till_finish_rebooting(false)
|
1799
|
+
end
|
1800
|
+
|
1801
|
+
# Use it to verify the STB operational mode.
|
1802
|
+
# * *Args* :
|
1803
|
+
# - +mode+ -> adsg or davic
|
1804
|
+
# * *Returns* :
|
1805
|
+
# - true, if STB operational in the mode(adsg/davic) passed, false otherwise.
|
1806
|
+
def verify_stb_mode(mode='adsg')
|
1807
|
+
ip = fetch_ip
|
1808
|
+
return false if ip.nil?
|
1809
|
+
return false unless has_valid_ip?(ip)
|
1810
|
+
return (get_snmp("#{ip}", '1.3.6.1.4.1.4491.2.3.1.1.4.5.3.0', 'public') == '2') if mode.casecmp('adsg') == 0
|
1811
|
+
return (get_snmp("#{ip}", '1.3.6.1.4.1.4491.2.3.1.1.4.5.3.0', 'public') != '2') if mode.casecmp('davic') == 0
|
1812
|
+
end
|
1813
|
+
|
1814
|
+
# Use it to find details of PPV program on particular channel, time, name, duration etc
|
1815
|
+
# * *Args* :
|
1816
|
+
# - +params+ -> data hash e.g params = {{:CHANNEL_NUMBER => 85, :CHANNEL_NUMBERS => [80, 85, 45], :START_DATE_TIME => [0, '1:00'] OR ruby_time, :END_DATE_TIME => [0, '2:00'] OR ruby_time}}
|
1817
|
+
# - all return array parameters can be passed as argument
|
1818
|
+
# - Valid PROGRAM_WINDOW_NAME = 'LIFETIME_WINDOW', 'PREVIEW_WINDOW', 'BUY_WINDOW', 'CANCEL_WINDOW', 'ADVERTISING_WINDOW', 'MARKETING_WINDOW', 'FREE_CANCEL_WINDOW'
|
1819
|
+
# * *Returns* :
|
1820
|
+
# - Returns an Array of programs as a MultiHashMap each hash will contain the following keys CHANNEL_NUMBER, CHANNEL_NAME, PROGRAM_SHORT_TITLE, PROGRAM_COST, PROGRAM_TYPE, PROGRAM_EVENT_ID, ADVERTISING_WINDOW, BUY_WINDOW, CANCEL_WINDOW, LIFETIME_WINDOW, MARKETING_WINDOW, PREVIEW_WINDOW
|
1821
|
+
# - Each window type will contain a Hash Map with start time and duration as keys
|
1822
|
+
def find_ppv_programs(params={}, curr_date = mas_current_date)
|
1823
|
+
|
1824
|
+
where_clause = ''
|
1825
|
+
where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL = #{params[:CHANNEL_NUMBER]}" if (!params[:CHANNEL_NUMBER].nil? && params[:CHANNEL_NUMBER].to_s.to_i >= 0)
|
1826
|
+
where_clause << " AND MYSTRO_CHANNEL.DISPLAY_CHANNEL IN (#{params[:CHANNEL_NUMBERS].join(',')})" if (!params[:CHANNEL_NUMBERS].nil? && params[:CHANNEL_NUMBERS].class == Array && !(params[:CHANNEL_NUMBERS].empty?))
|
1827
|
+
where_clause << " AND UPPER(MYSTRO_SERVICE.DISPLAY_NAME) LIKE '%#{params[:CHANNEL_NAME].to_s.upcase}%'" if (!params[:CHANNEL_NAME].nil? && params[:CHANNEL_NAME].strip != '')
|
1828
|
+
where_clause << " AND UPPER(PPV_EVENT_INFO.EVENT_TITLE) LIKE '%#{params[:PROGRAM_SHORT_TITLE].to_s.upcase}%'" if (!params[:PROGRAM_SHORT_TITLE].nil? && params[:PROGRAM_SHORT_TITLE].strip != '')
|
1829
|
+
where_clause << " AND (( PPV_TIME_WINDOW.START_TIME + (PPV_TIME_WINDOW.DURATION/(24*60*60))) > #{_parse_date(params[:START_DATE_TIME], curr_date)})" if (!params[:START_DATE_TIME].nil?)
|
1830
|
+
where_clause << " AND WINDOW_TYPE.WINDOW_NAME = '#{params[:WINDOW_NAME].to_s.upcase}'" if (!params[:WINDOW_NAME].nil?)
|
1831
|
+
where_clause << " AND PPV_EVENT_INFO.PPV_TYPE=2" # 2 means RPPV events
|
1832
|
+
|
1833
|
+
loginfo2 "WhereClause : #{where_clause}"
|
1834
|
+
|
1835
|
+
data_arr = mas_db_guide_data_for_ppv_programs where_clause
|
1836
|
+
|
1837
|
+
channels = []
|
1838
|
+
channels.push(params[:CHANNEL_NUMBER].to_s.to_i) unless params[:CHANNEL_NUMBER].nil?
|
1839
|
+
channels = channels + params[:CHANNEL_NUMBERS].to_i_arr unless params[:CHANNEL_NUMBERS].nil?
|
1840
|
+
|
1841
|
+
airing_and_future_programs = guide_screen_airing_and_future_programs(channels)
|
1842
|
+
logdebug "Total PPV programs [Guide] : #{airing_and_future_programs.length}"
|
1843
|
+
result_arr = []
|
1844
|
+
|
1845
|
+
return result_arr if data_arr.nil?
|
1846
|
+
|
1847
|
+
data_arr.each do |data_hash|
|
1848
|
+
time_arr = data_hash['ADVERTISING_WINDOW'].to_s.split('/')
|
1849
|
+
advertising_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1850
|
+
|
1851
|
+
time_arr = data_hash['BUY_WINDOW'].to_s.split('/')
|
1852
|
+
buy_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1853
|
+
|
1854
|
+
time_arr = data_hash['CANCEL_WINDOW'].to_s.split('/')
|
1855
|
+
cancel_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1856
|
+
|
1857
|
+
time_arr = data_hash['FREE_CANCEL_WINDOW'].to_s.split('/')
|
1858
|
+
free_cancel_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1859
|
+
|
1860
|
+
time_arr = data_hash['LIFETIME_WINDOW'].to_s.split('/')
|
1861
|
+
lifetime_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1862
|
+
|
1863
|
+
time_arr = data_hash['MARKETING_WINDOW'].to_s.split('/')
|
1864
|
+
marketing_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1865
|
+
|
1866
|
+
time_arr = data_hash['PREVIEW_WINDOW'].to_s.split('/')
|
1867
|
+
preview_window_start_time = time_arr.empty? ? nil : Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1868
|
+
|
1869
|
+
guide_prog = airing_and_future_programs.select{|prog| prog[2].to_i.eql?(lifetime_window_start_time.to_i) and prog[0].to_i.eql?(data_hash['CHANNEL_NUMBER'].to_s.to_i)}[0]
|
1870
|
+
|
1871
|
+
# ignore asset/event if no matching guide data found
|
1872
|
+
next if guide_prog.nil?
|
1873
|
+
|
1874
|
+
prog_long_title = guide_prog[5]
|
1875
|
+
prog_short_title = guide_prog[4]
|
1876
|
+
|
1877
|
+
ppv_program = {
|
1878
|
+
:event_id => data_hash['PPV_EVENT_INFO_ID'],
|
1879
|
+
:channel_number => data_hash['CHANNEL_NUMBER'].to_s.to_i,
|
1880
|
+
:channel_name => data_hash['CHANNEL_NAME'].to_s,
|
1881
|
+
:short_title => prog_short_title,
|
1882
|
+
:long_title => prog_long_title,
|
1883
|
+
:prog_cost => data_hash['PPV_EVENT_COST'].to_s.to_f,
|
1884
|
+
:prog_type => data_hash['PPV_TYPE'].to_s,
|
1885
|
+
}
|
1886
|
+
|
1887
|
+
ppv_program[:ADVERTISING_WINDOW] = {:start_time => advertising_window_start_time, :duration => data_hash['ADVERTISING_WINDOW_DURATION'].to_s.to_i} if advertising_window_start_time
|
1888
|
+
ppv_program[:BUY_WINDOW] = {:start_time => buy_window_start_time, :duration => data_hash['BUY_WINDOW_DURATION'].to_s.to_i} if buy_window_start_time
|
1889
|
+
ppv_program[:CANCEL_WINDOW] = {:start_time => cancel_window_start_time, :duration => data_hash['CANCEL_WINDOW_DURATION'].to_s.to_i} if cancel_window_start_time
|
1890
|
+
ppv_program[:FREE_CANCEL_WINDOW] = {:start_time => free_cancel_window_start_time, :duration => data_hash['FREE_CANCEL_WINDOW_DURATION'].to_s.to_i} if free_cancel_window_start_time
|
1891
|
+
ppv_program[:LIFETIME_WINDOW] = {:start_time => lifetime_window_start_time, :duration => data_hash['LIFETIME_WINDOW_DURATION'].to_s.to_i} if lifetime_window_start_time
|
1892
|
+
ppv_program[:MARKETING_WINDOW] = {:start_time => marketing_window_start_time, :duration => data_hash['MARKETING_WINDOW_DURATION'].to_s.to_i} if marketing_window_start_time
|
1893
|
+
ppv_program[:PREVIEW_WINDOW] = {:start_time => preview_window_start_time, :duration => data_hash['PREVIEW_WINDOW_DURATION'].to_s.to_i} if preview_window_start_time
|
1894
|
+
|
1895
|
+
result_arr.push(ppv_program)
|
1896
|
+
end
|
1897
|
+
|
1898
|
+
logdebug "Total PPV programs : #{result_arr.length}"
|
1899
|
+
return result_arr
|
1900
|
+
end
|
1901
|
+
|
1902
|
+
# Use it to find lookback program on given channel using MAS query
|
1903
|
+
# * *Args* :
|
1904
|
+
# - +channel_number+ -> integer channel number
|
1905
|
+
# - +without_multiple_listing+ -> true to filtered out programs with multiple listing
|
1906
|
+
# - +expire_after+ -> program expiry time is after [x] minutes
|
1907
|
+
# * *Returns* :
|
1908
|
+
# - Array of lookback programs
|
1909
|
+
# - each program is hash of program details
|
1910
|
+
#( day, day_sequence, program_name, program_desc, program_sequence,program_duration_mins,program_rating,program_start_time,program_end_time,
|
1911
|
+
# program_content_type,program_genre,license_window_start,license_window_end)
|
1912
|
+
def find_lookback_programs channel_number, without_multiple_listing=false, expire_after=10
|
1913
|
+
channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
|
1914
|
+
|
1915
|
+
menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
|
1916
|
+
|
1917
|
+
lookback_programs = []
|
1918
|
+
|
1919
|
+
return lookback_programs if menu_name.nil?
|
1920
|
+
|
1921
|
+
current_time = mas_current_date
|
1922
|
+
|
1923
|
+
# RegEx for time string
|
1924
|
+
re1='((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\\s?(?:am|AM|pm|PM))?)' # HourMinuteSec 1
|
1925
|
+
re=(re1)
|
1926
|
+
m=Regexp.new(re,Regexp::IGNORECASE);
|
1927
|
+
|
1928
|
+
# Advisory flags
|
1929
|
+
flags = _valid_advisory_flags
|
1930
|
+
# genre codes
|
1931
|
+
genre_codes = valid_genre_codes
|
1932
|
+
|
1933
|
+
# Total asset counter
|
1934
|
+
total_programs_count = 0
|
1935
|
+
folder_sequence = 0
|
1936
|
+
data_arr1 = mas_db_look_back_folders(menu_name)
|
1937
|
+
|
1938
|
+
if data_arr1.empty?
|
1939
|
+
loginfo2 "Lookback data not found for channel : #{channel_number}",false
|
1940
|
+
return lookback_programs
|
1941
|
+
end
|
1942
|
+
|
1943
|
+
# check if day folder available or not
|
1944
|
+
if(data_arr1[0]['NODE_TYPE'].to_s.to_i == 3)
|
1945
|
+
data_arr1 = [data_arr1[0]['PARENT_NODE_ID'].to_s]
|
1946
|
+
end
|
1947
|
+
|
1948
|
+
data_arr1.each {|data_hash1|
|
1949
|
+
# default folder sequence update to false
|
1950
|
+
update_folder_sequence = false
|
1951
|
+
|
1952
|
+
folder_id = ""
|
1953
|
+
if data_hash1.is_a?String
|
1954
|
+
folder_id = data_hash1
|
1955
|
+
folder_sequence = -1 # no sub folder
|
1956
|
+
else
|
1957
|
+
folder_id = data_hash1['MENU_NODE_ID']
|
1958
|
+
end
|
1959
|
+
|
1960
|
+
data_arr2 = mas_db_look_back_programs_in_folder(folder_id)
|
1961
|
+
|
1962
|
+
# update total programs count
|
1963
|
+
total_programs_count += (data_arr2.length)
|
1964
|
+
|
1965
|
+
lookback_prog_sequence = 0
|
1966
|
+
prev_lookback_progs_end_time = []
|
1967
|
+
data_arr2.each {|data_hash2|
|
1968
|
+
time_arr = data_hash2['PROGRAM_START'].to_s.split('/')
|
1969
|
+
program_start = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1970
|
+
time_arr = data_hash2['PROGRAM_END'].to_s.split('/')
|
1971
|
+
program_end = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1972
|
+
time_arr = data_hash2['LICENSE_WINDOW_START'].to_s.split('/')
|
1973
|
+
license_window_start = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1974
|
+
time_arr = data_hash2['LICENSE_WINDOW_END'].to_s.split('/')
|
1975
|
+
license_window_end = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
1976
|
+
closed_captioned = (data_hash2['MYSTRO_EVENT_CODE'].to_s.empty?)? (false):(data_hash2['MYSTRO_EVENT_CODE'].to_s.to_i.to_s(2)[-4,1].eql?("1")) # 4th index from right is closed caption
|
1977
|
+
# add to program list
|
1978
|
+
prog_hash = {
|
1979
|
+
:day => data_hash1['NODE_NAME'].to_s,
|
1980
|
+
:day_sequence => folder_sequence,
|
1981
|
+
:channel_number => channel_number.to_s.to_i,
|
1982
|
+
:program_name => data_hash2['NODE_NAME'].to_s,
|
1983
|
+
:program_desc => data_hash2['NODE_DESC'].to_s,
|
1984
|
+
:program_sequence => lookback_prog_sequence,
|
1985
|
+
:program_duration_mins => data_hash2['EVENT_DURATION'].to_s.to_i,
|
1986
|
+
:program_rating => data_hash2['RATING'].to_s,
|
1987
|
+
:program_start_time => program_start,
|
1988
|
+
:program_end_time => program_end,
|
1989
|
+
:program_content_type => _advisory_flags_from_advisory_code(data_hash2['ADVISORY_CODE'], flags),
|
1990
|
+
:program_genre => genre_names_from(data_hash2['GENRE_CODE'].to_s,genre_codes),
|
1991
|
+
:license_window_start => license_window_start,
|
1992
|
+
:license_window_end => license_window_end,
|
1993
|
+
:closed_captioned => closed_captioned,
|
1994
|
+
}
|
1995
|
+
|
1996
|
+
# Push prog details to array if required
|
1997
|
+
expiry_time_left = (prog_hash[:program_end_time] - current_time).to_i
|
1998
|
+
|
1999
|
+
if expiry_time_left > 0
|
2000
|
+
# Update first prog
|
2001
|
+
prev_lookback_progs_end_time.push(prog_hash[:program_end_time])
|
2002
|
+
|
2003
|
+
# increment sequence
|
2004
|
+
lookback_prog_sequence += 1
|
2005
|
+
update_folder_sequence = true
|
2006
|
+
end
|
2007
|
+
|
2008
|
+
if (expiry_time_left > (expire_after * 60) and (prog_hash[:program_start_time] + (prog_hash[:program_duration_mins] * 60)) < current_time)
|
2009
|
+
prog_hash[:prev_lookback_progs_end_time] = prev_lookback_progs_end_time.dup
|
2010
|
+
|
2011
|
+
lookback_programs.push(prog_hash) if !without_multiple_listing or (without_multiple_listing and (m.match(data_hash2['NODE_NAME'].to_s)).nil?)
|
2012
|
+
elsif expiry_time_left > 0
|
2013
|
+
logdebug "Program will expire in [#{expiry_time_left}] seconds : #{prog_hash}"
|
2014
|
+
end
|
2015
|
+
}
|
2016
|
+
|
2017
|
+
# Update folder sequence counter
|
2018
|
+
folder_sequence+=1 if update_folder_sequence
|
2019
|
+
}
|
2020
|
+
logdebug "Total lookback programs - #{lookback_programs.length} : Lookback program(s) --> [#{lookback_programs}]"
|
2021
|
+
return lookback_programs
|
2022
|
+
end
|
2023
|
+
|
2024
|
+
# Use it to find lookback folders on given channel using MAS query
|
2025
|
+
# * *Args* :
|
2026
|
+
# - +channel_number+ -> integer channel number
|
2027
|
+
# * *Returns* :
|
2028
|
+
# - Array of lookback day strings (e.g. Today, Sunday, 11/22, etc.)
|
2029
|
+
def find_lookback_folders channel_number
|
2030
|
+
programs = find_lookback_programs(channel_number)
|
2031
|
+
return [] if programs.empty?
|
2032
|
+
|
2033
|
+
if programs[0][:day_sequence]==-1
|
2034
|
+
loginfo2 "Programs are not in sub folders"
|
2035
|
+
return []
|
2036
|
+
end
|
2037
|
+
|
2038
|
+
folders = programs.collect{|prog| prog[:day]}.uniq
|
2039
|
+
return folders
|
2040
|
+
end
|
2041
|
+
|
2042
|
+
# Use it to find quick clips on given channel using MAS query
|
2043
|
+
# * *Args* :
|
2044
|
+
# - +channel_number+ -> integer channel number
|
2045
|
+
# * *Returns* :
|
2046
|
+
# - Array of quick clips
|
2047
|
+
# - each clip is hash of details ( :name, :sequence, :desc, :rating, :duration, :path, :menu_node_id)
|
2048
|
+
def find_quickclips channel_number
|
2049
|
+
channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
|
2050
|
+
|
2051
|
+
menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
|
2052
|
+
return [] if menu_name.nil?
|
2053
|
+
quickclip_list = []
|
2054
|
+
enhanced_menu_data = (mas_db_quickclips menu_name) # Fetch enhanced menu data
|
2055
|
+
if enhanced_menu_data.empty? # Check for empty data
|
2056
|
+
loginfo2 "Failed to fetch enhanced menu data for channel :[#{channel_name}]"
|
2057
|
+
return []
|
2058
|
+
end
|
2059
|
+
quick_clip_nodes = enhanced_menu_data.select{|data| data['NODE_TYPE'].to_s.to_i==3} # Select playble assets
|
2060
|
+
quick_clip_nodes.each{|clip|
|
2061
|
+
# Get all folders with sequence for clip
|
2062
|
+
node = clip
|
2063
|
+
folders = []
|
2064
|
+
while !(node['PARENT_NODE_ID'].to_s.empty?) # Find folders
|
2065
|
+
parent = enhanced_menu_data.select{|data| data['MENU_NODE_ID']==node['PARENT_NODE_ID']}[0]
|
2066
|
+
folders.push([parent['NODE_SEQUENCE'].to_s.to_i, parent['NODE_NAME']])
|
2067
|
+
node = parent
|
2068
|
+
end
|
2069
|
+
|
2070
|
+
data_hash = {
|
2071
|
+
:menu_node_id => clip['MENU_NODE_ID'].to_s.to_i,
|
2072
|
+
:path => folders.reverse,
|
2073
|
+
:name => clip['NODE_NAME'],
|
2074
|
+
:sequence => clip['NODE_SEQUENCE'].to_s.to_i,
|
2075
|
+
:desc => clip['NODE_DESC'],
|
2076
|
+
}
|
2077
|
+
|
2078
|
+
# Assumption !!! : all folders except lookback are quick clips and folders only (node type 3)
|
2079
|
+
quickclip_list.push(data_hash) unless data_hash[:path].empty? or data_hash[:path][0][1].delete(' ').casecmp('lookback')==0 # Push data hash of only quick clips
|
2080
|
+
}
|
2081
|
+
|
2082
|
+
if quickclip_list.empty? # Check for empty data
|
2083
|
+
loginfo2 "Failed to fetch quick clip data for channel :[#{channel_name}]"
|
2084
|
+
return []
|
2085
|
+
end
|
2086
|
+
|
2087
|
+
# Fetch more details (e.g. rating and duration)
|
2088
|
+
id_array = quickclip_list.collect{|clip| clip[:menu_node_id]}
|
2089
|
+
more_info = mas_db_quickclip_more_info_for_ids id_array # Query of more info
|
2090
|
+
|
2091
|
+
if more_info.empty? # Check for empty data
|
2092
|
+
loginfo2 "Failed to fetch more info for quick clips on channel :[#{channel_name}]"
|
2093
|
+
return []
|
2094
|
+
end
|
2095
|
+
|
2096
|
+
quickclip_list.each{|clip| # Update existing data with more info
|
2097
|
+
info = more_info.select{|x| x['MENU_NODE_ID'].to_s.to_i==clip[:menu_node_id]}[0]
|
2098
|
+
clip[:rating] = info['RATING_FLAG_SHORT_DESC']
|
2099
|
+
clip[:duration] = info['DURATION_SECONDS']
|
2100
|
+
}
|
2101
|
+
|
2102
|
+
return quickclip_list
|
2103
|
+
end
|
2104
|
+
|
2105
|
+
# Use it to find enhanced menu video assets on given channel using MAS query
|
2106
|
+
# * *Args* :
|
2107
|
+
# - +channel_number+ -> integer channel number
|
2108
|
+
# * *Returns* :
|
2109
|
+
# - Array of video assets
|
2110
|
+
# - each asset is hash of details ( :name, :sequence, :desc, :rating, :duration, :path, :menu_node_id)
|
2111
|
+
def find_enhanced_menu_video_asset channel_number
|
2112
|
+
channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
|
2113
|
+
|
2114
|
+
menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
|
2115
|
+
return [] if menu_name.nil?
|
2116
|
+
|
2117
|
+
enhanced_menu_data = (mas_db_quickclips menu_name)
|
2118
|
+
video_asset_nodes = enhanced_menu_data.select{|data| data['NODE_TYPE'].to_s.to_i==3 and (data['PARENT_NODE_ID'].to_s.empty?)} # Select video assets
|
2119
|
+
|
2120
|
+
quickclip_list = []
|
2121
|
+
video_asset_nodes.each{|clip|
|
2122
|
+
# Get all folders with sequence for clip
|
2123
|
+
node = clip
|
2124
|
+
folders = []
|
2125
|
+
|
2126
|
+
data_hash = {
|
2127
|
+
:menu_node_id => clip['MENU_NODE_ID'].to_s.to_i,
|
2128
|
+
:path => folders.reverse,
|
2129
|
+
:name => clip['NODE_NAME'],
|
2130
|
+
:sequence => clip['NODE_SEQUENCE'].to_s.to_i,
|
2131
|
+
:desc => clip['NODE_DESC'],
|
2132
|
+
}
|
2133
|
+
|
2134
|
+
quickclip_list.push(data_hash)# Push data hash of video assets
|
2135
|
+
}
|
2136
|
+
|
2137
|
+
if quickclip_list.empty? # Check for empty data
|
2138
|
+
loginfo2 "Failed to fetch quick clip data for channel :[#{channel_name}]"
|
2139
|
+
return []
|
2140
|
+
end
|
2141
|
+
|
2142
|
+
# Fetch more details (e.g. rating and duration)
|
2143
|
+
id_array = quickclip_list.collect{|clip| clip[:menu_node_id]}
|
2144
|
+
more_info = mas_db_quickclip_more_info_for_ids id_array # Query of more info
|
2145
|
+
|
2146
|
+
if more_info.empty? # Check for empty data
|
2147
|
+
loginfo2 "Failed to fetch more info for quick clips on channel :[#{channel_name}]"
|
2148
|
+
return []
|
2149
|
+
end
|
2150
|
+
|
2151
|
+
filtered_list = []
|
2152
|
+
|
2153
|
+
quickclip_list.each{|clip| # Update existing data with more info
|
2154
|
+
info = more_info.select{|x| x['MENU_NODE_ID'].to_s.to_i==clip[:menu_node_id]}[0]
|
2155
|
+
clip[:rating] = info['RATING_FLAG_SHORT_DESC']
|
2156
|
+
clip[:duration] = info['DURATION_SECONDS']
|
2157
|
+
clip[:is_valid] = info['IS_VALID']
|
2158
|
+
if clip[:is_valid].to_s == '0'
|
2159
|
+
logdebug "Asset [#{clip[:name]}] is invalid"
|
2160
|
+
else
|
2161
|
+
filtered_list.push(clip)
|
2162
|
+
end
|
2163
|
+
}
|
2164
|
+
|
2165
|
+
return filtered_list
|
2166
|
+
end
|
2167
|
+
|
2168
|
+
# Use it to get Launch application option in enhanced menu
|
2169
|
+
#**NOTE!! Returns first level options only
|
2170
|
+
# * *Args* :
|
2171
|
+
# - +channel_number+ -> enhanced menu channel number
|
2172
|
+
# * *Returns* :
|
2173
|
+
# - option names as array
|
2174
|
+
def find_enhanced_menu_applications channel_number
|
2175
|
+
channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
|
2176
|
+
|
2177
|
+
menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
|
2178
|
+
return [] if menu_name.nil?
|
2179
|
+
|
2180
|
+
enhanced_menu_data = (mas_db_quickclips menu_name)
|
2181
|
+
|
2182
|
+
launch_application_data = enhanced_menu_data.select{|data| data['PARENT_NODE_ID'].to_s.empty? and data['NODE_TYPE'].to_s.to_i.eql?(4)}
|
2183
|
+
|
2184
|
+
if launch_application_data.empty?
|
2185
|
+
loginfo2 "Launch application option not found"
|
2186
|
+
return []
|
2187
|
+
end
|
2188
|
+
return launch_application_data.collect{|x| x['NODE_NAME'].to_s}
|
2189
|
+
end
|
2190
|
+
|
2191
|
+
# Use it to get Tune to service option in enhanced menu
|
2192
|
+
#**NOTE!! Returns first level options only
|
2193
|
+
# * *Args* :
|
2194
|
+
# - +channel_number+ -> enhanced menu channel number
|
2195
|
+
# * *Returns* :
|
2196
|
+
# - option names as array
|
2197
|
+
def find_enhanced_menu_services channel_number
|
2198
|
+
channel_name = guide_screen_channel_info(channel_number)[:service_name].strip
|
2199
|
+
|
2200
|
+
menu_name = _mas_conductor_fetch_enhanced_menu_for_service(channel_name)
|
2201
|
+
return [] if menu_name.nil?
|
2202
|
+
|
2203
|
+
enhanced_menu_data = (mas_db_quickclips menu_name)
|
2204
|
+
|
2205
|
+
tune_to_service_data = enhanced_menu_data.select{|data| data['PARENT_NODE_ID'].to_s.empty? and data['NODE_TYPE'].to_s.to_i.eql?(2)}
|
2206
|
+
|
2207
|
+
if tune_to_service_data.empty?
|
2208
|
+
loginfo2 "Tune to service option not found"
|
2209
|
+
return []
|
2210
|
+
end
|
2211
|
+
return tune_to_service_data.collect{|x| x['NODE_NAME'].to_s}
|
2212
|
+
end
|
2213
|
+
|
2214
|
+
# Use it to empty the HDD to given threshold level
|
2215
|
+
# * *Args* :
|
2216
|
+
# - +percentage_empty+ -> max threshold level
|
2217
|
+
# * *Returns* :
|
2218
|
+
# - true if successful else false
|
2219
|
+
def make_hdd_empty percentage_empty=70
|
2220
|
+
stb_ip = fetch_ip
|
2221
|
+
return false if stb_ip.nil?
|
2222
|
+
|
2223
|
+
hdd_status = _percentage_hdd_full(stb_ip)
|
2224
|
+
|
2225
|
+
return false if hdd_status.nil?
|
2226
|
+
|
2227
|
+
if hdd_status < percentage_empty
|
2228
|
+
loginfo2 "HDD is #{hdd_status} % full"
|
2229
|
+
return true
|
2230
|
+
end
|
2231
|
+
|
2232
|
+
# navigate to by date
|
2233
|
+
return false unless show_list_launch_and_verify(true,false)
|
2234
|
+
return false unless show_list_navigate_to_tab('by date')
|
2235
|
+
|
2236
|
+
while hdd_status >= percentage_empty
|
2237
|
+
return false unless show_list_screen_delete_focused_recorded_program
|
2238
|
+
|
2239
|
+
hdd_status = _percentage_hdd_full(stb_ip)
|
2240
|
+
return false if hdd_status.nil?
|
2241
|
+
end
|
2242
|
+
|
2243
|
+
# HDD full
|
2244
|
+
loginfo2 "HDD full #{hdd_status} %"
|
2245
|
+
return true
|
2246
|
+
end
|
2247
|
+
|
2248
|
+
# Private method
|
2249
|
+
# Use to record program on given channel and verify HDD full message
|
2250
|
+
# * *Args* :
|
2251
|
+
# - +channel+ -> channel to recording program on
|
2252
|
+
# * *Returns* :
|
2253
|
+
# - true if it's showing HDD full message else false
|
2254
|
+
def _record_program_and_verify_hdd_full_message channel, retries=2
|
2255
|
+
message = ""
|
2256
|
+
if stb_capable_of?('MDN')
|
2257
|
+
message = "Your program cannot be recorded now To make room, delete recordings from Show List"
|
2258
|
+
elsif stb_capable_of?('ODN')
|
2259
|
+
message = "No Room to Record, Storage Full To make room, delete recordings from Show List"
|
2260
|
+
end
|
2261
|
+
|
2262
|
+
2.times do
|
2263
|
+
press_exit_sleep
|
2264
|
+
press_exit_sleep
|
2265
|
+
|
2266
|
+
# tune to channel
|
2267
|
+
tune_immediately_to(channel)
|
2268
|
+
|
2269
|
+
# channel up/down to avoid failures where sometimes STB is not showing HDD full message
|
2270
|
+
press_channel_up_sleep
|
2271
|
+
press_channel_down_sleep
|
2272
|
+
|
2273
|
+
# exit to fullscreen
|
2274
|
+
press_exit_sleep
|
2275
|
+
|
2276
|
+
# start recording
|
2277
|
+
press_record_sleep
|
2278
|
+
|
2279
|
+
# sleep for 5 sec to avoid screen update lag
|
2280
|
+
sleep 5.sec
|
2281
|
+
|
2282
|
+
# verify HDD full message
|
2283
|
+
return true if ocr_text_similar_for_roi(:recording_attention_banner_storage_full_message,message,3, true, false, 0.50, true)
|
2284
|
+
end
|
2285
|
+
|
2286
|
+
loginfo2 "HDD full message not showing up on screen"
|
2287
|
+
return false
|
2288
|
+
end
|
2289
|
+
|
2290
|
+
# Private method
|
2291
|
+
# Use it to start instance recording on given channel and mark it as do not delete in show list
|
2292
|
+
# * *Args* :
|
2293
|
+
# - +channel_info+ -> channel info to record program
|
2294
|
+
# * *Returns* :
|
2295
|
+
# - airing program object if successful else false
|
2296
|
+
def _record_airing_program_with_do_not_delete_flag channel_info
|
2297
|
+
sleep_till_current_time_slot_having_min_duration_left(7)
|
2298
|
+
|
2299
|
+
airing_progs = []
|
2300
|
+
2.times do
|
2301
|
+
airing_progs = channel_info[:rec_channels].collect do |chnl|
|
2302
|
+
guide_screen_airing_program(chnl)
|
2303
|
+
end
|
2304
|
+
|
2305
|
+
# filter out nil programs
|
2306
|
+
airing_progs = airing_progs.select{|x| !x.nil?}
|
2307
|
+
|
2308
|
+
# filter airing programs
|
2309
|
+
curr_time = mas_current_date
|
2310
|
+
airing_progs = airing_progs.select{|p| (p[3] - curr_time).to_i > 300}
|
2311
|
+
|
2312
|
+
break unless airing_progs.empty?
|
2313
|
+
loginfo2 "Airing program is having less then 5 min left, Sleep for 5 min"
|
2314
|
+
sleep 5.min
|
2315
|
+
end
|
2316
|
+
|
2317
|
+
return nil if airing_progs.empty?
|
2318
|
+
shortest_prog = airing_progs.min {|a,b| a[3] <=> b[3]}
|
2319
|
+
|
2320
|
+
retries = ((shortest_prog[3] - mas_current_date).to_i / 60) / 5 # each interval is having 5 min sleep
|
2321
|
+
logdebug "HDD full max retreis count : #{retries}"
|
2322
|
+
|
2323
|
+
rec_in_progress = nil
|
2324
|
+
retries.times do
|
2325
|
+
start_time = Time.now
|
2326
|
+
airing_progs.each do |prog|
|
2327
|
+
prog_duration = (prog[3] - mas_current_date).to_i
|
2328
|
+
logdebug "Program duration left : [#{prog_duration/60}] minutes"
|
2329
|
+
next if(prog_duration <= (5*60)) # break if program ends (within 5 min)
|
2330
|
+
|
2331
|
+
press_exit_sleep
|
2332
|
+
press_exit_sleep
|
2333
|
+
|
2334
|
+
# tune to channel
|
2335
|
+
tune_immediately_to(prog[0])
|
2336
|
+
|
2337
|
+
# start recording
|
2338
|
+
press_record_sleep
|
2339
|
+
|
2340
|
+
# wait for record to start
|
2341
|
+
loginfo2 "Sleeping for recording to start ..."
|
2342
|
+
sleep 30.sec
|
2343
|
+
|
2344
|
+
# exit to fullscreen
|
2345
|
+
press_exit_sleep
|
2346
|
+
3.times do |j|
|
2347
|
+
(return nil if j.eql?(2)) unless info_banner_launch_and_verify(true,true)
|
2348
|
+
end
|
2349
|
+
|
2350
|
+
if info_banner_verify_recording_icon?(2)
|
2351
|
+
channel_info[:current_channel] = prog[0].to_s.to_i
|
2352
|
+
rec_in_progress = prog
|
2353
|
+
break # recording in progress
|
2354
|
+
end
|
2355
|
+
end # airing programs loop
|
2356
|
+
break if rec_in_progress
|
2357
|
+
# tune to buffer channels
|
2358
|
+
buffer_channels = channel_info[:buffer_channels]
|
2359
|
+
tune_immediately_to(buffer_channels[0])
|
2360
|
+
sleep 10.sec
|
2361
|
+
tune_immediately_to(buffer_channels[1])
|
2362
|
+
|
2363
|
+
sleep_time = (300 - (Time.now - start_time).to_i)
|
2364
|
+
loginfo2 "Sleeping for #{sleep_time} seconds ..."
|
2365
|
+
sleep sleep_time.sec
|
2366
|
+
|
2367
|
+
end # retries loop
|
2368
|
+
|
2369
|
+
return nil unless rec_in_progress
|
2370
|
+
|
2371
|
+
# mark new recording as do not delete
|
2372
|
+
return nil unless show_list_launch_and_verify(true,false)
|
2373
|
+
return nil unless show_list_navigate_to_top_of_list
|
2374
|
+
return nil unless show_list_navigate_to_recording_of_program(rec_in_progress)
|
2375
|
+
unless show_list_focused_recording_has_do_not_delete_icon?(2)
|
2376
|
+
press_select_sleep
|
2377
|
+
unless guide_screen_navigate_to_any_of_the_options ['Record Options']
|
2378
|
+
loginfo2 'Unable to verify if navigated to record options'
|
2379
|
+
return nil
|
2380
|
+
end
|
2381
|
+
press_select_sleep
|
2382
|
+
unless guide_screen_set_record_options({:change_save_time => 'Do not delete'})
|
2383
|
+
loginfo2 'Unable to verify if option is set'
|
2384
|
+
return nil
|
2385
|
+
end
|
2386
|
+
|
2387
|
+
press_a_sleep
|
2388
|
+
sleep_to_get_focus_back
|
2389
|
+
end
|
2390
|
+
|
2391
|
+
# exit to fullscreen
|
2392
|
+
press_exit_sleep
|
2393
|
+
|
2394
|
+
return rec_in_progress
|
2395
|
+
end
|
2396
|
+
|
2397
|
+
# Use it to fill the HDD using recordings
|
2398
|
+
# This method will take 1-2 days to fill HDD to full
|
2399
|
+
# * *Args* :
|
2400
|
+
# - +percentage_full+ -> % full hdd using recordings
|
2401
|
+
# - +min_recording_length+ -> minimum recording lenght in minutes
|
2402
|
+
# - +do_not_delete+ -> true to set all recordings as do not delete
|
2403
|
+
# * *Returns* :
|
2404
|
+
# - recorded programs if successful or HDD full else nil
|
2405
|
+
def make_hdd_full percentage_full=100, min_recording_length=10, do_not_delete=true
|
2406
|
+
# Note : used percentage_full = 101 for 100% hdd full, so that method will record programs till HDD full banner appears
|
2407
|
+
percentage_full = 101 if percentage_full > 99 # HDD can not be more than 100% full
|
2408
|
+
|
2409
|
+
stb_ip = fetch_ip
|
2410
|
+
return nil if stb_ip.nil?
|
2411
|
+
|
2412
|
+
hdd_status = _percentage_hdd_full(stb_ip)
|
2413
|
+
|
2414
|
+
return nil if hdd_status.nil?
|
2415
|
+
|
2416
|
+
if hdd_status >= percentage_full
|
2417
|
+
loginfo2 "HDD is #{percentage_full} % full"
|
2418
|
+
return []
|
2419
|
+
end
|
2420
|
+
|
2421
|
+
# recorded programs
|
2422
|
+
recorded_programs = []
|
2423
|
+
|
2424
|
+
# clear in-progress recordings and scheduled recordings to avoid conflict
|
2425
|
+
begin
|
2426
|
+
return nil unless show_list_launch_and_verify(true,false)
|
2427
|
+
return nil unless show_list_screen_clear_all_series_recordings
|
2428
|
+
return nil unless show_list_screen_clear_all_scheduled_recordings
|
2429
|
+
return nil unless show_list_cancel_inprogress_recordings
|
2430
|
+
|
2431
|
+
# mark all recorded programs to do not delete
|
2432
|
+
return nil unless show_list_launch_and_verify(true,false)
|
2433
|
+
return nil unless show_list_navigate_to_tab 'BY DATE'
|
2434
|
+
(return nil unless show_list_screen_set_do_not_delete_for_all_recordings) unless show_list_screen_empty_list?
|
2435
|
+
|
2436
|
+
# start recording on two HD/SD channels
|
2437
|
+
is_hd = stb_capable_of?('HD')
|
2438
|
+
|
2439
|
+
# live channels to record
|
2440
|
+
sd_channels = fetch_option(:miscellaneous_sd_channels).to_i_arr
|
2441
|
+
hd_channels = fetch_option(:miscellaneous_hd_channels).to_i_arr
|
2442
|
+
|
2443
|
+
live_channels = []
|
2444
|
+
|
2445
|
+
channels = is_hd ? (hd_channels + sd_channels) : sd_channels
|
2446
|
+
# filter channles with video
|
2447
|
+
channels.each do |chnl|
|
2448
|
+
sd_channels = sd_channels - [chnl] # remove current channel from sd channel list
|
2449
|
+
tune_immediately_to(chnl)
|
2450
|
+
sleep_for_normal_tune
|
2451
|
+
press_exit_sleep
|
2452
|
+
next unless info_banner_launch_and_verify_channel_number(chnl)
|
2453
|
+
if fullscreen_video_playing?
|
2454
|
+
live_channels.push(chnl)
|
2455
|
+
end
|
2456
|
+
|
2457
|
+
break if live_channels.length.eql?(2)
|
2458
|
+
end
|
2459
|
+
|
2460
|
+
# filter SD channles with video,
|
2461
|
+
# if STB failed to record HD program due to space then it can record SD program
|
2462
|
+
sd_channels.each do |chnl|
|
2463
|
+
tune_immediately_to(chnl)
|
2464
|
+
sleep_for_normal_tune
|
2465
|
+
press_exit_sleep
|
2466
|
+
if fullscreen_video_playing?
|
2467
|
+
live_channels.push(chnl)
|
2468
|
+
end
|
2469
|
+
|
2470
|
+
break if live_channels.length.eql?(6)
|
2471
|
+
end
|
2472
|
+
|
2473
|
+
if live_channels.length < 6
|
2474
|
+
loginfo2 "Unable to get six channels having video"
|
2475
|
+
return false
|
2476
|
+
end
|
2477
|
+
|
2478
|
+
channel1_info = {
|
2479
|
+
:rec_channels => [live_channels[0], live_channels[2], live_channels[3]],
|
2480
|
+
:current_channel => live_channels[0],
|
2481
|
+
:buffer_channels => [live_channels[0], live_channels[1]],
|
2482
|
+
}
|
2483
|
+
|
2484
|
+
channel2_info = {
|
2485
|
+
:rec_channels => [live_channels[1], live_channels[4], live_channels[5]],
|
2486
|
+
:current_channel => live_channels[1],
|
2487
|
+
:buffer_channels => [live_channels[0], live_channels[1]],
|
2488
|
+
}
|
2489
|
+
|
2490
|
+
prog1 = prog2 = nil
|
2491
|
+
start_time = nil
|
2492
|
+
|
2493
|
+
# max wait in minutes
|
2494
|
+
max_wait_minutes = (36 * 60) # 36 hours
|
2495
|
+
|
2496
|
+
begin
|
2497
|
+
# power on STB if required
|
2498
|
+
unless power_on_stb?
|
2499
|
+
loginfo2 "Unable to powre on STB"
|
2500
|
+
return nil
|
2501
|
+
end
|
2502
|
+
|
2503
|
+
current_time = mas_current_date
|
2504
|
+
start_time = current_time if start_time.nil? # set start time for first recording
|
2505
|
+
|
2506
|
+
# break if wait time exceeded max wait time
|
2507
|
+
if (current_time - start_time).to_i / 60 >= max_wait_minutes
|
2508
|
+
loginfo2 "Not able to fillup HDD withing [#{max_wait_minutes}] minutes"
|
2509
|
+
return nil
|
2510
|
+
end
|
2511
|
+
|
2512
|
+
# verify whether recording in progress or not
|
2513
|
+
tune_immediately_to(channel1_info[:current_channel])
|
2514
|
+
sleep_for_normal_tune
|
2515
|
+
press_exit_sleep
|
2516
|
+
return nil unless info_banner_launch_and_verify(true,false)
|
2517
|
+
rec_in_progress = info_banner_verify_recording_icon?(2)
|
2518
|
+
|
2519
|
+
if prog1.nil? or prog1[3] < current_time or !rec_in_progress
|
2520
|
+
prog1 = _record_airing_program_with_do_not_delete_flag(channel1_info)
|
2521
|
+
|
2522
|
+
recorded_programs.push(prog1) unless prog1.nil?
|
2523
|
+
|
2524
|
+
# update current time
|
2525
|
+
current_time = mas_current_date
|
2526
|
+
end
|
2527
|
+
|
2528
|
+
# verify whether recording in progress or not
|
2529
|
+
tune_immediately_to(channel2_info[:current_channel])
|
2530
|
+
sleep_for_normal_tune
|
2531
|
+
press_exit_sleep
|
2532
|
+
return nil unless info_banner_launch_and_verify(true,false)
|
2533
|
+
rec_in_progress = info_banner_verify_recording_icon?(2)
|
2534
|
+
|
2535
|
+
if prog2.nil? or prog2[3] < current_time or !rec_in_progress
|
2536
|
+
prog2 = _record_airing_program_with_do_not_delete_flag(channel2_info)
|
2537
|
+
|
2538
|
+
recorded_programs.push(prog2) unless prog2.nil?
|
2539
|
+
|
2540
|
+
# update current time
|
2541
|
+
current_time = mas_current_date
|
2542
|
+
end
|
2543
|
+
|
2544
|
+
if prog1.nil? and prog2.nil?
|
2545
|
+
return recorded_programs if _record_program_and_verify_hdd_full_message(channel2_info[:current_channel]) # verify HDD full message and its shwoing up then return true
|
2546
|
+
loginfo2 "Unlable to record programs on HD/SD channels"
|
2547
|
+
return nil
|
2548
|
+
else
|
2549
|
+
# sleep for 10 min and verify HDD percentage
|
2550
|
+
loginfo2 "Sleeping for 5 min ...",false
|
2551
|
+
sleep 5.min
|
2552
|
+
end
|
2553
|
+
|
2554
|
+
# update HDD status
|
2555
|
+
hdd_status = _percentage_hdd_full(stb_ip)
|
2556
|
+
return nil if hdd_status.nil?
|
2557
|
+
end while percentage_full > hdd_status # while loop
|
2558
|
+
|
2559
|
+
# HDD full
|
2560
|
+
loginfo2 "HDD full #{hdd_status} %"
|
2561
|
+
|
2562
|
+
# Sleep till program ends
|
2563
|
+
recorded_programs = recorded_programs.sort_by{|x| x[3]} # sort by program end time
|
2564
|
+
|
2565
|
+
sleep_till_time(recorded_programs.last[3],1) unless recorded_programs.empty?
|
2566
|
+
|
2567
|
+
return recorded_programs
|
2568
|
+
rescue TestException => e
|
2569
|
+
logdebug e.message
|
2570
|
+
return nil
|
2571
|
+
end
|
2572
|
+
end
|
2573
|
+
|
2574
|
+
# Use it to fill / empty HDD till given level
|
2575
|
+
# This method will take 1-2 days to fill HDD to full
|
2576
|
+
# * *Args* :
|
2577
|
+
# - +percentage_full+ -> % full hdd using recordings
|
2578
|
+
# * *Returns* :
|
2579
|
+
# - true if successful else false
|
2580
|
+
def make_hdd_full_percentage percentage_full=100
|
2581
|
+
percentage_full = 101 if percentage_full > 99 # HDD can not be more than 100% full
|
2582
|
+
|
2583
|
+
stb_ip = fetch_ip
|
2584
|
+
return false if stb_ip.nil?
|
2585
|
+
|
2586
|
+
hdd_status = _percentage_hdd_full(stb_ip)
|
2587
|
+
|
2588
|
+
return false if hdd_status.nil?
|
2589
|
+
|
2590
|
+
if hdd_status > percentage_full
|
2591
|
+
return make_hdd_empty(percentage_full)
|
2592
|
+
elsif hdd_status < percentage_full
|
2593
|
+
return !make_hdd_full(percentage_full,10,true).nil? # not nill means successful
|
2594
|
+
else
|
2595
|
+
loginfo2 "No need to empty or full HDD"
|
2596
|
+
return true
|
2597
|
+
end
|
2598
|
+
end
|
2599
|
+
|
2600
|
+
# Use it to check if the STB's ODN version is same or newer than the specified version.
|
2601
|
+
# ODN version is of the format 5.0.0_7 2011/10/06 14:29
|
2602
|
+
def odn_same_or_newer_than minimum_odn
|
2603
|
+
current_version = test_data[:current_odn_version].split()[0].split(/[._]/).map {|s| s.to_i}
|
2604
|
+
minimum_version = minimum_odn.split()[0].split(/[._]/).map {|s| s.to_i}
|
2605
|
+
|
2606
|
+
current_version.each_index do |x|
|
2607
|
+
return true if current_version[x] > minimum_version[x] # newer
|
2608
|
+
next if current_version[x] == minimum_version[x]
|
2609
|
+
return false # STB's ODN is older
|
2610
|
+
end
|
2611
|
+
|
2612
|
+
return true # same
|
2613
|
+
end
|
2614
|
+
|
2615
|
+
# Use it to check if the STB's ODN version is same or newer than the specified version.
|
2616
|
+
# MDN version is of the format 3.2.0_0 2011/10/06 14:29
|
2617
|
+
def mdn_same_or_newer_than minimum_mdn
|
2618
|
+
current_version = test_data[:current_mdn_version].split()[0].split(/[._]/).map {|s| s.to_i}
|
2619
|
+
minimum_version = minimum_mdn.split()[0].split(/[._]/).map {|s| s.to_i}
|
2620
|
+
|
2621
|
+
current_version.each_index do |x|
|
2622
|
+
return true if current_version[x] > minimum_version[x] # newer
|
2623
|
+
next if current_version[x] == minimum_version[x]
|
2624
|
+
return false # STB's ODN is older
|
2625
|
+
end
|
2626
|
+
|
2627
|
+
return true # same
|
2628
|
+
end
|
2629
|
+
|
2630
|
+
# Private method
|
2631
|
+
# Use it to find purchased od assets using MAS query
|
2632
|
+
# * *Args* :
|
2633
|
+
# - +params+ -> hash of parameters for filtering search. (:service_name,:channel_number)
|
2634
|
+
# * *Returns* :
|
2635
|
+
# - Array of purchased assets
|
2636
|
+
# - each program is hash of program details( od_asset_id,title,purchase_time,offering_window)
|
2637
|
+
def _purchased_od_assets(params={})
|
2638
|
+
where_clause = 'PURCHASE_STATE = 2 '
|
2639
|
+
where_clause << "AND PRODUCT like '#{params[:service_name]}'" if (!params[:service_name].nil?)
|
2640
|
+
where_clause << "AND PRODUCT like '#{(mas_db_get_channels("and display_channel = #{params[:channel_number]}"))[0]['DISPLAY_NAME']}'" if (!params[:channel_number].nil?)
|
2641
|
+
|
2642
|
+
# get mac address of current stb
|
2643
|
+
mac = fetch_stb_mac_address.to_s
|
2644
|
+
if mac.length == 12
|
2645
|
+
mac_address = "#{mac[0,2]}:#{mac[2,2]}:#{mac[4,2]}:#{mac[6,2]}:#{mac[8,2]}:#{mac[10,2]}" # Inserting colons in mac address
|
2646
|
+
else
|
2647
|
+
mac_address = mac
|
2648
|
+
end
|
2649
|
+
loginfo2 "Mac address of this box is #{mac_address}"
|
2650
|
+
where_clause << "AND TERMINAL_ID like '#{mac_address}'"
|
2651
|
+
data_array = mas_db_purchased_assets(where_clause)
|
2652
|
+
programs = []
|
2653
|
+
data_array.each{ |data_hash|
|
2654
|
+
time_arr = data_hash['PURCHASE_TIME'].split('/')
|
2655
|
+
purchase_time = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
2656
|
+
|
2657
|
+
programs.push({
|
2658
|
+
:od_asset_id => data_hash['OD_ASSET_ID'],
|
2659
|
+
:title => data_hash['OFFER_NAME'],
|
2660
|
+
:purchase_time => purchase_time,
|
2661
|
+
:offering_window => data_hash['OFFERING_WINDOW_HRS'],
|
2662
|
+
})
|
2663
|
+
}
|
2664
|
+
|
2665
|
+
return programs
|
2666
|
+
end
|
2667
|
+
|
2668
|
+
# Use it to tune to hidden channel
|
2669
|
+
# * *Args* :
|
2670
|
+
# - +channel+ -> channel number
|
2671
|
+
def tune_to_hidden_channel channel
|
2672
|
+
key_seq = [['SEL_LONG', 10000], ['RIGHT_ARROW', 200]]
|
2673
|
+
key_seq = key_seq + channel.to_s.chars.to_a
|
2674
|
+
key_seq.push('SELECT') unless key_seq.length.eql?(4) # only for less than 4 digits channels
|
2675
|
+
_press_key_sequence key_seq
|
2676
|
+
|
2677
|
+
sleep 3.sec
|
2678
|
+
loginfo3 "Tuned to hidden channel : [#{channel}]",true,false,"TUNE_TO_#{channel}"
|
2679
|
+
end
|
2680
|
+
|
2681
|
+
#Use it to enable field tools
|
2682
|
+
# * *Args* :
|
2683
|
+
# * *Returns* :
|
2684
|
+
# - true if enabled, else false
|
2685
|
+
def enable_field_tools
|
2686
|
+
if power_on_stb?
|
2687
|
+
key_sequence = [['POWER',200],['A',200],['B',200],['C',200],['SETTINGS',200],['POWER',500]]
|
2688
|
+
_press_key_sequence key_sequence
|
2689
|
+
|
2690
|
+
# wait few sec for setting to enable
|
2691
|
+
sleep 5.sec
|
2692
|
+
return true
|
2693
|
+
else
|
2694
|
+
loginfo2 'Failed to power on stb'
|
2695
|
+
return false
|
2696
|
+
end
|
2697
|
+
end
|
2698
|
+
|
2699
|
+
#Use it to enable power user
|
2700
|
+
# * *Args* :
|
2701
|
+
# * *Returns* :
|
2702
|
+
# - true if enabled, else false
|
2703
|
+
def enable_power_user
|
2704
|
+
enable_field_tools
|
2705
|
+
end
|
2706
|
+
|
2707
|
+
#Use it to find all shows for a program
|
2708
|
+
# * *Args* :
|
2709
|
+
# - +guide_program+ -> guide program
|
2710
|
+
# - +curr_time+ -> current time
|
2711
|
+
# - +no_of_days+ -> no. of days for which data is to be fetched
|
2712
|
+
# * *Returns* :
|
2713
|
+
# - array of guide programs
|
2714
|
+
def _find_all_shows_for_program guide_program, curr_time = mas_current_date, no_of_days = 5
|
2715
|
+
event_id = guide_program[18].to_s
|
2716
|
+
programs = find_programs({:EVENT_ID => event_id, :START_DATE_TIME => curr_time, :END_DATE_TIME => (curr_time + no_of_days*24*60*60)})
|
2717
|
+
return programs
|
2718
|
+
end
|
2719
|
+
|
2720
|
+
# Use it to get percent hdd full
|
2721
|
+
# * *Args* :
|
2722
|
+
# - +stb_ip+ -> ip address of box
|
2723
|
+
# * *Returns* :
|
2724
|
+
# - integer value of percent hdd full (eg. 85 for 85%)
|
2725
|
+
def _percentage_hdd_full stb_ip = fetch_ip
|
2726
|
+
percent_full = nil
|
2727
|
+
return percent_full if stb_ip.nil? # return nil if failed to fetch ip
|
2728
|
+
|
2729
|
+
if stb_capable_of?('ODN')
|
2730
|
+
disk_info = odn_web_server_disk_info(stb_ip)
|
2731
|
+
if disk_info
|
2732
|
+
percent_free = disk_info[:fractional_free_space].to_f * 100
|
2733
|
+
percent_full = (100-percent_free).round
|
2734
|
+
end
|
2735
|
+
else
|
2736
|
+
percent_full = mdn_remote_diags_get_hdd_status(stb_ip).to_i
|
2737
|
+
end
|
2738
|
+
|
2739
|
+
loginfo2 "HDD status : #{percent_full}% full"
|
2740
|
+
return percent_full
|
2741
|
+
end
|
2742
|
+
|
2743
|
+
# Use it to fetch stb list
|
2744
|
+
def fetch_stb_list
|
2745
|
+
$stbs
|
2746
|
+
end
|
2747
|
+
|
2748
|
+
# Use it to verify if sdv is eanbled or not from web diags
|
2749
|
+
# * *Args* :
|
2750
|
+
# - +stb_ip+ -> ip address of box
|
2751
|
+
# * *Returns* :
|
2752
|
+
# - integer true if enabled, else false
|
2753
|
+
def stb_sdv_enabled? stb_ip = fetch_ip
|
2754
|
+
if stb_capable_of?('ODN')
|
2755
|
+
return odn_web_server_stb_sdv_capable?(stb_ip)
|
2756
|
+
else
|
2757
|
+
return mdn_remode_diags_stb_sdv_capable?(stb_ip)
|
2758
|
+
end
|
2759
|
+
end
|
2760
|
+
|
2761
|
+
# Use it to get sdv source id from web diags
|
2762
|
+
# * *Args* :
|
2763
|
+
# - +stb_ip+ -> ip address of box
|
2764
|
+
# * *Returns* :
|
2765
|
+
# - source id as string
|
2766
|
+
def stb_sdv_source_id stb_ip = fetch_ip
|
2767
|
+
if stb_capable_of?('ODN')
|
2768
|
+
return odn_web_server_source_id(stb_ip)
|
2769
|
+
else
|
2770
|
+
return mdn_remote_diags_source_id(stb_ip)
|
2771
|
+
end
|
2772
|
+
end
|
2773
|
+
|
2774
|
+
# Use it to get sdv frequency from web diags
|
2775
|
+
# * *Args* :
|
2776
|
+
# - +stb_ip+ -> ip address of box
|
2777
|
+
# * *Returns* :
|
2778
|
+
# - sdv frequency as string
|
2779
|
+
def stb_sdv_frequency stb_ip = fetch_ip
|
2780
|
+
if stb_capable_of?('ODN')
|
2781
|
+
return odn_web_server_stb_frequency(stb_ip)
|
2782
|
+
else
|
2783
|
+
return mdn_remote_diags_sdv_frequency(stb_ip)
|
2784
|
+
end
|
2785
|
+
end
|
2786
|
+
|
2787
|
+
# Use it to get sdv packets sent/recieved from web diags
|
2788
|
+
# * *Args* :
|
2789
|
+
# - +stb_ip+ -> ip address of box
|
2790
|
+
# * *Returns* :
|
2791
|
+
# - array of sent recieved data [sent,recieved]
|
2792
|
+
def stb_sdv_packets_sent_recieved stb_ip = fetch_ip
|
2793
|
+
if stb_capable_of?('ODN')
|
2794
|
+
return odn_web_server_sdv_packets_sent_recieved(stb_ip)
|
2795
|
+
else
|
2796
|
+
return mdn_remote_diags_sdv_packets_sent_recieved(stb_ip)
|
2797
|
+
end
|
2798
|
+
end
|
2799
|
+
|
2800
|
+
# Use it to get channel change message for stb from sdv server
|
2801
|
+
# * *Args* :
|
2802
|
+
# - +no_of_logs+ -> number of logs to be fetched
|
2803
|
+
# - +stb_ip+ -> ip address of box
|
2804
|
+
# * *Returns* :
|
2805
|
+
# - array of logs
|
2806
|
+
def stb_sdv_channel_change_messages no_of_logs = 5, stb_ip = fetch_ip
|
2807
|
+
sdv_ip = fetch_option(:sdv_ip) # 172.16.3.33
|
2808
|
+
sdv_port = 22
|
2809
|
+
sdv_prompt = fetch_option(:sdv_prompt) # "]#"
|
2810
|
+
sdv_username = fetch_option(:sdv_username) # 'root'
|
2811
|
+
sdv_password = fetch_option(:sdv_password) # 'generic'
|
2812
|
+
logdebug "SDV Prompt '#{sdv_prompt}'"
|
2813
|
+
date = mas_current_date
|
2814
|
+
log_file_name = date.strftime("%d%b%Y_000000.txt")
|
2815
|
+
|
2816
|
+
begin
|
2817
|
+
opened = false
|
2818
|
+
open_interactive_ssh(sdv_ip, sdv_port, sdv_prompt, sdv_username, sdv_password)
|
2819
|
+
loginfo2 "opened ssh session"
|
2820
|
+
opened = true
|
2821
|
+
cmd = "tac #{fetch_option(:sdv_server_log_folder)}/#{log_file_name} | grep -m#{no_of_logs} #{stb_ip}"
|
2822
|
+
loginfo2 "command: #{cmd}"
|
2823
|
+
result = exec_interactive_ssh(sdv_prompt, cmd)
|
2824
|
+
result.gsub!(cmd,'')
|
2825
|
+
result.gsub!(/\[.*#{sdv_prompt.delete("\/")}/,'')
|
2826
|
+
date_time_regexp = /\d{4}\/\d{2}\/\d{2}\D*\d{2}:\d{2}:\d{2}\.\d{3}/
|
2827
|
+
result_array = result.split(date_time_regexp)
|
2828
|
+
result_array.shift
|
2829
|
+
return result_array
|
2830
|
+
rescue StandardError => e
|
2831
|
+
logdebug e.to_s
|
2832
|
+
return []
|
2833
|
+
ensure
|
2834
|
+
close_interactive_ssh if opened
|
2835
|
+
end
|
2836
|
+
end
|
2837
|
+
|
2838
|
+
#Private method
|
2839
|
+
# Use it to get od assets from reservation catalogs
|
2840
|
+
def _od_rsrv_assets(params={})
|
2841
|
+
where_clause = ''
|
2842
|
+
if (!params[:mac].nil?)
|
2843
|
+
where_clause << "AND TERMINAL_ID in (#{params[:mac]})"
|
2844
|
+
else
|
2845
|
+
mac = fetch_stb_mac_address.to_s
|
2846
|
+
if mac.length == 12
|
2847
|
+
mac_address = "#{mac[0,2]}:#{mac[2,2]}:#{mac[4,2]}:#{mac[6,2]}:#{mac[8,2]}:#{mac[10,2]}" # Inserting colons in mac address
|
2848
|
+
else
|
2849
|
+
mac_address = mac
|
2850
|
+
end
|
2851
|
+
where_clause << "AND TERMINAL_ID like '#{mac_address}'"
|
2852
|
+
end
|
2853
|
+
where_clause << "AND DISPLAY_CHANNEL = #{params[:channel_number]}" if (!params[:channel_number].nil?)
|
2854
|
+
|
2855
|
+
data = mas_db_od_assets_in_rsrv(where_clause)
|
2856
|
+
assets = []
|
2857
|
+
data.each{|data_hash|
|
2858
|
+
time_arr = data_hash['EXPIRATION_DATE'].split('/')
|
2859
|
+
expiration_date = Time.local(time_arr[0].to_i, time_arr[1].to_i, time_arr[2].to_i, time_arr[3].to_i, time_arr[4].to_i, time_arr[5].to_i)
|
2860
|
+
|
2861
|
+
asset = {
|
2862
|
+
:od_asset_id => data_hash['OD_ASSET_ID'],
|
2863
|
+
:title => data_hash['ASSET_TITLE'],
|
2864
|
+
:purchase_id => data_hash['OD_PURCHASE_ID'],
|
2865
|
+
:mystro_service_id => data_hash['MYSTRO_SERVICE_ID'],
|
2866
|
+
:expiration_date => expiration_date,
|
2867
|
+
}
|
2868
|
+
assets.push(asset)
|
2869
|
+
}
|
2870
|
+
return assets
|
2871
|
+
end
|
2872
|
+
|
2873
|
+
# Use this method to query RTI for ODN STBs.
|
2874
|
+
# * *Args* :
|
2875
|
+
# - +rti_path+ -> The xpath for query (must begin with forward slash)
|
2876
|
+
# * *Returns* :
|
2877
|
+
# - The body of the RTI response
|
2878
|
+
def fetch_rti(rti_path)
|
2879
|
+
tcinvalid "Box does not have IP for RTI." if test_data[:stb_ip].nil?
|
2880
|
+
uri = URI.parse("http://#{test_data[:stb_ip]}/rti#{rti_path}")
|
2881
|
+
loginfo "Fetching RTI from #{uri}"
|
2882
|
+
response = Net::HTTP.get_response(uri)
|
2883
|
+
return response.body.strip
|
2884
|
+
end
|
2885
|
+
|
2886
|
+
# Use it to get the message dialog object.
|
2887
|
+
# * *Returns* :
|
2888
|
+
# - nil, if no message dialog is displayed
|
2889
|
+
# - otherwise, A map object with keys
|
2890
|
+
# :title
|
2891
|
+
def message_dialog
|
2892
|
+
dialog = {}
|
2893
|
+
|
2894
|
+
dialog_title = fetch_rti("/UI/MessageDialog/Title")[1..-1]
|
2895
|
+
dialog[:title] = dialog_title.to_s
|
2896
|
+
loginfo3 "RTI Message Dialog, title:#{dialog_title}", true, false, "RTI"
|
2897
|
+
|
2898
|
+
return dialog
|
2899
|
+
end
|
2900
|
+
|
2901
|
+
# Use it to get the options dialog object.
|
2902
|
+
# * *Returns* :
|
2903
|
+
# - nil, if no options dialog is displayed
|
2904
|
+
# - otherwise, A map object with keys
|
2905
|
+
# :title
|
2906
|
+
def options_dialog
|
2907
|
+
dialog = {}
|
2908
|
+
|
2909
|
+
item_count = fetch_rti("/UI/MenuItemList/ItemCount")[1..-1].to_i
|
2910
|
+
dialog[:item_count] = item_count
|
2911
|
+
loginfo3 "RTI Options Dialog, items_count:#{item_count}", true, false, "RTI"
|
2912
|
+
return dialog
|
2913
|
+
end
|
2914
|
+
|
2915
|
+
# Use it to get the enhanced menu dialog object.
|
2916
|
+
# * *Returns* :
|
2917
|
+
# - nil, if no enhanced menu dialog is displayed
|
2918
|
+
# - otherwise, A map object with keys
|
2919
|
+
# :title
|
2920
|
+
def enhanced_menu_dialog
|
2921
|
+
dialog = {}
|
2922
|
+
|
2923
|
+
item_count = fetch_rti("/UI/EnhancedMenu/MenuItemList/ItemCount")[1..-1].to_i
|
2924
|
+
dialog[:item_count] = item_count
|
2925
|
+
loginfo3 "RTI Enhanced menu Dialog, items_count:#{item_count}", true, false, "RTI"
|
2926
|
+
|
2927
|
+
return dialog
|
2928
|
+
end
|
2929
|
+
|
2930
|
+
# Use it to get the keyboard dialog object.
|
2931
|
+
# * *Returns* :
|
2932
|
+
# - nil, if keyboard search isn't displayed
|
2933
|
+
# - otherwise, A map object with keys
|
2934
|
+
# :focus_char
|
2935
|
+
def keyboard_dialog
|
2936
|
+
dialog = {}
|
2937
|
+
|
2938
|
+
focus_char = fetch_rti("/UI/Keyboard/FocusChar")[1..-1].to_s
|
2939
|
+
dialog[:focus_char] = focus_char
|
2940
|
+
loginfo3 "RTI Keyboard, focus_char:#{focus_char}", true, false, "RTI"
|
2941
|
+
|
2942
|
+
return dialog
|
2943
|
+
end
|
2944
|
+
end
|