📄 link_list.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define FROMPIPE
extern char log_tmp[128];
#define MAXLEN 128
struct Linknode{
char video_type[2];
char star_play[20];
char star_play_offset[10];
char end_play[20];
char video_length[10];
char video_name[56];
struct Linknode *next;
};
typedef struct Linknode Linklist;
long Divstr(char *str,Linklist * result)
{
char *p,*pend;
char tmp[MAXLEN];
trim(str);
if (strlen(str)<20)
{
return -1;
}
sprintf(tmp,"%s\0",str);
tmp[strlen(tmp)]='\0';
p=tmp;
pend=p+1;
for(;*pend!=';';pend++);
*pend='\0';
sprintf(result->video_type,"%s\0",p);
if (strlen(result->video_type)==0)
{
return -1;
}
p=pend+1;
for(;*pend!=';';pend++);
*pend='\0';
sprintf(result->star_play,"%s\0",p);
if (strlen(result->star_play)==0)
{
return -1;
}
p=pend+1;
for(;*pend!=';';pend++);
*pend='\0';
sprintf(result->star_play_offset,"%s\0",p);
if (strlen(result->star_play_offset)==0)
{
return -1;
}
p=pend+1;
for(;*pend!=';';pend++);
*pend='\0';
sprintf(result->end_play,"%s\0",p);
if (strlen(result->end_play)==0)
{
return -1;
}
p=pend+1;
for(;*pend!=';';pend++);
*pend='\0';
sprintf(result->video_length,"%s\0",p);
if (strlen(result->video_length)==0)
{
return -1;
}
p=pend+1;
sprintf(result->video_name,"%s\0",p);
if (strlen(result->video_name)==0)
{
return -1;
}
return 0;
}
Linklist* readfile(char *path)
{
Linklist *head,*p,*p1;
char tmp[MAXLEN];
int i;
FILE *fp;
fp = fopen(path,"r");
if(fp==NULL)
return NULL;
head = (Linklist *)malloc(sizeof(Linklist));
p=head;
i=0;
while(1)
{
i++;
fgets(tmp,MAXLEN,fp);
if (-1 == Divstr(tmp,p))
{
goto diverror;
}
/* printf("div=%s %s %s %s %s %s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);
*/ if(feof(fp)) break;
p->next = (Linklist *)malloc(sizeof(Linklist));
p=p->next;
}
for(p1=head;p1->next!=p;p1=p1->next);
p1->next = NULL;
free(p);
fclose(fp);
return head;
diverror:
free(p);
fclose(fp);
return -1;
}
long writefile(char *path,Linklist *head)
{
Linklist *p;
FILE *fp;
char tmp[128];
fp = fopen(path,"w+");
if(fp==NULL)
return -1;
for(p=head;p!=NULL;p=p->next)
{
sprintf(tmp,"%s;%s;%s;%s;%s;%s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);
fputs(tmp,fp);
}
fclose(fp);
return 0;
}
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist*)malloc(sizeof(Linklist));
(*Lnode)->next=NULL;
if(!*Lnode)
return 0;
}
/*在链表中插入节点*/
InsertLinkList(Linklist *Lnode,Linklist *new_data)
{
Linklist *p,*q;
p=Lnode->next;
/*确定插入点*/
while(p)
p=p->next;
/*插入节点q到p和p->next之间*/
q=(Linklist*)malloc(sizeof(Linklist));
memcpy(q,new_data,sizeof(Linklist));
q->next=p->next;
p->next=q;
}
int get_Adjust_time(Linklist *p,int video_total_time)
{
int Adjust_time;
Adjust_time = video_total_time - atol(p->video_length);
return Adjust_time;
}
//int get_video_total_length(char *video_name,char *video_path)
//{
//
// int length;
// char path[128];
//
// sprintf(path,"%s/%s",video_path,video_name);
// //printf("[get_video_total_time]:cmd=%s\n",cmd);
//
// // my_system(cmd,result,128);
//// if ((fp = popen(cmd,"r"))== NULL)
//// {
//// return -1;
//// }
////
//// fgets(result,128,fp);
//// pclose(fp);
//
// length=get_video_total_time(path);
// if (length != -1)
// {
//
// printf("[get_video_total_length]:length=%d\n",length);
//
// sprintf(log_tmp,"[get_video_total_length]:length=%d",length);
// logfile(log_tmp);
//
// return length;
// }
// else
// {
// sprintf(log_tmp,"[get_video_total_length]:get_video_total_time fail\n");
// logfile(log_tmp);
// printf("[get_video_total_length]:get_video_total_time fail\n");
// return -1;
// }
//
//
//}
int get_video_total_length(char *video_name,char *video_path)
{
char result[128];
char cmd[256];
int length;
sprintf(cmd,"mplayer -vo null -ao null -frames 0 -identify %s/%s 2>/dev/null |grep -A 0 ID_LENGTH |awk '{print substr($0,11,2)}' ",video_path,video_name);
// printf("[get_video_total_time]:cmd=%s\n",cmd);
my_system(cmd,result,128);
trim(result);
if (strlen(result) !=0)
{
length = atol(result);
printf("[get_video_total_length]:length=%d\n",length);
sprintf(log_tmp,"[get_video_total_length]:length=%d",length);
logfile(log_tmp);
return length;
}
else
{
sprintf(log_tmp,"[get_video_total_length]:get_video_total_length fail\n");
logfile(log_tmp);
printf("[get_video_total_length]:get_video_total_length fail\n");
return -1;
}
}
/*仅仅调整开始播放时间:17:07:53:000;
节目开播时间star_play = 节目开播时间star_play + Adjust_time
*/
int AdjustStartPlayTime(Linklist *p,int Adjust_time)
{
char tmp[16];
char *pp;
char hh[3],mm[3],ss[3];
unsigned long total_ss;
strcpy(tmp,p->star_play);
pp=tmp;
strncpy(hh,pp,2);
strncpy(mm,pp+3,2);
strncpy(ss,pp+6,2);
hh[2]=mm[2]=ss[2]='\0';
total_ss= atol(hh)*3600 + atol(mm)*60 + atol(ss);
/* printf("[AdjustStartPlayTime]: before:hh=%s,mm=%s,ss=%s,total_ss=%d\n",hh,mm,ss,total_ss);
*/
total_ss=total_ss+Adjust_time;
sprintf(hh,"%2d",total_ss/3600);
sprintf(mm,"%2d",(total_ss%3600)/60);
sprintf(ss,"%2d",(total_ss%3600)%60);
if (hh[0]==' ') hh[0]='0';
if (hh[1]==' ') hh[1]='0';
if (mm[0]==' ') mm[0]='0';
if (mm[1]==' ') mm[1]='0';
if (ss[0]==' ') ss[0]='0';
if (ss[1]==' ') ss[1]='0';
/* printf("[AdjustStartPlayTime]: after: hh=%s,mm=%s,ss=%s,total_ss=%d\n",hh,mm,ss,total_ss);
*/ sprintf(p->star_play,"%s:%s:%s:%s\0",hh,mm,ss,pp+9);
return 0;
}
/*
找到的记录只调整节目总时长video_length、节目结束时间end_play
video_length = video_length+Adjust_time
end_play = video_length - star_play_offset
*/
AdjustValOneRecord(Linklist *p,int Adjust_time)
{
// AdjustStartPlayTime(p,Adjust_time);
sprintf(p->video_length,"%d\0",atol(p->video_length)+Adjust_time);
sprintf(p->end_play,"%d\0",atol(p->video_length)-atol(p->star_play_offset));
return 0;
}
AdjustVal(Linklist *p_find_point,int video_total_time)
{
Linklist *p;
int Adjust_time;
p=p_find_point;
if(p != NULL)
{
Adjust_time = get_Adjust_time(p,video_total_time);
/* printf("[AdjustVal]:Adjust_time=%d\n",Adjust_time);
printf("[AdjustVal]:before %s;%s;%s;%s;%s;%s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);
AdjustValOneRecord(p,Adjust_time);
printf("[AdjustVal] :after %s;%s;%s;%s;%s;%s\n",p->video_type,p->star_play,p->star_play_offset,p->end_play,p->video_length,p->video_name);
*/
AdjustValOneRecord(p,Adjust_time);
p=p->next;
}
while(p != NULL)
{
AdjustStartPlayTime(p,Adjust_time);
p=p->next;
}
}
FindLinkList(Linklist *Lnode,char *video_name,char *video_path)
{
Linklist *p,*q;
int count=0;
int video_total_time;
if (-1 == (video_total_time=get_video_total_length(video_name,video_path)))
{
return -1;
}
p=Lnode;
/*确定*/
while(p != NULL)
{
// printf("==========video_name=%s\n",video_name);
// printf("=====link_video_name=%s\n",p->video_name);
trim(video_name);
trim(p->video_name);
if (strcmp(video_name,p->video_name) == 0)
{
//printf(" video_name= %s\n",video_name);
//printf("link_video_name= %s\n",p->video_name);
AdjustVal(p,video_total_time);
count++;
}
p=p->next;
}
if (count == 0)
{
printf("[FindLinkList]:not find:%s\n",video_name);
sprintf(log_tmp,"[FindLinkList]:not find:%s",video_name);
logfile(log_tmp);
return -1;
}else
{
sprintf(log_tmp,"[FindLinkList]:====find:%s[count=%d]",video_name,count);
logfile(log_tmp);
printf("[FindLinkList]:====find:%s[count=%d]\n",video_name,count);
return 0;
}
}
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode;
while(p)
{
i++;
p=p->next;
}
return i;
}
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;
while(p)
{
q=p->next;
free(p);
p=q;
}
}
int handle_video_list(char *video_list_path,char *video_path)
{
Linklist *L;
char path_tmp[128],cmd[128];
int count;
char tmp[128];
char filename[56];
FILE *fp;
printf("[handle_video_list]:handle video_list_path:%s.....\n",video_list_path);
sprintf(log_tmp,"[handle_video_list]:handle video_list_path:%s.....",video_list_path);
logfile(log_tmp);
// strcpy(path_tmp,"tmp.txt");
strcpy(path_tmp,video_list_path);//直接调整播放列表
#ifdef FROMPIPE
sprintf(cmd,"ls %s/*.mpg 2>&1|grep -v such",video_path);
#else
sprintf(cmd,"t.txt");
#endif
InitLinkList(&L);
if ((L=readfile(video_list_path)) == -1)
{
printf("[handle_video_list]:init %s link fail\n",video_list_path);
sprintf(log_tmp,"[handle_video_list]:init %s link fail",video_list_path);
logfile(log_tmp);
return -1;
}
count=LengthLinkList(L);
#ifdef FROMPIPE
fp = popen(cmd,"r");
#else
fp = fopen(cmd,"r");
#endif
if(fp==NULL)
{
printf("[handle_video_list]:fopen error:%s\n",cmd);
sprintf(log_tmp,"[handle_video_list]:fopen error:%s",cmd);
logfile(log_tmp);
perror("[handle_video_list]");
goto handle_err;
}
while(1)
{
fgets(tmp,128,fp);
//if(feof(fp)) break;
if (strlen(tmp)!=0)
{
trim(tmp);
getfilename(tmp,filename);
printf("[handle_video_list]:update video:%s.....\n",filename);
if (-1 == FindLinkList(L,filename,video_path))
{
printf("[handle_video_list]:FindLinkList fail,not find: %s\n",filename);
sprintf(log_tmp,"[handle_video_list]:FindLinkList fail,not find: %s",filename);
logfile(log_tmp);
// #ifdef FROMPIPE
// pclose(fp);;
// #else
// fclose(fp);
// #endif
// goto handle_err;
}
}
strcpy(tmp,"");
if(feof(fp)) break;
}
#ifdef FROMPIPE
pclose(fp);;
#else
fclose(fp);
#endif
writefile(path_tmp,L);
DestroyLinkList(L);
return count;
handle_err:
DestroyLinkList(L);
return -1;
}
//void main()
//{
// char video_list_path[128],video_path[128];
// int ret;
//
// strcpy(video_list_path,"T34D1.txt");
// strcpy(video_path,"");
//
// printf("[auto_cp]:video_list_path=%s\n",video_list_path);
//
// if ((ret=handle_video_list(video_list_path,video_path)) >= 0)
// {
// printf("[auto_cp]:video_list update success,record num =%d\n",ret);
// }
//
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -