用python(kivy模块)开发安卓影视App——搜索页面开发(二)

2024-02-25 20:50

本文主要是介绍用python(kivy模块)开发安卓影视App——搜索页面开发(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于kivy在国内使用较少,在开发道路上困难重重,本人也花了不少精力来进行开发,希望大家能够从中得到学习与锻炼。

下面是我的成果图

 首先是py文件

import requests
import re
from kivy.properties import StringProperty
from kivymd.app import MDApp
from kivymd.uix.button import MDRectangleFlatButton
from kivymd.uix.card import MDCard
from kivymd.uix import bottomsheet
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.stacklayout import MDStackLayout
from kivy.uix.screenmanager import Screen
from kivymd.font_definitions import theme_font_styles
from kivy.core.text import LabelBase
from kivymd.uix.screen import MDScreen
from kivy.core.window import Window
Window.size = (Window.height*3/4, Window.width*9/10)
screen_num = 0class DealData():class_name = ['动漫', '追剧', '电影']class_key = ['4', '2', '1']class_url = 'https://saohuo.la/list/[].html'header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50",'Cookie': 'PHPSESSID=6rag7kboi7414tmm4amgebaonq; Hm_lvt_176de524c092a1d4ae22a38102515b0c=1634174369,1634204939,1634692218; Hm_lpvt_176de524c092a1d4ae22a38102515b0c=1634710419','Connection': 'keep-alive','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Origin': 'https://play.hhplayer.com','Referer': '','Content-type': 'application/x-www-form-urlencoded; charset=UTF-8','sec-ch-ua': '"Chromium";v="94", "Microsoft Edge";v="94", ";Not A Brand";v="99"',}class_list = '<ul class="v_list">(.*?)</ul></section><section class="page">'class_list_name = '<li><div class="v_img"><a href=".*?" title="(.*?)"><img class='class_list_picture = '<img class="lazyload" alt=".*?" data-original="(.*?)" /></a><div class='class_list_href = '<li><div class="v_img"><a href="(.*?)" title=".*?"><img class='class_list_text = '<div class="v_note">(.*?)</div></div><p class='search_url = 'https://saohuo.la/search.php?page=1&searchword=KEYWORDS&searchtype='search_list = '<ul class="v_list">(.*?)</ul></section><section class="page">'search_video_name = '<li><div class="v_img"><a href=".*?" title="(.*?)"><img class='search_video_url = '<li><div class="v_img"><a href="(.*?)" title=".*?"><img class='search_video_pic = '<img class="lazyload" data-original="(.*?)" /></a><div class="v_note">'search_video_data = '<div class="v_note">(.*?)</div>'video_class_data = '<ul class="from_list">([\s\S]*?)</ul>'video_class_name = '<li class=".*?">([\s\S]*?)</li>'video_play_data = '<section class="grid_box">([\s\S]*?)</section>'video_play_list = '<ul class="play_list"([\s\S]*?)</ul>'video_play_name = '<a title="[\s\S]*?" href="[\s\S]*?" target="_self">([\s\S]*?)</a>'video_play_url = '<a title="[\s\S]*?" href="([\s\S]*?)" target="_self">[\s\S]*?</a>'video_real_url = '><iframe src="([\s\S]*?)" width="100%" scrolling="no" height="250"'name_head = {'name': '骚火','href_head': 'https://saohuo.la', 'image_head': ''}# 首页影视分类列表
class MovieLayoutData(MDStackLayout):pass# 屏幕切换列表class MovieLayout(MDStackLayout):passclass MovieLayoutVideoData(MDBoxLayout):pass# 首页分类布局
class TabCard(MDCard):screen = StringProperty()text = StringProperty()def on_press(self):# 切换影视分类self.parent.parent.parent.parent.parent.parent.parent.parent.ids.screen_manager.current = self.screenclass TabCardCard(MDCard):screen = StringProperty()text = StringProperty()def on_press(self):print(self.screen)self.parent.parent.parent.parent.ids.video_screen_manager.current = self.screenself.parent.parent.parent.parent.screen = int(self.screen.replace('video_screen', ''))# 影视详情单class ElementCard(MDCard):url_all_datas = DealData()image = StringProperty()title_name = StringProperty()pictext = StringProperty()video_href = StringProperty()global screen_numdef on_release(self):# 切换至搜索页面global screen_numsearchscreen = MDScreen(name=f'search_screen{str(screen_num)}')list_movies = SearchScreen()list_movies.searchkey = self.title_namelist_movies_list = list_movies.add_movie_list()searchscreen.add_widget(list_movies_list)self.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.ids.home_screen_manager.add_widget(searchscreen)self.parent.parent.parent.parent.parent.parent.parent.parent.parent.parent.ids.home_screen_manager.current = f'search_screen{str(screen_num)}'screen_num += 1
# 搜索影视详情单class ElementCardCard(MDCard):url_all_datas = DealData()image = StringProperty()title_name = StringProperty()pictext = StringProperty()video_href = StringProperty()def on_press(self):global screen_numvideoscreen = MDScreen(name=f'video_play_screen{str(screen_num)}')video_play_layout = VideoPlayScreen()video_play_layout.title_name = self.title_namevideo_play_layout.video_href = self.video_hrefvideo_play_layout.image = self.imagevideo_play_layout.pictext = self.pictextvideo_play_layout.datas = []video_play_layout.pa_class_list()video_play_layout.add_class_list()videoscreen.add_widget(video_play_layout)self.parent.parent.parent.parent.parent.parent.parent.ids.home_screen_manager.add_widget(videoscreen)self.parent.parent.parent.parent.parent.parent.parent.ids.home_screen_manager.current = f'video_play_screen{str(screen_num)}'screen_num += 1class ElementCardCardCard(MDCard):image = StringProperty()title_name = StringProperty()pictext = StringProperty()video_href = StringProperty()# 主屏幕
class MainScreen(MDScreen):url_all_datas = DealData()num = 0def __init__(self):self.one_screen()self.add_class_name()def one_screen(self, **kwargs):super(MainScreen, self).__init__(**kwargs)# 主页分类标签列表def add_class_name(self):for i in range(len(self.url_all_datas.class_name)):header = TabCard()header.text = self.url_all_datas.class_name[i]header.screen = f'screen{i}'self.ids.movie_class.add_widget(header)self.add_screen_details()self.num = self.num+1# 切换主页分类def add_screen_details(self):screen = Screen(name=f'screen{str(self.num)}')screen.add_widget(self.add_movie_list())self.ids.screen_manager.add_widget(screen)# 主页分类列表def add_movie_list(self):movie_layout = MovieLayoutData()datas = self.pa_shou_ye()for data in datas:video_list = ElementCard()video_list.title_name = data['title']video_list.video_href = data['list_url']video_list.image = data['image']video_list.pictext = data['pictext']movie_layout.ids.movie_list_data.add_widget(video_list)return movie_layout# 爬取主页分类详情def pa_shou_ye(self):all_datas = []url = self.url_all_datas.class_url.replace('[]', self.url_all_datas.class_key[self.num])response = requests.get(url, headers=self.url_all_datas.header, timeout=6)html = response.content.decode('utf-8')try:list_item = re.findall(self.url_all_datas.class_list, html)[0]title_lists = re.findall(self.url_all_datas.class_list_name, list_item)href_lists = re.findall(self.url_all_datas.class_list_href, list_item)src_lists = re.findall(self.url_all_datas.class_list_picture, list_item)pictext_lists = re.findall(self.url_all_datas.class_list_text, list_item)for i in range(len(title_lists)):data = dict()data['name'] = self.url_all_datas.name_head['name']data['href_head'] = self.url_all_datas.name_head['href_head']data['image_head'] = self.url_all_datas.name_head['image_head']data['title'] = title_lists[i]data['list_url'] = data['href_head']+href_lists[i]data['image'] = data['image_head']+src_lists[i]data['pictext'] = pictext_lists[i]all_datas.append(data)return all_datasexcept:return all_datasdef on_release(self):self.ids.home_screen_manager.current = 'home_class_screen'def on_press(self):global screen_numsearchscreen = MDScreen(name=f'search_screen{str(screen_num)}')list_movies = SearchScreen()list_movies.searchkey = self.ids.search_key.textlist_movies_list = list_movies.add_movie_list()searchscreen.add_widget(list_movies_list)self.ids.home_screen_manager.add_widget(searchscreen)self.ids.home_screen_manager.current = f'search_screen{str(screen_num)}'screen_num += 1class SearchScreen():searchkey = ''url_all_datas = DealData()def add_movie_list(self):movie_layout = MovieLayout()datas = self.pa_sou_suo()for data in datas:video_list = ElementCardCard()video_list.title_name = data['title']video_list.video_href = data['list_url']video_list.image = data['image']video_list.pictext = data['pictext']movie_layout.ids.movie_list.add_widget(video_list)return movie_layout# 爬取搜索页面详情def pa_sou_suo(self):all_datas = []url = self.url_all_datas.search_url.replace('KEYWORDS', self.searchkey)response = requests.get(url, headers=self.url_all_datas.header, timeout=6)html = response.content.decode('utf-8')try:list_item = re.findall(self.url_all_datas.search_list, html)[0]title_lists = re.findall(self.url_all_datas.search_video_name, list_item)href_lists = re.findall(self.url_all_datas.search_video_url, list_item)src_lists = re.findall(self.url_all_datas.search_video_pic, list_item)pictext_lists = re.findall(self.url_all_datas.search_video_data, list_item)for i in range(len(title_lists)):data = dict()data['name'] = self.url_all_datas.name_head['name']data['href_head'] = self.url_all_datas.name_head['href_head']data['image_head'] = self.url_all_datas.name_head['image_head']data['title'] = title_lists[i]data['list_url'] = data['href_head']+href_lists[i]data['image'] = data['image_head']+src_lists[i]data['pictext'] = pictext_lists[i]all_datas.append(data)return all_datasexcept:return all_datasclass VideoPlayScreen(MDBoxLayout):title_name = ''video_href = ''image = ''pictext = ''num = 0url_all_datas = DealData()datas = []screen = 0def add_class_list(self):self.ids.movie_data.title_name = self.title_nameself.ids.movie_data.video_href = self.video_hrefself.ids.movie_data.image = self.imageself.ids.movie_data.pictext = self.pictextfor i in range(len(self.datas)):video_class_header = TabCardCard()video_class_header.text = self.datas[i][0]video_class_header.screen = f'video_screen{str(i)}'self.ids.video_play_class.add_widget(video_class_header)self.add_screen_details()if self.num < len(self.datas):self.num = self.num+1def add_screen_details(self):screen = Screen(name=f'video_screen{str(self.num)}')screen.add_widget(self.add_video_play_list())self.ids.video_screen_manager.add_widget(screen)def add_video_play_list(self):video_play_layout = MovieLayoutVideoData()video_lists = self.datas[self.num][1]for i in range(len(video_lists)):btnt = MDRectangleFlatButton(text=video_lists[i], font_name='./Lishu.ttf', size_hint_x=None)btnt.bind(on_press=self.on_press)# btnt=TabCardCardCard()# btnt.text=video_lists[i]video_play_layout.ids.movie_video_list.add_widget(btnt)return video_play_layoutdef pa_class_list(self):url = self.video_hrefresponse = requests.get(url, headers=self.url_all_datas.header, timeout=6)html = response.content.decode('utf-8')try:list_class_item = re.findall(self.url_all_datas.video_class_data, html)[0]video_class_name_lists = re.findall(self.url_all_datas.video_class_name, list_class_item)list_item = re.findall(self.url_all_datas.video_play_data, html)[0]video_play_lists = re.findall(self.url_all_datas.video_play_list, list_item)for i in range(len(video_class_name_lists)):last_video_play_href_lists = []video_play_name_lists = re.findall(self.url_all_datas.video_play_name, video_play_lists[i])video_play_href_lists = re.findall(self.url_all_datas.video_play_url, video_play_lists[i])for video_play_href_list in video_play_href_lists:video_play_href_list_ = self.url_all_datas.name_head['href_head'] + \video_play_href_listlast_video_play_href_lists.append(video_play_href_list_)data = (video_class_name_lists[i], video_play_name_lists, last_video_play_href_lists)self.datas.append(data)except:passdef on_press(self, widget):play_href = self.datas[self.screen][2][self.datas[self.screen][1].index(widget.text)]get_real_href = GetRealPlayUrl()get_real_href.video_play_url = play_hrefvideo_play_real_url = get_real_href.pa_class_list()print(video_play_real_url)class GetRealPlayUrl():url_all_datas = DealData()video_play_url = ''def pa_class_list(self):url = self.video_play_urlresponse = requests.get(url, headers=self.url_all_datas.header, timeout=6)html = response.content.decode('utf-8')try:video_real_url = re.findall(self.url_all_datas.video_real_url, html)[0]return video_real_urlexcept:return '空'class MainApp(MDApp):def build(self):self.theme_cls.theme_style = 'Light'self.theme_cls.primary_palette = 'Gray'LabelBase.register(name='Lishu', fn_regular='Lishu.ttf')theme_font_styles.append('Lishu')self.theme_cls.font_styles['Lishu'] = ['Lishu', 16, False, 0.15]return MainScreen()if __name__ == '__main__':MainApp().run()

然后是kv文件

<MainScreen>:MDBoxLayout:orientation: 'vertical'MDBoxLayout:size_hint_y:.08orientation: 'vertical'MDBoxLayout:padding:[0,0,0,0]spacing:dp(10)MDIconButton:icon: 'menu'on_release:root.on_release()MDLabel:MDTextFieldRound:id:search_keynormal_color: app.theme_cls.primary_lighthint_text:'搜索'font_name: './Lishu.ttf'size_hint_x:2pos_hint: {'x':.1,'y': .2}MDIconButton:icon: 'magnify'on_release:root.on_press()MDIconButton:icon:'download'             ScreenManager:id:home_screen_managerMDScreen:name:'home_class_screen'MDBoxLayout:orientation: 'vertical'MDBoxLayout:size_hint_y:.05ScrollView:MDBoxLayout:id:movie_classadaptive_width:Truerows:1padding:[10,2,10,2] spacing:dp(5)         ScreenManager:id:screen_managerMovieLayoutData:size_hint_y:Noneheight:Window.width*1/100adaptive_height:True screen_manager:screen_manager  MovieLayout:size_hint_y:Noneheight:Window.width*1/100adaptive_height:True screen_manager:home_screen_manager  <ElementCard>:orientation: 'vertical'size_hint_x: .5size_hint_y: Noneheight:Window.height*1/4padding: dp(10)radius:[25]MDBoxLayout:orientation: 'horizontal'size_hint_y: .9AsyncImage:source:root.image MDBoxLayout:orientation: 'vertical'size_hint_y: .9MDLabel:text: root.title_namefont_size: 15bold:Truefont_name: './Lishu.ttf'halign:'center'MDLabel:text:root.pictextfont_name: './Lishu.ttf'halign:'center'font_size: 15     
<ElementCardCard>:orientation: 'vertical'size_hint_x: 1size_hint_y: Noneheight:Window.height*1/4padding: dp(10)radius:[25]MDBoxLayout:orientation: 'horizontal'size_hint_y: .9AsyncImage:source:root.image MDBoxLayout:orientation: 'vertical'size_hint_y: .9MDLabel:text: root.title_namefont_size: 24bold:Truefont_name: './Lishu.ttf'halign:'center'MDLabel:text:root.pictextfont_name: './Lishu.ttf'halign:'center'font_size: 18      
<ElementCardCardCard>:orientation: 'vertical'size_hint_x: .5size_hint_y: Noneheight:Window.height*1/4padding: dp(10)radius:[25]MDBoxLayout:orientation: 'horizontal'size_hint_y: .9AsyncImage:source:root.image MDBoxLayout:orientation: 'vertical'size_hint_y: .9MDLabel:text: root.title_namefont_size: 24bold:Truefont_name: './Lishu.ttf'halign:'center'MDLabel:text:root.pictextfont_name: './Lishu.ttf'halign:'center'font_size: 18    <TabCard>:icon:'movie-roll'size_hint: None,1radius:dp(15)MDIcon:icon:root.iconMDLabel:text: root.textfont_name:'Lishu.ttf'
<TabCardCard>:size_hint: None,1radius:dp(15)MDLabel:text: root.textfont_name:'Lishu.ttf'halign:'center'<MovieLayout>:   size_hint_y:1ScrollView:MDStackLayout:id:movie_listpadding:[10,2,10,10] spacing: '5dp'adaptive_height:True 
<MovieLayoutData>:   size_hint_y:1ScrollView:MDStackLayout:id:movie_list_datapadding:[10,2,10,10] spacing: '5dp'adaptive_height:True 
<MovieLayoutVideoData>:  ScrollView:MDStackLayout:id:movie_video_listspacing:dp(10)padding:[15,2,10,2]adaptive_height:True  
<VideoPlayScreen>:orientation: 'vertical'spacing: '10dp'padding:[10,2,10,2]MDBoxLayout:size_hint_y: Noneheight:Window.height*1/4ElementCardCardCard:id:movie_data         MDBoxLayout:size_hint_y:.1ScrollView:MDBoxLayout:id:video_play_classadaptive_width:Truerows:1padding:[15,2,10,2] spacing:dp(5)   MDFillRoundFlatButton: text:'线路'font_name: './Lishu.ttf'normal_color: app.theme_cls.primary_darkbold:True  ScreenManager:id:video_screen_managerMovieLayoutVideoData:size_hint_y:Noneheight:Window.width*1/100adaptive_height:True screen_manager:video_screen_manager

如果有朋友想直接使用该代码,需要设置一个字体文件,放在代码同一目录下,且名字命为Lishu.ttf即可直接使用,如果有朋友想和文墨一起开发,请私信我~

这篇关于用python(kivy模块)开发安卓影视App——搜索页面开发(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746671

相关文章

Python实现文件下载、Cookie以及重定向的方法代码

《Python实现文件下载、Cookie以及重定向的方法代码》本文主要介绍了如何使用Python的requests模块进行网络请求操作,涵盖了从文件下载、Cookie处理到重定向与历史请求等多个方面,... 目录前言一、下载网络文件(一)基本步骤(二)分段下载大文件(三)常见问题二、requests模块处理

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处